Merge "Merge 25Q1 (ab/12770256) to aosp-main-future" into aosp-main-future
diff --git a/TEST_MAPPING b/TEST_MAPPING
index dfbc117..ed1ed70 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -1,12 +1,61 @@
+// Any new test module being added here should be added to both "presubmits" and
+// "healthfitness-mainline-presubmit".
+//
+// New test modules are first required to be added to "postsubmit" to check for flakiness, and
+// should be moved to "presubmits" and "healthfitness-mainline-presubmit" a week later.
+// See go/test-mapping-slo-guide#slo-checker.
+//
+// We separately also need to add test targets to mts test list to run them in mainline postsubmit.
+// See ag/29549414 and go/mainline-test-suite for instructions.
 {
+  // This runs our test modules on mainline targets
+  // (e.g. mainline_modules_x86_64_default-trunk_staging-userdebug.)
+  // These tests are run on all android base versions since Android U, with the healthfitness module
+  // installed from head.
+  // These tests are also run on android versions older than Android U, but are ignored for the
+  // healthfitness module.
   "healthfitness-mainline-presubmit": [
     {
+      "name": "CtsHealthFitnessPhrTestCases"
+    },
+    {
       "name": "CtsHealthFitnessDeviceTestCases"
     },
     {
       "name": "CtsHealthFitnessDeviceTestCasesNoPermission"
     },
     {
+      "name": "CtsHealthConnectControllerTestCases"
+    },
+    {
+      "name": "HealthFitnessIntegrationBackupRestoreTests"
+    },
+    {
+      "name": "HealthFitnessIntegrationTests"
+    },
+    {
+      "name": "HealthFitnessUnitTests"
+    },
+    {
+      "name": "HealthConnectBackupRestoreUnitTests"
+    },
+    // TODO(b/369604571): Enable this after we have updated this to support mainline targets.
+    //{
+    //  "name": "CtsHealthConnectHostTestCases"
+    //},
+    {
+      "name": "CtsHealthConnectHostSideDeviceTestCases"
+    },
+    {
+      "name": "CtsExerciseRouteTestCases"
+    },
+    {
+      "name": "CtsHealthFitnessShowMigrationInfoIntentAbsentTests"
+    },
+    {
+      "name": "CtsHealthFitnessDeviceTestCasesHistoricAccessLimitWithPermission"
+    },
+    {
        "name": "HealthConnectControllerDataScreensNewTests"
     },
     {
@@ -38,8 +87,16 @@
     },
     {
        "name": "HealthConnectControllerExtraTests"
+    },
+    {
+       "name": "HealthFitnessIntegrationExportImportTests"
+    },
+    {
+       "name": "CtsHealthFitnessDeviceTestCasesRateLimiter"
     }
   ],
+  // DEPRECATED
+  // Old mainline presubmit mapping, replaced by "healthfitness-mainline-presubmit".
   "mainline-presubmit": [
     {
       "name": "CtsHealthFitnessDeviceTestCases[com.google.android.healthfitness.apex]"
@@ -81,8 +138,13 @@
        "name": "HealthConnectControllerExtraTests[com.google.android.healthfitness.apex]"
     }
   ],
+  // This runs our test modules on android targets
+  // (e.g. aosp_cf_x86_64_only_phone-trunk_staging-userdebug.)
   "presubmit": [
     {
+      "name": "CtsHealthFitnessPhrTestCases"
+    },
+    {
       "name": "CtsHealthFitnessDeviceTestCases"
     },
     {
diff --git a/apk/Android.bp b/apk/Android.bp
index 893acae..126532b 100644
--- a/apk/Android.bp
+++ b/apk/Android.bp
@@ -178,10 +178,20 @@
         "SettingsLibActivityEmbedding",
         "SettingsLibSettingsSpinner",
         "androidx.core_core",
-        "guava",
         "hilt_android",
         "healthfitness-ui-statsd",
         "healthfitness-aconfig-flags-helper",
+        "androidx.activity_activity-compose",
+        "androidx.compose.foundation_foundation",
+        "androidx.compose.runtime_runtime",
+        "androidx.compose.runtime_runtime-livedata",
+        "androidx.compose.ui_ui",
+        "androidx.hilt_hilt-navigation-compose",
+        "androidx.wear.compose_compose-material",
+        "androidx.wear.compose_compose-material3",
+        "androidx.navigation_navigation-compose",
+        "androidx.navigation_navigation-runtime-ktx",
+        "androidx.lifecycle_lifecycle-runtime-compose",
     ],
     kotlincflags: ["-Xjvm-default=all"],
     apex_available: ["com.android.healthfitness"],
@@ -216,6 +226,14 @@
     ],
     libs: [
         "framework-healthfitness.stubs.module_lib",
+        "framework-annotations-lib",
     ],
+    optimize: {
+        optimize: true,
+        shrink_resources: true,
+    },
     apex_available: ["com.android.healthfitness"],
+    flags_packages: [
+        "healthfitness-aconfig-flags",
+    ],
 }
diff --git a/apk/AndroidManifest.xml b/apk/AndroidManifest.xml
index bb30b6f..a3767cb 100644
--- a/apk/AndroidManifest.xml
+++ b/apk/AndroidManifest.xml
@@ -23,7 +23,6 @@
     <uses-permission android:name="android.permission.MANAGE_HEALTH_DATA" />
     <uses-permission android:name="android.permission.START_VIEW_PERMISSION_USAGE" />
     <uses-permission android:name="android.permission.health.READ_EXERCISE_ROUTE" />
-    <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
     <uses-permission android:name="android.permission.LAUNCH_MULTI_PANE_SETTINGS_DEEP_LINK" />
     <uses-permission android:name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
     <uses-permission android:name="android.permission.health.START_ONBOARDING" />
@@ -118,6 +117,16 @@
         </activity>
 
         <activity
+            android:name=".permissions.app.wear.WearViewAppInfoPermissionsActivity"
+            android:exported="false">
+        </activity>
+
+        <activity
+            android:name=".permissions.connectedapps.wear.WearSettingsPermissionActivity"
+            android:exported="false">
+        </activity>
+
+        <activity
             android:name=".permissions.request.PermissionsActivity"
             android:excludeFromRecents="true"
             android:exported="true"
@@ -129,6 +138,11 @@
         </activity>
 
         <activity
+            android:name=".permissions.request.wear.WearGrantPermissionsActivity"
+            android:exported="false">
+        </activity>
+
+        <activity
             android:name=".route.RouteRequestActivity"
             android:excludeFromRecents="true"
             android:exported="true"
diff --git a/apk/HealthPermissionsManifest.xml b/apk/HealthPermissionsManifest.xml
index c791302..bfddb87 100644
--- a/apk/HealthPermissionsManifest.xml
+++ b/apk/HealthPermissionsManifest.xml
@@ -41,6 +41,13 @@
         android:permissionGroup="android.permission-group.HEALTH" />
 
     <permission
+        android:name="android.permission.health.READ_ACTIVITY_INTENSITY"
+        android:label="@string/activity_intensity_read_content_description"
+        android:protectionLevel="dangerous"
+        android:permissionGroup="android.permission-group.HEALTH"
+    />
+
+    <permission
         android:name="android.permission.health.READ_DISTANCE"
         android:label="@string/distance_read_content_description"
         android:protectionLevel="dangerous"
@@ -234,6 +241,8 @@
         android:name="android.permission.health.READ_HEART_RATE"
         android:label="@string/heart_rate_read_content_description"
         android:protectionLevel="dangerous"
+        android:backgroundPermission=
+            "android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"
         android:permissionGroup="android.permission-group.HEALTH" />
 
     <permission
@@ -246,6 +255,8 @@
         android:name="android.permission.health.READ_OXYGEN_SATURATION"
         android:label="@string/oxygen_saturation_read_content_description"
         android:protectionLevel="dangerous"
+        android:backgroundPermission=
+            "android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"
         android:permissionGroup="android.permission-group.HEALTH" />
 
     <permission
@@ -264,6 +275,8 @@
         android:name="android.permission.health.READ_SKIN_TEMPERATURE"
         android:label="@string/skin_temperature_read_content_description"
         android:protectionLevel="dangerous"
+        android:backgroundPermission=
+            "android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"
         android:permissionGroup="android.permission-group.HEALTH" />
 
     <permission
@@ -274,13 +287,13 @@
 
     <!-- Read permissions for personal health records -->
     <permission
-        android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE"
-        android:label="@string/allergy_intolerance_content_description"
+        android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"
+        android:label="@string/allergies_intolerances_content_description"
         android:protectionLevel="dangerous"
         android:permissionGroup="android.permission-group.HEALTH" />
     <permission
-        android:name="android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION"
-        android:label="@string/immunization_content_description"
+        android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"
+        android:label="@string/conditions_content_description"
         android:protectionLevel="dangerous"
         android:permissionGroup="android.permission-group.HEALTH" />
     <permission
@@ -294,18 +307,23 @@
         android:protectionLevel="dangerous"
         android:permissionGroup="android.permission-group.HEALTH" />
     <permission
+        android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"
+        android:label="@string/personal_details_content_description"
+        android:protectionLevel="dangerous"
+        android:permissionGroup="android.permission-group.HEALTH" />
+    <permission
+        android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"
+        android:label="@string/practitioner_details_content_description"
+        android:protectionLevel="dangerous"
+        android:permissionGroup="android.permission-group.HEALTH" />
+    <permission
         android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"
         android:label="@string/pregnancy_content_description"
         android:protectionLevel="dangerous"
         android:permissionGroup="android.permission-group.HEALTH" />
     <permission
-        android:name="android.permission.health.READ_MEDICAL_DATA_PROBLEMS"
-        android:label="@string/pregnancy_content_description"
-        android:protectionLevel="dangerous"
-        android:permissionGroup="android.permission-group.HEALTH" />
-    <permission
         android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"
-        android:label="@string/pregnancy_content_description"
+        android:label="@string/procedures_content_description"
         android:protectionLevel="dangerous"
         android:permissionGroup="android.permission-group.HEALTH" />
     <permission
@@ -313,7 +331,16 @@
         android:label="@string/social_history_content_description"
         android:protectionLevel="dangerous"
         android:permissionGroup="android.permission-group.HEALTH" />
-
+    <permission
+        android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"
+        android:label="@string/vaccines_content_description"
+        android:protectionLevel="dangerous"
+        android:permissionGroup="android.permission-group.HEALTH" />
+    <permission
+        android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"
+        android:label="@string/visits_content_description"
+        android:protectionLevel="dangerous"
+        android:permissionGroup="android.permission-group.HEALTH" />
     <permission
         android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"
         android:label="@string/vital_signs_content_description"
@@ -336,6 +363,13 @@
         android:permissionGroup="android.permission-group.HEALTH" />
 
     <permission
+        android:name="android.permission.health.WRITE_ACTIVITY_INTENSITY"
+        android:label="@string/activity_intensity_write_content_description"
+        android:protectionLevel="dangerous"
+        android:permissionGroup="android.permission-group.HEALTH"
+    />
+
+    <permission
         android:name="android.permission.health.WRITE_DISTANCE"
         android:label="@string/distance_write_content_description"
         android:protectionLevel="dangerous"
diff --git a/apk/res/drawable/banner_background_outlined.xml b/apk/res/drawable/banner_background_outlined.xml
new file mode 100644
index 0000000..8669bc8
--- /dev/null
+++ b/apk/res/drawable/banner_background_outlined.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright (C) 2024 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <stroke android:width="1dp"
+        android:color="@color/banner_background_color"/>
+
+    <corners
+        android:radius="@dimen/banner_corner_radius"/>
+
+</shape>
\ No newline at end of file
diff --git a/apk/res/drawable/ic_category_cycle_tracking.xml b/apk/res/drawable/ic_category_cycle_tracking.xml
index ad314cc..15d0eaa 100644
--- a/apk/res/drawable/ic_category_cycle_tracking.xml
+++ b/apk/res/drawable/ic_category_cycle_tracking.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright (C) 2022 The Android Open Source Project
+  Copyright (C) 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -21,7 +21,6 @@
     android:viewportHeight="24"
     android:tint="?attr/colorControlNormal">
   <path
-      android:pathData="M4,12H20C20,7.5817 16.4183,4 12,4C7.5817,4 4,7.5817 4,12ZM22,12C22,17.5228 17.5228,22 12,22C6.4771,22 2,17.5228 2,12C2,6.4771 6.4771,2 12,2C17.5228,2 22,6.4771 22,12Z"
-      android:fillColor="@android:color/white"
-      android:fillType="evenOdd"/>
+      android:pathData="M12,1.875C12.817,2.858 13.55,3.775 14.2,4.625C14.85,5.458 15.433,6.258 15.95,7.025L22,2.5V12C22,13.383 21.733,14.683 21.2,15.9C20.683,17.117 19.975,18.175 19.075,19.075C18.175,19.975 17.117,20.692 15.9,21.225C14.683,21.742 13.383,22 12,22C10.617,22 9.317,21.742 8.1,21.225C6.883,20.692 5.825,19.975 4.925,19.075C4.025,18.175 3.308,17.117 2.775,15.9C2.258,14.683 2,13.383 2,12V2.5L8.05,7.025C8.567,6.275 9.15,5.475 9.8,4.625C10.45,3.775 11.183,2.858 12,1.875ZM4,6.5V12C4,12.733 4.092,13.442 4.275,14.125C4.475,14.792 4.742,15.417 5.075,16C5.042,15.833 5.017,15.675 5,15.525C5,15.358 5,15.183 5,15C5,14.05 5.15,13.075 5.45,12.075C5.767,11.058 6.275,9.95 6.975,8.75L4,6.5ZM12,5C10.167,7.233 8.875,9.183 8.125,10.85C7.375,12.517 7,13.9 7,15C7,16.383 7.483,17.567 8.45,18.55C9.433,19.517 10.617,20 12,20C13.383,20 14.558,19.517 15.525,18.55C16.508,17.567 17,16.383 17,15C17,13.9 16.625,12.508 15.875,10.825C15.125,9.142 13.833,7.2 12,5ZM20,6.5L17.025,8.725C17.725,9.925 18.225,11.033 18.525,12.05C18.842,13.05 19,14.033 19,15C19,15.183 18.992,15.358 18.975,15.525C18.975,15.675 18.958,15.833 18.925,16C19.258,15.417 19.517,14.792 19.7,14.125C19.9,13.442 20,12.733 20,12V6.5Z"
+      android:fillColor="@android:color/white"/>
 </vector>
diff --git a/apk/res/drawable/ic_category_sleep.xml b/apk/res/drawable/ic_category_sleep.xml
index 35c476f..fd1ef1e 100644
--- a/apk/res/drawable/ic_category_sleep.xml
+++ b/apk/res/drawable/ic_category_sleep.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright (C) 2022 The Android Open Source Project
+  Copyright (C) 2024 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -17,16 +17,14 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="24dp"
     android:height="24dp"
-    android:viewportHeight="24"
     android:viewportWidth="24"
+    android:viewportHeight="24"
     android:tint="?attr/colorControlNormal">
-  <path
-      android:fillColor="@android:color/white"
-      android:pathData="M10,8H4V10.0571H7L4,13.9429V16H10V13.9429H7L10,10.0571V8Z" />
-  <path
-      android:fillColor="@android:color/white"
-      android:pathData="M18,3H12V5.0571H15L12,8.9429V11H18V8.9429H15L18,5.0571V3Z" />
-  <path
-      android:fillColor="@android:color/white"
-      android:pathData="M20,13H14V15.0571H17L14,18.9429V21H20V18.9429H17L20,15.0571V13Z" />
+  <group>
+    <clip-path
+        android:pathData="M0,0h24v24h-24z"/>
+    <path
+        android:pathData="M12.075,22C10.675,22 9.358,21.733 8.125,21.2C6.908,20.667 5.842,19.95 4.925,19.05C4.025,18.133 3.308,17.067 2.775,15.85C2.242,14.617 1.975,13.3 1.975,11.9C1.975,9.467 2.75,7.325 4.3,5.475C5.85,3.608 7.825,2.45 10.225,2C9.925,3.65 10.017,5.267 10.5,6.85C10.983,8.417 11.817,9.792 13,10.975C14.183,12.158 15.558,12.992 17.125,13.475C18.708,13.958 20.325,14.05 21.975,13.75C21.542,16.15 20.392,18.125 18.525,19.675C16.658,21.225 14.508,22 12.075,22ZM12.075,20C13.542,20 14.9,19.633 16.15,18.9C17.4,18.167 18.383,17.158 19.1,15.875C17.667,15.742 16.308,15.383 15.025,14.8C13.742,14.2 12.592,13.392 11.575,12.375C10.558,11.358 9.75,10.208 9.15,8.925C8.55,7.642 8.192,6.283 8.075,4.85C6.792,5.567 5.783,6.558 5.05,7.825C4.333,9.075 3.975,10.433 3.975,11.9C3.975,14.15 4.758,16.067 6.325,17.65C7.908,19.217 9.825,20 12.075,20ZM18,10L16.75,7.25L14,6L16.75,4.75L18,2L19.25,4.75L22,6L19.25,7.25L18,10Z"
+        android:fillColor="@android:color/white"/>
+  </group>
 </vector>
diff --git a/apk/res/drawable/ic_close.xml b/apk/res/drawable/ic_close.xml
index d8e89d0..877fcdd 100644
--- a/apk/res/drawable/ic_close.xml
+++ b/apk/res/drawable/ic_close.xml
@@ -18,8 +18,8 @@
     android:height="24dp"
     android:viewportWidth="24.0"
     android:viewportHeight="24.0"
-    android:tint="?attr/colorControlNormal">
+    android:tint="?android:attr/colorControlNormal">
     <path
-        android:fillColor="@android:color/white"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12 19,6.41z"/>
 </vector>
\ No newline at end of file
diff --git a/apk/res/drawable/ic_cross.xml b/apk/res/drawable/ic_cross.xml
new file mode 100644
index 0000000..3d16a3b
--- /dev/null
+++ b/apk/res/drawable/ic_cross.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"
+      android:fillColor="#000000"/>
+</vector>
\ No newline at end of file
diff --git a/apk/res/drawable/ic_delete.xml b/apk/res/drawable/ic_delete.xml
index 2af8bdb..b1c1021 100644
--- a/apk/res/drawable/ic_delete.xml
+++ b/apk/res/drawable/ic_delete.xml
@@ -19,8 +19,8 @@
     android:height="24dp"
     android:viewportWidth="24.0"
     android:viewportHeight="24.0"
-    android:tint="?attr/colorControlNormal">
+    android:tint="?android:attr/colorControlNormal">
   <path
-      android:fillColor="@android:color/white"
+      android:fillColor="#FFFFFFFF"
       android:pathData="M15,4L15,3L9,3v1L4,4v2h1v13c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,6h1L20,4h-5zM17,19L7,19L7,6h10v13zM9,8h2v9L9,17zM13,8h2v9h-2z"/>
 </vector>
diff --git a/apk/res/drawable/ic_delete_forever.xml b/apk/res/drawable/ic_delete_forever.xml
index 8ea81a0..329c302 100644
--- a/apk/res/drawable/ic_delete_forever.xml
+++ b/apk/res/drawable/ic_delete_forever.xml
@@ -19,8 +19,8 @@
     android:height="24dp"
     android:viewportWidth="24.0"
     android:viewportHeight="24.0"
-    android:tint="?attr/colorControlNormal">
+    android:tint="?android:attr/colorControlNormal">
     <path
-        android:fillColor="@android:color/white"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M15,4L15,3L9,3v1L4,4v2h1v13c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,6h1L20,4h-5zM17,19L7,19L7,6h10v13zM9.41,16.5L12,13.91l2.59,2.59L16,15.09l-2.59,-2.59L16,9.91 14.59,8.5 12,11.09 9.41,8.5 8,9.91l2.59,2.59L8,15.09z"/>
 </vector>
\ No newline at end of file
diff --git a/apk/res/drawable/ic_expand_more_24.xml b/apk/res/drawable/ic_expand_more_24.xml
new file mode 100644
index 0000000..ffd1db2
--- /dev/null
+++ b/apk/res/drawable/ic_expand_more_24.xml
@@ -0,0 +1,24 @@
+<!--
+  Copyright 2024 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M480,615L240,375L296,319L480,503L664,319L720,375L480,615Z"/>
+</vector>
diff --git a/apk/res/drawable/ic_lock.xml b/apk/res/drawable/ic_lock.xml
new file mode 100644
index 0000000..34f0626
--- /dev/null
+++ b/apk/res/drawable/ic_lock.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:pathData="M240,880q-33,0 -56.5,-23.5T160,800v-400q0,-33 23.5,-56.5T240,320h40v-80q0,-83 58.5,-141.5T480,40q83,0 141.5,58.5T680,240v80h40q33,0 56.5,23.5T800,400v400q0,33 -23.5,56.5T720,880L240,880ZM240,800h480v-400L240,400v400ZM480,680q33,0 56.5,-23.5T560,600q0,-33 -23.5,-56.5T480,520q-33,0 -56.5,23.5T400,600q0,33 23.5,56.5T480,680ZM360,320h240v-80q0,-50 -35,-85t-85,-35q-50,0 -85,35t-35,85v80ZM240,800v-400,400Z"
+      android:fillColor="@android:color/white"/>
+</vector>
diff --git a/apk/res/drawable/ic_medical_lab_results.xml b/apk/res/drawable/ic_medical_lab_results.xml
index b473db1..443d25b 100644
--- a/apk/res/drawable/ic_medical_lab_results.xml
+++ b/apk/res/drawable/ic_medical_lab_results.xml
@@ -1,10 +1,14 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="14dp"
-    android:height="20dp"
-    android:viewportWidth="14"
-    android:viewportHeight="20"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
     android:tint="?attr/colorControlNormal">
-<path
-      android:pathData="M7,20C5.617,20 4.433,19.517 3.45,18.55C2.483,17.567 2,16.383 2,15V6C1.45,6 0.975,5.808 0.575,5.425C0.192,5.025 0,4.55 0,4V2C0,1.45 0.192,0.983 0.575,0.6C0.975,0.2 1.45,-0 2,-0H12C12.55,-0 13.017,0.2 13.4,0.6C13.8,0.983 14,1.45 14,2V4C14,4.55 13.8,5.025 13.4,5.425C13.017,5.808 12.55,6 12,6V15C12,16.383 11.508,17.567 10.525,18.55C9.558,19.517 8.383,20 7,20ZM2,4H12V2H2V4ZM7,18C7.833,18 8.542,17.708 9.125,17.125C9.708,16.542 10,15.833 10,15H7V13H10V11H7V9H10V6H4V15C4,15.833 4.292,16.542 4.875,17.125C5.458,17.708 6.167,18 7,18ZM2,4V2V4Z"
-      android:fillColor="@android:color/white"/>
+    <group>
+        <clip-path
+            android:pathData="M0,0h24v24h-24z"/>
+        <path
+            android:pathData="M12,22C10.617,22 9.433,21.517 8.45,20.55C7.483,19.567 7,18.383 7,17V8C6.45,8 5.975,7.808 5.575,7.425C5.192,7.025 5,6.55 5,6V4C5,3.45 5.192,2.983 5.575,2.6C5.975,2.2 6.45,2 7,2H17C17.55,2 18.017,2.2 18.4,2.6C18.8,2.983 19,3.45 19,4V6C19,6.55 18.8,7.025 18.4,7.425C18.017,7.808 17.55,8 17,8V17C17,18.383 16.508,19.567 15.525,20.55C14.558,21.517 13.383,22 12,22ZM7,6H17V4H7V6ZM12,20C12.833,20 13.542,19.708 14.125,19.125C14.708,18.542 15,17.833 15,17H12V15H15V13H12V11H15V8H9V17C9,17.833 9.292,18.542 9.875,19.125C10.458,19.708 11.167,20 12,20ZM7,6V4V6Z"
+            android:fillColor="@android:color/white"/>
+    </group>
 </vector>
diff --git a/apk/res/drawable/ic_medical_past_visits.xml b/apk/res/drawable/ic_medical_past_visits.xml
index f41ce61..65b6c3a 100644
--- a/apk/res/drawable/ic_medical_past_visits.xml
+++ b/apk/res/drawable/ic_medical_past_visits.xml
@@ -1,10 +1,14 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="16dp"
-    android:height="18dp"
-    android:viewportWidth="16"
-    android:viewportHeight="18"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
     android:tint="?attr/colorControlNormal">
-  <path
-      android:pathData="M6.5,14H9.5V11.5H12V8.5H9.5V6H6.5V8.5H4V11.5H6.5V14ZM0,18V6L8,-0L16,6V18H0ZM2,16H14V7L8,2.5L2,7V16Z"
-      android:fillColor="@android:color/white"/>
+  <group>
+    <clip-path
+        android:pathData="M0,0h24v24h-24z"/>
+    <path
+        android:pathData="M10.5,17H13.5V14.5H16V11.5H13.5V9H10.5V11.5H8V14.5H10.5V17ZM4,21V9L12,3L20,9V21H4ZM6,19H18V10L12,5.5L6,10V19Z"
+        android:fillColor="@android:color/white"/>
+  </group>
 </vector>
diff --git a/apk/res/drawable/ic_medical_patient_info.xml b/apk/res/drawable/ic_medical_patient_info.xml
index e84b800..0dc63ba 100644
--- a/apk/res/drawable/ic_medical_patient_info.xml
+++ b/apk/res/drawable/ic_medical_patient_info.xml
@@ -1,10 +1,10 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="16dp"
-    android:height="16dp"
-    android:viewportWidth="16"
-    android:viewportHeight="16"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
     android:tint="?attr/colorControlNormal">
-<path
-      android:pathData="M8 8c-1.1 0-2-.4-2.8-1.2A3.9 3.9 0 0 1 4 4c0-1.1.4-2 1.2-2.8C6 .4 6.9 0 8 0c1.1 0 2 .4 2.8 1.2C11.6 2 12 2.9 12 4c0 1.1-.4 2-1.2 2.8C10 7.6 9.1 8 8 8Zm-8 8v-2.8a3 3 0 0 1 1.6-2.6 14.4 14.4 0 0 1 12.8 0c.5.2.9.6 1.2 1 .3.5.4 1 .4 1.6V16H0Zm2-2h12v-.8c0-.2 0-.3-.2-.5l-.3-.3A12.5 12.5 0 0 0 8 11a12.5 12.5 0 0 0-5.5 1.3 1 1 0 0 0-.4.4l-.1.5v.8Zm6-8c.6 0 1-.2 1.4-.6.4-.4.6-.9.6-1.4 0-.5-.2-1-.6-1.4C9 2.2 8.6 2 8 2a2 2 0 0 0-1.4.6A2 2 0 0 0 6 4c0 .5.2 1 .6 1.4.4.4.9.6 1.4.6Z"
-      android:fillColor="@android:color/white"/>
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M12,6c1.1,0 2,0.9 2,2s-0.9,2 -2,2s-2,-0.9 -2,-2S10.9,6 12,6M12,15c2.7,0 5.8,1.29 6,2v1H6l0,-0.99C6.2,16.29 9.3,15 12,15M12,4C9.79,4 8,5.79 8,8s1.79,4 4,4s4,-1.79 4,-4S14.21,4 12,4L12,4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3C20,14.34 14.67,13 12,13L12,13z"/>
 </vector>
diff --git a/apk/res/drawable/ic_medical_social_history.xml b/apk/res/drawable/ic_medical_social_history.xml
index 948175d..5c4eef7 100644
--- a/apk/res/drawable/ic_medical_social_history.xml
+++ b/apk/res/drawable/ic_medical_social_history.xml
@@ -1,14 +1,10 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24"
+    android:width="18dp"
+    android:height="20dp"
+    android:viewportWidth="18"
+    android:viewportHeight="20"
     android:tint="?attr/colorControlNormal">
-  <group>
-    <clip-path
-        android:pathData="M0,0h24v24h-24z"/>
-    <path
-        android:pathData="M8,21V19H11V14.9C9.567,14.667 8.375,14 7.425,12.9C6.475,11.8 6,10.5 6,9V3H18V9C18,10.5 17.525,11.8 16.575,12.9C15.625,14 14.433,14.667 13,14.9V19H16V21H8ZM12,13C12.933,13 13.75,12.717 14.45,12.15C15.15,11.583 15.617,10.867 15.85,10H8.15C8.383,10.867 8.85,11.583 9.55,12.15C10.25,12.717 11.067,13 12,13ZM8,8H16V5H8V8Z"
-        android:fillColor="@android:color/white"/>
-  </group>
+  <path
+      android:pathData="M3,20C2.167,20 1.458,19.708 0.875,19.125C0.292,18.542 0,17.833 0,17V14H3V-0H18V17C18,17.833 17.708,18.542 17.125,19.125C16.542,19.708 15.833,20 15,20H3ZM15,18C15.283,18 15.517,17.908 15.7,17.725C15.9,17.525 16,17.283 16,17V2H5V14H14V17C14,17.283 14.092,17.525 14.275,17.725C14.475,17.908 14.717,18 15,18ZM6,7V5H15V7H6ZM6,10V8H15V10H6ZM3,18H12V16H2V17C2,17.283 2.092,17.525 2.275,17.725C2.475,17.908 2.717,18 3,18ZM3,18C2.717,18 2.475,18 2.275,18C2.092,18 2,18 2,18H12H3Z"
+      android:fillColor="@android:color/white"/>
 </vector>
\ No newline at end of file
diff --git a/apk/res/drawable/ic_security_update_good.xml b/apk/res/drawable/ic_security_update_good.xml
new file mode 100644
index 0000000..eef9afc
--- /dev/null
+++ b/apk/res/drawable/ic_security_update_good.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M442,600L330,488L386,432L442,488L584,346L640,402L442,600ZM280,920Q247,920 223.5,896.5Q200,873 200,840L200,120Q200,87 223.5,63.5Q247,40 280,40L680,40Q713,40 736.5,63.5Q760,87 760,120L760,840Q760,873 736.5,896.5Q713,920 680,920L280,920ZM280,800L280,840Q280,840 280,840Q280,840 280,840L680,840Q680,840 680,840Q680,840 680,840L680,800L280,800ZM280,720L680,720L680,240L280,240L280,720ZM280,160L680,160L680,120Q680,120 680,120Q680,120 680,120L280,120Q280,120 280,120Q280,120 280,120L280,160ZM280,160L280,120Q280,120 280,120Q280,120 280,120L280,120Q280,120 280,120Q280,120 280,120L280,160L280,160ZM280,800L280,800L280,840Q280,840 280,840Q280,840 280,840L280,840Q280,840 280,840Q280,840 280,840L280,800Z"/>
+</vector>
\ No newline at end of file
diff --git a/apk/res/drawable/ic_view_list.xml b/apk/res/drawable/ic_view_list.xml
index cc0b781..6b056d9 100644
--- a/apk/res/drawable/ic_view_list.xml
+++ b/apk/res/drawable/ic_view_list.xml
@@ -19,9 +19,9 @@
     android:height="24dp"
     android:viewportWidth="24"
     android:viewportHeight="24"
-    android:tint="?attr/colorControlNormal"
+    android:tint="?android:attr/colorControlNormal"
     android:autoMirrored="true">
     <path
-        android:fillColor="@android:color/white"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M3,5v14h18V5H3zM7,7v2H5V7H7zM5,13v-2h2v2H5zM5,15h2v2H5V15zM19,17H9v-2h10V17zM19,13H9v-2h10V13zM19,9H9V7h10V9z"/>
 </vector>
diff --git a/apk/res/drawable/spinner_background_disabled.xml b/apk/res/drawable/spinner_background_disabled.xml
index 37caa59..c30d78e 100644
--- a/apk/res/drawable/spinner_background_disabled.xml
+++ b/apk/res/drawable/spinner_background_disabled.xml
@@ -29,7 +29,7 @@
                 <shape>
                     <corners android:radius="28dp"/>
                     <solid
-                        android:color="@color/settingslib_thumb_off_color"
+                        android:color="@color/settingslib_thumb_disabled_color"
                         android:alpha="?android:attr/disabledAlpha"/>
                     <size android:height="@dimen/settingslib_spinner_height"/>
                 </shape>
diff --git a/apk/res/drawable/tab_background_unselected_disabled.xml b/apk/res/drawable/tab_background_unselected_disabled.xml
index d81d377..af16b97 100644
--- a/apk/res/drawable/tab_background_unselected_disabled.xml
+++ b/apk/res/drawable/tab_background_unselected_disabled.xml
@@ -21,7 +21,6 @@
     android:insetRight="@dimen/spacing_small" >
     <shape android:shape="rectangle">
         <corners android:radius="@dimen/tab_corner_radius" />
-        <solid android:color="@color/settingslib_background_device_default_dark"
-            android:alpha="0.2"/>
+        <solid android:color="@color/settingslib_switch_thumb_color"/>
     </shape>
 </inset>
\ No newline at end of file
diff --git a/apk/res/layout/dialog_custom_layout.xml b/apk/res/layout/dialog_custom_layout.xml
index 8559d13..fb90ea6 100644
--- a/apk/res/layout/dialog_custom_layout.xml
+++ b/apk/res/layout/dialog_custom_layout.xml
@@ -49,8 +49,20 @@
             android:layout_height="wrap_content"
             android:gravity="center"
             android:layout_marginTop="@dimen/spacing_normal"
+            android:layout_marginBottom="@dimen/spacing_xlarge"
             android:textDirection="locale"
             style="?attr/textAppearanceSummary" />
 
+        <CheckBox
+            android:id="@+id/dialog_checkbox"
+            android:visibility="gone"
+            android:textAppearance="?attr/textAppearanceSummary"
+            android:textColor="@color/settingslib_text_color_secondary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/spacing_xlarge"
+            android:checked="false"
+            android:paddingHorizontal="@dimen/spacing_normal"
+            android:layout_gravity="start" />
     </LinearLayout>
 </ScrollView>
\ No newline at end of file
diff --git a/apk/res/layout/dialog_message_with_checkbox.xml b/apk/res/layout/dialog_message_with_checkbox.xml
index a163289..91edd7b 100644
--- a/apk/res/layout/dialog_message_with_checkbox.xml
+++ b/apk/res/layout/dialog_message_with_checkbox.xml
@@ -54,8 +54,13 @@
 
         <CheckBox
             android:id="@+id/dialog_checkbox"
+            android:textAppearance="?attr/textAppearanceSummary"
+            android:textColor="@color/settingslib_text_color_secondary"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:checked="false" />
+            android:layout_marginBottom="@dimen/spacing_xlarge"
+            android:checked="false"
+            android:paddingHorizontal="@dimen/spacing_normal"
+            android:layout_gravity="start" />
     </LinearLayout>
 </ScrollView>
diff --git a/apk/res/layout/fragment_entries.xml b/apk/res/layout/fragment_entries.xml
index 932e275..170ec00 100644
--- a/apk/res/layout/fragment_entries.xml
+++ b/apk/res/layout/fragment_entries.xml
@@ -19,6 +19,12 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
+    <com.android.healthconnect.controller.data.entries.AppHeaderView
+        android:visibility="gone"
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent"
+        android:id="@+id/app_header"/>
+
     <com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationView
         android:id="@+id/date_navigation_view"
         android:paddingTop="@dimen/spacing_xsmall"
@@ -37,7 +43,8 @@
         android:layout_height="wrap_content"
         android:gravity="center"
         android:text="@string/no_data"
-        android:visibility="gone" />
+        android:visibility="gone"
+        android:focusable="true"/>
 
     <TextView
         android:id="@+id/error_view"
diff --git a/apk/res/layout/fragment_entries_access.xml b/apk/res/layout/fragment_entries_access.xml
index 75fd891..fd96aa4 100644
--- a/apk/res/layout/fragment_entries_access.xml
+++ b/apk/res/layout/fragment_entries_access.xml
@@ -36,10 +36,12 @@
             android:id="@+id/tab_layout"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:tabMaxWidth="0dp"
-            app:tabGravity="fill"
+            android:minHeight="?actionBarSize"
+            app:tabMinWidth="@dimen/tab_width"
+            app:tabGravity="center"
             app:tabMode="fixed"
             app:tabIndicatorHeight="0dp"
+            app:tabIndicatorFullWidth="true"
             app:tabSelectedTextColor="@color/settingslib_primary_dark_device_default_settings"
             app:tabTextColor="?android:attr/textColorSecondary"
             app:tabBackground="@drawable/tab_background"
@@ -51,10 +53,12 @@
             android:visibility="gone"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:tabMaxWidth="0dp"
-            app:tabGravity="fill"
+            android:minHeight="?actionBarSize"
+            app:tabMinWidth="@dimen/tab_width"
+            app:tabGravity="center"
             app:tabMode="fixed"
             app:tabIndicatorHeight="0dp"
+            app:tabIndicatorFullWidth="true"
             app:tabSelectedTextColor="@color/settingslib_primary_dark_device_default_settings"
             app:tabTextColor="?android:attr/textColorSecondary"
             app:tabBackground="@drawable/tab_background_disabled"
diff --git a/apk/res/layout/onboarding_screen_content.xml b/apk/res/layout/onboarding_screen_content.xml
index 13e2d15..fbf5024 100644
--- a/apk/res/layout/onboarding_screen_content.xml
+++ b/apk/res/layout/onboarding_screen_content.xml
@@ -53,6 +53,15 @@
             android:layout_marginBottom="@dimen/spacing_xlarge"
             android:scaleType="centerInside" />
 
+        <TextView
+            android:id="@+id/onboarding_description_with_health_connect"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/spacing_normal"
+            android:text="@string/onboarding_description_with_health_connect"
+            android:textAppearance="?attr/textAppearanceLabel"
+            android:textColor="?android:attr/colorAccent"/>
+
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/apk/res/layout/widget_app_header.xml b/apk/res/layout/widget_app_header.xml
new file mode 100644
index 0000000..b0760a0
--- /dev/null
+++ b/apk/res/layout/widget_app_header.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:layout_gravity="center"
+    android:gravity="center_horizontal"
+    android:paddingTop="24dp"
+    android:paddingBottom="16dp"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <ImageView
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:scaleType="fitCenter"
+        android:background="@drawable/health_connect_logo"
+        android:id="@+id/app_icon"/>
+
+    <TextView
+        android:id="@+id/app_title"
+        style="@style/TextAppearance.EntityHeaderTitle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:singleLine="false"
+        android:gravity="center"
+        android:ellipsize="marquee"
+        android:textDirection="locale"
+        android:layout_marginTop="8dp"
+        android:text="Test app"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apk/res/layout/widget_app_source_layout.xml b/apk/res/layout/widget_app_source_layout.xml
index a33eee0..80b6cf7 100644
--- a/apk/res/layout/widget_app_source_layout.xml
+++ b/apk/res/layout/widget_app_source_layout.xml
@@ -76,6 +76,8 @@
         android:layout_height="match_parent"
         android:layout_weight="0.32"
         android:minWidth="@dimen/button_size"
+        android:paddingStart="0dp"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
         android:layout_gravity="center_vertical">
 
         <ImageView
diff --git a/apk/res/layout/widget_auto_delete_range_picker.xml b/apk/res/layout/widget_auto_delete_range_picker.xml
index 606a8f4..fdc1096 100644
--- a/apk/res/layout/widget_auto_delete_range_picker.xml
+++ b/apk/res/layout/widget_auto_delete_range_picker.xml
@@ -23,7 +23,7 @@
         android:id="@+id/radio_group_time_range"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
-        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+        android:paddingStart="0dp"
         android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
         android:checkedButton="@+id/radio_button_never">
         <RadioButton
diff --git a/apk/res/layout/widget_date_navigation_with_spinner.xml b/apk/res/layout/widget_date_navigation_with_spinner.xml
index 4ca42b6..bfb21b2 100644
--- a/apk/res/layout/widget_date_navigation_with_spinner.xml
+++ b/apk/res/layout/widget_date_navigation_with_spinner.xml
@@ -73,6 +73,7 @@
         <TextView
             android:id="@+id/disabled_spinner"
             style="?attr/disabledSpinner"
+            android:importantForAccessibility="no"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:layout_centerInParent="true"
@@ -82,7 +83,7 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
-            android:paddingStart="32dp"
+            android:paddingStart="@dimen/spacing_large"
             android:paddingEnd="40dp"
             android:textAlignment="center" />
     </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/apk/res/layout/widget_no_data.xml b/apk/res/layout/widget_no_data.xml
deleted file mode 100644
index d620a84..0000000
--- a/apk/res/layout/widget_no_data.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2023 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/no_data_layout"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:clipToPadding="false">
-
-    <TextView
-        android:id="@+id/no_data"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingHorizontal="@dimen/spacing_normal"
-        android:text="@string/no_data"
-        android:textAppearance="?attr/textAppearanceHeadline6" />
-</LinearLayout>
diff --git a/apk/res/layout/widget_request_permission_header.xml b/apk/res/layout/widget_request_permission_header.xml
index 543d380..6f2d914 100644
--- a/apk/res/layout/widget_request_permission_header.xml
+++ b/apk/res/layout/widget_request_permission_header.xml
@@ -38,30 +38,46 @@
         style="?attr/textAppearanceHeadline4" />
 
     <TextView
+        android:id="@+id/summary"
+        android:layout_gravity="center_horizontal"
+        android:gravity="center"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:drawablePadding="@dimen/spacing_normal"
-        android:drawableStart="?attr/chooseDataIcon"
-        android:paddingBottom="@dimen/spacing_small"
-        android:text="@string/request_permissions_header_desc"
-        style="?attr/textAppearanceSummaryLarge"/>
+        android:textAppearance="?attr/textAppearanceSummaryLarge"
+        android:paddingBottom="@dimen/spacing_normal"
+        android:visibility="gone"/>
 
-    <TextView
-        android:id="@+id/history_access"
+    <LinearLayout
+        android:id="@+id/detailed_permissions"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:drawablePadding="@dimen/spacing_normal"
-        android:drawableStart="?attr/accessHistoryIcon"
-        android:paddingBottom="@dimen/spacing_small"
-        android:text="@string/request_permissions_header_time_frame_desc"
-        style="?attr/textAppearanceSummaryLarge" />
+        android:orientation="vertical">
+        <TextView
+            android:id="@+id/data_access_type"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:drawablePadding="@dimen/spacing_normal"
+            android:drawableStart="?attr/chooseDataIcon"
+            android:paddingBottom="@dimen/spacing_small"
+            style="?attr/textAppearanceSummaryLarge"/>
 
-    <TextView
-        android:id="@+id/privacy_policy"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:drawablePadding="@dimen/spacing_normal"
-        android:drawableStart="?attr/privacyPolicyIcon"
-        android:paddingBottom="@dimen/spacing_small"
-        style="?attr/textAppearanceSummaryLarge"/>
+        <TextView
+            android:id="@+id/access_info"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:drawablePadding="@dimen/spacing_normal"
+            android:drawableStart="?attr/accessHistoryIcon"
+            android:paddingBottom="@dimen/spacing_small"
+            style="?attr/textAppearanceSummaryLarge" />
+
+        <TextView
+            android:id="@+id/privacy_policy"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:drawablePadding="@dimen/spacing_normal"
+            android:drawableStart="?attr/privacyPolicyIcon"
+            android:paddingBottom="@dimen/spacing_small"
+            style="?attr/textAppearanceSummaryLarge"/>
+    </LinearLayout>
+
 </LinearLayout>
\ No newline at end of file
diff --git a/apk/res/layout/widget_warning_preference.xml b/apk/res/layout/widget_warning_preference.xml
new file mode 100644
index 0000000..201899a
--- /dev/null
+++ b/apk/res/layout/widget_warning_preference.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    android:paddingHorizontal="@dimen/spacing_large">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:padding="@dimen/spacing_data_entries"
+        android:background="@drawable/banner_background_outlined"
+        android:gravity="center">
+
+        <ImageView
+            android:layout_width="@dimen/route_request_icon_size"
+            android:layout_height="@dimen/route_request_icon_size"
+            android:layout_marginEnd="@dimen/spacing_data_entries"
+            android:background="?attr/privacyPolicyIcon"/>
+
+        <TextView
+            android:id="@+id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.HealthConnect.Label.Small"/>
+
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/apk/res/navigation/app_data_nav_graph.xml b/apk/res/navigation/app_data_nav_graph.xml
new file mode 100644
index 0000000..1381147
--- /dev/null
+++ b/apk/res/navigation/app_data_nav_graph.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright (C) 2024 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/app_data_nav_graph"
+    app:startDestination="@id/appDataFragment">
+
+    <fragment
+        android:id="@+id/appDataFragment"
+        android:label="@string/app_data_title"
+        android:name="com.android.healthconnect.controller.data.appdata.AppDataFragment">
+        <argument
+            android:name="android.intent.extra.PACKAGE_NAME"
+            app:argType="string" />
+        <action
+            android:id="@+id/action_appData_to_appEntries"
+            app:destination="@id/appEntriesFragment" />
+    </fragment>
+
+    <fragment
+        android:id="@+id/appEntriesFragment"
+        android:label="App entries"
+        android:name="com.android.healthconnect.controller.data.entries.AppEntriesFragment">
+        <argument
+            android:name="android.intent.extra.PACKAGE_NAME"
+            app:argType="string" />
+        <action
+            android:id="@+id/action_appEntriesFragment_to_dataEntryDetailsFragment"
+            app:destination="@id/dataEntryDetailsFragment" />
+        <action
+            android:id="@+id/action_appEntriesFragment_to_rawFhirFragment"
+            app:destination="@id/rawFhirFragment" />
+    </fragment>
+
+    <fragment
+        android:id="@+id/dataEntryDetailsFragment" android:name="com.android.healthconnect.controller.entrydetails.DataEntryDetailsFragment"
+        android:label="@string/entry_details_title" >
+    </fragment>
+
+    <fragment
+        android:id="@+id/rawFhirFragment"
+        android:name="com.android.healthconnect.controller.data.rawfhir.RawFhirFragment"
+        android:label="@string/raw_fhir_title" >
+    </fragment>
+
+</navigation>
\ No newline at end of file
diff --git a/apk/res/navigation/combined_permissions_nav_graph.xml b/apk/res/navigation/combined_permissions_nav_graph.xml
index fe74e9a..756ad61 100644
--- a/apk/res/navigation/combined_permissions_nav_graph.xml
+++ b/apk/res/navigation/combined_permissions_nav_graph.xml
@@ -20,6 +20,7 @@
 
     <include app:graph="@navigation/fitness_app_nav_graph"/>
     <include app:graph="@navigation/medical_app_nav_graph"/>
+    <include app:graph="@navigation/app_data_nav_graph"/>
 
     <fragment
         android:id="@+id/combinedPermissionsFragment"
@@ -39,36 +40,7 @@
             app:destination="@id/additionalAccessFragment" />
         <action
             android:id="@+id/action_combinedPermissions_to_appData"
-            app:destination="@id/appDataFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/appDataFragment"
-        android:label="@string/app_data_title"
-        android:name="com.android.healthconnect.controller.data.appdata.AppDataFragment">
-        <argument
-            android:name="android.intent.extra.PACKAGE_NAME"
-            app:argType="string" />
-        <action
-            android:id="@+id/action_appData_to_appEntries"
-            app:destination="@id/appEntriesFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/appEntriesFragment"
-        android:label="App entries"
-        android:name="com.android.healthconnect.controller.data.entries.AppEntriesFragment">
-        <argument
-            android:name="android.intent.extra.PACKAGE_NAME"
-            app:argType="string" />
-        <action
-            android:id="@+id/action_appEntriesFragment_to_dataEntryDetailsFragment"
-            app:destination="@id/dataEntryDetailsFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/dataEntryDetailsFragment" android:name="com.android.healthconnect.controller.entrydetails.DataEntryDetailsFragment"
-        android:label="@string/entry_details_title" >
+            app:destination="@id/app_data_nav_graph" />
     </fragment>
 
     <fragment
@@ -78,5 +50,8 @@
         <argument
             android:name="android.intent.extra.PACKAGE_NAME"
             app:argType="string" />
+        <action
+            android:id="@+id/action_additionalAccess_to_medicalApp"
+            app:destination="@id/medical_app_nav_graph" />
     </fragment>
 </navigation>
\ No newline at end of file
diff --git a/apk/res/navigation/data_nav_graph_new_ia.xml b/apk/res/navigation/data_nav_graph_new_ia.xml
index 83fc660..2c35342 100644
--- a/apk/res/navigation/data_nav_graph_new_ia.xml
+++ b/apk/res/navigation/data_nav_graph_new_ia.xml
@@ -26,30 +26,7 @@
     <include app:graph="@navigation/combined_permissions_nav_graph"/>
     <include app:graph="@navigation/connected_apps_nav_graph"/>
     <include app:graph="@navigation/data_sources_nav_graph"/>
-
-    <fragment
-        android:id="@+id/appDataFragment"
-        android:label="@string/app_data_title"
-        android:name="com.android.healthconnect.controller.data.appdata.AppDataFragment">
-        <argument
-            android:name="android.intent.extra.PACKAGE_NAME"
-            app:argType="string" />
-        <action
-            android:id="@+id/action_appData_to_appEntries"
-            app:destination="@id/appEntriesFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/appEntriesFragment"
-        android:label="@string/app_data_title"
-        android:name="com.android.healthconnect.controller.data.entries.AppEntriesFragment">
-        <argument
-            android:name="android.intent.extra.PACKAGE_NAME"
-            app:argType="string" />
-        <action
-            android:id="@+id/action_appEntriesFragment_to_dataEntryDetailsFragment"
-            app:destination="@id/dataEntryDetailsFragment" />
-    </fragment>
+    <include app:graph="@navigation/entries_and_access_nav_graph"/>
 
     <fragment
         android:id="@+id/allDataFragment"
@@ -57,58 +34,13 @@
         android:name="com.android.healthconnect.controller.data.alldata.AllDataFragment">
         <action
             android:id="@+id/action_allData_to_entriesAndAccess"
-            app:destination="@id/entriesAndAccessFragment" />
-        <action
-            android:id="@+id/action_allDataFragment_to_unitFragment"
-            app:destination="@id/unitFragment" />
+            app:destination="@id/entries_and_access_nav_graph" />
         <action
             android:id="@+id/action_allDataFragment_to_dataSourcesFragment"
             app:destination="@id/data_sources_nav_graph"/>
-
-    </fragment>
-
-    <fragment
-        android:id="@+id/entriesAndAccessFragment"
-        android:label="@string/data_title"
-        android:name="com.android.healthconnect.controller.data.entriesandaccess.EntriesAndAccessFragment">
         <action
-            android:id="@+id/action_entriesAndAccessFragment_to_dataEntryDetailsFragment"
-            app:destination="@id/dataEntryDetailsFragment" />
-        <action
-            android:id="@+id/action_entriesAndAccessFragment_to_rawFhirFragment"
-            app:destination="@id/rawFhirFragment" />
-        <action
-            android:id="@+id/action_entriesAndAccessFragment_to_fitnessApp"
-            app:destination="@id/fitness_app_nav_graph" />
-        <action
-            android:id="@+id/action_entriesAndAccessFragment_to_medicalApp"
-            app:destination="@id/medical_app_nav_graph" />
-        <action
-            android:id="@+id/action_entriesAndAccessFragment_to_combinedPermissions"
-            app:destination="@id/combined_permissions_nav_graph" />
-        <action
-            android:id="@+id/action_entriesAndAccessFragment_to_unitFragment"
-            app:destination="@id/unitFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/unitFragment"
-        android:name="com.android.healthconnect.controller.dataentries.units.UnitsFragment"
-        android:label="@string/units_title" />
-
-    <fragment
-        android:id="@+id/dataEntryDetailsFragment"
-        android:name="com.android.healthconnect.controller.entrydetails.DataEntryDetailsFragment"
-        android:label="@string/entry_details_title" >
-        <action
-            android:id="@+id/action_dataEntryDetailsFragment_to_unitFragment"
-            app:destination="@id/unitFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/rawFhirFragment"
-        android:name="com.android.healthconnect.controller.data.rawfhir.RawFhirFragment"
-        android:label="@string/entry_details_title" >
+            android:id="@+id/action_allDataFragment_to_connectedApps"
+            app:destination="@id/connected_apps_nav_graph" />
     </fragment>
 
 </navigation>
\ No newline at end of file
diff --git a/apk/res/navigation/entries_and_access_nav_graph.xml b/apk/res/navigation/entries_and_access_nav_graph.xml
new file mode 100644
index 0000000..ba7c71a
--- /dev/null
+++ b/apk/res/navigation/entries_and_access_nav_graph.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  ~
+  -->
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/entries_and_access_nav_graph"
+    app:startDestination="@id/entriesAndAccessFragment">
+
+    <include app:graph="@navigation/fitness_app_nav_graph"/>
+    <include app:graph="@navigation/medical_app_nav_graph"/>
+    <include app:graph="@navigation/combined_permissions_nav_graph"/>
+    <include app:graph="@navigation/connected_apps_nav_graph"/>
+    <include app:graph="@navigation/data_sources_nav_graph"/>
+
+    <fragment
+        android:id="@+id/entriesAndAccessFragment"
+        android:label="@string/data_title"
+        android:name="com.android.healthconnect.controller.data.entriesandaccess.EntriesAndAccessFragment">
+        <action
+            android:id="@+id/action_entriesAndAccessFragment_to_dataEntryDetailsFragment"
+            app:destination="@id/dataEntryDetailsFragment" />
+        <action
+            android:id="@+id/action_entriesAndAccessFragment_to_fitnessApp"
+            app:destination="@id/fitness_app_nav_graph" />
+        <action
+            android:id="@+id/action_entriesAndAccessFragment_to_medicalApp"
+            app:destination="@id/medical_app_nav_graph" />
+        <action
+            android:id="@+id/action_entriesAndAccessFragment_to_combinedPermissions"
+            app:destination="@id/combined_permissions_nav_graph" />
+        <action
+            android:id="@+id/action_entriesAndAccessFragment_to_rawFhirFragment"
+            app:destination="@id/rawFhirFragment" />
+        <action
+            android:id="@+id/action_entriesAndAccess_to_connectedApps"
+            app:destination="@id/connected_apps_nav_graph" />
+    </fragment>
+
+    <fragment
+        android:id="@+id/dataEntryDetailsFragment"
+        android:name="com.android.healthconnect.controller.entrydetails.DataEntryDetailsFragment"
+        android:label="@string/entry_details_title" />
+
+    <fragment
+        android:id="@+id/rawFhirFragment"
+        android:name="com.android.healthconnect.controller.data.rawfhir.RawFhirFragment"
+        android:label="@string/raw_fhir_title" >
+    </fragment>
+
+</navigation>
\ No newline at end of file
diff --git a/apk/res/navigation/fitness_app_nav_graph.xml b/apk/res/navigation/fitness_app_nav_graph.xml
index c2ca768..e040b10 100644
--- a/apk/res/navigation/fitness_app_nav_graph.xml
+++ b/apk/res/navigation/fitness_app_nav_graph.xml
@@ -18,6 +18,8 @@
     android:id="@+id/fitness_app_nav_graph"
     app:startDestination="@id/fitnessAppFragment">
 
+    <include app:graph="@navigation/app_data_nav_graph"/>
+
     <fragment
         android:id="@+id/fitnessAppFragment"
         android:label="@string/app_access_title"
@@ -27,7 +29,7 @@
             app:argType="string" />
         <action
             android:id="@+id/action_fitnessApp_to_appData"
-            app:destination="@id/appDataFragment" />
+            app:destination="@id/app_data_nav_graph" />
         <action
             android:id="@+id/action_fitnessAppFragment_to_additionalAccessFragment"
             app:destination="@id/additionalAccessFragment" />
@@ -37,35 +39,6 @@
     </fragment>
 
     <fragment
-        android:id="@+id/appDataFragment"
-        android:label="@string/app_data_title"
-        android:name="com.android.healthconnect.controller.data.appdata.AppDataFragment">
-        <argument
-            android:name="android.intent.extra.PACKAGE_NAME"
-            app:argType="string" />
-        <action
-            android:id="@+id/action_appData_to_appEntries"
-            app:destination="@id/appEntriesFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/appEntriesFragment"
-        android:label="App entries"
-        android:name="com.android.healthconnect.controller.data.entries.AppEntriesFragment">
-        <argument
-            android:name="android.intent.extra.PACKAGE_NAME"
-            app:argType="string" />
-        <action
-            android:id="@+id/action_appEntriesFragment_to_dataEntryDetailsFragment"
-            app:destination="@id/dataEntryDetailsFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/dataEntryDetailsFragment" android:name="com.android.healthconnect.controller.entrydetails.DataEntryDetailsFragment"
-        android:label="@string/entry_details_title" >
-    </fragment>
-
-    <fragment
         android:id="@+id/additionalAccessFragment"
         android:name="com.android.healthconnect.controller.permissions.additionalaccess.AdditionalAccessFragment"
         android:label="@string/additional_access_label" >
diff --git a/apk/res/navigation/medical_app_nav_graph.xml b/apk/res/navigation/medical_app_nav_graph.xml
index 34d0797..9cdcfc0 100644
--- a/apk/res/navigation/medical_app_nav_graph.xml
+++ b/apk/res/navigation/medical_app_nav_graph.xml
@@ -18,6 +18,8 @@
     android:id="@+id/medical_app_nav_graph"
     app:startDestination="@id/medicalAppFragment">
 
+    <include app:graph="@navigation/app_data_nav_graph"/>
+
     <fragment
         android:id="@+id/medicalAppFragment"
         android:label="@string/app_access_title"
@@ -27,42 +29,13 @@
             app:argType="string" />
         <action
             android:id="@+id/action_medicalApp_to_appData"
-            app:destination="@id/appDataFragment" />
+            app:destination="@id/app_data_nav_graph" />
         <action
             android:id="@+id/action_medicalAppFragment_to_additionalAccessFragment"
             app:destination="@id/additionalAccessFragment" />
     </fragment>
 
     <fragment
-        android:id="@+id/appDataFragment"
-        android:label="@string/app_data_title"
-        android:name="com.android.healthconnect.controller.data.appdata.AppDataFragment">
-        <argument
-            android:name="android.intent.extra.PACKAGE_NAME"
-            app:argType="string" />
-        <action
-            android:id="@+id/action_appData_to_appEntries"
-            app:destination="@id/appEntriesFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/appEntriesFragment"
-        android:label="App entries"
-        android:name="com.android.healthconnect.controller.data.entries.AppEntriesFragment">
-        <argument
-            android:name="android.intent.extra.PACKAGE_NAME"
-            app:argType="string" />
-        <action
-            android:id="@+id/action_appEntriesFragment_to_dataEntryDetailsFragment"
-            app:destination="@id/dataEntryDetailsFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/dataEntryDetailsFragment" android:name="com.android.healthconnect.controller.entrydetails.DataEntryDetailsFragment"
-        android:label="@string/entry_details_title" >
-    </fragment>
-
-    <fragment
         android:id="@+id/additionalAccessFragment"
         android:name="com.android.healthconnect.controller.permissions.additionalaccess.AdditionalAccessFragment"
         android:label="@string/additional_access_label" >
diff --git a/apk/res/navigation/medical_data_nav_graph.xml b/apk/res/navigation/medical_data_nav_graph.xml
index 9a415c5..8260803 100644
--- a/apk/res/navigation/medical_data_nav_graph.xml
+++ b/apk/res/navigation/medical_data_nav_graph.xml
@@ -20,6 +20,10 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/medical_data_nav_graph"
     app:startDestination="@id/medicalAllDataFragment">
+    <!-- TODO(b/376521807): Merge this with data_nav_graph_new_ia -->
+
+    <include app:graph="@navigation/entries_and_access_nav_graph"/>
+    <include app:graph="@navigation/connected_apps_nav_graph"/>
 
     <fragment
         android:id="@+id/medicalAllDataFragment"
@@ -27,31 +31,10 @@
         android:name="com.android.healthconnect.controller.data.alldata.AllDataFragment">
         <action
             android:id="@+id/action_medicalAllData_to_entriesAndAccess"
-            app:destination="@id/entriesAndAccessFragment" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/entriesAndAccessFragment"
-        android:label="@string/data_title"
-        android:name="com.android.healthconnect.controller.data.entriesandaccess.EntriesAndAccessFragment">
+            app:destination="@id/entries_and_access_nav_graph" />
         <action
-            android:id="@+id/action_entriesAndAccessFragment_to_rawFhirFragment"
-            app:destination="@id/rawFhirFragment" />
-        <action
-            android:id="@+id/action_entriesAndAccessFragment_to_fitnessApp"
-            app:destination="@id/fitness_app_nav_graph" />
-        <action
-            android:id="@+id/action_entriesAndAccessFragment_to_medicalApp"
-            app:destination="@id/medical_app_nav_graph" />
-        <action
-            android:id="@+id/action_entriesAndAccessFragment_to_combinedPermissions"
-            app:destination="@id/combined_permissions_nav_graph" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/rawFhirFragment"
-        android:name="com.android.healthconnect.controller.data.rawfhir.RawFhirFragment"
-        android:label="@string/entry_details_title" >
+            android:id="@+id/action_allDataFragment_to_connectedApps"
+            app:destination="@id/connected_apps_nav_graph" />
     </fragment>
 
 </navigation>
\ No newline at end of file
diff --git a/apk/res/raw/keep.xml b/apk/res/raw/keep.xml
new file mode 100644
index 0000000..aff5340
--- /dev/null
+++ b/apk/res/raw/keep.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright (C) 2024 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- Keep resources loaded by name by the system server -->
+<resources xmlns:tools="http://schemas.android.com/tools"
+    tools:keep="
+        @string/*_notification_content,
+        @string/*_notification_title,
+        @string/export_notification_*,
+        @string/import_notification_*,
+    " />
diff --git a/apk/res/values-af/strings.xml b/apk/res/values-af/strings.xml
index 55246e4..3f98b72 100644
--- a/apk/res/values-af/strings.xml
+++ b/apk/res/values-af/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Bestuur die gesondheid- en fiksheiddata op jou toestel, en beheer watter apps toegang daartoe het"</string>
     <string name="data_title" msgid="4456619761533380816">"Data en toegang"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Blaai deur gesondheidrekords"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Bekyk jou gesondheidrekords en die apps wat toegang daartoe kan verkry"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Alle kategorieë"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Sien alle kategorieë"</string>
     <string name="no_data" msgid="1906986019249068659">"Geen data nie"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Gister"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Gelees: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Geskryf: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Bestuur toestemmings"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Tyd: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktiwiteit"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"toegang tot jou gesondheiddata"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Lees kalorieë verbrand"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Laat die app toe om die kalorieë verbrand te lees"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Kry toegang tot data in die agtergrond"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Laat <xliff:g id="APP_NAME">%1$s</xliff:g> toe om toegang tot data in die agtergrond te kry?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Laat <xliff:g id="APP_NAME">%1$s</xliff:g> toe om toegang tot data in die agtergrond te kry?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"As jy dit toelaat, kan hierdie app toegang tot fiksheid- en welstanddata en gesondheidrekords kry wanneer jy nie die app gebruik nie."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"As jy dit toelaat, kan hierdie app toegang tot gesondheidrekords kry wanneer jy nie die app gebruik nie."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"As jy dit toelaat, kan hierdie app toegang tot fiksheid- en welstanddata kry wanneer jy nie die app gebruik nie."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"As jy dit toelaat, kan hierdie app toegang tot Health Connect-data kry wanneer jy nie die app gebruik nie."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Laat <xliff:g id="APP_NAME">%1$s</xliff:g> toe om toegang tot vorige data te kry?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"As jy dit toelaat, kan hierdie app toegang kry tot fiksheid- en welstanddata wat voor <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> bygevoeg is."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"As jy dit toelaat, kan hierdie app toegang tot alle vorige fiksheid- en welstanddata kry."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"As jy dit toelaat, kan hierdie app toegang tot Health Connect-data kry wat voor <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> bygevoeg is."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"As jy dit toelaat, kan hierdie app toegang tot alle vorige Health Connect-data kry."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Laat bykomende toegang vir <xliff:g id="APP_NAME">%1$s</xliff:g> toe?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> wil ook toegang kry tot hierdie Health Connect-instellings"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Kry toegang tot alle data in die agtergrond"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Kry toegang tot gesondheidrekords in die agtergrond"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Kry toegang tot fiksheid- en welstanddata in die agtergrond"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Laat hierdie app toe om toegang tot fiksheid- en welstanddata en gesondheidrekords te kry wanneer jy nie die app gebruik nie"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Laat hierdie app toe om toegang tot hierdie data te kry wanneer jy nie die app gebruik nie"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Laat hierdie app toe om toegang tot hierdie data te kry wanneer jy nie die app gebruik nie"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Kry toegang tot data in die agtergrond"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Laat hierdie app toe om toegang tot Health Connect-data te kry wanneer jy nie die app gebruik nie"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Kry toegang tot vorige fiksheid- en welstanddata"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Laat hierdie app toe om toegang tot data te kry wat voor <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> bygevoeg is"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Laat hierdie app toe om toegang tot alle vorige data te kry"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Kry toegang tot vorige data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Laat hierdie app toe om toegang tot Health Connect-data te kry wat voor <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> bygevoeg is"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Laat hierdie app toe om toegang tot vorige Health Connect-data te kry"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan reeds toegang tot vorige data vir jou gesondheidrekords kry"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Lees meer oor toestemmings"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Kry toegang tot alle data in die agtergrond"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Kry toegang tot gesondheidrekords in die agtergrond"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Kry toegang tot fiksheid- en welstanddata in die agtergrond"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Laat hierdie app toe om toegang tot fiksheid- en welstanddata en gesondheidrekords te kry wanneer jy nie die app gebruik nie"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Laat hierdie app toe om toegang tot hierdie data te kry wanneer jy nie die app gebruik nie"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Laat hierdie app toe om toegang tot hierdie data te kry wanneer jy nie die app gebruik nie"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Kry toegang tot data in die agtergrond"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Laat hierdie app toe om toegang tot Health Connect-data te kry wanneer jy nie die app gebruik nie"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Kry toegang tot vorige fiksheid- en welstanddata"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Laat hierdie app toe om toegang tot data te kry wat voor <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> bygevoeg is"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Laat hierdie app toe om toegang tot alle vorige data te kry"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Kry toegang tot vorige data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Laat hierdie app toe om toegang tot Health Connect-data te kry wat voor <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> bygevoeg is"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Laat hierdie app toe om toegang tot alle vorige Health Connect-data te kry"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Geen fiksheiddata word tans gelees nie, want <xliff:g id="APP_NAME">%1$s</xliff:g> het geen leestoestemmings aan nie"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan reeds toegang tot vorige data vir jou gesondheidrekords kry. Skakel gesondheidrekordtoestemmings vir hierdie app af om dit te verander"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Bestuur gesondheidrekordtoestemmings"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aktiveer ten minste een leestoestemming om agtergrond- of vorige datatoegang vir hierdie app aan te skakel"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aktiveer ten minste een leestoestemming om agtergrondtoegang vir hierdie app aan te skakel"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aktiveer ten minste een leestoestemming om vorige datatoegang vir hierdie app aan te skakel"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Laat hierdie app toe om toegang tot vorige Health Connect-data te kry"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Laat hierdie app toe om toegang tot Health Connect-data te kry wanneer jy nie die app gebruik nie"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"As jy dit toelaat, kan hierdie app toegang tot Health Connect-data kry wanneer jy nie die app gebruik nie."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Kry toegang tot vorige data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Laat <xliff:g id="APP_NAME">%1$s</xliff:g> toe om toegang tot vorige data te kry?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Laat hierdie app toe om toegang tot Health Connect-data te kry wat voor <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> bygevoeg is"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Laat hierdie app toe om toegang tot vorige Health Connect-data te kry"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"As jy dit toelaat, kan hierdie app toegang tot Health Connect-data kry wat voor <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> bygevoeg is."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"As jy dit toelaat, kan hierdie app toegang tot vorige Health Connect-data kry."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktiewe kalorieë verbrand"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktiewe kalorieë verbrand"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Lees aktiewe kalorieë verbrand"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"rolstoelstote"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Lees rolstoelstote"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Skryf rolstoelstote"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Aktiwiteitintensiteit"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"aktiwiteitintensiteit"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Lees aktiwiteitintensiteit"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Skryf aktiwiteitintensiteit"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basale metaboliese koers"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basale metaboliese koers"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Lees basale metaboliese koers"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"veltemperatuur"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Lees veltemperatuur"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Skryf veltemperatuur neer"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Dit sluit al die gesondheidrekords in wat gesinkroniseer is met Health Connect en daarby gevoeg is. Dit is dalk nie jou volledige mediese rekord nie en sluit nie ’n mediese beskrywing van jou gesondheidsrekords in nie."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Alle gesondheidrekords"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"alle gesondheidrekords"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Skryf alle gesondheidrekords"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergieë"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergieë"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lees data oor allergieë"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"immunisasie"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunisasie"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Lees immunisasie"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratoriumresultate"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratoriumresultate"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Lees laboratoriumresultate"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergieë"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergieë"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Lees data oor allergieë"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Toestande"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"toestande"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Lees toestande"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Entstowwe"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"entstowwe"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Lees data oor entstowwe"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratoriumuitslae"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratoriumuitslae"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Lees data oor laboratoriumuitslae"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medisyne"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medisyne"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Lees medisyne"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Persoonlike besonderhede"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"persoonlike besonderhede"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Lees persoonlike besonderhede"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Praktisynbesonderhede"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"praktisynbesonderhede"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Lees praktisynbesonderhede"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Swangerskap"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"swangerskap"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Lees swangerskap"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Probleme"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"probleme"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Lees probleme"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Prosedures"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"prosedures"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Lees prosedures"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sosiale geskiedenis"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sosiale geskiedenis"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sosiale geskiedenis"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Lees sosiale geskiedenis"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Lewenstekens"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Besoeke"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"besoeke"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Lees besoeke"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Lewenstekens"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"lewenstekens"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Lees lewenstekens"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Bewustheid"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Skryf bewustheid"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Laat “<xliff:g id="APP_NAME">%1$s</xliff:g>” toe om te lees"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Laat “<xliff:g id="APP_NAME">%1$s</xliff:g>” toe om te skryf"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Kanselleer"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Laat toe"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Laat alles toe"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Moenie toelaat nie"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Kies data in Health Connect wat jy wil hê hierdie app moet lees of skryf"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Kies data wat jy wil hê hierdie app in Health Connect moet lees of skryf"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Kies data wat jy wil hê hierdie app in Health Connect moet lees"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Kies data wat jy wil hê hierdie app in Health Connect moet skryf"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"As jy leestoegang gee, kan die app nuwe data en data van die afgelope 30 dae lees"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"As jy leestoegang gee, kan die app nuwe en vorige data lees"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Gee <xliff:g id="APP_NAME">%1$s</xliff:g> toegang tot Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Jy kan in die ontwikkelaar se <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> uitvind hoe <xliff:g id="APP_NAME">%1$s</xliff:g> jou data hanteer"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Laat <xliff:g id="APP_NAME">%1$s</xliff:g> toe om toegang tot fiksheid- en welstanddata te kry?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Jy kan meer inligting kry oor hoe <xliff:g id="APP_NAME">%1$s</xliff:g> jou data hanteer in hul <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privaatheidsbeleid"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Laat <xliff:g id="APP_NAME">%1$s</xliff:g> toe om toegang tot jou gesondheidrekords te kry?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"As jy toegang gee, kan die app data soos allergieë, laboratoriumresultate, entstowwe en meer lees en skryf\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"As jy toegang gee, kan die app data soos allergieë, laboratoriumresultate, entstowwe en meer lees\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Meer oor gesondheidrekords"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data om te deel sluit in"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"As jy dit toelaat, kan <xliff:g id="APP_NAME">%1$s</xliff:g> jou gesondheidrekords met Health Connect deel."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinkroniseer jou gesondheidrekords vanaf jou verskillende apps en bronne om dit op een plek te hou"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Verwyder alle toestemmings?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Verwyder almal"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer enige data van Health Connect af kan lees of skryf nie.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer enige data, insluitend vorige data, van Health Connect af kan lees of skryf nie.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos ligging, kamera of mikrofoon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer enige data, insluitend agtergrond- en vorige data, van Health Connect af kan lees of skryf nie.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos ligging, kamera of mikrofoon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Vee ook <xliff:g id="APP_NAME">%1$s</xliff:g>-data in Health Connect uit"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Verwyder alle toestemmings?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Verwyder alle toestemmings vir gesondheidsrekords?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Verwyder alle fiksheid- en welstandtoestemmings?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Vee ook fiksheiddata op <xliff:g id="APP_NAME">%1$s</xliff:g> vanaf Health Connect uit"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Verwyder alle toestemmings vir gesondheidsrekords?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Vee ook gesondheidsrekords op <xliff:g id="APP_NAME">%1$s</xliff:g> vanaf Health Connect uit"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer hierdie data van Health Connect af kan lees of skryf nie.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer hierdie data van Health Connect af kan lees of skryf nie, insluitend agtergronddata.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer hierdie data van Health Connect af kan lees of skryf nie, insluitend vorige data.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer hierdie data van Health Connect af kan lees of skryf nie, insluitend agtergrond en vorige data.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Verwyder alle toestemmings?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer data van Health Connect af kan lees of skryf nie.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer data van Health Connect af kan lees of skryf nie, insluitend agtergronddata.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer data van Health Connect af kan lees of skryf nie, insluitend vorige data.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> sal nie meer data van Health Connect af kan lees of skryf nie, insluitend agtergrond en vorige data.\n\nDit raak nie ander toestemmings wat hierdie app dalk het nie, soos kamera, mikrofoon of ligging."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Vee ook fiksheiddata en gesondheidsrekords op <xliff:g id="APP_NAME">%1$s</xliff:g> vanaf Health Connect uit"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Toestemmings is van hierdie app af verwyder"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Vee ook alle Health Connect-data uit"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Volgende dag"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Gekose dag"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Vorige dag"</string>
     <string name="default_error" msgid="7966868260616403475">"Iets was fout. Probeer weer."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Onbekende hulpbron"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Brondata"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Oop hakie."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Geslote hakie."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Veld <xliff:g id="FIELD">%2$s</xliff:g> Waarde"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Hierdie apps het nie meer toegang nie, maar het steeds data wat in Health Connect geberg is"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan data lees wat ná <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> bygevoeg is"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Gaan na Instellings &gt; Apps om ander Android-toestemmings te bestuur waartoe hierdie app toegang het"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data wat jy met <xliff:g id="APP_NAME">%1$s</xliff:g> deel, word deur hul privaatheidsbeleid gedek"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Jy kan in die ontwikkelaar se privaatheidsbeleid uitvind hoe <xliff:g id="APP_NAME">%1$s</xliff:g> jou data hanteer."</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Gaan na Instellings en tik dan op Apps om ander Android-toestemmings te bestuur waartoe hierdie app toegang het"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Lees die privaatheidsbeleid"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"In afgelope 24 uur gebruik"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Apptoegang"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Jy het tans geen versoenbare apps geïnstalleer nie"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Bykomende toegang"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Vorige data, agtergronddata"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Het bykomende toestemmings vir hierdie app verwyder"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Toestemmings"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fiksheid en welstand"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Oefening, slaap, voeding en ander"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Gesondheidrekords"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"gesondheidrekords"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laboratoriumresultate, medikasie, inentings en ander"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Labuitslae, medisyne, entstowwe en ander"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Het apptoestemmings verwyder"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect het toestemmings vir <xliff:g id="APP_DATA">%s</xliff:g> verwyder"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect het toestemmings vir <xliff:g id="APP_DATA_0">%1$s</xliff:g> en <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> verwyder"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Gaan na die Play Winkel"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Kom aan die gang met Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect stoor jou gesondheid- en fiksheiddata en bied só ’n eenvoudige manier om die verskillende apps op jou toestel te sinkroniseer"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect stoor en sinkroniseer jou data van verskillende apps af.\n\n"<b>"Fiksheid- en welstanddata,"</b>" insluitend oefensessies, treë, voeding, slaap en meer\n\n"<b>"Gesondheidsrekords,"</b>" insluitend entstowwe, laboratoriumuitslae en meer"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Met Health Connect kan jy"</string>
     <string name="share_data" msgid="3481932156368883946">"Deel data met jou apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Kies die data wat elke app in Health Connect kan lees of skryf"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Bestuur jou instellings en privaatheid"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Ligte vloei"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Middelmatige vloei"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Sterk vloei"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Onbekende vloei"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruasiedag <xliff:g id="DAY">%1$d</xliff:g> van <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruasie (1 dag)}other{Menstruasie (# dae)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positief"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatief"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Hoog"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musiek"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Ander"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Onbegelei"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Matig"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Energiek"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> u. <xliff:g id="MIN">%2$s</xliff:g> min."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> u."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrasie is aan die gang"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect word tans met die Android-stelsel geïntegreer.\n\nDit kan ’n rukkie neem vir jou data en toestemmings om oorgedra te word."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Moenie die app toemaak totdat jy ’n kennisgewing gekry het dat die proses voltooi is nie."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect-integrasie is aan die gang"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Opdatering is nodig"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect word met die Android-stelsel geïntegreer sodat jy direk van jou instellings af toegang daartoe kan kry."</string>
     <string name="update_button" msgid="4544529019832009496">"Dateer op"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Begin hierdie opdatering sodat Health Connect kan voortgaan om met jou stelselinstellings te integreer"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Dateer nou op"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Stelselopdatering is nodig"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Dateer jou foonstelsel op voordat jy voortgaan."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"As jy reeds jou foonstelsel opgedateer het, kan jy probeer om jou foon te herbegin sodat jy met die integrasie kan voortgaan"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect-opdatering nodig"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Voordat jy voortgaan, moet jy die Health Connect-app na die jongste weergawe opdateer."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Nog spasie nodig"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect het <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> se bergingspasie op jou foon nodig sodat die integrasie kan voortgaan.\n\nMaak spasie op jou foon beskikbaar en probeer dan weer."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Probeer weer"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Maak spasie beskikbaar"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Nog spasie nodig"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect het <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> se bergingspasie op jou foon nodig sodat die integrasie kan voortgaan."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrasie is onderbreek"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Die Health Connect-app het toegemaak terwyl die proses om dit met die Android-stelsel te integreer, aan die gang was.\n\nKlik hervat om die app weer oop te maak en voort te gaan om jou data en toestemmings oor te dra."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Voltooi dit binne <xliff:g id="TIME_NEEDED">%1$s</xliff:g> as jy jou Health Connect-data wil behou"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tik om voort te gaan om Health Connect met die Android-stelsel te integreer. Voltooi dit binne <xliff:g id="TIME_NEEDED">%1$s</xliff:g> as jy jou data wil behou"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tik om voort te gaan om Health Connect met die Android-stelsel te integreer."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Gaan voort"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Hervat Health Connect-integrasie"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Voltooi dit binne <xliff:g id="TIME_NEEDED">%1$s</xliff:g> as jy jou data wil behou"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Appopdatering word benodig"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> moet opgedateer word om steeds met Health Connect te sinkroniseer"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Sommige apps moet opgedateer word om steeds met Health Connect te sinkroniseer"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> moet opgedateer word om steeds met Health Connect te sinkroniseer. Opdaterings is dalk nie vir alle apps beskikbaar nie."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Sommige apps moet opgedateer word om steeds met Health Connect te sinkroniseer. Opdaterings is dalk nie vir alle apps beskikbaar nie."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Kyk vir opdaterings"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Meer inligting"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-integrasie"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect-integrasie is nie voltooi nie."</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Jy sal ’n kennisgewing kry wanneer dit weer beskikbaar word."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Het dit"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-integrasie is nie voltooi nie."</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Lees meer"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-integrasie is voltooi"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Oop"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Wat’s nuut"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Jy kan nou direk van jou instellings af toegang tot Health Connect kry. Deïnstalleer die Health Connect-app enige tyd om bergingspasie beskikbaar te maak."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Het dit"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Wysig appbronne"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Toestelverstek"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Appdata"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data vanaf apps met toegang tot Health Connect sal hier gewys word"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data van <xliff:g id="APP_NAME">%1$s</xliff:g> af sal hier wys"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data vanaf apps met toegang tot Health Connect sal hier gewys word"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dag"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Week"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Maand"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Verlede maand"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Inskrywings"</string>
     <string name="tab_access" msgid="7818197975407243701">"Toegang"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Laat bykomende toegang vir <xliff:g id="APP_NAME">%1$s</xliff:g> toe?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> will ook toegang kry tot hierdie Health Connect-instellings"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aktiveer ten minste een leestoestemming om agtergrond- of vorige datatoegang vir hierdie app aan te skakel"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aktiveer ten minste een leestoestemming om agtergrondtoegang vir hierdie app aan te skakel"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aktiveer ten minste een leestoestemming om vorige datatoegang vir hierdie app aan te skakel"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Begin om Health Connect te gebruik"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinkroniseer jou eerste apps om gesondheids- en fiksheiddata tussen hulle te deel"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Stel op"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Sien versoenbare apps"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Kry nog apps om met <xliff:g id="APP_NAME">%s</xliff:g> te sinkroniseer via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Sien in appwinkel"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Stel ’n skermslot"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Stel ’n PIN, patroon of wagwoord vir hierdie toestel vir bykomende sekuriteit vir jou gesondheiddata"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Stel skermslot"</string>
     <string name="select_all" msgid="837499881590001166">"Kies alles"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Gekoppelde apps sal nie meer hierdie data van Health Connect af kan lees nie"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Gemerk"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nie gemerk nie"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Oefeningkaartroete is beskikbaar"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Volgende dag"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Volgende week"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Volgende maand"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Vorige dag"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Vorige week"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Vorige maand"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Vee alle data permanent uit?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Vee geselekteerde data permanent uit?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Vee alle <xliff:g id="APP_NAME">%s</xliff:g>-data permanent uit?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Vee geselekteerde <xliff:g id="APP_NAME">%1$s</xliff:g>-inskrywings vir die week van <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> permanent uit?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Vee geselekteerde <xliff:g id="APP_NAME">%1$s</xliff:g>-inskrywings vir <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> permanent uit?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Vee hierdie <xliff:g id="APP_NAME">%s</xliff:g>-inskrywing permanent uit?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Vee <xliff:g id="DATA_TYPE">%1$s</xliff:g>-data vir <xliff:g id="APP_NAME">%2$s</xliff:g> permanent uit?"</string>
+    <string name="on" msgid="8266542510798355807">"Aan"</string>
+    <string name="off" msgid="6996623844428550649">"Af"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Ingegaan <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Gister ingegaan <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Ingegaan <xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Laat heeltyd toe"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Laat toe indien gekies"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Terwyl die app gebruik is"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Weier almal"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Laat <xliff:g id="APP_NAME">%1$s</xliff:g> toe om toegang tot fiksheid- en welstanddata te kry?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek toegang tot <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nKies om alles toe te laat of hulle individueel te beheer."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Gee <xliff:g id="APP_NAME">%1$s</xliff:g> toegang tot <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fiksheid en welstand"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"altyd"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"terwyl in gebruik"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Altyd"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Terwyl in gebruik"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan <xliff:g id="ALLOW_MODE">%2$s</xliff:g> toegang tot al jou fiksheid- en welstanddata kry"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Toegelaat om toegang te kry"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Toegelaat om te lees"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Hierdie toestemmings gee <xliff:g id="APP_NAME">%1$s</xliff:g> toegang tot data van jou toestelsensors af."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps toegelaat"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Geen apps wat versoek nie"</string>
+    <string name="allowed" msgid="4158456017482263737">"Toegelaat"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nie toegelaat nie"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps met hierdie toestemming kan toegang tot <xliff:g id="DATA_TYPE">%s</xliff:g>-data van jou toestelsensors af kry."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Verwyder <xliff:g id="DATA_TYPE">%s</xliff:g>-toegang vir alle apps op jou horlosie?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Regmerk"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Kruismerk"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"<xliff:g id="APP_NAME">%1$s</xliff:g> het tans toegang tot fiksheid- en welstanddata <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Laat <xliff:g id="APP_NAME">%1$s</xliff:g> toe om altyd toegang tot fiksheid- en welstanddata te hê?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> het toegang tot <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Bestuur fiksheid- en welstandtoestemmings"</string>
 </resources>
diff --git a/apk/res/values-am/strings.xml b/apk/res/values-am/strings.xml
index 13c9cad..af92f43 100644
--- a/apk/res/values-am/strings.xml
+++ b/apk/res/values-am/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"በመሣሪያዎ ላይ ያለውን የጤና እና አካል ብቃት ውሂብ ያስተዳድሩ እና የትኛዎቹ መተግበሪያዎች ሊደርሱበት እንደሚችሉ ይቆጣጠሩ"</string>
     <string name="data_title" msgid="4456619761533380816">"ውሂብ እና መዳረሻ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"የጤና መዝገቦችን አስስ"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"የእርስዎን የጤና መዝገቦች እና የትኛዎቹ መተግበሪያዎች ሊደርሱባቸው እንደሚችሉ ይመልከቱ"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"ሁሉም ምድቦች"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"ሁሉንም ምድቦች አሳይ"</string>
     <string name="no_data" msgid="1906986019249068659">"ውሂብ የለም"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ትላንት"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"የተነበበ፦ <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"የተጻፈ፦ <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"፣ "</string>
+    <string name="separator" msgid="5521285473288943819">"፣ "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"ፈቃዶችን አስተዳድር"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"ሰዓት፦ <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"እንቅስቃሴ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"የጤና ውሂብዎን ይድረሱበት"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"የተቃጠሉ ካሎሪዎችን ያነባል"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"መተግበሪያዎቹ የተቃጠሉትን ካሎሪዎች እንዲያነቡ ያስችላቸዋል"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"በዳራ ውስጥ ያለው የውሂብ መዳረሻ"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> በዳራ ውስጥ ያለውን ውሂብ እንዲደርስ ይፈቀድለት?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> በዳራ ውስጥ ያለውን ውሂብ እንዲደርስ ይፈቀድ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"ከፈቀዱ፣ ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው የአካል ብቃት እና ጤንነት ውሂብ እና የጤና መዝገቦችን መድረስ ይችላል።"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"ከፈቀዱ፣ ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው የጤና መዝገቦችን መድረስ ይችላል።"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"ከፈቀዱ ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው የአካል ብቃት እና ጤንነት ውሂብን መድረስ ይችላል።"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"ከፈቀዱ ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው የጤና አገናኝ ውሂብን መድረስ ይችላል።"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ያለፈ ውሂብን እንዲደርስ ይፈቀድ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"ከፈቀዱ ይህ መተግበሪያ ከ<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> በፊት የታከለ የአካል ብቃት እና ጤንነት ውሂብን መድረስ ይችላል።"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"ከፈቀዱ ይህ መተግበሪያ ሁሉንም ያለፈ የአካል ብቃት እና ጤንነት ውሂብ መድረስ ይችላል።"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"ከፈቀዱ ይህ መተግበሪያ ከ<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> በፊት የታከለ የጤና አገናኝ ውሂብን መድረስ ይችላል።"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"ከፈቀዱ ይህ መተግበሪያ ሁሉንም ያለፈ የጤና አገናኝ ውሂብ መድረስ ይችላል።"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> ተጨማሪ መዳረሻ ይፈቀድ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"እንዲሁም <xliff:g id="APP_NAME">%1$s</xliff:g> እነዚህን የጤና አገናኝ ቅንብሮች መድረስ ይፈልጋል"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"በዳራ ውስጥ ያለን ውሂብ በሙሉ መድረስ"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"በዳራ ውስጥ የጤና መዝገቦችን መድረስ"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"በዳራ ውስጥ የአካት ብቃት እና ጤንነት ውሂብን መድረስ"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው የአካል ብቃት እና ጤንነት ውሂብን እና የጤና መዝገቦችን እንዲደርስ ይፍቀዱ"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው ይህን ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው ይህን ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"በዳራ ውስጥ ውሂብ ድረስ"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"ይህን መተግበሪያ በማይጠቀሙበት ጊዜ መተግበሪያው የጤና አገናኝ ውሂብን እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ያለፈ የአካል ብቃት እና ጤንነት ውሂብን ድረስ"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"ይህ መተግበሪያ ከ<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> በፊት ያለን ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"ይህ መተግበሪያ ሁሉንም የቀደመ ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"ያለፈ ውሂብን ድረስ"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"ይህ መተግበሪያ ከ<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> በፊት የታከለ የጤና አገናኝ ውሂብን እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"ይህ መተግበሪያ ሁሉንም ያለፈ የጤና አገናኝ ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ቀድሞውኑ ለእርስዎ የጤና መዝገቦች ያለፈ ውሂብን መድረስ ይችላል"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"ስለ ፈቃዶች የበለጠ ያንብቡ"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"በዳራ ውስጥ ያለን ውሂብ በሙሉ መድረስ"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"በዳራ ውስጥ የጤና መዝገቦችን መድረስ"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"በዳራ ውስጥ የአካት ብቃት እና ጤንነት ውሂብን መድረስ"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው የአካል ብቃት እና ጤንነት ውሂብን እና የጤና መዝገቦችን እንዲደርስ ይፍቀዱ"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው ይህን ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ይህን መተግበሪያ እየተጠቀሙ ባልሆኑበት ጊዜ መተግበሪያው ይህን ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"በዳራ ውስጥ ውሂብ ድረስ"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"ይህን መተግበሪያ በማይጠቀሙበት ጊዜ መተግበሪያው የጤና አገናኝ ውሂብን እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ያለፈ የአካል ብቃት እና ጤንነት ውሂብን ድረስ"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"ይህ መተግበሪያ ከ<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> በፊት ያለን ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"ይህ መተግበሪያ ሁሉንም የቀደመ ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"ያለፈ ውሂብን ድረስ"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"ይህ መተግበሪያ ከ<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> በፊት የታከለ የጤና አገናኝ ውሂብን እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"ይህ መተግበሪያ ሁሉንም የጤና አገናኝ ያለፈ ውሂብ እንዲደርስ ይፍቀዱ"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"በአሁኑ ጊዜ <xliff:g id="APP_NAME">%1$s</xliff:g> ምንም የማንበብ ፈቃዶች ስላልበሩለት ምንም የአካል ብቃት ውሂብ እየተነበበ አይደለም"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ቀድሞውኑ ለእርስዎ የጤና መዝገቦች ያለፈ ውሂብን መድረስ ይችላል። ይህን ለመለወጥ ለዚህ መተግበሪያ የጤና መዝገብ ፈቃዶችን ያጥፉ"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"የጤና መዝገብ ፈቃዶችን ያስተዳድሩ"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ለዚህ መተግበሪያ የዳራ ወይም ያለፈ ወሂብ መዳረሻን ለማብራት ቢያንስ አንድ የአንብብ ፍቃድ ያንቁ"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ለዚህ መተግበሪያ የዳራ መዳረሻን ለማብራት ቢያንስ አንድ የአንብብ ፍቃድ ያንቁ"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ለዚህ መተግበሪያ ያለፈ መዳረሻን ለማብራት ቢያንስ አንድ የአንብብ ፍቃድ ያንቁ"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"ይህ መተግበሪያ ሁሉንም ያለፈ የጤና አገናኝ ውሂብ እንዲደርስ ይፍቀዱ"</string>
     <string name="background_read_description" msgid="3203594555849969283">"ይህን መተግበሪያ በማይጠቀሙበት ጊዜ መተግበሪያው የጤና አገናኝ ውሂብን እንዲደርስ ይፍቀዱለት"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ከፈቀዱ እርስዎ ይህን መተግበሪያ በማይጠቀሙበት ጊዜ መተግበሪያው የጤና አገናኝ ውሂብን መድረስ ይችላል።"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"ያለፈ የውሂብ መዳረሻ"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> ያለፈውን ውሂብ እንዲደርስ ይፈቀድለት?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"ይህ መተግበሪያ ከ<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> በፊት የታከለውን የጤና አገናኝ ውሂብ እንዲደርስ ይፍቀዱለት"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"ይህ መተግበሪያ ሁሉንም ያለፈውን የጤና አገናኝ ውሂብ እንዲደርስ ይፍቀዱለት"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ከፈቀዱ ይህ መተግበሪያ ከ<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> በፊት የታከለውን የጤና አገናኝ ውሂብ መድረስ ይችላል።"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ከፈቀዱ ይህ መተግበሪያ ሁሉንም ያለፈውን የጤና አገናኝ ውሂብ መድረስ ይችላል።"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"የተቃጠሉ ገቢር ካሎሪዎች"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"የተቃጠሉ ገቢር ካሎሪዎች"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"የተቃጠሉ ገቢር ካሎሪዎችን ያነባል"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"የተሽከርካሪ ወንበር መግፋቶች"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"የተሽከርካሪ ወንበር መግፋቶችን ያነባል"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"የተሽከርካሪ ወንበር መግፋቶችን ይጽፋል"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"የእንቅስቃሴ መጠን"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"የእንቅስቃሴ መጠን"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"የእንቅስቃሴ መጠን ያንብቡ"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"የእንቅስቃሴ መጠን ይጻፉ"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"መሠረታዊ የግንባንደት ፍጥነት"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"መሠረታዊ የግንባንደት ፍጥነት"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"መሠረታዊ የግንባንደት ፍጥነትን ያነባል"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"የቆዳ ሙቀት መጠን"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"የቆዳ ሙቀት መጠንን አንብብ"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"የቆዳ ሙቀት መጠንን ጻፍ"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"ይህ ሁሉንም ከጤና አገናኝ ጋር የሰመሩ እና የታከሉ የጤና መዝገቦችን ያካትታሉ። ይህ ሙሉው የሕክምና መዝገብዎ ላይሆን ይችላል እና የጤና መዝገቦችዎን የሕክምና መግለጫ አያካትትም።"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"ሁሉም የጤና መዝገቦች"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"ሁሉም የጤና መዝገቦች"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"ሁሉንም የጤና መዝገቦች ይጻፉ"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"አለርጂዎች"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"አለርጂዎች"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"አለርጂዎችን ያንብቡ"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ክትባት"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ክትባት"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"ክትባትን ያንብቡ"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"የቤተ-ሙከራ ውጤቶች"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"የቤተ-ሙከራ ውጤቶች"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"የቤተ-ሙከራ ውጤቶችን አንብብ"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"አለርጂዎች"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"አለርጂዎች"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"አለርጂዎችን ያንብቡ"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"ሁኔታዎች"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"ሁኔታዎች"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"ሁኔታዎችን ያንብቡ"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ክትባቶች"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ክትባቶች"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ክትባቶችን ያንብቡ"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"የቤተ ሙከራ ውጤቶች"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"የቤተ ሙከራ ውጤቶች"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"የቤተ ሙከራ ውጤቶችን ያንብቡ"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ሕክምናዎች"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ሕክምናዎች"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ሕክምናዎችን ያንብቡ"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"የግል መረጃ ዝርዝሮች"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"የግል መረጃ ዝርዝሮች"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"የግል መረጃ ዝርዝሮችን አንብብ"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"የባለሙያ ዝርዝሮች"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"የባለሙያ ዝርዝሮች"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"የባለሙያ ዝርዝሮችን አንብብ"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"እርግዝና"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"እርግዝና"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"እርግዝናን አንብብ"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ችግሮች"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ችግሮች"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"ችግሮችን አንብብ"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"አሰራሮች"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"አሰራሮች"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"አሰራሮችን አንብብ"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"ማህበራዊ ታሪክ"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ማህበራዊ ታሪክ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ማህበራዊ ታሪክ"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"ማህበራዊ ታሪክ አንብብ"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"መሠረታዊ ምልክቶች"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ጉብኝቶች"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ጉብኝቶች"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"ጉብኝቶችን አንብብ"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"መሠረታዊ ምልክቶች"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"መሠረታዊ ምልክቶች"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"መሠረታዊ ምልክቶችን አንብብ"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"አሰላሳይነት"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"አሰላሳይነትን ይጻፉ"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"«<xliff:g id="APP_NAME">%1$s</xliff:g>» እንዲያነብ ይፍቀዱለት"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"«<xliff:g id="APP_NAME">%1$s</xliff:g>» እንዲጽፍ ይፍቀዱለት"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"ይቅር"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"ፍቀድ"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"ሁሉንም ፍቀድ"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"አትፍቀድ"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"ይህ መተግበሪያ እንዲያነብ ወይም በHealth Connect ላይ እንዲጽፍ የሚፈልጉትን ውሂብ ይምረጡ"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"ይህ መተግበሪያ የጤና አገናኝ ላይ እንዲጽፍ ወይም እንዲያነብብ የሚፈልጉትን ውሂብ ይምረጡ"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"ይህ መተግበሪያ ከጤና አገናኝ ላይ እንዲያነብብ የሚፈልጉትን ውሂብ ይምረጡ"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"ይህ መተግበሪያ የጤና አገናኝ ላይ እንዲጽፍ የሚፈልጉትን ውሂብ ይምረጡ"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"የንባብ መዳረሻ ከሰጡ መተግበሪያው አዲስ ውሂብን እና የያለፉት 30 ቀናት ውሂብን ማንበብ ይችላል"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"የንባብ መዳረሻ ከሰጡ መተግበሪያው አዲስ እና ያለፈ ውሂብን ማንበብ ይችላል"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connectን እንዲደርስ ይፈቀድለት?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን ውሂብ እንዴት በገንቢው <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ውስጥ እንደሚይዝ ማወቅ ይችላሉ"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> ያለፈ የአካል ብቃት እና ጤንነት ውሂብን እንዲደርስ ይፈቀድ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> እንዴት ውሂብዎን እንደሚይዝ በእነሱ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ውስጥ ማወቅ ይችላሉ"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"የግላዊነት መመሪያ"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> የጤና መዝገቦችዎን እንዲደርስ ይፍቀዱ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"መዳረሻ ከሰጡ መተግበሪያው እንደ አለርጂዎች፣ የቤተ ሙከራ ውጤቶች፣ ክትባቶች እና ሌሎች ያሉትን ማንበብ እና መጻፍ ይችላል\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"መዳረሻ ከሰጡ መተግበሪያው እንደ አለርጂዎች፣ የቤተ ሙከራ ውጤቶች፣ ክትባቶች እና ሌሎች ያለ ውሂብን ማንበብ ይችላል\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ስለ የጤና መዝገቦች"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"የሚጋራ ውሂብ የሚከተሉትን ያካትታል"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"ከፈቀዱ <xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን የጤና መዝገቦች ከጤና አገናኝ ጋር ማጋራት ይችላል።"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"የጤና መዝገቦችዎን በአንድ ቦታ ለማቆየት ከእርስዎ የተለያዩ መተግበሪያዎች እና ምንጮች ያስምሩ"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"ሁሉም ፈቃዶች ይወገዱ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"ሁሉንም አስወግድ"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ከእንግዲህ ከጤና አገናኝ የመጣ ማንኛውንም ውሂብ ማንበብ ወይም መጻፍ አይችልም።\n\nይህ መተግበሪያ እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ያሉ ሊኖሩ በሚችሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አያሳርፍም።"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ከጤና አገናኝ የመጣ ማንኛውም ውሂብ፣ ያለፈ ውሂብን ጨምሮ ከእንግዲህ ማንበብ ወይም መጻፍ አይችልም።\n\nይህ መተግበሪያ ሊኖሩት የሚችሉትን እንደ አካባቢ፣ ካሜራ ወይም ማይክሮፎን ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አያሳርፍም።"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ከጤና አገናኝ የመጣ ማንኛውም ውሂብ፣ የዳራ ወይም ያለፈ ውሂብን ጨምሮ ከእንግዲህ ማንበብ ወይም መጻፍ አይችልም።\n\nይህ መተግበሪያ ሊኖሩት የሚችሉትን እንደ አካባቢ፣ ካሜራ ወይም ማይክሮፎን ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አያሳርፍም።"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"እንዲሁም የ<xliff:g id="APP_NAME">%1$s</xliff:g> ውሂብን ከጤና አገናኝ ሰርዝ"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ሁሉም ፈቃዶች ይወገዱ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ሁሉም የጤና መዝገብ ፈቃዶች ይወገዱ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ሁሉም የአካል ብቃት እና የጤናማነት ፈቃዶች ይወገዱ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"እንዲሁም ከ<xliff:g id="APP_NAME">%1$s</xliff:g> የመጣ የአካል ብቃት ውሂብ ከጤና አገናኝ ላይ ይሰርዙ"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ሁሉም የጤና መዝገብ ፈቃዶች ይወገዱ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"እንዲሁም ከ<xliff:g id="APP_NAME">%1$s</xliff:g> የመጡ የጤና መዝገቦችን ከጤና አገናኝ ላይ ይሰርዙ"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ከእንግዲህ ይህን ከጤና አገናኝ የመጣ ማንኛውንም ውሂብ ማንበብ ወይም መጻፍ አይችልም።\n\nይህ መተግበሪያ እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ያሉ ሊኖሩ በሚችሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አያሳርፍም።"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> የዳራ ውሂብን ጨምሮ ይህን ከጤና አገናኝ የመጣ ውሂብ ከእንግዲህ ማንበብ ወይም መፃፍ አይችልም።\n\nይህ መተግበሪያው ሊኖሩት በሚችሉት እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ወይም ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አይኖረውም።"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> የድሮ ውሂብን ጨምሮ ይህን ከጤና አገናኝ የመጣ ውሂብ ከእንግዲህ ማንበብ ወይም መፃፍ አይችልም።\n\nይህ መተግበሪያው ሊኖሩት በሚችሉት እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አይኖረውም።"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> የዳራ እና የድሮ ውሂብን ጨምሮ ይህን ከጤና አገናኝ የመጣ ውሂብ ከእንግዲህ ማንበብ ወይም መፃፍ አይችልም።\n\nይህ መተግበሪያው ሊኖሩት በሚችሉት እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ወይም ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አይኖረውም።"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ሁሉም ፈቃዶች ይወገዱ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ከእንግዲህ ከጤና አገናኝ የመጣ ውሂብን ማንበብ ወይም መፃፍ አይችልም።\n\nይህ መተግበሪያው ሊኖሩት በሚችሉ እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አያሳርፍም።"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> የዳራ ውሂብን ጨምሮ ከጤና አገናኝ የመጣ ውሂብን ከእንግዲህ ማንበብ ወይም መፃፍ አይችልም።\n\nይህ መተግበሪያው ሊኖሩት በሚችሉት እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ወይም ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አይኖረውም።"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> የድሮ ውሂብን ጨምሮ ከጤና አገናኝ የመጣ ውሂብን ከእንግዲህ ማንበብ ወይም መፃፍ አይችልም።\n\nይህ መተግበሪያው ሊኖሩት በሚችሉት እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አይኖረውም።"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> የዳራ እና የድሮ ውሂብን ጨምሮ ከጤና አገናኝ የመጣ ውሂብን ከእንግዲህ ማንበብ ወይም መፃፍ አይችልም።\n\nይህ መተግበሪያው ሊኖሩት በሚችሉት እንደ ካሜራ፣ ማይክሮፎን ወይም አካባቢ ወይም ባሉ ሌሎች ፈቃዶች ላይ ተጽዕኖ አይኖረውም።"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"እንዲሁም ከ<xliff:g id="APP_NAME">%1$s</xliff:g> የመጡየአካል ብቃት ውሂብ እና የጤና መዝገቦችን ከጤና አገናኝ ይሰርዙ"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ለዚህ መተግበሪያ የተወገዱ ፈቃዶች"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"እንዲሁም ሁሉንም የጤና አገናኝ ውሂብ ሰርዝ"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"ቀጣይ ቀን"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"የተመረጠው ቀን"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"ቀዳሚው ቀን"</string>
     <string name="default_error" msgid="7966868260616403475">"የሆነ ችግር ተፈጥሯል። እባክዎ እንደገና ይሞክሩ።"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"የማይታወቅ ንብረት"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"የምንጭ ውሂብ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g> ክፍት ቅንፍ።"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>ዝግ ቅንፍ።"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> የመስክ <xliff:g id="FIELD">%2$s</xliff:g> እሴት"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"እነዚህ መተግበሪያዎች ከእንግዲህ መዳረሻ የላቸውም ነገር ግን አሁንም በጤና አገናኝ ውስጥ የተከማቸ ውሂብ አላቸው"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> ከ<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> በኋላ የታከለ ውሂብን ማንበብ ይችላል"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ይህ መተግበሪያ ሊደርስባቸው የሚችላቸውን ሌሎች የAndroid ፈቃዶችን ለማስተዳደር ወደ ቅንብሮች &gt; መተግበሪያዎች ይሂዱ"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የሚያጋሩት ውሂብ በግላዊነት መመሪያቸው የተሸፈነ ነው"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"በገንቢው የግላዊነት መመሪያ ውስጥ <xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን ውሂብ እንዴት እንደሚይዝ ማወቅ ይችላሉ"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ይህ መተግበሪያ ሊደርስባቸው የሚችላቸውን ሌሎች የAndroid ፈቃዶችን ለማስተዳደር ወደ ቅንብሮች ይሂዱ፣ ከዚያም መተግበሪያዎች የሚለውን መታ ያድርጉ"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"የግላዊነት መመሪያ ያንብቡ"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"ባለፉት 24 ሰዓታት ውስጥ ተደርሶበታል"</string>
     <string name="app_access_title" msgid="7137018424885371763">"የመተግበሪያ መዳረሻ"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"በአሁኑ ጊዜ ምንም የተጫኑ ተኳዃኝ መተግበሪያዎች የሉዎትም"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"ተጨማሪ መዳረሻ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ውሂብ ለጥፍ፣ የዳራ ውሂብ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"ለዚህ መተግበሪያ ተጨማሪ ፈቃዶች ተወግደዋል"</string>
     <string name="permissions_header" msgid="6519976063360071569">"ፈቃዶች"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ብቃት እና ጤንነት"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ልምምድ፣ እንቅልፍ፣ ሥነ ምግብ እና ሌሎች"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"የጤና መዝገቦች"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"የጤና መዝገቦች"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"የቤተ ሙከራ ውጤቶች፣ መድኃኒቶች፣ ክትባቶች እና ሌሎች"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"የቤተ ሙከራ ውጤቶች፣ መድኃኒቶች፣ ክትባቶች እና ሌሎችም"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"የተወገዱ የመተግበሪያ ፍቃዶች"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"የጤና አገናኝ የ<xliff:g id="APP_DATA">%s</xliff:g>ን ፈቃዶች አስወግዷል"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"የጤና አገናኝ የ<xliff:g id="APP_DATA_0">%1$s</xliff:g>ን እና የ<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>ን ፈቃዶች አስወግዷል"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"ወደ Play መደብር ሂድ"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"በጤና አገናኝ ይጀምሩ"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"የጤና አገናኝ የእርስዎን የጤና እና አካል ብቃት ውሂብ ያከማቻል፣ ይህም በመሣሪያዎ ላይ ያሉ የተለያዩ መተግበሪያዎችን ለማስመር ቀላል መንገድ ይሰጥዎታል"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"የጤና አገናኝ የጤና እና አካል ብቃት ውሂብዎን ከተለያዩ መተግበሪያዎች ያከማቻል እና ያሰምራል።\n\n"<b>"የልምምድ ክፍለ-ጊዜዎች፣ እርምጃዎች፣ አመጋገብ፣ እንቅልፍ እና ሌሎችንም ጨምሮ"</b>"የአካል ብቃት እና ጤናማነት ውሂብ\n\n"<b>"ክትባቶች፣ የቤተ ሙከራ ውጤቶች እና ሌሎችንም ጨምሮ"</b>"የጤና መዝገቦች"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"በጤና አገናኝ የሚከተሉትን ማድረግ ይችላሉ"</string>
     <string name="share_data" msgid="3481932156368883946">"በመተግበሪያዎችዎ ውሂብን ያጋሩ"</string>
     <string name="share_data_description" msgid="2919871301634375092">"እያንዳንዱ መተግበሪያ በጤና አገናኝ ላይ ማንበብ ወይም መጻፍ የሚችለውን ውሂብ ይምረጡ"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"የእርስዎን ቅንብሮች እና ግላዊነት ያስተዳድሩ"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"ቀላል ፍሰት"</string>
     <string name="flow_medium" msgid="3783688724668943154">"መካከለኛ ፍሰት"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ከባድ ፍሰት"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"ያልታወቀ ፍሰት"</string>
     <string name="period_day" msgid="3821944462093965882">"የወር አበባ ቀን <xliff:g id="DAY">%1$d</xliff:g> ከ<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ክፍለ ጊዜ (1 ቀን)}one{ክፍለ ጊዜ (# ቀን)}other{ክፍለ ጊዜ (# ቀናት)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"አዎንታዊ"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"አሉታዊ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ከፍተኛ"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"ሙዚቃ"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"ሌላ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ያልተመራ"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"መለስተኛ"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ከባድ"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> ደ"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ሰ <xliff:g id="MIN">%2$s</xliff:g> ደ"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ሰ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ውህደት በሂደት ላይ"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"የጤና አገናኝ ከAndroid ሥርዓት ጋር እየተዋሃደ ነው።\n\nየእርስዎ ውሂብ እና ፈቃዶች እየተላለፉ ሳለ የተወሰነ ጊዜ ሊወስድ ይችላል።"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"ሂደቱ እንደተጠናቀቀ ማሳወቂያ እስኪያገኙ ድረስ መተግበሪያውን እንዳይዘጉ።"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"የጤና አገናኝ ውህደት በሂደት ላይ"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"ዝማኔ ያስፈልጋል"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"የጤና አገናኝን መዳረሻ በቀጥታ ከቅንብሮችዎ ማግኘት እንዲችሉ ከAndroid ሥርዓት ጋር እየተዋሃደ ነው።"</string>
     <string name="update_button" msgid="4544529019832009496">"አዘምን"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"የጤና አገናኝ ከእርስዎ የሥርዓት ቅንብሮች ጋር መዋሃድ መቀጠል እንዲችል ይህን ዝማኔ ይጀምሩ"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"አሁን ያዘምኑ"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"የሥርዓት ዝማኔ ያስፈልጋል"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"ከመቀጠልዎ በፊት የስልክ ሥርዓትዎን ያዘምኑ።"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"አስቀድመው የስልክ ሥርዓትዎን አዘምነው ከሆነ ውህደቱን ለመቀጠል ስልክዎን ዳግም ማስጀመርን ይሞክሩ"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"የጤና አገናኝ ዝማኔ ያስፈልጋል"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"ከመቀጠልዎ በፊት የጤና አገናኝ መተግበሪያን ወደ የቅርብ ጊዜው ስሪት ያዘምኑ።"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"ተጨማሪ ቦታ ያስፈልጋል"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"ውህደትን ለመቀጠል የጤና አገናኝ በስልክዎ ላይ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> የማከማቻ ቦታ ይፈልጋል።\n\nበስልክዎ ላይ የተወሰነ ቦታ ያጽዱ እና በመቀጠል እንደገና ይሞክሩ።"</string>
     <string name="try_again_button" msgid="8745496819992160789">"እንደገና ሞክር"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ቦታ አስለቅቅ"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"ተጨማሪ ቦታ ያስፈልጋል"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"ውህደትን ለመቀጠል የጤና አገናኝ በስልክዎ ላይ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> የማከማቻ ቦታ ይፈልጋል።"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ውህደት ባለበት ቆሟል"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"የጤና አገናኝ መተግበሪያ ከAndroid ሥርዓት ጋር እየተዋሃደ ሳለ ተዘግቷል።\n\nመተግበሪያውን እንደገና ለመክፈት እና የእርስዎን ውሂብ እና ፈቃዶች ማስተላለፍ ለመቀጠል ከቆመበት ቀጥልን ጠቅ ያድርጉ።"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"የእርስዎን የጤና አገናኝ ውሂብ ይዞ ለመቆየት፣ ይህን በ<xliff:g id="TIME_NEEDED">%1$s</xliff:g> ውስጥ ያጠናቅቁ"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"የጤና አገናኝን ከAndroid ሥርዓት ጋር ማዋሃድን ለመቀጠል መታ ያድርጉ። ውሂብዎን ይዞ ለመቆየት፣ ይህን በ<xliff:g id="TIME_NEEDED">%1$s</xliff:g> ውስጥ ያጠናቅቁ"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"የጤና አገናኝን ከAndroid ሥርዓት ጋር ማዋሃድን ለመቀጠል መታ ያድርጉ።"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ቀጥል"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"የጤና አገናኝ ውህደትን ካቆመበት ይቀጥሉ"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"ውሂብዎን ይዞ ለመቆየት፣ ይህን በ<xliff:g id="TIME_NEEDED">%1$s</xliff:g> ውስጥ ያጠናቅቁ"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"የመተግበሪያ ዝማኔ ያስፈልጋል"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"ከጤና አገናኝ ጋር ማመሳሰልን ለመቀጠል <xliff:g id="APP_NAME">%1$s</xliff:g> መዘመን አለበት"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"ከጤና አገናኝ ጋር ማመሳሰልን ለመቀጠል አንዳንድ መተግበሪያዎች መዘመን አለባቸው"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"ከጤና አገናኝ ጋር ሥምረትን ለመቀጠል <xliff:g id="APP_NAME">%1$s</xliff:g> መዘመን ያስፈልገዋል። ዝማኔዎች ለሁሉም መተግበሪያዎች ላይገኙ ይችላሉ።"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"ከጤና አገናኝ ጋር ሥምረትን ለመቀጠል አንዳንድ መተግበሪያዎች መዘመን ያስፈልጋቸዋል። ዝማኔዎች ለሁሉም መተግበሪያዎች ላይገኙ ይችላሉ።"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"ዝማኔዎች ካሉ ይፈትሹ"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"የበለጠ ለመረዳት"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"የጤና አገናኝ ውህደት"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"የጤና አገናኝ ውህደት አልተጠናቀቀም"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"እንደገና የሚገኝ ሲሆን ማሳወቂያ ያገኛሉ።"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"ገባኝ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"የጤና አገናኝ ውህደት አልተጠናቀቀም"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"ተጨማሪ ያንብቡ"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"የጤና አገናኝ ውህደት ተጠናቅቋል"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"ክፈት"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"ምን አዲስ ነገር አለ"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"አሁን የጤና አገናኝን በቀጥታ ከቅንብሮችዎ መድረስ ይችላሉ። የማከማቻ ቦታ ነፃ ለማድረግ የጤና አገናኝ መተግበሪያን በማንኛውም ጊዜ ያራግፉ።"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"ገባኝ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"የመተግበሪያ ምንጮችን ያርትዑ"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"የመሣሪያ ነባሪ"</string>
     <string name="app_data_title" msgid="6499967982291000837">"የመተግበሪያ ውሂብ"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"ወደ የጤና አገናኝ መዳረሻ ካላቸው መተግበሪያዎች ያለ ውሂብ እዚህ ይታያል"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"ከ<xliff:g id="APP_NAME">%1$s</xliff:g> የመጣ ውሂብ እዚህ ይታያል"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"የጤና አገናኝ መዳረሻ ካላቸው መተግበሪያዎች የመጣ ውሂብ እዚህ ይታያል"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"ቀን"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"ሳምንት"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"ወር"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ያለፈው ወር"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ግቤቶች"</string>
     <string name="tab_access" msgid="7818197975407243701">"መዳረሻ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> ተጨማሪ መዳረሻ ይፈቀድለት?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> እነዚህን የጤና አገናኝ ቅንብሮች መድረስ ይፈልጋል"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ለዚህ መተግበሪያ የዳራ ወይም ያለፈ ወሂብ መዳረሻን ለማብራት ቢያንስ አንድ የአንብብ ፍቃድ ያንቁ"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ለዚህ መተግበሪያ የዳራ መዳረሻን ለማብራት ቢያንስ አንድ የአንብብ ፍቃድ ያንቁ"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ለዚህ መተግበሪያ ያለፈ መዳረሻን ለማብራት ቢያንስ አንድ የአንብብ ፍቃድ ያንቁ"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"የጤና አገናኝ መጠቀም ይጀምሩ"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"የመጀመሪያ መተግበሪያዎችዎን በመካከላቸው የጤና እና የአካል ብቃት ውሂብን እንዲያጋሩ ያስምሯቸው"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"አዋቅር"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"ተኳዃኝ መተግበሪያዎችን ይመልከቱ"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"በጤና አገናኝ በኩል ከ<xliff:g id="APP_NAME">%s</xliff:g> ጋር ለማስመር ተጨማሪ መተግበሪያዎችን ያግኙ"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"የመተግበሪያ መደብር ላይ ይመልከቱ"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ማያ ገጽ መቆለፊያን ያቀናብሩ"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"ለጤና ውሂብዎ ተጨማሪ ደህንነት ሲባል፣ ለዚህ መሣሪያ ፒን፣ ሥርዓተ ጥለት ወይም የይለፍ ቃል ያቀናብሩ"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ማያ ገፅ መቆለፊያውን አቀናብር"</string>
     <string name="select_all" msgid="837499881590001166">"ሁሉንም ምረጥ"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"የተገናኙ መተግበሪያዎች ከእንግዲህ ይህን ውሂብ ከጤና አገናኝ መድረስ አይችሉም"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ምልክት ተደርጎበታል"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ምልክት አልተደረገበትም"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"የልምምድ ካርታ መስመር ይገኛል"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"ቀጣይ ቀን"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"ቀጣይ ሳምንት"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"ቀጣይ ወር"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"ቀዳሚ ቀን"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"ቀዳሚ ሳምንት"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"ቀዳሚ ወር"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"ሁሉም ውሂብ በቋሚነት ይሰረዝ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"የተመረጠው ውሂብ በቋሚነት ይሰረዝ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"ሁሉም የ<xliff:g id="APP_NAME">%s</xliff:g> ውሂብ በቋሚነት ይሰረዝ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"በ<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>ኛው ሳምንት የተመረጡት የ<xliff:g id="APP_NAME">%1$s</xliff:g> ግቤቶች በቋሚነት ይሰረዙ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"በ<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> የተመረጡት የ<xliff:g id="APP_NAME">%1$s</xliff:g> ግቤቶች በቋሚነት ይሰረዙ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ይህ <xliff:g id="APP_NAME">%s</xliff:g> ግቤት በቋሚነት ይሰረዝ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"ለ<xliff:g id="APP_NAME">%2$s</xliff:g> <xliff:g id="DATA_TYPE">%1$s</xliff:g> ውሂብ በቋሚነት ይሰረዝ?"</string>
+    <string name="on" msgid="8266542510798355807">"በርቷል"</string>
+    <string name="off" msgid="6996623844428550649">"ጠፍቷል"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"በ<xliff:g id="TIME_DATE">%1$s</xliff:g> ላይ ተደርሶበታል"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"ትላንት በ<xliff:g id="TIME_DATE">%1$s</xliff:g> ላይ ተደርስበታል"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"በ<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> ላይ ተደርስበታል"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"ሁልጊዜ ፍቀድ"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"ተመርጧል የሚለውን ይፍቀዱ"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"መተግበሪያውን እየተጠቀሙ ሳለ"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"ሁሉንም ከልክል"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> የአካል ብቃት እና ጤንነት ውሂብን እንዲደርስ ይፈቀድ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> የ<xliff:g id="DATA_TYPES">%2$s</xliff:g> መዳረሻ እየጠየቀ ነው።\n\nሁሉንም ለመፍቀድ ወይም በተናጠል እነሱን ለመቆጣጠር ይምረጡ።"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPE">%2$s</xliff:g>ን እንዲደርስበት ይፈቀድለት?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ብቃት እና ጤንነት"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ሁልጊዜ"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"በጥቅም ላይ ሳለ"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"ሁልጊዜ"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"በጥቅም ላይ ሳለ"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> ሁሉንም የእርስዎ ብቃት እና ጤንነት ውሂብ <xliff:g id="ALLOW_MODE">%2$s</xliff:g> መድረስ ይችላል"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"ለመድረስ የተፈቀደለት"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"ለማንበብ የተፈቀደለት"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"እነዚህ ፈቃዶች ከመሣሪያዎ ዳሳሾች ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የውሂብ መዳረሻ ይሰጣሉ።"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> ከ<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> መተግበሪያዎች ተፈቅዶላቸዋል"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"ምንም መተግበሪያዎች እየጠየቁ አይደለም"</string>
+    <string name="allowed" msgid="4158456017482263737">"ተፈቅዷል"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"አይፈቀድም"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ይህ ፈቃድ ያላቸው መተግበሪያዎች ከመሣሪያዎ ዳሳሾች የ<xliff:g id="DATA_TYPE">%s</xliff:g> ውሂብን መድረስ ይችላሉ።"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"በእጅ ሰዓትዎ ላይ ላሉ ለሁሉም መተግበሪያዎች የ<xliff:g id="DATA_TYPE">%s</xliff:g> መዳረሻ ይወገድ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"የጭረት ምልክት"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"የመስቀል ምልክት"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"በአሁኑ ጊዜ፣ <xliff:g id="APP_NAME">%1$s</xliff:g> የብቃት እና ጤንነት ውሂብን <xliff:g id="ALLOW_MODE">%2$s</xliff:g> መድረስ ይችላል"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"ለብቃት እና ጤንነት ውሂብ ሁልጊዜ ለ<xliff:g id="APP_NAME">%1$s</xliff:g> መዳረሻ ይፈቅዳሉ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ወደ <xliff:g id="DATA_TYPES">%2$s</xliff:g> መዳረሻ አለው።"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"የብቃት እና ጤንነት ፈቃዶች አስተዳድር"</string>
 </resources>
diff --git a/apk/res/values-ar/strings.xml b/apk/res/values-ar/strings.xml
index ee3c0ae..08d121c 100644
--- a/apk/res/values-ar/strings.xml
+++ b/apk/res/values-ar/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"يمكنك إدارة بيانات الصحة واللياقة البدنية على جهازك والتحكّم في التطبيقات التي يمكنها الوصول إلى تلك البيانات"</string>
     <string name="data_title" msgid="4456619761533380816">"البيانات وإمكانية وصول التطبيقات إليها"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"تصفُّح السجلات الصحية"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"يمكنك الاطّلاع على سجلّاتك الصحية ومعرفة التطبيقات التي يمكنها الوصول إليها"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"جميع الفئات"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"عرض كل الفئات"</string>
     <string name="no_data" msgid="1906986019249068659">"ما مِن بيانات"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"أمس"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"القراءة: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"الكتابة: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"، "</string>
+    <string name="separator" msgid="5521285473288943819">"، "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"إدارة الأذونات"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"الوقت: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"النشاط"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"الوصول إلى البيانات الصحية"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"قراءة السعرات الحرارية المحروقة"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"يسمح هذا الإذن للتطبيق بقراءة السعرات الحرارية المحروقة."</string>
-    <string name="background_read_title" msgid="5061383169517186234">"الوصول إلى البيانات في الخلفية"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"هل تريد السماح بوصول \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" إلى البيانات في الخلفية؟"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"هل تريد السماح بوصول \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" إلى البيانات في الخلفية؟"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى بيانات الصحة واللياقة البدنية والسجلات الصحية حتى في حال عدم استخدامه."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى السجلات الصحية حتى في حال عدم استخدامه."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى بيانات الصحة واللياقة البدنية حتى في حال عدم استخدامه."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى بيانات Health Connect في حال عدم استخدامه."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"هل تريد السماح بوصول \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" إلى البيانات السابقة؟"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى بيانات الصحة واللياقة البدنية التي تمّت إضافتها قبل ‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى جميع البيانات السابقة للصحة واللياقة البدنية."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى بيانات Health Connect التي تمت إضافتها قبل ‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى جميع بيانات Health Connect السابقة."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"هل تريد السماح بأذونات إضافية لـ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" أيضًا الوصول إلى إعدادات Health Connect هذه"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"الوصول إلى جميع البيانات في الخلفية"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"الوصول إلى السجلات الصحية في الخلفية"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"الوصول إلى بيانات الصحة واللياقة البدنية في الخلفية"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"السماح لهذا التطبيق بالوصول إلى بيانات الصحة واللياقة البدنية والسجلات الصحية حتى في حال عدم استخدامه"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"السماح لهذا التطبيق بالوصول إلى هذه البيانات حتى في حال عدم استخدامه"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"السماح لهذا التطبيق بالوصول إلى هذه البيانات حتى في حال عدم استخدامه"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"الوصول إلى البيانات في الخلفية"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"السماح لهذا التطبيق بالوصول إلى بيانات Health Connect حتى في حال عدم استخدامه"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"الوصول إلى بيانات الصحة واللياقة البدنية"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"السماح لهذا التطبيق بالوصول إلى البيانات التي تمّت إضافتها قبل ‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"السماح لهذا التطبيق بالوصول إلى جميع البيانات السابقة"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"الوصول إلى البيانات السابقة"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"السماح لهذا التطبيق بالوصول إلى بيانات Health Connect التي تمت إضافتها قبل ‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"السماح لهذا التطبيق بالوصول إلى جميع بيانات Health Connect السابقة"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"بإمكان \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الوصول إلى البيانات السابقة للسجلّات الصحية"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"مزيد من المعلومات حول الأذونات"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"الوصول إلى جميع البيانات في الخلفية"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"الوصول إلى السجلات الصحية في الخلفية"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"الوصول إلى بيانات الصحة واللياقة البدنية في الخلفية"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"السماح لهذا التطبيق بالوصول إلى بيانات الصحة واللياقة البدنية والسجلات الصحية حتى في حال عدم استخدامه"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"السماح لهذا التطبيق بالوصول إلى هذه البيانات حتى في حال عدم استخدامه"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"السماح لهذا التطبيق بالوصول إلى هذه البيانات حتى في حال عدم استخدامه"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"الوصول إلى البيانات في الخلفية"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"السماح لهذا التطبيق بالوصول إلى بيانات Health Connect حتى في حال عدم استخدامه"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"الوصول إلى بيانات الصحة واللياقة البدنية"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"السماح لهذا التطبيق بالوصول إلى البيانات التي تمّت إضافتها قبل ‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"السماح لهذا التطبيق بالوصول إلى جميع البيانات السابقة"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"الوصول إلى البيانات السابقة"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"السماح لهذا التطبيق بالوصول إلى بيانات Health Connect التي تمت إضافتها قبل ‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"السماح لهذا التطبيق بالوصول إلى جميع بيانات Health Connect السابقة"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"لا تتم قراءة أي بيانات لياقة بدنية حاليًا لأنّ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" لم يحصل على أي أذونات بالقراءة"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"بإمكان \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الوصول إلى البيانات السابقة لسجلّاتك الصحية. لتغيير هذا الإعداد، أوقِف أذونات السجلّات الصحية لهذا التطبيق."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"إدارة أذونات السجلّات الصحية"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"يجب منح إذن واحد بالقراءة على الأقل لتفعيل وصول هذا التطبيق إلى البيانات في الخلفية أو البيانات السابقة"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"يجب منح إذن واحد بالقراءة على الأقل لتفعيل وصول هذا التطبيق إلى البيانات في الخلفية"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"يجب منح إذن واحد بالقراءة على الأقل لتفعيل وصول هذا التطبيق إلى البيانات السابقة"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"السماح لهذا التطبيق بالوصول إلى جميع بيانات Health Connect السابقة"</string>
     <string name="background_read_description" msgid="3203594555849969283">"السماح لهذا التطبيق بالوصول إلى بيانات Health Connect في حال عدم استخدام التطبيق"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من الوصول إلى بيانات Health Connect حتّى عند عدم استخدامك للتطبيق."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"الوصول إلى البيانات السابقة"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"هل تريد منح \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" إذن الوصول إلى البيانات السابقة؟"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"السماح لهذا التطبيق بالوصول إلى بيانات Health Connect التي تمت إضافتها قبل ‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"السماح لهذا التطبيق بالوصول إلى جميع بيانات Health Connect السابقة"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"إذا منحت هذا الإذن، فسيُسمح لهذا التطبيق بالوصول إلى بيانات Health Connect التي تمت إضافتها قبل ‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"يؤدي منح هذا الإذن إلى السماح للتطبيق بالوصول إلى جميع بيانات Health Connect السابقة."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"السعرات الحرارية المحروقة نتيجة ممارسة نشاط بدني"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"السعرات الحرارية المحروقة نتيجة ممارسة نشاط بدني"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"قراءة بيانات السعرات الحرارية المحروقة نتيجة ممارسة نشاط بدني"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"عدد دفعات الكرسي المتحرك"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"قراءة بيانات عدد دفعات الكرسي المتحرك"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"كتابة بيانات عدد دفعات الكرسي المتحرك"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"مستوى الجهد عند النشاط"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"مستوى الجهد عند النشاط"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"قراءة بيانات مستوى الجهد عند النشاط"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"كتابة بيانات مستوى الجهد عند النشاط"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"معدّل الأيض الأساسي"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"معدّل الأيض الأساسي"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"قراءة بيانات معدّل الأيض الأساسي"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"درجة حرارة الجلد"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"قراءة بيانات درجة حرارة الجلد"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"كتابة بيانات درجة حرارة الجلد"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"يشمل ذلك جميع السجلّات الصحية التي تمت مزامنتها مع تطبيق Health Connect وإضافتها إليه. قد لا يمثّل ذلك سجلّك الطبي بالكامل ولا يتضمّن وصفًا طبيًا لسجلّاتك الصحية."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"كل السجلّات الصحية"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"كل السجلّات الصحية"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"كتابة كل السجلّات الصحية"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"بيانات الحساسية"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"بيانات الحساسية"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"قراءة بيانات الحساسية"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"بيانات التحصين"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"بيانات التحصين"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"قراءة بيانات التحصين"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"نتائج الفحوصات المخبرية"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"نتائج الفحوصات المخبرية"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"قراءة نتائج الفحوصات المخبرية"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"بيانات الحساسية"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"بيانات الحساسية"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"قراءة بيانات الحساسية"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"الحالات الطبية"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"الحالات الطبية"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"قراءة الحالات الطبية"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"بيانات اللقاحات"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"بيانات اللقاحات"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"قراءة بيانات اللقاحات"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"النتائج المعملية"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"النتائج المعملية"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"قراءة النتائج المعملية"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"بيانات الأدوية"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"بيانات الأدوية"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"قراءة بيانات الأدوية"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"التفاصيل الشخصية"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"التفاصيل الشخصية"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"قراءة التفاصيل الشخصية"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"تفاصيل الممارسِين الطبيين"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"تفاصيل الممارسِين الطبيين"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"قراءة تفاصيل الممارسِين الطبيين"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"بيانات الحمل"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"بيانات الحمل"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"قراءة بيانات الحمل"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"بيانات المشاكل"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"بيانات المشاكل"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"قراءة بيانات المشاكل"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"بيانات الإجراءات"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"بيانات الإجراءات"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"قراءة بيانات الإجراءات"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"بيانات السجلّ الاجتماعي"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"بيانات السجلّ الاجتماعي"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"بيانات السجلّ الاجتماعي"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"قراءة بيانات السجلّ الاجتماعي"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"بيانات المؤشرات الحيوية"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"الزيارات الطبية"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"الزيارات الطبية"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"قراءة الزيارات الطبية"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"بيانات المؤشرات الحيوية"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"بيانات المؤشرات الحيوية"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"قراءة بيانات المؤشرات الحيوية"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"اليقظة والوعي التام"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"كتابة بيانات جلسة اليقظة والوعي التام"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"منح تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الإذن بالقراءة"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"منح التطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الإذن بالكتابة"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"إلغاء"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"السماح"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"السماح بالكل"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"عدم السماح"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"اختَر البيانات التي تريد أن يقرأها أو يكتبها هذا التطبيق في Health Connect."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"اختَر البيانات التي تريد أن يقرأها أو يكتبها هذا التطبيق في Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"اختَر البيانات التي تريد أن يقرأها هذا التطبيق من Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"اختَر البيانات التي تريد أن يكتبها هذا التطبيق في Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"إذا منحت التطبيق إذنًا بالقراءة، فسيتمكّن من قراءة البيانات الجديدة والبيانات من آخر 30 يومًا"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"إذا منحت التطبيق إذنًا بالقراءة، سيتمكّن من قراءة البيانات الجديدة والسابقة"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"هل تريد منح تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الإذن بالوصول إلى Health Connect؟"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"يمكنك التعرّف على كيفية معالجة \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" لبياناتك من خلال الاطّلاع على <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> الخاصة بالمطوِّر."</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"هل تريد السماح لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بالوصول إلى بيانات الصحة واللياقة البدنية؟"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"يمكنك الاطّلاع على <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> لمعرفة كيفية معالجة \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" لبياناتك"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"سياسة الخصوصية"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"هل تريد السماح لـ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بالوصول إلى السجلات الصحية؟"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من قراءة البيانات وكتابتها، مثل البيانات المتعلّقة بالحساسية والنتائج المعملية واللقاحات وغير ذلك\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"إذا منحت هذا الإذن، سيتمكّن هذا التطبيق من قراءة البيانات، مثل البيانات المتعلّقة بالحساسية والنتائج المعملية واللقاحات وغير ذلك\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"لمحة عن السجلات الصحية"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"تشمل البيانات المراد مشاركتها ما يلي:"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"إذا منحت هذا الإذن، سيتمكّن \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" من مشاركة السجلات الصحية مع تطبيق Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"يمكنك مزامنة السجلات الصحية من مختلف التطبيقات والمصادر للاحتفاظ بها في مكان واحد"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"هل تريد إزالة كل الأذونات؟"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"إزالة الكل"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"لم يعد بإمكان \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" تعديل أي بيانات من تطبيق Health Connect أو الاطّلاع عليها.\n\nلا يؤثر هذا الإجراء في الأذونات الأخرى التي قد تُمنح لهذا التطبيق، مثل أذونات الوصول إلى الموقع الجغرافي أو الكاميرا أو الميكروفون."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"لن يتمكّن تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بعد ذلك من قراءة أي بيانات من تطبيق Health Connect أو كتابتها، بما في ذلك البيانات السابقة.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الموقع الجغرافي أو الكاميرا أو الميكروفون."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"لن يتمكّن تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بعد ذلك من قراءة أي بيانات من تطبيق Health Connect أو كتابتها، بما في ذلك بيانات الخلفية أو البيانات السابقة.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الموقع الجغرافي أو الكاميرا أو الميكروفون."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"حذف بيانات تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" أيضًا من Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"هل تريد إزالة كل الأذونات؟"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"هل تريد إزالة كل أذونات السجلّات الصحية؟"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"هل تريد إزالة كل أذونات الصحة واللياقة البدنية؟"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"حذف بيانات تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" المتعلّقة باللياقة البدنية من Health Connect أيضًا"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"هل تريد إزالة كل أذونات السجلّات الصحية؟"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"حذف سجلّات تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الصحية من Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"لن يعود بإمكان تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قراءة هذه البيانات من تطبيق Health Connect أو كتابتها.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الكاميرا أو الميكروفون أو الموقع الجغرافي."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"لن يعود بإمكان تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قراءة هذه البيانات من تطبيق Health Connect أو كتابتها، بما في ذلك بيانات الخلفية.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الكاميرا أو الميكروفون أو الموقع الجغرافي."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"لن يعود بإمكان تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قراءة هذه البيانات من تطبيق Health Connect أو كتابتها، بما في ذلك البيانات السابقة.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الكاميرا أو الميكروفون أو الموقع الجغرافي."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"لن يعود بإمكان تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قراءة هذه البيانات من تطبيق Health Connect أو كتابتها، بما في ذلك بيانات الخلفية والبيانات السابقة.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الكاميرا أو الميكروفون أو الموقع الجغرافي."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"هل تريد إزالة كل الأذونات؟"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"لن يتمكّن تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بعد ذلك من قراءة أي بيانات من تطبيق Health Connect أو كتابتها.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الكاميرا أو الميكروفون أو الموقع الجغرافي."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"لن يتمكّن تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بعد ذلك من قراءة أي بيانات من تطبيق Health Connect أو كتابتها، بما في ذلك بيانات الخلفية.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الكاميرا أو الميكروفون أو الموقع الجغرافي."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"لن يتمكّن تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بعد ذلك من قراءة أي بيانات من تطبيق Health Connect أو كتابتها، بما في ذلك البيانات السابقة.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الكاميرا أو الميكروفون أو الموقع الجغرافي."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"لن يتمكّن تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بعد ذلك من قراءة أي بيانات من تطبيق Health Connect أو كتابتها، بما في ذلك بيانات الخلفية والبيانات السابقة.\n\nولا يؤثِّر هذا الإجراء في الأذونات الأخرى التي قد تُمنَح لهذا التطبيق، مثل الوصول إلى الكاميرا أو الميكروفون أو الموقع الجغرافي."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"حذف بيانات تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" المتعلّقة باللياقة البدنية والسجلّات الصحية من Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"تمّت إزالة الأذونات لهذا التطبيق"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"حذف جميع بيانات تطبيق Health Connect أيضًا"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"اليوم التالي"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"اليوم المحدَّد"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"اليوم السابق"</string>
     <string name="default_error" msgid="7966868260616403475">"حدث خطأ. يُرجى إعادة المحاولة."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"بيانات من مصدر غير معروف"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"بيانات المصدر"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>قوس مفتوح"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>قوس مغلق"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> قيمة الحقل <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"لن تتمكن هذه التطبيقات من الوصول إلى البيانات بعد ذلك، ولكن لا يزال لديها بيانات مخزَّنة في تطبيق Health Connect."</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"يمكن لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قراءة البيانات التي تمت إضافتها بعد <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"لإدارة أذونات Android الأخرى التي يمكن لهذا التطبيق الوصول إليها، انتقِل إلى \"الإعدادات\" &gt; \"التطبيقات\""</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"تخضع البيانات التي تشاركها مع تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" لسياسة الخصوصية التي يُطبِّقها"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"يمكنك التعرّف على كيفية معالجة تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" لبياناتك من خلال الاطّلاع على سياسة خصوصية المطوّر"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"لإدارة أذونات Android الأخرى التي يمكن لهذا التطبيق الوصول إليها، انتقِل إلى \"الإعدادات\" ثم انقر على \"التطبيقات\"."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"قراءة سياسة الخصوصية"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"تم الوصول إلى البيانات في آخر 24 ساعة"</string>
     <string name="app_access_title" msgid="7137018424885371763">"إمكانية وصول التطبيق إلى البيانات"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"ليس لديك الآن أي تطبيقات متوافقة مثبَّتة"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"إذن الوصول الإضافي"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"البيانات السابقة وبيانات الخلفية"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"تمت إزالة الأذونات الإضافية لهذا التطبيق"</string>
     <string name="permissions_header" msgid="6519976063360071569">"الأذونات"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"الصحة واللياقة البدنية"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"التمارين الرياضية والنوم والتغذية وغيرها"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"السجلّات الصحية"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"السجلّات الصحية"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"نتائج معملية وأدوية وتطعيمات وغيرها"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"نتائج معملية وأدوية ولقاحات وغيرها"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"أذونات التطبيقات التي تمت إزالتها"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"أزال تطبيق Health Connect أذونات \"<xliff:g id="APP_DATA">%s</xliff:g>\"."</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"أزال تطبيق Health Connect أذونات \"<xliff:g id="APP_DATA_0">%1$s</xliff:g>\" و\"<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>\"."</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"الانتقال إلى \"متجر Play\""</string>
     <string name="onboarding_title" msgid="8550656211291180188">"بدء استخدام Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"يُخزِّن تطبيق Health Connect بيانات الصحة واللياقة البدنية، ما يمنحك طريقة بسيطة لمزامنة التطبيقات المختلفة على جهازك"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"يُخزِّن تطبيق Health Connect بيانات الصحة واللياقة البدنية الواردة من تطبيقات مختلفة ويزامنها.\n\n"<b>"بيانات الصحة واللياقة البدنية،"</b>" بما في ذلك جلسات التمارين الرياضية والخطوات والتغذية والنوم وغير ذلك\n\n"<b>"السجلّات الصحية،"</b>" بما في ذلك اللقاحات والنتائج المعملية وغير ذلك"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"عند استخدام Health Connect، يمكنك:"</string>
     <string name="share_data" msgid="3481932156368883946">"مشاركة البيانات مع تطبيقاتك"</string>
     <string name="share_data_description" msgid="2919871301634375092">"اختَر البيانات التي يمكن لكل تطبيق قراءتها من تطبيق Health Connect أو كتابتها فيه."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"إدارة الإعدادات والخصوصية"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"تدفق بسيط"</string>
     <string name="flow_medium" msgid="3783688724668943154">"تدفق متوسط"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"تدفق كثيف"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"معدل تدفق الحيض غير معروف"</string>
     <string name="period_day" msgid="3821944462093965882">"يوم الدورة الشهرية رقم <xliff:g id="DAY">%1$d</xliff:g> من إجمالي <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{الدورة الشهرية (استمرت يومًا واحدًا)}zero{الدورة الشهرية (استمرت لمدة # يوم)}two{الدورة الشهرية (استمرت لمدة يومين)}few{الدورة الشهرية (استمرت لمدة # أيام)}many{الدورة الشهرية (استمرت لمدة # يومًا)}other{الدورة الشهرية (استمرت لمدة # يوم)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"إيجابية"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"سلبية"</string>
     <string name="ovulation_high" msgid="205362931427158291">"مرتفعة"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"موسيقى"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"غير ذلك"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"غير موجَّهة"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"متوسط"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"مرتفع"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> د"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ساعة و<xliff:g id="MIN">%2$s</xliff:g> دقيقة"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> س"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"جارٍ تنفيذ عملية الدمج"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"يتم دمج تطبيق Health Connect حاليًا مع نظام Android.\n\nقد تستغرق العملية بعض الوقت أثناء نقل البيانات والأذونات."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"يُرجى عدم إغلاق التطبيق حتى تتلقّى إشعارًا باكتمال العملية."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"جارٍ تنفيذ عملية دمج تطبيق Health Connect"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"مطلوب التحديث"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"يتم دمج تطبيق Health Connect حاليًا مع نظام Android لتتمكّن من الوصول إليه مباشرةً من خلال الإعدادات."</string>
     <string name="update_button" msgid="4544529019832009496">"تحديث"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"يُرجى بدء تنزيل هذا التحديث ليتمكّن تطبيق Health Connect من مواصلة عملية الدمج مع إعدادات النظام."</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"التحديث الآن"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"يجب تحديث النظام"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"قبل المتابعة، يُرجى تحديث نظام الهاتف."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"إذا سبق لك تحديث نظام الهاتف، جرِّب إعادة تشغيل الهاتف لمواصلة عملية الدمج."</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"مطلوب تحديث تطبيق Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"قبل المتابعة، يُرجى تثبيت أحدث إصدار من تطبيق Health Connect."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"مطلوب المزيد من مساحة التخزين"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"يحتاج تطبيق Health Connect إلى <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> من مساحة التخزين على هاتفك لمواصلة عملية الدمج.\n\nيُرجى إخلاء بعض المساحة على هاتفك ثم إعادة المحاولة."</string>
     <string name="try_again_button" msgid="8745496819992160789">"إعادة المحاولة"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"إخلاء بعض المساحة"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"مطلوب المزيد من مساحة التخزين"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"يحتاج تطبيق Health Connect إلى <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> من مساحة التخزين على هاتفك لمواصلة عملية الدمج."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"تم إيقاف عملية الدمج مؤقتًا"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"تم إغلاق تطبيق Health Connect أثناء تنفيذ عملية الدمج مع نظام Android.\n\nانقر على \"استئناف\" لإعادة فتح التطبيق ومواصلة عملية نقل البيانات والأذونات."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"للحفاظ على بيانات تطبيق Health Connect، يُرجى إكمال عملية الدمج هذه في غضون <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"انقر لمواصلة عملية دمج تطبيق Health Connect مع نظام Android. للحفاظ على بياناتك، يُرجى إكمال عملية الدمج هذه في غضون <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"انقر لمواصلة عملية دمج تطبيق Health Connect مع نظام Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"متابعة"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"استئناف عملية دمج تطبيق Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"للحفاظ على بياناتك، يُرجى إكمال عملية الدمج هذه في غضون <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"يجب تحديث التطبيق"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"يجب تحديث \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" لمواصلة مزامنته مع تطبيق Health Connect."</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"يجب تحديث بعض التطبيقات لمواصلة مزامنتها مع تطبيق Health Connect."</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"يجب تحديث \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" لمواصلة مزامنته مع تطبيق Health Connect. وقد لا تكون التحديثات متاحة لبعض التطبيقات."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"يجب تحديث بعض التطبيقات لمواصلة مزامنتها مع تطبيق Health Connect. وقد لا تكون التحديثات متاحة لبعض التطبيقات."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"البحث عن تحديثات"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"مزيد من المعلومات"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"دمج تطبيق Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"تعذّر اكتمال عملية دمج تطبيق Health Connect"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"ستتلقّى إشعارًا عند مواصلة عملية الدمج مرة أخرى."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"حسنًا"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"تعذّر اكتمال عملية دمج تطبيق Health Connect"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"مزيد من المعلومات"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"اكتملت عملية دمج تطبيق Health Connect"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"فتح"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"ما الجديد؟"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"يمكنك الآن الوصول إلى تطبيق Health Connect مباشرةً من خلال الإعدادات. ويمكنك أيضًا إلغاء تثبيت تطبيق Health Connect في أي وقت إذا أردت إخلاء مساحة تخزين."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"حسنًا"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"تعديل مصادر التطبيقات"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"التطبيق التلقائي في الجهاز"</string>
     <string name="app_data_title" msgid="6499967982291000837">"بيانات التطبيق"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"ستظهر هنا البيانات الواردة من التطبيقات التي يمكنها الوصول إلى Health Connect."</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"البيانات الواردة من تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ستظهر هنا"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"ستظهر هنا البيانات الواردة من التطبيقات التي يمكنها الوصول إلى Health Connect"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"يوم"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"أسبوع"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"شهر"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"الشهر الماضي"</string>
     <string name="tab_entries" msgid="3402700951602029493">"الإدخالات"</string>
     <string name="tab_access" msgid="7818197975407243701">"إذن الوصول"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"هل تريد منح \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" إذن الوصول الإضافي؟"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"‫\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بحاجة إلى الوصول أيضًا إلى إعدادات Health Connect هذه"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"يجب منح إذن واحد بالقراءة على الأقل لتفعيل وصول هذا التطبيق إلى البيانات في الخلفية أو البيانات السابقة"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"يجب منح إذن واحد بالقراءة على الأقل لتفعيل وصول هذا التطبيق إلى البيانات في الخلفية"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"يجب منح إذن واحد بالقراءة على الأقل لتفعيل وصول هذا التطبيق إلى البيانات السابقة"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"بدء استخدام Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"مزامنة التطبيقات الرئيسية لمشاركة بيانات الصحة واللياقة البدنية بينها"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"إعداد"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"عرض التطبيقات المتوافقة"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"العثور على المزيد من التطبيقات لمزامنة البيانات مع \"<xliff:g id="APP_NAME">%s</xliff:g>\" من خلال تطبيق Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"العرض في متجر التطبيقات"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ضبط قفل شاشة"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"لمزيد من الأمان لبياناتك الصحية، عليك ضبط رقم تعريف شخصي أو نقش أو كلمة مرور لهذا الجهاز"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ضبط قفل الشاشة"</string>
     <string name="select_all" msgid="837499881590001166">"اختيار الكل"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"لن تتمكَّن التطبيقات المرتبطة بعد الآن من قراءة هذه البيانات من تطبيق Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"تم وضع علامة في مربّع الاختيار"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"لم يتم وضع علامة في مربّع الاختيار"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"يتوفّر مسار التمرين الرياضي على الخريطة"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"اليوم التالي"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"الأسبوع التالي"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"الشهر التالي"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"اليوم السابق"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"الأسبوع السابق"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"الشهر السابق"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"هل تريد حذف جميع البيانات نهائيًا؟"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"هل تريد حذف البيانات المحدّدة نهائيًا؟"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"هل تريد حذف جميع بيانات \"<xliff:g id="APP_NAME">%s</xliff:g>\" نهائيًا؟"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"هل تريد حذف إدخالات \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" المحدّدة في الأسبوع من ‎<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> نهائيًا؟"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"هل تريد حذف إدخالات \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" المحدّدة في شهر ‎<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> نهائيًا؟"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"هل تريد حذف إدخال \"<xliff:g id="APP_NAME">%s</xliff:g>\" هذا نهائيًا؟"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"هل تريد حذف بيانات <xliff:g id="DATA_TYPE">%1$s</xliff:g> الواردة من تطبيق \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" نهائيًا؟"</string>
+    <string name="on" msgid="8266542510798355807">"مفعّل"</string>
+    <string name="off" msgid="6996623844428550649">"غير مفعَّل"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"آخر استخدام: ‎<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"آخر استخدام للإذن أمس: ‎<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"آخر استخدام للإذن في ‎<xliff:g id="TIME_DATE_0">%1$s</xliff:g>: ‏<xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"السماح طوال الوقت"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"تم اختيار \"سماح\""</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"أثناء استخدام التطبيق"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"رفض الكل"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"هل تريد السماح لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بالوصول إلى بيانات الصحة واللياقة البدنية؟"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"يطلب تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الإذن بالوصول إلى <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nيمكنك السماح بها جميعًا أو التحكّم فيها بشكل فردي."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"هل تريد السماح لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بالوصول إلى بيانات <xliff:g id="DATA_TYPE">%2$s</xliff:g>؟"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"الصحة واللياقة البدنية"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"طوال الوقت"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"أثناء استخدام التطبيق"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"طوال الوقت"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"أثناء استخدام التطبيق"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"يمكن لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الوصول إلى جميع بيانات الصحة واللياقة البدنية <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"مسموح له بالوصول إلى البيانات"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"مسموح له بقراءة البيانات"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"تمنح هذه الأذونات \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" إمكانية الوصول إلى بيانات أدوات الاستشعار في جهازك."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"تم السماح بالوصول إلى البيانات لعدد من التطبيقات يبلغ <xliff:g id="NUMBER_0">%1$d</xliff:g> من أصل <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"ما مِن تطبيقات تطلب هذا الإذن"</string>
+    <string name="allowed" msgid="4158456017482263737">"مسموح له"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"غير مسموح له"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"يمكن للتطبيقات التي لديها هذا الإذن الوصول إلى بيانات <xliff:g id="DATA_TYPE">%s</xliff:g> من أدوات الاستشعار في جهازك."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"هل تريد إزالة إذن الوصول إلى بيانات <xliff:g id="DATA_TYPE">%s</xliff:g> لجميع التطبيقات على ساعتك؟"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"علامة اختيار"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"علامة خطأ"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"يمكن لـ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" حاليًا الوصول إلى بيانات الصحة واللياقة البدنية <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"هل تريد السماح لـ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" بالوصول إلى بيانات الصحة واللياقة البدنية في كل الأوقات؟"</string>
+    <string name="current_access" msgid="1457167070428176139">"لدى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" إذن بالوصول إلى <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"إدارة أذونات الصحة واللياقة البدنية"</string>
 </resources>
diff --git a/apk/res/values-as/strings.xml b/apk/res/values-as/strings.xml
index 2bfc90e..9232a4d 100644
--- a/apk/res/values-as/strings.xml
+++ b/apk/res/values-as/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"আপোনাৰ ডিভাইচত স্বাস্থ্য আৰু ফিটনেছ সম্পৰ্কীয় ডেটা পৰিচালনা কৰক আৰু সেয়া কোনবোৰ এপে এক্সেছ কৰিব পাৰে সেয়া নিয়ন্ত্ৰণ কৰক"</string>
     <string name="data_title" msgid="4456619761533380816">"ডেটা আৰু এক্সেছ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"স্বাস্থ্য সম্বন্ধীয় নথি ব্ৰাউজ কৰক"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"আপোনাৰ স্বাস্থ্য সম্বন্ধীয় নথি আৰু কোনবোৰ এপে সেইবোৰ এক্সেছ কৰিব পাৰে চাওক"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"আটাইবোৰ শিতান"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"আটাইবোৰ শিতান চাওক"</string>
     <string name="no_data" msgid="1906986019249068659">"কোনো ডেটা নাই"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"কালি"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"পঢ়ক: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"লিখক: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"অনুমতি পৰিচালনা কৰক"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"সময়: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"কাৰ্যকলাপ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"আপোনাৰ স্বাস্থ্য সম্পৰ্কীয় ডেটাৰ এক্সেছ"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"কেল’ৰি খৰচৰ ডেটা পঢ়ক"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"এপ্‌টোক কেল’ৰি খৰচৰ পৰিমাণ পঢ়িবলৈ দিয়ে"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"নেপথ্যত ডেটা এক্সেছ কৰক"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক নেপথ্যত ডেটা এক্সেছ কৰিবলৈ অনুমতি দিবনে?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক নেপথ্যত ডেটা এক্সেছ কৰিবলৈ অনুমতি দিবনে?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"আপুনি অনুমতি দিলে, আপুনি এপ্‌টো ব্যৱহাৰ কৰি নাথাকোঁতে এই এপ্‌টোৱে ফিটনেছ আৰু সুস্থতাৰ ডেটা আৰু স্বাস্থ্য সম্বন্ধীয় নথিৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"যদি আপুনি অনুমতি দিয়ে, আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়তো ই স্বাস্থ্য সম্বন্ধীয় নথি এক্সেছ কৰিব পাৰে।"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"যদি আপুনি অনুমতি দিয়ে, আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়তো ই ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰিব পাৰে।"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"যদি আপুনি অনুমতি দিয়ে, আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোৱে Health Connectৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক পূৰ্বৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিবনে?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"যদি আপুনি অনুমতি দিয়ে, এই এপ্‌টোৱে <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ৰ পূৰ্বে যোগ দিয়া ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"যদি আপুনি অনুমতি দিয়ে, এই এপ্‌টোৱে পূৰ্বৰ আটাইবোৰ ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"যদি আপুনি অনুমতি দিয়ে, এই এপ্‌টোৱে <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ৰ পূৰ্বে যোগ দিয়া Health Connectৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"যদি আপুনি অনুমতি দিয়ে, এই এপ্‌টোৱে Health Connectৰ পূৰ্বৰ আটাইবোৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক অতিৰিক্ত এক্সেছৰ অনুমতি দিবনে?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ Health Connectৰ এই ছেটিংসমূহো এক্সেছ কৰিবলৈ বিচাৰে"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"নেপথ্যত আটাইবোৰ ডেটা এক্সেছ কৰক"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"নেপথ্যত স্বাস্থ্য সম্বন্ধীয় নথি এক্সেছ কৰক"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"নেপথ্যত ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰক"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নাথাকোঁতে এই এপ্‌টোক ফিটনেছ আৰু সুস্থতাৰ ডেটা আৰু স্বাস্থ্য সম্বন্ধীয় নথিৰ ডেটা এক্সেছ কৰিবলৈ দিয়ক"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোক এই ডেটাখিনি এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোক এই ডেটাখিনি এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"নেপথ্যত ডেটা এক্সেছ কৰক"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোক Health Connectৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"পূৰ্বৰ ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰক"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"এই এপ্‌টোক <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ৰ পূৰ্বে যোগ দিয়া ডেটা এক্সেছ কৰিবলৈ দিয়ক"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"এই এপ্‌টোক পূৰ্বৰ আটাইবোৰ ডেটা এক্সেছ কৰিবলৈ দিয়ক"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"পূৰ্বৰ ডেটা এক্সেছ কৰিব পাৰে"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"এই এপ্‌টোক <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ৰ পূৰ্বে যোগ দিয়া Health Connectৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"এই এপ্‌টোক Health Connectৰ পূৰ্বৰ আটাইবোৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ ইতিমধ্যে আপোনাৰ স্বাস্থ্য সম্বন্ধীয় নথিৰ বাবে পূৰ্বৰ ডেটা এক্সেছ কৰিব পাৰে"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"অনুমতিৰ বিষয়ে অধিক পঢ়ক"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"নেপথ্যত আটাইবোৰ ডেটা এক্সেছ কৰক"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"নেপথ্যত স্বাস্থ্য সম্বন্ধীয় নথি এক্সেছ কৰক"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"নেপথ্যত ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰক"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নাথাকোঁতে এই এপ্‌টোক ফিটনেছ আৰু সুস্থতাৰ ডেটা আৰু স্বাস্থ্য সম্বন্ধীয় নথিৰ ডেটা এক্সেছ কৰিবলৈ দিয়ক"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোক এই ডেটাখিনি এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোক এই ডেটাখিনি এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"নেপথ্যত ডেটা এক্সেছ কৰক"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোক Health Connectৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"পূৰ্বৰ ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰক"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"এই এপ্‌টোক <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ৰ পূৰ্বে যোগ দিয়া ডেটা এক্সেছ কৰিবলৈ দিয়ক"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"এই এপ্‌টোক পূৰ্বৰ আটাইবোৰ ডেটা এক্সেছ কৰিবলৈ দিয়ক"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"পূৰ্বৰ ডেটা এক্সেছ কৰিব পাৰে"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"এই এপ্‌টোক <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ৰ পূৰ্বে যোগ দিয়া Health Connectৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"এই এপ্‌টোক Health Connectৰ পূৰ্বৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"বৰ্তমান কোনো ফিটনেছৰ ডেটা পঢ়া হোৱা নাই কাৰণ <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ কোনো পঢ়াৰ অনুমতি অন হৈ থকা নাই"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ ইতিমধ্যে আপোনাৰ স্বাস্থ্য সম্বন্ধীয় নথিৰ বাবে পূৰ্বৰ ডেটা এক্সেছ কৰিব পাৰে। এইটো সলনি কৰিবলৈ এই এপ্‌টোৰ বাবে স্বাস্থ্য সম্বন্ধীয় নথিৰ অনুমতি অফ কৰক"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"স্বাস্থ্য সম্বন্ধীয় নথিৰ অনুমতি পৰিচালনা কৰক"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"এই এপ্‌টোৰ বাবে নেপথ্য অথবা পূৰ্বৰ ডেটা এক্সেছ কৰাৰ সুবিধা অন কৰিবলৈ অতি কমেও এটা পঢ়াৰ অনুমতি সক্ষম কৰক"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"এই এপ্‌টোৰ বাবে নেপথ্য এক্সেছ কৰাৰ সুবিধা অন কৰিবলৈ অতি কমেও এটা পঢ়াৰ অনুমতি সক্ষম কৰক"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"এই এপ্‌টোৰ বাবে পূৰ্বৰ ডেটা এক্সেছ কৰাৰ সুবিধা অন কৰিবলৈ অতি কমেও এটা পঢ়াৰ অনুমতি সক্ষম কৰক"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"এই এপ্‌টোক Health Connectৰ পূৰ্বৰ আটাইবোৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
     <string name="background_read_description" msgid="3203594555849969283">"আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোক Health Connectৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"যদি আপুনি অনুমতি দিয়ে, আপুনি এপ্‌টো ব্যৱহাৰ কৰি নথকাৰ সময়ত এই এপ্‌টোৱে Health Connectৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"পূৰ্বৰ ডেটা এক্সেছ কৰক"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক পূৰ্বৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিবনে?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"এই এপ্‌টোক <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ৰ পূৰ্বে যোগ দিয়া Health Connectৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"এই এপ্‌টোক Health Connectৰ পূৰ্বৰ আটাইবোৰ ডেটা এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"যদি আপুনি অনুমতি দিয়ে, এই এপ্‌টোৱে <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ৰ পূৰ্বে যোগ দিয়া Health Connectৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"যদি আপুনি অনুমতি দিয়ে, এই এপ্‌টোৱে Health Connectৰ পূৰ্বৰ আটাইবোৰ ডেটা এক্সেছ কৰিব পাৰিব।"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"খৰচ হোৱা সক্ৰিয় কেল’ৰি"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"খৰচ হোৱা সক্ৰিয় কেল’ৰি"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"খৰচ হোৱা সক্ৰিয় কেল’ৰিৰ ডেটা পঢ়ক"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"হুইলচ্চেয়াৰ চলোৱাৰ ডেটা"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"হুইলচ্চেয়াৰ চলোৱাৰ ডেটা পঢ়ক"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"হুইলচ্চেয়াৰ চলোৱাৰ ডেটা লিখক"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"কাৰ্যকলাপৰ তীব্ৰতা"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"কাৰ্যকলাপৰ তীব্ৰতা"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"কাৰ্যকলাপৰ তীব্ৰতা পঢ়ক"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"কাৰ্যকলাপৰ তীব্ৰতা লিখক"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"বুনিয়াদী বিপাকীয় হাৰৰ ডেটা"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"বুনিয়াদী বিপাকীয় হাৰৰ ডেটা"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"বুনিয়াদী বিপাকীয় হাৰৰ ডেটা পঢ়ক"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ছালৰ তাপমাত্ৰা"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"ছালৰ তাপমাত্ৰা জোখক"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"ছালৰ তাপমাত্ৰা লিখক"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"এইটোত Health Connectত ছিংক আৰু যোগ কৰা আটাইবোৰ স্বাস্থ্য সম্বন্ধীয় নথি অন্তৰ্ভুক্ত হয়। এয়া আপোনাৰ সম্পূৰ্ণ চিকিৎসা সম্বন্ধীয় নথি নহ’বও পাৰে আৰু ইয়াত আপোনাৰ স্বাস্থ্য সম্বন্ধীয় নথিৰ চিকিৎসাৰ বিৱৰণ নাথাকে।"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"আটাইবোৰ স্বাস্থ্য সম্বন্ধীয় নথি"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"আটাইবোৰ স্বাস্থ্য সম্বন্ধীয় নথি"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"আটাইবোৰ স্বাস্থ্য সম্বন্ধীয় নথি লিখক"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"এলাৰ্জি"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"এলাৰ্জি"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"এলাৰ্জি সম্পৰ্কীয় ডেটা পঢ়ক"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"প্ৰতিষেধক"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"প্ৰতিষেধক"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"প্ৰতিষেধক প্ৰদান সম্পৰ্কীয় তথ্য পঢ়ক"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ব্যৱহাৰকাৰীৰ পৰীক্ষাগাৰৰ ফলাফল"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ব্যৱহাৰকাৰীৰ পৰীক্ষাগাৰৰ ফলাফল"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ব্যৱহাৰকাৰীৰ পৰীক্ষাগাৰৰ ফলাফল পঢ়ক"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"এলাৰ্জি"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"এলাৰ্জি"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"এলাৰ্জি সম্পৰ্কীয় ডেটা পঢ়ক"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"চর্ত"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"চর্ত"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"চৰ্ত পঢ়ক"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"প্ৰতিষেধক"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"প্ৰতিষেধক"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"প্ৰতিষেধকৰ বিষয়ে পঢ়ক"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"লেবৰ ফলাফল"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"লেবৰ ফলাফল"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"লেবৰ ফলাফল পঢ়ক"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ঔষধ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ঔষধ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ঔষধ সম্পৰ্কীয় ডেটা পঢ়ক"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ব্যক্তিগত সবিশেষ"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ব্যক্তিগত সবিশেষ"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"ব্যক্তিগত সবিশেষ পঢ়ক"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"স্বাস্থ্যকর্মীৰ সবিশেষ"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"স্বাস্থ্যকর্মীৰ সবিশেষ"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"স্বাস্থ্যকর্মীৰ সবিশেষ পঢ়ক"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ব্যৱহাৰকাৰীৰ গৰ্ভাৱস্থা"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ব্যৱহাৰকাৰীৰ গৰ্ভাৱস্থা"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ব্যৱহাৰকাৰীৰ গৰ্ভাৱস্থা সম্পৰ্কীয় ডেটা পঢ়ক"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ব্যৱহাৰকাৰীৰ স্বাস্থ্যৰ সমস্যা"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ব্যৱহাৰকাৰীৰ স্বাস্থ্যৰ সমস্যা"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"ব্যৱহাৰকাৰীৰ স্বাস্থ্যৰ সমস্যা সম্পৰ্কীয় ডেটা পঢ়ক"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"ব্যৱহাৰকাৰীৰ চিকিৎসা প্ৰক্ৰিয়া"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"ব্যৱহাৰকাৰীৰ চিকিৎসা প্ৰক্ৰিয়া"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"ব্যৱহাৰকাৰীৰ চিকিৎসা প্ৰক্ৰিয়া সম্পৰ্কীয় ডেটা পঢ়ক"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"ব্যৱহাৰকাৰীৰ সামাজিক মাধ্যম সম্পৰ্কীয় ডেটা"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ব্যৱহাৰকাৰীৰ সামাজিক মাধ্যম সম্পৰ্কীয় ডেটা"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ব্যৱহাৰকাৰীৰ সামাজিক মাধ্যম সম্পৰ্কীয় ডেটা"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"ব্যৱহাৰকাৰীৰ সামাজিক মাধ্যম সম্পৰ্কীয় ডেটা পঢ়ক"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"ব্যৱহাৰকাৰীৰ দেহৰ গুৰুত্বপূৰ্ণ অংগৰ বিষয়ে ডেটা"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"চিকিৎসকৰ ওচৰলৈ যোৱাৰ তথ্য"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"চিকিৎসকৰ ওচৰলৈ যোৱাৰ তথ্য"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"চিকিৎসকৰ ওচৰলৈ যোৱাৰ তথ্য পঢ়ক"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"ব্যৱহাৰকাৰীৰ দেহৰ গুৰুত্বপূৰ্ণ অংগৰ বিষয়ে ডেটা"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"ব্যৱহাৰকাৰীৰ দেহৰ গুৰুত্বপূৰ্ণ অংগৰ বিষয়ে ডেটা"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"ব্যৱহাৰকাৰীৰ দেহৰ গুৰুত্বপূৰ্ণ অংগৰ বিষয়ে ডেটা পঢ়ক"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"চিন্তাশীল"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"চিন্তাশীল ছেশ্বনৰ ডেটা লিখক"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”ক পঢ়িবলৈ দিয়ক"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”ক লিখিবলৈ দিয়ক"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"বাতিল কৰক"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"অনুমতি দিয়ক"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"আটাইবোৰকে অনুমতি দিয়ক"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"অনুমতি নিদিব"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"আপুনি এই এপ্‌টোৱে Health Connectত থকা কি ডেটা পঢ়া অথবা তাত কি ডেটা লিখাটো বিচাৰে সেয়া বাছনি কৰক"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"আপুনি এই এপ্‌টোৱে Health Connectত থকা কি ডেটা পঢ়া অথবা তাত কি ডেটা লিখাটো বিচাৰে সেয়া বাছনি কৰক"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"আপুনি এই এপ্‌টোৱে Health Connectত থকা কি ডেটা পঢ়াটো বিচাৰে সেয়া বাছনি কৰক"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"আপুনি এই এপ্‌টোৱে Health Connectত থকা কি ডেটা লিখাটো বিচাৰে সেয়া বাছনি কৰক"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"যদি আপুনি পঢ়াৰ এক্সেছ দিয়ে, এই এপ্‌টোৱে নতুন ডেটা আৰু যোৱা ৩০ দিনৰ ডেটা পঢ়িব পাৰিব"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"যদি আপুনি পঢ়াৰ এক্সেছ দিয়ে, এই এপ্‌টোৱে নতুন আৰু পূৰ্বৰ ডেটা পঢ়িব পাৰিব"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক Health Connect এক্সেছ কৰাৰ অনুমতি দিবনে?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ ডেটা কেনেকৈ পৰিচালনা কেনেকৈ কৰে সেয়া আপুনি বিকাশকৰ্তাৰ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>ত জানিব পাৰে"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক পূৰ্বৰ ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰিবলৈ দিবনে?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> আপোনাৰ ডেটা কেনেকৈ পৰিচালনা কেনেকৈ কৰে সেয়া আপুনি ইয়াৰ<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>ত জানিব পাৰে"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"গোপনীয়তা নীতি"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক আপোনাৰ স্বাস্থ্য সম্বন্ধীয় নথি এক্সেছ কৰিবলৈ অনুমতি দিবনে?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"যদি আপুনি এক্সেছ কৰাৰ অনুমতি দিয়ে, তেন্তে এপ্‌টোৱে এলাৰ্জি, লেবৰ ফলাফল, প্ৰতিষেধকৰ দৰে ডেটা আৰু অধিক পঢ়িব আৰু লিখিব পাৰে\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"যদি আপুনি অনুমতি দিয়ে, এই এপ্‌টোৱে এলাৰ্জি, লেবৰ ফলাফল, প্ৰতিষেধক আৰু অধিকৰ দৰে ডেটা পঢ়িব পাৰিব\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"স্বাস্থ্য সম্বন্ধীয় নথিৰ বিষয়ে"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"শ্বেয়াৰ কৰিব লগা ডেটাত এইসমূহ অন্তৰ্ভুক্ত"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"যদি আপুনি অনুমতি দিয়ে, তেন্তে <xliff:g id="APP_NAME">%1$s</xliff:g>এ Health Connectৰ সৈতে আপোনাৰ স্বাস্থ্য সম্বন্ধীয় নথি শ্বেয়াৰ কৰিব পাৰে।"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"আপোনাৰ স্বাস্থ্য সম্বন্ধীয় নথি একে ঠাইত ৰাখিবলৈ সেইবোৰ বিভিন্ন এপ্‌ আৰু উৎসৰ পৰা ছিংক কৰক"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"আটাইবোৰ অনুমতি আঁতৰাবনে?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"আটাইবোৰ আঁতৰাওক"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ Health Connectৰ কোনো ডেটা আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ পূৰ্বৰ ডেটাকে ধৰি Health Connectৰ কোনো ডেটা আৰু পঢ়িব অথবা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা অৱস্থান, কেমেৰা অথবা মাইক্ৰ’ফ’নৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ নেপথ্য আৰু পূৰ্বৰ ডেটাকে ধৰি Health Connectৰ কোনো ডেটা আৰু পঢ়িব অথবা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা অৱস্থান, কেমেৰা অথবা মাইক্ৰ’ফ’নৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connectৰ পৰা <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ ডেটাও মচক"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"আটাইবোৰ অনুমতি আঁতৰাবনে?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"স্বাস্থ্য সম্বন্ধীয় নথি সম্পৰ্কীয় আটাইবোৰ অনুমতি আঁতৰাবনে?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"আটাইবোৰ ফিটনেছ আৰু সুস্থতাৰ অনুমতি আঁতৰাব নেকি?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"লগতে, Health Connectৰ <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ পৰাও সুস্থতাৰ ডেটা মচক"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"স্বাস্থ্য সম্বন্ধীয় নথি সম্পৰ্কীয় আটাইবোৰ অনুমতি আঁতৰাবনে?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"লগতে, Health Connectৰ <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ পৰা স্বাস্থ্য সম্বন্ধীয় নথি মচক"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ Health Connectৰ এই ডেটাখিনি আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ নেপথ্যৰ ডেটাকে ধৰি Health Connectৰ এই ডেটাখিনি আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আগৰ ডেটাকে ধৰি Health Connectৰ এই ডেটাখিনি আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ নেপথ্য আৰু আগৰ ডেটাকে ধৰি Health Connectৰ এই ডেটাখিনি আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"আটাইবোৰ অনুমতি আঁতৰাবনে?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ Health Connectৰ কোনো ডেটা আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ নেপথ্যৰ ডেটাকে ধৰি Health Connectৰ কোনো ডেটা আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আগৰ ডেটাকে ধৰি Health Connectৰ কোনো ডেটা আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ নেপথ্য আৰু আগৰ ডেটাকে ধৰি Health Connectৰ কোনো ডেটা আৰু পঢ়িব বা লিখিব নোৱাৰিব।\n\nএইটোৱে এই এপ্‌টোৰ ওচৰত থাকিব পৰা কেমেৰা, মাইক্ৰ’ফ’ন বা অৱস্থানৰ দৰে অন্য অনুমতিসমূহত প্ৰভাৱ নেপেলায়।"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"লগতে, <xliff:g id="APP_NAME">%1$s</xliff:g> Health Connectৰ পৰা সুস্থতাৰ ডেটা আৰু স্বাস্থ্য সম্বন্ধীয় নথি মচক"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"এই এপ্‌টোৰ বাবে অনুমতি আঁতৰোৱা হৈছে"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"লগতে Health Connectৰ আটাইবোৰ ডেটা মচক"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"পৰৱৰ্তী দিন"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"বাছনি কৰা দিন"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"পূৰ্বৱৰ্তী দিন"</string>
     <string name="default_error" msgid="7966868260616403475">"কিবা ভুল হ’ল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক।"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"অজ্ঞাত উৎস"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"উৎসৰ ডেটা"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>বাওঁ বৰ বন্ধনী।"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>সোঁ বৰ বন্ধনী।"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ক্ষেত্ৰ <xliff:g id="FIELD">%2$s</xliff:g> মান"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"এই এপ্‌সমূহৰ ওচৰত আৰু এক্সেছ নাই, কিন্তু তথাপি Health Connectত এইসমূহৰ ডেটা ষ্ট’ৰ কৰা আছে"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>ৰ পাছত যোগ দিয়া ডেটা পঢ়িব পাৰে"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"এই এপ্‌টোৱে এক্সেছ কৰিব পৰা Androidৰ অন্য অনুমতিসমূহ পৰিচালনা কৰিবলৈ, ছেটিং &gt; এপলৈ যাওক"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"আপুনি <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ সৈতে শ্বেয়াৰ কৰা ডেটাখিনি ইয়াৰ গোপনীয়তাৰ নীতিৰ অধীন হয়"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"আপুনি বিকাশকৰ্তাৰ গোপনীয়তা নীতিত জানিব পাৰিব যে <xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ ডেটা কেনেকৈ পৰিচালনা কেনেকৈ কৰে"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"এই এপ্‌টোৱে এক্সেছ কৰিব পৰা Androidৰ অন্য অনুমতিসমূহ পৰিচালনা কৰিবলৈ ছেটিঙলৈ যাওক, তাৰ পাছত এপত টিপক"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"গোপনীয়তাৰ নীতি পঢ়ক"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"যোৱা ২৪ ঘণ্টাত এক্সেছ কৰিছে"</string>
     <string name="app_access_title" msgid="7137018424885371763">"এপৰ এক্সেছ"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"বৰ্তমান আপোনাৰ ইনষ্টল কৰি থোৱা কোনো সুসংগত এপ্ নাই"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"অতিৰিক্ত এক্সেছ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"পুৰণি ডেটা নেপথ্য ডেটা"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"এই এপ্‌টোৰ বাবে অতিৰিক্ত অনুমতি আঁতৰোৱা হৈছে"</string>
     <string name="permissions_header" msgid="6519976063360071569">"অনুমতি"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ফিটনেছ আৰু সুস্থতা"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ব্যায়াম, টোপনি, পুষ্টি আৰু অন্যান্য"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"স্বাস্থ্য সম্বন্ধীয় নথি"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"স্বাস্থ্য সম্বন্ধীয় নথি"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"লেবৰ ফলাফল, ঔষধ, প্ৰতিষেধক আৰু অন্যান্য"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"লেবৰ ফলাফল, ঔষধ, প্ৰতিষেধক আৰু অন্যান্য"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"অনুমতি আঁতৰোৱা এপ্‌সমূহ"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connectএ <xliff:g id="APP_DATA">%s</xliff:g>ৰ অনুমতি আঁতৰাইছে"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connectএ <xliff:g id="APP_DATA_0">%1$s</xliff:g> আৰু <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>ৰ অনুমতি আঁতৰাইছে"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Storeলৈ যাওক"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect ব্যৱহাৰ কৰা আৰম্ভ কৰক"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connectএ আপোনাৰ স্বাস্থ্য আৰু শৰীৰচৰ্চা সম্পৰ্কীয় ডেটা ষ্ট’ৰ কৰি আপোনাক আপোনাৰ ডিভাইচত থকা বিভিন্ন এপ্‌সমূহ ছিংক কৰাৰ সহজ উপায় প্ৰদান কৰে"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connectএ বিভিন্ন এপৰ পৰা আপোনাৰ স্বাস্থ্য আৰু শৰীৰচৰ্চা সম্পৰ্কীয় ডেটা ষ্ট’ৰ আৰু ছিংক কৰে।\n\n"<b>"স্বাস্থ্য আৰু কল্যাণমূলক ডেটা পাব পাৰে,"</b>" য’ত ব্যায়ামৰ ছেশ্বন, খোজকঢ়া, পৰিপুষ্টি, শোৱা আৰু অধিক অন্তৰ্ভুক্ত\n\n"<b>"স্বাস্থ্য সম্বন্ধীয় নথি,"</b>" য’ত প্ৰতিষেধক, লেবৰ ফলাফল আৰু অধিক অন্তৰ্ভুক্ত"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"আপুনি Health Connectৰ জৰিয়তে"</string>
     <string name="share_data" msgid="3481932156368883946">"আপোনাৰ এপ্‌সমূহৰ সৈতে ডেটা শ্বেয়াৰ কৰক"</string>
     <string name="share_data_description" msgid="2919871301634375092">"প্ৰতিটো এপে Health Connectত কি ডেটা পঢ়িব অথবা লিখিব পাৰিব সেয়া বাছনি কৰক"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"আপোনাৰ ছেটিং আৰু গোপনীয়তা পৰিচালনা কৰক"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"মৃদু প্ৰবাহ"</string>
     <string name="flow_medium" msgid="3783688724668943154">"মধ্যমীয়া প্ৰবাহ"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"বেছি প্ৰবাহ"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"অজ্ঞাত প্ৰৱাহ"</string>
     <string name="period_day" msgid="3821944462093965882">"ঋতুস্ৰাৱ হোৱাৰ <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> দিনৰ <xliff:g id="DAY">%1$d</xliff:g>তম দিন"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ঋতুস্ৰাৱ (১ দিন)}one{ঋতুস্ৰাৱ (# দিন)}other{ঋতুস্ৰাৱ (# দিন)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"ইতিবাচক"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"নেতিবাচক"</string>
     <string name="ovulation_high" msgid="205362931427158291">"উচ্চ"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"সংগীত"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"অন্য"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"অনিয়ন্ত্ৰিত"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"মজলীয়া"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"প্ৰবল"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> মি"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ঘ <xliff:g id="MIN">%2$s</xliff:g> মি"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ঘ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"একত্ৰিত কৰি থকা হৈছে"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connectক Android ছিষ্টেমৰ সৈতে একত্ৰিত কৰি থকা হৈছে।\n\nআপোনাৰ ডেটা আৰু অনুমতিসমূহ স্থানান্তৰণ কৰিবলৈ কিছু সময় লাগিব পাৰে।"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"প্ৰক্ৰিয়াটো সম্পূৰ্ণ হোৱা বুলি কোনো জাননী নোপোৱালৈকে এপ্‌টো বন্ধ নকৰিব।"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect একত্ৰিত কৰি থকা হৈছে"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"আপডে’টৰ প্ৰয়োজন"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connectক Android ছিষ্টেমৰ সৈতে একত্ৰিত কৰি থকা হৈছে গতিকে আপুনি নিজৰ ছেটিঙৰ পৰা এইটো পোনপটীয়াকৈ এক্সেছ কৰিব পাৰে।"</string>
     <string name="update_button" msgid="4544529019832009496">"আপডে’ট কৰক"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"এই আপডে’টটো আৰম্ভ কৰক যাতে Health Connectএ আপোনাৰ ছিষ্টেমৰ সৈতে একত্ৰিত কৰাটো অব্যাহত ৰাখিব পাৰে"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"এতিয়াই আপডে’ট কৰক"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"ছিষ্টেম আপডে’টৰ প্ৰয়োজন"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"অব্যাহত ৰখাৰ পূৰ্বে, আপোনাৰ ফ’নৰ ছিষ্টেমটো আপডে’ট কৰক।"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"যদি আপুনি আপোনাৰ ফ’নৰ ছিষ্টেমটো ইতিমধ্যে আপডে’ট কৰিছে, একত্ৰিত কৰাটো অব্যাহত ৰাখিবলৈ আপোনাৰ ফ’নটো ৰিষ্টাৰ্ট কৰি চাওক"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect আপডে’ট কৰাৰ আৱশ্যক"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"অব্যাহত ৰখাৰ পূৰ্বে, Health Connect এপ্‌টোক তাৰ শেহতীয়া সংস্কৰণটোলৈ আপডে’ট কৰক।"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"অধিক ঠাইৰ আৱশ্যক"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connectক একত্ৰিত কৰাটো অব্যাহত ৰাখিবলৈ আপোনাৰ ফ’নত <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ষ্ট’ৰেজৰ খালী ঠাই লাগে।\n\nআপোনাৰ ফ’নত কিছু ঠাই খালী কৰি পুনৰ চেষ্টা কৰক।"</string>
     <string name="try_again_button" msgid="8745496819992160789">"পুনৰ চেষ্টা কৰক"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ঠাই খালী কৰক"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"অধিক ঠাইৰ আৱশ্যক"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connectক একত্ৰিত কৰাটো অব্যাহত ৰাখিবলৈ আপোনাৰ ফ’নত <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ষ্ট’ৰেজৰ খালী ঠাই লাগে।"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"একত্ৰিত কৰাটো পজ কৰা হৈছে"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect এপ্‌টো এটা Android ছিষ্টেমৰ সৈতে একত্ৰিত কৰি থকাৰ সময়ত বন্ধ হৈছে\n\nএপ্‌টো পুনৰ খুলিবলৈ পুনৰ আৰম্ভ কৰিবলৈ আৰু আপোনাৰ ডেটা আৰু অনুমতিসমূহ স্থানান্তৰণ কৰাটো অব্যাহত ৰাখক।"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"আপোনাৰ Health Connect ডেটা ৰাখিবলৈ, এইটো <xliff:g id="TIME_NEEDED">%1$s</xliff:g>ৰ ভিতৰত সম্পূৰ্ণ কৰক"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Android ছিষ্টেমটোৰ সৈতে Health Connect একত্ৰিত কৰাটো অব্যাহত ৰাখিবলৈ টিপক। আপোনাৰ ডেটা ৰাখিবলৈ, এইটো <xliff:g id="TIME_NEEDED">%1$s</xliff:g>ৰ ভিতৰত সম্পূৰ্ণ কৰক"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Android ছিষ্টেমটোৰ সৈতে Health Connect একত্ৰিত কৰাটো অব্যাহত ৰাখিবলৈ টিপক।"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"অব্যাহত ৰাখক"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect একত্ৰিত কৰাটো পুনৰ আৰম্ভ কৰক"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"আপোনাৰ ডেটা ৰাখিবলৈ, এইটো <xliff:g id="TIME_NEEDED">%1$s</xliff:g>ৰ ভিতৰত সম্পূৰ্ণ কৰক"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"এপ্‌টো আপডে’ট কৰাৰ প্ৰয়োজন"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connectৰ সৈতে ছিংক কৰা অব্যাহত ৰাখিবলৈ <xliff:g id="APP_NAME">%1$s</xliff:g> আপডে’ট হৈ থাকিব লাগিব"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connectৰ সৈতে ছিংক কৰা অব্যাহত ৰাখিবলৈ কিছুমান এপ্ আপডে’ট হৈ থাকিব লাগিব"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connectৰ সৈতে ছিংক কৰাটো অব্যাহত ৰাখিবলৈ <xliff:g id="APP_NAME">%1$s</xliff:g> আপডে’ট হৈ থাকিব লাগিব। আটাইবোৰ এপৰ বাবে আপডে’ট উপলব্ধ নহ’বও পাৰে।"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connectৰ সৈতে ছিংক কৰাটো অব্যাহত ৰাখিবলৈ কিছুমান এপ্‌ আপডে’ট কৰিব লাগিব। আটাইবোৰ এপৰ বাবে আপডে’ট উপলব্ধ নহ’বও পাৰে।"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"আপডে’ট আছে নেকি চাওক"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"অধিক জানক"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect একত্ৰিত কৰা"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connectৰ একত্ৰিত কৰাটো সম্পূৰ্ণ হোৱা নাই"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"আপুনি পুনৰ এইটো উপলব্ধ হ’লে জাননী পাব।"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"বুজি পালোঁ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connectৰ একত্ৰিত কৰাটো সম্পূৰ্ণ হোৱা নাই"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"অধিক পঢ়ক"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect একত্ৰিত কৰাটো সম্পূৰ্ণ হৈছে"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"খোলক"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"নতুন কি আছে"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"আপুনি এতিয়া আপোনাৰ ছেটিঙৰ পৰা পোনপটীয়াকৈ Health Connect এক্সেছ কৰিব পাৰে। ষ্ট’ৰেজৰ ঠাই খালী কৰিবলৈ যিকোনো সময়তে Health Connect এপ্‌টো আনইনষ্টল কৰক।"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"বুজি পালোঁ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"এপৰ উৎস সম্পাদনা কৰক"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ডিভাইচৰ ডিফ’ল্ট"</string>
     <string name="app_data_title" msgid="6499967982291000837">"এপৰ ডেটা"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connectৰ এক্সেছ থকা এপ্‌সমূহৰ ডেটা ইয়াত দেখুওৱা হ’ব"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ ডেটাখিনি ইয়াত দেখা পোৱা যাব"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connectৰ এক্সেছ থকা এপ্‌সমূহৰ ডেটা ইয়াত দেখুওৱা হ’ব"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"দিন"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"সপ্তাহ"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"মাহ"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"যোৱা মাহ"</string>
     <string name="tab_entries" msgid="3402700951602029493">"প্ৰৱিষ্টি"</string>
     <string name="tab_access" msgid="7818197975407243701">"এক্সেছ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক অতিৰিক্ত এক্সেছৰ অনুমতি দিবনে?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ Health Connectৰ এই ছেটিংসমূহো এক্সেছ কৰিবলৈ বিচাৰে"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"এই এপ্‌টোৰ বাবে নেপথ্য অথবা পূৰ্বৰ ডেটা এক্সেছ কৰাৰ সুবিধা অন কৰিবলৈ অতি কমেও এটা পঢ়াৰ অনুমতি সক্ষম কৰক"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"এই এপ্‌টোৰ বাবে নেপথ্য এক্সেছ কৰাৰ সুবিধা অন কৰিবলৈ অতি কমেও এটা পঢ়াৰ অনুমতি সক্ষম কৰক"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"এই এপ্‌টোৰ বাবে পূৰ্বৰ ডেটা এক্সেছ কৰাৰ সুবিধা অন কৰিবলৈ অতি কমেও এটা পঢ়াৰ অনুমতি সক্ষম কৰক"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect ব্যৱহাৰ কৰা আৰম্ভ কৰক"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"আপোনাৰ প্ৰথম এপ্‌সমূহৰ মাজত স্বাস্থ্য আৰু শৰীৰচৰ্চাৰ ডেটা শ্বেয়াৰ কৰিবলৈ সেইবোৰ ছিংক কৰক"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"ছেট আপ কৰক"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"সমিল এপ্‌ চাওক"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connectৰ জৰিয়তে <xliff:g id="APP_NAME">%s</xliff:g>ৰ সৈতে ছিংক কৰিবলৈ অধিক এপ্‌বিচাৰক"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"app storeত চাওক"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"এটা স্ক্ৰীন লক ছেট কৰক"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"আপোনাৰ স্বাস্থ্য সম্পৰ্কীয় তথ্যৰ অতিৰিক্ত সুৰক্ষাৰ বাবে, এই ডিভাইচৰ বাবে এটা পিন, আৰ্হি, বা পাছৱৰ্ড ছেট কৰক"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"স্ক্ৰীন লক ছেট কৰক"</string>
     <string name="select_all" msgid="837499881590001166">"আটাইবোৰ বাছনি কৰক"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"সংযুক্ত এপ্‌সমূহে আৰু Health Connectৰ পৰা এই ডেটা পঢ়িব নোৱাৰিব"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"টিক চিহ্ন দিয়া হৈছে"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"টিক চিহ্ন দিয়া হোৱা নাই"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"ব্যায়ামৰ মেপৰ পথ উপলব্ধ"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"পৰৱৰ্তী দিন"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"পৰৱৰ্তী সপ্তাহ"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"পৰৱৰ্তী মাহ"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"পূৰ্বৱৰ্তী দিন"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"পূৰ্বৱৰ্তী সপ্তাহ"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"পূৰ্বৱৰ্তী মাহ"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"আটাইবোৰ ডেটা স্থায়ীভাৱে মচিবনে?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"বাছনি কৰা ডেটা স্থায়ীভাৱে মচিবনে?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g>ৰ আটাইবোৰ ডেটা স্থায়ীভাৱে মচিবনে?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>ৰ সপ্তাহৰ বাবে <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাছনি কৰা প্ৰৱিষ্টিসমূহ স্থায়ীভাৱে মচিবনে?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>ৰ বাবে <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাছনি কৰা প্ৰৱিষ্টিসমূহ স্থায়ীভাৱে মচিবনে?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"<xliff:g id="APP_NAME">%s</xliff:g>ৰ এই প্ৰৱিষ্টিটো স্থায়ীভাৱে মচিবনে?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g>ৰ বাবে আটাইবোৰ <xliff:g id="DATA_TYPE">%1$s</xliff:g> ডেটা স্থায়ীভাৱে মচিবনে?"</string>
+    <string name="on" msgid="8266542510798355807">"অন আছে"</string>
+    <string name="off" msgid="6996623844428550649">"অফ আছে"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g>ত এক্সেছ কৰিছিল"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"কালি <xliff:g id="TIME_DATE">%1$s</xliff:g>ত এক্সেছ কৰিছিল"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>ত এক্সেছ কৰিছিল"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"সদায় অনুমতি দিয়ক"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"বছাবোৰৰ অনুমতি দিয়ক"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"এপ্‌টো ব্যৱহাৰ কৰি থকাৰ সময়ত"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"সকলো প্ৰত্যাখ্যান কৰক"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক ফিটনেছ আৰু সুস্থতাৰ ডেটা এক্সেছ কৰিবলৈ দিবনে?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ <xliff:g id="DATA_TYPES">%2$s</xliff:g> এক্সেছ কৰিবলৈ অনুৰোধ কৰিছে।\n\nআটাইবোৰৰ অনুমতি দিবলৈ বাছনি কৰক বা সেইসমূহ গাইগুটীয়াকৈ নিয়ন্ত্ৰণ কৰক।"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক <xliff:g id="DATA_TYPE">%2$s</xliff:g> এক্সেছ কৰিবলৈ অনুমতি দিবনে?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ফিটনেছ আৰু সুস্থতা"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"সকলো সময়তে"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ব্যৱহাৰ হৈ থাকোঁতে"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"সকলো সময়তে"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ব্যৱহাৰ হৈ থাকোঁতে"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ ফিটনেছ আৰু সুস্থতা সম্পৰ্কীয় ডেটা <xliff:g id="ALLOW_MODE">%2$s</xliff:g> এক্সেছ কৰিব পাৰে"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"এক্সেছৰ অনুমতি দিয়া হৈছে"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"পঢ়িবলৈ অনুমতি দিয়া হৈছে"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"এই অনুমতিসমূহে <xliff:g id="APP_NAME">%1$s</xliff:g>ক আপোনাৰ ডিভাইচৰ ছেন্সৰৰ পৰা ডেটা এক্সেছ কৰিবলৈ দিয়ে।"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g>ৰ ভিতৰত <xliff:g id="NUMBER_0">%1$d</xliff:g>টা এপক অনুমতি দিয়া হৈছে"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"কোনো এপৰ অনুৰোধ জনোৱা হোৱা নাই"</string>
+    <string name="allowed" msgid="4158456017482263737">"অনুমতি দিয়া হৈছে"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"অনুমতি নাই"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"আপোনাৰ ডিভাইচৰ ছেন্সৰৰ পৰা এই অনুমতি থকা এপ্‌সমূহে <xliff:g id="DATA_TYPE">%s</xliff:g> ডেটা এক্সেছ কৰিব পাৰে।"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"আপোনাৰ ঘড়ীত আটাইবোৰ এপৰ বাবে <xliff:g id="DATA_TYPE">%s</xliff:g>ৰ এক্সেছ আঁতৰাবনে?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"টিক চিহ্ন"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"কটাৰ চিহ্ন"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"বৰ্তমান, <xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ ফিটনেছ আৰু সুস্থতা সম্পৰ্কীয় ডেটা এক্সেছ কৰিব পাৰে <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক সকলো সময়তে ফিটনেছ আৰু সুস্থতা সম্পৰ্কীয় ডেটাৰ এক্সেছ দিবনে?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ <xliff:g id="DATA_TYPES">%2$s</xliff:g> এক্সেছ কৰিব পাৰে।"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ফিটনেছ আৰু সুস্থতাৰ অনুমতি পৰিচালনা কৰক"</string>
 </resources>
diff --git a/apk/res/values-az/strings.xml b/apk/res/values-az/strings.xml
index 312d6d4..d93a1e7 100644
--- a/apk/res/values-az/strings.xml
+++ b/apk/res/values-az/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Cihazda sağlamlıq və fitnes datasını idarə edin və hansı tətbiqlərin ona daxil ola biləcəyinə nəzarət edin"</string>
     <string name="data_title" msgid="4456619761533380816">"Data və giriş"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Sağlamlıq qeydlərinə nəzər salın"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Sağlamlıq qeydlərinizə və hansı tətbiqlərin onlara daxil ola biləcəyinə baxın"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Bütün kateqoriyalar"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Bütün kateqoriyalara baxın"</string>
     <string name="no_data" msgid="1906986019249068659">"Məlumat yoxdur"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Dünən"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Oxuma: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Yazma: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"İcazələri idarə edin"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Saat: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Fəaliyyət"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"sağlamlıq datanıza giriş"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Sərf edilmiş kalorini oxumaq"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Tətbiqə sərf edilmiş kaloriləri oxumağa imkan verir"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Arxa fon datasına giriş"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə arxa fon datasına giriş icazəsi verilsin?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə arxa fonda dataya giriş icazəsi verilsin?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"İcazə versəniz, tətbiqdən istifadə etmədiyiniz zaman bu tətbiq fitnes və sağlamlıq datasına, eləcə də sağlamlıq qeydlərinə daxil ola bilər."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"İcazə versəniz, tətbiqdən istifadə etmədiyiniz zaman bu tətbiq sağlamlıq qeydlərinə daxil ola bilər."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"İcazə versəniz, tətbiqdən istifadə etmədiyiniz zaman bu tətbiq fitnes və sağlamlıq datasına daxil ola bilər."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"İcazə versəniz, tətbiqdən istifadə etmədiyiniz zaman bu tətbiq Health Connect datasına daxil ola bilər."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə keçmiş dataya giriş icazəsi verilsin?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"İcazə versəniz, bu tətbiq <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarixindən əvvəl əlavə edilmiş fitnes və sağlamlıq datasına daxil ola bilər."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"İcazə versəniz, bu tətbiq bütün keçmiş fitnes və sağlamlıq datasına daxil ola bilər."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"İcazə versəniz, bu tətbiq <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarixindən əvvəl əlavə edilmiş Health Connect datasına daxil ola bilər."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"İcazə versəniz, bu tətbiq bütün keçmiş Health Connect datasına daxil ola bilər."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə əlavə giriş verilsin?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> həmçinin bu Health Connect ayarlarına giriş istəyir"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Arxa fonda bütün dataya daxil olun"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Arxa fonda sağlamlıq qeydlərinə daxil olun"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Arxa fonda fitnes və sağlamlıq datasına daxil olun"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Tətbiqdən istifadə etmədiyiniz zaman bu tətbiqin fitnes və sağlamlıq datasına, eləcə də sağlamlıq qeydlərinə daxil olmasına icazə verin"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Tətbiqdən istifadə etmədiyiniz zaman bu tətbiqin dataya daxil olmasına icazə verin"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Tətbiqdən istifadə etmədiyiniz zaman bu tətbiqin dataya daxil olmasına icazə verin"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Arxa fonda dataya giriş"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Tətbiqdən istifadə edilmədiyi zaman bu tətbiqin Health Connect datasına daxil olmasına icazə verin"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Keçmiş fitnes və sağlamlıq datasına giriş"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Bu tətbiqin <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarixindən əvvəl əlavə edilmiş dataya daxil olmasına icazə verin"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Bu tətbiqin bütün keçmiş dataya daxil olmasına icazə verin"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Keçmiş dataya giriş"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Bu tətbiqin <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarixindən əvvəl əlavə edilmiş Health Connect datasına girişinə icazə verin"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Bu tətbiqin bütün keçmiş Health Connect datasına girişinə icazə verin"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> sağlamlıq qeydləri üçün keçmiş dataya daxil ola bilər"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"İcazələr haqqında ətraflı oxuyun"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Arxa fonda bütün dataya daxil olun"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Arxa fonda sağlamlıq qeydlərinə daxil olun"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Arxa fonda fitnes və sağlamlıq datasına daxil olun"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Tətbiqdən istifadə etmədiyiniz zaman bu tətbiqin fitnes və sağlamlıq datasına, eləcə də sağlamlıq qeydlərinə daxil olmasına icazə verin"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Tətbiqdən istifadə etmədiyiniz zaman bu tətbiqin dataya daxil olmasına icazə verin"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Tətbiqdən istifadə etmədiyiniz zaman bu tətbiqin dataya daxil olmasına icazə verin"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Arxa fonda dataya giriş"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Tətbiqdən istifadə edilmədiyi zaman bu tətbiqin Health Connect datasına daxil olmasına icazə verin"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Keçmiş fitnes və sağlamlıq datasına giriş"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Bu tətbiqin <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarixindən əvvəl əlavə edilmiş dataya daxil olmasına icazə verin"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Bu tətbiqin bütün keçmiş dataya daxil olmasına icazə verin"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Keçmiş dataya giriş"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Bu tətbiqin <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarixindən əvvəl əlavə edilmiş Health Connect datasına girişinə icazə verin"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Bu tətbiqin bütün keçmiş Health Connect datasına girişinə icazə verin"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin oxumaq icazəsi olmadığı üçün hazırda heç bir fitnes datası oxunmur"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> sağlamlıq qeydləri üçün keçmiş dataya daxil ola bilər. Bunu dəyişmək üçün bu tətbiqin sağlamlıq qeydi icazələrini deaktiv edin"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Sağlamlıq qeydi icazələrini idarə edin"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Bu tətbiq üçün arxa fon və ya keçmiş dataya girişi yandırmaq məqsədilə ən az bir oxumaq icazəsini aktivləşdirin"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Bu tətbiq üçün arxa fonda girişi yandırmaq məqsədilə ən az bir oxumaq icazəsini aktivləşdirin"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Bu tətbiq üçün keçmiş dataya girişi yandırmaq məqsədilə ən az bir oxumaq icazəsini aktivləşdirin"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Bu tətbiqin bütün keçmiş Health Connect datasına girişinə icazə verin"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Bu tətbiqə istifadə edilmədiyi zaman Health Connect datasına giriş icazəsi verin"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"İcazə versəniz, bu tətbiq istifadə etmədiyiniz zaman Health Connect datasına daxil ola bilər."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Keçmiş dataya giriş"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə keçmiş dataya giriş icazəsi verilsin?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Bu tətbiqin <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarixindən əvvəl əlavə edilmiş Health Connect datasına girişinə icazə verin"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Bu tətbiqin bütün keçmiş Health Connect datasına girişinə icazə verin"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"İcazə versəniz, bu tətbiq added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarixindən əvvəl əlavə edilmiş Health Connect datasına daxil ola bilər."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"İcazə versəniz, bu tətbiq bütün keçmiş Health Connect datasına daxil ola bilər."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Sərf edilmiş aktiv kalori"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"sərf edilmiş aktiv kalori"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Sərf edilmiş aktiv kalorini oxumaq"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"əlil arabası təkanı"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Əlil arabası təkanını oxumaq"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Əlil arabası təkanını yazmaq"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Fəaliyyət intensivliyi"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"fəaliyyət intensivliyi"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Fəaliyyət intensivliyini oxuyun"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Fəaliyyət intensivliyini yazın"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Əsas metabolik səviyyə"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"əsas metabolik səviyyə"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Bazal metabolik dərəcəni oxumaq"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"dəri temperaturu"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Dəri temperaturunun oxunması"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Dəri temperaturunun yazılması"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Buraya Health Connect ilə sinxronlaşdırılan və ona əlavə edilən bütün sağlamlıq qeydləri daxildir. Bu, sağlamlıq tarixçənizi tam əhatə etməyə bilər və sağlamlıq qeydlərinizin tibbi təsvirini ehtiva etmir."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Bütün sağlamlıq qeydləri"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"bütün sağlamlıq qeydləri"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Bütün sağlamlıq qeydlərini əlavə edin"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergiyalar"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergiyalar"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Allergiyalar haqqında oxuyun"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Peyvənd"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"peyvənd"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Peyvəndin oxunması"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratoriya Nəticələri"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratoriya nəticələri"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Laboratoriya nəticələrini oxuyun"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergiyalar"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergiyalar"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Allergiyalar haqqında oxuyun"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Vəziyyətlər"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"vəziyyətlər"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Şərtləri oxuyun"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Peyvəndlər"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"peyvəndlər"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Peyvəndlər haqqında oxuyun"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratoriya nəticələri"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratoriya nəticələri"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Laboratoriya nəticələrini oxuyun"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Dərmanlar"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"dərmanlar"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Dərmanları oxuyun"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Şəxsi məlumatlar"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"şəxsi məlumatlar"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Şəxsi məlumatları oxuyun"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Peşəkar məlumatları"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"peşəkar məlumatları"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Peşəkar məlumatlarını oxuyun"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Hamiləlik"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"hamiləlik"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Hamiləlik haqqında oxuyun"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemlər"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemlər"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Problemləri oxuyun"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Prosedurlar"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"prosedurlar"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Prosedurları oxuyun"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sosial Tarixçə"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sosial tarixçə"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sosial tarixçə"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Sosial tarixçəni oxuyun"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Həyati Əlamətlər"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Müraciətlər"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"müraciətlər"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Müraciətləri oxuyun"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Həyati əlamətlər"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"həyati əlamətlər"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Həyati əlamətləri oxuyun"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Zehinlilik"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Zehinliliyin yazılması"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" tətbiqinə oxumaq üçün icazə verin"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" tətbiqinə yazmaq üçün icazə verin"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Ləğv edin"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"İcazə verin"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Hamısına icazə verin"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"İcazə verməyin"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Bu tətbiqin Health Connect\'də oxumasını və ya yazmasını istədiyiniz datanı seçin"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Bu tətbiqin Health Connect-də oxumasını və ya yazmasını istədiyiniz datanı seçin"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Bu tətbiqin Health Connect-də oxumasını istədiyiniz datanı seçin"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Bu tətbiqin Health Connect-də yazmasını istədiyiniz datanı seçin"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Oxumaq icazəsi versəniz, tətbiq yeni datanı və son 30 günə aid datanı oxuya bilər"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Oxumaq icazəsi versəniz, tətbiq yeni və keçmiş datanı oxuya bilər"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə Health Connect\'ə giriş icazəsi verilsin?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Tərtibatçının <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> bölməsində <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin məlumatlarınızı necə idarə etdiyini öyrənə bilərsiniz"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin fitnes və sağlamlıq datasına daxil olmasına icazə verilsin?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin datanı necə idarə etdiyini <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> bölməsində öyrənə bilərsiniz"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"məxfilik siyasəti"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin sağlamlıq qeydlərinə daxil olmasına icazə verilsin?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"İcazə versəniz, tətbiq allergiya, laboratoriya nəticələri, peyvəndlər və s. kimi datanı oxuya və yaza bilər\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"İcazə versəniz, tətbiq allergiya, laboratoriya nəticələri, peyvəndlər və s. kimi datanı oxuya bilər\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Sağlamlıq qeydləri haqqında"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Paylaşılacaq dataya daxildir"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"İcazə versəniz, <xliff:g id="APP_NAME">%1$s</xliff:g> sağlamlıq qeydlərini Health Connect ilə paylaşa bilər."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sağlamlıq qeydlərini bir yerdə saxlamaq üçün fərqli tətbiq və mənbələrdən sinxronlaşdırın"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Bütün icazələr silinsin?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Hamısını silin"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect-dən heç bir datanı oxuya və ya yaza bilməyəcək.\n\nBu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələr təsirə məruz qalmır."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect-dən keçmiş dataya giriş daxil olmaqla heç bir datanı oxumayacaq və ya yazmayacaq.\n\nTətbiqin məkan, kamera və ya mikrofon kimi digər icazələrinə təsir etmir."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect-dən arxa fon və keçmiş data da daxil olmaqla heç bir datanı oxumayacaq və ya yazmayacaq.\n\nTətbiqin məkan, kamera və ya mikrofon kimi digər icazələrinə təsir etmir."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Həmçinin Health Connect\'dən <xliff:g id="APP_NAME">%1$s</xliff:g> datasını silin"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Bütün icazələr silinsin?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Bütün sağlamlıq qeydi icazələri silinsin?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Bütün fitnes və sağlamlıq icazələri silinsin?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Həmçinin Health Connect vasitəsilə <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqindən fitnes datası silin"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Bütün sağlamlıq qeydi icazələri silinsin?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Həmçinin Health Connect vasitəsilə <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqindən sağlamlıq qeydlərini silin"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> artıq Health Connect-dən bu datanı oxuya və ya yaza bilməyəcək.\n\nBu, bu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələrə təsir etmir."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Arxa fon datası daxil olmaqla <xliff:g id="APP_NAME">%1$s</xliff:g> artıq Health Connect-dən bu datanı oxuya və ya yaza bilməyəcək.\n\nBu, bu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələrə təsir etmir."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Keçmiş data daxil olmaqla <xliff:g id="APP_NAME">%1$s</xliff:g> artıq Health Connect-dən bu datanı oxuya və ya yaza bilməyəcək.\n\nBu, bu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələrə təsir etmir."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Arxa fon və keçmiş data daxil olmaqla <xliff:g id="APP_NAME">%1$s</xliff:g> artıq Health Connect-dən bu datanı oxuya və ya yaza bilməyəcək.\n\nBu, bu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələrə təsir etmir."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Bütün icazələr silinsin?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> artıq Health Connect-dən datanı oxuya və ya yaza bilməyəcək.\n\nBu, bu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələrə təsir etmir."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Arxa fon datası daxil olmaqla <xliff:g id="APP_NAME">%1$s</xliff:g> artıq Health Connect-dən datanı oxuya və ya yaza bilməyəcək.\n\nBu, bu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələrə təsir etmir."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Keçmiş data daxil olmaqla <xliff:g id="APP_NAME">%1$s</xliff:g> artıq Health Connect-dən datanı oxuya və ya yaza bilməyəcək.\n\nBu, bu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələrə təsir etmir."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Arxa fon və keçmiş data daxil olmaqla <xliff:g id="APP_NAME">%1$s</xliff:g> artıq Health Connect-dən datanı oxuya və ya yaza bilməyəcək.\n\nBu, bu tətbiqin kamera, mikrofon və ya məkan kimi malik ola biləcəyi digər icazələrə təsir etmir."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Həmçinin Health Connect vasitəsilə <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqindən fitnes datası və sağlamlıq qeydlərini silin"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Bu tətbiq üçün silinən icazələr"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Həmçinin bütün Health Connect datasını silin"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Növbəti gün"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Seçilmiş gün"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Əvvəlki gün"</string>
     <string name="default_error" msgid="7966868260616403475">"Xəta oldu. Yenidən cəhd edin."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Naməlum Resurs"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Mənbə datası"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Sol mötərizə."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Sağ mötərizə."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> <xliff:g id="FIELD">%2$s</xliff:g> Sahəsi üzrə dəyər"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Bu tətbiqlərin artıq girişi yoxdur, lakin hələ də Health Connect\'də data saxlayırlar"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> tarixindən sonra əlavə edilən datanı oxuya bilər"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Bu tətbiqin daxil ola biləcəyi digər Android icazələrini idarə etmək üçün Ayarlar &gt; Tətbiqlər bölməsinə keçin"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilə paylaşdığınız data onun məxfilik siyasəti ilə qorunur"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Developerin məxfilik siyasətində <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin datanı necə idarə etdiyini öyrənə bilərsiniz"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Bu tətbiqin daxil ola biləcəyi digər Android icazələrini idarə etmək üçün Ayarlara keçin, sonra Tətbiqlər seçiminə toxunun"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Məxfilik Siyasətini oxuyun"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Son 24 saat ərzində giriş edilib"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Tətbiq girişi"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Quraşdırılmış uyğun tətbiq yoxdur"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Əlavə giriş"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Keçmiş data, fon rejimi"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Bu tətbiq üçün əlavə icazələr silindi"</string>
     <string name="permissions_header" msgid="6519976063360071569">"İcazələr"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitnes və rifah"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"İdman, yuxu, qidalanma və s"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Sağlamlıq qeydləri"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"sağlamlıq qeydləri"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab. nəticələri, dərmanlar, immunizasiya və s"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Lab. nəticəsi, dərman, peyvənd və s."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Tətbiq icazələri silinib"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect bunlar üçün icazələri silib: <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect bunlar üçün icazələri silib: <xliff:g id="APP_DATA_0">%1$s</xliff:g> və <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Marketə keçin"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect ilə başlayın"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect sağlamlıq və fitnes datanızı saxlayaraq cihazdakı müxtəlif tətbiqləri sinxronlaşdırmaq üçün sadə yol təqdim edir"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect müxtəlif tətbiqlərdən sağlamlıq və fitnes datanızı saxlayır və sinxronlaşdırır.\n\n"<b>"İdman seansları, addımlar, qidalanma, yuxu və s."</b>" daxil olmaqla fitnes və sağlamlıq datası\n\n"<b>"Peyvəndlər, laboratoriya nəticələri və s."</b>" daxil olmaqla sağlamlıq qeydləri"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ilə bunları edə bilərsiniz:"</string>
     <string name="share_data" msgid="3481932156368883946">"Tətbiqlərinizlə data paylaşın"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Hər bir tətbiqin Health Connect\'də oxuya və ya yaza biləcəyi datanı seçin"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Ayarlarınızı və məxfiliyinizi idarə edin"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Yüngül axıntı"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Orta axıntı"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Güclü axıntı"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Naməlum axın"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruasiya günü <xliff:g id="DAY">%1$d</xliff:g>/<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruasiya dövrü (1 gün)}other{Menstruasiya dövrü (# gün)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitiv"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Neqativ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Yüksək"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musiqi"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Digər"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Təlimatsız"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Orta"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Güclü"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> d"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> s <xliff:g id="MIN">%2$s</xliff:g> dəq"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> s"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"İnteqrasiya edilir"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect Android sistemi ilə inteqrasiya edilir.\n\nData və icazələrin ötürülməsi bir qədər vaxt apara bilər."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Proses tamamlanana qədər tətbiqi bağlamayın."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect inteqrasiya edilir"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Güncəllənmə lazımdır"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Ayarlardan daxil ola bilməyiniz üçün Health Connect Android sistemi ilə inteqrasiya edilir."</string>
     <string name="update_button" msgid="4544529019832009496">"Güncəlləyin"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Health Connect-in sistem ayarları ilə inteqrasiyaya davam etməsi üçün bu güncəllənməni başladın"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"İndi güncəlləyin"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Sistem güncəllənməlidir"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Davam etməzdən əvvəl telefon sistemini güncəlləyin."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Telefon sistemi güncəllənibsə, inteqrasiyaya davam etmək üçün telefonu yenidən başladın"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect güncəllənməlidir"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Davam etməzdən əvvəl Health Connect tətbiqini son versiyaya güncəlləyin."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Daha çox yer lazımdır"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"İnteqrasiyanın davam etməsi üçün Health Connect telefonda <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> yaddaş yeri tələb edir.\n\nTelefonda yer boşaldıb, yenidən cəhd edin."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Yenə sınayın"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Yer boşaldın"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Daha çox yer lazımdır"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"İnteqrasiyaya davam etmək üçün Health Connect telefonda <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> yaddaş yeri tələb edir."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"İnteqrasiyaya pauza verildi"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Android sistemi ilə inteqrasiya zamanı Health Connect bağlandı.\n\nTətbiqi yenidən açmaq üçün \"bərpa edin\" üzərinə klikləyin, data və icazələrin ötürülməsinə davam edin."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect datasını saxlamaq üçün <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ərzində tamamlayın"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect-in Android sistemi ilə inteqrasiyasını davam etdirmək üçün toxunun. Datanı saxlamaq üçün <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ərzində tamamlayın"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect-in Android sistemi ilə inteqrasiyasını davam etdirmək üçün toxunun."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Davam edin"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect inteqrasiyasını bərpa edin"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Datanı saxlamaq üçün <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ərzində tamamlayın"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Tətbiq güncəllənməlidir"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect ilə sinxronlaşdırmağa davam etmək üçün <xliff:g id="APP_NAME">%1$s</xliff:g> güncəllənməlidir"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect ilə sinxronlaşdırmağa davam etmək üçün bəzi tətbiqlər güncəllənməlidir"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect ilə sinxronlaşdırmağa davam etmək üçün <xliff:g id="APP_NAME">%1$s</xliff:g> güncəllənməlidir. Bütün tətbiqlər üçün güncəllənmə əlçatan olmaya bilər."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect ilə sinxronlaşdırmağa davam etmək üçün bəzi tətbiqlər güncəllənməlidir. Bütün tətbiqlər üçün güncəllənmə əlçatan olmaya bilər."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Güncəllənmələri yoxlayın"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Ətraflı məlumat"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect inteqrasiyası"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect inteqrasiya edilmədi"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Yenidən əlçatan olduqda bildiriş alacaqsınız."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Anladım"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect inteqrasiya edilmədi"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Ətraflı oxuyun"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect inteqrasiya edildi"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Açın"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Yeniliklər"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Birbaşa ayarlardan Health Connect-ə daxil ola bilərsiniz. Yaddaş yerini artırmaq üçün Health Connect tətbiqini sistemdən silin."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Anladım"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Tətbiq mənbələrini redaktə edin"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Cihaz defoltu"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Tətbiq datası"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect-ə girişi olan tətbiqlərin datası burada göstəriləcək"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> datası burada görünəcək"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect-ə girişi olan tətbiqlərin datası burada görünəcək"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Gün"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Həftə"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Ay"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Keçən ay"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Daxiletmələr"</string>
     <string name="tab_access" msgid="7818197975407243701">"Giriş"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə əlavə giriş verilsin?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> həmçinin bu Health Connect ayarlarına giriş istəyir"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Bu tətbiq üçün arxa fon və ya keçmiş dataya girişi yandırmaq məqsədilə ən az bir oxumaq icazəsini aktivləşdirin"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Bu tətbiq üçün arxa fonda girişi yandırmaq məqsədilə ən az bir oxumaq icazəsini aktivləşdirin"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Bu tətbiq üçün keçmiş dataya girişi yandırmaq məqsədilə ən az bir oxumaq icazəsini aktivləşdirin"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect istifadəsinə başlayın"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sağlamlıq və fitnes datanızı paylaşmaq üçün ilk tətbiqləri sinxronlaşdırın"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Ayarlayın"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Uyğun tətbiqlərə baxın"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect vasitəsilə <xliff:g id="APP_NAME">%s</xliff:g> ilə sinxronlaşdırmaq üçün digər tətbiqləri tapın"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Tətbiq mağazasında baxın"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ekran kilidini ayarlayın"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Sağlamlıq datanızın əlavə təhlükəsizliyi üçün bu cihaza PIN, model və ya parol təyin edin"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Ekran kilidi ayarlayın"</string>
     <string name="select_all" msgid="837499881590001166">"Hamısını seçin"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Əlaqələndirilmiş tətbiqlər artıq bu Health Connect datasına giriş edə bilməyəcək"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"İşarələnib"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"İşarələnməyib"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Məşq xəritəsi marşrutu əlçatandır"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Növbəti gün"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Növbəti həftə"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Növbəti ay"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Keçən gün"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Keçən həftə"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Keçən ay"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Bütün data həmişəlik silinsin?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Seçilmiş data həmişəlik silinsin?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Bütün <xliff:g id="APP_NAME">%s</xliff:g> datası həmişəlik silinsin?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> tarixli həftə üzrə seçilmiş <xliff:g id="APP_NAME">%1$s</xliff:g> daxiletmələri həmişəlik silinsin?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> tarixi üzrə seçilmiş <xliff:g id="APP_NAME">%1$s</xliff:g> daxiletmələri həmişəlik silinsin?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Bu <xliff:g id="APP_NAME">%s</xliff:g> daxiletməsi həmişəlik silinsin?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqinin <xliff:g id="DATA_TYPE">%1$s</xliff:g> datası həmişəlik silinsin?"</string>
+    <string name="on" msgid="8266542510798355807">"Aktiv"</string>
+    <string name="off" msgid="6996623844428550649">"Deaktiv"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Daxil olunub: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Daxil olunub: dünən <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Daxil olunub: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Həmişə icazə verin"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Seçilənə icazə verin"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Tətbiqdən istifadə edərkən"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Hamısını rədd edin"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin fitnes və sağlamlıq datasına daxil olmasına icazə verilsin?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g> datasına giriş tələb edir.\n\nHamısına icazə verməyi və ya ayrı-ayrılıqda nəzarət etməyi seçin."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə <xliff:g id="DATA_TYPE">%2$s</xliff:g> datası üçün giriş icazəsi verilsin?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitnes və sağlamlıq"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"hər zaman"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"istifadə edilən zaman"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Hər zaman"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"İstifadə edilən zaman"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> bütün fitnes və sağlamlıq datanıza daxil ola bilər <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Girişə icazə verilir"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Oxumağa icazə verilir"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Bu icazələr <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin cihaz sensorlarından dataya girişinə imkan verir."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> tətbiqdən <xliff:g id="NUMBER_0">%1$d</xliff:g> ədədi icazəlidir"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Heç bir tətbiq tələb olunmur"</string>
+    <string name="allowed" msgid="4158456017482263737">"İcazə verilib"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"İcazə verilməyib"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Bu icazəyə malik tətbiqlər cihaz sensorlarından <xliff:g id="DATA_TYPE">%s</xliff:g> tipli dataya daxil ola bilər."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Saatınızdakı bütün tətbiqlər üçün <xliff:g id="DATA_TYPE">%s</xliff:g> girişi silinsin?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Təsdiq işarəsi"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Çarpaz nişan"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Hazırda <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin fitnes və sağlamlıq datasına giriş icazəsi var (<xliff:g id="ALLOW_MODE">%2$s</xliff:g>)"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə hər zaman fitnes və sağlamlıq datasına giriş icazəsi verilsin?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinin <xliff:g id="DATA_TYPES">%2$s</xliff:g> datasına giriş icazəsi var."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Fitnes və sağlamlıq icazələrini idarə edin"</string>
 </resources>
diff --git a/apk/res/values-b+sr+Latn/strings.xml b/apk/res/values-b+sr+Latn/strings.xml
index 9788069..f1e673d 100644
--- a/apk/res/values-b+sr+Latn/strings.xml
+++ b/apk/res/values-b+sr+Latn/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Upravljajte podacima o zdravlju i fitnesu na uređaju i kontrolišite koje aplikacije mogu da im pristupaju"</string>
     <string name="data_title" msgid="4456619761533380816">"Podaci i pristup"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Pregledaj zdravstvenu evidenciju"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Pogledajte zdravstvenu evidenciju i koje aplikacije mogu da joj pristupaju"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Sve kategorije"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Prikaži sve kategorije"</string>
     <string name="no_data" msgid="1906986019249068659">"Nema podataka"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Juče"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Pročitano je: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Upisano je: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Upravljaj dozvolama"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Vreme: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivnosti"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"pristup podacima o zdravlju"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Čitanje potrošenih kalorija"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Dozvoljava aplikaciji da čita potrošene kalorije"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Pristup podacima u pozadini"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Želite da dozvolite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima u pozadini?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Želite da dozvolite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima u pozadini?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ako dozvolite, ova aplikacija može da pristupa podacima o fitnesu, velnesu i zdravstvenoj evidenciji kada je ne koristite."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ako dozvolite, ova aplikacija može da pristupa zdravstvenoj evidenciji kada je ne koristite."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ako dozvolite, ova aplikacija može da pristupa podacima o fitnesu i velnesu kada je ne koristite."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ako dozvolite, ova aplikacija može da pristupa podacima Povezivanja zdravlja kada je ne koristite."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Želite da dozvolite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa ranijim podacima?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ako dozvolite, ova aplikacija može da pristupa podacima o fitnesu i velnesu koji su dodati pre: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ako dozvolite, ova aplikacija može da pristupa svim ranijim podacima o fitnesu i velnesu."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ako dozvolite, ova aplikacija može da pristupa podacima Povezivanja zdravlja koji su dodati pre: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ako dozvolite, ova aplikacija može da pristupa svim ranijim podacima Povezivanja zdravlja."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Želite da dozvolite dodatni pristup za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> takođe traži pristup ovim podešavanjima Povezivanja zdravlja"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Pristup svim podacima u pozadini"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Pristup zdravstvenoj evidenciji u pozadini"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Pristup podacima o fitnesu i velnesu u pozadini"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Dozvolite ovoj aplikaciji da pristupa podacima o fitnesu, velnesu i zdravstvenoj evidenciji kada je ne koristite"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Dozvolite ovoj aplikaciji da pristupa ovim podacima kada je ne koristite"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Dozvolite ovoj aplikaciji da pristupa ovim podacima kada je ne koristite"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Pristup podacima u pozadini"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Dozvolite ovoj aplikaciji da pristupa podacima Povezivanja zdravlja kada je ne koristite"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Pristup ranijim podacima o fitnesu i velnesu"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Dozvolite ovoj aplikaciji da pristupa podacima koji su dodati pre: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Dozvolite ovoj aplikaciji da pristupa svim ranijim podacima"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Pristup ranijim podacima"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Dozvolite ovoj aplikaciji da pristupa podacima Povezivanja zdravlja koji su dodati pre: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Dozvolite ovoj aplikaciji da pristupa svim ranijim podacima Povezivanja zdravlja"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> već može da pristupa ranijim podacima zdravstvene evidencije"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Pročitajte više o dozvolama"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Pristup svim podacima u pozadini"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Pristup zdravstvenoj evidenciji u pozadini"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Pristup podacima o fitnesu i velnesu u pozadini"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Dozvolite ovoj aplikaciji da pristupa podacima o fitnesu, velnesu i zdravstvenoj evidenciji kada je ne koristite"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Dozvolite ovoj aplikaciji da pristupa ovim podacima kada je ne koristite"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Dozvolite ovoj aplikaciji da pristupa ovim podacima kada je ne koristite"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Pristup podacima u pozadini"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Dozvolite ovoj aplikaciji da pristupa podacima Povezivanja zdravlja kada je ne koristite"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Pristup ranijim podacima o fitnesu i velnesu"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Dozvolite ovoj aplikaciji da pristupa podacima koji su dodati pre: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Dozvolite ovoj aplikaciji da pristupa svim ranijim podacima"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Pristup ranijim podacima"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Dozvolite ovoj aplikaciji da pristupa podacima Povezivanja zdravlja koji su dodati pre: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Dozvolite ovoj aplikaciji da pristupa svim ranijim podacima Povezivanja zdravlja"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Trenutno se ne čitaju podaci o fitnesu jer <xliff:g id="APP_NAME">%1$s</xliff:g> nema dozvole za čitanje"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> već može da pristupa ranijim podacima zdravstvene evidencije Da biste to promenili, isključite dozvole za zdravstvenu evidenciju za ovu aplikaciju"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Upravljaj dozvolama za zdravstvenu evidenciju"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Omogućite bar jednu dozvolu za čitanje da biste za ovu aplikaciju uključili pristup pozadinskim ili ranijim podacima"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Omogućite bar jednu dozvolu za čitanje da biste za ovu aplikaciju uključili pristup u pozadini"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Omogućite bar jednu dozvolu za čitanje da biste za ovu aplikaciju uključili pristup ranijim podacima"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Dozvolite ovoj aplikaciji da pristupa svim ranijim podacima Povezivanja zdravlja"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Dozvolite ovoj aplikaciji da pristupa podacima Povezivanja zdravlja kada je ne koristite"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ako dozvolite, ova aplikacija može da pristupa podacima Povezivanja zdravlja kada je ne koristite."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Pristup ranijim podacima"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Želite da dozvolite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa ranijim podacima?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Dozvolite ovoj aplikaciji da pristupa podacima Povezivanja zdravlja koji su dodati pre: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Dozvolite ovoj aplikaciji da pristupa svim ranijim podacima Povezivanja zdravlja"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ako dozvolite, ova aplikacija može da pristupa podacima Povezivanja zdravlja koji su dodati pre: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ako dozvolite, ova aplikacija može da pristupa svim ranijim podacima Povezivanja zdravlja."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Utrošene aktivne kalorije"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"utrošene aktivne kalorije"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Čitanje utrošenih aktivnih kalorija"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"guranje invalidskih kolica"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Čitanje podataka o guranju invalidskih kolica"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Upisivanje podataka o guranju invalidskih kolica"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intenzitet aktivnosti"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intenzitet aktivnosti"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Čitanje podataka o intenzitetu aktivnosti"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Pisanje podataka o intenzitetu aktivnosti"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Bazalni metabolizam"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"bazalni metabolizam"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Čitanje podataka o bazalnom metabolizmu"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura kože"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Čitaj podatke o temperaturi kože"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Upisuj podatke o temperaturi kože"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"To obuhvata svu zdravstvenu evidenciju koja je sinhronizovana sa Povezivanjem zdravlja i dodata u njega. Ovo možda nije kompletna medicinska evidencija i ne sadrži medicinski opis zdravstvene evidencije."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Sva zdravstvena evidencija"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"sva zdravstvena evidencija"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Upisivanje sve zdravstvene evidencije"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergije"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergije"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Čitanje podataka o alergijama"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunizacija"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunizacija"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Čitanje podataka o imunizaciji"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorijski rezultati"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorijski rezultati"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Čitanje podataka o laboratorijskim rezultatima"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergije"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergije"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Čitanje podataka o alergijama"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Zdravstveno stanje"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"zdravstveno stanje"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Čitanje podataka o zdravstvenom stanju"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vakcine"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vakcine"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Čitanje podataka o vakcinama"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratorijski rezultati"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratorijski rezultati"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Čitanje podataka o laboratorijskim rezultatima"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Lekovi"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"lekovi"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Čitanje podataka o lekovima"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Lični podaci"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"lični podaci"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"da čitate lične podatke"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Detalji o lekarima i stručnjacima"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"detalji o lekarima i stručnjacima"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"da čitate detalje o lekarima i stručnjacima"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Trudnoća"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"trudnoća"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Čitanje podataka o trudnoći"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemi"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemi"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Čitanje podataka o problemima"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedure"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedure"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Čitanje podataka o procedurama"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Društvene odrednice zdravlja"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Društvene odrednice zdravlja"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"društvene odrednice zdravlja"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Čitanje podataka o društvenim odrednicama zdravlja"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitalni znaci"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Posete"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"posete"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"da čitate podatke o posetama"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitalni znaci"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitalni znaci"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Čitanje vitalnih znaka"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Osvešćenost"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Upisivanje podataka o osvešćenosti"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Dozvola da <xliff:g id="APP_NAME">%1$s</xliff:g> očitava podatke"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Dozvola da <xliff:g id="APP_NAME">%1$s</xliff:g> upisuje podatke"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Otkaži"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Dozvoli"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Dozvoli sve"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ne dozvoli"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Odaberite podatke koje želite da ova aplikacija čita ili upisuje u Povezivanje zdravlja"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Odaberite podatke koje želite da ova aplikacija čita ili upisuje u Povezivanje zdravlja"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Odaberite podatke koje želite da ova aplikacija čita iz Povezivanja zdravlja"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Odaberite podatke koje želite da ova aplikacija upisuje u Povezivanje zdravlja"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ako date pristup za čitanje, aplikacija može da čita nove podatke i podatke iz prethodnih 30 dana"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ako date pristup za čitanje, ova aplikacija može da čita nove i ranije podatke"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Želite da dozvolite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa Povezivanju zdravlja?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"U <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> programera možete da saznate kako <xliff:g id="APP_NAME">%1$s</xliff:g> upravlja vašim podacima"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Želite da dozvolite da <xliff:g id="APP_NAME">%1$s</xliff:g> pristupa podacima o fitnesu i velnesu?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Možete da saznate kako <xliff:g id="APP_NAME">%1$s</xliff:g> upravlja vašim podacima u: <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"politika privatnosti"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Želite da dozvolite da <xliff:g id="APP_NAME">%1$s</xliff:g> pristupa vašoj zdravstvenoj evidenciji?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ako date pristup, aplikacija može da čita i upisuje podatke, na primer, alergije, laboratorijske rezultate, vakcine i drugo\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ako date pristup, aplikacija može da čita podatke, na primer, alergije, laboratorijske rezultate, vakcine i drugo\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"O zdravstvenoj evidenciji"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Podaci za deljenje obuhvataju"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ako dozvolite, <xliff:g id="APP_NAME">%1$s</xliff:g> može da deli vašu zdravstvenu evidenciju sa Povezivanjem zdravlja."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinhronizujte zdravstvenu evidenciju iz različitih aplikacija i izvora da biste je držali na jednom mestu"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Želite da uklonite sve dozvole?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Ukloni sve"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje bilo koje podatke iz Povezivanja zdravlja.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje bilo koje podatke iz Povezivanja zdravlja, uključujući ranije podatke.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput lokacije, kamere ili mikrofona."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje bilo koje podatke iz Povezivanja zdravlja, uključujući pozadinske i ranije podatke.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput lokacije, kamere ili mikrofona."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Izbriši i podatke aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Povezivanja zdravlja"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Želite da uklonite sve dozvole?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Želite da uklonite sve dozvole za zdravstvenu evidenciju?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Želite da uklonite sve dozvole za fitnes i velnes?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Izbriši i podatke o fitnesu iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Povezivanja zdravlja"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Želite da uklonite sve dozvole za zdravstvenu evidenciju?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Izbriši i zdravstvenu evidenciju iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Povezivanja zdravlja"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje ove podatke iz Povezivanja zdravlja.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje ove podatke iz Povezivanja zdravlja, uključujući pozadinske podatke.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje ove podatke iz Povezivanja zdravlja, uključujući ranije podatke.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje ove podatke iz Povezivanja zdravlja, uključujući pozadinske i ranije podatke.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Želite da uklonite sve dozvole?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje podatke iz Povezivanja zdravlja.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje podatke iz Povezivanja zdravlja, uključujući pozadinske podatke.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje podatke iz Povezivanja zdravlja, uključujući ranije podatke.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći da čita ni upisuje podatke iz Povezivanja zdravlja, uključujući pozadinske i ranije podatke.\n\nTo ne utiče na druge dozvole koje ova aplikacija može da ima, poput kamere, mikrofona ili lokacije."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Izbriši i podatke o fitnesu i zdravstvenu evidenciju iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Povezivanja zdravlja"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Dozvole za ovu aplikaciju su uklonjene"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Izbriši i sve podatke Povezivanja zdravlja"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Sledeći dan"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Izabrani dan"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Prethodni dan"</string>
     <string name="default_error" msgid="7966868260616403475">"Došlo je do greške. Probajte ponovo."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Nepoznat resurs"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Izvorni podaci"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Otvorena velika zagrada."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Zatvorena velika zagrada."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> vrednost za polje <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Ove aplikacije više nemaju pristup, ali i dalje imaju sačuvane podatke u Povezivanju zdravlja"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> može da čita podatke dodate posle <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Da biste upravljali drugim dozvolama za Android kojima ova aplikacija može da pristupa, idite u Podešavanja &gt; Aplikacije"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Podatke koje delite sa aplikacijom <xliff:g id="APP_NAME">%1$s</xliff:g> reguliše njena politika privatnosti"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"U politici privatnosti programera možete da saznate kako <xliff:g id="APP_NAME">%1$s</xliff:g> upravlja vašim podacima"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Da biste upravljali drugim dozvolama za Android kojima ova aplikacija može da pristupa, idite u Podešavanja, pa dodirnite Aplikacije"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Pročitajte politiku privatnosti"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Pristupljeno u poslednja 24 sata"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Pristup aplikacijama"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Trenutno nemate instaliranu nijednu kompatibilnu aplikaciju"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Dodatni pristup"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Raniji podaci, pozadinski podaci"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Uklonjene su dodatne dozvole za ovu aplikaciju"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Dozvole"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitnes i velnes"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Vežbanje, san, ishrana i drugo"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Zdravstvena evidencija"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"zdravstvena evidencija"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab. rezultati, lekovi, vakcine i drugo"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Lab. rezultati, lekovi, vakcine i drugo"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Uklonjene dozvole za aplikacije"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Povezivanje zdravlja je uklonilo dozvole za aplikaciju <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Povezivanje zdravlja je uklonilo dozvole za aplikacije <xliff:g id="APP_DATA_0">%1$s</xliff:g> i <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Idi u Play prodavnicu"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Započnite sa Povezivanjem zdravlja"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Povezivanje zdravlja čuva vaše podatke o zdravlju i fitnesu i pruža vam jednostavan način da sinhronizujete različite aplikacije na uređaju"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Povezivanje zdravlja čuva i sinhronizuje podatke o zdravlju i fitnesu iz različitih aplikacija.\n\n"<b>"Podaci o fitnesu i zdravlju,"</b>" uključujući sesije vežbanja, broj koraka, ishranu, spavanje i drugo\n\n"<b>"Zdravstvena evidencija,"</b>" uključujući vakcinacije, laboratorijske rezultate i drugo"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Pomoću Povezivanja zdravlja možete:"</string>
     <string name="share_data" msgid="3481932156368883946">"Delite podatke sa aplikacijama"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Odaberite podatke koje svaka aplikacije može da čita i upisuje u Povezivanje zdravlja"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Upravljajte podešavanjima i privatnošću"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Blago krvarenje"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Srednje krvarenje"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Obilno krvarenje"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Nepoznata količina krvarenja"</string>
     <string name="period_day" msgid="3821944462093965882">"Dan ciklusa: <xliff:g id="DAY">%1$d</xliff:g>. od <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruacija (1 dan)}one{Menstruacija (# dan)}few{Menstruacija (# dana)}other{Menstruacija (# dana)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitivan"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativan"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Visoka plodnost"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muzika"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Drugo"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Bez vođenja"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Umereno"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intenzivno"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> s <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> s"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integracija je u toku"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Povezivanje zdravlja se integriše sa Android sistemom.\n\nMože da prođe izvesno vreme dok se podaci i dozvole prenesu."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ne zatvarajte aplikaciju dok ne dobijete obaveštenje da je proces dovršen."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integracija Povezivanja zdravlja je u toku"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Potrebno je ažuriranje"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Povezivanje zdravlja se integriše sa Android sistemom da biste mogli direktno da mu pristupate iz podešavanja."</string>
     <string name="update_button" msgid="4544529019832009496">"Ažuriraj"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Započnite ovo ažuriranje da bi Povezivanje zdravlja moglo da nastavi integraciju sa podešavanjima sistema"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Ažuriraj"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Potrebno je ažuriranje sistema"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Pre nego što nastavite, ažurirajte sistem telefona."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ako ste već ažurirali sistem telefona, probajte da restartujete telefon kako biste nastavili integraciju"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Potrebno je ažuriranje Povezivanja zdravlja"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Pre nego što nastavite, ažurirajte aplikaciju Povezivanje zdravlja na najnoviju verziju."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Potrebno je još prostora"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Povezivanju zdravlja treba <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> memorijskog prostora na telefonu da bi se integracija nastavila.\n\nOslobodite nešto prostora na telefonu i probajte ponovo."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Probaj ponovo"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Oslobodi prostor"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Potrebno je još prostora"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Povezivanju zdravlja treba <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> memorijskog prostora na telefonu da bi nastavilo integrisanje."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integracija je pauzirana"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikacija Povezivanje zdravlja se zatvorila dok je trajala njena integracija sa Android sistemom.\n\nKliknite na Nastavi da biste ponovo otvorili aplikaciju i nastavili da prenosite podatke i dozvole."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Da biste zadržali podatke Povezivanja zdravlja, dovršite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Dodirnite da biste nastavili integraciju Povezivanja zdravlja sa Android sistemom. Da biste zadržali podatke, dovršite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Dodirnite da biste nastavili integraciju Povezivanja zdravlja sa Android sistemom."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Nastavi"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Nastavite integraciju Povezivanja zdravlja"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Da biste zadržali podatke, dovršite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Treba da ažurirate aplikaciju"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> treba da se ažurira kako biste nastavili sinhronizaciju sa Povezivanjem zdravlja"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Treba da ažurirate neke aplikacije kako biste nastavili sinhronizaciju sa Povezivanjem zdravlja"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> treba da se ažurira kako biste nastavili sinhronizaciju sa Povezivanjem zdravlja. Ažuriranja možda nisu dostupna za sve aplikacije."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Treba da ažurirate neke aplikacije kako biste nastavili sinhronizaciju sa Povezivanjem zdravlja. Ažuriranja možda nisu dostupna za sve aplikacije."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Proverite da li ima ažuriranja"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Saznajte više"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integracija Povezivanja zdravlja"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integracija Povezivanja zdravlja nije dovršena"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Dobićete obaveštenje kada ponovo postane dostupna."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Važi"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integracija Povezivanja zdravlja nije dovršena"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Pročitajte više"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integracija Povezivanja zdravlja je dovršena"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Otvori"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Šta je novo"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Sada možete da pristupate Povezivanju zdravlja direktno iz podešavanja. Deinstalirajte aplikaciju Povezivanje zdravlja u bilo kom trenutku da biste oslobodili memorijski prostor."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Važi"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Izmeni izvore aplikacija"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Podrazumevano za uređaj"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Podaci aplikacija"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Podaci iz aplikacija sa pristupom Povezivanju zdravlja prikazaće se ovde"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Podaci iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> će biti ovde"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Podaci iz aplikacija sa pristupom Povezivanju zdravlja će biti ovde"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dan"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Nedelja"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mesec"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Prošli mesec"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Unosi"</string>
     <string name="tab_access" msgid="7818197975407243701">"Pristup"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Želite da dozvolite dodatni pristup za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> takođe traži pristup ovim podešavanjima Povezivanja zdravlja"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Omogućite bar jednu dozvolu za čitanje da biste za ovu aplikaciju uključili pristup pozadinskim ili ranijim podacima"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Omogućite bar jednu dozvolu za čitanje da biste za ovu aplikaciju uključili pristup u pozadini"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Omogućite bar jednu dozvolu za čitanje da biste za ovu aplikaciju uključili pristup ranijim podacima"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Počnite da koristite Povezivanje zdravlja"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinhronizujte aplikacije da biste delili podatke o zdravlju i fitnesu među njima"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Podesi"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Pogledajte kompatibilne aplikacije"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Pronađite još aplikacija koje ćete sinhronizovati sa aplikacijom <xliff:g id="APP_NAME">%s</xliff:g> preko Povezivanja zdravlja"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Prikaži u prodavnici aplikacija"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Podesite otključavanje ekrana"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Podesite PIN, šablon ili lozinku za ovaj uređaj da biste poboljšali bezbednost podataka o zdravlju"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Podesi otključavanje ekrana"</string>
     <string name="select_all" msgid="837499881590001166">"Izaberi sve"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Povezane aplikacije više neće moći da čitaju ove podatke iz Povezivanja zdravlja"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Označeno"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nije označeno"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Dostupna je mapa rute vežbanja"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Sledeći dan"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Sledeća nedelja"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Sledeći mesec"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Prethodni dan"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Prethodna nedelja"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Prethodni mesec"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Želite trajno da izbrišete sve podatke?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Želite trajno da izbrišete izabrane podatke?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Želite trajno da izbrišete sve podatke za: <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Želite trajno da izbrišete izabrane unose u: <xliff:g id="APP_NAME">%1$s</xliff:g> za nedelju <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Želite trajno da izbrišete izabrane unose u: <xliff:g id="APP_NAME">%1$s</xliff:g> za <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Želite trajno da izbrišete ovaj unos u: <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Želite trajno da izbrišete podatke tipa <xliff:g id="DATA_TYPE">%1$s</xliff:g> za <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Uključeno"</string>
+    <string name="off" msgid="6996623844428550649">"Isključeno"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Pristupljeno: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Pristupano juče: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Pristupano: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Dozvoli uvek"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Dozvoli izabrano"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Dok koristim aplikaciju"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Odbij sve"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Želite da dozvolite da <xliff:g id="APP_NAME">%1$s</xliff:g> pristupa podacima o fitnesu i velnesu?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> traži pristup za: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nIzaberite da li želite da dozvolite sve ili da ih kontrolišete pojedinačno."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Dozvoljavate da <xliff:g id="APP_NAME">%1$s</xliff:g> pristupa uređaju <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitnes i velnes"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sve vreme"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"dok se koristi"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sve vreme"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Dok se koristi"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> može da pristupa svim podacima o fitnesu i velnesu u režimu <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Dozvoljen pristup"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Dozvoljeno čitanje"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ove dozvole daju aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> pristup podacima sa senzora uređaja."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Aplikacije sa dozvolom: <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nijedna aplikacija ne zahteva dozvolu"</string>
+    <string name="allowed" msgid="4158456017482263737">"Dozvoljeno"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nije dozvoljeno"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikacije sa ovom dozvolom mogu da pristupaju podacima (<xliff:g id="DATA_TYPE">%s</xliff:g>) sa senzora uređaja."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Želite da uklonite pristup podacima (<xliff:g id="DATA_TYPE">%s</xliff:g>) svim aplikacijama na satu?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Znak potvrde"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Znak x"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Trenutno, <xliff:g id="APP_NAME">%1$s</xliff:g> može da pristupa podacima o fitnesu i velnesu <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Želite da dozvolite da <xliff:g id="APP_NAME">%1$s</xliff:g> stalno pristupa podacima o fitnesu i velnesu?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ima pristup za: <xliff:g id="DATA_TYPES">%2$s</xliff:g>"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Upravljaj dozvolama za fitnes i velnes"</string>
 </resources>
diff --git a/apk/res/values-be/strings.xml b/apk/res/values-be/strings.xml
index 4b637f3..33e2bb6 100644
--- a/apk/res/values-be/strings.xml
+++ b/apk/res/values-be/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Кіруйце на сваёй прыладзе данымі пра здароўе і фізічную актыўнасць, а таксама доступам праграм да гэтай інфармацыі"</string>
     <string name="data_title" msgid="4456619761533380816">"Даныя і доступ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Паглядзець інфармацыю пра стан здароўя"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Праглядайце сваю інфармацыю пра стан здароўя і якія праграмы маюць да яе доступ"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Усе катэгорыі"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Праглядзець усе катэгорыі"</string>
     <string name="no_data" msgid="1906986019249068659">"Няма даных"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Учора"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Счытванне: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Запіс: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Кіраваць дазволамі"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Час: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Актыўнасць"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"доступ да даных, датычных здароўя"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Счытваць даныя пра калорыі"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Дазваляе праграме счытваць даныя пра зрасходаваныя калорыі"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Доступ да даных у фонавым рэжыме"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да даных у фонавым рэжыме?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да даных у фонавым рэжыме?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да даных пра фізічную актыўнасць і фізічны стан, а таксама інфармацыі пра стан здароўя, калі вы яе не выкарыстоўваеце."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да інфармацыі пра стан здароўя, калі вы яе не выкарыстоўваеце."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да даных пра фізічную актыўнасць і фізічны стан, калі вы яе не выкарыстоўваеце."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да даных платформы \"Здароўе і спорт\", калі вы яе не выкарыстоўваеце."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да мінулых даных?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да даных пра фізічную актыўнасць і фізічны стан, дададзеных да <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да ўсіх мінулых даных пра фізічную актыўнасць і фізічны стан."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да даных платформы \"Здароўе і спорт\", якія былі дададзены да <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да ўсіх мінулых даных платформы \"Здароўе і спорт\"."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" пашыраны доступ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" таксама запытвае доступ да наступных налад платформы \"Здароўе і спорт\""</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Доступ да ўсіх даных у фонавым рэжыме"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Доступ да інфармацыі пра стан здароўя ў фонавым рэжыме"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Доступ да даных пра фізічную актыўнасць і фізічны стан у фонавым рэжыме"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Дазволіць праграме доступ да даных пра фізічную актыўнасць і фізічны стан, а таксама інфармацыю пра стан здароўя, калі вы яе не выкарыстоўваеце"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Дазволіць праграме доступ да гэтых даных, калі вы яе не выкарыстоўваеце"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Дазволіць праграме доступ да гэтых даных, калі вы яе не выкарыстоўваеце"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Доступ да даных у фонавым рэжыме"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Дазволіць праграме доступ да даных платформы \"Здароўе і спорт\", калі вы яе не выкарыстоўваеце"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Доступ да мінулых даных пра фізічную актыўнасць і фізічны стан"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Дазволіць праграме доступ да даных, дададзеных да <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Дазволіць праграме доступ да ўсіх мінулых даных"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Доступ да мінулых даных"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Дазволіць праграме доступ да даных платформы \"Здароўе і спорт\", якія былі дададзены да <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Дазволіць праграме доступ да ўсіх мінулых даных платформы \"Здароўе і спорт\""</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" мае доступ да мінулай інфармацыі пра стан здароўя"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Чытаць далей пра дазволы"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Доступ да ўсіх даных у фонавым рэжыме"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Доступ да інфармацыі пра стан здароўя ў фонавым рэжыме"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Доступ да даных пра фізічную актыўнасць і фізічны стан у фонавым рэжыме"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Дазволіць праграме доступ да даных пра фізічную актыўнасць і фізічны стан, а таксама інфармацыю пра стан здароўя, калі вы яе не выкарыстоўваеце"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Дазволіць праграме доступ да гэтых даных, калі вы яе не выкарыстоўваеце"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Дазволіць праграме доступ да гэтых даных, калі вы яе не выкарыстоўваеце"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Доступ да даных у фонавым рэжыме"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Дазволіць праграме доступ да даных платформы \"Здароўе і спорт\", калі вы яе не выкарыстоўваеце"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Доступ да мінулых даных пра фізічную актыўнасць і фізічны стан"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Дазволіць праграме доступ да даных, дададзеных да <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Дазволіць праграме доступ да ўсіх мінулых даных"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Доступ да мінулых даных"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Дазволіць праграме доступ да даных платформы \"Здароўе і спорт\", якія былі дададзены да <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Дазволіць праграме доступ да ўсіх мінулых даных платформы \"Здароўе і спорт\""</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"У гэты момант даныя пра фізічную актыўнасць не чытаюцца, бо для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" не ўключаны дазвол на прагляд"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> мае доступ да папярэдняй інфармацыі пра стан здароўя. Каб змяніць доступ, выключыце адпаведныя дазволы для гэтай праграмы"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Кіраваць дазволамі на доступ да інфармацыі пра стан здароўя"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Каб уключыць доступ у фонавым рэжыме або доступ да мінулых даных для гэтай праграмы, дайце хаця б адзін дазвол на чытанне"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Каб уключыць доступ у фонавым рэжыме для гэтай праграмы, дайце хаця б адзін дазвол на чытанне"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Каб уключыць доступ да мінулых даных для гэтай праграмы, дайце хаця б адзін дазвол на чытанне"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Дазволіць праграме доступ да ўсіх мінулых даных платформы \"Здароўе і спорт\""</string>
     <string name="background_read_description" msgid="3203594555849969283">"Дазволіць праграме доступ да даных сэрвісу \"Здароўе і спорт\", калі вы яе не выкарыстоўваеце"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да даных сэрвісу \"Здароўе і спорт\", калі вы яе не выкарыстоўваеце."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Доступ да мінулых даных"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да мінулых даных?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Дазволіць праграме доступ да даных платформы \"Здароўе і спорт\", якія былі дададзены да <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Дазволіць праграме доступ да ўсіх мінулых даных платформы \"Здароўе і спорт\""</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да даных платформы \"Здароўе і спорт\", якія былі дададзены да <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Калі вы дасце гэты дазвол, праграма будзе мець доступ да ўсіх мінулых даных платформы \"Здароўе і спорт\"."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Зрасходаваныя актыўныя калорыі"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"зрасходаваныя актыўныя калорыі"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Счытваць даныя пра зрасходаваныя актыўныя калорыі"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"штуршкі інваліднай каляскі"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Счытваць даныя пра штуршкі інваліднай каляскі"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Запісваць даныя пра штуршкі інваліднай каляскі"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Інтэнсіўнасць нагрузак"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"інтэнсіўнасць нагрузак"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Счытваць інтэнсіўнасць нагрузак"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Запісваць інтэнсіўнасць нагрузак"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Базальная хуткасць метабалізму"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"базальная хуткасць метабалізму"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Счытваць даныя пра базальную хуткасць метабалізму"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"тэмпература скуры"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Чытанне даных пра тэмпературу скуры"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Запіс даных пра тэмпературу скуры"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Сюды ўваходзіць уся інфармацыя пра стан здароўя, сінхранізаваная і дададзеная ў праграму \"Здароўе і спорт\". Гэта не абавязкова павінна быць ваша поўная медыцынская карта, таксама яна не ўключае медыцынскае апісанне вашай інфармацыі пра стан здароўя."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Уся інфармацыя пра стан здароўя"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"уся інфармацыя пра стан здароўя"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Запісваць усю інфармацыю пра стан здароўя"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Алергія"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"алергія"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Чытаць даныя аб алергіі"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Вакцынацыя"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"вакцынацыя"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Чытаць даныя аб вакцынацыі"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Вынікі лабараторных даследаванняў"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"вынікі лабараторных даследаванняў"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Счытваць вынікі лабараторных даследаванняў"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Алергія"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"алергія"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Чытаць даныя пра алергію"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Расстройствы здароўя"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"расстройствы здароўя"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Чытаць звесткі пра расстройствы здароўя"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Прышчэпкі"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"прышчэпкі"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Чытаць даныя пра прышчэпкі"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Вынікі аналізаў"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"вынікі аналізаў"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Чытаць вынікі аналізаў"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Лекавыя сродкі"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"лекавыя сродкі"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Чытаць звесткі пра лекавыя сродкі"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Асабістыя звесткі"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"асабістыя звесткі"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Чытаць асабістыя звесткі"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Звесткі пра спецыялістаў па здароўі"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"звесткі пра спецыялістаў па здароўі"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Чытаць звесткі пра спецыялістаў па здароўі"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Цяжарнасць"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"цяжарнасць"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Счытваць даныя пра цяжарнасць"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Праблемы"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"праблемы"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Счытваць даныя пра праблемы"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Працэдуры"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"працэдуры"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Счытваць даныя пра працэдуры"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Гісторыя ўзаемадзеяння з сацыяльнымі сеткамі"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Гісторыя ўзаемадзеяння з сацыяльнымі сеткамі"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"гісторыя ўзаемадзеяння з сацыяльнымі сеткамі"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Счытваць гісторыю ўзаемадзеяння з сацыяльнымі сеткамі"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Фізіялагічныя паказчыкі"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Звесткі пра візіты да спецыялістаў"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"звесткі пра візіты да спецыялістаў"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Чытаць звесткі пра візіты да спецыялістаў"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Фізіялагічныя паказчыкі"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"фізіялагічныя паказчыкі"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Счытваць фізіялагічныя паказчыкі"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Самаўсведамленне"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Запісваць даныя сеанса самаўсведамлення"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Дазвольце праграме “<xliff:g id="APP_NAME">%1$s</xliff:g>” счытваць даныя"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Дазвольце праграме “<xliff:g id="APP_NAME">%1$s</xliff:g>” запісваць даныя"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Скасаваць"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Дазволіць"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Дазволіць усё"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Не дазваляць"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Выберыце, якія даныя зможа счытваць ці запісваць гэта праграма ў праграме \"Здароўе і спорт\""</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Выберыце, якія даныя зможа счытваць ці запісваць гэта праграма ў платформе \"Здароўе і спорт\""</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Выберыце, якія даныя зможа счытваць гэта праграма з платформы \"Здароўе і спорт\""</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Выберыце, якія даныя зможа запісваць гэта праграма ў платформе \"Здароўе і спорт\""</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Калі вы дасце праграме дазвол на чытанне, яна зможа атрымліваць як новыя даныя, так і звесткі за апошнія 30 дзён"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Калі вы дасце праграме дазвол на чытанне, яна зможа атрымліваць як новыя, так і мінулыя даныя"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Даць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да праграмы \"Здароўе і спорт\"?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Даведацца пра тое, як праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" апрацоўвае вашы даныя, можна ў <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> распрацоўшчыка"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да даных пра фізічную актыўнасць і фізічны стан?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Каб даведацца, як праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" апрацоўвае вашы даныя, прачытайце наступны дакумент: <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"палітыка прыватнасці"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да вашай інфармацыі пра стан здароўя?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Калі вы дазволіце доступ, праграма зможа счытваць і запісваць такія даныя, як інфармацыя пра алергію і прышчэпкі, вынікі аналізаў і шмат іншага\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Калі вы дазволіце доступ, праграма зможа счытваць такія даныя, як інфармацыя пра алергію і прышчэпкі, вынікі аналізаў і шмат іншага\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Аб інфармацыі пра стан здароўя"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Даныя для абагульвання ўключаюць наступныя:"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Калі вы дазволіце доступ, праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" зможа абагульваць вашу інфармацыю пра стан здароўя з платформай \"Здароўе і спорт\"."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Сінхранізуйце інфармацыю пра стан здароўя з розных праграм і крыніц, каб яна захоўвалася ў адным месцы"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Выдаліць усе дазволы?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Выдаліць усе"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> больш не зможа чытаць і запісваць даныя з платформы \"Здароўе і спорт\".\n\nГэта не паўплывае на іншыя дазволы, якія можа мець гэта праграма, напрыклад на доступ да камеры, мікрафона ці геаданых."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> больш не зможа счытваць і запісваць даныя з праграмы \"Здароўе і спорт\" (сюды ўваходзяць і мінулыя даныя).\n\nГэта не паўплывае на іншыя дазволы, якія можа мець праграма, напрыклад, на доступ да геаданых, камеры ці мікрафона."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> больш не зможа счытваць і запісваць даныя з праграмы \"Здароўе і спорт\" (сюды ўваходзяць мінулыя даныя і фонавая перадача даных).\n\nГэта не паўплывае на іншыя дазволы, якія можа мець праграма, напрыклад, на доступ да геаданых, камеры ці мікрафона."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Таксама выдаліць даныя праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" з праграмы \"Здароўе і спорт\""</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Выдаліць усе дазволы?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Выдаліць усе дазволы, звязаныя з данымі пра стан здароўя?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Выдаліць усе дазволы, звязаныя з фітнесам і аздараўленнем?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Таксама выдаліць з платформы \"Здароўе і спорт\" даныя пра фізічную актыўнасць, атрыманыя ў праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Выдаліць усе дазволы, звязаныя з данымі пра стан здароўя?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Таксама выдаліць з платформы \"Здароўе і спорт\" даныя пра стан здароўя, атрыманыя ў праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> больш не зможа чытаць і запісваць гэтыя даныя з платформы \"Здароўе і спорт\".\n\nГэта не паўплывае на іншыя дазволы, якія можа мець гэта праграма, напрыклад на доступ да камеры, мікрафона ці геаданых."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больш не зможа счытваць і запісваць гэтыя даныя з платформы \"Здароўе і спорт\", у тым ліку даныя, запісаныя ў фонавым рэжыме.\n\nГэта не закране іншыя дазволы, якія праграма можа мець, напрыклад дазволы на доступ да камеры, мікрафона ці геаданых."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больш не зможа счытваць і запісваць гэтыя даныя з платформы \"Здароўе і спорт\", у тым ліку мінулыя даныя.\n\nГэта не закране іншыя дазволы, якія праграма можа мець, напрыклад дазволы на доступ да камеры, мікрафона ці геаданых."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больш не зможа счытваць і запісваць гэтыя даныя з платформы \"Здароўе і спорт\", у тым ліку мінулыя даныя і даныя, запісаныя ў фонавым рэжыме.\n\nГэта не закране іншыя дазволы, якія праграма можа мець, напрыклад дазволы на доступ да камеры, мікрафона ці геаданых."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Выдаліць усе дазволы?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больш не зможа счытваць і запісваць даныя з платформы \"Здароўе і спорт\".\n\nГэта не паўплывае на іншыя дазволы, якія можа мець гэта праграма, напрыклад на доступ да камеры, мікрафона ці геаданых."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больш не зможа счытваць і запісваць даныя з платформы \"Здароўе і спорт\", у тым ліку даныя, запісаныя ў фонавым рэжыме.\n\nГэта не паўплывае на іншыя дазволы, якія можа мець гэта праграма, напрыклад на доступ да камеры, мікрафона ці геаданых."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больш не зможа счытваць і запісваць даныя з платформы \"Здароўе і спорт\", у тым ліку мінулыя даныя.\n\nГэта не паўплывае на іншыя дазволы, якія можа мець гэта праграма, напрыклад на доступ да камеры, мікрафона ці геаданых."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больш не зможа счытваць і запісваць даныя з платформы \"Здароўе і спорт\", у тым ліку мінулыя даныя і даныя, запісаныя ў фонавым рэжыме.\n\nГэта не паўплывае на іншыя дазволы, якія можа мець гэта праграма, напрыклад на доступ да камеры, мікрафона ці геаданых."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Таксама выдаліць з платформы \"Здароўе і спорт\" даныя пра фізічную актыўнасць і стан здароўя, атрыманыя ў праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Дазволы для гэтай праграмы выдалены"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Таксама выдаліць усе даныя праграмы \"Здароўе і спорт\""</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Наступны дзень"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Абраны дзень"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Папярэдні дзень"</string>
     <string name="default_error" msgid="7966868260616403475">"Нешта пайшло не так. Паўтарыце спробу."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Невядомы рэсурс"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Зыходныя даныя"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Адкрытая фігурная дужка."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Закрытая фігурная дужка."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Поле <xliff:g id="FIELD">%2$s</xliff:g> Значэнне"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"У гэтых праграм больш няма доступу да праграмы \"Здароўе і спорт\", аднак іх даныя па-ранейшаму там захоўваюцца"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> можа счытваць даныя, дададзеныя пасля <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Каб кіраваць іншымі дазволамі Android, якія можа мець гэта праграма, адкрыйце \"Налады &gt; Праграмы\""</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Даныя, якія вы абагульваеце з праграмай \"<xliff:g id="APP_NAME">%1$s</xliff:g>\", падпадаюць пад дзеянне палітыкі прыватнасці"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Даведацца пра тое, як праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" апрацоўвае вашы даныя, можна ў палітыцы прыватнасці распрацоўшчыка"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Каб кіраваць іншымі дазволамі гэтай праграмы ў Android, адкрыйце \"Налады\" і выберыце \"Праграмы\""</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Азнаёміцца з палітыкай прыватнасці"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Апошні доступ у папярэднія 24 гадзіны"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Доступы праграмы"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"У вас не ўсталяваны сумяшчальныя праграмы"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Пашыраны доступ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Мінулыя даныя, фонавыя даныя"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Дадатковыя дазволы для гэтай праграмы скасаваны"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Дазволы"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Фітнес і здароўе"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Трэніроўкі, сон, харчаванне і іншае"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Інфармацыя пра стан здароўя"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"інфармацыя пра стан здароўя"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Вынікі аналізаў, лекі, прышчэпкі і іншае"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Вынікі аналізаў, лекі, вакцыны і іншае"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Выдаленыя дазволы праграм"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Дазволы на доступ да даных праграмы \"Здароўе і спорт\" выдалены для праграмы \"<xliff:g id="APP_DATA">%s</xliff:g>\""</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Дазволы на доступ да даных праграмы \"Здароўе і спорт\" выдалены для праграм \"<xliff:g id="APP_DATA_0">%1$s</xliff:g>\" і \"<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>\""</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Перайсці ў Краму Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Пачатак працы з праграмай \"Здароўе і спорт\""</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Праграма \"Здароўе і спорт\" захоўвае даныя пра ваша здароўе і фізічную актыўнасць і забяспечвае сінхранізацыю розных праграм на прыладзе"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Праграма \"Здароўе і спорт\" захоўвае і сінхранізуе вашы даныя пра здароўе і фізічную актыўнасць з розных праграм.\n\n"<b>"Даныя пра здароўе і фізічны стан"</b>", у тым ліку сеансы трэніровак, даныя сну і іншае.\n\n"<b>"Інфармацыю пра стан здароўя"</b>", у тым ліку пра вакцыны, вынікі аналізаў і іншае."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Праграма \"Здароўе і спорт\" дазваляе рабіць наступнае:"</string>
     <string name="share_data" msgid="3481932156368883946">"Абагульвайце даныя з праграмамі"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Выбірайце, да якіх даных у \"Здароўі і спорце\" будуць мець доступ праграмы"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Кіруйце наладамі і прыватнасцю"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Слабы крывацёк"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Умераны крывацёк"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Моцны крывацёк"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Невядомая інтэнсіўнасць крывацёку"</string>
     <string name="period_day" msgid="3821944462093965882">"Перыяд: дзень <xliff:g id="DAY">%1$d</xliff:g> з <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Менструацыя (1 дзень)}one{Менструацыя (# дзень)}few{Менструацыя (# дні)}many{Менструацыя (# дзён)}other{Менструацыя (# дня)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Станоўчы"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Адмоўны"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Высокая фертыльнасць"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Музыка"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Іншае"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Без кантролю"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Умераная"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Высокая"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> хв"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> гадз <xliff:g id="MIN">%2$s</xliff:g> хв"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> гадз"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Выконваецца інтэграцыя"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Ідзе інтэграцыя праграмы \"Здароўе і спорт\" з сістэмай Android.\n\nПерадача вашых даных і дазволаў можа заняць некаторы час."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Не закрывайце праграму, пакуль не атрымаеце апавяшчэння аб завяршэнні гэтага працэсу."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Ідзе інтэграцыя праграмы \"Здароўе і спорт\""</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Патрабуецца абнаўленне"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Праграма \"Здароўе і спорт\" інтэгруецца з сістэмай Android, таму ў вас ёсць доступ да яе непасрэдна з налад."</string>
     <string name="update_button" msgid="4544529019832009496">"Абнавіць"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Запусціце гэтае абнаўленне, каб праграма \"Здароўе і спорт\" працягнула абнаўленне з наладамі вашай сістэмы"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Абнавіць"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Патрабуецца абнаўленне сістэмы"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Спачатку абнавіце сістэму свайго тэлефона."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Калі вы ўжо абнавілі сістэму свайго тэлефона, паспрабуйце перазапусціць тэлефон, каб працягнуць інтэграцыю"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Патрабуецца абнаўленне праграмы \"Здароўе і спорт\""</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Спачатку абнавіце праграму \"Здароўе і спорт\" да апошняй версіі."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Патрабуецца больш месца"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Праграме \"Здароўе і спорт\" патрабуецца <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> месца ў сховішчы тэлефона, каб працягнуць інтэграцыю.\n\nАчысціце месца на тэлефоне, а потым паўтарыце спробу."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Паўтарыць спробу"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Ачысціць месца"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Патрабуецца больш месца"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Праграме \"Здароўе і спорт\" патрабуецца <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> месца ў сховішчы тэлефона, каб працягнуць інтэграцыю."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Інтэграцыя прыпынена"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Праграма \"Здароўе і спорт\" была закрыта ў час інтэграцыі з сістэмай Android.\n\nКаб адкрыць праграму зноў і працягнуць перанос вашых даных і дазволаў, націсніце \"Узнавіць\"."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Каб захаваць свае даныя з праграмы \"Здароўе і спорт\", выканайце гэтае дзеянне за <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Націсніце, каб працягнуць інтэграцыю праграмы \"Здароўе і спорт\" з сістэмай Android. Каб захаваць свае даныя, выканайце гэтае дзеянне за <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Націсніце, каб працягнуць інтэграцыю праграмы \"Здароўе і спорт\" з сістэмай Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Працягнуць"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Узнавіце інтэграванне праграмы \"Здароўе і спорт\""</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Каб захаваць свае даныя, выканайце гэтае дзеянне за <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Патрабуецца абнаўленне праграмы"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Каб сінхранізацыя даных з сэрвісам \"Здароўе і спорт\" не перапынілася, праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" неабходна абнавіць"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Каб сінхранізацыя даных з сэрвісам \"Здароўе і спорт\" не перапынілася, некаторыя праграмы неабходна абнавіць"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Каб сінхранізацыя даных з сэрвісам \"Здароўе і спорт\" не перапынілася, праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" неабходна абнавіць. Абнаўленні могуць быць даступнымі не для ўсіх праграм."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Каб сінхранізацыя даных з сэрвісам \"Здароўе і спорт\" не перапынілася, некаторыя праграмы неабходна абнавіць. Абнаўленні могуць быць даступнымі не для ўсіх праграм."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Праверыць наяўнасць абнаўленняў"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Даведацца больш"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Інтэграцыя праграмы \"Здароўе і спорт\""</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Не ўдалося выканаць інтэграцыю праграмы \"Здароўе і спорт\""</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Вы атрымаеце апавяшчэнне, калі яно стане даступным зноў."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Не ўдалося выканаць інтэграцыю праграмы \"Здароўе і спорт\""</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Чытаць далей"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Інтэграцыя праграмы \"Здароўе і спорт\" завершана"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Адкрыць"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Што новага"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Цяпер у вас ёсць доступ да праграмы \"Здароўе і спорт\" непасрэдна з налад. Каб вызваліць месца ў сховішчы, яе можна выдаліць у любы час."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Змяніць спіс праграм – крыніц даных"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Стандартная праграма прылады"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Даныя праграмы"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Тут будуць паказвацца даныя з праграм, у якіх ёсць доступ да \"Здароўя і спорта\""</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Тут будуць паказвацца даныя з праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Тут будуць паказвацца даныя з праграм, у якіх ёсць доступ да \"Здароўя і спорту\""</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Дзень"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Тыдзень"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Месяц"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Апошні месяц"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Запісы"</string>
     <string name="tab_access" msgid="7818197975407243701">"Доступ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" пашыраны доступ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" таксама запытвае доступ да наступных налад платформы \"Здароўе і спорт\""</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Каб уключыць доступ у фонавым рэжыме або доступ да мінулых даных для гэтай праграмы, дайце хаця б адзін дазвол на чытанне"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Каб уключыць доступ у фонавым рэжыме для гэтай праграмы, дайце хаця б адзін дазвол на чытанне"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Каб уключыць доступ да мінулых даных для гэтай праграмы, дайце хаця б адзін дазвол на чытанне"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Пачаць выкарыстанне праграмы \"Здароўе і спорт\""</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Сінхранізуйце першыя праграмы, каб абагульваць паміж імі даныя пра здароўе і фізічную актыўнасць"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Наладзіць"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Паглядзець сумяшчальныя праграмы"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Знайдзіце больш праграм для сінхранізацыі з праграмай \"<xliff:g id="APP_NAME">%s</xliff:g>\" праз \"Здароўе і спорт\""</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Паглядзець у краме праграм"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Наладзьце блакіроўку экрана"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Для дадатковай бяспекі даных пра здароўе наладзьце на гэтай прыладзе PIN-код, узор разблакіроўкі ці пароль"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Наладзіць блакіроўку экрана"</string>
     <string name="select_all" msgid="837499881590001166">"Выбраць усё"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Падключаныя праграмы больш не змогуць счытваць гэтыя даныя з платформы \"Здароўе і спорт\""</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Выбрана"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Не выбрана"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Даступная карта з трэніровачным маршрутам"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Наступны дзень"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Наступны тыдзень"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Наступны месяц"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Папярэдні дзень"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Папярэдні тыдзень"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Папярэдні месяц"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Назаўсёды выдаліць усе даныя?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Назаўсёды выдаліць выбраныя даныя?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Назаўсёды выдаліць усе даныя праграмы \"<xliff:g id="APP_NAME">%s</xliff:g>\"?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Назаўсёды выдаліць выбраныя запісы праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" за тыдзень <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Назаўсёды выдаліць выбраныя запісы праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" за <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Назаўсёды выдаліць гэты запіс праграмы \"<xliff:g id="APP_NAME">%s</xliff:g>\"?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Назаўсёды выдаліць даныя \"<xliff:g id="DATA_TYPE">%1$s</xliff:g>\" для праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\"?"</string>
+    <string name="on" msgid="8266542510798355807">"Уключана"</string>
+    <string name="off" msgid="6996623844428550649">"Выключана"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Апошні раз доступ быў атрыманы ў <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Апошні раз доступ быў атрыманы ўчора ў <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Апошні раз доступ быў атрыманы ў <xliff:g id="TIME_DATE_1">%2$s</xliff:g> <xliff:g id="TIME_DATE_0">%1$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Заўсёды дазволена"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Дазволіць выбраныя"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Падчас выкарыстання праграмы"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Адхіліць усе"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да даных пра фізічную актыўнасць і фізічны стан?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае доступ да наступных даных: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nВы можаце даць усе дазволы ці кіраваць дазволамі паасобку."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да наступных даных: <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Фітнес і здароўе"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"заўсёды"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"падчас выкарыстання"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Заўсёды"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Падчас выкарыстання"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" можа атрымліваць доступ да даных пра фітнес і здароўе <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Доступ дазволены"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Дазволена счытваць"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"З гэтымі дазволамі праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" можа атрымліваць доступ да даных з датчыкаў прылады."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Праграм з дазволам: <xliff:g id="NUMBER_0">%1$d</xliff:g> з <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ні адна праграма не запытвае дазвол"</string>
+    <string name="allowed" msgid="4158456017482263737">"Дазволена"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Забаронена"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Праграмы з такім дазволам могуць атрымліваць доступ да даных \"<xliff:g id="DATA_TYPE">%s</xliff:g>\" з датчыкаў прылады."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Забараніць усім праграмам доступ да даных \"<xliff:g id="DATA_TYPE">%s</xliff:g>\" на гадзінніку?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Птушка"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Крыжык"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"На гэты момант <xliff:g id="APP_NAME">%1$s</xliff:g> мае доступ да даных пра фізічную актыўнасць і фізічны стан <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Дазволіць праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" пастаянны доступ да даных пра фізічную актыўнасць і фізічны стан?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> мае доступ да наступнай інфармацыі: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Дазволы на кіраванне данымі пра фізічную актыўнасць і фізічны стан"</string>
 </resources>
diff --git a/apk/res/values-bg/strings.xml b/apk/res/values-bg/strings.xml
index 23db549..67bfe95 100644
--- a/apk/res/values-bg/strings.xml
+++ b/apk/res/values-bg/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Управлявайте данните за здравословното състояние и физическата активност, съхранявани на устройството ви, и контролирайте кои приложения да имат достъп до тях"</string>
     <string name="data_title" msgid="4456619761533380816">"Данни и достъп"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Преглед на здравните картони"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Преглед на здравните ви картони и на приложенията, които имат достъп до тях"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Всички категории"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Преглед на всички категории"</string>
     <string name="no_data" msgid="1906986019249068659">"Няма данни"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Вчера"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Четене: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Записване: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Управление на разрешенията"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Час: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Активност"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"достъп до здравните ви данни"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Четене на изгорените калории"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Разрешава на приложението да чете изгорените калории"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Достъп до данните на заден план"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> да осъществява достъп до данните на заден план?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> да осъществява достъп до данните на заден план?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ако предоставите разрешението, това приложение ще има достъп до данните за физическата активност и благосъстоянието, както и до здравните ви картони, когато не го използвате."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ако предоставите разрешението, това приложение ще има достъп до здравните картони, когато не го използвате."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ако предоставите разрешението, това приложение ще има достъп до данните за физическата активност и благосъстоянието, когато не го използвате."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ако предоставите разрешението, това приложение ще има достъп до данните в Health Connect, когато не го използвате."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> да осъществява достъп до миналите данни?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ако предоставите разрешението, това приложение ще има достъп до данните за физическата активност и благосъстоянието, добавени преди <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> г."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ако предоставите разрешението, това приложение ще има достъп до всички минали данни за физическата активност и благосъстоянието."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ако предоставите разрешението, това приложение ще има достъп до данните в Health Connect, добавени преди <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> г."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ако предоставите разрешението, това приложение ще има достъп до всички минали данни в Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Да се предостави ли допълнителен достъп на <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска достъп и до тези настройки за Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Достъп до всички данни на заден план"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Достъп до здравните картони на заден план"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Достъп до данните за физическата активност и благосъстоянието на заден план"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Разрешете на това приложение да осъществява достъп до данните за физическата активност и благосъстоянието, както и до здравните ви картони, когато не го използвате"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Разрешете на това приложение да осъществява достъп до тези данни, когато не го използвате"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Разрешете на това приложение да осъществява достъп до тези данни, когато не го използвате"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Достъп до данните на заден план"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Разрешете на това приложение да осъществява достъп до данните в Health Connect, когато не го използвате"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Достъп до миналите данни за физическата активност и благосъстоянието"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Разрешете на това приложение да осъществява достъп до данните, добавени преди <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> г."</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Разрешете на това приложение да осъществява достъп до всички минали данни"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Достъп до миналите данни"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Разрешете на това приложение да осъществява достъп до данните в Health Connect, добавени преди <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> г."</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Разрешете на това приложение да осъществява достъп до всички минали данни в Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече има достъп до миналите данни в здравните ви картони"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Прочетете повече за разрешенията"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Достъп до всички данни на заден план"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Достъп до здравните картони на заден план"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Достъп до данните за физическата активност и благосъстоянието на заден план"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Разрешете на това приложение да осъществява достъп до данните за физическата активност и благосъстоянието, както и до здравните ви картони, когато не го използвате"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Разрешете на това приложение да осъществява достъп до тези данни, когато не го използвате"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Разрешете на това приложение да осъществява достъп до тези данни, когато не го използвате"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Достъп до данните на заден план"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Разрешете на това приложение да осъществява достъп до данните в Health Connect, когато не го използвате"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Достъп до миналите данни за физическата активност и благосъстоянието"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Разрешете на това приложение да осъществява достъп до данните, добавени преди <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> г."</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Разрешете на това приложение да осъществява достъп до всички минали данни"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Достъп до миналите данни"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Разрешете на това приложение да осъществява достъп до данните в Health Connect, добавени преди <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> г."</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Разрешете на това приложение да осъществява достъп до всички минали данни в Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Понастоящем не се четат данни за физическата активност, защото <xliff:g id="APP_NAME">%1$s</xliff:g> няма необходимите разрешения"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече има достъп до миналите данни в здравните ви картони. За да промените това, изключете разрешенията за здравен картон за това приложение"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Управление на разрешенията за здравен картон"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Активирайте поне едно разрешение за четене, за да предоставите на това приложение достъп на заден план или достъп до предишните данни"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Активирайте поне едно разрешение за четене, за да предоставите на това приложение достъп на заден план"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Активирайте поне едно разрешение за четене, за да предоставите на това приложение достъп до предишните данни"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Разрешете на това приложение да осъществява достъп до всички минали данни в Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Разрешете на това приложение да осъществява достъп до данните в Health Connect, когато не го използвате"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ако предоставите разрешението, това приложение ще има достъп до данните в Health Connect, когато не го използвате."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Достъп до миналите данни"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> да осъществява достъп до миналите данни?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Разрешете на това приложение да осъществява достъп до данните в Health Connect, добавени преди <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Разрешете на това приложение да осъществява достъп до всички минали данни в Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ако предоставите разрешението, това приложение ще има достъп до данните в Health Connect, добавени преди <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ако предоставите разрешението, това приложение ще има достъп до всички минали данни в Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Изгорени калории от активност"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"изгорени калории от активност"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Четене на изгорените калории от активност"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"бутания на инвалидна количка"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Четене на бутанията на инвалидна количка"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Записване на бутанията на инвалидна количка"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Интензивност на активността"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"интензивност на активността"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Четене на данните за интензивността на активността"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Запис на данните за интензивността на активността"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Основна обмяна на веществата"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"основна обмяна на веществата"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Четене на данните за основната обмяна на веществата"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"температура на кожата"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Четене на температурата на кожата"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Записване на температурата на кожата"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Това включва всички здравни картони, синхронизирани със и добавени към Health Connect. Това може да не е пълният ви медицински картон и не включва медицинско описание на здравните ви картони."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Всички здравни картони"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"всички здравни картони"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Записване на всички здравни картони"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Алергии"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"алергии"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Четене на данните за алергиите"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Имунизации"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"имунизации"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Четене на данните за имунизациите"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Лабораторни резултати"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"лабораторни резултати"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Четене на лабораторните резултати"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Алергии"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"алергии"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Четене на данните за алергиите"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Състояния"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"състояния"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Четене на състоянията"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Ваксини"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ваксини"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Четене на данните за ваксините"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Лабораторни резултати"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"лабораторни резултати"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Четене на лабораторните резултати"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Лекарства"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"лекарства"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Четене на данните за лекарствата"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Лични данни"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"лични данни"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Четене на личните данни"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Подробности за практикуващите лекари"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"подробности за практикуващите лекари"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Четене на подробностите за практикуващите лекари"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Бременност"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"бременност"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Четене на данните за бременността"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Проблеми"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"проблеми"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Четене на проблемите"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Процедури"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"процедури"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Четене на процедурите"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Социална история"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Социална история"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"социална история"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Четене на социалната история"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Жизнени показатели"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Посещения"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"посещения"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Четене на посещенията"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Жизнени показатели"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"жизнени показатели"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Четене на жизнените показатели"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Осъзнатост"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Запис на данните за осъзнатост"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Разрешаване на <xliff:g id="APP_NAME">%1$s</xliff:g> да чете"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Разрешаване на <xliff:g id="APP_NAME">%1$s</xliff:g> да записва"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Отказ"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Разрешаване"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Разреш. на всичко"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Забраняване"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Изберете данните, които искате да чете или записва това приложение в Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Изберете данните, които искате да чете или записва това приложение в Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Изберете данните, които искате да чете това приложение от Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Изберете данните, които искате да записва това приложение в Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ако предоставите достъп за четене, приложението ще може да чете новите данни и тези от последните 30 дни"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ако предоставите достъп за четене, приложението ще може да чете новите и миналите данни"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> достъп до Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"В <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> на програмиста можете да научите как <xliff:g id="APP_NAME">%1$s</xliff:g> обработва данните ви"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> достъп до данните за физическата активност и благосъстоянието?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"В <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> на <xliff:g id="APP_NAME">%1$s</xliff:g> можете да научите как приложението обработва данните ви"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"декларацията за поверителност"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> да осъществява достъп до здравните ви картони?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ако предоставите достъп, приложението ще може да чете и записва данни, като например алергии, лабораторни резултати, ваксини и др.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ако предоставите достъп, приложението ще може да чете данни, като например алергии, лабораторни резултати, ваксини и др.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Всичко за здравните картони"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Данните, които ще бъдат споделени, включват"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ако предоставите разрешението, <xliff:g id="APP_NAME">%1$s</xliff:g> ще може да споделя здравните ви картони с Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Синхронизирайте здравните си картони от различни приложения и източници, за да ги съхранявате на едно място"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Да се премахнат ли всички разрешения?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Премахване на всички"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва данни от Health Connect.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до местоположението, камерата или микрофона."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва данни от Health Connect, включително предишни данни.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до местоположението, камерата или микрофона."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва данни от Health Connect, включително данни на заден план и предишни данни.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до местоположението, камерата или микрофона."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Изтриване от Health Connect и на данните от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Да се премахнат ли всички разрешения?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Да се премахнат ли всички разрешения за здравните картони?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Да се премахнат ли разреш. за физ. активност и благосъст.?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Изтриване от Health Connect и на данните за физическата активност от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Да се премахнат ли всички разрешения за здравните картони?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Изтриване от Health Connect и на здравните картони от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва тези данни от Health Connect.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до камерата, микрофона или местоположението."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва тези данни от Health Connect, включително данни на заден план.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до камерата, микрофона или местоположението."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва тези данни от Health Connect, включително данни за минали периоди.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до камерата, микрофона или местоположението."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва тези данни от Health Connect, включително данни на заден план и данни за минали периоди.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до камерата, микрофона или местоположението."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Да се премахнат ли всички разрешения?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва данни от Health Connect.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до местоположението, камерата или микрофона."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва данни от Health Connect, включително данни на заден план.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до камерата, микрофона или местоположението."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва данни от Health Connect, включително данни за минали периоди.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до камерата, микрофона или местоположението."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> вече няма да може да чете, нито да записва данни от Health Connect, включително данни на заден план и данни за минали периоди.\n\nТова няма да засегне другите разрешения, с които приложението може да разполага, като например за достъп до камерата, микрофона или местоположението."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Изтриване от Health Connect и на данните за физическата активност и здравните картони от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Разрешенията за това приложение са премахнати"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Изтриване и на всички данни в Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Следващият ден"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Избраният ден"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Предишният ден"</string>
     <string name="default_error" msgid="7966868260616403475">"Нещо се обърка. Моля, опитайте отново."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Неизвестен ресурс"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Изходни данни"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Отваряща скоба."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Затваряща скоба."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Поле <xliff:g id="FIELD">%2$s</xliff:g> Стойност"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Тези приложения вече нямат достъп, но техни данни все още се съхраняват в Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> може да чете данни, добавени след <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"За да управлявате други разрешения за Android, до които това приложение има достъп, отворете „Настройки &gt; Приложения“"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Данните, които споделяте с приложението <xliff:g id="APP_NAME">%1$s</xliff:g>, се обхващат от декларацията му за поверителност"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"В декларацията за поверителност на програмиста можете да научите как <xliff:g id="APP_NAME">%1$s</xliff:g> обработва данните ви"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"За да управлявате другите разрешения за Android, до които това приложение има достъп, отворете „Настройки“ и след това „Приложения“"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Прочетете декларацията за поверителност"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Осъществен бе достъп през последните 24 часа"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Достъп на приложението"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Понастоящем нямате инсталирани съвместими приложения"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Допълнителен достъп"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Минали данни, данни на заден план"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Допълнителните разрешения са премахнати за това приложение"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Разрешения"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Физическа активност и благосъстояние"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Упражнения, сън, хранене и др."</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Здравни досиета"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"здравни досиета"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Лаб. резултати, медикаменти, имунизации и др."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Лаб. резултати, лекарства, ваксини и др."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Премахнати разрешения за приложенията"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect премахна разрешенията за <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect премахна разрешенията за <xliff:g id="APP_DATA_0">%1$s</xliff:g> и <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Към Google Play Магазин"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Първи стъпки с Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect съхранява данните за здравословното ви състояние и физическата ви активност и ви предоставя лесен начин да синхронизирате различните приложения на устройството си"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect съхранява и синхронизира данните за здравето и физическата ви активност от различни приложения.\n\n"<b>"Данните за физическата активност и благосъстоянието,"</b>" включително сесиите с упражнения, крачките, храненето, съня и др.\n\n"<b>"Здравните картони,"</b>" включително ваксини, лабораторни резултати и др."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"С Health Connect можете да правите следното"</string>
     <string name="share_data" msgid="3481932156368883946">"Споделяне на данни с приложенията ви"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Изберете типовете данни, които отделните приложения да четат или записват в Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Настройки и поверителност"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Слабо менструално течение"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Умерено менструално течение"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Обилно менструално течение"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Няма данни за менструалното течение"</string>
     <string name="period_day" msgid="3821944462093965882">"Ден <xliff:g id="DAY">%1$d</xliff:g> от <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> от месечния цикъл"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Менструация (1 ден)}other{Менструация (# дни)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Положителен резултат"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Отрицателен резултат"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Висока"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Музика"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Друго"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Без напътствия"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Средно"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Интензивно"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> мин"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ч и <xliff:g id="MIN">%2$s</xliff:g> мин"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ч"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Интегрирането е в ход"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect се интегрира със системата Android.\n\nПрехвърлянето на данните и разрешенията ви може да отнеме известно време."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Не затваряйте приложението, преди да получите известие, че процесът е завършен."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Интегрирането на Health Connect е в ход"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Необходима е актуализация"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect се интегрира със системата Android, така че да имате достъп до приложението директно от настройките."</string>
     <string name="update_button" msgid="4544529019832009496">"Актуализиране"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Стартирайте тази актуализация, така че Health Connect да може да продължи да се интегрира със системните ви настройки"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Актуализиране сега"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Необходима е системна актуализация"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Преди да продължите, актуализирайте системата на телефона си."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ако вече сте актуализирали системата на телефона си, рестартирайте го, така че интегрирането да продължи"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Необходима е актуализация на Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Преди да продължите, актуализирайте приложението Health Connect до най-новата версия."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Необходимо е още място"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"За да продължи интегрирането, Health Connect се нуждае от <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> свободно място в хранилището на телефона ви.\n\nОсвободете място на телефона си и опитайте отново."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Нов опит"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Освобождаване на място"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Необходимо е още място"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"За да продължи интегрирането, Health Connect се нуждае от <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> свободно място в хранилището на телефона ви."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Интегрирането е поставено на пауза"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Приложението Health Connect бе затворено, докато се интегрираше в системата Android.\n\nКликнете върху бутона за възобновяване, за да отворите приложението отново и да продължите прехвърлянето на данните и разрешенията си."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"За да запазите данните си в Health Connect, завършете процеса в рамките на <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Докоснете, за да продължите интегрирането на Health Connect със системата Android. За да запазите данните си, завършете процеса в рамките на <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Докоснете, за да продължите интегрирането на Health Connect със системата Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Напред"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Възобновяване на интегрирането на Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"За да запазите данните си, завършете процеса в рамките на <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Необходима е актуализация на приложението"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> трябва да се актуализира, за да продължи да се синхронизира с Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Някои приложения трябва да бъдат актуализирани, за да продължат да се синхронизират с Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> трябва да се актуализира, за да продължи да се синхронизира с Health Connect. Актуализациите може да не са налице за всички приложения."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Някои приложения трябва да бъдат актуализирани, за да продължат да се синхронизират с Health Connect. Актуализациите може да не са налице за всички приложения."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Проверка за актуализации"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Научете повече"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Интегриране на Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Интегрирането на Health Connect не бе завършено"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Ще получите известие, когато отново е налице."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Разбрах"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Интегрирането на Health Connect не бе завършено"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Прочетете още"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Интегрирането на Health Connect завърши"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Отваряне"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Новите неща"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Вече можете да осъществявате достъп до Health Connect директно от настройките. Имате възможност да деинсталирате приложението по всяко време, за да освободите място в хранилището."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Разбрах"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Редактиране на източниците на приложения"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Стандартно за устройството"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Данни от приложението"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Тук ще се показват данните от приложенията, които имат достъп до Health Connect"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Данните от <xliff:g id="APP_NAME">%1$s</xliff:g> ще се показват тук"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Тук ще се показват данните от приложенията, които имат достъп до Health Connect"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Ден"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Седмица"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Месец"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Последният месец"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Записи"</string>
     <string name="tab_access" msgid="7818197975407243701">"Достъп"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Да се предостави ли допълнителен достъп на <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска достъп и до тези настройки за Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Активирайте поне едно разрешение за четене, за да предоставите на това приложение достъп на заден план или достъп до предишните данни"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Активирайте поне едно разрешение за четене, за да предоставите на това приложение достъп на заден план"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Активирайте поне едно разрешение за четене, за да предоставите на това приложение достъп до предишните данни"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Започнете да използвате Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Синхронизирайте първите си приложения, за да споделяте между тях данните за здравето и физическата активност"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Настройване"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Преглед на съвместимите приложения"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Намерете още приложения, които да синхронизирате с(ъс) <xliff:g id="APP_NAME">%s</xliff:g> чрез Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Преглед в магазина за приложения"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Задаване на опция за заключване на екрана"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"За допълнителна сигурност на здравните ви данни задайте ПИН код, фигура или парола за това устройство"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Задаване на опция за заключване на екрана"</string>
     <string name="select_all" msgid="837499881590001166">"Избиране на всички"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Свързаните приложения вече няма да могат да четат тези данни от Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"С отметка"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Без отметка"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Налице е маршрут на картата за упражнения"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Следващият ден"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Следващата седмица"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Следващият месец"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Предишният ден"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Предишната седмица"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Предишният месец"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Да се изтрият ли за постоянно всички данни?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Да се изтрият ли за постоянно избраните данни?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Да се изтрият ли за постоянно всички данни от <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Да се изтрият ли за постоянно избраните записи от <xliff:g id="APP_NAME">%1$s</xliff:g> за седмицата <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Да се изтрият ли за постоянно избраните записи от <xliff:g id="APP_NAME">%1$s</xliff:g> за <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Да се изтрие ли за постоянно този запис от <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Да се изтрият ли за постоянно данните за <xliff:g id="DATA_TYPE">%1$s</xliff:g> за <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Вкл."</string>
+    <string name="off" msgid="6996623844428550649">"Изкл."</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Осъществен достъп: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Осъществен достъп: вчера, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Осъществен достъп: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Разрешаване винаги"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Разреш. на избраните"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"При употреба на приложението"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Отказване на всички"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> достъп до данните за физическата активност и благосъстоянието?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска достъп до <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nМожете да изберете да разрешите всички или да ги контролирате поотделно."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> достъп до <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Физическа активност и благосъстояние"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"през цялото време"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"при използване"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"През цялото време"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"При използване"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> има достъп до всичките ви данни за физическата активност и благосъстоянието <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"С разрешение за достъп"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"С разрешение за четене"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Тези разрешения дават на <xliff:g id="APP_NAME">%1$s</xliff:g> достъп до данните от сензорите на устройството ви."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> от <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> приложения имат разрешение"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Няма заявяващи достъп приложения"</string>
+    <string name="allowed" msgid="4158456017482263737">"Разрешено"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Не е разрешено"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Приложенията с това разрешение имат достъп до данните за <xliff:g id="DATA_TYPE">%s</xliff:g> от сензорите на устройството ви."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Да се премахне ли достъпът до <xliff:g id="DATA_TYPE">%s</xliff:g> за всички приложения на часовника ви?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Отметка"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Кръстче"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Понастоящем <xliff:g id="APP_NAME">%1$s</xliff:g> има достъп до данните за физическата активност и благосъстоянието <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Да се разреши ли на <xliff:g id="APP_NAME">%1$s</xliff:g> достъп до данните за физическата активност и благосъстоянието по всяко време?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> има достъп до <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Управление на разрешенията за физическата активност и благосъстоянието"</string>
 </resources>
diff --git a/apk/res/values-bn/strings.xml b/apk/res/values-bn/strings.xml
index 4bd0537..94da818 100644
--- a/apk/res/values-bn/strings.xml
+++ b/apk/res/values-bn/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"আপনার ডিভাইসে স্বাস্থ্য ও ফিটনেস সংক্রান্ত ডেটা ম্যানেজ করুন ও কোন কোন অ্যাপ এই ডেটা অ্যাক্সেস করতে পারবে তা নিয়ন্ত্রণ করুন"</string>
     <string name="data_title" msgid="4456619761533380816">"ডেটা ও অ্যাক্সেস"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"স্বাস্থ্য বিষয়ক রেকর্ড ব্রাউজ করুন"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"আপনার স্বাস্থ্য বিষয়ক রেকর্ড এবং কোন কোন অ্যাপ সেগুলি অ্যাক্সেস করতে পারে তা দেখুন"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"সব বিভাগ"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"সব বিভাগ দেখুন"</string>
     <string name="no_data" msgid="1906986019249068659">"কোনও ডেটা নেই"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"গতকাল"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"পড়ুন: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"লিখুন: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"অনুমতি ম্যানেজ করুন"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"সময়: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"অ্যাক্টিভিটি"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"আপনার স্বাস্থ্য সংক্রান্ত ডেটা অ্যাক্সেস করুন"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"ক্যালোরি খরচের ডেটা দেখা"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"কত ক্যালোরি খরচ হয়েছে সেই সংক্রান্ত ডেটা"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"ব্যাকগ্রাউন্ডে ডেটা অ্যাক্সেস"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g>-কে ব্যাকগ্রাউন্ডে ডেটা অ্যাক্সেস করার অনুরোধ দেবেন?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g>-কে ব্যাকগ্রাউন্ডে ডেটা অ্যাক্সেস করার অনুমতি দিতে চান?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"আপনি অনুমতি দিলে, অ্যাপ ব্যবহার না করলেও, এই অ্যাপ ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা এবং স্বাস্থ্য বিষয়ক রেকর্ড অ্যাক্সেস করতে পারবে।"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"আপনি অনুমতি দিলে, অ্যাপ ব্যবহার না করলেও, এই অ্যাপ স্বাস্থ্য বিষয়ক রেকর্ড অ্যাক্সেস করতে পারবে।"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"আপনি অনুমতি দিলে, অ্যাপ ব্যবহার না করলেও, এই অ্যাপ ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা অ্যাক্সেস করতে পারবে।"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"আপনি অনুমতি দিলে, অ্যাপ ব্যবহার না করলেও, এই অ্যাপ Health Connect ডেটা অ্যাক্সেস করতে পারবে।"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g>-কে পুরনো ডেটার অ্যাক্সেস দিতে চান?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"আপনি অনুমতি দিলে, এই অ্যাপ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> তারিখের আগে যোগ করা, ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা অ্যাক্সেস করতে পারবে।"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"আপনি অনুমতি দিলে, এই অ্যাপ ফিটনেস ও ওয়েলনেস সংক্রান্ত পুরনো সব ডেটা অ্যাক্সেস করতে পারবে।"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"আপনি অনুমতি দিলে, এই অ্যাপ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-এর আগে যোগ করা Health Connect ডেটা অ্যাক্সেস করতে পারবে।"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"আপনি অনুমতি দিলে, এই অ্যাপ পুরনো সব Health Connect ডেটা অ্যাক্সেস করতে পারবে।"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g>-কে অতিরিক্ত অ্যাক্সেস দিতে চান?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g>, এইসব Health Connect সেটিংস অ্যাক্সেস করতে চায়"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"ব্যাকগ্রাউন্ডে সমস্ত ডেটা অ্যাক্সেস করুন"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ব্যাকগ্রাউন্ডে স্বাস্থ্য বিষয়ক রেকর্ড অ্যাক্সেস করুন"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ব্যাকগ্রাউন্ডে ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা অ্যাক্সেস করুন"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"আপনি অ্যাপ ব্যবহার না করলেও এই অ্যাপকে ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা এবং স্বাস্থ্য বিষয়ক রেকর্ড অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"আপনি অ্যাপ ব্যবহার না করলেও এই অ্যাপকে ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"আপনি অ্যাপ ব্যবহার না করলেও এই অ্যাপকে ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"ব্যাকগ্রাউন্ডে ডেটা অ্যাক্সেস করুন"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"আপনি অ্যাপ ব্যবহার না করার সময় এই অ্যাপকে Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ফিটনেস ও ওয়েলনেস সংক্রান্ত পুরনো ডেটা অ্যাক্সেস করুন"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"এই অ্যাপকে <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> তারিখের আগে যোগ করা ডেটা অ্যাক্সেসের অনুমতি দিন"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"এই অ্যাপকে পুরনো সব ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"পুরনো ডেটা অ্যাক্সেস করুন"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"এই অ্যাপকে <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-এর আগে যোগ করা Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"এই অ্যাপকে পুরনো সব Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"আপনার স্বাস্থ্য বিষয়ক রেকর্ডের জন্য <xliff:g id="APP_NAME">%1$s</xliff:g> আগে থেকেই পুরনো ডেটা অ্যাক্সেস করতে পারে"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"অনুমতিগুলি সম্পর্কে আরও জানুন"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"ব্যাকগ্রাউন্ডে সমস্ত ডেটা অ্যাক্সেস করুন"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ব্যাকগ্রাউন্ডে স্বাস্থ্য বিষয়ক রেকর্ড অ্যাক্সেস করুন"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ব্যাকগ্রাউন্ডে ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা অ্যাক্সেস করুন"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"আপনি অ্যাপ ব্যবহার না করলেও এই অ্যাপকে ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা এবং স্বাস্থ্য বিষয়ক রেকর্ড অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"আপনি অ্যাপ ব্যবহার না করলেও এই অ্যাপকে ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"আপনি অ্যাপ ব্যবহার না করলেও এই অ্যাপকে ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"ব্যাকগ্রাউন্ডে ডেটা অ্যাক্সেস করুন"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"আপনি অ্যাপ ব্যবহার না করার সময় এই অ্যাপকে Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ফিটনেস ও ওয়েলনেস সংক্রান্ত পুরনো ডেটা অ্যাক্সেস করুন"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"এই অ্যাপকে <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> তারিখের আগে যোগ করা ডেটা অ্যাক্সেসের অনুমতি দিন"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"এই অ্যাপকে পুরনো সব ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"পুরনো ডেটা অ্যাক্সেস করুন"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"এই অ্যাপকে <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-এর আগে যোগ করা Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"এই অ্যাপকে Health Connect-এর পুরনো সব ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"কোনও ফিটনেস ডেটা বর্তমানে দেখা যাচ্ছে না কারণ <xliff:g id="APP_NAME">%1$s</xliff:g>-এর কাছে রিড পার্মিশন নেই"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"আপনার স্বাস্থ্য বিষয়ক রেকর্ডের জন্য <xliff:g id="APP_NAME">%1$s</xliff:g> আগে থেকেই পুরনো ডেটা অ্যাক্সেস করতে পারবে। এটি পরিবর্তন করতে, এই অ্যাপের জন্য স্বাস্থ্য বিষয়ক রেকর্ডের অনুমতি বন্ধ করুন"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"স্বাস্থ্য বিষয়ক রেকর্ড সম্পর্কিত অনুমতি ম্যানেজ করুন"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"এই অ্যাপে ব্যাকগ্রাউন্ড বা পুরনো ডেটা অ্যাক্সেস করার সুবিধা চালু করতে কমপক্ষে একটি রিড পার্মিশন চালু করুন"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"এই অ্যাপে ব্যাকগ্রাউন্ড অ্যাক্সেস করার সুবিধা চালু করতে কমপক্ষে একটি রিড পার্মিশন চালু করুন"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"এই অ্যাপে পুরনো ডেটা অ্যাক্সেস করার সুবিধা চালু করতে কমপক্ষে একটি রিড পার্মিশন চালু করুন"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"এই অ্যাপকে পুরনো সব Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
     <string name="background_read_description" msgid="3203594555849969283">"আপনি অ্যাপটি ব্যবহার না করার সময় এই অ্যাপকে Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"আপনি অনুমতি দিলে, এই অ্যাপটি Health Connect ডেটা অ্যাক্সেস করতে পারবে।"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"পুরনো ডেটায় অ্যাক্সেস"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g>-কে পুরনো ডেটা অ্যাক্সেস করার অনুমতি দেবেন?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-এর আগে এই অ্যাপকে Health Connect ডেটা অ্যাক্সেস করতে অনুমতি দিন"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"এই অ্যাপকে পুরনো সব Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিন"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"আপনি অনুমতি দিলে, এই অ্যাপটি <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-এর আগে যোগ করা Health Connect ডেটা অ্যাক্সেস করতে পারবে।"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"আপনি অনুমতি দিলে, এই অ্যাপটি পুরনো সব Health Connect ডেটা অ্যাক্সেস করতে পারবে।"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"অ্যাক্টিভিটির সময় খরচ হওয়া ক্যালোরি সংক্রান্ত ডেটা"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"অ্যাক্টিভিটির সময় খরচ হওয়া ক্যালোরি সংক্রান্ত ডেটা"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"অ্যাক্টিভিটির সময় কতটা ক্যালোরি খরচ হয়েছে সেই সংক্রান্ত ডেটা দেখার অনুমতি দিন"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"হুইলচেয়ার পুশ করা সংক্রান্ত ডেটা"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"হুইলচেয়ার পুশ করা সংক্রান্ত ডেটা দেখুন"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"হুইলচেয়ার পুশ করা সংক্রান্ত ডেটা এডিট করুন"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"কত অ্যাক্টিভিটি করা হয়েছে তার ডেটা"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"কত অ্যাক্টিভিটি করা হয়েছে তার ডেটা"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"কত অ্যাক্টিভিটি করা হয়েছে তার ডেটা দেখুন"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"কত অ্যাক্টিভিটি করা হয়েছে তার ডেটা এডিট করুন"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"স্বাভাবিক অবস্থায় মেটাবলিক রেটের ডেটা"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"স্বাভাবিক অবস্থায় মেটাবলিক রেটের ডেটা"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"স্বাভাবিক অবস্থায় মেটাবলিক রেট সংক্রান্ত ডেটা দেখুন"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"শরীরের তাপমাত্রার ডেটা"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"শরীরের তাপমাত্রার ডেটা দেখার অনুমতি"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"শরীরের তাপমাত্রার ডেটা এডিট করার অনুমতি"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"এটিতে সিঙ্ক করা সব স্বাস্থ্য বিষয়ক রেকর্ড ও Health Connect-এ যোগ করা ডেটা অন্তর্ভুক্ত। এটি হয়ত আপনার সম্পূর্ণ মেডিকেল রেকর্ড নয় এবং আপনার স্বাস্থ্য বিষয়ক রেকর্ডের মেডিকেল বিবরণ হয়ত অন্তর্ভুক্ত নেই।"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"স্বাস্থ্য বিষয়ক সব রেকর্ড"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"স্বাস্থ্য বিষয়ক সব রেকর্ড"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"স্বাস্থ্য বিষয়ক সব রেকর্ড লিখুন"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"অ্যালার্জি"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"অ্যালার্জি"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"অ্যালার্জি সম্পর্কে পড়ুন"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"রোগ প্রতিরোধের টিকা"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"রোগ প্রতিরোধের টিকা"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"রোগ প্রতিরোধের টিকা সংক্রান্ত ডেটা পড়ুন"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ল্যাবরেটরির ফলাফল"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ল্যাবরেটরির ফলাফল"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ল্যাবরেটরি ফলাফলের ডেটা দেখার অনুমতি দিন"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"অ্যালার্জি"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"অ্যালার্জি"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"অ্যালার্জি সম্পর্কে পড়ুন"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"চিকিৎসা সংক্রান্ত অবস্থা"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"চিকিৎসা সংক্রান্ত অবস্থা"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"চিকিৎসা সংক্রান্ত অবস্থার ডেটা দেখার অনুমতি দিন"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ভ্যাকসিন"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ভ্যাকসিন"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ভ্যাকসিন সম্পর্কে পড়ুন"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ল্যাবের ফলাফল"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ল্যাবের ফলাফল"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ল্যাবের ফলাফল পড়ুন"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ওষুধ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ওষুধ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ওষুধ সম্পর্কিত ডেটা পড়ুন"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ব্যক্তিগত বিবরণ"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ব্যক্তিগত বিবরণ"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"ব্যক্তিগত বিবরণ দেখার অনুমতি দিন"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"চিকিৎসা প্রদানকারীর বিবরণ"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"চিকিৎসা প্রদানকারীর বিবরণ"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"চিকিৎসা প্রদানকারীর বিবরণ দেখার অনুমতি দিন"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"গর্ভাবস্থা"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"গর্ভাবস্থা"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"গর্ভাবস্থা সংক্রান্ত ডেটা দেখার অনুমতি দিন"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"সমস্যা"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"সমস্যা"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"সমস্যা সংক্রান্ত ডেটা দেখার অনুমতি দিন"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"পদ্ধতি"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"পদ্ধতি"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"বিভিন্ন পদ্ধতির ডেটা দেখার অনুমতি দিন"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"সোশ্যাল ইতিহাস"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"সোশ্যাল ইতিহাস"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"সোশ্যাল ইতিহাস"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"সোশ্যাল ইতিহাস সংক্রান্ত ডেটা দেখার অনুমতি দিন"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"ভাইটাল সাইন"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"সাক্ষাতের তথ্য"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"সাক্ষাতের তথ্য"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"চিকিৎসা প্রদানকারীর সাথে সাক্ষাতের তথ্য দেখার অনুমতি দিন"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"ভাইটাল সাইন"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"ভাইটাল সাইন"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"ভাইটাল সাইন সংক্রান্ত ডেটা দেখার অনুমতি দিন"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"মনোযোগ সহকারে"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"মনোযোগ সহকারে সম্পর্কিত ডেটা লিখুন"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”-কে দেখার অনুমতি দিন"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”-কে এডিট করার অনুমতি দিন"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"বাতিল করুন"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"অনুমতি দিন"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"সব অনুমতি দিন"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"অনুমতি দেবেন না"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Health Connect-এর কোন ডেটা এই অ্যাপ দেখতে ও এডিট করতে পারবে তা বেছে নিন"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Health Connect-এর কোন কোন ডেটা এই অ্যাপকে দেখতে ও সেভ করতে দিতে চান তা বেছে নিন"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connect থেকে কোন কোন ডেটা এই অ্যাপকে দেখতে দিতে চান তা বেছে নিন"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Health Connect-এর কোন কোন ডেটা এই অ্যাপকে সেভ করতে দিতে চান তা বেছে নিন"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"আপনি এই অ্যাপকে পড়ার অ্যাক্সেস দিলে অ্যাপটি নতুন ডেটা সহ গত ৩০ দিনের ডেটাও পড়তে পারবে"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"আপনি এই অ্যাপকে পড়ার অ্যাক্সেস দিলে অ্যাপটি নতুন ও পুরনো ডেটা পড়তে পারবে"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g>-কে Health Connect অ্যাক্সেস করার অনুমতি দেবেন?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"কীভাবে <xliff:g id="APP_NAME">%1$s</xliff:g> আপনার ডেটা ম্যানেজ করে, ডেভেলপারের <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> থেকে আপনি তা জানতে পারবেন"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g>-কে ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা অ্যাক্সেস করার অনুমতি দিতে চান?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> কীভাবে তার <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>-এ আপনার ডেটা ম্যানেজ করে আপনি তা জানতে পারবেন"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"গোপনীয়তা নীতি"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g>-কে আপনার স্বাস্থ্য বিষয়ক রেকর্ড অ্যাক্সেস করার জন্য অনুমতি দেবেন?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"আপনি অ্যাক্সেস দিলে, অ্যাপটি অ্যালার্জি, ল্যাবের ফলাফল, ভ্যাকসিন ও আরও অনেক কিছুর মতো ডেটা পড়তে ও সেভ করতে পারবে\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"আপনি অ্যাক্সেস দিলে, অ্যাপটি অ্যালার্জি, ল্যাবের ফলাফল, ভ্যাকসিন ও আরও অনেক কিছুর মতো ডেটা পড়তে পারবে\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"স্বাস্থ্য বিষয়ক রেকর্ড সম্পর্কে"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"শেয়ার করা ডেটাতে এই তথ্য অন্তর্ভুক্ত"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"আপনি অনুমতি দিলে, <xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect-এর সাথে স্বাস্থ্য বিষয়ক রেকর্ড শেয়ার করতে পারবে।"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"আপনার স্বাস্থ্য বিষয়ক রেকর্ড এক জায়গাতেই রাখতে আলাদা অ্যাপ ও সোর্স থেকে তা সিঙ্ক করুন"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"সব অনুমতি সরাবেন?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"সবকটি সরান"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Health Connect থেকে <xliff:g id="APP_NAME">%1$s</xliff:g> আর কোনও ডেটা পড়তে অথবা লিখতে পারবে না।\n\nএই অ্যাপে অন্যান্য অনুমতি থাকলেও এটি সেসবের উপরে কোনও প্রভাব ফেলে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> পুরনো ডেটা ছাড়াও Health Connect-এর কোনও ডেটা দেখতে বা এডিট করতে পারবে না।\n\nলোকেশন, ক্যামেরা বা মাইক্রোফোনের মতো এই অ্যাপের জন্য অন্য কোনও কিছুতে অনুমতি থাকলে তাতে কোনও প্রভাব পড়বে না।"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ব্যাকগ্রাউন্ড ও পুরনো ডেটা ছাড়াও Health Connect-এর কোনও ডেটা দেখতে বা এডিট করতে পারবে না।\n\nলোকেশন, ক্যামেরা বা মাইক্রোফোনের মতো এই অ্যাপের জন্য অন্য কোনও কিছুতে অনুমতি থাকলে তাতে কোনও প্রভাব পড়বে না।"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"এছাড়া, <xliff:g id="APP_NAME">%1$s</xliff:g>-এর ডেটাও Health Connect থেকে মুছে দিন"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"সব অনুমতি সরাবেন?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"স্বাস্থ্য বিষয়ক রেকর্ড সংক্রান্ত সব অনুমতি সরাবেন?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ফিটনেস ও সুস্থতা সংক্রান্ত সব অনুমতি সরিয়ে দিতে চান?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"এছাড়াও, <xliff:g id="APP_NAME">%1$s</xliff:g> ও Health Connect-এর থেকে পাওয়া ফিটনেস ডেটা মুছে ফেলা হবে"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"স্বাস্থ্য বিষয়ক রেকর্ড সংক্রান্ত সব অনুমতি সরাবেন?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"এছাড়াও, <xliff:g id="APP_NAME">%1$s</xliff:g> ও Health Connect-এর থেকে পাওয়া স্বাস্থ্য বিষয়ক রেকর্ড মুছে ফেলা হবে"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connect-এর এই ডেটা দেখতে বা এডিট করতে পারবে না।\n\nএই অ্যাপের ক্ষেত্রে যদি অন্য কোনও অনুমতি দেওয়া থাকে, সেগুলির উপরে কোনও প্রভাব পড়বে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"ব্যাকগ্রাউন্ড ডেটা সহ <xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connect-এর এই ডেটা দেখতে বা এডিট করতে পারবে না।\n\nএই অ্যাপের ক্ষেত্রে যদি অন্য কোনও অনুমতি দেওয়া থাকে, সেগুলির উপরে কোনও প্রভাব পড়বে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"অতীতের ডেটা সহ <xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connect-এর এই ডেটা দেখতে বা এডিট করতে পারবে না।\n\nএই অ্যাপের ক্ষেত্রে যদি অন্য কোনও অনুমতি দেওয়া থাকে, সেগুলির উপরে কোনও প্রভাব পড়বে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"ব্যাকগ্রাউন্ড ও অতীতের ডেটা সহ <xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connect-এর কোনও ডেটা দেখতে বা এডিট করতে পারবে না।\n\nএই অ্যাপের ক্ষেত্রে যদি অন্য কোনও অনুমতি দেওয়া থাকে, সেগুলির উপরে কোনও প্রভাব পড়বে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"সব অনুমতি সরাবেন?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connect-এর কোনও ডেটা দেখতে বা এডিট করতে পারবে না।\n\nএই অ্যাপের ক্ষেত্রে যদি অন্য কোনও অনুমতি দেওয়া থাকে, সেগুলির উপরে কোনও প্রভাব পড়বে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"ব্যাকগ্রাউন্ড ডেটা সহ <xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connect-এর কোনও ডেটা দেখতে বা এডিট করতে পারবে না।\n\nএই অ্যাপের ক্ষেত্রে যদি অন্য কোনও অনুমতি দেওয়া থাকে, সেগুলির উপরে কোনও প্রভাব পড়বে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"অতীতের ডেটা সহ <xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connect-এর কোনও ডেটা দেখতে বা এডিট করতে পারবে না।\n\nএই অ্যাপের ক্ষেত্রে যদি অন্য কোনও অনুমতি দেওয়া থাকে, সেগুলির উপরে কোনও প্রভাব পড়বে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"ব্যাকগ্রাউন্ড ও অতীতের ডেটা সহ <xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connect-এর কোনও ডেটা দেখতে বা এডিট করতে পারবে না।\n\nএই অ্যাপের ক্ষেত্রে যদি অন্য কোনও অনুমতি দেওয়া থাকে, সেগুলির উপরে কোনও প্রভাব পড়বে না, যেমন ক্যামেরা, মাইক্রোফোন বা লোকেশন।"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"এছাড়া, <xliff:g id="APP_NAME">%1$s</xliff:g> ও Health Connect-এর থেকে পাওয়া ফিটনেস ডেটা ও স্বাস্থ্য বিষয়ক রেকর্ড মুছে ফেলা হবে"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"এই অ্যাপের জন্য অনুমতি সরিয়ে দেওয়া হয়েছে"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"এছাড়া, এটির জন্য সব Health Connect ডেটা মুছে যাবে"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"পরের দিন"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"দিন বেছে নেওয়া হয়েছে"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"আগের দিন"</string>
     <string name="default_error" msgid="7966868260616403475">"কিছু সমস্যা হয়েছে। আবার চেষ্টা করুন।"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"অজানা রিসোর্স"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"সোর্স ডেটা"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>শুরুর ব্র্যাকেট।"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>শেষ ব্র্যাকেট।"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ফিল্ডের <xliff:g id="FIELD">%2$s</xliff:g> মান"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"এইসব অ্যাপের আর অ্যাক্সেস না থাকলেও, এখনও এদের ডেটা Health Connect-এ সেভ করা আছে"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>-এর পরে যোগ করা যেকোনও ডেটা পড়তে পারবে"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"এই অ্যাপ অ্যাক্সেস করতে পারে এমন সব Android অনুমতি ম্যানেজ করতে \'সেটিংস &gt; অ্যাপ\' বিকল্পে যান"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর সাথে আপনার শেয়ার করা ডেটা সেটির গোপনীয়তা নীতি অনুযায়ী প্রযোজ্য"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> কীভাবে ডেভেলপারের গোপনীয়তা নীতি অনুসারে আপনার ডেটা ম্যানেজ করে তা জানতে পারবেন"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"এই অ্যাপের অ্যাক্সেস থাকা অন্যান্য Android অনুমতি ম্যানেজ করতে, প্রথমে সেটিংসে যান, তারপরে \'অ্যাপ\' বিকল্পে ট্যাপ করুন"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"গোপনীয়তা নীতি পড়ুন"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"গত ২৪ ঘণ্টায় অ্যাক্সেস করা হয়েছে"</string>
     <string name="app_access_title" msgid="7137018424885371763">"অ্যাপের অ্যাক্সেস"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"বর্তমানে আপনার কাছে মানানসই কোনও অ্যাপ ইনস্টল করা নেই"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"অতিরিক্ত অ্যাক্সেস"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"পুরনো ডেটা, ব্যাকগ্রাউন্ড ডেটা"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"এই অ্যাপের জন্য অতিরিক্ত অনুমতি সরানো হয়েছে"</string>
     <string name="permissions_header" msgid="6519976063360071569">"অনুমতি"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ফিটনেস ও সুস্থতা"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ব্যায়াম, ঘুম, পুষ্টি ও অন্যান্য"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"স্বাস্থ্য বিষয়ক রেকর্ড"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"স্বাস্থ্য বিষয়ক রেকর্ড"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ল্যাবের ফলাফল, ওষুধ, টিকা ও অন্যান্য"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ল্যাবের ফলাফল, ওষুধ, ভ্যাকসিন ও অন্যান্য"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"অ্যাপকে দেওয়া অনুমতি সরানো হয়েছে"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect <xliff:g id="APP_DATA">%s</xliff:g>-এর জন্য অনুমতি সরিয়ে দিয়েছে"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect <xliff:g id="APP_DATA_0">%1$s</xliff:g> ও <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>-এর জন্য অনুমতি সরিয়ে দিয়েছে"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store-এ যান"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect ব্যবহার শুরু করুন"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect আপনার স্বাস্থ্য ও ফিটনেস সম্পর্কিত ডেটা সেভ করে, যার ফলে আপনি সহজেই বিভিন্ন অ্যাপ আপনার ডিভাইসে সিঙ্ক করে নিতে পারেন"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect বিভিন্ন অ্যাপ থেকে আপনার স্বাস্থ্য ও ফিটনেস সম্পর্কিত ডেটা সেভ ও সিঙ্ক করে।\n\n"<b>"ফিটনেস এবং সুস্থতা সংক্রান্ত ডেটা,"</b>" এর মধ্যে ব্যায়ামের সেশন, কতটা হেঁটেছেন, পুষ্টি, ঘুম ও আরও অনেক কিছু অন্তর্ভুক্ত\n\n"<b>"স্বাস্থ্য বিষয়ক রেকর্ড,"</b>" এর মধ্যে ভ্যাকসিন, ল্যাবের ফলাফল ও আরও অনেক কিছু অন্তর্ভুক্ত"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect -এর মাধ্যমে আপনি এগুলি করতে পারবেন"</string>
     <string name="share_data" msgid="3481932156368883946">"অ্যাপের সাথে ডেটা শেয়ার করুন"</string>
     <string name="share_data_description" msgid="2919871301634375092">"প্রতিটি অ্যাপ, Health Connect-এর যেসব ডেটা দেখতে ও এডিট করতে পারবে সেগুলি বেছে নিন"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"আপনার সেটিংস ও গোপনীয়তা ম্যানেজ করুন"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"লাইট ফ্লো"</string>
     <string name="flow_medium" msgid="3783688724668943154">"মিডিয়াম ফ্লো"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"হেভি ফ্লো"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"অজানা ফ্লো"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> দিনের মধ্যে ঋতুস্রাবের <xliff:g id="DAY">%1$d</xliff:g>তম দিন"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{সময়সীমা (১ দিন)}one{সময়সীমা (# দিন)}other{সময়সীমা (# দিন)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"পজিটিভ"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"নেগেটিভ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"বেশি"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"মিউজিক"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"অন্যান্য"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"গাইড ছাড়া"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"মাঝারি"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"পরিশ্রমসাধ্য"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> মিনিট"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ঘণ্টা <xliff:g id="MIN">%2$s</xliff:g> মিনিট"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ঘণ্টা"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ইন্টিগ্রেশনের কাজ চলছে"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect, Android সিস্টেমের মাধ্যমে ইন্টিগ্রেট করা হচ্ছে।\n\nআপনার ডেটা ও অনুমতি ট্রান্সফার হতে কিছুটা সময় লাগতে পারে।"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"প্রসেস যে সম্পূর্ণ হয়েছে সেই সম্পর্কিত বিজ্ঞপ্তি না পাওয়া পর্যন্ত অ্যাপ বন্ধ করবেন না।"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect ইন্টিগ্রেশনের কাজ চলছে"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"আপডেট করা প্রয়োজন"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect Android সিস্টেমের মাধ্যমে ইন্টিগ্রেট করা হচ্ছে যাতে আপনি নিজের সেটিংস থেকে এটি সরাসরি অ্যাক্সেস করতে পারেন।"</string>
     <string name="update_button" msgid="4544529019832009496">"আপডেট করুন"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"এই আপডেট চালু করুন যাতে Health Connect আপনার সিস্টেমের সেটিংসের মাধ্যমে ইন্টিগ্রেশন চালিয়ে যেতে পারে"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"এখনই আপডেট করুন"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"সিস্টেম আপডেট করা প্রয়োজন"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"চালিয়ে যাওয়ার আগে, আপনার ফোনের সিস্টেম আপডেট করুন।"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"আপনি আগেই নিজের ফোনের সিস্টেম আপডেট করে থাকলে, ইন্টিগ্রেশন চালিয়ে যেতে ফোন রিস্টার্ট করে দেখুন"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect আপডেট করা প্রয়োজন"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"চালিয়ে যাওয়ার আগে, Health Connect অ্যাপকে লেটেস্ট ভার্সনে আপডেট করুন।"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"আরও জায়গা প্রয়োজন"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"ইন্টিগ্রেশন চালিয়ে যেতে, Health Connect-এর জন্য আপনার ফোনের স্টোরেজে <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> জায়গা প্রয়োজন।\n\nআপনার ফোনে কিছুটা জায়গা খালি করে আবার চেষ্টা করুন।"</string>
     <string name="try_again_button" msgid="8745496819992160789">"আবার চেষ্টা করুন"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"স্টোরেজ খালি করুন"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"আরও জায়গা প্রয়োজন"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"ইন্টিগ্রেশন চালিয়ে যাওয়ার জন্য, আপনার ফোনে Health Connect-এর <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> স্টোরেজের জায়গা প্রয়োজন।"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ইন্টিগ্রেশন বন্ধ করা হয়েছে"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect অ্যাপটি Android সিস্টেমের সাথে ইন্টিগ্রেট করার সময় বন্ধ হয়ে গেছে।\n\nঅ্যাপটি আবার খুলতে \'চালু করুন\' বিকল্পে ক্লিক করে নিজের ডেটা ও অনুমতি ট্রান্সফার করা চালিয়ে যান।"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"আপনার Health Connect সম্পর্কিত ডেটা রেখে দিতে, <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-এর মধ্যে সম্পূর্ণ করুন"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Android সিস্টেমের মাধ্যমে Health Connect ইন্টিগ্রেট করা চালিয়ে যেতে ট্যাপ করুন। আপনার ডেটা রেখে দিতে, এটি <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-এর মধ্যে সম্পূর্ণ করুন"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Android সিস্টেমের মাধ্যমে Health Connect ইন্টিগ্রেট করা চালিয়ে যেতে ট্যাপ করুন।"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"চালিয়ে যান"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect ইন্টিগ্রেশন আবার চালু করুন"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"আপনার ডেটা রেখে দিতে, এটি <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-এর মধ্যে সম্পূর্ণ করুন"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"অ্যাপ আপডেট করতে হবে"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect-এর সাথে সিঙ্ক করা চালিয়ে যেতে <xliff:g id="APP_NAME">%1$s</xliff:g> আপডেট করতে হবে"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect-এর সাথে সিঙ্ক করা চালিয়ে যেতে কিছু অ্যাপ আপডেট করতে হবে"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect-এর সাথে সিঙ্ক করা চালিয়ে যেতে <xliff:g id="APP_NAME">%1$s</xliff:g> আপডেট করতে হবে। সব আ্যাপের জন্য আপডেট উপলভ্য নাও হতে পারে।"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect-এর সাথে সিঙ্ক করা চালিয়ে যেতে কিছু অ্যাপ আপডেট করতে হবে। সব আ্যাপের জন্য আপডেট উপলভ্য নাও হতে পারে।"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"কোনও আপডেট আছে কিনা দেখুন"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"আরও জানুন"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect ইন্টিগ্রেশন"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect ইন্টিগ্রেশন সম্পূর্ণ হয়নি"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"এটি আবার উপলভ্য হলে আপনি বিজ্ঞপ্তি পাবেন।"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"বুঝেছি"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect ইন্টিগ্রেশন সম্পূর্ণ হয়নি"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"আরও পড়ুন"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect ইন্টিগ্রেশন সম্পূর্ণ হয়েছে"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"খুলুন"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"নতুন কী রয়েছে"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"আপনি এখন সেটিংস থেকে সরাসরি Health Connect অ্যাক্সেস করতে পারবেন। স্টোরেজ স্পেস খালি করতে, যেকোনও সময় Health Connect অ্যাপ আনইনস্টল করুন।"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"বুঝেছি"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"অ্যাপের সোর্স এডিট করুন"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ডিভাইসের ডিফল্ট অ্যাপ"</string>
     <string name="app_data_title" msgid="6499967982291000837">"অ্যাপ ডেটা"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect-এর অ্যাক্সেস সহ অ্যাপ থেকে পাওয়া ডেটা এখানে দেখানো হবে"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> থেকে পাওয়া ডেটা এখানে দেখানো হবে"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect-এর অ্যাক্সেস সহ অ্যাপ থেকে পাওয়া ডেটা এখানে দেখানো হবে"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"দিনের"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"সপ্তাহের"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"মাসের"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"গত মাসের"</string>
     <string name="tab_entries" msgid="3402700951602029493">"এন্ট্রি"</string>
     <string name="tab_access" msgid="7818197975407243701">"অ্যাক্সেস রয়েছে"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর অতিরিক্ত অ্যাক্সেসের অনুমতি দেবেন?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> এইসব Health Connect সেটিংস অ্যাক্সেস করতে চায়"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"এই অ্যাপে ব্যাকগ্রাউন্ড বা পুরনো ডেটা অ্যাক্সেস করার সুবিধা চালু করতে কমপক্ষে একটি রিড পার্মিশন চালু করুন"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"এই অ্যাপে ব্যাকগ্রাউন্ড অ্যাক্সেস করার সুবিধা চালু করতে কমপক্ষে একটি রিড পার্মিশন চালু করুন"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"এই অ্যাপে পুরনো ডেটা অ্যাক্সেস করার সুবিধা চালু করতে কমপক্ষে একটি রিড পার্মিশন চালু করুন"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect ব্যবহার করা শুরু করুন"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"আপনার প্রথম অ্যাপগুলি সিঙ্ক করুন যাতে সেগুলির মধ্যে স্বাস্থ্য ও ফিটনেস ডেটা শেয়ার করা যায়"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"সেট-আপ করুন"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"মানানসই অ্যাপ দেখুন"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect-এর মাধ্যমে <xliff:g id="APP_NAME">%s</xliff:g>-এর সাথে কানেক্ট করার জন্য আরও অ্যাপ খুঁজুন"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"অ্যাপ স্টোরে দেখুন"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"\'স্ক্রিন লক\' সেট-আপ করুন"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"আপনার স্বাস্থ্য ডেটার জন্য অতিরিক্ত সুরক্ষা পেতে, এই ডিভাইসে পিন, প্যাটার্ন বা পাসওয়ার্ড সেট করুন"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"\'স্ক্রিন লক\' ফিচার সেট করুন"</string>
     <string name="select_all" msgid="837499881590001166">"সবকটি বেছে নিন"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"কানেক্ট করা অ্যাপ Health Connect থেকে এই ডেটা আর পড়তে পারবে না"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"টিক চিহ্ন দিয়েছেন"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"টিক চিহ্ন দেওয়া নেই"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"ব্যায়াম সংক্রান্ত ম্যাপ রুট উপলভ্য আছে"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"পরের দিন"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"পরের সপ্তাহে"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"পরের মাস"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"আগের দিন"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"আগের সপ্তাহ"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"আগের মাস"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"সব ডেটা স্থায়ীভাবে মুছে দিতে চান?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"বেছে নেওয়া ডেটা স্থায়ীভাবে মুছে দিতে চান?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g> সম্পর্কিত সব ডেটা স্থায়ীভাবে মুছে দিতে চান?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> সপ্তাহের বেছে নেওয়া <xliff:g id="APP_NAME">%1$s</xliff:g> সম্পর্কিত এন্ট্রি স্থায়ীভাবে মুছে দিতে চান?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>-এর বেছে নেওয়া <xliff:g id="APP_NAME">%1$s</xliff:g> সম্পর্কিত ডেটা স্থায়ীভাবে মুছে দিতে চান?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"এই <xliff:g id="APP_NAME">%s</xliff:g> সম্পর্কিত এন্ট্রি স্থায়ীভাবে মুছে দিতে চান?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g>-এর <xliff:g id="DATA_TYPE">%1$s</xliff:g> ডেটা স্থায়ীভাবে মুছে ফেলতে চান?"</string>
+    <string name="on" msgid="8266542510798355807">"চালু আছে"</string>
+    <string name="off" msgid="6996623844428550649">"বন্ধ আছে"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g>-এ অ্যাক্সেস করা হয়েছে"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"গতকাল <xliff:g id="TIME_DATE">%1$s</xliff:g>-এ অ্যাক্সেস করা হয়েছে"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>-এ অ্যাক্সেস করা হয়েছে"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"সবসময়ের জন্য অনুমতি দিন"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"বেছে নেওয়া অনুমতিগুলি দিন"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"অ্যাপ ব্যবহার করার সময়"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"কোনও অনুমতি দেবেন না"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপকে ফিটনেস ও ওয়েলনেস সংক্রান্ত ডেটা অ্যাক্সেস করার অনুমতি দিতে চান?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DATA_TYPES">%2$s</xliff:g> অ্যাক্সেস করার অনুমতি চাইছে।\n\nসব অনুমতি দিতে অথবা আলাদাভাবে নিয়ন্ত্রণ করার জন্য বেছে নিন।"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="DATA_TYPE">%2$s</xliff:g> অ্যাক্সেস করতে <xliff:g id="APP_NAME">%1$s</xliff:g>-কে অনুমতি দিতে চান?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ফিটনেস ও সুস্থতা"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"সব সময়ের জন্য"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"শুধু ব্যবহারের সময়"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"সব সময়ের জন্য"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"শুধু ব্যবহারের সময়"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> আপনার সব ফিটনেস ও ওয়েলনেস ডেটা অ্যাক্সেস করতে পারবে <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"অ্যাক্সেসের অনুমতি আছে"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"পড়ার অনুমতি দেওয়া হয়েছে"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"এইসব অনুমতি আপনার ডিভাইস সেন্সর থেকে ডেটাতে <xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপকে অ্যাক্সেস করতে দেয়।"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g>টি অ্যাপের মধ্যে <xliff:g id="NUMBER_0">%1$d</xliff:g>টি অনুমোদিত"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"কোনও অ্যাপ অনুমতি দেওয়ার অনুরোধ করেনি"</string>
+    <string name="allowed" msgid="4158456017482263737">"অনুমোদিত"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"অননুমোদিত"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"এই অনুমতি আছে এমন অ্যাপ আপনার ডিভাইসের সেন্সর থেকে <xliff:g id="DATA_TYPE">%s</xliff:g> ডেটা অ্যাক্সেস করতে পারবে।"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"আপনার স্মার্টওয়াচে সব অ্যাপের জন্য <xliff:g id="DATA_TYPE">%s</xliff:g> অ্যাক্সেস সরাতে চান?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"টিক চিহ্ন"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"ক্রস চিহ্ন"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"বর্তমানে, <xliff:g id="APP_NAME">%1$s</xliff:g> ফিটনেস ও সুস্থতা সম্পর্কিত ডেটা অ্যাক্সেস করতে পারবে <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপকে ফিটনেস ও সুস্থতা সম্পর্কিত ডেটা সব সময় অ্যাক্সেস করার অনুমতি দিতে চান?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপের <xliff:g id="DATA_TYPES">%2$s</xliff:g>-এ অ্যাক্সেস আছে"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ফিটনেস ও সুস্থতা সম্পর্কিত অনুমতি ম্যানেজ করুন"</string>
 </resources>
diff --git a/apk/res/values-bs/strings.xml b/apk/res/values-bs/strings.xml
index adc4445..6819da3 100644
--- a/apk/res/values-bs/strings.xml
+++ b/apk/res/values-bs/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Upravljajte podacima o zdravlju i fitnesu na uređaju i kontrolirajte koje aplikacije im mogu pristupiti"</string>
     <string name="data_title" msgid="4456619761533380816">"Podaci i pristup"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Pregledajte zdravstvenu evidenciju"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Pogledajte zdravstvene evidencije i koje im aplikacije mogu pristupati"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Sve kategorije"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Prikaz svih kategorija"</string>
     <string name="no_data" msgid="1906986019249068659">"Nema podataka"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Jučer"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Čitanje: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Zapisivanje: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Upravljajte odobrenjima"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Vrijeme: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivnost"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"pristupanje podacima o zdravlju"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Čitanje potrošenih kalorija"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Dozvoljava aplikaciji da čita potrošene kalorije"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Pristup podacima u pozadini"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> pristup podacima u pozadini?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima u pozadini?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ako joj dozvolite, aplikacija će moći pristupati podacima o fitnesu i wellnessu te zdravstvenim evidencijama kada ne koristite aplikaciju."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ako joj dozvolite, aplikacija će moći pristupati zdravstvenim evidencijama kada ne koristiti aplikaciju."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ako joj dozvolite, aplikacija će moći pristupati podacima o fitnesu i wellnessu kada ne koristite aplikaciju."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ako joj dozvolite, aplikacija će moći pristupati podacima Health Connecta kada ne koristite aplikaciju."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa prijašnjim podacima?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ako joj dozvolite, aplikacija će moći pristupati podacima o fitnesu i wellnessu dodanim prije dana <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ako joj dozvolite, aplikacija će moći pristupati svim prijašnjim podacima o fitnesu i wellnessu."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ako joj dozvolite, aplikacija će moći pristupati podacima Health Connecta dodanim prije dana <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ako joj dozvolite, aplikacija će moći pristupati svim prijašnjim podacima Health Connecta."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Dozvoliti dodatni pristup aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> također želi pristupati ovim postavkama Health Connecta"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Pristup svim podacima u pozadini"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Pristup zdravstvenim evidencijama u pozadini"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Pristup podacima o fitnesu i wellnessu u pozadini"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Dozvolite ovoj aplikaciji da pristupa podacima o fitnesu i wellnessu te zdravstvenim evidencijama kada ne koristite aplikaciju"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Dozvolite ovoj aplikaciji da pristupa ovim podacima kada ne koristite aplikaciju"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Dozvolite ovoj aplikaciji da pristupa ovim podacima kada ne koristite aplikaciju"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Pristup podacima u pozadini"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Dozvolite ovoj aplikaciji da pristupa podacima Health Connecta kada ne koristite aplikaciju"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Pristup prijašnjim podacima o fitnesu i wellnessu"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Dozvolite aplikaciji da pristupa podacima dodanim prije dana <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Dozvolite aplikaciji da pristupa svim prijašnjim podacima"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Pristup prijašnjim podacima"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Dozvolite ovoj aplikaciji da pristupa podacima Health Connecta koji su dodani prije dana <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Dozvolite ovoj aplikaciji da pristupa svim prijašnjim podacima Health Connecta"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> možda već ima pristup prijašnjim podacima za vaše zdravstvene evidencije"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Saznajte više o odobrenjima"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Pristup svim podacima u pozadini"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Pristup zdravstvenim evidencijama u pozadini"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Pristup podacima o fitnesu i wellnessu u pozadini"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Dozvolite ovoj aplikaciji da pristupa podacima o fitnesu i wellnessu te zdravstvenim evidencijama kada ne koristite aplikaciju"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Dozvolite ovoj aplikaciji da pristupa ovim podacima kada ne koristite aplikaciju"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Dozvolite ovoj aplikaciji da pristupa ovim podacima kada ne koristite aplikaciju"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Pristup podacima u pozadini"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Dozvolite ovoj aplikaciji da pristupa podacima Health Connecta kada ne koristite aplikaciju"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Pristup prijašnjim podacima o fitnesu i wellnessu"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Dozvolite aplikaciji da pristupa podacima dodanim prije dana <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Dozvolite aplikaciji da pristupa svim prijašnjim podacima"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Pristup prijašnjim podacima"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Dozvolite ovoj aplikaciji da pristupa podacima Health Connecta koji su dodani prije dana <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Dozvolite aplikaciji da pristupa svim prijašnjim podacima Health Connecta"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Podaci o fitnesu se trenutno ne čitaju jer aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> nema uključena odobrenja za čitanje"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> možda već ima pristup prijašnjim podacima za vaše zdravstvene evidencije. Da promijenite ovo, isključite odobrenja za zdravstvenu evidenciju za ovu aplikaciju"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Odobrenja za zdravstvenu evidenciju"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Omogućite najmanje jedno odobrenje za čitanje da za ovu aplikaciju uključite pristup pozadinskim ili ranijim podacima"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Omogućite najmanje jedno odobrenje za čitanje da za ovu aplikaciju uključite pristup iz pozadine"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Omogućite najmanje jedno odobrenje za čitanje da za ovu aplikaciju uključite pristup historijskim podacima"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Dozvolite ovoj aplikaciji da pristupa svim prijašnjim podacima Health Connecta"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Dozvolite ovoj aplikaciji pristup podacima aplikacije Health Connect kad ne koristite aplikaciju"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ako dozvolite pristup, ova aplikacija može pristupiti podacima aplikacije Health Connect kad ne koristite aplikaciju."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Pristup ranijim podacima"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupi prethodnim podacima?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Dozvolite ovoj aplikaciji pristup podacima aplikacije Health Connect koji su dodani prije dana <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Dozvolite ovoj aplikaciji da pristupa svim prijašnjim podacima Health Connecta"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ako dozvolite pristup, ova aplikacija može pristupiti podacima aplikacije Health Connect koji su dodani prije dana <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ako joj dozvolite, aplikacija će moći pristupati svim prijašnjim podacima Health Connecta."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Kalorije potrošene kroz aktivnost"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"kalorije potrošene kroz aktivnost"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Čitanje kalorija potrošenih kroz aktivnost"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"guranja u invalidskim kolicima"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Čitanje guranja u invalidskim kolicima"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Zapisivanje guranja u invalidskim kolicima"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intenzitet aktivnosti"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intenzitet aktivnosti"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Čitanje podataka o intenzitetu aktivnosti"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Zapisivanje podataka o intenzitetu aktivnosti"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Bazalni metabolizam"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"bazalni metabolizam"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Čitanje bazalnog metabolizma"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura kože"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Čitanje temperature kože"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Zapisivanje temperature kože"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Ovo uključuje sve zdravstvene evidencije sinhronzirane s Health Connectom i dodane u njega. Ovo možda neće biti vaš potpuni zdravstveni karton i ne uključuje medicinski opis vaših zdravstvenih evidencija."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Sve zdravstvene evidencije"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"sve zdravstvene evidencije"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Pisanje svih zdravstvenih evidencija"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergije"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergije"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Čitanje podataka o alergijama"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunizacija"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunizacija"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Čitanje podataka o imunizaciji"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorijski nalazi"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorijski nalazi"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Čitanje laboratorijskih nalaza"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergije"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergije"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Čitanje podataka o alergijama"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Uslovi"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"uslovi"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Uslovi za čitanje"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vakcine"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vakcine"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Čitanje podataka o vakcinama"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratorijski nalazi"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratorijski nalazi"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Čitanje laboratorijskih nalaza"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Lijekovi"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"lijekovi"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Čitanje podataka o lijekovima"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Lični podaci"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"lični podaci"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Čitaj lične podatke"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Podaci doktora"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"podaci doktora"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Čitaj podatke doktora"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Trudnoća"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"trudnoća"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Čitanje podataka o trudnoći"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemi"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemi"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Čitanje podataka o problemima"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Postupci"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"postupci"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Čitanje podataka o postupcima"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historija aktivnosti na društvenim medijima"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historija aktivnosti na društvenim medijima"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historija aktivnosti na društvenim medijima"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Čitanje historije aktivnosti na društvenim medijima"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitalni znakovi"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Posjete"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"posjete"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Čitaj posjete"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitalni znakovi"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitalni znakovi"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Čitanje podataka o vitalnim znakovima"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Usredotočena svjesnost"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Zapisivanje podataka o usredotočenoj svjesnosti"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Dozvoli aplikaciji \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" čitanje"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Dozvoli aplikaciji \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" zapisivanje"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Otkaži"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Dozvoli"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Dozvoli sve"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Nemoj dozvoliti"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Odaberite koje podatke želite da ova aplikacija čita ili zapisuje u Health Connectu"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Odaberite koje podatke želite da ova aplikacija čita ili zapisuje u Health Connectu"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Odaberite koje podatke želite da ova aplikacija čita iz Health Connecta"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Odaberite koje podatke želite da ova aplikacija zapisuje u Health Connectu"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ako joj odobrite čitanje podataka, aplikacija će moći čitati nove podatke i podatke iz posljednjih 30 dana"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ako joj odobrite čitanje podataka, aplikacija će moći čitati nove i prethodne podatke"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa Health Connectu?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Možete saznati kako <xliff:g id="APP_NAME">%1$s</xliff:g> obrađuje vaše podatke u programerovim <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima o fitnesu i wellnessu?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Možete saznati kako aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> obrađuje vaše podatke u dokumentu \"<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>\""</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"pravilima privatnosti"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa zdravstvenim evidencijama?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ako joj odobrite pristup, aplikacija može čitati i pisati podatke kao što su podaci o alergijama, laboratorijskim nalazima, vakcinama i drugo\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ako joj odobrite pristup, aplikacija može čitati podatke kao što su podaci o alergijama, laboratorijskim nalazima, vakcinama i drugo\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"O zdravstvenim evidencijama"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Podaci za dijeljenje uključuju"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ako joj dozvolite pristup, aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> može dijeliti vaše zdravstvene evidencije s Health Connectom."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinhronizirajte zdravstvene evidencije iz različitih aplikacija i izvora da ih imate na jednom mjestu"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Ukloniti sva odobrenja?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Ukloni sve"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta.\n\nOvo ne utiče na druga odobrenja koja ova aplikacija može imati, kao što je odobrenje za lokaciju, mikrofon ili kameru."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta, uključujući historijske podatke.\n\nOvo ne utiče na druga odobrenja koja aplikacija može imati, kao što je odobrenje za lokaciju, kameru ili mikrofon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta, uključujući pozadinske i historijske podatke.\n\nOvo ne utiče na druga odobrenja koja aplikacija može imati, kao što je odobrenje za lokaciju, kameru ili mikrofon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Izbriši i podatke aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Health Connecta"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Ukloniti sva odobrenja?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Ukloniti sva odobrenja za zdravstvene evidencije?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Ukloniti sva odobrenja za fitnes i dobrobit?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> izbriši i podatke o fitnesu koji potiču iz Health Connecta"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Ukloniti sva odobrenja za zdravstvene evidencije?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> izbriši i zdravstvene evidencije koje potiču iz Health Connecta"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta.\n\nOvo ne utiče na druga odobrenja koja ova aplikacija može imati, kao što je odobrenje za kameru, mikrofon ili lokaciju."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta, uključujući pozadinske podatke.\n\nOvo ne utiče na druga odobrenja koja ova aplikacija može imati, kao što je odobrenje za kameru, mikrofon ili lokaciju."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta, uključujući prijašnje podatke.\n\nOvo ne utiče na druga odobrenja koja ova aplikacija može imati, kao što je odobrenje za kameru, mikrofon ili lokaciju."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta, uključujući pozadinske i prijašnje podatke.\n\nOvo ne utiče na druga odobrenja koja ova aplikacija može imati, kao što je odobrenje za kameru, mikrofon ili lokaciju."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Ukloniti sva odobrenja?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta.\n\nOvo ne utiče na druga odobrenja koja aplikacija možda ima, kao što je odobrenje za kameru, mikrofon ili lokaciju."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta, uključujući pozadinske podatke.\n\nOvo ne utiče na druga odobrenja koja aplikacija možda ima, kao što je odobrenje za kameru, mikrofon ili lokaciju."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta, uključujući prijašnje podatke.\n\nOvo ne utiče na druga odobrenja koja aplikacija možda ima, kao što je odobrenje za kameru, mikrofon ili lokaciju."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti zapisivati podatke iz Health Connecta, uključujući pozadinske i prijašnje podatke.\n\nOvo ne utiče na druga odobrenja koja aplikacija možda ima, kao što je odobrenje za kameru, mikrofon ili lokaciju."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> izbriši i podatke o fitnesu i zdravstvene evidencije koji potiču iz Health Connecta"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Odobrenja za ovu aplikaciju su uklonjena"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Izbriši i sve podatke Health Connecta"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Sljedeći dan"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Odabrani dan"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Prethodni dan"</string>
     <string name="default_error" msgid="7966868260616403475">"Nešto nije uredu. Pokušajte ponovo."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Nepoznati izvor"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Izvorni podaci"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Lijeva uglata zagrada."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Desna uglata zagrada."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Vrijednost polja <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Ove aplikacije više nemaju pristup, ali su im podaci i dalje pohranjeni u Health Connectu"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> može čitati podatke koji su dodani nakon dana <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Da upravljate drugim odobrenjima za Android kojima ova aplikacija može pristupiti, idite u Postavke &gt; Aplikacije"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Podaci koje dijelite s aplikacijom <xliff:g id="APP_NAME">%1$s</xliff:g> obuhvaćeni su njenim pravilima privatnosti"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"U pravilima privatnosti programera možete saznati kako aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> postupa s vašim podacima"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Da upravljate drugim odobrenjima za Android kojima ova aplikacija može pristupiti, idite u Postavke, a zatim dodirnite Aplikacije"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Pročitajte pravila privatnosti"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Pristupljeno u posljednja 24 sata"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Pristup aplikacije"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Trenutno nemate instaliranu nijednu kompatibilnu aplikaciju"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Dodatni pristup"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Prijašnji i pozadinski podaci"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Uklonjena su dodatna odobrenja za ovu aplikaciju"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Odobrenja"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitnes i dobrobit"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Vježbanje, spavanje, prehrana i drugo"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Zdravstvene evidencije"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"zdravstvene evidencije"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laboratorijski nalazi, lijekovi, imunizacija i drugo"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Laboratorijski nalazi, lijekovi, vakcine itd."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Odobrenja za aplikaciju su uklonjena"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect je uklonio odobrenja za aplikaciju <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect je uklonio odobrenja za aplikacije <xliff:g id="APP_DATA_0">%1$s</xliff:g> i <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Idite u Play trgovinu"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Počnite koristiti Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect pohranjuje vaše podatke o zdravlju i fitnesu i pruža vam jednostavan način da sinhronizirate različite aplikacije na uređaju"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect pohranjuje i sinhronizira vaše podatke o zdravlju i fitnesu iz raznih aplikacija.\n\n"<b>"Podaci o fitnesu i dobrobiti,"</b>" uključujući sesije vježbanja, korake, prehranu, spavanje i druge \n\n"<b>"zdravstvene evidencije,"</b>" uključujući vakcine, laboratorijske nalaze i drugo"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Putem Health Connecta možete"</string>
     <string name="share_data" msgid="3481932156368883946">"Dijelite podatke sa svojim aplikacijama"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Odaberite podatke koje svaka aplikacija može čitati ili zapisivati u Health Connectu"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Upravljajte postavkama i privatnošću"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Slabo krvarenje"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Srednje krvarenje"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Obilno krvarenje"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Nepoznato menstrualno krvarenje"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="DAY">%1$d</xliff:g>. dan menstruacije od <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruacija (1 dan)}one{Menstruacija (# dan)}few{Menstruacija (# dana)}other{Menstruacija (# dana)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitivan"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativan"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Visoko"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muzika"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Drugo"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Bez vođenja"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Umjereno"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intenzivno"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integracija je u toku"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect se integrira s Android sistemom.\n\nMože proći neko vrijeme dok se podaci i odobrenja ne prenesu."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Nemojte zatvarati aplikaciju dok ne dobijete obavještenje da je postupak završen."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integracija Health Connecta je u toku"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Potrebno je ažuriranje"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect se integrira s Android sistemom da mu možete pristupiti direktno iz postavki."</string>
     <string name="update_button" msgid="4544529019832009496">"Ažuriraj"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Pokrenite ovo ažuriranje da Health Connect može nastaviti s integracijom s postavkama sistema"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Ažuriraj sada"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Potrebno je ažuriranje sistema"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Prije nego što nastavite, ažurirajte sistem telefona."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ako ste već ažurirali sistem telefona, pokušajte s ponovnim pokretanjem telefona da nastavite s integracijom"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Potrebno je ažurirati Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Prije nego što nastavite, ažurirajte aplikaciju Health Connect na najnoviju verziju."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Potrebno je više prostora"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect treba <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> prostora za pohranu na telefonu da nastavi s integracijom.\n\nOslobodite prostor na telefonu i pokušajte ponovo."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Pokušajte ponovo"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Oslobodite prostor"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Potrebno je više prostora"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect treba <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> prostora za pohranu na telefonu da nastavi s integracijom."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integracija je pauzirana"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikacija Health Connect se zatvorila tokom integracije s Android sistemom.\n\nKliknite na Nastavi da ponovo otvorite aplikaciju i nastavite s prenosom podataka i odobrenja."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Da sačuvate podatke Health Connecta, izvršite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Dodirnite da nastavite integrirati Health Connect s Android sistemom. Da sačuvate podatke, izvršite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Dodirnite da nastavite integrirati Health Connect s Android sistemom."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Nastavi"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Nastavite s integracijom Health Connecta"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Da sačuvate podatke, izvršite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Potrebno je ažuriranje aplikacije"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> se treba ažurirati da se nastavi sinhronizirati s Health Connectom"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Određene aplikacije se trebaju ažurirati da se nastave sinhronizirati s Health Connectom"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> se treba ažurirati da se nastavi sinhronizirati s Health Connectom. Ažuriranja možda neće biti dostupna za sve aplikacije."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Određene aplikacije se trebaju ažurirati da se nastave sinhronizirati s Health Connectom. Ažuriranja možda neće biti dostupna za sve aplikacije."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Provjerite ima li ažuriranja"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Saznajte više"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integracija Health Connecta"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integracija Health Connecta nije završena"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Dobit ćete obavještenje kada integracija ponovo bude dostupna."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Razumijem"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integracija Health Connecta nije završena"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Pročitajte više"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integracija Health Connecta je završena"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Otvori"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Šta je novo"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Sada možete pristupiti Health Connectu direktno iz postavki. Deinstalirajte aplikaciju Health Connect bilo kada da oslobodite prostor za pohranu."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Razumijem"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Uredi izvore aplikacija"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Zadana postavka uređaja"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Podaci aplikacije"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Ovdje će se prikazivati podaci iz aplikacija s pristupom Health Connectu"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Ovdje će se prikazivati podaci iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Ovdje će se prikazivati podaci iz aplikacija s pristupom Health Connectu"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dan"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Sedmica"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mjesec"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Prošli mjesec"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Unosi"</string>
     <string name="tab_access" msgid="7818197975407243701">"Pristup"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Dozvoliti dodatni pristup aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> također želi pristupiti ovim postavkama aplikacije Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Omogućite najmanje jedno odobrenje za čitanje da za ovu aplikaciju uključite pristup pozadinskim ili ranijim podacima"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Omogućite najmanje jedno odobrenje za čitanje da za ovu aplikaciju uključite pristup iz pozadine"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Omogućite najmanje jedno odobrenje za čitanje da za ovu aplikaciju uključite pristup historijskim podacima"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Počnite koristiti Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinhronizirajte prve aplikacije da međusobno dijele podatke o zdravlju i fitnesu"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Postavite"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Pogledajte kompatibilne aplikacije"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Pronađite više aplikacija koje će se sinhronizirati s aplikacijom <xliff:g id="APP_NAME">%s</xliff:g> putem Health Connecta"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Pogledajte u trgovini aplikacija"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Postavite zaključavanje ekrana"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Radi dodatne sigurnosti zdravstvenih podataka, postavite PIN, uzorak ili lozinku za uređaj"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Postavite zaključavanje ekrana"</string>
     <string name="select_all" msgid="837499881590001166">"Odaberi sve"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Povezane aplikacije više neće moći čitati ove podatke iz Health Connecta"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Označeno"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nije označeno"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Dostupno je vježbanje rute na mapi"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Sljedeći dan"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Sljedeća sedmica"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Sljedeći mjesec"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Prethodni dan"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Prethodna sedmica"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Prethodni mjesec"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Trajno izbrisati sve podatke?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Trajno izbrisati odabrane podatke?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Trajno izbrisati sve podatke aplikacije <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Trajno izbrisati odabrane unose aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> za sedmicu od <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Trajno izbrisati odabrane unose aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> za <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Trajno izbrisati ovaj unos aplikacije <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Trajno izbrisati podatke \"<xliff:g id="DATA_TYPE">%1$s</xliff:g>\" za aplikaciju <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Uključeno"</string>
+    <string name="off" msgid="6996623844428550649">"Isključeno"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Pristupljeno je u <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Pristupljeno je jučer u <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Pristupljeno je <xliff:g id="TIME_DATE_0">%1$s</xliff:g> u <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Dozvoli sve vrijeme"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Dozvoli odabrano"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Dok se aplikacija koristi"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Odbij sve"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima o fitnesu i wellnessu?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> traži pristup podacima vrste <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nOdaberite želite li dozvoliti sve ili upravljati njima pojedinačno."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima vrste <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitnes i dobrobit"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sve vrijeme"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"tokom upotrebe"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sve vrijeme"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Tokom upotrebe"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> može pristupati svim vašim podacima o fitnesu i dobrobiti <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Dozvoljen pristup"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Dozvoljeno čitanje"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ova odobrenja daju aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> pristup podacima sa senzora uređaja."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Aplikacije s odobrenjem: <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nijedna aplikacija ne traži odobrenje"</string>
+    <string name="allowed" msgid="4158456017482263737">"Dozvoljeno"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nije dozvoljeno"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikacije s ovim odobrenjem mogu pristupati podacima vrste \"<xliff:g id="DATA_TYPE">%s</xliff:g>\" sa senzora uređaja."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Ukloniti pristup podacima vrste \"<xliff:g id="DATA_TYPE">%s</xliff:g>\" za sve aplikacije na satu?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Kvačica"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Znak prekriženo"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno može pristupati podacima o fitnesu i dobrobiti <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Dozvoliti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima o fitnesu i dobrobiti sve vrijeme?"</string>
+    <string name="current_access" msgid="1457167070428176139">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ima pristup podacima vrste <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Upravljajte odobrenjima za podatke o fitnesu i dobrobiti"</string>
 </resources>
diff --git a/apk/res/values-ca/strings.xml b/apk/res/values-ca/strings.xml
index a8e2176..c3a8c3c 100644
--- a/apk/res/values-ca/strings.xml
+++ b/apk/res/values-ca/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Gestiona les dades de salut i fitnes al dispositiu, i controla quines aplicacions poden accedir-hi"</string>
     <string name="data_title" msgid="4456619761533380816">"Dades i accés"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Navega pels registres de salut"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Consulta els teus registres de salut i quines aplicacions hi poden accedir"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Totes les categories"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Mostra totes les categories"</string>
     <string name="no_data" msgid="1906986019249068659">"No hi ha dades"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Ahir"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lectura: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Escriptura: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Gestiona els permisos"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Hora: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activitat"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"accedir a les teves dades de salut"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Llegir les calories cremades"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Permet que l\'aplicació llegeixi les calories cremades"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Accedir a les dades en segon pla"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a les dades en segon pla?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a les dades en segon pla?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Si ho permets, aquesta aplicació podrà accedir a les dades de fitnes i benestar i als registres de salut quan no l\'estiguis utilitzant."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Si ho permets, aquesta aplicació podrà accedir als registres de salut quan no l\'estiguis utilitzant."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Si ho permets, aquesta aplicació podrà accedir a les dades de fitnes i benestar quan no l\'estiguis utilitzant."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Si ho permets, aquesta aplicació podrà accedir a les dades de Salut connectada quan no l\'estiguis utilitzant."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a les dades anteriors?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Si ho permets, aquesta aplicació podrà accedir a les dades de fitnes i benestar afegides abans del dia <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Si ho permets, aquesta aplicació podrà accedir a totes les dades anteriors de fitnes i benestar."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Si ho permets, aquesta aplicació podrà accedir a les dades de Salut connectada afegides abans del dia <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Si ho permets, aquesta aplicació podrà accedir a les dades anteriors de Salut connectada."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Vols permetre accés addicional a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> també vol accedir a la configuració de Salut connectada"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Accedir a totes les dades en segon pla"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Accedir als registres de salut en segon pla"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Accedir a les dades de fitnes i benestar en segon pla"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Permet que aquesta aplicació accedeixi a les dades de fitnes i benestar i als registres de salut quan no l\'estiguis utilitzant"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Permet que aquesta aplicació accedeixi a aquestes dades quan no l\'estiguis utilitzant"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Permet que aquesta aplicació accedeixi a aquestes dades quan no l\'estiguis utilitzant"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Accedir a les dades en segon pla"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Permet que aquesta aplicació accedeixi a les dades de Salut connectada quan no l\'estiguis utilitzant"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Accedir a les dades anteriors de fitnes i benestar"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Permet que aquesta aplicació accedeixi a les dades afegides abans del dia <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Permet que aquesta aplicació accedeixi a totes les dades anteriors"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Accedir a les dades anteriors"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Permet que aquesta aplicació accedeixi a les dades de Salut connectada afegides abans del dia <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Permet que aquesta aplicació accedeixi a les dades anteriors de Salut connectada"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja pot accedir a les dades anteriors dels teus registres de salut"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Més informació sobre els permisos"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Accedir a totes les dades en segon pla"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Accedir als registres de salut en segon pla"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Accedir a les dades de fitnes i benestar en segon pla"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Permet que aquesta aplicació accedeixi a les dades de fitnes i benestar i als registres de salut quan no l\'estiguis utilitzant"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Permet que aquesta aplicació accedeixi a aquestes dades quan no l\'estiguis utilitzant"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Permet que aquesta aplicació accedeixi a aquestes dades quan no l\'estiguis utilitzant"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Accedir a les dades en segon pla"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Permet que aquesta aplicació accedeixi a les dades de Salut connectada quan no l\'estiguis utilitzant"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Accedir a les dades anteriors de fitnes i benestar"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Permet que aquesta aplicació accedeixi a les dades afegides abans del dia <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Permet que aquesta aplicació accedeixi a totes les dades anteriors"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Accedir a les dades anteriors"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Permet que aquesta aplicació accedeixi a les dades de Salut connectada afegides abans del dia <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Permet que aquesta aplicació accedeixi a totes les dades anteriors de Salut connectada"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Actualment no es llegeixen dades de fitnes perquè <xliff:g id="APP_NAME">%1$s</xliff:g> no té els permisos de lectura activats"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja pot accedir a les dades anteriors dels teus registres de salut. Per canviar-ho, desactiva els permisos de registre de salut per a aquesta aplicació"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Gestiona els permisos de registre de salut"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Activa almenys un permís de lectura per poder activar l\'accés en segon pla o a les dades anteriors d\'aquesta aplicació"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Activa almenys un permís de lectura per poder activar l\'accés en segon pla d\'aquesta aplicació"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Activa almenys un permís de lectura per poder activar l\'accés a les dades anteriors d\'aquesta aplicació"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Permet que aquesta aplicació accedeixi a les dades anteriors de Salut connectada"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Permet que aquesta aplicació accedeixi a les dades de Salut connectada quan no l\'estiguis utilitzant"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Si ho permets, aquesta aplicació podrà accedir a les dades de Salut connectada quan no l\'estiguis utilitzant."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Accedir a les dades anteriors"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a les dades anteriors?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Permet que aquesta aplicació accedeixi a les dades de Salut connectada afegides abans del dia <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Permet que aquesta aplicació accedeixi a les dades anteriors de Salut connectada"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Si ho permets, aquesta aplicació podrà accedir a les dades de Salut connectada afegides abans del dia <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Si ho permets, aquesta aplicació podrà accedir a les dades anteriors de Salut connectada."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calories actives cremades"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"calories actives cremades"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Llegir calories actives cremades"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"impulsos en cadira de rodes"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Llegir els impulsos en cadira de rodes"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Escriure els impulsos en cadira de rodes"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensitat de l\'activitat"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensitat de l\'activitat"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Llegir la intensitat de l\'activitat"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Escriure la intensitat de l\'activitat"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Metabolisme basal"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"metabolisme basal"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Llegir el metabolisme basal"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura de la pell"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Llegir la temperatura de la pell"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Escriure la temperatura de la pell"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Això inclou tots els registres de salut que s\'han sincronitzat i afegit a Salut connectada. És possible que no sigui la teva història clínica completa i no inclou una descripció mèdica dels teus registres de salut."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Tots els registres de salut"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"tots els registres de salut"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Escriure tots els registres de salut"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Al·lèrgies"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"al·lèrgies"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Llegeix les al·lèrgies"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunització"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunització"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Llegir la immunització"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Resultats de laboratori"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"resultats de laboratori"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Llegeix els resultats de laboratori"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Al·lèrgies"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"al·lèrgies"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Llegir les al·lèrgies"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Condicions"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"condicions"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Llegir les condicions"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vacunes"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vacunes"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Llegir les vacunes"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Analítiques"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"analítiques"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Llegir les analítiques"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medicaments"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medicaments"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Llegir els medicaments"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Informació personal"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"informació personal"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Llegir informació personal"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Informació del metge"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"informació del metge"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Llegir la informació del metge"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Embaràs"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"embaràs"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Llegeix l\'embaràs"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemes"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemes"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Llegeix els problemes"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procediments"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procediments"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Llegeix els procediments"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historial social"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historial social"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historial social"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Llegeix l\'historial social"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Constants vitals"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visites"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visites"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Llegir visites"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Constants vitals"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"constants vitals"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Llegeix les constants vitals"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Consciència plena"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Escriure consciència plena"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Permet que <xliff:g id="APP_NAME">%1$s</xliff:g> llegeixi"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Permet que <xliff:g id="APP_NAME">%1$s</xliff:g> escrigui"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancel·la"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Permet"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Permet-ho tot"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"No permetis"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Tria les dades que vols que aquesta aplicació pugui llegir o escriure a Salut connectada"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Tria les dades que vols que aquesta aplicació pugui llegir o escriure a Salut connectada"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Tria les dades que vols que aquesta aplicació pugui llegir de Salut connectada"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Tria les dades que vols que aquesta aplicació pugui escriure a Salut connectada"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Si li dones accés de lectura, l\'aplicació podrà llegir les dades noves i les dels 30 darrers dies"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Si li dones accés de lectura, l\'aplicació podrà llegir les dades noves i les anteriors"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a Salut connectada?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Pots obtenir informació sobre com <xliff:g id="APP_NAME">%1$s</xliff:g> gestiona les teves dades a la <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> del desenvolupador"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a les dades de fitnes i benestar?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Pots obtenir informació sobre com <xliff:g id="APP_NAME">%1$s</xliff:g> gestiona les teves dades a la seva <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"política de privadesa"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi als teus registres de salut?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Si li dones accés, l\'aplicació podrà llegir i escriure dades, com ara al·lèrgies, analítiques, vacunes i més\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Si li dones accés, l\'aplicació podrà llegir dades, com ara al·lèrgies, analítiques, vacunes i més\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Sobre els registres de salut"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Les dades per compartir inclouen"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Si ho permets, <xliff:g id="APP_NAME">%1$s</xliff:g> podrà compartir els teus registres de salut amb Salut connectada."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sincronitza els teus registres de salut de diferents aplicacions i fonts per tenir-los en un sol lloc"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Vols suprimir tots els permisos?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Suprimeix-ho tot"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure dades de Salut connectada.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure dades de Salut connectada, ni tan sols les dades anteriors.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la ubicació, la càmera o el micròfon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure dades de Salut connectada, ni tan sols les dades en segon pla o les dades anteriors.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la ubicació, la càmera o el micròfon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Suprimeix també les dades de <xliff:g id="APP_NAME">%1$s</xliff:g> de Salut connectada"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vols suprimir tots els permisos?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vols suprimir tots els permisos de registre de salut?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Vols suprimir tots els permisos de fitnes i benestar?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Suprimeix també de Salut connectada les dades de fitnes de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vols suprimir tots els permisos de registre de salut?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Suprimeix també de Salut connectada els registres de salut de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure aquestes dades de Salut connectada.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure aquestes dades de Salut connectada, ni tan sols les dades en segon pla.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure aquestes dades de Salut connectada, ni tan sols les dades anteriors.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure aquestes dades de Salut connectada, ni tan sols les dades anteriors o en segon pla.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vols suprimir tots els permisos?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure dades de Salut connectada.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure dades de Salut connectada, ni tan sols les dades en segon pla.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure dades de Salut connectada, ni tan sols les dades anteriors.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ja no podrà llegir ni escriure dades de Salut connectada, ni tan sols les dades anteriors o en segon pla.\n\nAixò no afecta altres permisos que pot tenir aquesta aplicació, com ara els relacionats amb la càmera, el micròfon o la ubicació."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Suprimeix també de Salut connectada les dades de fitnes i els registres de salut de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"S\'han suprimit els permisos per a aquesta aplicació"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Suprimeix també totes les dades de Salut connectada"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Dia següent"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Dia seleccionat"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Dia anterior"</string>
     <string name="default_error" msgid="7966868260616403475">"S\'ha produït un error. Torna-ho a provar."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Recurs desconegut"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Dades d\'origen"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Clau d\'obertura."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Clau de tancament."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Valor del camp <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Aquestes aplicacions ja no tenen accés, però encara tenen dades emmagatzemades a Salut connectada"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> pot llegir les dades afegides després del dia <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Per gestionar altres permisos d\'Android a què pot accedir aquesta aplicació, ves a Configuració &gt; Aplicacions"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Les dades que comparteixes amb <xliff:g id="APP_NAME">%1$s</xliff:g> estan subjectes a la seva política de privadesa"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Pots obtenir informació sobre com gestiona les teves dades <xliff:g id="APP_NAME">%1$s</xliff:g> a la política de privadesa del desenvolupador"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Per gestionar altres permisos d\'Android a què pot accedir aquesta aplicació, ves a Configuració i, a continuació, toca Aplicacions"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Llegeix la política de privadesa"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"S\'hi ha accedit durant les 24 darreres hores"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Accés de l\'aplicació"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Actualment no tens cap aplicació compatible instal·lada"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Accés addicional"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Dades anteriors, dades en segon pla"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"S\'han suprimit els permisos addicionals per a aquesta aplicació"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permisos"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitnes i benestar"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercici, son, nutrició i altres"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Registres de salut"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"registres de salut"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Analítiques, medicaments, vacunes i altres"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Analítiques, medicaments, vacunes i altres"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Aplicacions amb permisos suprimits"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Salut connectada ha suprimit els permisos de <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Salut connectada ha suprimit els permisos de <xliff:g id="APP_DATA_0">%1$s</xliff:g> i <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Ves a Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Comença amb Salut connectada"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Salut connectada emmagatzema les teves dades de salut i fitnes, i t\'ofereix una manera senzilla de sincronitzar les diverses aplicacions del dispositiu"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Salut connectada emmagatzema i sincronitza les teves dades de salut i fitnes de diverses aplicacions.\n\n"<b>"Dades de salut i benestar"</b>", com ara sessions d\'exercici, passos, nutrició, son i més\n\n"<b>"Registres de salut"</b>", com ara vacunes, analítiques i més"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Amb Salut connectada, pots"</string>
     <string name="share_data" msgid="3481932156368883946">"Comparteix dades amb les aplicacions"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Tria les dades que cada aplicació pot llegir o escriure a Salut connectada"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Gestiona la configuració i la privadesa"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Flux lleuger"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Flux normal"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Flux abundant"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Flux desconegut"</string>
     <string name="period_day" msgid="3821944462093965882">"Dia <xliff:g id="DAY">%1$d</xliff:g> de <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> del període menstrual"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Període menstrual (1 dia)}other{Període (# dies)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiva"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativa"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Alta"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Música"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Altres"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Sense guia"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderada"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Vigorosa"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integració en curs"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Salut connectada s\'està integrant amb el sistema Android.\n\nÉs possible que les dades i els permisos tardin una estona a transferir-se."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"No tanquis l\'aplicació fins que no se\'t notifiqui que s\'ha completat el procés."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"La integració de Salut connectada està en curs"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Actualització necessària"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Salut connectada s\'està integrant amb el sistema Android perquè hi puguis accedir directament des de la configuració."</string>
     <string name="update_button" msgid="4544529019832009496">"Actualitza"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Inicia l\'actualització perquè Salut connectada pugui continuar integrant-se amb la configuració del sistema"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Actualitza ara"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Actualització del sistema necessària"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Abans de continuar, actualitza el sistema del telèfon."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Si ja has actualitzat el sistema del telèfon, prova de reiniciar-lo per continuar la integració"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Cal actualitzar Salut connectada"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Abans de continuar, actualitza l\'aplicació Salut connectada a la darrera versió."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Es necessita més espai"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Salut connectada necessita <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> d\'espai d\'emmagatzematge al telèfon per continuar amb la integració.\n\nAllibera espai al telèfon i torna-ho a provar."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Torna-ho a provar"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Allibera espai"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Es necessita més espai"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Salut connectada necessita <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> d\'espai d\'emmagatzematge al telèfon per continuar amb la integració."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"La integració s\'ha posat en pausa"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"L\'aplicació Salut connectada s\'ha tancat mentre s\'estava integrant amb el sistema Android.\n\nFes clic a Reprèn per tornar a obrir l\'aplicació i continuar transferint les teves dades i permisos."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Per conservar les teves dades de Salut connectada, completa la integració en <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Toca per continuar integrant Salut connectada amb el sistema Android. Per conservar les teves dades, completa la integració en <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Toca per continuar integrant Salut connectada amb el sistema Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continua"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Reprèn la integració de Salut connectada"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Per conservar les teves dades, completa la integració en <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Cal actualitzar l\'aplicació"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"L\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> ha d\'estar actualitzada perquè es continuï sincronitzant amb Salut connectada"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Algunes aplicacions han d\'estar actualitzades perquè es continuïn sincronitzant amb Salut connectada"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"L\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> ha d\'estar actualitzada perquè es continuï sincronitzant amb Salut connectada. És possible que no hi hagi actualitzacions disponibles per a totes les aplicacions."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Algunes aplicacions han d\'estar actualitzades perquè es continuïn sincronitzant amb Salut connectada. És possible que no hi hagi actualitzacions disponibles per a totes les aplicacions."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Cerca actualitzacions"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Més informació"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integració de Salut connectada"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"La integració de Salut connectada no s\'ha completat"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Rebràs una notificació quan torni a estar disponible."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Entesos"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"La integració de Salut connectada no s\'ha completat"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Més informació"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"S\'ha completat la integració de Salut connectada"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Obre"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novetats"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Ara pots accedir a Salut connectada directament des de la configuració. Desinstal·la l\'aplicació Salut connectada en qualsevol moment per alliberar espai d\'emmagatzematge."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Entesos"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Edita les fonts d\'aplicacions"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Opció predeterminada del dispositiu"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Dades de l\'aplicació"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Les dades de les aplicacions amb accés a Salut connectada es mostraran aquí"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Les dades de <xliff:g id="APP_NAME">%1$s</xliff:g> es mostraran aquí"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Les dades de les aplicacions amb accés a Salut connectada es mostraran aquí"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dia"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Setmana"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mes"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"El mes passat"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entrades"</string>
     <string name="tab_access" msgid="7818197975407243701">"Accedeix"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Vols permetre accés addicional a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> també vol accedir a la configuració de Salut connectada"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Activa almenys un permís de lectura per poder activar l\'accés en segon pla o a les dades anteriors d\'aquesta aplicació"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Activa almenys un permís de lectura per poder activar l\'accés en segon pla d\'aquesta aplicació"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Activa almenys un permís de lectura per poder activar l\'accés a les dades anteriors d\'aquesta aplicació"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Començar a utilitzar Salut connectada"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sincronitza les teves primeres aplicacions perquè comparteixin dades de salut i fitnes entre elles"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configura"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Mostra les aplicacions compatibles"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Cerca més aplicacions per sincronitzar amb <xliff:g id="APP_NAME">%s</xliff:g> a través de Salut connectada"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Mostra a la botiga d\'aplicacions"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Defineix un bloqueig de pantalla"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Per a més seguretat de les teves dades de salut, configura un PIN, un patró o una contrasenya per a aquest dispositiu"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Defineix un bloqueig de pantalla"</string>
     <string name="select_all" msgid="837499881590001166">"Selecciona-ho tot"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Les aplicacions connectades ja no podran llegir aquestes dades de Salut connectada"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Marcat"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Desmarcat"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Ruta del mapa d\'exercici disponible"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Dia següent"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Setmana següent"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mes següent"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Dia anterior"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Setmana anterior"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mes anterior"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Vols suprimir permanentment totes les dades?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Vols suprimir permanentment les dades seleccionades?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Vols suprimir permanentment totes les dades de l\'aplicació <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Vols suprimir permanentment les entrades seleccionades de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> de la setmana <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Vols suprimir permanentment les entrades seleccionades de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> de <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Vols suprimir permanentment aquesta entrada de l\'aplicació <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Vols suprimir permanentment les dades de <xliff:g id="DATA_TYPE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Activat"</string>
+    <string name="off" msgid="6996623844428550649">"Desactivat"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"S\'hi ha accedit a les <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"S\'hi va accedir ahir a les <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"S\'hi ha accedit el dia <xliff:g id="TIME_DATE_0">%1$s</xliff:g> a les <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Permet sempre"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Permet seleccionats"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Mentre s\'utilitza l\'aplicació"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Rebutja\'ls tots"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a les dades de fitnes i benestar?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> sol·licita accés a <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nPermet-ho tot o controla-ho individualment."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitnes i benestar"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sempre"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"mentre s\'utilitza"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sempre"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Mentre s\'utilitza"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> pot accedir a totes les teves dades de fitnes i benestar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Amb permís d\'accés"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Amb permís de lectura"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Aquests permisos donen a <xliff:g id="APP_NAME">%1$s</xliff:g> accés a les dades dels sensors del teu dispositiu."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> aplicacions permeses"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Cap aplicació ho ha sol·licitat"</string>
+    <string name="allowed" msgid="4158456017482263737">"Es permet"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"No es permet"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Les aplicacions amb aquest permís poden accedir a les dades de <xliff:g id="DATA_TYPE">%s</xliff:g> dels sensors del teu dispositiu."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Vols suprimir l\'accés a <xliff:g id="DATA_TYPE">%s</xliff:g> per a totes les aplicacions del rellotge?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Marca de verificació"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Creu"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Actualment, <xliff:g id="APP_NAME">%1$s</xliff:g> pot accedir a les dades de fitnes i benestar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Vols permetre que <xliff:g id="APP_NAME">%1$s</xliff:g> accedeixi a les dades de fitnes i benestar sempre?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> té accés a <xliff:g id="DATA_TYPES">%2$s</xliff:g>"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Gestiona els permisos de fitnes i benestar"</string>
 </resources>
diff --git a/apk/res/values-cs/strings.xml b/apk/res/values-cs/strings.xml
index e7164de..9bce473 100644
--- a/apk/res/values-cs/strings.xml
+++ b/apk/res/values-cs/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Spravujte údaje o zdraví a kondici na zařízení a určete, které aplikace k nim mají přístup"</string>
     <string name="data_title" msgid="4456619761533380816">"Data a přístup"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Procházet zdravotní záznamy"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Zobrazte si zdravotní záznamy a aplikace, které k nim mají přístup"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Všechny kategorie"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Zobrazit všechny kategorie"</string>
     <string name="no_data" msgid="1906986019249068659">"Žádná data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Včera"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Přečteno: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Zapsáno: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Spravovat oprávnění"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Čas: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivita"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"přístup ke zdravotním údajům"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Číst spálené kalorie"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Umožňuje aplikaci číst spálené kalorie"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Přístup k datům na pozadí"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k datům na pozadí?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k datům na pozadí?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Pokud toto povolíte, bude mít aplikace přístup k údajům o kondici a kvalitě života a ke zdravotním záznamům i v době, kdy ji nebudete používat."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Pokud toto povolíte, bude mít aplikace přístup ke zdravotním záznamům i v době, kdy ji nebudete používat."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Pokud toto povolíte, bude mít aplikace přístup k údajům o kondici a kvalitě života i v době, kdy ji nebudete používat."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Pokud toto povolíte, bude mít aplikace přístup k datům Health Connect i v době, kdy ji nebudete používat."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k dřívějším datům?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Pokud toto povolíte, bude mít aplikace přístup k údajům o kondici a kvalitě života přidaným před dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Pokud toto povolíte, bude mít aplikace přístup ke všem dřívějším údajům o kondici a kvalitě života."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Pokud toto povolíte, bude mít aplikace přístup k datům Health Connect přidaným před dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Pokud toto povolíte, bude mít aplikace přístup ke všem dřívějším datům Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> další přístup?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> chce také získat přístup k těmto nastavením Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Přístup ke všem datům na pozadí"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Přístup ke zdravotním záznamům na pozadí"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Přístup k údajům o kondici a kvalitě života na pozadí"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Povolit této aplikaci přístup k údajům o kondici a kvalitě života a ke zdravotním záznamům, když ji nepoužíváte"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Povolit této aplikaci přístup k těmto datům, když ji nepoužíváte"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Povolit této aplikaci přístup k těmto datům, když ji nepoužíváte"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Přístup k datům na pozadí"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Povolit této aplikaci přístup k datům Health Connect, když ji nepoužíváte"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Přístup k dřívějším údajům o kondici a kvalitě života"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Povolit této aplikaci přístup k datům přidaným před <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Povolit této aplikaci přístup ke všem dřívějším datům"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Přístup k dřívějším datům"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Povolit této aplikaci přístup k datům Health Connect přidaným před <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Povolit této aplikaci přístup ke všem dřívějším datům Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už má přístup k vašim dřívějším zdravotním záznamům"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Další informace o oprávněních"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Přístup ke všem datům na pozadí"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Přístup ke zdravotním záznamům na pozadí"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Přístup k údajům o kondici a kvalitě života na pozadí"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Povolit této aplikaci přístup k údajům o kondici a kvalitě života a ke zdravotním záznamům, když ji nepoužíváte"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Povolit této aplikaci přístup k těmto datům, když ji nepoužíváte"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Povolit této aplikaci přístup k těmto datům, když ji nepoužíváte"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Přístup k datům na pozadí"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Povolit této aplikaci přístup k datům Health Connect, když ji nepoužíváte"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Přístup k dřívějším údajům o kondici a kvalitě života"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Povolit této aplikaci přístup k datům přidaným před <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Povolit této aplikaci přístup ke všem dřívějším datům"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Přístup k dřívějším datům"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Povolit této aplikaci přístup k datům Health Connect přidaným před <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Povolit této aplikaci přístup ke všem dřívějším datům Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Momentálně se žádné údaje o kondici nečtou, protože aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> nemá zapnutá oprávnění ke čtení"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už má k vašim zdravotním záznamům přístup. Pokud to chcete změnit, vypněte u této aplikace oprávnění ke zdravotním záznamům"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Správa oprávnění ke zdravotním záznamům"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Pokud pro tuto aplikaci chcete zapnout přístup k datům na pozadí nebo k dřívějším datům, povolte alespoň jedno oprávnění ke čtení."</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Pokud pro tuto aplikaci chcete zapnout přístup na pozadí, povolte alespoň jedno oprávnění ke čtení"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Pokud pro tuto aplikaci chcete zapnout přístup k dřívějším datům, povolte alespoň jedno oprávnění ke čtení"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Povolit této aplikaci přístup ke všem dřívějším datům Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Povolit této aplikaci přístup k datům Health Connect, když ji nepoužíváte"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Pokud toto povolíte, bude mít aplikace přístup k datům Health Connect i v době, kdy ji nebudete používat."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Přístup k dřívějším datům"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k dřívějším datům?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Povolit této aplikaci přístup k datům Health Connect přidaným před <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Povolit této aplikaci přístup ke všem dřívějším datům Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Pokud toto povolíte, bude mít aplikace přístup k datům Health Connect přidaným přede dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Pokud toto povolíte, bude mít aplikace přístup ke všem dřívějším datům Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Kalorie spálené aktivitou"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"kalorie spálené aktivitou"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Číst kalorie spálené aktivitou"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"odstrčení invalidního vozíku"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Číst odstrčení invalidního vozíku"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Zapisovat odstrčení invalidního vozíku"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intenzita aktivity"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intenzita aktivity"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Čtení intenzity aktivity"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Zápis intenzity aktivity"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Bazální metabolismus"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"bazální metabolismus"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Číst bazální metabolismus"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"teplota kůže"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Čtení teploty kůže"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Zápis teploty kůže"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"To zahrnuje všechny zdravotní záznamy synchronizované a přidané do Health Connect. Nejedná se se o vaše úplné lékařské záznamy včetně odborného popisu."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Všechny zdravotní záznamy"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"všechny zdravotní záznamy"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Zápis všech zdravotních záznamů"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergie"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergie"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Čtení alergií"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunizace"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunizace"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Čtení imunizace"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorní výsledky"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorní výsledky"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Číst laboratorní výsledky"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergie"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergie"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Čtení alergií"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Podmínky"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"podmínky"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Podmínky čtení"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vakcíny"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vakcíny"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Čtení vakcín"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Výsledky testů"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"výsledky testů"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Čtení výsledků testů"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Užívané léky"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"užívané léky"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Čtení užívaných léků"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Osobní údaje"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"osobní údaje"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Číst osobní údaje"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Záznamy od odborníků"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"záznamy od odborníků"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Číst záznamy od odborníků"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Těhotenství"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"Těhotenství"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Číst informace o těhotenství"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Potíže"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"Potíže"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Číst potíže"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Zákroky"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"zákroky"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Číst zákroky"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sociální anamnéza"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sociální anamnéza"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sociální anamnéza"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Číst sociální anamnézu"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitální znaky"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Návštěvy"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"návštěvy"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Číst návštěvy"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitální znaky"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitální znaky"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Číst vitální znaky"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Zápis dat o mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> čtení"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> zápis"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Zrušit"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Povolit"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Povolit vše"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Nepovolovat"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Vyberte data, která má tato aplikace číst nebo zapisovat do služby Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Vyberte data, která má tato aplikace číst nebo zapisovat do služby Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Vyberte data, která má tato aplikace číst ze služby Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Vyberte data, která má tato aplikace zapisovat do služby Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Pokud aplikaci udělíte přístup pro čtení, bude moct číst nová data a data z posledních 30 dnů"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Pokud aplikaci udělíte přístup pro čtení, bude moct číst nová i dřívější data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup ke službě Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Informace o tom, jak aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> zpracovává vaše data, najdete v <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> vývojáře"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k údajům o kondici a kvalitě života?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Informace o tom, jak aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> nakládá s vašimi daty, najdete v jejím dokumentu <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"zásadách ochrany soukromí"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k vašim zdravotním záznamům?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Pokud aplikaci udělíte přístup, bude moct číst a zapisovat data, jako jsou alergie, laboratorní výsledky, vakcíny a podobně\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Pokud aplikaci udělíte přístup, bude moct číst data, jako jsou alergie, laboratorní výsledky, vakcíny a podobně\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Informace o zdravotních záznamech"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Budou sdílena například následující data"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Pokud to povolíte, může aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> sdílet vaše zdravotní záznamy se službou Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synchronizujte své zdravotní záznamy z různých aplikací a zdrojů, abyste je měli na jednom místě"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Odebrat všechna oprávnění?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Odstranit vše"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat žádná data ze služby Health Connect.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace má, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat žádná data ze služby Health Connect, včetně dřívějších dat.\n\nTato akce nebude mít vliv na ostatní oprávnění, která aplikace má, jako je přístup k poloze, fotoaparátu nebo mikrofonu."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat žádná data ze služby Health Connect, včetně dat na pozadí a dřívějších dat.\n\nTato akce nebude mít vliv na ostatní oprávnění, která aplikace má, jako je přístup k poloze, fotoaparátu nebo mikrofonu."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Také vymazat data aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> ze služby Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Odebrat všechna oprávnění?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Odebrat všechna oprávnění ke zdravotním záznamům?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Odebrat všechna oprávnění pro fitness a kvalitu života?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Také ze služby Health Connect vymazat údaje o kondici z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Odebrat všechna oprávnění ke zdravotním záznamům?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Také ze služby Health Connect vymazat zdravotní záznamy z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat tato data ze služby Health Connect.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace může mít, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat tato data ze služby Health Connect, včetně dat na pozadí.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace může mít, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat tato data ze služby Health Connect, včetně dřívějších dat.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace může mít, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat tato data ze služby Health Connect, včetně dat na pozadí a dřívějších dat.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace může mít, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Odebrat všechna oprávnění?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat data ze služby Health Connect.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace může mít, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat data ze služby Health Connect, včetně dat na pozadí.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace může mít, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat data ze služby Health Connect, včetně dřívějších dat.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace může mít, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude moct číst ani zapisovat data ze služby Health Connect, včetně dat na pozadí a dřívějších dat.\n\nTato akce nemá vliv na ostatní oprávnění, která aplikace může mít, jako je přístup k fotoaparátu, mikrofonu nebo poloze."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Vymazat ze služby Health Connect také údaje o kondici a zdravotní záznamy z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Této aplikaci byla odebrána oprávnění"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Smazat i všechna data Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Další den"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Vybraný den"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Předchozí den"</string>
     <string name="default_error" msgid="7966868260616403475">"Něco se pokazilo. Zkuste to znovu."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Neznámý zdroj"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Zdrojová data"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Levá hranatá závorka."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Pravá hranatá závorka."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Pole <xliff:g id="FIELD">%2$s</xliff:g> Hodnota"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Tyto aplikace už nemají přístup, ale stále mají uložená data ve službě Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> může číst data přidaná po <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Pokud chcete spravovat ostatní oprávnění Androidu, ke kterým má aplikace přístup, přejděte do Nastavení &gt; Aplikace"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Na data sdílená s aplikací <xliff:g id="APP_NAME">%1$s</xliff:g> se vztahují její zásady ochrany soukromí"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Jak aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> nakládá s vašimi daty, zjistíte v zásadách ochrany soukromí vývojáře"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Pokud chcete spravovat ostatní oprávnění Androidu, ke kterým má aplikace přístup, přejděte do Nastavení a klepněte na Aplikace"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Zobrazit zásady ochrany soukromí"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Použito během posledních 24 hodin"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Přístup aplikace"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Momentálně nemáte nainstalované žádné kompatibilní aplikace"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Další přístup"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Dřívější data, data na pozadí"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Této aplikaci byla odebrána další oprávnění"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Oprávnění"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness a wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Cvičení, spánek, výživa a další"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Zdravotní záznamy"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"zdravotní záznamy"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Výsledky testů, léky, imunizace a další"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Výsledky testů, léky, vakcíny a další"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Odebrání oprávnění aplikacím"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Aplikace Health Connect odebrala oprávnění aplikaci <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Aplikace Health Connect odebrala oprávnění aplikacím <xliff:g id="APP_DATA_0">%1$s</xliff:g> a <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Přejít do obchodu Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Začínáme se službou Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect bezpečně ukládá údaje o zdraví a kondici, což umožňuje jednoduše synchronizovat různé aplikace v zařízení"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ukládá a synchronizuje údaje o zdraví a kondici z různých aplikací.\n\n"<b>"Údaje o zdraví a kondici,"</b>" včetně záznamů cvičení, počtu kroků, výživy, spánku atd.\n\n"<b>"Zdravotní záznamy,"</b>" včetně očkování, laboratorních výsledků atd."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"S Health Connect můžete"</string>
     <string name="share_data" msgid="3481932156368883946">"Sdílení dat s aplikacemi"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Můžete si zvolit, které údaje mohou jednotlivé aplikace číst nebo zapisovat ve službě Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Správa nastavení a ochrany soukromí"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Mírné krvácení"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Střední krvácení"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Silné krvácení"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Neznámý výtok"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="DAY">%1$d</xliff:g>. den periody z <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Perioda (1 den)}few{Perioda (# dny)}many{Perioda (# dne)}other{Perioda (# dní)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitivní"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativní"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Vysoká"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Hudba"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Jiné"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Neřízené"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Střední"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Vysoká"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Probíhá integrace"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect se integruje se systémem Android.\n\nPřenos dat a oprávnění může chvíli trvat."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Aplikaci nezavírejte, dokud nedostanete oznámení o dokončení procesu."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integrace Health Connect probíhá"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Je nutná aktualizace"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Služba Health Connect se integruje se systémem Android, abyste k ní měli přístup přímo z nastavení."</string>
     <string name="update_button" msgid="4544529019832009496">"Aktualizovat"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Zahajte aktualizaci, aby služba Health Connect mohla pokračovat v integraci s nastavením systému"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Aktualizovat"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Je potřeba aktualizace systému"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Než budete pokračovat, aktualizujte systém telefonu."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Pokud jste systém telefonu už aktualizovali, restartujte telefon, aby integrace pokračovala"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Je potřeba aktualizace Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Než budete pokračovat, aktualizujte aplikaci Health Connect na nejnovější verzi."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Je potřeba víc místa"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect potřebuje <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> místa v telefonu, aby bylo možné pokračovat v integraci.\n\nUvolněte místo a zkuste to znovu."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Zkusit znovu"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Uvolnit místo"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Je potřeba víc místa"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect potřebuje <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> místa v telefonu, aby bylo možné pokračovat v integraci."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrace byla pozastavena"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikace Health Connect byla během integrace se systémem Android zavřena.\n\nKliknutím na Pokračovat aplikaci znovu otevřete a budete pokračovat v přenosu dat a oprávnění."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Aby data Health Connect zůstala zachována, proveďte tuto akci do <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Klepnutím pokračujte v integraci Health Connect se systémem Android. Aby data zůstala zachována, proveďte tuto akci do <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Klepnutím pokračujte v integraci Health Connect se systémem Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Pokračovat"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Pokračovat v integraci Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Aby data zůstala zachována, proveďte tuto akci do <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Je vyžadována aktualizace"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Je potřeba aktualizovat aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>, aby se dál mohla synchronizovat s aplikací Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Některé aplikace je třeba aktualizovat, aby se dál mohly synchronizovat s aplikací Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Je potřeba aktualizovat aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>, aby se dál mohla synchronizovat s aplikací Health Connect. Aktualizace nemusí být k dispozici pro všechny aplikace."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Některé aplikace je třeba aktualizovat, aby se dál mohly synchronizovat s aplikací Health Connect. Aktualizace nemusí být k dispozici pro všechny aplikace."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Zkontrolovat dostupnost aktualizací"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Další informace"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integrace Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integrace Health Connect nebyla dokončena"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Až bude znovu k dispozici, dostanete oznámení."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Rozumím"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integrace Health Connect nebyla dokončena"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Další informace"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integrace Health Connect je dokončena"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Otevřít"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Co je nového"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Aplikaci Health Connect teď můžete používat přímo z nastavení. Pokud budete potřebovat uvolnit úložný prostor, můžete ji kdykoliv odinstalovat."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Rozumím"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Upravit zdroje aplikací"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Výchozí nastavení zařízení"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Data aplikace"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Tady se budou zobrazovat data z aplikací s přístupem na platformu Health Connect"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Tady se budou zobrazovat data z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Tady se budou zobrazovat data z aplikací s přístupem na platformu Health Connect"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Den"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Týden"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Měsíc"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Minulý měsíc"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Záznamy"</string>
     <string name="tab_access" msgid="7818197975407243701">"Přístup"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> další přístup?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> chce také získat přístup k těmto nastavením Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Pokud pro tuto aplikaci chcete zapnout přístup k datům na pozadí nebo k dřívějším datům, povolte alespoň jedno oprávnění ke čtení."</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Pokud pro tuto aplikaci chcete zapnout přístup na pozadí, povolte alespoň jedno oprávnění ke čtení"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Pokud pro tuto aplikaci chcete zapnout přístup k dřívějším datům, povolte alespoň jedno oprávnění ke čtení"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Začít používat Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synchronizujte první aplikace, mezi kterými chcete sdílet údaje o zdraví a kondici"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Nastavit"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Zobrazit kompatibilní aplikace"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Vyhledání dalších aplikací k synchronizaci s aplikací <xliff:g id="APP_NAME">%s</xliff:g> přes Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Zobrazit v obchodu s aplikacemi"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Nastavte zámek obrazovky"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Nastavte si na tomto zařízení PIN, gesto nebo heslo a chraňte své zdravotní údaje"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Nastavit zámek obrazovky"</string>
     <string name="select_all" msgid="837499881590001166">"Vybrat vše"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Připojené aplikace už k těmto datům ze služby Health Connect nebudou mít přístup"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Zaškrtnuto"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nezaškrtnuto"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"K dispozici je mapa trasy cvičení"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Další den"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Další týden"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Další měsíc"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Předchozí den"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Předchozí týden"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Předchozí měsíc"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Trvale smazat všechna data?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Trvale smazat vybraná data?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Trvale smazat všechna data aplikace <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Trvale smazat vybrané záznamy aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> za období <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Trvale smazat vybrané záznamy aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> za období <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Trvale smazat tento záznam aplikace <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Trvale smazat data (<xliff:g id="DATA_TYPE">%1$s</xliff:g>) aplikace <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Zapnuto"</string>
+    <string name="off" msgid="6996623844428550649">"Vypnuto"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Poslední přístup: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Poslední přístup: včera v <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Poslední přístup: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Povolit vždy"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Povolit vybrané"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Při používání aplikace"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Zamítnout vše"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k údajům o kondici a kvalitě života?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje přístup k těmto datům: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nPovolte vše, nebo přístup nastavte jednotlivě."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k těmto datům: <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness a wellness"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"neustále"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"při používání"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Neustále"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Při používání"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> má přístup ke všem vašim údajům o zdraví a wellness <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Přístup povolen"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Smí číst"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Tato oprávnění dávají aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> přístup k datům ze senzorů vašeho zařízení."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Povoleno u aplikací: <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Žádná aplikace nežádá"</string>
+    <string name="allowed" msgid="4158456017482263737">"Povoleno"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nepovoleno"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikace s tímto oprávněním mají přístup k datům typu <xliff:g id="DATA_TYPE">%s</xliff:g> ze senzorů zařízení."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Odebrat všem aplikacím v hodinkách přístup k datům typu <xliff:g id="DATA_TYPE">%s</xliff:g>?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Značka zaškrtnutí"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Křížek"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> má přístup ke všem vašim datům o fitness a wellness v režimu <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Povolit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> neustálý přístup k datům o fitness a wellness?"</string>
+    <string name="current_access" msgid="1457167070428176139">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> má přístup k těmto datům: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Spravovat oprávnění pro fitness a wellness"</string>
 </resources>
diff --git a/apk/res/values-da/strings.xml b/apk/res/values-da/strings.xml
index aad4c8c..22db2cf 100644
--- a/apk/res/values-da/strings.xml
+++ b/apk/res/values-da/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Administrer sundheds- og træningsdata på din telefon, og vælg, hvilke apps der skal have adgang til dem"</string>
     <string name="data_title" msgid="4456619761533380816">"Data og adgang"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Gennemse sundhedsoplysninger"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Se dine sundhedsoplysninger, og hvilke apps der kan tilgå dem"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Alle kategorier"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Se alle kategorier"</string>
     <string name="no_data" msgid="1906986019249068659">"Ingen data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"I går"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Læst: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Skrevet: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Administrer tilladelser"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Tidspunkt: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivitet"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"få adgang til dine sundhedsdata"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Læs forbrændte kalorier"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Tillader, at appen læser de forbrændte kalorier"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Adgang til data i baggrunden"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til data i baggrunden?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til data i baggrunden?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Hvis du tillader det, kan denne app tilgå trænings- og helbredsdata samt sundhedsoplysninger, når du ikke bruger appen."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Hvis du tillader det, kan denne app tilgå sundhedsoplysninger, når du ikke bruger appen."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Hvis du tillader det, kan denne app tilgå trænings- og helbredsdata, når du ikke bruger appen."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Hvis du tillader det, kan appen tilgå Health Connect-data, når du ikke bruger appen."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Vil du tillade, at <xliff:g id="APP_NAME">%1$s</xliff:g> kan tilgå gamle data?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Hvis du tillader det, kan denne app tilgå trænings- og helbredsdata, der er tilføjet før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Hvis du tillader det, kan denne app tilgå alle tidligere trænings- og helbredsdata."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Hvis du tillader det, kan denne app tilgå Health Connect-data, der er tilføjet før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Hvis du tillader det, kan denne app tilgå alle tidligere Health Connect-data."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> yderligere adgang?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder også om adgang til disse Health Connect-indstillinger"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Adgang til alle data i baggrunden"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Adgang til sundhedsoplysninger i baggrunden"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Adgang til trænings- og helbredsdata i baggrunden"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Giv denne app adgang til trænings- og helbredsdata samt sundhedsoplysninger, når du ikke bruger appen"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Giv denne app adgang til disse data, når du ikke bruger appen"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Giv denne app adgang til disse data, når du ikke bruger appen"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Adgang til data i baggrunden"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Giv denne app tilladelse til at tilgå Health Connect-data, når du ikke bruger appen"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Adgang til tidligere trænings- og helbredsdata"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Giv denne app adgang til data, der er tilføjet før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Giv denne app adgang til alle tidligere data"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Adgang til gamle data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Giv denne app tilladelse til at tilgå Health Connect-data, der er tilføjet før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Giv denne app tilladelse til at tilgå alle tidligere Health Connect-data"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> har allerede adgang til tidligere data om dine sundhedsoplysninger"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Læs mere om tilladelser"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Adgang til alle data i baggrunden"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Adgang til sundhedsoplysninger i baggrunden"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Adgang til trænings- og helbredsdata i baggrunden"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Giv denne app adgang til trænings- og helbredsdata samt sundhedsoplysninger, når du ikke bruger appen"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Giv denne app adgang til disse data, når du ikke bruger appen"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Giv denne app adgang til disse data, når du ikke bruger appen"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Adgang til data i baggrunden"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Giv denne app tilladelse til at tilgå Health Connect-data, når du ikke bruger appen"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Adgang til tidligere trænings- og helbredsdata"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Giv denne app adgang til data, der er tilføjet før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Giv denne app adgang til alle tidligere data"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Adgang til gamle data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Giv denne app tilladelse til at tilgå Health Connect-data, der er tilføjet før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Giv denne app tilladelse til at tilgå alle tidligere Health Connect-data"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Træningsdata læses ikke i øjeblikket, fordi <xliff:g id="APP_NAME">%1$s</xliff:g> ikke har læsetilladelse"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> har allerede adgang til tidligere data om dine sundhedsoplysninger. Hvis du vil ændre dette, skal du deaktivere tilladelser for sundhedsoplysninger for denne app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Administrer tilladelser for sundhedsoplysninger"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Giv mindst én tilladelse til at læse for at aktivere adgang i baggrunden eller tidligere dataadgang for denne app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Giv mindst én tilladelse til at læse for at aktivere adgang i baggrunden for denne app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Giv mindst én tilladelse til at læse for at aktivere tidligere dataadgang for denne app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Giv denne app tilladelse til at tilgå alle tidligere Health Connect-data"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Giv denne app adgang til Health Connect-data, når du ikke bruger appen"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Hvis du giver adgang, kan appen tilgå Health Connect-data, når du ikke bruger appen."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Adgang til gamle data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Vil du tillade, at <xliff:g id="APP_NAME">%1$s</xliff:g> kan tilgå gamle data?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Giv denne app tilladelse til at tilgå Health Connect-data, der er tilføjet før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Giv denne app tilladelse til at tilgå alle tidligere Health Connect-data"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Hvis du giver adgang, kan denne app tilgå Health Connect-data, der er tilføjet før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Hvis du tillader det, kan denne app tilgå alle tidligere Health Connect-data."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktive forbrændte kalorier"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktive forbrændte kalorier"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Læs aktive forbrændte kalorier"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"kørestolsskub"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Læs kørestolsskub"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Skriv kørestolsskub"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Aktivitetsintensitet"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"aktivitetsintensitet"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Læse aktivitetsintensitet"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Skrive aktivitetsintensitet"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Hvilestofskifte"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"hvilestofskifte"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Læs hvilestofskifte"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"hudtemperatur"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Læs hudtemperatur"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Skriv hudtemperatur"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Dette omfatter alle sundhedsoplysninger, der er synkroniseret med og tilføjet i Health Connect. Dette er muligvis ikke din fulde patientjournal, og den indeholder ikke en lægefaglig beskrivelse af dine sundhedsoplysninger."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Alle sundhedsoplysninger"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"alle sundhedsoplysninger"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Angiv alle sundhedsoplysninger"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergier"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergier"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Læs allergier"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Vaccinationer"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"vaccinationer"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Læse vaccinationer"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorieresultater"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorieresultater"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Læs laboratorieresultater"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergier"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergier"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Læs allergier"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Tilstande"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"tilstande"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Læs tilstande"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccinationer"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccinationer"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Læs vaccinationer"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Prøvesvar"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"prøvesvar"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Læs prøvesvar"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medicin"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medicin"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Læs medicin"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personlige oplysninger"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personlige oplysninger"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Læs personlige oplysninger"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Oplysninger om sundhedspersonale"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"oplysninger om sundhedspersonale"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Læs oplysninger om sundhedspersonale"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Graviditetsdata"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"graviditetsdata"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Læs graviditetsdata"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemer"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemer"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Læs problemer"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedurer"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedurer"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Læs procedurer"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sundhedsdata"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sundhedsdata"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sundhedsdata"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Læs sundhedsdata"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitale værdier"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Konsultationer"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"konsultationer"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Læs konsultationer"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitale værdier"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitale værdier"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Læs vitale værdier"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Skriv data om mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Giv \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" tilladelse til at læse"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Giv \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" tilladelse til at skrive"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Annuller"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Tillad"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Tillad alle"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Tillad ikke"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Vælg, hvilke data denne app skal kunne læse eller skrive til Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Vælg, hvilke data denne app skal kunne læse eller skrive til Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Vælg, hvilke data denne app skal kunne læse fra Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Vælg, hvilke data denne app skal skrive til Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Hvis du giver læseadgang, kan appen læse nye data og data fra de seneste 30 dage"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Hvis du giver læseadgang, kan appen læse nye og gamle data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Du kan se, hvordan <xliff:g id="APP_NAME">%1$s</xliff:g> håndterer dine data, i udviklerens <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til trænings- og helbredsdata?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Du kan se, hvordan <xliff:g id="APP_NAME">%1$s</xliff:g> håndterer dine data, i appens <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privatlivspolitik"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til dine sundhedsoplysninger?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Hvis du giver adgang, kan appen læse og skrive data som f.eks. allergier, prøvesvar, vaccinationer m.m.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Hvis du giver adgang, kan appen læse data som f.eks. allergier, prøvesvar, vaccinationer m.m.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Om sundhedsoplysninger"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"De data, der deles, omfatter"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Hvis du giver tilladelse, kan <xliff:g id="APP_NAME">%1$s</xliff:g> dele dine sundhedsoplysninger med Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synkroniser dine sundhedsoplysninger fra forskellige apps og kilder for at samle dem ét sted"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Vil du fjerne alle tilladelser?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Fjern alle"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive data i Health Connect.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke længere læse eller skrive data i Health Connect, herunder tidligere data.\n\nDette påvirker ikke andre tilladelser, som appen har, f.eks. adgang til lokation, kamera eller mikrofon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke længere læse eller skrive data i Health Connect, herunder baggrundsdata og tidligere data.\n\nDette påvirker ikke andre tilladelser, som appen har, f.eks. adgang til lokation, kamera eller mikrofon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Slet også <xliff:g id="APP_NAME">%1$s</xliff:g>-data fra Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vil du fjerne alle tilladelser?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vil du fjerne alle tilladelser for sundhedsoplysninger?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Vil du fjerne alle tilladelser for træning og sundhed?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Slet også træningsdata fra <xliff:g id="APP_NAME">%1$s</xliff:g> i Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vil du fjerne alle tilladelser for sundhedsoplysninger?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Slet også sundhedsoplysninger fra <xliff:g id="APP_NAME">%1$s</xliff:g> i Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive disse data i Health Connect.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive disse data i Health Connect, herunder baggrundsdata.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive disse data i Health Connect, herunder tidligere data.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive disse data i Health Connect, herunder baggrundsdata og tidligere data.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vil du fjerne alle tilladelser?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive data i Health Connect.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive data i Health Connect, herunder baggrundsdata.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive data i Health Connect, herunder tidligere data.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil ikke længere kunne læse eller skrive data i Health Connect, herunder baggrundsdata og tidligere data.\n\nDette påvirker ikke appens andre tilladelser, f.eks. adgang til kamera, mikrofon eller lokation."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Slet også træningsdata og sundhedsoplysninger fra <xliff:g id="APP_NAME">%1$s</xliff:g> i Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Tilladelserne for denne app er fjernet"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Slet også alle Health Connect-data"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Næste dag"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Valgt dag"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Forrige dag"</string>
     <string name="default_error" msgid="7966868260616403475">"Noget gik galt. Prøv igen."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Ukendt ressource"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Kildedata"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Venstre krøllet parentes."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Højre krøllet parentes."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Felt <xliff:g id="FIELD">%2$s</xliff:g> Værdi"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Disse apps har ikke længere adgang, men har stadig data, der er gemt i Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan læse data, der er tilføjet efter <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Du kan administrere andre Android-tilladelser, som denne app har, ved at gå til Indstillinger &gt; Apps"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data, som du deler med <xliff:g id="APP_NAME">%1$s</xliff:g>, er dækket af privatlivspolitikken for appen"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Du kan få flere oplysninger om, hvordan <xliff:g id="APP_NAME">%1$s</xliff:g> håndterer dine data, i udviklerens privatlivspolitik"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Du kan administrere andre Android-tilladelser, som denne app har, ved at gå til Indstillinger og trykke på Apps"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Læs privatlivspolitikken"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Brugt inden for de seneste 24 timer"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Appadgang"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Du har i øjeblikket ikke installeret nogen kompatible apps"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Yderligere adgang"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Tidligere data, baggrundsdata"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Yderligere tilladelser for denne app er fjernet"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Tilladelser"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness og wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Træning, søvn, ernæring m.m."</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Sundhedsoplysninger"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"sundhedsoplysninger"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Prøvesvar, medicin, vaccinationer m.m."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Prøvesvar, medicin, vaccinationer m.m."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Apptilladelser blev fjernet"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect fjernede tilladelser for <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect fjernede tilladelser for <xliff:g id="APP_DATA_0">%1$s</xliff:g> og <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Gå til Play Butik"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Kom godt i gang med Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect opbevarer dine sundheds- og træningsdata, så du nemt kan synkronisere forskellige apps på din enhed"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect gemmer og synkroniserer dine sundheds- og træningsdata fra forskellige apps.\n\n"<b>"Trænings- og helbredsdata,"</b>" herunder træningspas, skridt, ernæring, søvn m.m.\n\n"<b>"Sundhedsoplysninger,"</b>" herunder vaccinationer, prøvesvar m.m."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Med Health Connect kan du gøre følgende"</string>
     <string name="share_data" msgid="3481932156368883946">"Del data med dine apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Vælg, hvilke data appen skal kunne læse eller skrive til Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Administrer indstillinger og privatliv"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Let blødning"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Medium blødning"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Kraftig blødning"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Ukendt flow"</string>
     <string name="period_day" msgid="3821944462093965882">"Dag <xliff:g id="DAY">%1$d</xliff:g> af <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> i menstruationen"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruation (1 dag)}one{Menstruation (# dag)}other{Menstruation (# dage)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiv"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Høj"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musik"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Andet"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Uden vejledning"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderat"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Højintensiv"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> t. og <xliff:g id="MIN">%2$s</xliff:g> min."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> t."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrationen er i gang"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect integreres med Android-systemet.\n\nDet kan tage lidt tid, før dine data og tilladelser er overført."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Undlad at lukke appen, indtil du har fået en notifikation om, at processen er fuldført."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect-integration er i gang"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Opdatering er påkrævet"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect integreres med Android-systemet, så du kan tilgå Health Connect direkte fra dine indstillinger."</string>
     <string name="update_button" msgid="4544529019832009496">"Opdater"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Start denne opdatering, så Health Conenct kan fortsætte med at blive integreret med dine systemindstillinger"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Opdater nu"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Systemopdatering er påkrævet"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Inden du fortsætter, skal du opdatere dit telefonsystem."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Hvis du allerede har opdateret dit telefonsystem, kan du prøve at genstarte din telefon for at fortsætte med integrationen"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Opdatering af Health Connect er påkrævet"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Inden du fortsætter, skal du opdatere til den nyeste version af Health Connect-appen."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Mere plads er påkrævet"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect kræver <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> lagerplads på din telefon for at kunne fortsætte med integrationen.\n\nFrigør noget lagerplads på din telefon, og prøv derefter igen."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Prøv igen"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Frigør plads"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Mere plads er påkrævet"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect kræver <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> lagerplads på din telefon for at kunne fortsætte med integrationen."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrationen er sat på pause"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect-appen lukkede under forsøget på at integrere den med Android-systemet.\n\nKllik på Genoptag for at åbne appen igen og fortsætte med at overføre dine data og tilladelser."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Hvis du vil beholde dine Health Connect-data, skal du fuldføre integrationen inden for <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tryk på Fortsæt for at integrere Health Connect med Android-systemet. Hvis du vil beholde dine data, skal du fuldføre integrationen inden for <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tryk på Fortsæt for at integrere Health Connect med Android-systemet."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Fortsæt"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Genoptag Health Connect-integration"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Hvis du vil beholde dine data, skal du fuldføre integrationen inden for <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Appopdatering er påkrævet"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> skal opdateres for fortsat at kunne synkroniseres med Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Nogle apps skal opdateres for fortsat at kunne synkroniseres med Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> skal opdateres for fortsat at kunne synkroniseres med Health Connect. Opdateringer er muligvis ikke tilgængelige for alle apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Nogle apps skal opdateres for fortsat at kunne synkroniseres med Health Connect. Opdateringer er muligvis ikke tilgængelige for alle apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Søg efter opdateringer"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Få flere oplysninger"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-integration"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect-integrationen kunne ikke fuldføres"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Du får en notifikation, når integrationen er tilgængelig igen."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-integrationen kunne ikke fuldføres"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Læs mere"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-integration er fuldført"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Åbn"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Nyheder"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Du kan nu tilgå Health Connect direkte fra dine indstillinger. Du kan til enhver tid afinstallere Health Connect-appen for at frigøre lagerplads."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Rediger appkilder"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Enhedens standardapp"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Appdata"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data fra apps med adgang til Health Connect vises her"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data fra <xliff:g id="APP_NAME">%1$s</xliff:g> vises her"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data fra apps med adgang til Health Connect vises her"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dag"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Uge"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Måned"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Sidste måned"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Poster"</string>
     <string name="tab_access" msgid="7818197975407243701">"Adgang"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> yderligere adgang?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder også om adgang til disse Health Connect-indstillinger"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Giv mindst én tilladelse til at læse for at aktivere adgang i baggrunden eller tidligere dataadgang for denne app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Giv mindst én tilladelse til at læse for at aktivere adgang i baggrunden for denne app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Giv mindst én tilladelse til at læse for at aktivere tidligere dataadgang for denne app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Begynd at bruge Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synkroniser dine første apps for at dele data om sundhed og fitness mellem dem"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Konfigurer"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Se kompatible apps"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Find flere apps, som du kan synkronisere med <xliff:g id="APP_NAME">%s</xliff:g> via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Se i App Store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Konfigurer en skærmlås"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Øg beskyttelsen af dine sundhedsdata ved at konfigurere en pinkode, et mønster eller en adgangskode for denne enhed"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Konfigurer skærmlås"</string>
     <string name="select_all" msgid="837499881590001166">"Vælg alle"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Tilknyttede apps vil ikke længere kunne tilgå disse data via Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Markeret"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Ikke markeret"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Træningsrute på kort er tilgængelig"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Næste dag"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Næste uge"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Næste måned"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Forrige dag"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Forrige uge"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Forrige måned"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Skal alle data slettes permanent?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Skal de valgte data slettes permanent?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Skal alle <xliff:g id="APP_NAME">%s</xliff:g>-data slettes permanent?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Skal <xliff:g id="APP_NAME">%1$s</xliff:g>-data fra ugen <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> slettes permanent?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Skal <xliff:g id="APP_NAME">%1$s</xliff:g>-data fra <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> slettes permanent?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Skal denne <xliff:g id="APP_NAME">%s</xliff:g>-oplysning slettes permanent?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Vil du slette data om <xliff:g id="DATA_TYPE">%1$s</xliff:g> for <xliff:g id="APP_NAME">%2$s</xliff:g> permanent?"</string>
+    <string name="on" msgid="8266542510798355807">"Til"</string>
+    <string name="off" msgid="6996623844428550649">"Fra"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Tilgået kl. <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Tilgået i går kl. <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Tilgået <xliff:g id="TIME_DATE_0">%1$s</xliff:g> kl. <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Tillad altid"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Udvalgte tilladelser"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Mens appen bruges"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Afvis alle"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til trænings- og helbredsdata?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om adgang til <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nVælg, om du vil give tilladelse til alle datatyper, eller om du vil administrere dem individuelt."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness og sundhed"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"hele tiden"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"under brug"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Hele tiden"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Under brug"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan tilgå alle dine fitness- og sundhedsdata <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Har adgang"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Har tilladelse til at læse"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Disse tilladelser giver <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til data fra din enheds sensorer."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> ud af <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps har tilladelse"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ingen apps anmoder om tilladelsen"</string>
+    <string name="allowed" msgid="4158456017482263737">"Har tilladelse"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Har ikke tilladelse"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps med denne tilladelse kan tilgå data om <xliff:g id="DATA_TYPE">%s</xliff:g> fra sensorerne på din enhed."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Vil du fjerne adgangen til <xliff:g id="DATA_TYPE">%s</xliff:g> for alle apps på dit ur?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Flueben"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Kryds"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan i øjeblikket tilgå trænings- og sundhedsdata <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Vil du give <xliff:g id="APP_NAME">%1$s</xliff:g> adgang til trænings- og sundhedsdata hele tiden?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> har adgang til <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Administrer tilladelser for træning og sundhed"</string>
 </resources>
diff --git a/apk/res/values-de/strings.xml b/apk/res/values-de/strings.xml
index d5d6d39..adb6b2e 100644
--- a/apk/res/values-de/strings.xml
+++ b/apk/res/values-de/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Du kannst die Gesundheits- und Fitnessdaten auf deinem Gerät verwalten und entscheiden, welche Apps darauf zugreifen können"</string>
     <string name="data_title" msgid="4456619761533380816">"Daten und Zugriff"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Gesundheitsdaten ansehen"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Gesundheitsdaten und Apps aufrufen, die darauf zugreifen dürfen"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Alle Kategorien"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Alle Kategorien ansehen"</string>
     <string name="no_data" msgid="1906986019249068659">"Keine Daten"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Gestern"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lesen: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Schreiben: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Berechtigungen verwalten"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Zeit: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivität"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"Auf meine Gesundheitsdaten zugreifen"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Verbrannte Kalorien lesen"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Ermöglicht der App, die verbrannten Kalorien zu lesen"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Im Hintergrund auf Daten zugreifen"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> erlauben, im Hintergrund auf Daten zuzugreifen?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> erlauben, im Hintergrund auf Daten zuzugreifen?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Mit dieser Erlaubnis kann diese App auch dann auf Fitness- und Wellnessdaten sowie Gesundheitsdaten zugreifen, wenn du sie gerade nicht verwendest."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Mit dieser Erlaubnis kann diese App auch dann auf Gesundheitsdaten zugreifen, wenn du sie gerade nicht verwendest."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Mit dieser Erlaubnis kann diese App auch dann auf Fitness- und Wellnessdaten zugreifen, wenn du sie gerade nicht verwendest."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Mit dieser Erlaubnis kann diese App auch dann auf Health Connect-Daten zugreifen, wenn du sie gerade nicht verwendest."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> erlauben, auf frühere Daten zuzugreifen?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Mit dieser Erlaubnis kann diese App auf Fitness- und Wellnessdaten zugreifen, die vor dem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> hinzugefügt wurden."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Mit dieser Erlaubnis kann diese App auf alle früheren Fitness- und Wellnessdaten zugreifen."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Mit dieser Erlaubnis kann die App auf Daten von Health Connect zugreifen, die vor dem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> hinzugefügt wurden."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Mit dieser Erlaubnis kann die App auf alle früheren Daten von Health Connect zugreifen."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> zusätzliche Zugriffsrechte gewähren?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Gib an, ob <xliff:g id="APP_NAME">%1$s</xliff:g> auch auf die folgenden Health Connect-Einstellungen zugreifen darf"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Im Hintergrund auf alle Daten zugreifen"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Im Hintergrund auf Gesundheitsdaten zugreifen"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Im Hintergrund auf Fitness- und Wellnessdaten zugreifen"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Dieser App erlauben, auf Fitness- und Wellnessdaten sowie Gesundheitsdaten zuzugreifen, wenn du die App nicht verwendest"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Dieser App erlauben, auf diese Daten zuzugreifen, wenn du die App nicht verwendest"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Dieser App erlauben, auf diese Daten zuzugreifen, wenn du die App nicht verwendest"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Im Hintergrund auf Daten zugreifen"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Dieser App erlauben, auf Daten von Health Connect zuzugreifen, wenn du die App nicht verwendest"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Auf frühere Fitness- und Wellnessdaten zugreifen"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Dieser App erlauben, auf Daten zuzugreifen, die vor dem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> hinzugefügt wurden"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Dieser App erlauben, auf alle früheren Daten zuzugreifen"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Auf frühere Daten zugreifen"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Dieser App erlauben, auf Daten von Health Connect zuzugreifen, die vor dem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> hinzugefügt wurden"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Dieser App erlauben, auf alle früheren Daten von Health Connect zuzugreifen"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> kann bereits auf frühere Daten in deinen Gesundheitsdaten zugreifen"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Weitere Informationen zu Berechtigungen"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Im Hintergrund auf alle Daten zugreifen"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Im Hintergrund auf Gesundheitsdaten zugreifen"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Im Hintergrund auf Fitness- und Wellnessdaten zugreifen"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Dieser App erlauben, auf Fitness- und Wellnessdaten sowie Gesundheitsdaten zuzugreifen, wenn du die App nicht verwendest"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Dieser App erlauben, auf diese Daten zuzugreifen, wenn du die App nicht verwendest"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Dieser App erlauben, auf diese Daten zuzugreifen, wenn du die App nicht verwendest"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Im Hintergrund auf Daten zugreifen"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Dieser App erlauben, auf Daten von Health Connect zuzugreifen, wenn du die App nicht verwendest"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Auf frühere Fitness- und Wellnessdaten zugreifen"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Dieser App erlauben, auf Daten zuzugreifen, die vor dem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> hinzugefügt wurden"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Dieser App erlauben, auf alle früheren Daten zuzugreifen"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Auf frühere Daten zugreifen"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Dieser App erlauben, auf Daten von Health Connect zuzugreifen, die vor dem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> hinzugefügt wurden"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Dieser App erlauben, auf alle früheren Daten in Health Connect zuzugreifen"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Derzeit werden keine Fitnessdaten gelesen, da für <xliff:g id="APP_NAME">%1$s</xliff:g> keine Leseberechtigungen aktiviert sind"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> kann bereits auf frühere Daten in deinen Gesundheitsdaten zugreifen. Wenn du das ändern möchtest, deaktiviere die Berechtigungen für Gesundheitsdaten für diese App."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Berechtigungen für Gesundheitsdaten verwalten"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Du musst mindestens 1 Leseberechtigung aktivieren, um den Hintergrundzugriff oder den Zugriff auf frühere Daten für diese App zu aktivieren"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Du musst mindestens 1 Leseberechtigung aktivieren, um den Hintergrundzugriff für diese App zu aktivieren"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Du musst mindestens 1 Leseberechtigung aktivieren, um den Zugriff auf frühere Daten für diese App zu aktivieren"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Dieser App erlauben, auf alle früheren Daten von Health Connect zuzugreifen"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Dieser App erlauben, auf Daten von Health Connect zuzugreifen, wenn du die App nicht verwendest"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Mit dieser Erlaubnis kann diese App auch dann auf Health Connect-Daten zugreifen, wenn du sie gerade nicht verwendest."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Auf frühere Daten zugreifen"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> erlauben, auf frühere Daten zuzugreifen?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Dieser App erlauben, auf Daten von Health Connect zuzugreifen, die vor dem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> hinzugefügt wurden"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Dieser App erlauben, auf alle früheren Daten von Health Connect zuzugreifen"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Mit dieser Erlaubnis kann die App auf Daten von Health Connect zugreifen, die vor dem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> hinzugefügt wurden."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Mit dieser Erlaubnis kann die App auf alle früheren Daten von Health Connect zugreifen."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktiv verbrannte Kalorien"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktiv verbrannte Kalorien"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Aktiv verbrannte Kalorien lesen"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"Rollstuhlanschübe"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Rollstuhlanschübe lesen"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Rollstuhlanschübe schreiben"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Daten zur Intensität von Aktivitäten"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"Daten zur Intensität von Aktivitäten"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Daten zur Intensität von Aktivitäten lesen"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Daten zur Intensität von Aktivitäten schreiben"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Grundumsatz"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"Grundumsatz"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Grundumsatz lesen"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"Hauttemperatur"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Hauttemperatur lesen"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Hauttemperatur schreiben"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Dazu gehören alle Gesundheitsdaten, die mit Health Connect synchronisiert bzw. Health Connect hinzugefügt wurden. Möglicherweise umfasst dies nicht deine vollständige Krankenakte. Eine medizinische Beschreibung deiner Gesundheitsdaten ist nicht enthalten."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Alle Gesundheitsdaten"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"alle Gesundheitsdaten"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Alle Gesundheitsdaten zusammenfassen"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergien"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"Allergien"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Nutzerdaten zu Allergien lesen"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunisierung"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"Immunisierung"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Immunisierungsdaten lesen"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laborergebnisse"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"Laborergebnisse"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Laborergebnisse lesen"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergien"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"Allergien"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Nutzerdaten zu Allergien lesen"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Daten zu Krankheiten"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"Daten zu Krankheiten"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Daten zu Krankheiten lesen"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Impfungen"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"Impfungen"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Nutzerdaten zu Impfungen lesen"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laborergebnisse"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"Laborergebnisse"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Nutzerdaten zu Laborergebnissen lesen"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Daten zu Medikamenten"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"Daten zu Medikamenten"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Daten zu Medikamenten lesen"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personenbezogene Daten"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personenbezogene Daten"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Personenbezogene Daten lesen"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Daten zu Ärzten"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"Daten zu Ärzten"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Daten zu Ärzten lesen"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Schwangerschaftsinformationen"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"Schwangerschaftsinformationen"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Schwangerschaftsinformationen lesen"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Gesundheitsprobleme"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"Gesundheitsprobleme"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Gesundheitsprobleme lesen"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Verfahren"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"Verfahren"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Verfahren lesen"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sozialanamnese"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sozialanamnese"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"Sozialanamnese"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Sozialanamnese lesen"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitalparameter"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Daten zu Arztbesuchen"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"Daten zu Arztbesuchen"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Daten zu Arztbesuchen lesen"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitalparameter"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"Vitalparameter"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Vitalparameter lesen"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Achtsamkeit"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Daten zu Achtsamkeitssessions schreiben"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ Lesezugriff gewähren"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ Schreibzugriff gewähren"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Abbrechen"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Erlauben"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Alle zulassen"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Nicht erlauben"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Du kannst festlegen, welche Daten diese App in Health Connect lesen und schreiben darf"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Lege fest, welche Daten diese App in Health Connect lesen und schreiben darf"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Lege fest, welche Daten diese App in Health Connect lesen darf"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Lege fest, welche Daten diese App in Health Connect schreiben darf"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Wenn du der App Lesezugriff gibst, kann sie neue Daten und die Daten der letzten 30 Tage lesen"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Wenn du der App Lesezugriff gibst, kann sie neue und frühere Daten lesen"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> Zugriff auf Health Connect erlauben?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Wie <xliff:g id="APP_NAME">%1$s</xliff:g> deine Daten verarbeitet, erfährst du in der <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> des Entwicklers"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> erlauben, auf Fitness- und Wellnessdaten zuzugreifen?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Wie <xliff:g id="APP_NAME">%1$s</xliff:g> mit deinen Daten umgeht, erfährst du in der <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> des Entwicklers"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"Datenschutzerklärung"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> Zugriff auf deine Gesundheitsdaten erlauben?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Wenn du der App Zugriff gewährst, kann sie Daten zu Allergien, Laborergebnissen, Impfungen und mehr lesen und schreiben\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Wenn du der App Zugriff gewährst, kann sie Daten zu Allergien, Laborergebnissen, Impfungen und mehr lesen\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Informationen zu Gesundheitsdaten"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Beispiele für zu teilende Daten"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Mit dieser Erlaubnis kann <xliff:g id="APP_NAME">%1$s</xliff:g> deine Gesundheitsdaten mit Health Connect teilen."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Du kannst deine Gesundheitsdaten aus verschiedenen Apps und Quellen synchronisieren lassen, um sie an einem Ort zu speichern"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Alle Berechtigungen entfernen?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Alle entfernen"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> kann dann keine Daten mehr von Health Connect lesen oder schreiben.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Kamera, Mikrofon oder Standort."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann dann keine Daten mehr von Health Connect lesen oder schreiben, auch keine früheren Daten.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Standort, Kamera oder Mikrofon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann dann keine Daten mehr von Health Connect lesen oder schreiben, auch keine Hintergrunddaten und früheren Daten.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Standort, Kamera oder Mikrofon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Auch <xliff:g id="APP_NAME">%1$s</xliff:g>-Daten aus Health Connect löschen"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Alle Berechtigungen entfernen?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Alle Berechtigungen für Gesundheitsdaten entfernen?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Alle Berechtigungen für Fitness und Wellness entfernen?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Auch Fitnessdaten von „<xliff:g id="APP_NAME">%1$s</xliff:g>“ aus Health Connect löschen"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Alle Berechtigungen für Gesundheitsdaten entfernen?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Auch Gesundheitsdaten von „<xliff:g id="APP_NAME">%1$s</xliff:g>“ aus Health Connect löschen"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann diese Daten aus Health Connect dann nicht mehr lesen oder schreiben.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Berechtigungen für Kamera, Mikrofon oder Standort."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann diese Daten aus Health Connect dann nicht mehr lesen oder schreiben, auch keine Hintergrunddaten.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Berechtigungen für Kamera, Mikrofon oder Standort."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann diese Daten aus Health Connect dann nicht mehr lesen oder schreiben, auch keine früheren Daten.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Berechtigungen für Kamera, Mikrofon oder Standort."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann diese Daten aus Health Connect dann nicht mehr lesen oder schreiben, auch keine Hintergrunddaten oder früheren Daten.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Berechtigungen für Kamera, Mikrofon oder Standort."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Alle Berechtigungen entfernen?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann dann keine Daten mehr von Health Connect lesen oder schreiben.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Berechtigungen für Kamera, Mikrofon oder Standort."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann dann keine Daten mehr von Health Connect lesen oder schreiben, auch keine Hintergrunddaten.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Berechtigungen für Kamera, Mikrofon oder Standort."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann dann keine Daten mehr von Health Connect lesen oder schreiben, auch keine früheren Daten.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Berechtigungen für Kamera, Mikrofon oder Standort."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann dann keine Daten mehr von Health Connect lesen oder schreiben, auch keine Hintergrunddaten und früheren Daten.\n\nDies hat keine Auswirkungen auf andere Berechtigungen, die diese App möglicherweise hat, wie z. B. Berechtigungen für Kamera, Mikrofon oder Standort."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Auch Fitnessdaten und Gesundheitsdaten von „<xliff:g id="APP_NAME">%1$s</xliff:g>“ aus Health Connect löschen"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Berechtigungen für diese App entfernt"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Auch alle Health Connect-Daten löschen"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Nächster Tag"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Ausgewählter Tag"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Vortag"</string>
     <string name="default_error" msgid="7966868260616403475">"Ein Fehler ist aufgetreten. Bitte versuche es noch einmal."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Unbekannte Ressource"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Quelldaten"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Geschweifte Klammer auf."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Geschweifte Klammer zu."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Feld <xliff:g id="FIELD">%2$s</xliff:g> Wert"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Diese Apps haben keinen Zugriff mehr, aber es sind noch Daten von ihnen in Health Connect gespeichert"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> kann Daten lesen, die nach dem <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> hinzugefügt wurden."</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Weitere Android-Berechtigungen, die diese App hat, kannst du in den Einstellungen unter „Apps“ verwalten."</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Die mit <xliff:g id="APP_NAME">%1$s</xliff:g> geteilten Daten sind von der Datenschutzerklärung dieser App abgedeckt."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Wie <xliff:g id="APP_NAME">%1$s</xliff:g> mit deinen Daten umgeht, erfährst du in der Datenschutzerklärung des Entwicklers"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Weitere Android-Berechtigungen, die diese App hat, kannst du in den Einstellungen unter „Apps“ verwalten."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Datenschutzerklärung lesen"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Zugriff in den letzten 24 Stunden"</string>
     <string name="app_access_title" msgid="7137018424885371763">"App-Zugriff"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Derzeit sind keine kompatiblen Apps installiert"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Zusätzliche Zugriffsrechte"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Frühere Daten, Hintergrunddaten"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Zusätzliche Berechtigungen für diese App entfernt"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Berechtigungen"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness und Wohlbefinden"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Sport, Schlaf, Ernährung und mehr"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Gesundheitsdaten"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"Gesundheitsdaten"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laborwerte, Medikamente, Impfungen usw."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Laborergebnisse, Medikamente, Impfungen usw."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"App-Berechtigungen entfernt"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect hat Berechtigungen für <xliff:g id="APP_DATA">%s</xliff:g> entfernt"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect hat Berechtigungen für <xliff:g id="APP_DATA_0">%1$s</xliff:g> und <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> entfernt"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Zum Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Erste Schritte mit Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Dank Health Connect werden deine Gesundheits- und Fitnessdaten gespeichert und lassen sich einfach mit verschiedenen Apps auf deinem Gerät synchronisieren"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect speichert und synchronisiert deine Gesundheits- und Fitnessdaten aus verschiedenen Apps.\n\n"<b>"Fitness- und Wellnessdaten,"</b>" unter anderem zu Trainingseinheiten, Schritten, Ernährung und Schlaf\n\n"<b>"Gesundheitsdaten,"</b>" unter anderem zu Impfungen und Laborergebnissen"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Mit Health Connect kannst du Folgendes tun:"</string>
     <string name="share_data" msgid="3481932156368883946">"Daten für deine Apps freigeben"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Du legst fest, welche Daten Apps bei Health Connect lesen oder schreiben können"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Einstellungen und Datenschutz verwalten"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Leichte Blutung"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Mittlere Blutung"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Starke Blutung"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Menstruationsfluss unbekannt"</string>
     <string name="period_day" msgid="3821944462093965882">"Tag <xliff:g id="DAY">%1$d</xliff:g> von <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> der Periode"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Periode (1 Tag)}other{Periode (# Tage)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiv"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Hoch"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musik"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Sonstiges"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Nicht angeleitet"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderat"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intensiv"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> Min."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> Std. <xliff:g id="MIN">%2$s</xliff:g> Min."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> Std."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integration läuft"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect wird in das Android-System integriert.\n\nEs kann eine Weile dauern, deine Daten und Berechtigungen zu übertragen."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Schließe die App erst, wenn du eine Benachrichtigung erhalten hast, dass der Vorgang abgeschlossen ist."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect-Integration läuft"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Update erforderlich"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect wird in das Android-System integriert, damit du direkt über deine Einstellungen darauf zugreifen kannst."</string>
     <string name="update_button" msgid="4544529019832009496">"Aktualisieren"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Starte dieses Update, damit Health Connect weiter in deine Systemeinstellungen integriert werden kann"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Jetzt aktualisieren"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Systemupdate erforderlich"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Damit du fortfahren kannst, musst du das Betriebssystem deines Smartphones aktualisieren."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Wenn du das Betriebssystem deines Smartphones bereits aktualisiert hast, starte dein Smartphone neu, um mit der Integration fortzufahren"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect-Update erforderlich"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Damit du fortfahren kannst, musst du die Health Connect App auf die neueste Version aktualisieren."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Mehr Speicherplatz erforderlich"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect benötigt <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> Speicherplatz auf deinem Smartphone, damit die Integration fortgesetzt werden kann.\n\nGib Speicherplatz auf deinem Smartphone frei und versuche es dann noch einmal."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Noch einmal versuchen"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Speicherplatz freigeben"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Mehr Speicherplatz erforderlich"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect benötigt <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> Speicherplatz auf deinem Smartphone, damit die Integration fortgesetzt werden kann."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integration pausiert"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Die Health Connect App wurde während der Integration in das Android-System geschlossen.\n\nKlicke auf „Fortsetzen“, um die App wieder zu öffnen und mit der Übertragung deiner Daten und Berechtigungen fortzufahren."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Schließe diesen Vorgang innerhalb von <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ab, um deine Health Connect-Daten zu behalten"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tippe, um mit der Integration von Health Connect in das Android-System fortzufahren. Damit du deine Daten behältst, muss du diesen Vorgang innerhalb von <xliff:g id="TIME_NEEDED">%1$s</xliff:g> abschließen."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tippe, um mit der Integration von Health Connect in das Android-System fortzufahren."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Weiter"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect-Integration fortsetzen"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Schließe diesen Vorgang innerhalb von <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ab, um deine Daten zu behalten."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"App-Update erforderlich"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> muss aktualisiert werden, um weiterhin mit Health Connect synchronisiert werden zu können"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Einige Apps müssen aktualisiert werden, um weiterhin mit Health Connect synchronisiert werden zu können"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Die App „<xliff:g id="APP_NAME">%1$s</xliff:g>“ muss aktualisiert werden, damit sie weiterhin mit Health Connect synchronisiert werden kann. Möglicherweise sind nicht für alle Apps Updates verfügbar."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Einige Apps müssen aktualisiert werden, damit sie weiterhin mit Health Connect synchronisiert werden können. Möglicherweise sind nicht für alle Apps Updates verfügbar."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Nach Updates suchen"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Weitere Informationen"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-Integration"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect-Integration konnte nicht abgeschlossen werden"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Du wirst benachrichtigt, sobald du es noch einmal versuchen kannst."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Ok"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-Integration konnte nicht abgeschlossen werden"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Weitere Informationen"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-Integration abgeschlossen"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Öffnen"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Das ist neu"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Der Zugriff auf Health Connect ist jetzt direkt über deine Einstellungen möglich. Du kannst die Health Connect App jederzeit deinstallieren, um Speicherplatz freizugeben."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Ok"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"App-Quellen bearbeiten"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Standard-App bei diesem Gerät"</string>
     <string name="app_data_title" msgid="6499967982291000837">"App-Daten"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Daten aus Apps mit Zugriff auf Health Connect werden hier angezeigt"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Daten aus <xliff:g id="APP_NAME">%1$s</xliff:g> werden hier angezeigt"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Daten aus Apps mit Zugriff auf Health Connect werden hier angezeigt"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Tag"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Woche"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Monat"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Letzter Monat"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Einträge"</string>
     <string name="tab_access" msgid="7818197975407243701">"Zugriff"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> zusätzliche Zugriffsrechte gewähren?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Gib an, ob <xliff:g id="APP_NAME">%1$s</xliff:g> auch auf die folgenden Health Connect-Einstellungen zugreifen darf:"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Du musst mindestens 1 Leseberechtigung aktivieren, um den Hintergrundzugriff oder den Zugriff auf frühere Daten für diese App zu aktivieren"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Du musst mindestens 1 Leseberechtigung aktivieren, um den Hintergrundzugriff für diese App zu aktivieren"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Du musst mindestens 1 Leseberechtigung aktivieren, um den Zugriff auf frühere Daten für diese App zu aktivieren"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Verwendung von Health Connect starten"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Du kannst deine ersten Apps synchronisieren, damit Gesundheits- und Fitnessdaten zwischen ihnen geteilt werden"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Einrichten"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Kompatible Apps ansehen"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Du kannst nach weiteren Apps suchen, die über Health Connect mit <xliff:g id="APP_NAME">%s</xliff:g> synchronisiert werden sollen"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Im App-Shop ansehen"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Displaysperre einrichten"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Zum besseren Schutz deiner Gesundheitsdaten kannst du eine PIN, ein Muster oder ein Passwort für dieses Gerät festlegen"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Displaysperre einrichten"</string>
     <string name="select_all" msgid="837499881590001166">"Alle auswählen"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Verbundene Apps können diese Daten von Health Connect dann nicht mehr lesen"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Ausgewählt"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nicht ausgewählt"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Trainingsroute auf der Karte verfügbar"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Nächster Tag"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Nächste Woche"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Nächster Monat"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Vorheriger Tag"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Vorherige Woche"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Vorheriger Monat"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Alle Daten endgültig löschen?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Ausgewählte Daten endgültig löschen?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Alle „<xliff:g id="APP_NAME">%s</xliff:g>“-Daten endgültig löschen?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Ausgewählte „<xliff:g id="APP_NAME">%1$s</xliff:g>“-Einträge für die Woche vom <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> endgültig löschen?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Ausgewählte „<xliff:g id="APP_NAME">%1$s</xliff:g>“-Einträge für <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> endgültig löschen?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Diesen „<xliff:g id="APP_NAME">%s</xliff:g>“-Eintrag endgültig löschen?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Daten vom Typ „<xliff:g id="DATA_TYPE">%1$s</xliff:g>“ für <xliff:g id="APP_NAME">%2$s</xliff:g> endgültig löschen?"</string>
+    <string name="on" msgid="8266542510798355807">"An"</string>
+    <string name="off" msgid="6996623844428550649">"Aus"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Zugriff: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Zugriff: gestern, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Zugriff: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Immer zulassen"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Ausgewählte zulassen"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Bei Nutzung der App"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Alle ablehnen"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ erlauben, auf Fitness- und Wellnessdaten zuzugreifen?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ fordert Zugriff auf die folgenden Daten an: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nDu kannst entweder alle Berechtigungen zulassen oder sie einzeln festlegen."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ den Zugriff auf <xliff:g id="DATA_TYPE">%2$s</xliff:g> gewähren?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness und Wohlbefinden"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"immer"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"während der Nutzung der App"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Immer"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Während der Nutzung der App"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ kann <xliff:g id="ALLOW_MODE">%2$s</xliff:g> auf alle deine Fitness- und Wellnessdaten zugreifen"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Zugriff erlaubt"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Lesezugriff"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Mit diesen Berechtigungen gewährst du „<xliff:g id="APP_NAME">%1$s</xliff:g>“ Zugriff auf Daten, die von den Sensoren deines Geräts erfasst werden."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> von <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> App(s) berechtigt"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Wird von keinen Apps angefordert"</string>
+    <string name="allowed" msgid="4158456017482263737">"Berechtigt"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nicht berechtigt"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps mit dieser Berechtigung haben Zugriff auf Daten vom Typ „<xliff:g id="DATA_TYPE">%s</xliff:g>“, die von den Sensoren deines Geräts erfasst werden."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Zugriff auf Daten vom Typ „<xliff:g id="DATA_TYPE">%s</xliff:g>“ für alle Apps auf deiner Smartwatch widerrufen?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Häkchen"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Kreuz"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Derzeit kann <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="ALLOW_MODE">%2$s</xliff:g> auf Fitness- und Wellnessdaten zugreifen"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> erlauben, jederzeit auf Fitness- und Wellnessdaten zuzugreifen?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> hat Zugriff auf <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Berechtigungen für Fitness und Wellness verwalten"</string>
 </resources>
diff --git a/apk/res/values-el/strings.xml b/apk/res/values-el/strings.xml
index e1e2970..bb4cab4 100644
--- a/apk/res/values-el/strings.xml
+++ b/apk/res/values-el/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Διαχειριστείτε τα δεδομένα υγείας και φυσικής κατάστασης στη συσκευή σας και ελέγξτε ποιες εφαρμογές έχουν πρόσβαση σε αυτά"</string>
     <string name="data_title" msgid="4456619761533380816">"Δεδομένα και πρόσβαση"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Περιήγηση στον ιατρικό φάκελο"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Προβολή των ιατρικών φακέλων σας και των εφαρμογών που μπορούν να έχουν πρόσβαση σε αυτούς"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Όλες οι κατηγορίες"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Εμφάνιση όλων των κατηγοριών"</string>
     <string name="no_data" msgid="1906986019249068659">"Δεν υπάρχουν δεδομένα"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Χθες"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Ανάγνωση: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Εγγραφή: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Διαχείριση αδειών"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Ώρα: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Δραστηριότητα"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"πρόσβαση σε δεδομένα υγείας"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Ανάγνωση θερμίδων που κάηκαν"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Επιτρέπει στην εφαρμογή να διαβάζει τις θερμίδες που καίγονται"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Πρόσβαση στα δεδομένα στο παρασκήνιο"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Επιτρέπετε στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει πρόσβαση στα δεδομένα στο παρασκήνιο;"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Να επιτρέπεται στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει πρόσβαση στα δεδομένα στο παρασκήνιο;"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Εάν παραχωρήσετε την άδεια, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας, καθώς και στους ιατρικούς φακέλους, όταν δεν τη χρησιμοποιείτε."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Εάν παραχωρήσετε την άδεια, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση στους ιατρικούς φακέλους όταν δεν τη χρησιμοποιείτε."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Εάν παραχωρήσετε την άδεια, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας όταν δεν τη χρησιμοποιείτε."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Εάν παραχωρήσετε την άδεια, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση στα δεδομένα του Health Connect, όταν δεν τη χρησιμοποιείτε."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Να επιτρέπεται στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει πρόσβαση σε παλαιότερα δεδομένα;"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Εάν παραχωρήσετε την άδεια, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας που προστέθηκαν πριν από τις <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Εάν παραχωρήσετε την άδεια, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα φυσικής κατάστασης και ευεξίας."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Εάν παραχωρήσετε την άδεια, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση στα δεδομένα του Health Connect που προστέθηκαν πριν από τις <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Εάν παραχωρήσετε την άδεια, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα του Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Να επιτρέπεται στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει επιπλέον πρόσβαση;"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> θέλει επίσης να έχει πρόσβαση σε αυτές τις ρυθμίσεις του Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Πρόσβαση σε όλα τα δεδομένα στο παρασκήνιο"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Πρόσβαση στους ιατρικούς φακέλους στο παρασκήνιο"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας στο παρασκήνιο"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας, καθώς και στους ιατρικούς φακέλους, όταν δεν τη χρησιμοποιείτε"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε αυτά τα δεδομένα όταν δεν τη χρησιμοποιείτε"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε αυτά τα δεδομένα όταν δεν τη χρησιμοποιείτε"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Πρόσβαση στα δεδομένα στο παρασκήνιο"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση στα δεδομένα του Health Connect όταν δεν τη χρησιμοποιείτε"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Πρόσβαση σε παλαιότερα δεδομένα φυσικής κατάστασης και ευεξίας"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε δεδομένα που προστέθηκαν πριν από τις <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Πρόσβαση σε παλαιότερα δεδομένα"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση στα δεδομένα του Health Connect που προστέθηκαν πριν από τις <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα του Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> έχει ήδη πρόσβαση σε παλαιότερα δεδομένα για τους ιατρικούς φακέλους σας"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Διαβάστε περισσότερα σχετικά με τις άδειες"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Πρόσβαση σε όλα τα δεδομένα στο παρασκήνιο"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Πρόσβαση στους ιατρικούς φακέλους στο παρασκήνιο"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας στο παρασκήνιο"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας, καθώς και στους ιατρικούς φακέλους, όταν δεν τη χρησιμοποιείτε"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε αυτά τα δεδομένα όταν δεν τη χρησιμοποιείτε"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε αυτά τα δεδομένα όταν δεν τη χρησιμοποιείτε"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Πρόσβαση στα δεδομένα στο παρασκήνιο"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση στα δεδομένα του Health Connect όταν δεν τη χρησιμοποιείτε"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Πρόσβαση σε παλαιότερα δεδομένα φυσικής κατάστασης και ευεξίας"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε δεδομένα που προστέθηκαν πριν από τις <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Πρόσβαση σε παλαιότερα δεδομένα"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση στα δεδομένα του Health Connect που προστέθηκαν πριν από τις <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα του Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Δεν γίνεται ανάγνωση δεδομένων φυσικής κατάστασης αυτή τη στιγμή, επειδή η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν έχει άδειες ανάγνωσης"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> έχει ήδη πρόσβαση σε παλαιότερα δεδομένα για τους ιατρικούς φακέλους σας. Για να το αλλάξετε αυτό, απενεργοποιήστε τις άδειες ιατρικού φακέλου για αυτή την εφαρμογή"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Διαχείριση αδειών ιατρικού φακέλου"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Ενεργοποιήστε τουλάχιστον μία άδεια ανάγνωσης ώστε να ενεργοποιηθεί η πρόσβαση σε δεδομένα παρασκηνίου ή σε παλαιότερα δεδομένα για αυτή την εφαρμογή"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Ενεργοποιήστε τουλάχιστον μία άδεια ανάγνωσης ώστε να ενεργοποιηθεί η πρόσβαση στο παρασκήνιο για αυτή την εφαρμογή"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Ενεργοποιήστε τουλάχιστον μία άδεια ανάγνωσης ώστε να ενεργοποιηθεί η πρόσβαση σε παλαιότερα δεδομένα για αυτή την εφαρμογή"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα του Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση στα δεδομένα του Health Connect όταν δεν χρησιμοποιείτε την εφαρμογή"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Εάν την επιτρέψετε , η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση στα δεδομένα του Health Connect όταν δεν χρησιμοποιείτε την εφαρμογή."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Πρόσβαση σε παλαιότερα δεδομένα"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Επιτρέπετε στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει πρόσβαση σε παλαιότερα δεδομένα;"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση στα δεδομένα του Health Connect που προστέθηκαν πριν από τις <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Επιτρέψτε σε αυτή την εφαρμογή να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα του Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Εάν την επιτρέψετε, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση στα δεδομένα του Health Connect που προστέθηκαν πριν από τις <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Εάν την επιτρέψετε, η συγκεκριμένη εφαρμογή θα μπορεί να έχει πρόσβαση σε όλα τα παλαιότερα δεδομένα του Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Ενεργές θερμίδες που έχετε κάψει"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"ενεργές θερμίδες που έχετε κάψει"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Ανάγνωση ενεργών θερμίδων που έχετε κάψει"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ωθήσεις αναπηρικού αμαξιδίου"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Ανάγνωση δεδομένων ωθήσεων αναπηρικού αμαξιδίου"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Εγγραφή δεδομένων ωθήσεων αναπηρικού αμαξιδίου"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Ένταση δραστηριότητας"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ένταση δραστηριότητας"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Ανάγνωση δεδομένων έντασης δραστηριότητας"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Εγγραφή δεδομένων έντασης δραστηριότητας"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Βασικός ρυθμός μεταβολισμού"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"βασικός ρυθμός μεταβολισμού"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Ανάγνωση δεδομένων βασικού ρυθμού μεταβολισμού"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"θερμοκρασία δέρματος"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Ανάγνωση θερμοκρασίας δέρματος"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Εγγραφή θερμοκρασίας δέρματος"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Αυτό περιλαμβάνει όλους τους ιατρικούς φακέλους που συγχρονίστηκαν και προστέθηκαν στο Health Connect. Αυτό μπορεί να μην είναι το πλήρες ιατρικό αρχείο σας και δεν περιλαμβάνει ιατρική περιγραφή των ιατρικών φακέλων."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Όλοι οι ιατρικοί φάκελοι"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"όλοι οι ιατρικοί φάκελοι"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Σύνταξη όλων των ιατρικών φακέλων"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Αλλεργίες"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"αλλεργίες"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Ανάγνωση δεδομένων αλλεργιών"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Εμβολιασμοί"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"εμβολιασμοί"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Ανάγνωση εμβολιασμών"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Αποτελέσματα εργαστηριακών εξετάσεων"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"αποτελέσματα εργαστηριακών εξετάσεων"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Ανάγνωση αποτελεσμάτων εργαστηριακών εξετάσεων"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Αλλεργίες"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"αλλεργίες"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Ανάγνωση δεδομένων αλλεργιών"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Ιατρικές παθήσεις"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"ιατρικές παθήσεις"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Ανάγνωση δεδομένων ιατρικών παθήσεων"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Εμβόλια"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"εμβόλια"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Ανάγνωση δεδομένων εμβολίων"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Αποτελέσματα εργαστηριακών εξετάσεων"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"αποτελέσματα εργαστηριακών εξετάσεων"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Ανάγνωση αποτελεσμάτων εργαστηριακών εξετάσεων"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Φαρμακευτικές αγωγές"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"φαρμακευτικές αγωγές"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Ανάγνωση δεδομένων φαρμακευτικών αγωγών"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Προσωπικά στοιχεία"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"προσωπικά στοιχεία"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Ανάγνωση προσωπικών στοιχείων"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Στοιχεία επαγγελματία υγείας"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"στοιχεία επαγγελματία υγείας"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Ανάγνωση στοιχείων επαγγελματία υγείας"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Εγκυμοσύνη"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"εγκυμοσύνη"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Ανάγνωση δεδομένων εγκυμοσύνης"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Προβλήματα"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"προβλήματα"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Ανάγνωση δεδομένων προβλημάτων"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Επεμβάσεις"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"επεμβάσεις"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Ανάγνωση δεδομένων επεμβάσεων"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Κοινωνικό ιστορικό"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Κοινωνικό ιστορικό"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"κοινωνικό ιστορικό"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Ανάγνωση δεδομένων κοινωνικού ιστορικού"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Ζωτικές ενδείξεις"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Επισκέψεις"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"επισκέψεις"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Ανάγνωση δεδομένων επισκέψεων"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Ζωτικές ενδείξεις"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"ζωτικές ενδείξεις"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Ανάγνωση δεδομένων ζωτικών ενδείξεων"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Ενσυνειδητότητα"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Σύνταξη δεδομένων ενσυνειδητότητας"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Παροχή στην εφαρμογή “<xliff:g id="APP_NAME">%1$s</xliff:g>” του δικαιώματος ανάγνωσης"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Να επιτρέπεται στην εφαρμογή “<xliff:g id="APP_NAME">%1$s</xliff:g>” να γράφει"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Ακύρωση"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Αποδοχή"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Να επιτρέπονται όλες"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Να μην επιτρέπεται"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Επιλέξτε τα δεδομένα που θέλετε να διαβάζει ή να γράφει αυτή η εφαρμογή στο Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Επιλέξτε τα δεδομένα που θέλετε να διαβάζει ή να γράφει αυτή η εφαρμογή στο Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Επιλέξτε τα δεδομένα που θέλετε να διαβάζει αυτή η εφαρμογή από το Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Επιλέξτε τα δεδομένα που θέλετε να γράφει αυτή η εφαρμογή στο Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Αν παραχωρήσετε πρόσβαση ανάγνωσης, η εφαρμογή θα έχει δυνατότητα ανάγνωσης νέων δεδομένων και δεδομένων από τις τελευταίες 30 ημέρες."</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Αν παραχωρήσετε πρόσβαση ανάγνωσης, αυτή η εφαρμογή θα έχει δυνατότητα ανάγνωσης νέων και παλαιότερων δεδομένων."</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Να επιτρέπεται στο <xliff:g id="APP_NAME">%1$s</xliff:g> να αποκτήσει πρόσβαση στο Health Connect;"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Μπορείτε να μάθετε πώς η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> χειρίζεται τα δεδομένα σας στην <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> του προγραμματιστή"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Να επιτρέπεται στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει πρόσβαση σε παλαιότερα δεδομένα φυσικής κατάστασης και ευεξίας;"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Μπορείτε να μάθετε πώς το <xliff:g id="APP_NAME">%1$s</xliff:g> χειρίζεται τα δεδομένα σας στην <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"πολιτική απορρήτου"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Να επιτρέπεται στο <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει πρόσβαση στους ιατρικούς φακέλους σας;"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Εάν παραχωρήσετε πρόσβαση, η εφαρμογή θα έχει τη δυνατότητα ανάγνωσης και εγγραφής δεδομένων όπως είναι οι αλλεργίες, τα αποτελέσματα εργαστηριακών εξετάσεων, τα εμβόλια και άλλα\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Εάν παραχωρήσετε πρόσβαση, η εφαρμογή θα έχει τη δυνατότητα ανάγνωσης δεδομένων όπως είναι οι αλλεργίες, τα αποτελέσματα εργαστηριακών εξετάσεων, τα εμβόλια και άλλα\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Σχετικά με τους ιατρικούς φακέλους"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Στα κοινόχρηστα δεδομένα περιλαμβάνονται τα εξής"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Εάν παραχωρήσετε την πρόσβαση, η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> θα μπορεί να μοιράζεται τους ιατρικούς φακέλους σας με το Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Συγχρονίστε τους ιατρικούς φακέλους από τις διάφορες εφαρμογές και πηγές σας, για να τους διατηρείτε σε ένα σημείο"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Κατάργηση όλων των αδειών;"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Κατάργηση όλων"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής δεδομένων από το Health Connect.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως κάμερα, μικρόφωνο ή τοποθεσία."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής δεδομένων από το Health Connect, συμπεριλαμβανομένων των παλαιότερων δεδομένων.\n\nΔεν επηρεάζονται άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως οι άδειες για την τοποθεσία, την κάμερα ή το μικρόφωνο."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής δεδομένων από το Health Connect, συμπεριλαμβανομένων των δεδομένων παρασκηνίου και των παλαιότερων δεδομένων.\n\nΔεν επηρεάζονται άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως οι άδειες για την τοποθεσία, την κάμερα ή το μικρόφωνο."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Να διαγραφούν επίσης τα δεδομένα της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g> από το Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Κατάργηση όλων των αδειών;"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Κατάργηση όλων των αδειών ιατρικού φακέλου;"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Κατάργηση όλων των αδειών φυσικής κατάστασης και ευεξίας;"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Να διαγραφούν επίσης από το Health Connect τα δεδομένα φυσικής κατάστασης από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Κατάργηση όλων των αδειών ιατρικού φακέλου;"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Να διαγραφούν επίσης από το Health Connect οι ιατρικοί φάκελοι από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής αυτών των δεδομένων από το Health Connect.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως άδειες για την κάμερα, το μικρόφωνο ή την τοποθεσία."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής αυτών των δεδομένων από το Health Connect, συμπεριλαμβανομένων των δεδομένων παρασκηνίου.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως άδειες για την κάμερα, το μικρόφωνο ή την τοποθεσία."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής αυτών των δεδομένων από το Health Connect, συμπεριλαμβανομένων των παλαιότερων δεδομένων.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως άδειες για την κάμερα, το μικρόφωνο ή την τοποθεσία."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής αυτών των δεδομένων από το Health Connect, συμπεριλαμβανομένων των δεδομένων παρασκηνίου και των παλαιότερων δεδομένων.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως άδειες για την κάμερα, το μικρόφωνο ή την τοποθεσία."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Κατάργηση όλων των αδειών;"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής δεδομένων από το Health Connect.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως άδειες για την κάμερα, το μικρόφωνο ή την τοποθεσία."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής δεδομένων από το Health Connect, συμπεριλαμβανομένων των δεδομένων παρασκηνίου.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως άδειες για την κάμερα, το μικρόφωνο ή την τοποθεσία."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής δεδομένων από το Health Connect, συμπεριλαμβανομένων των παλαιότερων δεδομένων.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως άδειες για την κάμερα, το μικρόφωνο ή την τοποθεσία."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν θα έχει πλέον δυνατότητα ανάγνωσης ή εγγραφής δεδομένων από το Health Connect, συμπεριλαμβανομένων των δεδομένων παρασκηνίου και των παλαιότερων δεδομένων.\n\nΑυτό δεν επηρεάζει άλλες άδειες που ενδέχεται να έχει αυτή η εφαρμογή, όπως άδειες για την κάμερα, το μικρόφωνο ή την τοποθεσία."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Να διαγραφούν επίσης από το Health Connect τα δεδομένα φυσικής κατάστασης και οι ιατρικοί φάκελοι από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Οι άδειες για αυτή την εφαρμογή καταργήθηκαν"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Να διαγραφούν επίσης όλα τα δεδομένα του Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Επόμενη ημέρα"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Επιλεγμένη ημέρα"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Προηγούμενη ημέρα"</string>
     <string name="default_error" msgid="7966868260616403475">"Παρουσιάστηκε κάποιο πρόβλημα. Δοκιμάστε ξανά."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Άγνωστος πόρος"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Δεδομένα πηγής"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Αριστερή αγκύλη."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Δεξιά αγκύλη."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Τιμή πεδίου <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Αυτές οι εφαρμογές δεν έχουν πλέον πρόσβαση, αλλά έχουν ακόμη αποθηκευμένα δεδομένα στο Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> μπορεί να διαβάζει δεδομένα που προστέθηκαν μετά τις <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Για να διαχειριστείτε άλλες άδειες Android στις οποίες μπορεί να έχει πρόσβαση αυτή η εφαρμογή, μεταβείτε στην επιλογή Ρυθμίσεις &gt; Εφαρμογές"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Τα δεδομένα που κοινοποιείτε στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> καλύπτονται από την πολιτική απορρήτου της"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Μπορείτε να μάθετε πώς η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> χειρίζεται τα δεδομένα σας στην πολιτική απορρήτου του προγραμματιστή"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Για να διαχειριστείτε άλλες άδειες Android στις οποίες έχει πρόσβαση αυτή η εφαρμογή, μεταβείτε στις Ρυθμίσεις και πατήστε Εφαρμογές"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Ανάγνωση πολιτικής απορρήτου"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Πρόσβαση τις τελευταίες 24 ώρες"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Πρόσβαση εφαρμογής"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Προς το παρόν, δεν έχετε εγκαταστήσει συμβατές εφαρμογές"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Επιπλέον πρόσβαση"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Παλιά δεδομένα, δεδομένα παρασκηνίου"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Καταργήθηκαν πρόσθετες άδειες για αυτή την εφαρμογή"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Άδειες"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Φυσική κατάσταση και ευεξία"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Άσκηση, ύπνος, διατροφή και άλλα"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Ιατρικοί φάκελοι"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ιατρικοί φάκελοι"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Εργαστηρ. αποτελέσ., αγωγές, εμβολ. κ.ά."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Αποτελέσματα, αγωγές, εμβόλια και άλλα"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Άδειες εφαρμογών που καταργήθηκαν"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Το Health Connect κατάργησε τις άδειες για την εφαρμογή <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Το Health Connect κατάργησε τις άδειες για τις εφαρμογές <xliff:g id="APP_DATA_0">%1$s</xliff:g> και <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Μετάβαση στο Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Ξεκινήστε με το Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Το Health Connect αποθηκεύει τα δεδομένα υγείας και φυσικής κατάστασής σας, προσφέροντας έναν απλό τρόπο συγχρονισμού των διαφορετικών εφαρμογών στη συσκευή σας"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Το Health Connect αποθηκεύει και συγχρονίζει τα δεδομένα υγείας και φυσικής κατάστασης από διαφορετικές εφαρμογές.\n\n"<b>"Δεδομένα φυσικής κατάστασης και ευεξίας,"</b>" όπως οι δραστηριότητες άσκησης, τα βήματα, η διατροφή, ο ύπνος και άλλα\n\n"<b>"Ιατρικοί φάκελοι,"</b>" όπως τα εμβόλια, τα αποτελέσματα εργαστηριακών εξετάσεων και άλλα"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Με το Health Connect, μπορείτε να κάνετε τα εξής"</string>
     <string name="share_data" msgid="3481932156368883946">"Μοιραστείτε δεδομένα με τις εφαρμογές σας"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Επιλέξτε τα δεδομένα που μπορεί να διαβάσει ή να εγγράψει κάθε εφαρμογή στο Health Connect."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Διαχειριστείτε τις ρυθμίσεις και το απόρρητό σας"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Ήπια αιμόρροια"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Μέτρια αιμόρροια"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Έντονη αιμόρροια"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Άγνωστη ροή"</string>
     <string name="period_day" msgid="3821944462093965882">"Ημέρα <xliff:g id="DAY">%1$d</xliff:g> της περιόδου από <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Περίοδος (1 ημέρα)}other{Περίοδος (# ημέρες)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Θετικό"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Αρνητικό"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Υψηλό"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Mουσική"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Άλλo"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Χωρίς καθοδήγηση"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Μέτρια"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Έντονη"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> λ."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ώ. <xliff:g id="MIN">%2$s</xliff:g> λ."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ω."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Η ενσωμάτωση είναι σε εξέλιξη"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Γίνεται ενσωμάτωση του Health Connect με το σύστημα Android.\n\nΜπορεί να χρειαστεί λίγος χρόνος για τη μεταφορά των δεδομένων και των αδειών σας."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Μην κλείσετε την εφαρμογή μέχρι να λάβετε μια ειδοποίηση ότι η διαδικασία έχει ολοκληρωθεί."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Η ενσωμάτωση του Health Connect είναι σε εξέλιξη"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Απαιτείται ενημέρωση"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Γίνεται ενσωμάτωση του Health Connect με το σύστημα Android, έτσι ώστε να μπορείτε να αποκτήσετε πρόσβαση σε αυτό απευθείας από τις ρυθμίσεις σας."</string>
     <string name="update_button" msgid="4544529019832009496">"Ενημέρωση"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Ξεκινήστε αυτή την ενημέρωση, έτσι ώστε το Health Connect να συνεχίσει την ενσωμάτωση με τις ρυθμίσεις συστήματός σας"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Ενημέρωση τώρα"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Απαιτείται ενημέρωση συστήματος"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Πριν συνεχίσετε, ενημερώστε το σύστημα του τηλεφώνου σας."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Αν έχετε ενημερώσει ήδη το σύστημα του τηλεφώνου σας, δοκιμάστε να επανεκκινήσετε το τηλέφωνό σας για να συνεχίσει την ενσωμάτωση"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Απαιτείται ενημέρωση του Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Πριν συνεχίσετε, ενημερώστε την εφαρμογή Health Connect στην πιο πρόσφατη έκδοση."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Απαιτείται περισσότερος χρόνος"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Το Health Connect χρειάζεται <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> αποθηκευτικού χώρου στο τηλέφωνό σας προκειμένου να συνεχιστεί η ενσωμάτωση.\n\nΑποδεσμεύστε χώρο στο τηλέφωνό σας και δοκιμάστε ξανά."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Δοκιμάστε ξανά"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Αποδεσμεύστε χώρο"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Απαιτείται περισσότερος χρόνος"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Το Health Connect χρειάζεται <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> αποθηκευτικού χώρου στο τηλέφωνό σας για να συνεχίσει την ενσωμάτωση."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Η ενσωμάτωση τέθηκε σε παύση"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Η εφαρμογή Health Connect έκλεισε ενώ γινόταν ενσωμάτωση με το σύστημα Android.\n\nΚάντε κλικ στη συνέχιση για να ανοίξετε ξανά την εφαρμογή και να συνεχίσετε τη μεταφορά των δεδομένων και των αδειών σας."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Για να διατηρήσετε τα δεδομένα σας Health Connect, ολοκληρώστε αυτήν τη διαδικασία εντός <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Πατήστε για να συνεχίσετε την ενσωμάτωση του Health Connect με το σύστημα Android. Για να διατηρήσετε τα δεδομένα σας, ολοκληρώστε αυτήν τη διαδικασία εντός <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Πατήστε για να συνεχίσετε την ενσωμάτωση του Health Connect με το σύστημα Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Συνέχεια"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Συνέχιση ενσωμάτωσης Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Για να διατηρήσετε τα δεδομένα σας, ολοκληρώστε αυτήν τη διαδικασία εντός <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Απαιτείται ενημέρωση της εφαρμογής"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> πρέπει να ενημερωθεί για να συνεχιστεί ο συγχρονισμός με το Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Ορισμένες εφαρμογές πρέπει να ενημερωθούν για να συνεχιστεί ο συγχρονισμός με το Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> πρέπει να ενημερωθεί, για να συνεχιστεί ο συγχρονισμός με το Health Connect. Οι ενημερώσεις ενδέχεται να μην είναι διαθέσιμες για όλες τις εφαρμογές."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Ορισμένες εφαρμογές πρέπει να ενημερωθούν, για να συνεχιστεί ο συγχρονισμός με το Health Connect. Οι ενημερώσεις ενδέχεται να μην είναι διαθέσιμες για όλες τις εφαρμογές."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Έλεγχος για ενημερώσεις"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Μάθετε περισσότερα"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Ενσωμάτωση Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Η ενσωμάτωση του Health Connect δεν ολοκληρώθηκε"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Θα λάβετε μια ειδοποίηση όταν γίνει ξανά διαθέσιμη."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Το κατάλαβα"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Η ενσωμάτωση του Health Connect δεν ολοκληρώθηκε"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Διαβάστε περισσότερα"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Η ενσωμάτωση του Health Connect ολοκληρώθηκε"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Άνοιγμα"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Τι νέο υπάρχει"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Μπορείτε πλέον να αποκτήσετε πρόσβαση στο Health Connect απευθείας από τις ρυθμίσεις σας. Απεγκαταστήστε την εφαρμογή Health Connect ανά πάσα στιγμή για να αποδεσμεύσετε αποθηκευτικό χώρο."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Το κατάλαβα"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Επεξεργασία πηγών εφαρμογών"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Προεπιλογή συσκευής"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Δεδομένα εφαρμογών"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Τα δεδομένα από εφαρμογές με πρόσβαση στο Health Connect θα εμφανίζονται εδώ"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Τα δεδομένα από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> θα εμφανίζονται εδώ"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Τα δεδομένα από εφαρμογές με πρόσβαση στο Health Connect θα εμφανίζονται εδώ"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Ημέρα"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Εβδομάδα"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Μήνας"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Προηγούμενος μήνας"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Καταχωρίσεις"</string>
     <string name="tab_access" msgid="7818197975407243701">"Πρόσβαση"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Επιτρέπετε στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει επιπλέον πρόσβαση;"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> θέλει επίσης να έχει πρόσβαση σε αυτές τις ρυθμίσεις του Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Ενεργοποιήστε τουλάχιστον μία άδεια ανάγνωσης ώστε να ενεργοποιηθεί η πρόσβαση σε δεδομένα παρασκηνίου ή σε παλαιότερα δεδομένα για αυτή την εφαρμογή"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Ενεργοποιήστε τουλάχιστον μία άδεια ανάγνωσης ώστε να ενεργοποιηθεί η πρόσβαση στο παρασκήνιο για αυτή την εφαρμογή"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Ενεργοποιήστε τουλάχιστον μία άδεια ανάγνωσης ώστε να ενεργοποιηθεί η πρόσβαση σε παλαιότερα δεδομένα για αυτή την εφαρμογή"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Έναρξη χρήσης του Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Συγχρονίστε τις πρώτες εφαρμογές σας, ώστε να μοιράζονται δεδομένα υγείας και φυσικής κατάστασης μεταξύ τους"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Ρύθμιση"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Εμφάνιση συμβατών εφαρμογών"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Βρείτε περισσότερες εφαρμογές για συγχρονισμό με την εφαρμογή <xliff:g id="APP_NAME">%s</xliff:g> μέσω του Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Εμφάνιση στο app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ορισμός κλειδώματος οθόνης"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Για πρόσθετη ασφάλεια για τα δεδομένα υγείας σας, ορίστε ένα PIN, ένα μοτίβο ή έναν κωδικό πρόσβασης για αυτή τη συσκευή"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Ορισμός κλειδώματος οθόνης"</string>
     <string name="select_all" msgid="837499881590001166">"Επιλογή όλων"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Οι συνδεδεμένες εφαρμογές δεν θα έχουν πλέον τη δυνατότητα ανάγνωσης αυτών των δεδομένων από το Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Επιλεγμένο"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Μη επιλεγμένο"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Διατίθεται χάρτης διαδρομής άσκησης"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Επόμενη ημέρα"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Επόμενη εβδομάδα"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Επόμενος μήνας"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Προηγούμενη ημέρα"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Προηγούμενη εβδομάδα"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Προηγούμενος μήνας"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Οριστική διαγραφή όλων των δεδομένων;"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Οριστική διαγραφή των επιλεγμένων δεδομένων;"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Οριστική διαγραφή όλων των δεδομένων της εφαρμογής <xliff:g id="APP_NAME">%s</xliff:g>;"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Οριστική διαγραφή των επιλεγμένων καταχωρίσεων της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g> για την εβδομάδα <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>;"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Οριστική διαγραφή των επιλεγμένων καταχωρίσεων της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g> για τον μήνα <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>;"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Οριστική διαγραφή αυτής της καταχώρισης της εφαρμογής <xliff:g id="APP_NAME">%s</xliff:g>;"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Να διαγραφούν οριστικά τα δεδομένα <xliff:g id="DATA_TYPE">%1$s</xliff:g> για την εφαρμογή <xliff:g id="APP_NAME">%2$s</xliff:g>;"</string>
+    <string name="on" msgid="8266542510798355807">"Ενεργό"</string>
+    <string name="off" msgid="6996623844428550649">"Ανενεργό"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Πρόσβαση στις <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Πρόσβαση χθες, στις <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Πρόσβαση στις <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Να επιτρέπεται πάντα"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Αποδοχή επιλεγμένων"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Κατά τη χρήση της εφαρμογής"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Απόρριψη όλων"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Να επιτρέπεται στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> να έχει πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας;"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά πρόσβαση στα δεδομένα <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nΕπιλέξτε να επιτραπεί η πρόσβαση σε όλα ή να τα ελέγξετε μεμονωμένα."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Να επιτρέπεται η πρόσβαση της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g> στα δεδομένα <xliff:g id="DATA_TYPE">%2$s</xliff:g>;"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Φυσική κατάσταση και ευεξία"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"να επιτρέπεται πάντα"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"κατά τη χρήση"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Να επιτρέπεται πάντα"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Κατά τη χρήση"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> μπορεί να έχει πρόσβαση σε όλα τα δεδομένα φυσικής κατάστασης και ευεξίας <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Επιτρέπεται η πρόσβαση"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Επιτρέπεται η ανάγνωση"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Αυτές οι άδειες παρέχουν στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> πρόσβαση σε δεδομένα από τους αισθητήρες της συσκευής σας."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Επιτρέπονται <xliff:g id="NUMBER_0">%1$d</xliff:g> από <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> εφαρμογές"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Δεν υπάρχουν αιτήματα από εφαρμογές"</string>
+    <string name="allowed" msgid="4158456017482263737">"Επιτρέπεται"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Δεν επιτρέπεται"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Οι εφαρμογές με αυτή την άδεια μπορούν να αποκτήσουν πρόσβαση σε δεδομένα <xliff:g id="DATA_TYPE">%s</xliff:g> από τους αισθητήρες της συσκευής σας."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Κατάργηση πρόσβασης στα δεδομένα <xliff:g id="DATA_TYPE">%s</xliff:g> για όλες τις εφαρμογές στο ρολόι σας;"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Σύμβολο επιλογής"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Σύμβολο \"Χ\""</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Αυτή τη στιγμή, η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> μπορεί να έχει πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Να επιτρέπεται στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> η πρόσβαση σε δεδομένα φυσικής κατάστασης και ευεξίας ανά πάσα στιγμή;"</string>
+    <string name="current_access" msgid="1457167070428176139">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> έχει πρόσβαση στα δεδομένα <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Διαχείριση αδειών φυσικής κατάστασης και ευεξίας"</string>
 </resources>
diff --git a/apk/res/values-en-rAU/strings.xml b/apk/res/values-en-rAU/strings.xml
index 47bab95..2e95300 100644
--- a/apk/res/values-en-rAU/strings.xml
+++ b/apk/res/values-en-rAU/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Manage the health and fitness data on your device, and control which apps can access it"</string>
     <string name="data_title" msgid="4456619761533380816">"Data and access"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Browse health records"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"View your health records and which apps can access them"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"All categories"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"See all categories"</string>
     <string name="no_data" msgid="1906986019249068659">"No data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Yesterday"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Read: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Write: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Manage permissions"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Time: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activity"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"access your health data"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Read calories burned"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Allows the app to read the calories burned"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Access data in the background"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access data in the background?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access data in the background?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"If you allow, this app can access fitness and wellness data and health records when you\'re not using the app."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"If you allow, this app can access health records when you\'re not using the app."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"If you allow, this app can access fitness and wellness data when you\'re not using the app."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"If you allow, this app can access Health Connect data when you\'re not using the app."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access past data?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"If you allow, this app can access fitness and wellness data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"If you allow, this app can access all past fitness and wellness data."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"If you allow, this app can access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"If you allow, this app can access all past Health Connect data."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Allow additional access for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> also wants to access these Health Connect settings"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Access all data in the background"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Access health records in the background"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Access fitness and wellness data in the background"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Allow this app to access fitness and wellness data and health records when you\'re not using the app"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Access data in the background"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Allow this app to access Health Connect data when you\'re not using the app"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Access past fitness and wellness data"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Allow this app to access data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Allow this app to access all past data"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Access past data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Allow this app to access all past Health Connect data"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> can already access past data for your health records"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Read more about permissions"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Access all data in the background"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Access health records in the background"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Access fitness and wellness data in the background"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Allow this app to access fitness and wellness data and health records when you\'re not using the app"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Access data in the background"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Allow this app to access Health Connect data when you\'re not using the app"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Access past fitness and wellness data"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Allow this app to access data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Allow this app to access all past data"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Access past data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Allow this app to access all Health Connect past data"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"No fitness data is currently being read because <xliff:g id="APP_NAME">%1$s</xliff:g> has no read permissions on"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> can already access past data for your health records. To change this, turn off health record permissions for this app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Manage health record permissions"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Enable at least one read permission in order to turn on background or past data access for this app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Enable at least one read permission in order to turn on background access for this app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Enable at least one read permission in order to turn on past data access for this app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Allow this app to access all past Health Connect data"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Allow this app to access Health Connect data when you\'re not using the app"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"If you allow, this app can access Health Connect data when you\'re not using the app."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Access past data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access past data?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Allow this app to access all past Health Connect data"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"If you allow, this app can access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"If you allow, this app can access all past Health Connect data."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Active calories burned"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"active calories burned"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Read active calories burned"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"wheelchair pushes"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Read wheelchair pushes"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Write wheelchair pushes"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Activity intensity"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"activity intensity"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Read activity intensity"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Write activity intensity"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basal metabolic rate"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basal metabolic rate"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Read basal metabolic rate"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"skin temperature"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Read skin temperature"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Write skin temperature"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"This includes all the health records synced to and added to Health Connect. This might not be your full medical record and does not include a medical description of your health records."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"All health records"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"all health records"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Write all health records"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergies"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergies"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Read allergies"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunisation"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunisation"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Read immunisation"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratory results"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratory results"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Read laboratory results"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergies"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergies"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Read allergies"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Conditions"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"conditions"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Read conditions"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccines"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccines"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Read vaccines"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Lab results"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"lab results"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Read lab results"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medications"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medications"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Read medications"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personal details"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personal details"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Read personal details"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Practitioner details"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"practitioner details"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Read practitioner details"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Pregnancy"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"pregnancy"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Read pregnancy"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problems"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problems"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Read problems"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedures"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedures"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Read procedures"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Social history"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Social history"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"social history"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Read social history"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vital signs"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visits"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visits"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Read visits"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vital signs"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vital signs"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Read vital signs"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Write mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Allow \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' to read"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Allow \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' to write"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancel"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Allow"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Allow all"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Don\'t allow"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Choose data that you want this app to read or write to Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Choose data that you want this app to read or write to Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Choose data that you want this app to read from Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Choose data that you want this app to write to Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"If you give read access, the app can read new data and data from the past 30 days"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"If you give read access, the app can read new and past data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in the developer\'s <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access fitness and wellness data?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in their <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privacy policy"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access your health records?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"If you give access, the app can read and write data, such as allergies, lab results, vaccines and more\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"If you give access, the app can read data such as allergies, lab results, vaccines and more\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"About health records"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data to share includes"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"If you allow, <xliff:g id="APP_NAME">%1$s</xliff:g> can share your health records with Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sync your health records from your different apps and sources to keep them in one place"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Remove all permissions?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Remove all"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like location, camera or microphone."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like location, camera or microphone."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Also delete <xliff:g id="APP_NAME">%1$s</xliff:g> data from Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remove all permissions?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remove all health record permissions?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Remove all fitness and wellness permissions?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Also delete fitness data from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remove all health record permissions?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Also delete health records from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including background data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remove all permissions?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including background data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Also delete fitness data and health records from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Removed permissions for this app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Also delete all Health Connect data"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Next day"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Selected day"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Previous day"</string>
     <string name="default_error" msgid="7966868260616403475">"Something went wrong. Please try again."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Unknown resource"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Source data"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Open bracket."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Closed bracket."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Field <xliff:g id="FIELD">%2$s</xliff:g> Value"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"These apps no longer have access, but still have data stored in Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> can read data added after <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"To manage other Android permissions that this app can access, go to Settings &gt; Apps"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data that you share with <xliff:g id="APP_NAME">%1$s</xliff:g> is covered by their privacy policy"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"You can find out how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in the developer\'s privacy policy"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"To manage other Android permissions this app can access, go to Settings, then tap Apps"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Read privacy policy"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Accessed in last 24 hours"</string>
     <string name="app_access_title" msgid="7137018424885371763">"App access"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"You currently don\'t have any compatible apps installed"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Additional access"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Past data, background data"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Removed additional permissions for this app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permissions"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness and wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercise, sleep, nutrition and others"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Health records"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"health records"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab results, medications, immunisations and others"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Lab results, medications, vaccines and others"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Removed app permissions"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect removed permissions for <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect removed permissions for <xliff:g id="APP_DATA_0">%1$s</xliff:g> and <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Go to the Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Get started with Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect stores your health and fitness data, giving you a simple way to sync the different apps on your device"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect stores and syncs your health and fitness data from different apps.\n\n"<b>"Fitness and wellness data,"</b>" including exercise sessions, steps, nutrition, sleep and more\n\n"<b>"Health records,"</b>" including vaccines, lab results and more"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"With Health Connect, you can"</string>
     <string name="share_data" msgid="3481932156368883946">"Share data with your apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Choose the data that each app can read or write to Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Manage your settings and privacy"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Light flow"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Medium flow"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Heavy flow"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Unknown flow"</string>
     <string name="period_day" msgid="3821944462093965882">"Period day <xliff:g id="DAY">%1$d</xliff:g> of <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Period (1 day)}other{Period (# days)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positive"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negative"</string>
     <string name="ovulation_high" msgid="205362931427158291">"High"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Music"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Other"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Unguided"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderate"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Vigorous"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integration in progress"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect is being integrated with the Android system.\n\nIt may take some time while your data and permissions are being transferred."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Don\'t close the app until you get a notification that the process is complete."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect integration in progress"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Update needed"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect is being integrated with the Android system so that you can access it directly from your settings."</string>
     <string name="update_button" msgid="4544529019832009496">"Update"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Start this update so that Health Connect can continue integrating with your system settings"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Update now"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"System update needed"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Before continuing, update your phone system."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"If you\'ve already updated your phone system, try restarting your phone to continue the integration"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect update needed"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Before continuing, update the Health Connect app to the latest version."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"More space needed"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect needs <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> of storage space on your phone in order for the integration to continue.\n\nClear some space on your phone and then try again."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Try again"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Free up space"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"More space needed"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect needs <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> of storage space on your phone to continue integrating."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integration paused"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"The Health Connect app closed while it was being integrated with the Android system.\n\nClick resume to reopen the app and continue transferring your data and permissions."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"In order to keep your Health Connect data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tap to continue integrating Health Connect with the Android system. In order to keep your data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tap to continue integrating Health Connect with the Android system."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continue"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Resume Health Connect integration"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"In order to keep your data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"App update needed"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> needs to be updated to continue syncing with Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Some apps need to be updated to continue syncing with Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> needs to be updated to continue syncing with Health Connect. Updates may not be available for all apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Some apps need to be updated to continue syncing with Health Connect. Updates may not be available for all apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Check for updates"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Learn more"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect integration"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect integration didn\'t complete"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"You\'ll get a notification when it becomes available again."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Got it"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect integration didn\'t complete"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Read more"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect integration complete"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Open"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"What\'s new"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"You can now access Health Connect directly from your settings. Uninstall the Health Connect app any time to free up storage space."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Got it"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Edit app sources"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Device default"</string>
     <string name="app_data_title" msgid="6499967982291000837">"App data"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data from apps with access to Health Connect will show here"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data from <xliff:g id="APP_NAME">%1$s</xliff:g> will show here"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data from apps with access to Health Connect will show here"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Day"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Week"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Month"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Last month"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entries"</string>
     <string name="tab_access" msgid="7818197975407243701">"Access"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Allow additional access for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> also wants to access these Health Connect settings"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Enable at least one read permission in order to turn on background or past data access for this app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Enable at least one read permission in order to turn on background access for this app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Enable at least one read permission in order to turn on past data access for this app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Start using Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sync your first apps to share health and fitness data between them"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Set up"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"See compatible apps"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Find more apps to sync with <xliff:g id="APP_NAME">%s</xliff:g> via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"See on app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Set a screen lock"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"For added security for your health data, set a PIN, pattern or password for this device"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Set screen lock"</string>
     <string name="select_all" msgid="837499881590001166">"Select all"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Connected apps will no longer be able to read this data from Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Ticked"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Not ticked"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Exercise map route available"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Next day"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Next week"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Next month"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Previous day"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Previous week"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Previous month"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Permanently delete all data?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Permanently delete selected data?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Permanently delete all <xliff:g id="APP_NAME">%s</xliff:g> data?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Permanently delete selected <xliff:g id="APP_NAME">%1$s</xliff:g> entries for the week of <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Permanently delete selected <xliff:g id="APP_NAME">%1$s</xliff:g> entries for <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Permanently delete this <xliff:g id="APP_NAME">%s</xliff:g> entry?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Permanently delete <xliff:g id="DATA_TYPE">%1$s</xliff:g> data for <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"On"</string>
+    <string name="off" msgid="6996623844428550649">"Off"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Accessed at <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Accessed yesterday <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Accessed <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Allow all the time"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Allow selected"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"While using the app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Deny all"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access fitness and wellness data?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting access to <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nChoose to allow all or control them individually."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness and wellness"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"all the time"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"while in use"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"All the time"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"While in use"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> can access all of your fitness and wellness data <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Allowed to access"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Allowed to read"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"These permissions give <xliff:g id="APP_NAME">%1$s</xliff:g> access to data from your device sensors."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps allowed"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"No apps requesting"</string>
+    <string name="allowed" msgid="4158456017482263737">"Allowed"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Not allowed"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps with this permission can access <xliff:g id="DATA_TYPE">%s</xliff:g> data from your device sensors."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Remove <xliff:g id="DATA_TYPE">%s</xliff:g> access for all apps on your watch?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Tick"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Cross mark"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Currently, <xliff:g id="APP_NAME">%1$s</xliff:g> can access fitness and wellness data <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> access to fitness and wellness data all the time?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> has access to <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Manage fitness and wellness permissions"</string>
 </resources>
diff --git a/apk/res/values-en-rCA/strings.xml b/apk/res/values-en-rCA/strings.xml
index 11d026e..ec13876 100644
--- a/apk/res/values-en-rCA/strings.xml
+++ b/apk/res/values-en-rCA/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Manage the health and fitness data on your device, and control which apps can access it"</string>
     <string name="data_title" msgid="4456619761533380816">"Data and access"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Browse health records"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"View your health records and which apps can access them"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"All categories"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"See all categories"</string>
     <string name="no_data" msgid="1906986019249068659">"No data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Yesterday"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Read: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Write: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Manage permissions"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Time: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activity"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"access your health data"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Read calories burned"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Allows the app to read the calories burned"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Access data in the background"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access data in the background?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access data in the background?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"If you allow, this app can access fitness and wellness data and health records when you\'re not using the app."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"If you allow, this app can access health records when you\'re not using the app."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"If you allow, this app can access fitness and wellness data when you\'re not using the app."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"If you allow, this app can access Health Connect data when you\'re not using the app."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access past data?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"If you allow, this app can access fitness and wellness data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"If you allow, this app can access all past fitness and wellness data."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"If you allow, this app can access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"If you allow, this app can access all past Health Connect data."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Allow additional access for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> also wants to access these Health Connect settings"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Access all data in the background"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Access health records in the background"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Access fitness and wellness data in the background"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Allow this app to access fitness and wellness data and health records when you\'re not using the app"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Access data in the background"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Allow this app to access Health Connect data when you\'re not using the app"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Access past fitness and wellness data"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Allow this app to access data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Allow this app to access all past data"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Access past data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Allow this app to access all past Health Connect data"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> can already access past data for your health records"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Read more about permissions"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Access all data in the background"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Access health records in the background"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Access fitness and wellness data in the background"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Allow this app to access fitness and wellness data and health records when you\'re not using the app"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Access data in the background"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Allow this app to access Health Connect data when you\'re not using the app"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Access past fitness and wellness data"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Allow this app to access data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Allow this app to access all past data"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Access past data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Allow this app to access all Health Connect past data"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"No fitness data is currently being read because <xliff:g id="APP_NAME">%1$s</xliff:g> has no read permissions on"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> can already access past data for your health records. To change this, turn off health record permissions for this app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Manage health record permissions"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Enable at least one read permission in order to turn on background or past data access for this app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Enable at least one read permission in order to turn on background access for this app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Enable at least one read permission in order to turn on past data access for this app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Allow this app to access all past Health Connect data"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Allow this app to access Health Connect data when you\'re not using the app"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"If you allow, this app can access Health Connect data when you\'re not using the app."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Access past data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access past data?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Allow this app to access all past Health Connect data"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"If you allow, this app can access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"If you allow, this app can access all past Health Connect data."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Active calories burned"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"active calories burned"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Read active calories burned"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"wheelchair pushes"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Read wheelchair pushes"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Write wheelchair pushes"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Activity intensity"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"activity intensity"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Read activity intensity"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Write activity intensity"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basal metabolic rate"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basal metabolic rate"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Read basal metabolic rate"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"skin temperature"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Read skin temperature"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Write skin temperature"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"This includes all the health records synced to and added to Health Connect. This might not be your full medical record and does not include a medical description of your health records."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"All health records"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"all health records"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Write all health records"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergies"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergies"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Read allergies"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunization"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunization"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Read immunization"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratory Results"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratory results"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Read laboratory results"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergies"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergies"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Read allergies"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Conditions"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"conditions"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Read conditions"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccines"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccines"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Read vaccines"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Lab results"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"lab results"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Read lab results"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medications"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medications"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Read medications"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personal details"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personal details"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Read personal details"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Practitioner details"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"practitioner details"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Read practitioner details"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Pregnancy"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"pregnancy"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Read pregnancy"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problems"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problems"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Read problems"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedures"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedures"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Read procedures"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Social History"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Social history"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"social history"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Read social history"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vital Signs"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visits"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visits"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Read visits"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vital signs"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vital signs"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Read vital signs"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Write mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Allow “<xliff:g id="APP_NAME">%1$s</xliff:g>” to read"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Allow “<xliff:g id="APP_NAME">%1$s</xliff:g>” to write"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancel"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Allow"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Allow all"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Don\'t allow"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Choose data you want this app to read or write to Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Choose data you want this app to read or write to Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Choose data you want this app to read from Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Choose data you want this app to write to Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"If you give read access, the app can read new data and data from the past 30 days"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"If you give read access, the app can read new and past data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in the developer\'s <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access fitness and wellness data?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in their <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privacy policy"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access your health records?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"If you give access, the app can read and write data such as allergies, lab results, vaccines and more\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"If you give access, the app can read data such as allergies, lab results, vaccines and more\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"About health records"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data to share includes"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"If you allow, <xliff:g id="APP_NAME">%1$s</xliff:g> can share your health records with Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sync your health records from your different apps and sources to keep them in one place"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Remove all permissions?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Remove all"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone, or location."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions this app may have, like location, camera, or microphone."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions this app may have, like location, camera, or microphone."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Also delete <xliff:g id="APP_NAME">%1$s</xliff:g> data from Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remove all permissions?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remove all health record permissions?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Remove all fitness and wellness permissions?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Also delete fitness data from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remove all health record permissions?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Also delete health records from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including background data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remove all permissions?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including background data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Also delete fitness data and health records from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Removed permissions for this app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Also delete all Health Connect data"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Next day"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Selected day"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Previous day"</string>
     <string name="default_error" msgid="7966868260616403475">"Something went wrong. Please try again."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Unknown Resource"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Source data"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Open bracket."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Closed bracket."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Field <xliff:g id="FIELD">%2$s</xliff:g> Value"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"These apps no longer have access, but still have data stored in Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> can read data added after <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"To manage other Android permissions this app can access, go to Settings &gt; Apps"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data you share with <xliff:g id="APP_NAME">%1$s</xliff:g> is covered by their privacy policy"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in the developer\'s privacy policy"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"To manage other Android permissions this app can access, go to Settings, then tap Apps"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Read privacy policy"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Accessed in past 24 hours"</string>
     <string name="app_access_title" msgid="7137018424885371763">"App access"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"You don\'t currently have any compatible apps installed"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Additional access"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Past data, background data"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Removed additional permissions for this app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permissions"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness and wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercise, sleep, nutrition and others"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Health records"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"health records"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab results, medications, immunizations and others"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Lab results, medications, vaccines and others"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Removed app permissions"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect removed permissions for <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect removed permissions for <xliff:g id="APP_DATA_0">%1$s</xliff:g> and <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Go to the Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Get started with Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect stores your health and fitness data, giving you a simple way to sync the different apps on your device"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect stores and syncs your health and fitness data from different apps.\n\n"<b>"Fitness and wellness data,"</b>" including exercise sessions, steps, nutrition, sleep and more\n\n"<b>"Health records,"</b>" including vaccines, lab results and more"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"With Health Connect you can"</string>
     <string name="share_data" msgid="3481932156368883946">"Share data with your apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Choose the data each app can read or write to Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Manage your settings and privacy"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Light flow"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Medium flow"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Heavy flow"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Unknown flow"</string>
     <string name="period_day" msgid="3821944462093965882">"Period day <xliff:g id="DAY">%1$d</xliff:g> of <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Period (1 day)}other{Period (# days)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positive"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negative"</string>
     <string name="ovulation_high" msgid="205362931427158291">"High"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Music"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Other"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Unguided"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderate"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Vigorous"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>h <xliff:g id="MIN">%2$s</xliff:g>m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integration in progress"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect is being integrated with the Android system.\n\nIt may take some time while your data and permissions are being transferred."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Don\'t close the app until you get a notification that the process is complete."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect integration in progress"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Update needed"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect is being integrated with the Android system so you can access it directly from your settings."</string>
     <string name="update_button" msgid="4544529019832009496">"Update"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Start this update so that Health Connect can continue integrating with your system settings"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Update now"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"System update needed"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Before continuing, update your phone system."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"If you\'ve already updated your phone system, try restarting your phone to continue the integration"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect update needed"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Before continuing, update the Health Connect app to the latest version."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"More space needed"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect needs <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> of storage space on your phone in order for the integration to continue.\n\nClear some space on your phone and then try again."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Try again"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Free up space"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"More space needed"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect needs <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> of storage space on your phone to continue integrating."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integration paused"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"The Health Connect app closed while it was being integrated with the Android system.\n\nClick resume to reopen the app and continue transferring your data and permissions."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"In order to keep your Health Connect data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tap to continue integrating Health Connect with the Android system. In order to keep your data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tap to continue integrating Health Connect with the Android system."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continue"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Resume Health Connect integration"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"In order to keep your data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"App update needed"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> needs to be updated to continue syncing with Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Some apps need to be updated to continue syncing with Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> needs to be updated to continue syncing with Health Connect. Updates may not be available for all apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Some apps need to be updated to continue syncing with Health Connect. Updates may not be available for all apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Check for updates"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Learn more"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect integration"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect integration didn\'t complete"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"You\'ll get a notification when it becomes available again."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Got it"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect integration didn\'t complete"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Read more"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect integration complete"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Open"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"What\'s new"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"You can now access Health Connect directly from your settings. Uninstall the Health Connect app any time to free up storage space."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Got it"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Edit app sources"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Device default"</string>
     <string name="app_data_title" msgid="6499967982291000837">"App data"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data from apps with access to Health Connect will show here"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data from <xliff:g id="APP_NAME">%1$s</xliff:g> will show here"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data from apps with access to Health Connect will show here"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Day"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Week"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Month"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Last month"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entries"</string>
     <string name="tab_access" msgid="7818197975407243701">"Access"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Allow additional access for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> also wants to access these Health Connect settings"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Enable at least one read permission in order to turn on background or past data access for this app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Enable at least one read permission in order to turn on background access for this app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Enable at least one read permission in order to turn on past data access for this app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Start using Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sync your first apps to share health and fitness data between them"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Set up"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"See compatible apps"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Find more apps to sync with <xliff:g id="APP_NAME">%s</xliff:g> via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"See on app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Set a screen lock"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"For added security for your health data, set a PIN, pattern, or password for this device"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Set screen lock"</string>
     <string name="select_all" msgid="837499881590001166">"Select all"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Connected apps will no longer be able to read this data from Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Checked"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Not checked"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Exercise map route available"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Next day"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Next week"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Next month"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Previous day"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Previous week"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Previous month"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Permanently delete all data?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Permanently delete selected data?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Permanently delete all <xliff:g id="APP_NAME">%s</xliff:g> data?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Permanently delete selected <xliff:g id="APP_NAME">%1$s</xliff:g> entries for the week of <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Permanently delete selected <xliff:g id="APP_NAME">%1$s</xliff:g> entries for <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Permanently delete this <xliff:g id="APP_NAME">%s</xliff:g> entry?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Permanently delete <xliff:g id="DATA_TYPE">%1$s</xliff:g> data for <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"On"</string>
+    <string name="off" msgid="6996623844428550649">"Off"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Accessed <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Accessed yesterday <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Accessed <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Allow all the time"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Allow selected"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"While using the app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Deny all"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access fitness and wellness data?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting access to <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nChoose to allow all or control them individually."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness and wellness"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"all the time"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"while in use"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"All the time"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"While in use"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> can access all of your fitness and wellness data <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Allowed to access"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Allowed to read"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"These permissions give <xliff:g id="APP_NAME">%1$s</xliff:g> access to data from your device sensors."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps allowed"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"No apps requesting"</string>
+    <string name="allowed" msgid="4158456017482263737">"Allowed"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Not allowed"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps with this permission can access <xliff:g id="DATA_TYPE">%s</xliff:g> data from your device sensors."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Remove <xliff:g id="DATA_TYPE">%s</xliff:g> access for all apps on your watch?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Check mark"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Cross mark"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Currently, <xliff:g id="APP_NAME">%1$s</xliff:g> can access fitness and wellness data <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> access to fitness and wellness data all the time?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> has access to <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Manage fitness and wellness permissions"</string>
 </resources>
diff --git a/apk/res/values-en-rGB/strings.xml b/apk/res/values-en-rGB/strings.xml
index 47bab95..2e95300 100644
--- a/apk/res/values-en-rGB/strings.xml
+++ b/apk/res/values-en-rGB/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Manage the health and fitness data on your device, and control which apps can access it"</string>
     <string name="data_title" msgid="4456619761533380816">"Data and access"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Browse health records"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"View your health records and which apps can access them"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"All categories"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"See all categories"</string>
     <string name="no_data" msgid="1906986019249068659">"No data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Yesterday"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Read: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Write: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Manage permissions"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Time: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activity"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"access your health data"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Read calories burned"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Allows the app to read the calories burned"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Access data in the background"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access data in the background?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access data in the background?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"If you allow, this app can access fitness and wellness data and health records when you\'re not using the app."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"If you allow, this app can access health records when you\'re not using the app."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"If you allow, this app can access fitness and wellness data when you\'re not using the app."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"If you allow, this app can access Health Connect data when you\'re not using the app."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access past data?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"If you allow, this app can access fitness and wellness data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"If you allow, this app can access all past fitness and wellness data."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"If you allow, this app can access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"If you allow, this app can access all past Health Connect data."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Allow additional access for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> also wants to access these Health Connect settings"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Access all data in the background"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Access health records in the background"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Access fitness and wellness data in the background"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Allow this app to access fitness and wellness data and health records when you\'re not using the app"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Access data in the background"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Allow this app to access Health Connect data when you\'re not using the app"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Access past fitness and wellness data"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Allow this app to access data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Allow this app to access all past data"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Access past data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Allow this app to access all past Health Connect data"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> can already access past data for your health records"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Read more about permissions"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Access all data in the background"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Access health records in the background"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Access fitness and wellness data in the background"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Allow this app to access fitness and wellness data and health records when you\'re not using the app"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Access data in the background"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Allow this app to access Health Connect data when you\'re not using the app"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Access past fitness and wellness data"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Allow this app to access data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Allow this app to access all past data"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Access past data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Allow this app to access all Health Connect past data"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"No fitness data is currently being read because <xliff:g id="APP_NAME">%1$s</xliff:g> has no read permissions on"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> can already access past data for your health records. To change this, turn off health record permissions for this app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Manage health record permissions"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Enable at least one read permission in order to turn on background or past data access for this app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Enable at least one read permission in order to turn on background access for this app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Enable at least one read permission in order to turn on past data access for this app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Allow this app to access all past Health Connect data"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Allow this app to access Health Connect data when you\'re not using the app"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"If you allow, this app can access Health Connect data when you\'re not using the app."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Access past data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access past data?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Allow this app to access all past Health Connect data"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"If you allow, this app can access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"If you allow, this app can access all past Health Connect data."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Active calories burned"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"active calories burned"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Read active calories burned"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"wheelchair pushes"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Read wheelchair pushes"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Write wheelchair pushes"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Activity intensity"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"activity intensity"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Read activity intensity"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Write activity intensity"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basal metabolic rate"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basal metabolic rate"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Read basal metabolic rate"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"skin temperature"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Read skin temperature"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Write skin temperature"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"This includes all the health records synced to and added to Health Connect. This might not be your full medical record and does not include a medical description of your health records."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"All health records"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"all health records"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Write all health records"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergies"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergies"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Read allergies"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunisation"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunisation"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Read immunisation"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratory results"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratory results"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Read laboratory results"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergies"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergies"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Read allergies"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Conditions"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"conditions"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Read conditions"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccines"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccines"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Read vaccines"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Lab results"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"lab results"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Read lab results"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medications"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medications"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Read medications"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personal details"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personal details"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Read personal details"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Practitioner details"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"practitioner details"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Read practitioner details"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Pregnancy"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"pregnancy"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Read pregnancy"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problems"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problems"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Read problems"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedures"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedures"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Read procedures"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Social history"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Social history"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"social history"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Read social history"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vital signs"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visits"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visits"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Read visits"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vital signs"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vital signs"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Read vital signs"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Write mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Allow \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' to read"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Allow \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' to write"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancel"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Allow"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Allow all"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Don\'t allow"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Choose data that you want this app to read or write to Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Choose data that you want this app to read or write to Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Choose data that you want this app to read from Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Choose data that you want this app to write to Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"If you give read access, the app can read new data and data from the past 30 days"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"If you give read access, the app can read new and past data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in the developer\'s <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access fitness and wellness data?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in their <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privacy policy"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access your health records?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"If you give access, the app can read and write data, such as allergies, lab results, vaccines and more\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"If you give access, the app can read data such as allergies, lab results, vaccines and more\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"About health records"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data to share includes"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"If you allow, <xliff:g id="APP_NAME">%1$s</xliff:g> can share your health records with Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sync your health records from your different apps and sources to keep them in one place"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Remove all permissions?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Remove all"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like location, camera or microphone."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like location, camera or microphone."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Also delete <xliff:g id="APP_NAME">%1$s</xliff:g> data from Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remove all permissions?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remove all health record permissions?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Remove all fitness and wellness permissions?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Also delete fitness data from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remove all health record permissions?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Also delete health records from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including background data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remove all permissions?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including background data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Also delete fitness data and health records from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Removed permissions for this app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Also delete all Health Connect data"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Next day"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Selected day"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Previous day"</string>
     <string name="default_error" msgid="7966868260616403475">"Something went wrong. Please try again."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Unknown resource"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Source data"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Open bracket."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Closed bracket."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Field <xliff:g id="FIELD">%2$s</xliff:g> Value"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"These apps no longer have access, but still have data stored in Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> can read data added after <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"To manage other Android permissions that this app can access, go to Settings &gt; Apps"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data that you share with <xliff:g id="APP_NAME">%1$s</xliff:g> is covered by their privacy policy"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"You can find out how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in the developer\'s privacy policy"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"To manage other Android permissions this app can access, go to Settings, then tap Apps"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Read privacy policy"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Accessed in last 24 hours"</string>
     <string name="app_access_title" msgid="7137018424885371763">"App access"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"You currently don\'t have any compatible apps installed"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Additional access"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Past data, background data"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Removed additional permissions for this app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permissions"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness and wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercise, sleep, nutrition and others"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Health records"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"health records"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab results, medications, immunisations and others"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Lab results, medications, vaccines and others"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Removed app permissions"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect removed permissions for <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect removed permissions for <xliff:g id="APP_DATA_0">%1$s</xliff:g> and <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Go to the Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Get started with Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect stores your health and fitness data, giving you a simple way to sync the different apps on your device"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect stores and syncs your health and fitness data from different apps.\n\n"<b>"Fitness and wellness data,"</b>" including exercise sessions, steps, nutrition, sleep and more\n\n"<b>"Health records,"</b>" including vaccines, lab results and more"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"With Health Connect, you can"</string>
     <string name="share_data" msgid="3481932156368883946">"Share data with your apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Choose the data that each app can read or write to Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Manage your settings and privacy"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Light flow"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Medium flow"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Heavy flow"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Unknown flow"</string>
     <string name="period_day" msgid="3821944462093965882">"Period day <xliff:g id="DAY">%1$d</xliff:g> of <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Period (1 day)}other{Period (# days)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positive"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negative"</string>
     <string name="ovulation_high" msgid="205362931427158291">"High"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Music"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Other"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Unguided"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderate"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Vigorous"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integration in progress"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect is being integrated with the Android system.\n\nIt may take some time while your data and permissions are being transferred."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Don\'t close the app until you get a notification that the process is complete."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect integration in progress"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Update needed"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect is being integrated with the Android system so that you can access it directly from your settings."</string>
     <string name="update_button" msgid="4544529019832009496">"Update"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Start this update so that Health Connect can continue integrating with your system settings"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Update now"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"System update needed"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Before continuing, update your phone system."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"If you\'ve already updated your phone system, try restarting your phone to continue the integration"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect update needed"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Before continuing, update the Health Connect app to the latest version."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"More space needed"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect needs <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> of storage space on your phone in order for the integration to continue.\n\nClear some space on your phone and then try again."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Try again"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Free up space"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"More space needed"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect needs <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> of storage space on your phone to continue integrating."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integration paused"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"The Health Connect app closed while it was being integrated with the Android system.\n\nClick resume to reopen the app and continue transferring your data and permissions."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"In order to keep your Health Connect data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tap to continue integrating Health Connect with the Android system. In order to keep your data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tap to continue integrating Health Connect with the Android system."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continue"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Resume Health Connect integration"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"In order to keep your data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"App update needed"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> needs to be updated to continue syncing with Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Some apps need to be updated to continue syncing with Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> needs to be updated to continue syncing with Health Connect. Updates may not be available for all apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Some apps need to be updated to continue syncing with Health Connect. Updates may not be available for all apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Check for updates"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Learn more"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect integration"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect integration didn\'t complete"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"You\'ll get a notification when it becomes available again."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Got it"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect integration didn\'t complete"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Read more"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect integration complete"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Open"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"What\'s new"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"You can now access Health Connect directly from your settings. Uninstall the Health Connect app any time to free up storage space."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Got it"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Edit app sources"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Device default"</string>
     <string name="app_data_title" msgid="6499967982291000837">"App data"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data from apps with access to Health Connect will show here"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data from <xliff:g id="APP_NAME">%1$s</xliff:g> will show here"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data from apps with access to Health Connect will show here"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Day"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Week"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Month"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Last month"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entries"</string>
     <string name="tab_access" msgid="7818197975407243701">"Access"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Allow additional access for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> also wants to access these Health Connect settings"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Enable at least one read permission in order to turn on background or past data access for this app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Enable at least one read permission in order to turn on background access for this app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Enable at least one read permission in order to turn on past data access for this app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Start using Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sync your first apps to share health and fitness data between them"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Set up"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"See compatible apps"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Find more apps to sync with <xliff:g id="APP_NAME">%s</xliff:g> via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"See on app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Set a screen lock"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"For added security for your health data, set a PIN, pattern or password for this device"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Set screen lock"</string>
     <string name="select_all" msgid="837499881590001166">"Select all"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Connected apps will no longer be able to read this data from Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Ticked"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Not ticked"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Exercise map route available"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Next day"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Next week"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Next month"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Previous day"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Previous week"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Previous month"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Permanently delete all data?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Permanently delete selected data?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Permanently delete all <xliff:g id="APP_NAME">%s</xliff:g> data?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Permanently delete selected <xliff:g id="APP_NAME">%1$s</xliff:g> entries for the week of <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Permanently delete selected <xliff:g id="APP_NAME">%1$s</xliff:g> entries for <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Permanently delete this <xliff:g id="APP_NAME">%s</xliff:g> entry?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Permanently delete <xliff:g id="DATA_TYPE">%1$s</xliff:g> data for <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"On"</string>
+    <string name="off" msgid="6996623844428550649">"Off"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Accessed at <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Accessed yesterday <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Accessed <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Allow all the time"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Allow selected"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"While using the app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Deny all"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access fitness and wellness data?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting access to <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nChoose to allow all or control them individually."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness and wellness"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"all the time"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"while in use"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"All the time"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"While in use"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> can access all of your fitness and wellness data <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Allowed to access"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Allowed to read"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"These permissions give <xliff:g id="APP_NAME">%1$s</xliff:g> access to data from your device sensors."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps allowed"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"No apps requesting"</string>
+    <string name="allowed" msgid="4158456017482263737">"Allowed"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Not allowed"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps with this permission can access <xliff:g id="DATA_TYPE">%s</xliff:g> data from your device sensors."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Remove <xliff:g id="DATA_TYPE">%s</xliff:g> access for all apps on your watch?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Tick"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Cross mark"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Currently, <xliff:g id="APP_NAME">%1$s</xliff:g> can access fitness and wellness data <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> access to fitness and wellness data all the time?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> has access to <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Manage fitness and wellness permissions"</string>
 </resources>
diff --git a/apk/res/values-en-rIN/strings.xml b/apk/res/values-en-rIN/strings.xml
index 47bab95..2e95300 100644
--- a/apk/res/values-en-rIN/strings.xml
+++ b/apk/res/values-en-rIN/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Manage the health and fitness data on your device, and control which apps can access it"</string>
     <string name="data_title" msgid="4456619761533380816">"Data and access"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Browse health records"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"View your health records and which apps can access them"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"All categories"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"See all categories"</string>
     <string name="no_data" msgid="1906986019249068659">"No data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Yesterday"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Read: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Write: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Manage permissions"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Time: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activity"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"access your health data"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Read calories burned"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Allows the app to read the calories burned"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Access data in the background"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access data in the background?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access data in the background?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"If you allow, this app can access fitness and wellness data and health records when you\'re not using the app."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"If you allow, this app can access health records when you\'re not using the app."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"If you allow, this app can access fitness and wellness data when you\'re not using the app."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"If you allow, this app can access Health Connect data when you\'re not using the app."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access past data?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"If you allow, this app can access fitness and wellness data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"If you allow, this app can access all past fitness and wellness data."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"If you allow, this app can access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"If you allow, this app can access all past Health Connect data."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Allow additional access for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> also wants to access these Health Connect settings"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Access all data in the background"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Access health records in the background"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Access fitness and wellness data in the background"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Allow this app to access fitness and wellness data and health records when you\'re not using the app"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Access data in the background"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Allow this app to access Health Connect data when you\'re not using the app"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Access past fitness and wellness data"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Allow this app to access data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Allow this app to access all past data"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Access past data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Allow this app to access all past Health Connect data"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> can already access past data for your health records"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Read more about permissions"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Access all data in the background"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Access health records in the background"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Access fitness and wellness data in the background"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Allow this app to access fitness and wellness data and health records when you\'re not using the app"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Allow this app to access this data when you\'re not using the app"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Access data in the background"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Allow this app to access Health Connect data when you\'re not using the app"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Access past fitness and wellness data"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Allow this app to access data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Allow this app to access all past data"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Access past data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Allow this app to access all Health Connect past data"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"No fitness data is currently being read because <xliff:g id="APP_NAME">%1$s</xliff:g> has no read permissions on"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> can already access past data for your health records. To change this, turn off health record permissions for this app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Manage health record permissions"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Enable at least one read permission in order to turn on background or past data access for this app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Enable at least one read permission in order to turn on background access for this app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Enable at least one read permission in order to turn on past data access for this app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Allow this app to access all past Health Connect data"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Allow this app to access Health Connect data when you\'re not using the app"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"If you allow, this app can access Health Connect data when you\'re not using the app."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Access past data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access past data?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Allow this app to access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Allow this app to access all past Health Connect data"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"If you allow, this app can access Health Connect data added before <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"If you allow, this app can access all past Health Connect data."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Active calories burned"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"active calories burned"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Read active calories burned"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"wheelchair pushes"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Read wheelchair pushes"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Write wheelchair pushes"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Activity intensity"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"activity intensity"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Read activity intensity"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Write activity intensity"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basal metabolic rate"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basal metabolic rate"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Read basal metabolic rate"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"skin temperature"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Read skin temperature"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Write skin temperature"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"This includes all the health records synced to and added to Health Connect. This might not be your full medical record and does not include a medical description of your health records."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"All health records"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"all health records"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Write all health records"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergies"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergies"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Read allergies"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunisation"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunisation"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Read immunisation"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratory results"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratory results"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Read laboratory results"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergies"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergies"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Read allergies"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Conditions"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"conditions"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Read conditions"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccines"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccines"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Read vaccines"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Lab results"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"lab results"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Read lab results"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medications"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medications"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Read medications"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personal details"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personal details"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Read personal details"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Practitioner details"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"practitioner details"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Read practitioner details"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Pregnancy"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"pregnancy"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Read pregnancy"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problems"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problems"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Read problems"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedures"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedures"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Read procedures"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Social history"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Social history"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"social history"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Read social history"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vital signs"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visits"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visits"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Read visits"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vital signs"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vital signs"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Read vital signs"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Write mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Allow \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' to read"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Allow \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' to write"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancel"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Allow"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Allow all"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Don\'t allow"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Choose data that you want this app to read or write to Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Choose data that you want this app to read or write to Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Choose data that you want this app to read from Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Choose data that you want this app to write to Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"If you give read access, the app can read new data and data from the past 30 days"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"If you give read access, the app can read new and past data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in the developer\'s <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access fitness and wellness data?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"You can learn how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in their <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privacy policy"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access your health records?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"If you give access, the app can read and write data, such as allergies, lab results, vaccines and more\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"If you give access, the app can read data such as allergies, lab results, vaccines and more\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"About health records"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data to share includes"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"If you allow, <xliff:g id="APP_NAME">%1$s</xliff:g> can share your health records with Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sync your health records from your different apps and sources to keep them in one place"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Remove all permissions?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Remove all"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like location, camera or microphone."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write any data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like location, camera or microphone."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Also delete <xliff:g id="APP_NAME">%1$s</xliff:g> data from Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remove all permissions?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remove all health record permissions?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Remove all fitness and wellness permissions?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Also delete fitness data from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remove all health record permissions?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Also delete health records from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including background data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write this data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remove all permissions?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including background data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> will no longer be able to read or write data from Health Connect, including background and past data.\n\nThis doesn\'t affect other permissions that this app may have, like camera, microphone or location."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Also delete fitness data and health records from <xliff:g id="APP_NAME">%1$s</xliff:g> from Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Removed permissions for this app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Also delete all Health Connect data"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Next day"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Selected day"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Previous day"</string>
     <string name="default_error" msgid="7966868260616403475">"Something went wrong. Please try again."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Unknown resource"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Source data"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Open bracket."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Closed bracket."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Field <xliff:g id="FIELD">%2$s</xliff:g> Value"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"These apps no longer have access, but still have data stored in Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> can read data added after <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"To manage other Android permissions that this app can access, go to Settings &gt; Apps"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data that you share with <xliff:g id="APP_NAME">%1$s</xliff:g> is covered by their privacy policy"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"You can find out how <xliff:g id="APP_NAME">%1$s</xliff:g> handles your data in the developer\'s privacy policy"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"To manage other Android permissions this app can access, go to Settings, then tap Apps"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Read privacy policy"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Accessed in last 24 hours"</string>
     <string name="app_access_title" msgid="7137018424885371763">"App access"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"You currently don\'t have any compatible apps installed"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Additional access"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Past data, background data"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Removed additional permissions for this app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permissions"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness and wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercise, sleep, nutrition and others"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Health records"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"health records"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab results, medications, immunisations and others"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Lab results, medications, vaccines and others"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Removed app permissions"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect removed permissions for <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect removed permissions for <xliff:g id="APP_DATA_0">%1$s</xliff:g> and <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Go to the Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Get started with Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect stores your health and fitness data, giving you a simple way to sync the different apps on your device"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect stores and syncs your health and fitness data from different apps.\n\n"<b>"Fitness and wellness data,"</b>" including exercise sessions, steps, nutrition, sleep and more\n\n"<b>"Health records,"</b>" including vaccines, lab results and more"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"With Health Connect, you can"</string>
     <string name="share_data" msgid="3481932156368883946">"Share data with your apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Choose the data that each app can read or write to Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Manage your settings and privacy"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Light flow"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Medium flow"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Heavy flow"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Unknown flow"</string>
     <string name="period_day" msgid="3821944462093965882">"Period day <xliff:g id="DAY">%1$d</xliff:g> of <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Period (1 day)}other{Period (# days)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positive"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negative"</string>
     <string name="ovulation_high" msgid="205362931427158291">"High"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Music"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Other"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Unguided"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderate"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Vigorous"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integration in progress"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect is being integrated with the Android system.\n\nIt may take some time while your data and permissions are being transferred."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Don\'t close the app until you get a notification that the process is complete."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect integration in progress"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Update needed"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect is being integrated with the Android system so that you can access it directly from your settings."</string>
     <string name="update_button" msgid="4544529019832009496">"Update"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Start this update so that Health Connect can continue integrating with your system settings"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Update now"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"System update needed"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Before continuing, update your phone system."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"If you\'ve already updated your phone system, try restarting your phone to continue the integration"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect update needed"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Before continuing, update the Health Connect app to the latest version."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"More space needed"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect needs <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> of storage space on your phone in order for the integration to continue.\n\nClear some space on your phone and then try again."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Try again"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Free up space"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"More space needed"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect needs <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> of storage space on your phone to continue integrating."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integration paused"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"The Health Connect app closed while it was being integrated with the Android system.\n\nClick resume to reopen the app and continue transferring your data and permissions."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"In order to keep your Health Connect data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tap to continue integrating Health Connect with the Android system. In order to keep your data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tap to continue integrating Health Connect with the Android system."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continue"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Resume Health Connect integration"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"In order to keep your data, complete this within <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"App update needed"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> needs to be updated to continue syncing with Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Some apps need to be updated to continue syncing with Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> needs to be updated to continue syncing with Health Connect. Updates may not be available for all apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Some apps need to be updated to continue syncing with Health Connect. Updates may not be available for all apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Check for updates"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Learn more"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect integration"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect integration didn\'t complete"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"You\'ll get a notification when it becomes available again."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Got it"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect integration didn\'t complete"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Read more"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect integration complete"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Open"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"What\'s new"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"You can now access Health Connect directly from your settings. Uninstall the Health Connect app any time to free up storage space."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Got it"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Edit app sources"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Device default"</string>
     <string name="app_data_title" msgid="6499967982291000837">"App data"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data from apps with access to Health Connect will show here"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data from <xliff:g id="APP_NAME">%1$s</xliff:g> will show here"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data from apps with access to Health Connect will show here"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Day"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Week"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Month"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Last month"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entries"</string>
     <string name="tab_access" msgid="7818197975407243701">"Access"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Allow additional access for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> also wants to access these Health Connect settings"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Enable at least one read permission in order to turn on background or past data access for this app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Enable at least one read permission in order to turn on background access for this app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Enable at least one read permission in order to turn on past data access for this app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Start using Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sync your first apps to share health and fitness data between them"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Set up"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"See compatible apps"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Find more apps to sync with <xliff:g id="APP_NAME">%s</xliff:g> via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"See on app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Set a screen lock"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"For added security for your health data, set a PIN, pattern or password for this device"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Set screen lock"</string>
     <string name="select_all" msgid="837499881590001166">"Select all"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Connected apps will no longer be able to read this data from Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Ticked"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Not ticked"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Exercise map route available"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Next day"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Next week"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Next month"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Previous day"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Previous week"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Previous month"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Permanently delete all data?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Permanently delete selected data?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Permanently delete all <xliff:g id="APP_NAME">%s</xliff:g> data?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Permanently delete selected <xliff:g id="APP_NAME">%1$s</xliff:g> entries for the week of <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Permanently delete selected <xliff:g id="APP_NAME">%1$s</xliff:g> entries for <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Permanently delete this <xliff:g id="APP_NAME">%s</xliff:g> entry?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Permanently delete <xliff:g id="DATA_TYPE">%1$s</xliff:g> data for <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"On"</string>
+    <string name="off" msgid="6996623844428550649">"Off"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Accessed at <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Accessed yesterday <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Accessed <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Allow all the time"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Allow selected"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"While using the app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Deny all"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access fitness and wellness data?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting access to <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nChoose to allow all or control them individually."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> to access <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness and wellness"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"all the time"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"while in use"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"All the time"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"While in use"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> can access all of your fitness and wellness data <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Allowed to access"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Allowed to read"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"These permissions give <xliff:g id="APP_NAME">%1$s</xliff:g> access to data from your device sensors."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps allowed"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"No apps requesting"</string>
+    <string name="allowed" msgid="4158456017482263737">"Allowed"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Not allowed"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps with this permission can access <xliff:g id="DATA_TYPE">%s</xliff:g> data from your device sensors."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Remove <xliff:g id="DATA_TYPE">%s</xliff:g> access for all apps on your watch?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Tick"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Cross mark"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Currently, <xliff:g id="APP_NAME">%1$s</xliff:g> can access fitness and wellness data <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Allow <xliff:g id="APP_NAME">%1$s</xliff:g> access to fitness and wellness data all the time?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> has access to <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Manage fitness and wellness permissions"</string>
 </resources>
diff --git a/apk/res/values-en-rXC/strings.xml b/apk/res/values-en-rXC/strings.xml
index f0c33f7..eb47a9d 100644
--- a/apk/res/values-en-rXC/strings.xml
+++ b/apk/res/values-en-rXC/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎Manage the health and fitness data on your device, and control which apps can access it‎‏‎‎‏‎"</string>
     <string name="data_title" msgid="4456619761533380816">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎Data and access‎‏‎‎‏‎"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎Browse health records‎‏‎‎‏‎"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎View your health records and which apps can access them‎‏‎‎‏‎"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎All categories‎‏‎‎‏‎"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‏‏‎‏‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‎See all categories‎‏‎‎‏‎"</string>
     <string name="no_data" msgid="1906986019249068659">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎No data‎‏‎‎‏‎"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‎Yesterday‎‏‎‎‏‎"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‎‎Read: ‎‏‎‎‏‏‎<xliff:g id="DATA_TYPE">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‎Write: ‎‏‎‎‏‏‎<xliff:g id="DATA_TYPE">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎, ‎‏‎‎‏‎ "</string>
+    <string name="separator" msgid="1299848322898210658">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎, ‎‏‎‎‏‎ "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎Manage permissions‎‏‎‎‏‎"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎‎Time: ‎‏‎‎‏‏‎<xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‎Activity‎‏‎‎‏‎"</string>
@@ -92,6 +93,17 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎access your health data‎‏‎‎‏‎"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‏‎‏‎‎‎Read calories burned‎‏‎‎‏‎"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‏‎‏‎‎Allows the app to read the calories burned‎‏‎‎‏‎"</string>
+    <string name="background_read_medical_title" msgid="378446129450196253">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‏‎Access all data in the background‎‏‎‎‏‎"</string>
+    <string name="background_read_medical_request_title" msgid="5388067032484069722">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‏‎‎Allow ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to access all data in the background?‎‏‎‎‏‎"</string>
+    <string name="background_read_medical_description" msgid="4205144207056391848">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‎Allow this app to access fitness and wellness data and health records data when you\'re not using the app‎‏‎‎‏‎"</string>
+    <string name="background_read_medical_request_description" msgid="6135447220241108032">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎If you allow, this app can access fitness and wellness data and health records data when you\'re not using the app.‎‏‎‎‏‎"</string>
+    <string name="historic_access_medical_title" msgid="1198466488695524014">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‎Access past fitness and wellness data‎‏‎‎‏‎"</string>
+    <string name="historic_access_medical_request_title" msgid="4927886483832141584">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‎‎Allow ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to access past fitness and wellness data?‎‏‎‎‏‎"</string>
+    <string name="historic_access_medical_description" msgid="513689388911992345">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎Allow this app to access data added before ‎‏‎‎‏‏‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="historic_access_medical_description_fallback" msgid="1596909285259037066">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎Allow this app to access all past data‎‏‎‎‏‎"</string>
+    <string name="historic_access_medical_request_description" msgid="6938665708764487963">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎If you allow, this app can access data added before ‎‏‎‎‏‏‎<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
+    <string name="historic_access_medical_request_description_fallback" msgid="1075934237674126677">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎If you allow, this app can access all past data.‎‏‎‎‏‎"</string>
+    <string name="historic_access_medical_warning" msgid="6691110601538756473">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎No fitness data is currently being read because ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ has no read permissions on‎‏‎‎‏‎"</string>
     <string name="background_read_title" msgid="5061383169517186234">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‏‏‏‎‏‎‎Access data in the background‎‏‎‎‏‎"</string>
     <string name="background_read_request_title" msgid="8492898140120977977">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‏‎Allow ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to access data in the background?‎‏‎‎‏‎"</string>
     <string name="background_read_description" msgid="3203594555849969283">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎Allow this app to access Health Connect data when you\'re not using the app‎‏‎‎‏‎"</string>
@@ -270,31 +282,40 @@
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎All health records‎‏‎‎‏‎"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎all health records‎‏‎‎‏‎"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‎Write all health records‎‏‎‎‏‎"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎Allergies‎‏‎‎‏‎"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‎‎‎allergies‎‏‎‎‏‎"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎Read allergies‎‏‎‎‏‎"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‎Immunization‎‏‎‎‏‎"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‎immunization‎‏‎‎‏‎"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎Read immunization‎‏‎‎‏‎"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‎Laboratory Results‎‏‎‎‏‎"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‎‎laboratory results‎‏‎‎‏‎"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎Read laboratory results‎‏‎‎‏‎"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎Allergies‎‏‎‎‏‎"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎allergies‎‏‎‎‏‎"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‎‎‎Read allergies‎‏‎‎‏‎"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‏‎Conditions‎‏‎‎‏‎"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎conditions‎‏‎‎‏‎"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‏‎Read conditions‎‏‎‎‏‎"</string>
+    <string name="immunizations_uppercase_label" msgid="8440461752746256387">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‏‎Vaccines‎‏‎‎‏‎"</string>
+    <string name="immunizations_lowercase_label" msgid="3807025074680621043">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎vaccines‎‏‎‎‏‎"</string>
+    <string name="immunizations_content_description" msgid="2239351886343062194">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎Read vaccines‎‏‎‎‏‎"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎Lab results‎‏‎‎‏‎"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎lab results‎‏‎‎‏‎"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎Read lab results‎‏‎‎‏‎"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎Medications‎‏‎‎‏‎"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎medications‎‏‎‎‏‎"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎Read medications‎‏‎‎‏‎"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎Personal details‎‏‎‎‏‎"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎personal details‎‏‎‎‏‎"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‏‎Read personal details‎‏‎‎‏‎"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‎Practitioner details‎‏‎‎‏‎"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‎practitioner details‎‏‎‎‏‎"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎Read practitioner details‎‏‎‎‏‎"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‎Pregnancy‎‏‎‎‏‎"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎pregnancy‎‏‎‎‏‎"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎Read pregnancy‎‏‎‎‏‎"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎Problems‎‏‎‎‏‎"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‎problems‎‏‎‎‏‎"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‎‎‎‏‎‎Read problems‎‏‎‎‏‎"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‏‎Procedures‎‏‎‎‏‎"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎procedures‎‏‎‎‏‎"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‏‎Read procedures‎‏‎‎‏‎"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎Social History‎‏‎‎‏‎"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎Social history‎‏‎‎‏‎"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎social history‎‏‎‎‏‎"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‎‏‏‏‎‎‏‏‏‎Read social history‎‏‎‎‏‎"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‎‎Vital Signs‎‏‎‎‏‎"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‎Visits‎‏‎‎‏‎"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‏‏‎‏‏‏‎visits‎‏‎‎‏‎"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎Read visits‎‏‎‎‏‎"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎Vital signs‎‏‎‎‏‎"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‎‎‏‎vital signs‎‏‎‎‏‎"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎Read vital signs‎‏‎‎‏‎"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎Mindfulness‎‏‎‎‏‎"</string>
@@ -311,8 +332,14 @@
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‎If you give read access, the app can read new data and data from the past 30 days‎‏‎‎‏‎"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‎‎‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‏‎‏‏‏‎If you give read access, the app can read new and past data‎‏‎‎‏‎"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎Allow ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to access Health Connect?‎‏‎‎‏‎"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎You can learn how ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ handles your data in the developer\'s ‎‏‎‎‏‏‎<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‎You can learn how ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ handles your data in their ‎‏‎‎‏‏‎<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‎privacy policy‎‏‎‎‏‎"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎Allow ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to access your health records?‎‏‎‎‏‎"</string>
+    <string name="medical_request_header_desc" msgid="5721171305631983663">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎If you give access, the app can read and write data such as allergies, lab results, vaccines and more‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎About health records‎‏‎‎‏‎"</string>
+    <string name="medical_request_data_to_share" msgid="2208383833492573960">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎Data to share‎‏‎‎‏‎"</string>
+    <string name="medical_request_share" msgid="6237397362923728514">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎If you allow, ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ can share your health records with Health Connect.‎‏‎‎‏‎"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎Sync your health records from your different apps and sources to keep them in one place‎‏‎‎‏‎"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎Remove all permissions?‎‏‎‎‏‎"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‎‎Remove all‎‏‎‎‏‎"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write any data from Health Connect.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like camera, microphone, or location.‎‏‎‎‏‎"</string>
@@ -320,9 +347,15 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write any data from Health Connect, including past data.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like location, camera, or microphone.‎‏‎‎‏‎"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write any data from Health Connect, including background and past data.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like location, camera, or microphone.‎‏‎‎‏‎"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‎Also delete ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ data from Health Connect‎‏‎‎‏‎"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎Remove all permissions?‎‏‎‎‏‎"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‎‎‎‎Remove all health record permissions?‎‏‎‎‏‎"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎Remove all fitness and wellness permissions?‎‏‎‎‏‎"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‎‎Also delete fitness data from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ from Health Connect‎‏‎‎‏‎"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‎‎‎‎Remove all health record permissions?‎‏‎‎‏‎"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎Also delete health records from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ from Health Connect‎‏‎‎‏‎"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write this data from Health Connect.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like camera, microphone or location.‎‏‎‎‏‎"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write this data from Health Connect, including background data.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like camera, microphone or location.‎‏‎‎‏‎"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write this data from Health Connect, including past data.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like camera, microphone or location.‎‏‎‎‏‎"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write this data from Health Connect, including background and past data.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like camera, microphone or location.‎‏‎‎‏‎"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎Remove all permissions?‎‏‎‎‏‎"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write data from Health Connect.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like camera, microphone or location.‎‏‎‎‏‎"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write data from Health Connect, including background data.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like camera, microphone or location.‎‏‎‎‏‎"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will no longer be able to read or write data from Health Connect, including past data.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This doesn\'t affect other permissions this app may have, like camera, microphone or location.‎‏‎‎‏‎"</string>
@@ -334,6 +367,7 @@
     <string name="navigation_previous_day" msgid="718353386484938584">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‎‎‎Previous day‎‏‎‎‏‎"</string>
     <string name="default_error" msgid="7966868260616403475">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎Something went wrong. Please try again.‎‏‎‎‏‎"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎Unknown Resource‎‏‎‎‏‎"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‎‎‏‏‏‏‎Source data‎‏‎‎‏‎"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="PREFIX">%1$s</xliff:g>‎‏‎‎‏‏‏‎Open bracket.‎‏‎‎‏‎"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="PREFIX">%1$s</xliff:g>‎‏‎‎‏‏‏‎Closed bracket.‎‏‎‎‏‎"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="PREFIX">%1$s</xliff:g>‎‏‎‎‏‏‏‎ Field ‎‏‎‎‏‏‎<xliff:g id="FIELD">%2$s</xliff:g>‎‏‎‎‏‏‏‎ Value‎‏‎‎‏‎"</string>
@@ -368,13 +402,14 @@
     <string name="app_access_title" msgid="7137018424885371763">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‎App access‎‏‎‎‏‎"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎You don\'t currently have any compatible apps installed‎‏‎‎‏‎"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎Additional access‎‏‎‎‏‎"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‏‎Past data, background data‎‏‎‎‏‎"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‎‏‎‎‎Removed additional permissions for this app‎‏‎‎‏‎"</string>
     <string name="permissions_header" msgid="6519976063360071569">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‎Permissions‎‏‎‎‏‎"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎Fitness and wellness‎‏‎‎‏‎"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‎‏‏‎Exercise, sleep, nutrition and others‎‏‎‎‏‎"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎Health records‎‏‎‎‏‎"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎health records‎‏‎‎‏‎"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎Lab results, medications, immunizations and others‎‏‎‎‏‎"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎Lab results, medications, vaccines and others‎‏‎‎‏‎"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‏‏‎‏‎Removed app permissions‎‏‎‎‏‎"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‎‏‏‏‎‏‎‏‏‎Health Connect removed permissions for ‎‏‎‎‏‏‎<xliff:g id="APP_DATA">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎‎Health Connect removed permissions for ‎‏‎‎‏‏‎<xliff:g id="APP_DATA_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ and ‎‏‎‎‏‏‎<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -466,6 +501,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‎Go to the Play Store‎‏‎‎‏‎"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎Get started with Health Connect‎‏‎‎‏‎"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎Health Connect stores your health and fitness data, giving you a simple way to sync the different apps on your device‎‏‎‎‏‎"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‎‎‎Health Connect stores and syncs your health and fitness data from different apps.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<b>"‎‏‎‎‏‏‏‎Fitness and wellness data,‎‏‎‎‏‏‎"</b>"‎‏‎‎‏‏‏‎ including exercise sessions, steps, nutrition, sleep and more‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<b>"‎‏‎‎‏‏‏‎Health records,‎‏‎‎‏‏‎"</b>"‎‏‎‎‏‏‏‎ including vaccines, lab results and more‎‏‎‎‏‎"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎With Health Connect you can‎‏‎‎‏‎"</string>
     <string name="share_data" msgid="3481932156368883946">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎Share data with your apps‎‏‎‎‏‎"</string>
     <string name="share_data_description" msgid="2919871301634375092">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎Choose the data each app can read or write to Health Connect‎‏‎‎‏‎"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‏‎Manage your settings and privacy‎‏‎‎‏‎"</string>
@@ -566,7 +603,9 @@
     <string name="flow_light" msgid="1937543318146228793">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‎‎‏‎Light flow‎‏‎‎‏‎"</string>
     <string name="flow_medium" msgid="3783688724668943154">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‎Medium flow‎‏‎‎‏‎"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎Heavy flow‎‏‎‎‏‎"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎Unknown flow‎‏‎‎‏‎"</string>
     <string name="period_day" msgid="3821944462093965882">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‎Period day ‎‏‎‎‏‏‎<xliff:g id="DAY">%1$d</xliff:g>‎‏‎‎‏‏‏‎ of ‎‏‎‎‏‏‎<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎Period (1 day)‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎Period (# days)‎‏‎‎‏‎}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎‎Positive‎‏‎‎‏‎"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎Negative‎‏‎‎‏‎"</string>
     <string name="ovulation_high" msgid="205362931427158291">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎High‎‏‎‎‏‎"</string>
@@ -1035,7 +1074,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎‎‎‏‎‏‏‎Edit app sources‎‏‎‎‏‎"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‎‎Device default‎‏‎‎‏‎"</string>
     <string name="app_data_title" msgid="6499967982291000837">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‏‎App data‎‏‎‎‏‎"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎Data from apps with access to Health Connect will show here‎‏‎‎‏‎"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‏‏‎Data from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will show here‎‏‎‎‏‎"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎Data from apps with access to Health Connect will show here‎‏‎‎‏‎"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎Day‎‏‎‎‏‎"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‎Week‎‏‎‎‏‎"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎Month‎‏‎‎‏‎"</string>
@@ -1050,6 +1090,8 @@
     <string name="additional_access_combined_footer" msgid="5967785355544362840">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎Enable at least one read permission in order to turn on background or past data access for this app‎‏‎‎‏‎"</string>
     <string name="additional_access_background_footer" msgid="1638739578431818525">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎Enable at least one read permission in order to turn on background access for this app‎‏‎‎‏‎"</string>
     <string name="additional_access_history_footer" msgid="5326814559930548467">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‏‎Enable at least one read permission in order to turn on past data access for this app‎‏‎‎‏‎"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ can already access past data for your health records. To change this, turn off health record permissions for this app‎‏‎‎‏‎"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎Manage health record permissions‎‏‎‎‏‎"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‎‎‎Start using Health Connect‎‏‎‎‏‎"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‎‏‏‎‎Sync your first apps to share health and fitness data between them‎‏‎‎‏‎"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‎Set up‎‏‎‎‏‎"</string>
@@ -1079,4 +1121,5 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎Permanently delete selected ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ entries for the week of ‎‏‎‎‏‏‎<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎Permanently delete selected ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ entries for ‎‏‎‎‏‏‎<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‎‎‎Permanently delete this ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ entry?‎‏‎‎‏‎"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎Permanently delete ‎‏‎‎‏‏‎<xliff:g id="DATA_TYPE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ data for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
 </resources>
diff --git a/apk/res/values-es-feminine/strings.xml b/apk/res/values-es-feminine/strings.xml
new file mode 100644
index 0000000..934f591
--- /dev/null
+++ b/apk/res/values-es-feminine/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright (C) 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sleep_stage_awake" msgid="4526767634444460862">"despierta"</string>
+    <string name="sleep_stage_awake_in_bed" msgid="5533385496857888503">"despierta en la cama"</string>
+</resources>
diff --git a/apk/res/values-es-masculine/strings.xml b/apk/res/values-es-masculine/strings.xml
new file mode 100644
index 0000000..bae2cf9
--- /dev/null
+++ b/apk/res/values-es-masculine/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright (C) 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sleep_stage_awake" msgid="4526767634444460862">"despierto"</string>
+    <string name="sleep_stage_awake_in_bed" msgid="5533385496857888503">"despierto en la cama"</string>
+</resources>
diff --git a/apk/res/values-es-neuter/strings.xml b/apk/res/values-es-neuter/strings.xml
new file mode 100644
index 0000000..06a8a78
--- /dev/null
+++ b/apk/res/values-es-neuter/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright (C) 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sleep_stage_awake" msgid="4526767634444460862">"despierto/a"</string>
+    <string name="sleep_stage_awake_in_bed" msgid="5533385496857888503">"despierto/a en la cama"</string>
+</resources>
diff --git a/apk/res/values-es-rUS/strings.xml b/apk/res/values-es-rUS/strings.xml
index 7f6913d..b54866b 100644
--- a/apk/res/values-es-rUS/strings.xml
+++ b/apk/res/values-es-rUS/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Administra los datos de salud y actividad física en tu dispositivo, y controla las apps que pueden acceder a ellos"</string>
     <string name="data_title" msgid="4456619761533380816">"Datos y acceso"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Explorar registros de salud"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Consulta los registros de salud y las apps que pueden acceder a ellos"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Todas las categorías"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Ver todas las categorías"</string>
     <string name="no_data" msgid="1906986019249068659">"Sin datos"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Ayer"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Leer: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Escribir: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Administrar permisos"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Hora: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Actividad"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"Acceder a tus datos de salud"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Medir calorías quemadas"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Permite que la app lea las calorías quemadas"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Acceso a los datos en segundo plano"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a los datos en segundo plano?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a los datos en segundo plano?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Si lo permites, esta app podrá acceder a los datos de actividad física, bienestar y registros de salud cuando no esté en uso."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Si lo permites, esta app podrá acceder a los registros de salud cuando no esté en uso."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Si lo permites, esta app podrá acceder a los datos de actividad física y bienestar cuando no esté en uso."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Si estás de acuerdo, esta app podrá acceder a los datos de Health Connect cuando no esté en uso."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a datos anteriores?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Si lo permites, esta app podrá acceder a los datos de actividad física y bienestar agregados antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Si lo permites, esta app podrá acceder a todos los datos anteriores de actividad física y bienestar."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Si estás de acuerdo, esta app podrá acceder a los datos de Health Connect que se agregaron antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Si estás de acuerdo, esta app podrá acceder a todos los datos anteriores de Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"¿Quieres permitir el acceso adicional a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> también quiere acceder a estos parámetros de configuración de Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Acceso a todos los datos en segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Acceso a los registros de salud en segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Acceso a los datos de actividad física y bienestar en segundo plano"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Permite que esta app acceda a los datos de actividad física, bienestar y registros de salud cuando no la uses"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Permite que esta app acceda a estos datos cuando no la uses"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Permite que esta app acceda a estos datos cuando no la uses"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Acceso a los datos en segundo plano"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Permite que esta app acceda a los datos de Health Connect cuando la app no está en uso"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Acceso a los datos anteriores de actividad física y bienestar"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Permite que esta app acceda a los datos agregados antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Permite que esta app acceda a todos los datos anteriores"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Acceso a los datos anteriores"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Permite que esta app acceda a los datos de Health Connect agregados antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Permite que esta app acceda a todos los datos anteriores de Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya puede acceder a los datos anteriores de tus registros de salud."</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Obtén más información sobre los permisos"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Acceso a todos los datos en segundo plano"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Acceso a los registros de salud en segundo plano"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Acceso a los datos de actividad física y bienestar en segundo plano"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Permite que esta app acceda a los datos de actividad física, bienestar y registros de salud cuando no la uses"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Permite que esta app acceda a estos datos cuando no la uses"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Permite que esta app acceda a estos datos cuando no la uses"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Acceso a los datos en segundo plano"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Permite que esta app acceda a los datos de Health Connect cuando la app no está en uso"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Acceso a los datos anteriores de actividad física y bienestar"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Permite que esta app acceda a los datos agregados antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Permite que esta app acceda a todos los datos anteriores"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Acceso a los datos anteriores"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Permite que esta app acceda a los datos de Health Connect agregados antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Permite que esta app acceda a todos los datos anteriores de Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"No se están leyendo datos de actividad física porque <xliff:g id="APP_NAME">%1$s</xliff:g> no tiene permisos de lectura activados"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya puede acceder a los datos anteriores de tus registros de salud. Para cambiar esta opción, desactiva los permisos de registro de salud para esta app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Administrar permisos de registro de salud"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Habilita al menos un permiso de lectura para activar el acceso en segundo plano o a datos anteriores para esta app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Habilita al menos un permiso de lectura para activar el acceso en segundo plano para esta app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Habilita al menos un permiso de lectura para activar el acceso de datos anteriores para esta app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Permite que esta app acceda a todos los datos anteriores de Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Permitir que esta app acceda a los datos de Health Connect cuando la app no está en uso"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Si estás de acuerdo, esta app podrá acceder a los datos de Health Connect cuando la app no está en uso."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Acceso a datos anteriores"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a datos antiguos?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Permitir que esta app acceda a los datos de Health Connect agregados antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Permitir que esta app acceda a todos los datos anteriores de Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Si estás de acuerdo, esta app podrá acceder a los datos de Health Connect que se agregaron antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Si estás de acuerdo, esta app podrá acceder a todos los datos anteriores de Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calorías activas quemadas"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"Calorías activas quemadas"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Medir las calorías activas quemadas"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"impulsos en silla de ruedas"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Medir impulsos en silla de ruedas"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Registrar impulsos en silla de ruedas"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensidad de la actividad"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensidad de la actividad"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Medir intensidad de la actividad"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Escribir intensidad de la actividad"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Tasa metabólica basal"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"tasa metabólica basal"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Medir tasa metabólica basal"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura cutánea"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Lee la temperatura cutánea"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Escribe la temperatura cutánea"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Esto incluye todos los registros de salud que se sincronizaron y agregaron a Health Connect. Es posible que no se trate de tu historial médico completo y no incluya una descripción médica de tus registros de salud."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Todos los registros de salud"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"todos los registros de salud"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Escribir todos los registros de salud"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergias"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergias"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Leer alergias"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Vacunación"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"vacunación"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Leer la vacunación"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Resultados de laboratorio"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"resultados de laboratorio"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Leer resultados de laboratorio"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergias"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergias"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Leer alergias"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Condiciones"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"condiciones"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Leer condiciones"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vacunas"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vacunas"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Leer vacunas"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Resultados de laboratorio"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"resultados de laboratorio"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Leer resultados de laboratorio"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medicamentos"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medicamentos"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Leer medicamentos"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Detalles personales"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"detalles personales"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Leer detalles personales"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Detalles del profesional"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"detalles del profesional"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Leer los detalles de profesionales"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Embarazo"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"embarazo"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Leer embarazo"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemas"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemas"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Leer problemas"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedimientos"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedimientos"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Leer procedimientos"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historia social"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historia social"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historia social"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Leer historia social"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Signos vitales"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visitas"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visitas"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Leer visitas"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Signos vitales"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"signos vitales"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Leer signos vitales"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Escribir sesión de mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Permite que \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" tenga permiso de lectura"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Permitir que \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" tenga acceso de escritura"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancelar"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Permitir"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Permitir todo"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"No permitir"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Elige los datos que quieres que esta app lea o escriba en Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Elige los datos que quieres que esta app lea o escriba en Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Elige los datos que quieres que esta app lea de Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Elige los datos que quieres que esta app escriba en Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Si otorgas acceso de lectura, la app podrá leer los datos nuevos y los de los últimos 30 días"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Si otorgas acceso de lectura, la app podrá leer datos nuevos y antiguos"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Consulta la <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> del desarrollador para obtener más información sobre el modo en que <xliff:g id="APP_NAME">%1$s</xliff:g> maneja tus datos"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a datos antiguos de actividad física y bienestar?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Consulta cómo <xliff:g id="APP_NAME">%1$s</xliff:g> administra tus datos en su <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"política de privacidad"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a tus registros de salud?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Si otorgas acceso, la app podrá leer y escribir datos como alergias, resultados de laboratorio, vacunas y más\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Si otorgas acceso, la app podrá leer datos como alergias, resultados de laboratorio, vacunas y más\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Información sobre los registros de salud"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Los datos para compartir incluyen"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Si lo permites, <xliff:g id="APP_NAME">%1$s</xliff:g> podrá compartir tus registros de salud con Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sincroniza los registros de salud de diferentes apps y fuentes para tenerlos en un solo lugar"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"¿Quieres quitar todos los permisos?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Quitar todo"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Health Connect.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Health Connect, incluidos los datos anteriores.\n\nEsto no afecta otros permisos que la app pueda tener, como la ubicación, la cámara o el micrófono."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Health Connect, incluidos los datos anteriores y en segundo plano.\n\nEsto no afecta otros permisos que la app pueda tener, como la ubicación, la cámara o el micrófono."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"También borrar los datos de <xliff:g id="APP_NAME">%1$s</xliff:g> de Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"¿Quieres quitar todos los permisos?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"¿Quieres quitar todos los permisos de registro de salud?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"¿Quieres quitar todos los permisos de salud y bienestar?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"También borrar los datos de actividad física de <xliff:g id="APP_NAME">%1$s</xliff:g> de Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"¿Quieres quitar todos los permisos de registro de salud?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"También borrar los registros de salud de <xliff:g id="APP_NAME">%1$s</xliff:g> de Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir estos datos de Health Connect.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir estos datos de Health Connect, incluidos los datos en segundo plano.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir estos datos de Health Connect, incluidos los datos anteriores.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir estos datos de Health Connect, incluidos los datos anteriores y en segundo plano.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"¿Quieres quitar todos los permisos?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Health Connect.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Health Connect, incluidos los datos en segundo plano.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Health Connect, incluidos los datos anteriores.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Health Connect, incluidos los datos anteriores y en segundo plano.\n\nEsto no afecta otros permisos que la app pueda tener, como la cámara, el micrófono o la ubicación."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"También borrar los datos de actividad física y los registros de salud de <xliff:g id="APP_NAME">%1$s</xliff:g> de Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Se quitaron los permisos para esta app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"También borrar todos los datos de Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Día siguiente"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Día seleccionado"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Día anterior"</string>
     <string name="default_error" msgid="7966868260616403475">"Se produjo un error. Vuelve a intentarlo."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Recurso desconocido"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Datos del código fuente"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Corchete de apertura."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Corchete de cierre."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Campo <xliff:g id="FIELD">%2$s</xliff:g> Valor"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Estas apps ya no tienen acceso, pero todavía tienen datos almacenados en Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> puede leer datos agregados después del <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Para administrar otros permisos de Android a los que esta app puede acceder, ve a Configuración &gt; Apps"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Los datos que compartas con <xliff:g id="APP_NAME">%1$s</xliff:g> están sujetos a la política de privacidad de esa app"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Consulta cómo <xliff:g id="APP_NAME">%1$s</xliff:g> maneja tus datos en la política de privacidad del desarrollador"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Para administrar otros permisos de Android a los que esta app puede acceder, ve a Configuración y, luego, presiona Apps"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Leer la política de privacidad"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Se accedió en las últimas 24 horas"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Acceso de la app"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Actualmente, no tienes ninguna app compatible instalada"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Acceso adicional"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Datos anteriores, datos en segundo plano"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Se quitaron los permisos adicionales para esta app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permisos"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Actividad física y bienestar"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Ejercicio, sueño, nutrición y más"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Registros de salud"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"registros de salud"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Resultados de análisis, medicamentos, vacunas y más"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Resultados de laboratorio, medicamentos, vacunas y mucho más"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Apps a las que se les quitaron permisos"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect le quitó permisos a <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect les quitó permisos a <xliff:g id="APP_DATA_0">%1$s</xliff:g> y <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Ir a Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Empieza a usar Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect almacena tus datos de salud y actividad física, lo que te brinda una manera simple de sincronizar las diferentes apps en tu dispositivo"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect almacena y sincroniza tus datos de salud y actividad física de diferentes apps.\n\n"<b>"Datos de actividad física y bienestar,"</b>" incluidos los de sesiones de ejercicio, pasos, nutrición, sueño y mucho más\n\n"<b>"Registros de salud,"</b>" incluidos los de vacunas, resultados de laboratorio y mucho más"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Con Health Connect, puedes hacer lo siguiente:"</string>
     <string name="share_data" msgid="3481932156368883946">"Compartir datos con tus apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Elige los datos que cada app puede leer o escribir con Health Connect."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Administra tu configuración y tu privacidad"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Flujo leve"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Flujo moderado"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Flujo abundante"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Flujo desconocido"</string>
     <string name="period_day" msgid="3821944462093965882">"Día <xliff:g id="DAY">%1$d</xliff:g> de <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> del período"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Período (1 día)}other{Período (# días)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiva"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativa"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Alta"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Música"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Otro"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Sin guía"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderada"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Vigorosa"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integración en curso"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect se está integrando al sistema Android.\n\nEl proceso puede demorar unos minutos mientras se transfieren tus datos y permisos."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"No cierres la app hasta que recibas una notificación que te indique que se completó el proceso."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integración con Health Connect en curso"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Debes actualizar la app"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect se está integrando al sistema Android para que puedas acceder directamente desde la configuración."</string>
     <string name="update_button" msgid="4544529019832009496">"Actualizar"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Inicia esta actualización para que Health Connect pueda continuar integrándose con la configuración del sistema"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Actualizar ahora"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Actualización del sistema necesaria"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Antes de continuar, actualiza el sistema de tu teléfono."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Si ya actualizaste el sistema del teléfono, intenta reiniciarlo para continuar con la integración"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Debes actualizar Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Antes de continuar, actualiza la app de Health Connect a su última versión."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Necesitas más espacio"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect necesita <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espacio de almacenamiento en tu teléfono para continuar con la integración.\n\nLibera espacio en el teléfono y vuelve a intentar."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Reintentar"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Liberar espacio"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Necesitas más espacio"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect necesita <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espacio de almacenamiento en tu teléfono para continuar con la integración."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Se pausó la integración"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"La app de Health Connect se cerró durante la integración con el sistema Android.\n\nHaz clic en Reanudar para abrir nuevamente la app y continuar con la transferencia de datos y permisos."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Para preservar los datos de Health Connect, completa este proceso en un plazo de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Presiona para continuar integrando Health Connect con el sistema Android. Para preservar tus datos, completa el proceso en un plazo de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Presiona para continuar integrando Health Connect con el sistema Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continuar"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Reanuda la integración con Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Para preservar tus datos, completa el proceso en un plazo de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Se debe actualizar la app"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> debe actualizarse para seguir sincronizándose con Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Algunas apps deben actualizarse para seguir sincronizándose con Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> debe actualizarse para seguir sincronizándose con Health Connect Es posible que no haya actualizaciones disponibles para todas las apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Algunas apps deben actualizarse para seguir sincronizándose con Health Connect. Es posible que no haya actualizaciones disponibles para todas las apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Comprueba si hay actualizaciones"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Más información"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integración con Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"La integración con Health Connect no se completó"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Recibirás una notificación cuando vuelva a estar disponible."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Entendido"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"La integración con Health Connect no se completó"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Leer más"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Se completó la integración con Health Connect"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Abrir"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novedades"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Ya puedes acceder a Health Connect directamente desde la configuración. Desinstala la app de Health Connect en cualquier momento para liberar espacio de almacenamiento."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Entendido"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Editar fuentes de app"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Opción predeterminada del dispositivo"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Datos de app"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Aquí se mostrará la información de apps con acceso a Health Connect"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Aquí se mostrarán datos de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Aquí se mostrará la información de apps con acceso a Health Connect"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Día"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Semana"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mes"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"El mes pasado"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entradas"</string>
     <string name="tab_access" msgid="7818197975407243701">"Acceso"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"¿Permitir acceso adicional en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> también quiere acceder a estos parámetros de configuración de Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Habilita al menos un permiso de lectura para activar el acceso en segundo plano o a datos anteriores para esta app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Habilita al menos un permiso de lectura para activar el acceso en segundo plano para esta app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Habilita al menos un permiso de lectura para activar el acceso de datos anteriores para esta app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Comienza a usar Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sincroniza las primeras apps para compartir datos de salud y fitness entre ellas"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configurar"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Consulta las apps compatibles"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Busca más apps para sincronizar con <xliff:g id="APP_NAME">%s</xliff:g> a través de Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Ver en la tienda de aplicaciones"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Establece un bloqueo de pantalla"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Para proteger mejor tus datos de salud, establece un PIN, un patrón o una contraseña para este dispositivo"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Configurar bloqueo de pantalla"</string>
     <string name="select_all" msgid="837499881590001166">"Seleccionar todo"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Las apps conectadas ya no podrán leer estos datos de Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Marcado"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Sin marcar"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Ruta de mapa de ejercicio disponible"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Día siguiente"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Semana siguiente"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mes siguiente"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Día anterior"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Semana anterior"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mes anterior"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"¿Quieres borrar de forma permanente todos los datos?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"¿Quieres borrar de forma permanente los datos seleccionados?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"¿Quieres borrar de forma permanente todos los datos de <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"¿Quieres borrar de forma permanente las entradas seleccionadas de <xliff:g id="APP_NAME">%1$s</xliff:g> de la semana del <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"¿Quieres borrar de forma permanente las entradas seleccionadas de <xliff:g id="APP_NAME">%1$s</xliff:g> del <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"¿Quieres borrar de forma permanente esta entrada de <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"¿Quieres borrar de forma permanente los datos de <xliff:g id="DATA_TYPE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Activado"</string>
+    <string name="off" msgid="6996623844428550649">"Desactivado"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Último acceso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Último acceso: ayer a la(s) <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Último acceso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> a la(s) <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Permitir todo el tiempo"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Permitir selección"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Mientras la app está en uso"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Rechazar todos"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a datos antiguos de actividad física y bienestar?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicitó acceso a <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nElige permitir el control total o individual de los datos."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Actividad física y bienestar"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"todo el tiempo"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"mientras está en uso"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Todo el tiempo"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Mientras está en uso"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> puede acceder a todos tus datos de actividad física y bienestar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Se permite el acceso"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Permisos de lectura"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Estos permisos le otorgan a <xliff:g id="APP_NAME">%1$s</xliff:g> acceso a los datos de los sensores de tu dispositivo."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Apps con permiso: <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"No hay apps que soliciten"</string>
+    <string name="allowed" msgid="4158456017482263737">"Permitido"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"No se permite"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Las apps que tienen este permiso pueden acceder a los datos de <xliff:g id="DATA_TYPE">%s</xliff:g> de los sensores de tu dispositivo."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"¿Quieres quitar el acceso a <xliff:g id="DATA_TYPE">%s</xliff:g> para todas las apps de tu reloj?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Marca de verificación"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Marca de tachado"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Actualmente, <xliff:g id="APP_NAME">%1$s</xliff:g> puede acceder a los datos de actividad física y bienestar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"¿Quieres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a los datos de actividad física y bienestar todo el tiempo?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> tiene acceso a <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Administrar permisos de salud y bienestar"</string>
 </resources>
diff --git a/apk/res/values-es/strings.xml b/apk/res/values-es/strings.xml
index 747d5fe..83cdbee 100644
--- a/apk/res/values-es/strings.xml
+++ b/apk/res/values-es/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Gestiona los datos de salud y actividad física en tu dispositivo y controla qué aplicaciones pueden acceder a ellos"</string>
     <string name="data_title" msgid="4456619761533380816">"Datos y acceso"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Consultar registros de salud"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Consulta tus registros de salud y qué aplicaciones pueden acceder a ellos"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Todas las categorías"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Ver todas las categorías"</string>
     <string name="no_data" msgid="1906986019249068659">"No hay datos"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Ayer"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Leer: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Escribir: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Gestionar permisos"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Hora: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Actividad"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"acceder a tus datos de salud"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Leer calorías quemadas"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Permite que la aplicación lea las calorías quemadas"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Acceder a datos en segundo plano"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a los datos en segundo plano?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a los datos en segundo plano?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Si lo permites, esta aplicación podrá acceder a los datos de actividad física y bienestar, así como a los datos de los registros de salud, cuando no estés usándola."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Si lo permites, esta aplicación podrá acceder a los registros de salud cuando no estés usándola."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Si lo permites, esta aplicación podrá acceder a los datos de actividad física y bienestar cuando no estés usándola."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Si lo permites, esta aplicación podrá acceder a los datos de Salud conectada cuando no estés usándola."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a datos anteriores?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Si lo permites, esta aplicación podrá acceder a los datos de actividad física y bienestar añadidos antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Si lo permites, esta aplicación podrá acceder a todos los datos anteriores de actividad física y bienestar."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Si lo permites, esta aplicación podrá acceder a los datos de Salud conectada añadidos antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Si lo permites, esta aplicación podrá acceder a todos los datos anteriores de Salud conectada."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"¿Permitir acceso adicional a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> también quiere acceder a estos ajustes de Salud conectada"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Acceder a todos los datos en segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Acceder a los registros de salud en segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Acceder a los datos de actividad física y bienestar en segundo plano"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Permite que esta aplicación acceda a los datos de actividad física y bienestar, así como a los registros de salud, cuando no estés usándola"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Permite que esta aplicación acceda a estos datos cuando no estés usándola"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Permite que esta aplicación acceda a estos datos cuando no estés usándola"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Acceder a datos en segundo plano"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Permite que esta aplicación acceda a los datos de Salud conectada cuando no estés usándola"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Acceder a datos anteriores de actividad física y bienestar"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Permite que esta aplicación acceda a los datos añadidos antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Permite que esta aplicación acceda a todos los datos anteriores"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Acceder a datos anteriores"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Permite que esta aplicación acceda a los datos de Salud conectada añadidos antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Permite que esta aplicación acceda a todos los datos anteriores de Salud conectada"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya puede acceder a los datos anteriores de tus registros de salud"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Más información sobre los permisos"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Acceder a todos los datos en segundo plano"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Acceder a los registros de salud en segundo plano"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Acceder a los datos de actividad física y bienestar en segundo plano"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Permite que esta aplicación acceda a los datos de actividad física y bienestar, así como a los registros de salud, cuando no estés usándola"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Permite que esta aplicación acceda a estos datos cuando no estés usándola"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Permite que esta aplicación acceda a estos datos cuando no estés usándola"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Acceder a datos en segundo plano"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Permite que esta aplicación acceda a los datos de Salud conectada cuando no estés usándola"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Acceder a datos anteriores de actividad física y bienestar"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Permite que esta aplicación acceda a los datos añadidos antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Permite que esta aplicación acceda a todos los datos anteriores"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Acceder a datos anteriores"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Permite que esta aplicación acceda a los datos de Salud conectada añadidos antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Permite que esta aplicación acceda a todos los datos anteriores de Salud conectada"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"No se están leyendo datos de actividad física porque <xliff:g id="APP_NAME">%1$s</xliff:g> no tiene activados los permisos de lectura"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya puede acceder a los datos anteriores de tus registros médicos. Para cambiarlo, desactiva los permisos de registros de salud de esta aplicación."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Gestionar permisos de registros de salud"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Habilita al menos un permiso de lectura para activar el acceso en segundo plano o el acceso a datos anteriores de esta aplicación"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Habilita al menos un permiso de lectura para activar el acceso en segundo plano de esta aplicación"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Habilita al menos un permiso de lectura para activar el acceso a datos anteriores de esta aplicación"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Permite que esta aplicación acceda a todos los datos anteriores de Salud conectada"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Permite que esta aplicación acceda a los datos de Salud conectada cuando no estés usándola"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Si lo permites, esta aplicación podrá acceder a los datos de Salud conectada cuando no estés usándola."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Acceder a datos anteriores"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a datos anteriores?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Permitir que esta aplicación acceda a los datos de Salud conectada añadidos antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Permite que esta aplicación acceda a todos los datos anteriores de Salud conectada"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Si lo permites, esta aplicación podrá acceder a los datos de Salud conectada añadidos antes del <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Si lo permites, esta aplicación podrá acceder a todos los datos anteriores de Salud conectada."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calorías quemadas en actividad"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"calorías quemadas en actividad"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Leer calorías quemadas en actividad"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"impulsos en silla de ruedas"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Leer impulsos en silla de ruedas"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Escribir impulsos en silla de ruedas"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensidad de la actividad"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensidad de la actividad"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Leer intensidad de la actividad"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Escribir intensidad de la actividad"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Tasa metabólica basal"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"tasa metabólica basal"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Leer tasa metabólica basal"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura cutánea"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Leer la temperatura cutánea"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Escribir la temperatura cutánea"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Esto incluye todos los registros de salud sincronizados y añadidos a Salud conectada. Puede que no sea tu historial médico completo y no incluye ninguna descripción médica de tus registros de salud."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Todos los registros de salud"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"todos los registros de salud"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Escribir todos los registros de salud"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergias"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergias"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Leer alergias"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Inmunización"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"inmunización"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Leer inmunización"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Resultados de laboratorio"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"resultados de laboratorio"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Leer resultados de laboratorio"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergias"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergias"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Leer alergias"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Problemas de salud"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"problemas de salud"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Leer problemas de salud"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vacunas"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vacunas"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Leer vacunas"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Resultados de analíticas"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"resultados de analíticas"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Leer resultados de analíticas"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medicamentos"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medicamentos"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Leer medicamentos"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Información personal"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"Información personal"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Leer información personal"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Información del profesional médico"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"información del profesional médico"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Leer información del profesional médico"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Embarazo"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"embarazo"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Leer embarazo"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemas"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemas"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Leer problemas"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedimientos"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedimientos"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Leer procedimientos"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historial social"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historial social"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historial social"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Leer historial social"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Constantes vitales"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"citas médicas"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"citas médicas"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Leer citas médicas"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Constantes vitales"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"constantes vitales"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Leer constantes vitales"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Escribir mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> lea"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> escriba"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancelar"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Permitir"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Permitir todos"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"No permitir"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Selecciona los datos que quieres que esta aplicación lea o escriba en Salud conectada"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Selecciona los datos que quieres que esta aplicación lea o escriba en Salud conectada"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Selecciona los datos que quieres que esta aplicación lea en Salud conectada"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Selecciona los datos que quieres que esta aplicación escriba en Salud conectada"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Si le das acceso de lectura, la aplicación podrá leer los datos nuevos y los de los últimos 30 días"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Si le das acceso de lectura, la aplicación podrá leer los datos nuevos y anteriores"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a Salud conectada?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Puedes consultar cómo gestiona tus datos <xliff:g id="APP_NAME">%1$s</xliff:g> en la <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> del desarrollador"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a los datos de actividad física y bienestar?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Puedes consultar cómo <xliff:g id="APP_NAME">%1$s</xliff:g> gestiona tus datos en su <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"política de privacidad"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a tus registros de salud?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Si le das acceso, la aplicación podrá leer y escribir datos como alergias, resultados de analíticas, vacunas y más\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Si le das acceso, la aplicación podrá leer datos como alergias, resultados de analíticas, vacunas y más\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Acerca de los registros de salud"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Los datos que se compartirán incluyen"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Si lo permites, <xliff:g id="APP_NAME">%1$s</xliff:g> podrá compartir tus registros de salud con Salud conectada."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sincroniza tus registros de salud de las diferentes aplicaciones y fuentes para tenerlos en un mismo lugar"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"¿Quitar todos los permisos?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Quitar todos"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Salud conectada.\n\nEsta acción no afecta a otros permisos de la aplicación, como los de la cámara, el micrófono o la ubicación."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Salud conectada, incluidos los datos anteriores.\n\nEsta acción no afecta a otros permisos que la aplicación pueda tener, como los de ubicación, cámara o micrófono."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Salud conectada, incluidos los datos anteriores y los datos en segundo plano.\n\nEsta acción no afecta a otros permisos que la aplicación pueda tener, como los de ubicación, cámara o micrófono."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Eliminar también los datos de <xliff:g id="APP_NAME">%1$s</xliff:g> de Salud conectada"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"¿Quitar todos los permisos?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"¿Quitar todos los permisos de registros de salud?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"¿Quitar todos los permisos de actividad física y bienestar?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Eliminar también los datos de actividad física de <xliff:g id="APP_NAME">%1$s</xliff:g> de Salud conectada"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"¿Quitar todos los permisos de registros de salud?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Eliminar también los registros de salud de <xliff:g id="APP_NAME">%1$s</xliff:g> de Salud conectada"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir estos datos de Salud conectada.\n\nEsta acción no afecta a otros permisos de la aplicación, como los de cámara, micrófono o ubicación."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir estos datos de Salud conectada, incluidos los datos en segundo plano.\n\nEsta acción no afecta a otros permisos que la aplicación pueda tener, como los de cámara, micrófono o ubicación."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir estos datos de Salud conectada, incluidos los datos anteriores.\n\nEsta acción no afecta a otros permisos que la aplicación pueda tener, como los de cámara, micrófono o ubicación."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir estos datos de Salud conectada, incluidos los datos anteriores y los datos en segundo plano.\n\nEsta acción no afecta a otros permisos que la aplicación pueda tener, como los de cámara, micrófono o ubicación."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"¿Quitar todos los permisos?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Salud conectada.\n\nEsta acción no afecta a otros permisos de la aplicación, como los de cámara, micrófono o ubicación."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Salud conectada, incluidos los datos en segundo plano.\n\nEsta acción no afecta a otros permisos que la aplicación pueda tener, como los de cámara, micrófono o ubicación."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Salud conectada, incluidos los datos anteriores.\n\nEsta acción no afecta a otros permisos que la aplicación pueda tener, como los de cámara, micrófono o ubicación."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ya no podrá leer ni escribir datos de Salud conectada, incluidos los datos anteriores y los datos en segundo plano.\n\nEsta acción no afecta a otros permisos que la aplicación pueda tener, como los de cámara, micrófono o ubicación."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Eliminar también los datos de actividad física y los registros de salud de <xliff:g id="APP_NAME">%1$s</xliff:g> de Salud conectada"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Se han quitado los permisos para esta aplicación"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Eliminar también todos los datos de Salud conectada"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Día siguiente"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Día seleccionado"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Día anterior"</string>
     <string name="default_error" msgid="7966868260616403475">"Se ha producido un error. Inténtalo de nuevo."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Recurso desconocido"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Datos de fuente"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Llave de apertura."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Llave de cierre."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Valor de campo <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Estas aplicaciones ya no tienen acceso, pero siguen teniendo datos almacenados en Salud conectada"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> puede leer los datos añadidos después del <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Para gestionar otros permisos de Android a los que puede acceder esta aplicación, ve a Ajustes &gt; Aplicaciones"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Los datos que compartes con <xliff:g id="APP_NAME">%1$s</xliff:g> están sujetos a su política de privacidad"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Consulta cómo <xliff:g id="APP_NAME">%1$s</xliff:g> gestiona tus datos en la política de privacidad del desarrollador"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Para gestionar otros permisos de Android a los que puede acceder esta aplicación, ve a Ajustes y, después, toca Aplicaciones"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Leer política de privacidad"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Acceso realizado en las últimas 24 horas"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Acceso de la aplicación"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Por ahora no tienes instalada ninguna aplicación compatible"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Acceso adicional"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Datos anteriores y datos en 2.º plano"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Se han quitado los permisos adicionales para esta aplicación"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permisos"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Actividad física y bienestar"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Ejercicio, sueño, nutrición y otros"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Registros de salud"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"registros de salud"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Pruebas, medicamentos, vacunas y otros"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Analíticas, medicamentos, vacunas y otros"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Permisos de aplicaciones quitados"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Salud conectada ha quitado los permisos de <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Salud conectada ha quitado los permisos de <xliff:g id="APP_DATA_0">%1$s</xliff:g> y <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Ir a Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Empezar a usar Salud conectada"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Salud conectada almacena tus datos de salud y actividad física, y te ofrece una forma sencilla de sincronizar las diferentes aplicaciones de tu dispositivo"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Salud conectada almacena y sincroniza tus datos de salud y actividad física de diferentes aplicaciones.\n\n"<b>"Datos de actividad física y bienestar,"</b>" como sesiones de ejercicio, pasos, nutrición y sueño \n\n"<b>"Registros de salud,"</b>" como vacunas y resultados de analíticas"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Con Salud conectada, puedes hacer lo siguiente:"</string>
     <string name="share_data" msgid="3481932156368883946">"Comparte datos con tus aplicaciones"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Elige los datos que cada aplicación puede leer o escribir en Salud conectada"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Gestiona tu configuración y privacidad"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Sangrado leve"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Sangrado normal"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Sangrado abundante"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Flujo desconocido"</string>
     <string name="period_day" msgid="3821944462093965882">"Día <xliff:g id="DAY">%1$d</xliff:g> de <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> del periodo menstrual"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruación (1 día)}other{Menstruación (# días)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiva"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativa"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Alta"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Música"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Otro"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"No guiada"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderada"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intensa"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integración en curso"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Salud conectada se está integrando con el sistema Android.\n\nLa transferencia de tus datos y permisos puede tardar un poco."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"No cierres la aplicación hasta que recibas una notificación que indique que se ha completado el proceso."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integración de Salud conectada en curso"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Es necesario actualizar"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Salud conectada se está integrando con el sistema Android para que puedas acceder a ella directamente desde tus ajustes."</string>
     <string name="update_button" msgid="4544529019832009496">"Actualizar"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Inicia esta actualización para que Salud conectada pueda seguir integrándose con los ajustes del sistema"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Actualizar ahora"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Es necesario actualizar el sistema"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Antes de continuar, actualiza el sistema de tu teléfono."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Si ya has actualizado el sistema del teléfono, prueba a reiniciar el teléfono para continuar con la integración"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Es necesario actualizar Salud conectada"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Antes de continuar, actualiza la aplicación Salud conectada a la versión más reciente."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Se necesita más espacio"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Salud conectada necesita <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espacio de almacenamiento en el teléfono para continuar con la integración.\n\nLibera algo de espacio en tu teléfono e inténtalo de nuevo."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Reintentar"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Liberar espacio"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Se necesita más espacio"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Salud conectada necesita <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espacio de almacenamiento en el teléfono para continuar con la integración."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integración pausada"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"La aplicación Salud conectada se ha cerrado mientras se estaba integrando con el sistema Android.\n\nHaz clic en Reanudar para volver a abrir la aplicación y seguir transfiriendo tus datos y permisos."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Si quieres conservar tus datos de Salud conectada, completa la integración en <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Toca para continuar integrando Salud conectada con el sistema Android. Para conservar tus datos, completa esta acción en <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Toca para continuar integrando Salud conectada con el sistema Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continuar"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Reanuda la integración de Salud conectada"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Para conservar tus datos, completa esta acción en <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Es necesario actualizar aplicaciones"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> debe actualizarse para seguir sincronizándose con Salud conectada"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Algunas aplicaciones deben actualizarse para seguir sincronizándose con Salud conectada"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> debe actualizarse para seguir sincronizándose con Salud conectada Puede que las actualizaciones no estén disponibles para todas las aplicaciones."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Algunas aplicaciones deben actualizarse para seguir sincronizándose con Salud conectada. Puede que las actualizaciones no estén disponibles para todas las aplicaciones."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Buscar actualizaciones"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Más información"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integración con Salud conectada"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"No se ha completado la integración con Salud conectada"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Recibirás una notificación cuando vuelva a estar disponible."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Entendido"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"No se ha completado la integración con Salud conectada"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Más información"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integración de Salud conectada completada"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Abrir"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novedades"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Ya puedes acceder a Salud conectada directamente desde los ajustes. Desinstala la aplicación Salud conectada cuando quieras para liberar espacio de almacenamiento."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Entendido"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Editar fuentes de la aplicación"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Predeterminado por el dispositivo"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Datos de aplicaciones"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Los datos de las aplicaciones con acceso a Salud conectada se mostrarán aquí"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Los datos de <xliff:g id="APP_NAME">%1$s</xliff:g> se mostrarán aquí"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Los datos de las aplicaciones con acceso a Salud conectada se mostrarán aquí"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Día"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Semana"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mes"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Mes pasado"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entradas"</string>
     <string name="tab_access" msgid="7818197975407243701">"Acceso"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"¿Permitir acceso adicional a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> también quiere acceder a estos ajustes de Salud conectada"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Habilita al menos un permiso de lectura para activar el acceso en segundo plano o el acceso a datos anteriores de esta aplicación"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Habilita al menos un permiso de lectura para activar el acceso en segundo plano de esta aplicación"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Habilita al menos un permiso de lectura para activar el acceso a datos anteriores de esta aplicación"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Empieza a usar Salud conectada"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sincroniza tus primeras aplicaciones para que compartan datos de salud y actividad física entre ellas"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configurar"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Ver aplicaciones compatibles"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Encuentra más aplicaciones para sincronizarlas con <xliff:g id="APP_NAME">%s</xliff:g> a través de Salud conectada"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Ver en la tienda de aplicaciones"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Establece un bloqueo de pantalla"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Para añadir una capa de seguridad a tus datos de salud, configura un PIN, patrón o contraseña en este dispositivo"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Establecer bloqueo de pantalla"</string>
     <string name="select_all" msgid="837499881590001166">"Seleccionar todo"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Las aplicaciones conectadas ya no podrán leer estos datos de Salud conectada"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Marcada"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Sin marcar"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Mapa de ruta de ejercicio disponible"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Día siguiente"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Semana siguiente"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mes siguiente"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Día anterior"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Semana anterior"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mes anterior"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"¿Eliminar permanentemente todos los datos?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"¿Eliminar permanentemente los datos seleccionados?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"¿Eliminar permanentemente todos los datos de <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"¿Eliminar permanentemente las entradas seleccionadas de <xliff:g id="APP_NAME">%1$s</xliff:g> de la semana del <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"¿Eliminar permanentemente las entradas seleccionadas de <xliff:g id="APP_NAME">%1$s</xliff:g> de <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"¿Eliminar permanentemente esta entrada de <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"¿Eliminar permanentemente los datos de <xliff:g id="DATA_TYPE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Activado"</string>
+    <string name="off" msgid="6996623844428550649">"Desactivado"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Último acceso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Último acceso: ayer, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Último acceso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Permitir siempre"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Permitir seleccionados"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Mientras se usa la aplicación"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Rechazar todos"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a los datos de actividad física y bienestar?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ha solicitado acceso a <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nElige si quieres dar todos los permisos o controlarlos individualmente."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Actividad física y bienestar"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"todo el tiempo"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"mientras se usa"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Todo el tiempo"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Mientras se usa"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> puede acceder a todos tus datos de actividad física y bienestar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Con permiso de acceso"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Con permiso de lectura"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Estos permisos dan a <xliff:g id="APP_NAME">%1$s</xliff:g> acceso a los datos de los sensores de tu dispositivo."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> aplicaciones permitidas"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"No hay aplicaciones que lo soliciten"</string>
+    <string name="allowed" msgid="4158456017482263737">"Permitida"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"No permitida"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Las aplicaciones con este permiso pueden acceder a los datos de <xliff:g id="DATA_TYPE">%s</xliff:g> de los sensores de tu dispositivo."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"¿Quitar el acceso a <xliff:g id="DATA_TYPE">%s</xliff:g> de todas las aplicaciones de tu reloj?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Marca de verificación"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Marca de cierre"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Actualmente, <xliff:g id="APP_NAME">%1$s</xliff:g> puede acceder a los datos de actividad física y bienestar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"¿Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a los datos de actividad física y bienestar siempre?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> tiene acceso a <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Gestionar permisos de actividad física y bienestar"</string>
 </resources>
diff --git a/apk/res/values-et/strings.xml b/apk/res/values-et/strings.xml
index bd09046..4ea977a 100644
--- a/apk/res/values-et/strings.xml
+++ b/apk/res/values-et/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Hallake oma seadmes tervise- ja treeninguandmeid ning määrake, millised rakendused andmetele juurde pääsevad"</string>
     <string name="data_title" msgid="4456619761533380816">"Andmed ja juurdepääs"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Terviseandmete sirvimine"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Saate vaadata oma terviseandmeid ja seda, millistel rakendustel on nendele juurdepääs"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Kõik kategooriad"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Kõigi kategooriate kuvamine"</string>
     <string name="no_data" msgid="1906986019249068659">"Andmed puuduvad"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Eile"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lugemine: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Kirjutamine: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Lubade haldamine"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Aeg: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Tegevus"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"juurdepääs teie terviseandmetele"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Põletatud kalorite arvu lugemine"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Võimaldab rakendusel lugeda põletatud kalorite arvu"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Anna juurdepääs andmetele, kui rakendus töötab taustal"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Kas anda rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> juurdepääs andmetele, kui rakendus töötab taustal?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Kas lubada rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> pääseda juurde andmetele, kui see töötab taustal?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Kui lubate, saab see rakendus juurdepääsu treeningu-, heaolu-, ja terviseandmetele, kui te rakendust ei kasuta."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Kui lubate, saab see rakendus juurdepääsu terviseandmetele, kui te rakendust ei kasuta."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Kui lubate, saab see rakendus juurdepääsu treeningu- ja heaoluandmetele, kui te rakendust ei kasuta."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Kui lubate, saab see rakendus juurdepääsu Health Connecti andmetele, kui te rakendust ei kasuta."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Kas lubada rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> juurdepääs varasematele andmetele?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Kui lubate, saab see rakendus juurdepääsu treeningu- ja heaoluandmetele, mis on lisatud enne kuupäeva <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Kui lubate, saab see rakendus juurdepääsu kõigile varasematele treeningu- ja heaoluandmetele."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Kui lubate, saab see rakendus juurdepääsu Health Connecti andmetele, mis on lisatud enne kuupäeva <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Kui lubate, saab see rakendus juurdepääsu kõigile varasematele Health Connecti andmetele."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Kas lubada rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> lisajuurdepääs?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> on vaja ka juurdepääsu nendele Health Connecti seadetele"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Kõikidele andmetele taustal juurdepääsemine"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Terviseandmetele taustal juurdepääsemine"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Treeningu- ja heaoluandmetele juurdepääsemine taustal"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Lubage sellel rakendusel pääseda juurde treeningu-, heaolu- ja terviseandmetele, kui te rakendust ei kasuta"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Lubage sellel rakendusel pääseda juurde nendele andmetele, kui te rakendust ei kasuta"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Lubage sellel rakendusel pääseda juurde nendele andmetele, kui te rakendust ei kasuta"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Andmetele taustal juurdepääsemine"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Lubage sellel rakendusel pääseda juurde Health Connecti andmetele, kui te rakendust ei kasuta"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Varasematele treeningu- ja heaoluandmetele juurdepääsemine"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Lubage sellel rakendusel pääseda juurde andmetele, mis on lisatud enne kuupäeva <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Lubage sellel rakendusel pääseda juurde kõikidele varasematele andmetele"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Varasematele andmetele juurdepääsemine"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Lubage sellel rakendusel pääseda juurde Health Connecti andmetele, mis on lisatud enne kuupäeva <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Lubage sellel rakendusel pääseda juurde kõigile varasematele Health Connecti andmetele"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> pääseb juba juurde teie varasematele terviseandmetele"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Lugege lubade kohta lisateavet"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Kõikidele andmetele taustal juurdepääsemine"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Terviseandmetele taustal juurdepääsemine"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Treeningu- ja heaoluandmetele juurdepääsemine taustal"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Lubage sellel rakendusel pääseda juurde treeningu-, heaolu- ja terviseandmetele, kui te rakendust ei kasuta"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Lubage sellel rakendusel pääseda juurde nendele andmetele, kui te rakendust ei kasuta"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Lubage sellel rakendusel pääseda juurde nendele andmetele, kui te rakendust ei kasuta"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Andmetele taustal juurdepääsemine"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Lubage sellel rakendusel pääseda juurde Health Connecti andmetele, kui te rakendust ei kasuta"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Varasematele treeningu- ja heaoluandmetele juurdepääsemine"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Lubage sellel rakendusel pääseda juurde andmetele, mis on lisatud enne kuupäeva <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Lubage sellel rakendusel pääseda juurde kõikidele varasematele andmetele"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Varasematele andmetele juurdepääsemine"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Lubage sellel rakendusel pääseda juurde Health Connecti andmetele, mis on lisatud enne kuupäeva <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Lubage sellel rakendusel pääseda juurde kõigile varasematele Health Connecti andmetele"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Treeninguandmeid ei loeta praegu, kuna rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks pole lugemise load sisse lülitatud"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> pääseb juba juurde teie varasematele terviseandmetele. Selle muutmiseks lülitage selle rakenduse puhul terviseandmete load välja"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Terviseandmete lubade haldamine"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Andke vähemalt üks lugemise luba, et juurdepääs taustale või varasematele andmetele selle rakenduse jaoks sisse lülitada"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Andke vähemalt üks lugemise luba, et juurdepääs taustale selle rakenduse jaoks sisse lülitada"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Andke vähemalt üks lugemise luba, et juurdepääs varasematele andmetele selle rakenduse jaoks sisse lülitada"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Lubage sellel rakendusel pääseda juurde kõigile varasematele Health Connecti andmetele"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Lubage sellel rakendusel pääseda juurde Health Connecti andmetele, kui te rakendust ei kasuta"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Kui annate loa, saab see rakendus juurdepääsu Health Connecti andmetele, kui te rakendust ei kasuta."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Anna juurdepääs varasematele andmetele"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Kas anda rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> lisajuurdepääs andmetele?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Lubage sellel rakendusel pääseda juurde Health Connecti andmetele, mis on lisatud enne kuupäeva <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Lubage sellel rakendusel pääseda juurde kõigile varasematele Health Connecti andmetele"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Kui annate loa, saab see rakendus juurdepääsu Health Connecti andmetele, mis on lisatud enne kuupäeva <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Kui annate loa, saab see rakendus juurdepääsu kõigile varasematele Health Connecti andmetele."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktiivse tegevuse käigus põletatud kalorite arv"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktiivse tegevuse käigus põletatud kalorite arv"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Aktiivse tegevuse käigus põletatud kalorite arvu lugemine"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ratastooli lükkamised"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Ratastooli lükkamiste lugemine"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Ratastooli lükkamiste kirjutamine"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Tegevuse intensiivsus"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"tegevuse intensiivsus"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Tegevuse intensiivsuse andmete lugemine"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Tegevuse intensiivsuse andmete kirjutamine"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Ainevahetuse baaskiirus"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"ainevahetuse baaskiirus"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Ainevahetuse baaskiiruse lugemine"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"nahatemperatuur"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Saate lugeda naha temperatuuri"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Saate kirjutada välja naha temperatuuri"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"See hõlmab kõiki Health Connectiga sünkroonitud ja sinna lisatud terviseandmeid. See ei pruugi olla teie täielik haiguslugu. Teie terviseandmetesse ei lisata ühtegi meditsiinilist kirjeldust."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Kõik terviseandmed"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"kõik terviseandmed"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Kõigi terviseandmete kirjutamine"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergiad"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergiad"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Allergiate teabe lugemine"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immuniseerimine"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immuniseerimine"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Loe immuniseerimisi"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboritulemused"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboritulemused"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Laboritulemuste lugemine"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergiad"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergiad"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Allergiate teabe lugemine"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Haigused"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"haigused"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Haiguste andmete lugemine"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaktsiinid"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaktsiinid"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Vaktsiinide teabe lugemine"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboritulemused"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboritulemused"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Laboritulemuste lugemine"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Ravimid"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ravimid"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Ravimiandmete lugemine"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Isiklikud andmed"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"isiklikud andmed"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Lugeda isiklikke andmeid"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Meditsiinialase eksperdi esitatud teave"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"meditsiinialase eksperdi esitatud teave"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Lugeda meditsiinialase eksperdi esitatud teavet"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Rasedus"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"rasedus"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Raseduse lugemine"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Probleemid"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"probleemid"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Probleemide lugemine"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Protseduurid"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"protseduurid"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Protseduuride lugemine"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sotsiaalajalugu"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sotsiaalajalugu"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sotsiaalajalugu"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Sotsiaalajaloo lugemine"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Elulised märgid"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Külastused"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"külastused"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Lugeda külastuste teavet"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Tervisenäitajad"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"elulised märgid"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Eluliste märkide lugemine"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Ärksameelsus"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Ärksameelsuse seansi kirjutamine"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Luba rakendusel „<xliff:g id="APP_NAME">%1$s</xliff:g>“ lugeda"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Luba rakendusel „<xliff:g id="APP_NAME">%1$s</xliff:g>“ kirjutada"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Tühista"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Luba"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Luba kõik"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ära luba"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Valige andmed, mida soovite lubada rakendusel Health Connectis lugeda või kirjutada"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Valige andmed, mida soovite lubada sellel rakendusel Health Connectist lugeda või sinna kirjutada"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Valige andmed, mida soovite lubada sellel rakendusel Health Connectist lugeda"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Valige andmed, mida soovite lubada sellel rakendusel Health Connecti kirjutada"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Kui annate lugemisõiguse, võib rakendus lugeda uusi andmeid ja viimase 30 päeva andmeid"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Kui annate lugemisõiguse, võib rakendus lugeda uusi ja varasemaid andmeid"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Kas lubate rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> Health Connectile juurde pääseda?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Vaadake arendaja <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>, kuidas <xliff:g id="APP_NAME">%1$s</xliff:g> teie andmeid töötleb"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Kas lubada rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> juurdepääs treeningu- ja heaoluandmetele?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Teavet selle kohta, kuidas <xliff:g id="APP_NAME">%1$s</xliff:g> teie andmeid töötleb, leiate dokumendist <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privaatsuseeskirjadest"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Kas lubada rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> juurdepääs teie terviseandmetele?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Kui annate juurdepääsu, saab see rakendus lugeda ning kirjutada andmeid, näiteks teavet allergiate, laboritulemuste, vaktsiinide ja muu kohta\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Kui annate juurdepääsu, saab see rakendus lugeda andmeid, näiteks teavet allergiate, laboritulemuste, vaktsiinide ja muu kohta\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Teave terviseandmete kohta"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Jagatavad andmed hõlmavad"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Kui lubate, saab <xliff:g id="APP_NAME">%1$s</xliff:g> teie terviseandmeid Health Connectiga jagada."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sünkroonige oma eri rakendustest ja allikatest pärit terviseandmed, et neid ühes kohas hoida"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Kas eemaldada kõik load?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Eemalda kõik"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid (sh varasemaid andmeid) lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks asukohale, kaamerale ja mikrofonile juurdepääsemise lubasid."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid (sh taustaandmeid ja varasemaid andmeid) lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks asukohale, kaamerale ja mikrofonile juurdepääsemise lubasid."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Kustuta rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> andmed ka Health Connectist"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Kas eemaldada kõik load?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Kas eemaldada kõik terviseandmete load?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Kas eemaldada kõik treeningu- ja heaoluload?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Kustuta Health Connectist ka rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> treeninguandmed"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Kas eemaldada kõik terviseandmete load?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Kustuta Health Connectist ka rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> terviseandmed"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid (sh taustaandmeid) lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid (sh varasemaid andmeid) lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid (sh taustaandmeid ja varasemaid andmeid) lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Kas eemaldada kõik load?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid (sh taustaandmeid) lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid (sh varasemaid andmeid) lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei saa edaspidi Health Connecti andmeid (sh taustaandmeid ja varasemaid andmeid) lugeda ega kirjutada.\n\nSee ei mõjuta rakenduse teisi lubasid, näiteks kaamerale, mikrofonile ja asukohale juurdepääsemise lubasid."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Kustutage Health Connectist ka rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> treeningu- ja terviseandmed"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Selle rakenduse load on eemaldatud"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Kustuta ka kõik Health Connecti andmed"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Järgmine päev"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Valitud päev"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Eelmine päev"</string>
     <string name="default_error" msgid="7966868260616403475">"Midagi läks valesti. Proovige uuesti."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Tundmatu allikas"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Allika andmed"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Vasakpoolne sulg."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Parempoolne sulg."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Välja <xliff:g id="FIELD">%2$s</xliff:g> väärtus"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Nendel rakendustel pole enam juurdepääsu, kuid nende andmed on endiselt Health Connecti salvestatud."</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> saab lugeda andmeid, mis lisati pärast kuupäeva <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Kui soovite hallata muid Androidi lube, mis sellele rakendusele antud on, tehke valikud Seaded &gt; Rakendused"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Andmete puhul, mida rakendusega <xliff:g id="APP_NAME">%1$s</xliff:g> jagate, kehtivad rakenduse privaatsuseeskirjad"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Teavet selle kohta, kuidas <xliff:g id="APP_NAME">%1$s</xliff:g> teie andmeid töötleb, leiate arendaja privaatsuseeskirjadest"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Kui soovite hallata muid Androidi lube, mis sellele rakendusele antud on, avage Seaded ja seejärel puudutage valikut Rakendused"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Lugege privaatsuseeskirju"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Pääseti juurde viimase 24 tunni jooksul"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Rakenduste juurdepääs"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Teil pole praegu ühtegi ühilduvat rakendust installitud"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Täiendav juurdepääs"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Varasemad andmed, taustaandmed"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Selle rakenduse lisaload eemaldati"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Load"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Vormisolek ja heaolu"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Treening, uni, toitumine ja muu"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Terviseandmed"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"terviseandmed"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laboritulemused, ravimid, immuniseerimised ja muu"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Laboritulemused, ravimid, vaktsiinid ja muu"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Rakendused, mille load eemaldati"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect eemaldas rakenduse <xliff:g id="APP_DATA">%s</xliff:g> load"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect eemaldas rakenduste <xliff:g id="APP_DATA_0">%1$s</xliff:g> ja <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> load"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Ava Play pood"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Alustage Health Connecti kasutamist"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect talletab teie tervise- ja treeninguandmeid, pakkudes teile lihtsat viisi seadmes eri rakenduste sünkroonimiseks"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect talletab ja sünkroonib teie tervise- ja treeninguandmed eri rakendustest.\n\n"<b>"Treeningu- ja heaoluandmed,"</b>" sh treeningseansid, sammude arv, toitumine, uni ja muud\n\n"<b>"Terviseandmed,"</b>" sh vaktsiinid, laboritulemused ja muud"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connectiga saate teha järgmist."</string>
     <string name="share_data" msgid="3481932156368883946">"Jagage oma rakendustega andmeid"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Valige, milliseid andmeid iga rakendus lugeda või Health Connecti kirjutada saab."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Hallake oma seadeid ja privaatsust"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Verevaene menstruatsioon"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Keskmine menstruatsioon"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Vererohke menstruatsioon"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Vererohkus on teadmata"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruatsiooni <xliff:g id="DAY">%1$d</xliff:g>. päev <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>-st"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruatsioon (1 päev)}other{Menstruatsioon (# päeva)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiivne"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatiivne"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Kõrge"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muusika"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Muu"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Suunamiseta"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Mõõdukas"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Hoogne"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integratsioon on pooleli"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connecti integreeritakse Androidi süsteemiga.\n\nTeie andmete ja lubade ülekandmine võib pisut aega võtta."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ärge sulgege rakendust enne, kui teile kuvatakse märguanne, et töötlemine on lõpetatud."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connecti integratsioon on pooleli"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Vajalik on värskendus"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect integreeritakse Androidi süsteemiga ning saate juurdepääsu Health Connectile otse seadete kaudu."</string>
     <string name="update_button" msgid="4544529019832009496">"Värskenda"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Alustage värskendusega, et Health Connect integreeruks teie süsteemiseadetega"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Värskenda kohe"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Vajalik on süsteemivärskendus"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Enne jätkamist värskendage oma telefonisüsteemi."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Kui olete oma telefonile juba süsteemivärskenduse teinud, proovige integratsiooni jätkamiseks oma telefon taaskäivitada."</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Vajalik on Health Connecti rakenduse värskendamine"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Enne jätkamist värskendage Health Connecti rakendus uusimale versioonile."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Salvestusruumi on vaja juurde"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Integreerimisega jätkamiseks vajab Health Connect seadmes <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> salvestusruumi.\n\nVabastage seadmes salvestusruumi ja proovige siis uuesti."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Proovi uuesti"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Ruumi vabastamine"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Salvestusruumi on vaja juurde"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Integreerimisega jätkamiseks vajab Health Connect seadmes <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> salvestusruumi."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integratsioon peatatud"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect sulgus Androidi süsteemiga integreerimise ajal.\n\nKlõpsake rakenduse uuesti avamiseks ning andmete ja lubade ülekandmise jätkamiseks „Jätka”."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Andmete säilitamiseks lõpetage toiming järgmise aja jooksul: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Puudutage, et integreerida Health Connect oma Androidi süsteemiga. Andmete säilitamiseks lõpetage toiming järgmise aja jooksul: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Puudutage, et integreerida Health Connect oma Androidi süsteemiga."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Jätka"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Jätka Health Connecti integratsiooni"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Andmete säilitamiseks lõpetage toiming järgmise aja jooksul: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Rakendus vajab värskendamist"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Rakendust <xliff:g id="APP_NAME">%1$s</xliff:g> tuleb värskendada, et Health Connectiga sünkroonimist jätkata"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Mõnda rakendust tuleb värskendada, et Health Connectiga sünkroonimist jätkata"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Rakendus <xliff:g id="APP_NAME">%1$s</xliff:g> tuleb värskendada, et Health Connectiga sünkroonimist jätkata Kõigile rakendustele ei pruugi värskendusi saadaval olla."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Mõni rakendus tuleb värskendada, et Health Connectiga sünkroonimist jätkata Kõigile rakendustele ei pruugi värskendusi saadaval olla."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Kontrollige värskendusi"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Lisateave"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect integratsioon"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connecti integratsiooni ei viidud lõpule"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Teid teavitatakse, kui see muutub taas kättesaadavaks."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Selge"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connecti integratsiooni ei viidud lõpule"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Lisateave"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connecti integratsioon lõpetatud"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Avatud"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Mis on uut"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Teil on nüüd juurdepääs Health Connectile otse seadete kaudu. Desinstallige Health Connecti rakendus igal ajal, et vabastada salvestusruumi."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Selge"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Rakendusallikate muutmine"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Seadme vaikeseade"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Rakenduse andmed"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Nende rakenduste andmed, millel on juurdepääs teenusele Health Connect, kuvatakse siin"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> andmed kuvatakse siin"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Nende rakenduste andmed, millel on juurdepääs teenusele Health Connect, kuvatakse siin"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Päev"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Nädal"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Kuu"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Eelmine kuu"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Kirjed"</string>
     <string name="tab_access" msgid="7818197975407243701">"Juurdepääs"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Kas anda rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> lisajuurdepääs?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> on vaja ka juurdepääsu Health Connecti seadetele"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Andke vähemalt üks lugemise luba, et juurdepääs taustale või varasematele andmetele selle rakenduse jaoks sisse lülitada"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Andke vähemalt üks lugemise luba, et juurdepääs taustale selle rakenduse jaoks sisse lülitada"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Andke vähemalt üks lugemise luba, et juurdepääs varasematele andmetele selle rakenduse jaoks sisse lülitada"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Alustage Health Connecti kasutamist"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sünkroonige oma esimesed rakendused, et nende vahel tervise- ja treeninguandmeid jagada"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Seadistamine"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Vaadake ühilduvaid rakendusi"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Leidke veel rakendusi, mida rakendusega <xliff:g id="APP_NAME">%s</xliff:g> Health Connecti kaudu sünkroonida"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Kuva rakenduste poes"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ekraaniluku seadistamine"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Terviseandmete turvalisuse suurendamiseks määrake selle seadme jaoks PIN-kood, muster või parool"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Ekraaniluku seadistamine"</string>
     <string name="select_all" msgid="837499881590001166">"Vali kõik"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Ühendatud rakendused ei saa enam neid andmeid rakendusest Health Connect lugeda."</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Märgitud"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Märkimata"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Treeningu kaardimarsruut on saadaval"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Järgmine päev"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Järgmine nädal"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Järgmine kuu"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Eelmine päev"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Eelmine nädal"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Eelmine kuu"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Kas kustutada kõik andmed jäädavalt?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Kas kustutada valitud andmed jäädavalt?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Kas kustutada kõik rakenduse <xliff:g id="APP_NAME">%s</xliff:g> andmed jäädavalt?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Kas kustutada valitud rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> nädala <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> kirjed jäädavalt?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Kas kustutada valitud rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> kuu <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> kirjed jäädavalt?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Kas kustutada see rakenduse <xliff:g id="APP_NAME">%s</xliff:g> kirje jäädavalt?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Kas kustutada rakenduse <xliff:g id="APP_NAME">%2$s</xliff:g> kategooria <xliff:g id="DATA_TYPE">%1$s</xliff:g> andmed?"</string>
+    <string name="on" msgid="8266542510798355807">"Sees"</string>
+    <string name="off" msgid="6996623844428550649">"Väljas"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Juurde pääsetud <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Juurde pääsetud eile <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Juurde pääsetud <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Luba alati"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Luba valitud"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Rakenduse kasutamise ajal"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Keeldu kõigist"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Kas lubada rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> juurdepääs treeningu- ja heaoluandmetele?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb juurdepääsu järgmisele: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nValige, kas lubada kõik või juhtida neid ükshaaval."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Kas lubada rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> juurdepääs seadmele <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Vormisolek ja heaolu"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"kogu aeg"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"kasutamise ajal"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Kogu aeg"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Kasutamise ajal"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> pääseb juurde kõikidele teie vormisoleku ja heaolu andmetele <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Lubatud juurde pääseda"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Lubatud lugeda"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Need load annavad rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> juurdepääsu teie seadme andurite andmetele."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> rakendust on lubatud"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ükski rakendus ei taotle"</string>
+    <string name="allowed" msgid="4158456017482263737">"Lubatud"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Pole lubatud"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Selle õigusega rakendustel on teie seadme andurite kaudu juurdepääs andmetele <xliff:g id="DATA_TYPE">%s</xliff:g>."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Kas eemaldada andmete <xliff:g id="DATA_TYPE">%s</xliff:g> juurdepääs kõigile kellas olevatele rakendustele?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Märge"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Rist"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Praegu pääseb <xliff:g id="APP_NAME">%1$s</xliff:g> juurde kõikidele teie treeningu- ja heaoluandmetele <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Kas lubada rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g> kogu aeg juurdepääs treeningu- ja heaoluandmetele?"</string>
+    <string name="current_access" msgid="1457167070428176139">"Rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> on juurdepääs andmetele <xliff:g id="DATA_TYPES">%2$s</xliff:g>"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Hallake treeningu ja heaoluga seotud lubasid"</string>
 </resources>
diff --git a/apk/res/values-eu/strings.xml b/apk/res/values-eu/strings.xml
index 9dc5b5f..dadc205 100644
--- a/apk/res/values-eu/strings.xml
+++ b/apk/res/values-eu/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Kudeatu osasunari eta fitnessari buruz gailuan gordeta dauzkazun datuak, eta kontrolatu zein aplikaziok atzi ditzaketen datu horiek"</string>
     <string name="data_title" msgid="4456619761533380816">"Datuak eta sarbidea"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Arakatu historia klinikoak"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Ikusi historia klinikoak eta zein aplikaziok erabil ditzaketen"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Kategoria guztiak"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Ikusi kategoria guztiak"</string>
     <string name="no_data" msgid="1906986019249068659">"Ez dago daturik"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Atzo"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Irakurtzeko baimena: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Idazteko baimena: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Kudeatu baimenak"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Ordua: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Jarduerak"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"atzitu osasunari buruzko datuak"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Irakurri erretako kaloriak"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Erretako kaloriak irakurtzeko baimena ematen dio aplikazioari"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Erabili datuak atzeko planoan"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Atzeko planoan datuak erabiltzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Atzeko planoan datuak erabiltzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Baimena ematen badiozu, aplikazioa erabiltzen ari ez zarenean ere fitnessari eta ongizateari buruzko datuak eta historia klinikoa erabili ahalko ditu aplikazioak."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Baimena ematen badiozu, aplikazioa erabiltzen ari ez zarenean ere historia klinikoa erabili ahalko du aplikazioak."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Baimena ematen badiozu, aplikazioa erabiltzen ari ez zarenean ere fitnessari eta ongizateari buruzko datuak erabili ahalko ditu aplikazioak."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Baimena ematen badiozu, aplikazioa erabiltzen ari ez zarenean ere Health Connect-eko datuak erabili ahalko ditu aplikazioak."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Iraganeko datuak erabiltzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Baimena ematen badiozu, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> baino lehen gehitutako fitnessari eta ongizateari buruzko datuak erabili ahalko ditu aplikazioak."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Baimena ematen badiozu, fitnessari eta ongizateari buruzko iraganeko datu guztiak erabili ahalko ditu aplikazioak."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Baimena ematen badiozu, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> baino lehen gehitutako Health Connect-eko datuak erabili ahalko ditu aplikazioak."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Baimena ematen badiozu, iraganeko Health Connect-eko datu guztiak erabili ahalko ditu aplikazioak."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Baimen gehigarriak eman nahi dizkiozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Halaber, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak Health Connect-en ezarpen hauek erabili behar ditu"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Atzeko planoan datu guztiak erabili"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Atzeko planoan historia klinikoa erabili"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Atzeko planoan fitnessari eta ongizateari buruzko datuak erabili"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Eman fitnessari eta ongizateari buruzko datuak eta historia klinikoa erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Eman datu horiek erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Eman datu horiek erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Datuak atzeko planoan erabili"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Eman Health Connect-eko datuak erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Fitnessari eta ongizateari buruzko iraganeko datuak erabili"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Eman <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> baino lehen gehitutako datuak erabiltzeko baimena aplikazioari"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Eman iraganeko datu guztiak erabiltzeko baimena aplikazioari"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Iraganeko datuak erabili"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Eman <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> baino lehen gehitutako Health Connect-eko datuak erabiltzeko baimena aplikazioari"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Eman Health Connect-eko iraganeko datu guztiak erabiltzeko baimena aplikazioari"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak jada erabil ditzake zure historia klinikoaren iraganeko datuak"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Irakurri baimenei buruzko informazio gehiago"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Atzeko planoan datu guztiak erabili"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Atzeko planoan historia klinikoa erabili"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Atzeko planoan fitnessari eta ongizateari buruzko datuak erabili"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Eman fitnessari eta ongizateari buruzko datuak eta historia klinikoa erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Eman datu horiek erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Eman datu horiek erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Datuak atzeko planoan erabili"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Eman Health Connect-eko datuak erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Fitnessari eta ongizateari buruzko iraganeko datuak erabili"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Eman <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> baino lehen gehitutako datuak erabiltzeko baimena aplikazioari"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Eman iraganeko datu guztiak erabiltzeko baimena aplikazioari"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Iraganeko datuak erabili"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Eman <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> baino lehen gehitutako Health Connect-eko datuak erabiltzeko baimena aplikazioari"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Eman Health Connect-eko iraganeko datu guztiak erabiltzeko baimena aplikazioari"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Une honetan ez da fitnessari buruzko daturik irakurtzen, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez duelako irakurtzeko baimenik"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak jada erabil ditzake zure historia klinikoaren iraganeko datuak. Aukera hori aldatzeko, kendu historia klinikoa erabiltzeko baimena aplikazio horri."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Kudeatu historia klinikoari buruzko baimenak"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aplikazio honetan atzeko planoa edo iraganeko datuak atzitzeko aukera aktibatzeko, gaitu irakurtzeko baimen bat gutxienez"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aplikazio honetan atzeko planoa atzitzeko aukera aktibatzeko, gaitu irakurtzeko baimen bat gutxienez"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aplikazio honetan iraganeko datuak atzitzeko aukera aktibatzeko, gaitu irakurtzeko baimen bat gutxienez"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Eman Health Connect-eko iraganeko datu guztiak erabiltzeko baimena aplikazioari"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Eman Health Connect-eko datuak erabiltzeko baimena aplikazioari, hura erabiltzen ari ez zarenean ere"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Baimena ematen baduzu, aplikazioa erabiltzen ari ez zarenean ere Health Connect-eko datuak erabili ahalko ditu aplikazioak."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Erabili iraganeko datuak"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Iraganeko datuak erabiltzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Eman <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> baino lehen gehitutako Health Connect-eko datuak erabiltzeko baimena aplikazioari"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Eman Health Connect-eko iraganeko datu guztiak erabiltzeko baimena aplikazioari"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Baimena ematen baduzu, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> baino lehen gehitutako Health Connect-eko datuak erabili ahalko ditu aplikazioak."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Baimena ematen baduzu, iraganeko Health Connect-eko datu guztiak erabili ahalko ditu aplikazioak."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktibo egonda erretako kaloriak"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktibo egonda erretako kaloriak"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Irakurri aktibo egonda erretako kaloriei buruzko datuak"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"Gurpil-aulkiaren bultzadak"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Irakurri gurpil-aulkiaren bultzadei buruzko datuak"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Idatzi gurpil-aulkiaren bultzadei buruzko datuak"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Jardueren intentsitatea"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"jardueren intentsitatea"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Irakurri jardueren intentsitatea"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Idatzi jardueren intentsitatea"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Metabolismo basala"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"metabolismo basala"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Irakurri metabolismo basalari buruzko datuak"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"azalaren tenperatura"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Irakurri azalaren tenperatura"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Idatzi azalaren tenperatura"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Horrek barnean hartzen ditu Health Connect-ekin sinkronizatutako eta bertan gehitutako historia klinikoak. Baliteke ez izatea historia kliniko osoa, eta ez du barnean hartzen zure historia klinikoaren azalpen medikorik."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Historia kliniko osoa"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"historia kliniko osoa"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Idatzi historia kliniko osoa"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergiak"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergiak"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Alergiak irakurri"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunizazio-datuak"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunizazio-datuak"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Irakurri immunizazio-datuak"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laborategiko emaitzak"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laborategiko emaitzak"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Irakurri laborategiko emaitzak"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergiak"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergiak"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Irakurri alergiak"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Gaixotasunak"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"gaixotasunak"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Irakurri gaixotasunak"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Txertoak"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"txertoak"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Irakurri txertoak"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laborategiko emaitzak"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laborategiko emaitzak"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Irakurri laborategiko emaitzak"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Sendagaiak"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"sendagaiak"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Irakurri sendagaiak"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Informazio pertsonala"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"informazio pertsonala"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Irakurri informazio pertsonala"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Medikuen xehetasunak"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"medikuen xehetasunak"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Irakurri medikuen xehetasunak"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Haurdunaldia"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"haurdunaldia"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Irakurri haurdunaldiari buruzko datuak"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Arazoak"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"arazoak"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Irakurri arazoen datuak"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Prozedurak"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"prozedurak"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Irakurri prozeduren datuak"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Interakzio sozialen historia"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Bizimodua"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"interakzio sozialen historia"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Irakurri interakzio sozialen historiari buruzko datuak"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Bizi-konstanteak"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Bisitak"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"bisitak"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Irakurri bisitak"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Bizi-konstanteak"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"bizi-konstanteak"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Irakurri bizi-konstanteei buruzko datuak"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness-a"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Idatzi mindfulness-ari buruzko datuak"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Eman irakurtzeko baimena <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Eman idazteko baimena <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Utzi"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Eman baimena"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Eman baimen guztiak"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ez eman baimenik"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Aukeratu aplikazio honek Health Connect-en irakurri edo idatz ditzakeen datuak"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Aukeratu aplikazio honek Health Connect-en irakurri edo idatz ditzakeen datuak"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Aukeratu aplikazio honek Health Connect-en irakur ditzakeen datuak"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Aukeratu aplikazio honek Health Connect-en idatz ditzakeen datuak"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Datuak irakurtzeko baimena ematen badiozu, datu berriak eta azken 30 egunetako datuak irakurri ahal izango ditu aplikazioak"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Datuak irakurtzeko baimena ematen badiozu, datu berriak eta iraganekoak irakurri ahal izango ditu aplikazioak"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Health Connect erabiltzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak zuri buruzko datuak nola kudeatzen dituen jakiteko, ikusi garatzailearen <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Fitnessari eta ongizateari buruzko datu guztiak erabiltzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak zuri buruzko datuak nola kudeatzen dituen jakiteko, ikusi haren <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"pribatutasun-gidalerroak"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Historia klinikoa erabiltzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Sarbidea emanez gero, aplikazioak zenbait datu irakurri eta idatzi ahalko ditu; adibidez, alergiak, laborategiko emaitzak, txertoak eta abar\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Sarbidea emanez gero, aplikazioak zenbait datu irakurri ahalko ditu; adibidez, alergiak, laborategiko emaitzak, txertoak eta abar\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Historia klinikoari buruz"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Besteak beste, datu hauek partekatzen dira"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Baimena ematen badiozu, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak historia klinikoa Health Connect-ekin partekatu ahalko du."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinkronizatu beste aplikazio eta iturburu batzuetako historia klinikoa, dena toki berean izateko"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Baimen guztiak kendu nahi dituzu?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Kendu guztiak"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo du Health Connect-en gordetako daturik irakurri edo idatzi.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo du Health Connect-en gordetako daturik irakurri edo idatzi, iraganeko datuak barne.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kokapena, kamera edo mikrofonoa erabiltzeari buruzkoei)."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo du Health Connect-en gordetako daturik irakurri edo idatzi, atzeko planoko eta iraganeko datuak barne.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kokapena, kamera edo mikrofonoa erabiltzeari buruzkoei)."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Halaber, ezabatu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko datuak Health Connect-etik"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Baimen guztiak kendu nahi dituzu?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Historia klinikoari buruzko baimen guztiak kendu nahi dituzu?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Fitnessari eta ongizateari buruzko baimen guztiak kendu?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Gainera, ezabatu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko fitnessari buruzko datuak Health Connect-etik"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Historia klinikoari buruzko baimen guztiak kendu nahi dituzu?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Gainera, ezabatu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko historia klinikoa Health Connect-etik"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo ditu irakurri edo idatzi Health Connect-eko datu horiek.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo ditu irakurri edo idatzi Health Connect-eko datu horiek, atzeko planoko datuak barne.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo ditu irakurri edo idatzi Health Connect-eko datu horiek, iraganeko datuak barne.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo ditu irakurri edo idatzi Health Connect-eko datu horiek, atzeko planoko eta iraganeko datuak barne.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Baimen guztiak kendu nahi dituzu?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo du Health Connect-en gordetako daturik irakurri edo idatzi.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo du Health Connect-en gordetako daturik irakurri edo idatzi, atzeko planoko datuak barne.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo du Health Connect-en gordetako daturik irakurri edo idatzi, iraganeko datuak barne.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Aurrerantzean, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ezingo du Health Connect-en gordetako daturik irakurri edo idatzi, atzeko planoko eta iraganeko datuak barne.\n\nAldaketak ez die eragingo aplikazioaren beste baimen batzuei (esaterako, kamera, mikrofonoa edo kokapena erabiltzeari buruzkoei)."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Gainera, ezabatu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko fitnessari buruzko datuak eta historia klinikoa Health Connect-etik"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Kendu zaizkio baimenak aplikazioari"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Ezabatu Health Connect-eko datu guztiak ere"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Hurrengo eguna"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Hautatutako eguna"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Aurreko eguna"</string>
     <string name="default_error" msgid="7966868260616403475">"Arazoren bat izan da. Saiatu berriro."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Baliabide ezezaguna"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Iturburuko datuak"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Ezkerreko giltza."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Eskuineko giltza."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> <xliff:g id="FIELD">%2$s</xliff:g> eremuaren balioa"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Aplikazio hauek ez dute jada sarbiderik, baina oraindik datuak gordeta dauzkate Health Connect-en"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> ezkero gehitutako datuak irakur ditzake <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Aplikazioak atzi ditzakeen beste baimen batzuk kudeatzeko, joan Ezarpenak &gt; Aplikazioak atalera"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren pribatutasun-gidalerroak aplikatuko zaizkie harekin partekatzen dituzun datuei"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Garatzailearen pribatutasun-gidalerroetan, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak zuri buruzko datuak nola kudeatzen dituen ikusiko duzu"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Aplikazioak atzi ditzakeen Android-eko beste baimen batzuk kudeatzeko, joan Ezarpenak &gt; Aplikazioak atalera"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Irakurri pribatutasun-gidalerroak"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Azken 24 orduetan atzitu dira"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Aplikazioak duen sarbidea"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Une honetan ez daukazu aplikazio bateragarririk instalatuta"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Sarbide gehigarria"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Iraganeko eta atzeko planoko datuak"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Kendu dira aplikazio honen baimen gehigarriak"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Baimenak"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitnessa eta ongizatea"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Ariketa fisikoa, loa, elikadura eta abar"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Historia klinikoak"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"historia klinikoak"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laborategiko emaitzak, sendagaiak, immunizazio-datuak eta abar"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Laborategiko emaitzak, sendagaiak, txertoak eta abar"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Kendutako aplikazio-baimenak"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"<xliff:g id="APP_DATA">%s</xliff:g> aplikazioaren baimenak kendu ditu Health Connect-ek"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"<xliff:g id="APP_DATA_0">%1$s</xliff:g> eta <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> aplikazioen baimenak kendu ditu Health Connect-ek"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Joan Play Store-ra"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Hasi Health Connect erabiltzen"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect-ek osasunari eta fitnessari buruzko datuak gordetzen ditu eta gailuko aplikazioak erraz sinkronizatzeko aukera eskaintzen du"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect-ek osasunari eta fitnessari buruzko datuak gordetzen eta sinkronizatzen ditu zenbait aplikaziotatik.\n\n"<b>"fitnessari eta ongizateari buruzko datuak"</b>" (adibidez, ariketa-saioak, pausoak, elikadura, loa eta abar)\n\n"<b>"historia klinikoa"</b>" (adibidez, txertoak, laborategiko emaitzak eta abar)"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect-ekin hauek egin ditzakezu:"</string>
     <string name="share_data" msgid="3481932156368883946">"Partekatu datuak zure aplikazioekin"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Aukeratu aplikazio bakoitzak Health Connect-en irakurri edo idatz ditzakeen datuak"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Kudeatu ezarpenak eta pribatutasuna"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Odol-jario urria"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Odol-jario ertaina"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Odol-jario ugaria"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Odol-jario ezezaguna"</string>
     <string name="period_day" msgid="3821944462093965882">"Hilekoaren eguna: <xliff:g id="DAY">%1$d</xliff:g>/<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Hilekoa (egun bat)}other{Hilekoa (# egun)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiboa"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatiboa"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Handia"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musika"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Beste bat"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Gidatu gabea"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Tartekoa"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Bizia"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrazio-prozesua abian da"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect Android sisteman integratzen ari da.\n\nAgian tarte bat beharko da datuak eta baimenak transferitzeko."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ez itxi aplikazioa prozesu-amaierako jakinarazpena jaso arte."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect integratzen ari da"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Eguneratu egin behar da"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect Android sisteman integratzen ari da, ezarpenetatik zuzenean erabili ahal izan dezazun."</string>
     <string name="update_button" msgid="4544529019832009496">"Eguneratu"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Hasi eguneratzen, Health Connect-ek zure sistemaren ezarpenekin integratzen jarrai dezan"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Eguneratu"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Sistema eguneratu egin behar da"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Aurrera egin aurretik, eguneratu telefonoak darabilen sistema."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Telefonoak darabilen sistema dagoeneko eguneratu baduzu, berrabiarazi telefonoa integrazio-prozesuari berrekiteko"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect eguneratu egin behar da"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Aurrera eginez gero, azken bertsiora eguneratuko da Health Connect aplikazioa."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Toki gehiago behar da"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Integratzen jarraitzeko, Health Connect-ek <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> behar ditu telefonoaren biltegian.\n\nEgin tokia telefonoan eta saiatu berriro."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Saiatu berriro"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Egin tokia"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Toki gehiago behar da"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Integratzen jarraitzeko, Health Connect-ek <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> behar ditu telefonoaren biltegian."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Pausatu egin da integrazio-prozesua"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect aplikazioa itxi egin da Android sisteman integratzen ari zen bitartean.\n\nAplikazioa berriro irekitzeko eta datuak eta baimenak transferitzen jarraitzeko, sakatu Berrekin."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect-eko datuak gorde nahi badituzu, amaitu prozesua <xliff:g id="TIME_NEEDED">%1$s</xliff:g> igaro baino lehen"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect Android sistemarekin integratzen jarraitzeko, sakatu hau. Datuak gorde nahi badituzu, amaitu prozesua <xliff:g id="TIME_NEEDED">%1$s</xliff:g> igaro baino lehen."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect Android sistemarekin integratzen jarraitzeko, sakatu hau."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Egin aurrera"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Berrekin Health Connect integratzeko prozesuari"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Datuak gorde nahi badituzu, amaitu prozesua <xliff:g id="TIME_NEEDED">%1$s</xliff:g> igaro baino lehen"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Aplikazioa eguneratu egin behar da"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> eguneratu egin behar da datuak Health Connect-ekin sinkronizatzen jarrai dezan"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Aplikazio batzuk eguneratu egin behar dira datuak Health Connect-ekin sinkronizatzen jarrai dezaten"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> eguneratu egin behar da datuak Health Connect-ekin sinkronizatzen jarrai dezan. Baliteke aplikazio batzuek eguneratzerik erabilgarri ez izatea."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Aplikazio batzuk eguneratu egin behar dira datuak Health Connect-ekin sinkronizatzen jarrai dezaten. Baliteke aplikazio batzuek eguneratzerik erabilgarri ez izatea."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Bilatu eguneratzeak"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Lortu informazio gehiago"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-en integrazioa"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Ez da amaitu Health Connect-en integrazio-prozesua"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Jakinarazpen bat jasoko duzu erabilgarri dagoenean."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Ados"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Ez da amaitu Health Connect-en integrazio-prozesua"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Irakurri informazio gehiago"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integratu da Health Connect"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Ireki"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Berritasunak"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Orain, ezarpenetatik zuzenean erabil dezakezu Health Connect. Edonoiz desinstala dezakezu Health Connect aplikazioa biltegiratzeko tokia egiteko."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Ados"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Editatu aplikazioen iturburuak"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Gailuko aplikazio lehenetsia"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Aplikazioko datuak"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect erabil dezaketen aplikazioetako datuak agertuko dira hemen"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko datuak hemen agertuko dira"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect erabiltzeko baimena duten aplikazioetako datuak agertuko dira hemen"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Egunekoak"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Astekoak"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Hilabetekoak"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Joan den hilabetekoak"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Sarrerak"</string>
     <string name="tab_access" msgid="7818197975407243701">"Erabiltzeko baimena dutenak"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Baimen gehigarriak eman nahi dizkiozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Halaber, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak Health Connect-en ezarpen hauek erabili behar ditu"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aplikazio honetan atzeko planoa edo iraganeko datuak atzitzeko aukera aktibatzeko, gaitu irakurtzeko baimen bat gutxienez"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aplikazio honetan atzeko planoa atzitzeko aukera aktibatzeko, gaitu irakurtzeko baimen bat gutxienez"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aplikazio honetan iraganeko datuak atzitzeko aukera aktibatzeko, gaitu irakurtzeko baimen bat gutxienez"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Hasi Health Connect erabiltzen"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinkronizatu lehen aplikazioak, haien artean osasunari eta fitnessari buruzko datuak partekatzeko"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Konfiguratu"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Ikusi aplikazio bateragarriak"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Bilatu Health Connect bidez <xliff:g id="APP_NAME">%s</xliff:g> aplikazioarekin sinkroniza daitezkeen aplikazio gehiago"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Ikusi aplikazio-dendan"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ezarri pantailaren blokeoa"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Osasunari buruzko datuen segurtasuna areagotzeko, ezarri PIN, eredu edo pasahitz bat gailuan"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Ezarri pantailaren blokeoa"</string>
     <string name="select_all" msgid="837499881590001166">"Hautatu guztiak"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Aurrerantzean, konektatutako aplikazioek ezingo dituzte irakurri Health Connect-eko datu horiek"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Markatuta"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Markatu gabe"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Ariketaren mapako ibilbidea erabilgarri dago"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Hurrengo eguna"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Hurrengo astea"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Hurrengo hilabetea"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Aurreko eguna"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Aurreko astea"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Aurreko hilabetea"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Datu guztiak betiko ezabatu nahi dituzu?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Hautatutako datuak betiko ezabatu nahi dituzu?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g> aplikazioko datu guztiak betiko ezabatu nahi dituzu?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> asteko hautatutako sarrerak betiko ezabatu nahi dituzu?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> hilabeteko hautatutako sarrerak betiko ezabatu nahi dituzu?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"<xliff:g id="APP_NAME">%s</xliff:g> aplikazioaren sarrera hau betiko ezabatu nahi duzu?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioak honi buruz dituen datuak (<xliff:g id="DATA_TYPE">%1$s</xliff:g>) ezabatu nahi dituzu?"</string>
+    <string name="on" msgid="8266542510798355807">"Aktibatuta"</string>
+    <string name="off" msgid="6996623844428550649">"Desaktibatuta"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Atzitze-data: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Atzo atzitu zen (<xliff:g id="TIME_DATE">%1$s</xliff:g>)"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Atzitze-data: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> (<xliff:g id="TIME_DATE_1">%2$s</xliff:g>)"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Eman baimena beti"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Eman hautatutakoak"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Aplikazioa erabili bitartean"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Ukatu guztiak"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Fitnessari eta ongizateari buruzko datu guztiak erabiltzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g> erabiltzeko baimena eskatzen ari da.\n\nEman baimen guztiak edo kontrola itzazu banaka."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="DATA_TYPE">%2$s</xliff:g> atzitzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitnessa eta ongizatea"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"beti"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"erabili bitartean"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Beti"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Erabili bitartean"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak <xliff:g id="ALLOW_MODE">%2$s</xliff:g> atzi ditzake zure fitness- eta ongizate-datu guztiak"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Atzitzeko baimena"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Irakurtzeko baimena"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Baimen hauek gailuaren sentsoreetako datuak atzitzeko baimena ematen diote <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> aplikaziok dute baimena"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ez dago baimena eskatzen ari den aplikaziorik"</string>
+    <string name="allowed" msgid="4158456017482263737">"Baimena dauka"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Ez dauka baimenik"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Baimen hau duten aplikazioek <xliff:g id="DATA_TYPE">%s</xliff:g> motako datuak atzi ditzakete gailuaren sentsoreetatik."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Erlojuko aplikazio guztiei <xliff:g id="DATA_TYPE">%s</xliff:g> motako datuak atzitzeko baimena kendu nahi diezu?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Hautamarka"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Gurutzea"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Une honetan, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak fitnessari eta ongizateari buruzko datuak atzi ditzake <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Fitnessari eta ongizateari buruzko datuak edonoiz atzitzeko baimena eman nahi diozu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioari?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak datu mota hauek atzi ditzake: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Kudeatu fitnessarekin eta ongizatearekin lotutako baimenak"</string>
 </resources>
diff --git a/apk/res/values-fa/strings.xml b/apk/res/values-fa/strings.xml
index 7fadeb0..93b6f45 100644
--- a/apk/res/values-fa/strings.xml
+++ b/apk/res/values-fa/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"داده‌های سلامتی و تناسب اندام را در دستگاهتان مدیریت کنید و کنترل کنید کدام برنامه‌ها می‌توانند به این داده‌ها دسترسی داشته باشند"</string>
     <string name="data_title" msgid="4456619761533380816">"داده‌ها و دسترسی"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"مرور سوابق سلامتی"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"سوابق سلامتی خود و برنامه‌هایی را که می‌توانند به آن‌ها دسترسی داشته باشند مشاهده کنید"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"همه دسته‌ها"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"دیدن همه دسته‌ها"</string>
     <string name="no_data" msgid="1906986019249068659">"داده‌ای وجود ندارد"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"دیروز"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"خواندن: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"نوشتن: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"، "</string>
+    <string name="separator" msgid="5521285473288943819">"، "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"مدیریت اجازه‌ها"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"زمان: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"فعالیت"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"دسترسی به داده‌های سلامت شما"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"خواندن داده کالری سوزانده‌شده"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"به برنامه اجازه می‌دهد کالری سوزانده‌شده را بخواند"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"دسترسی به داده‌ها در پس‌زمینه"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌دهید به داده‌ها در پس‌زمینه دسترسی داشته باشد؟"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌دهید به داده‌ها در پس‌زمینه دسترسی داشته باشد؟"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"اگر اجازه دهید، این برنامه می‌تواند وقتی از آن استفاده نمی‌کنید به داده‌های تناسب اندام و تندرستی و سوابق سلامتی دسترسی داشته باشد."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"اگر اجازه دهید، این برنامه می‌تواند وقتی از آن استفاده نمی‌کنید به سوابق سلامتی دسترسی داشته باشد."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"اگر اجازه دهید، این برنامه می‌تواند وقتی از آن استفاده نمی‌کنید به داده‌های تناسب اندام و تندرستی داشته باشد."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"اگر اجازه دهید، این برنامه می‌تواند وقتی از آن استفاده نمی‌کنید به داده‌های Health Connect دسترسی داشته باشد."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌دهید به داده‌های قبلی دسترسی داشته باشد؟"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"اگر اجازه دهید، این برنامه می‌تواند به داده‌های تناسب اندام و تندرستی اضافه‌شده قبل‌از <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> دسترسی داشته باشد."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"اگر اجازه دهید، این برنامه می‌تواند به داده‌های تناسب اندام و تندرستی دسترسی داشته باشد."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"اگر اجازه دهید، این برنامه می‌تواند به داده‌های Health Connect اضافه‌شده قبل‌از <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> دسترسی داشته باشد."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"اگر اجازه دهید، این برنامه می‌تواند به همه داده‌های قبلی Health Connect دسترسی داشته باشد."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه دسترسی اضافی داده شود؟"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> می‌خواهد به این تنظیمات Health Connect نیز دسترسی داشته باشد"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"دسترسی به همه داده‌ها در پس‌زمینه"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"دسترسی به سوابق سلامتی در پس‌زمینه"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"دسترسی به داده‌های تناسب اندام و تندرستی در پس‌زمینه"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"به این برنامه اجازه داده می‌شود وقتی از آن استفاده نمی‌کنید به داده‌های تناسب اندام و تندرستی و سوابق سلامتی دسترسی داشته باشد"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"به این برنامه اجازه داده می‌شود وقتی از آن استفاده نمی‌کنید به این داده‌ها دسترسی داشته باشد"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"به این برنامه اجازه داده می‌شود وقتی از آن استفاده نمی‌کنید به این داده‌ها دسترسی داشته باشد"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"دسترسی به داده‌ها در پس‌زمینه"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"به این برنامه اجازه داده می‌شود وقتی از آن استفاده نمی‌کنید به داده‌های Health Connect دسترسی داشته باشد"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"دسترسی به داده‌های تناسب اندام و تندرستی قبلی"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"به این برنامه اجازه داده می‌شود به داده‌های اضافه‌شده قبل‌از <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> دسترسی داشته باشد"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"به این برنامه اجازه داده می‌شود به همه داده‌های قبلی دسترسی داشته باشد"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"دسترسی به داده‌های قبلی"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"به این برنامه اجازه داده می‌شود به داده‌های Health Connect اضافه‌شده قبل‌از <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> دسترسی داشته باشد"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"به این برنامه اجازه داده می‌شود به همه داده‌های قبلی Health Connect دسترسی داشته باشد"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> درحال‌حاضر می‌تواند به داده‌های قبلی سوابق سلامتی‌تان دسترسی داشته باشد"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"درباره اجازه‌ها بیشتر بدانید"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"دسترسی به همه داده‌ها در پس‌زمینه"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"دسترسی به سوابق سلامتی در پس‌زمینه"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"دسترسی به داده‌های تناسب اندام و تندرستی در پس‌زمینه"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"به این برنامه اجازه داده می‌شود وقتی از آن استفاده نمی‌کنید به داده‌های تناسب اندام و تندرستی و سوابق سلامتی دسترسی داشته باشد"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"به این برنامه اجازه داده می‌شود وقتی از آن استفاده نمی‌کنید به این داده‌ها دسترسی داشته باشد"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"به این برنامه اجازه داده می‌شود وقتی از آن استفاده نمی‌کنید به این داده‌ها دسترسی داشته باشد"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"دسترسی به داده‌ها در پس‌زمینه"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"به این برنامه اجازه داده می‌شود وقتی از آن استفاده نمی‌کنید به داده‌های Health Connect دسترسی داشته باشد"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"دسترسی به داده‌های تناسب اندام و تندرستی قبلی"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"به این برنامه اجازه داده می‌شود به داده‌های اضافه‌شده قبل‌از <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> دسترسی داشته باشد"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"به این برنامه اجازه داده می‌شود به همه داده‌های قبلی دسترسی داشته باشد"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"دسترسی به داده‌های قبلی"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"به این برنامه اجازه داده می‌شود به داده‌های Health Connect اضافه‌شده قبل‌از <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> دسترسی داشته باشد"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"به این برنامه اجازه داده می‌شود به همه داده‌های قبلی Health Connect دسترسی داشته باشد"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"درحال‌حاضر هیچ داده تناسب اندامی خوانده نمی‌شود چون <xliff:g id="APP_NAME">%1$s</xliff:g> هیچ اجازه خواندن روشنی ندارد"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> درحال‌حاضر می‌تواند به داده‌های گذشته سوابق سلامتی شما دسترسی پیدا کند. برای تغییر این مورد، اجازه‌های سابقه سلامتی را برای این برنامه خاموش کنید"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"مدیریت کردن اجازه‌های سابقه سلامتی"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"برای روشن کردن دسترسی پس‌زمینه‌ای یا دسترسی به داده‌های قبلی برای این برنامه، حداقل یک اجازه خواندن را فعال کنید"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"برای روشن کردن دسترسی پس‌زمینه‌ای برای این برنامه، حداقل یک اجازه خواندن را فعال کنید"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"برای روشن کردن دسترسی به داده‌های قبلی برای این برنامه، حداقل یک اجازه خواندن را فعال کنید"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"به این برنامه اجازه داده می‌شود به همه داده‌های قبلی Health Connect دسترسی داشته باشد"</string>
     <string name="background_read_description" msgid="3203594555849969283">"اجازه دادن به این برنامه برای دسترسی به داده‌های Health Connect وقتی از برنامه استفاده نمی‌کنید"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"اگر اجازه دهید، این برنامه می‌تواند وقتی از آن استفاده نمی‌کنید، به داده‌های Health Connect دسترسی داشته باشد."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"دسترسی به داده‌های قبلی"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌دهید به داده‌های قبلی دسترسی داشته باشد؟"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"اجازه دادن به این برنامه برای دسترسی به داده‌های Health Connect اضافه‌شده قبل‌از <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"اجازه دادن به این برنامه برای دسترسی به همه داده‌های قبلی Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"اگر اجازه دهید، این برنامه می‌تواند به داده‌های Health Connect اضافه‌شده قبل‌از <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> دسترسی داشته باشد."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"اگر اجازه دهید، این برنامه می‌تواند به همه داده‌های قبلی Health Connect دسترسی داشته باشد."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"کالری سوزانده‌شده درطول فعالیت"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"کالری سوزانده‌شده درطول فعالیت"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"خواندن کالری سوزانده‌شده درطول فعالیت"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"دفعات هل دادن صندلی چرخدار"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"خواندن داده هل دادن صندلی چرخدار"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"نوشتن داده هل دادن صندلی چرخدار"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"شدت فعالیت"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"شدت فعالیت"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"خواندن شدت فعالیت"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"نوشتن شدت فعالیت"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"سرعت سوخت‌وساز پایه"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"سرعت سوخت‌وساز پایه"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"خواندن داده سرعت سوخت‌وساز پایه"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"دمای پوست"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"خواندن دمای پوست"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"نوشتن دمای پوست"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"این شامل همه سوابق سلامتی همگام‌سازی‌شده با Health Connect و اضافه‌شده به آن می‌شود. این داده‌ها ممکن است سابقه پزشکی کامل شما را دربر نگیرد و شامل شرح پزشکی از سوابق سلامتی شما نیست."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"همه سوابق سلامتی"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"همه سوابق سلامتی"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"نوشتن همه سوابق سلامتی"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"حساسیت‌ها"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"حساسیت‌ها"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"خواندن حساسیت‌ها"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ایمن‌سازی"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ایمن‌سازی"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"خواندن وضعیت ایمن‌سازی"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"نتایج آزمایشگاه"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"نتایج آزمایشگاه"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"خواندن نتایج آزمایشگاه"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"حساسیت‌ها"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"حساسیت‌ها"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"خواندن حساسیت‌ها"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"عارضه‌ها"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"عارضه‌ها"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"خواندن عارضه‌ها"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"واکسن‌ها"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"واکسن‌ها"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"خواندن واکسن‌ها"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"نتایج آزمایشگاه"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"نتایج آزمایشگاه"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"خواندن نتایج آزمایشگاه"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"داروها"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"داروها"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"خواندن داروها"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"جزئیات شخصی"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"جزئیات شخصی"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"خواندن جزئیات شخصی"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"جزئیات درمانگر"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"جزئیات درمانگر"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"خواندن جزئیات درمانگر"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"بارداری"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"بارداری"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"خواندن داده‌های بارداری"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"مشکلات"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"مشکلات"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"خواندن مشکلات"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"اقدامات درمانی"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"اقدامات درمانی"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"خواندن اقدامات درمانی"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"سابقه اجتماعی"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"سابقه اجتماعی"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"سابقه اجتماعی"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"خواندن سابقه اجتماعی"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"علائم حیاتی"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"مراجعه‌ها"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"مراجعه‌ها"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"خواندن مراجعه‌ها"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"علائم حیاتی"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"علائم حیاتی"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"خواندن علائم حیاتی"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"ذهن‌آگاهی"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"نوشتن ذهن‌آگاهی"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"اجازه دادن به «<xliff:g id="APP_NAME">%1$s</xliff:g>» برای خواندن"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"اجازه دادن به «<xliff:g id="APP_NAME">%1$s</xliff:g>» برای نوشتن"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"لغو کردن"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"اجازه دادن"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"مجاز کردن همه موارد"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"اجازه ندادن"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"داده‌هایی را که می‌خواهید این برنامه بخواند یا در Health Connect بنویسد انتخاب کنید"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"داده‌هایی را که می‌خواهید این برنامه بخواند یا در Health Connect بنویسد انتخاب کنید"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"داده‌هایی را که می‌خواهید این برنامه از Health Connect بخواند انتخاب کنید"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"داده‌هایی را که می‌خواهید این برنامه در Health Connect بنویسد انتخاب کنید"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"اگر دسترسی خواندن را اعطا کنید، این برنامه می‌تواند داده‌های جدید و داده‌های ۳۰ روز گذشته را بخواند"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"اگر دسترسی خواندن را اعطا کنید، این برنامه می‌تواند داده‌های جدید و قبلی را بخواند"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه دسترسی به Health Connect داده شود؟"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"در <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> توسعه‌دهنده می‌توانید متوجه شوید <xliff:g id="APP_NAME">%1$s</xliff:g> چگونه از داده‌هایتان استفاده می‌کند"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌دهید به داده‌های تناسب اندام و تندرستی دسترسی داشته باشد؟"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"در <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> می‌توانید ببینید <xliff:g id="APP_NAME">%1$s</xliff:g> چگونه داده‌های شما را مدیریت می‌کند"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"خط‌مشی رازداری"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌دهید به سوابق سلامتی شما دسترسی داشته باشد؟"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"اگر اجازه دسترسی بدهید، این برنامه می‌تواند داده‌هایی مثل حساسیت‌ها، نتایج آزمایشگاه، واکسن‌ها، و موارد دیگر را بخواند و بنویسد\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"اگر اجازه دسترسی بدهید، این برنامه می‌تواند داده‌هایی مثل حساسیت‌ها، نتایج آزمایشگاه، واکسن‌ها، و موارد دیگر را بخواند\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"درباره سوابق سلامتی"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"داده‌هایی که هم‌رسانی می‌شود عبارت‌اند از"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"اگر اجازه دهید، <xliff:g id="APP_NAME">%1$s</xliff:g> می‌تواند سوابق سلامتی شما را با Health Connect هم‌رسانی کند."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"سوابق سلامتی خود را از برنامه‌ها و منابع مختلف همگام‌سازی کنید تا آن‌ها را در یک مکان داشته باشید"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"همه اجازه‌ها برداشته شود؟"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"برداشتن همه موارد"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند هیچ‌کدام از داده‌های Health Connect را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند هیچ‌کدام از داده‌های Health Connect را (ازجمله داده‌های قبلی) بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً مکان، دوربین، یا میکروفون) اثر نمی‌گذارد."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند هیچ‌کدام از داده‌های Health Connect ازجمله داده‌های پس‌زمینه و داده‌های قبلی را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً مکان، دوربین، یا میکروفون) اثر نمی‌گذارد."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"داده‌های <xliff:g id="APP_NAME">%1$s</xliff:g> نیز از Health Connect حذف شود"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"همه اجازه‌ها برداشته شود؟"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"همه اجازه‌های سابقه سلامتی برداشته شود؟"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"همه اجازه‌های تناسب اندام و سلامتی برداشته شود؟"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"داده‌های تناسب اندام <xliff:g id="APP_NAME">%1$s</xliff:g> نیز از Health Connect حذف شود"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"همه اجازه‌های سابقه سلامتی برداشته شود؟"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"سابقه‌های سلامتی <xliff:g id="APP_NAME">%1$s</xliff:g> نیز از Health Connect حذف شود"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند این داده‌های Health Connect را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند این داده‌های Health Connect شامل داده‌های پس‌زمینه را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند این داده‌های Health Connect شامل داده‌های قبلی را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند این داده‌های Health Connect شامل داده‌های پس‌زمینه و داده‌های قبلی را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"همه اجازه‌ها برداشته شود؟"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند داده‌های Health Connect را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند داده‌های Health Connect شامل داده‌های پس‌زمینه را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند داده‌های Health Connect شامل داده‌های قبلی را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> دیگر نمی‌تواند داده‌های Health Connect شامل داده‌های پس‌زمینه و داده‌های قبلی را بخواند یا بنویسد.\n\nاین تنظیم بر دیگر اجازه‌هایی که این برنامه ممکن است داشته باشد (مثلاً دوربین، میکروفون، یا مکان) اثر نمی‌گذارد."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"داده‌های تناسب اندام و سابقه‌های سلامتی <xliff:g id="APP_NAME">%1$s</xliff:g> نیز از Health Connect حذف شود"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"اجازه‌های این برنامه برداشته شد"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"همه داده‌های Health Connect نیز حذف شود"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"روز بعد"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"روز انتخاب‌شده"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"روز قبل"</string>
     <string name="default_error" msgid="7966868260616403475">"مشکلی پیش آمد. لطفاً دوباره امتحان کنید."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"منبع نامشخص"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"داده‌های منبع"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>کروشه باز."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>کروشه بسته."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"‫<xliff:g id="PREFIX">%1$s</xliff:g> فیلد <xliff:g id="FIELD">%2$s</xliff:g> مقدار"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"این برنامه‌ها دیگر دسترسی ندارند، اما همچنان داده ذخیره‌شده در Health Connect دارند"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"‫«<xliff:g id="APP_NAME">%1$s</xliff:g>» می‌تواند داده‌های اضافه‌شده بعداز <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> را بخواند"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"برای مدیریت سایر اجازه‌های Android که این برنامه می‌تواند به آن‌ها دسترسی داشته باشد، به «تنظیمات &gt; برنامه‌ها» بروید"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"داده‌هایی که با <xliff:g id="APP_NAME">%1$s</xliff:g> هم‌رسانی می‌کنید تحت‌پوشش خط‌مشی رازداری آن است"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"در خط‌مشی رازداری توسعه‌دهنده <xliff:g id="APP_NAME">%1$s</xliff:g>، می‌توانید با نحوه مدیریت داده‌هایتان توسط این برنامه آشنا شوید"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"برای مدیریت دیگر اجازه‌های Android که این برنامه می‌تواند به آن‌ها دسترسی داشته باشد، به «تنظیمات» بروید و روی «برنامه‌ها» تک‌ضرب بزنید"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"خواندن خط‌مشی رازداری"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"آخرین دسترسی: در ۲۴ ساعت گذشته"</string>
     <string name="app_access_title" msgid="7137018424885371763">"دسترسی برنامه"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"درحال‌حاضر هیچ برنامه سازگاری نصب نکرده‌اید"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"دسترسی اضافی"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"داده‌های قبلی، داده‌های پس‌زمینه"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"اجازه‌های اضافی این برنامه برداشته شد"</string>
     <string name="permissions_header" msgid="6519976063360071569">"اجازه‌ها"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"تناسب اندام و تندرستی"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"تمرین، خواب، تغذیه، و غیره"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"سوابق سلامتی"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"سوابق سلامتی"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"نتایج آزمایش، داروها، واکسن‌ها، و غیره"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"نتایج آزمایشگاه، داروها، واکسن‌ها و غیره"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"اجازه‌های برنامه‌هایی که برداشته شده‌اند"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect اجازه‌های مربوط به <xliff:g id="APP_DATA">%s</xliff:g> را برداشته است"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect اجازه‌های مربوط به <xliff:g id="APP_DATA_0">%1$s</xliff:g> و <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> را برداشته است"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"رفتن به فروشگاه Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"شروع کار با Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"‏Health Connect داده‌های سلامتی و تناسب اندام شما را ذخیره می‌کند و روشی ساده برای همگام‌سازی برنامه‌های مختلف دستگاه دراختیارتان می‌گذارد"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"‫Health Connect داده‌های سلامتی و تناسب اندام شما را از برنامه‌های مختلف ذخیره و همگام‌سازی می‌کند.\n\n"<b>"داده‌های تناسب اندام و تندرستی،"</b>" ازجمله جلسه‌های تمرین، تعداد قدم‌ها، تغذیه، خواب، و غیره\n\n"<b>"سابقه سلامتی،"</b>" ازجمله واکسن‌ها، نتایج آزمایش، و غیره"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"با Health Connect می‌توانید کارهای زیر را انجام دهید"</string>
     <string name="share_data" msgid="3481932156368883946">"هم‌رسانی داده‌ها با برنامه‌ها"</string>
     <string name="share_data_description" msgid="2919871301634375092">"می‌توانید داده‌هایی را که هر برنامه اجازه دارد در Health Connect بخواند یا بنویسد انتخاب کنید"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"مدیریت تنظیمات و حریم خصوصی"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"خون‌ریزی کم"</string>
     <string name="flow_medium" msgid="3783688724668943154">"خون‌ریزی متوسط"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"خون‌ریزی زیاد"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"جریان نامشخص"</string>
     <string name="period_day" msgid="3821944462093965882">"روز <xliff:g id="DAY">%1$d</xliff:g> از <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> روز عادت ماهانه"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{قاعدگی (۱ روز)}one{قاعدگی (# روز)}other{قاعدگی (# روز)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"مثبت"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"منفی"</string>
     <string name="ovulation_high" msgid="205362931427158291">"بالا"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"موسیقی"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"سایر موارد"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"بدون راهنما"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"متوسط"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"شدید"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> دقیقه"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ساعت و <xliff:g id="MIN">%2$s</xliff:g> دقیقه"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ساعت"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"یکپارچه‌سازی درحال انجام است"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"‫Health Connect درحال ادغام شدن با سیستم Android است.\n\nممکن است مدتی طول بکشد تا داده‌ها و اجازه‌ها منتقل شوند."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"تا وقتی اعلانی مبنی بر تکمیل فرایند دریافت نکرده‌اید برنامه را نبندید."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"یکپارچه‌سازی Health Connect درحال انجام است"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"به‌روزرسانی لازم است"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"‫Health Connect درحال ادغام شدن با سیستم Android است تا بتوانید مستقیماً از تنظیمات به آن دسترسی داشته باشید."</string>
     <string name="update_button" msgid="4544529019832009496">"به‌روزرسانی"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"این به‌روزرسانی را آغاز کنید تا Health Connect بتواند یکپارچه‌سازی با تنظیمات سیستم را ادامه دهد"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"اکنون به‌روز کردن"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"به‌روزرسانی سیستم لازم است"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"قبل‌از ادامه دادن، سیستم تلفنتان را به‌روز کنید."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"اگر قبلاً سیستم تلفن را به‌روز کرده‌اید، تلفن را برای ادامه یکپارچه‌سازی بازراه‌اندازی کنید"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"به‌روزرسانی Health Connect لازم است"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"قبل‌از ادامه دادن، برنامه Health Connect را به جدیدترین نسخه به‌روز کنید."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"فضای بیشتری لازم است"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"برای ادامه یکپارچه‌سازی، Health Connect به <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> فضای ذخیره‌سازی در تلفن نیاز دارد.\n\nمقداری فضا در تلفنتان آزاد کنید و سپس دوباره امتحان کنید."</string>
     <string name="try_again_button" msgid="8745496819992160789">"امتحان مجدد"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"آزاد کردن فضا"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"فضای بیشتری لازم است"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect برای ادامه یکپارچه‌سازی به <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> فضای ذخیره‌سازی در تلفن نیاز دارد."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"یکپارچه‌سازی موقتاً متوقف شد"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"برنامه Health Connect درحین ادغام شدن با سیستم Android بسته شد.\n\nبرای باز کردن مجدد برنامه و ادامه پیدا کردن انتقال داده‌ها و اجازه‌ها، روی «ازسرگیری» کلیک کنید."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"برای حفظ داده‌های Health Connect، این فرایند را ظرف <xliff:g id="TIME_NEEDED">%1$s</xliff:g> آینده تکمیل کنید"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"برای ادامه یکپارچه‌سازی Health Connect با سیستم Android، تک‌ضرب بزنید. برای حفظ داده‌ها، این فرایند را ظرف <xliff:g id="TIME_NEEDED">%1$s</xliff:g> آینده تکمیل کنید"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"برای ادامه یکپارچه‌سازی Health Connect با سیستم Android، تک‌ضرب بزنید."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ادامه"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"ازسرگیری یکپارچه‌سازی Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"برای حفظ داده‌ها، این فرایند را ظرف <xliff:g id="TIME_NEEDED">%1$s</xliff:g> آینده تکمیل کنید"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"به‌روزرسانی برنامه لازم است"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> برای ادامه همگام‌سازی با Health Connect باید به‌روزرسانی شود"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"برخی‌از برنامه‌ها برای ادامه همگام‌سازی با Health Connect باید به‌روزرسانی شوند"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> برای ادامه همگام‌سازی با Health Connect باید به‌روز شود. ممکن است به‌روزرسانی‌ها برای همه برنامه‌ها دردسترس نباشد."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"برخی‌از برنامه‌ها برای ادامه همگام‌سازی با Health Connect باید به‌روز شوند. ممکن است به‌روزرسانی‌ها برای همه برنامه‌ها دردسترس نباشد."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"به‌روزرسانی‌ها را بررسی کنید"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"بیشتر بدانید"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"یکپارچه‌سازی Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"یکپارچه‌سازی Health Connect تکمیل نشد"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"هروقت دوباره دردسترس قرار بگیرد اعلان دریافت خواهید کرد."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"متوجه‌ام"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"یکپارچه‌سازی Health Connect تکمیل نشد"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"خواندن شرح بلندتر"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"یکپارچه‌سازی Health Connect تکمیل شد"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"باز کردن"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"ویژگی‌های جدید"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"اکنون می‌توانید مستقیماً از تنظیمات به Health Connect دسترسی داشته باشید. هروقت خواستید برنامه Health Connect را حذف نصب کنید تا فضای ذخیره‌سازی آزاد شود."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"متوجه‌ام"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ویرایش منابع برنامه"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"پیش‌فرض دستگاه"</string>
     <string name="app_data_title" msgid="6499967982291000837">"داده‌های برنامه"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"داده‌ها از برنامه‌هایی که به Health Connect دسترسی دارند اینجا نشان داده خواهد شد"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"داده‌های «<xliff:g id="APP_NAME">%1$s</xliff:g>» در اینجا نشان داده خواهد شد"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"داده‌های برنامه‌هایی که به Health Connect دسترسی دارند در اینجا نشان داده خواهد شد"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"روز"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"هفته"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"ماه"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ماه گذشته"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ورودی‌ها"</string>
     <string name="tab_access" msgid="7818197975407243701">"دسترسی"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه دسترسی اضافی داده شود؟"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> می‌خواهد به این تنظیمات Health Connect نیز دسترسی داشته باشد"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"برای روشن کردن دسترسی پس‌زمینه‌ای یا دسترسی به داده‌های قبلی برای این برنامه، حداقل یک اجازه خواندن را فعال کنید"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"برای روشن کردن دسترسی پس‌زمینه‌ای برای این برنامه، حداقل یک اجازه خواندن را فعال کنید"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"برای روشن کردن دسترسی به داده‌های قبلی برای این برنامه، حداقل یک اجازه خواندن را فعال کنید"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"استفاده از Health Connect را شروع کنید"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"اولین برنامه‌هایتان را همگام‌سازی کنید تا داده‌های سلامتی و تناسب اندام بین آن‌ها هم‌رسانی شود"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"راه‌اندازی"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"برنامه‌های سازگار را ببینید"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"برنامه‌های بیشتری را برای همگام‌سازی با <xliff:g id="APP_NAME">%s</xliff:g> ازطریق Health Connect پیدا کنید"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"مشاهده در فروشگاه برنامه"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"قفل صفحه تنظیم کنید"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"برای امنیت بیشتر داده‌های سلامتی‌تان، پین، الگو، یا گذرواژه‌ای برای این دستگاه تنظیم کنید"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"تنظیم قفل صفحه"</string>
     <string name="select_all" msgid="837499881590001166">"انتخاب همه"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"برنامه‌های متصل دیگر نمی‌توانند این داده‌ها را از Health Connect بخوانند"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"دارای علامت"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"بدون علامت"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"مسیر نقشه تمرین دردسترس است"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"روز بعدی"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"هفته بعدی"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"ماه بعدی"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"روز قبلی"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"هفته قبلی"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"ماه قبلی"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"همه داده‌ها به‌طور دائمی حذف شود؟"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"داده‌های انتخابی به‌طور دائمی حذف شود؟"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"همه داده‌های «<xliff:g id="APP_NAME">%s</xliff:g>» به‌طور دائمی حذف شود؟"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"ورودی‌های انتخابی «<xliff:g id="APP_NAME">%1$s</xliff:g>» برای هفته <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> به‌طور دائمی حذف شود؟"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"ورودی‌های انتخابی «<xliff:g id="APP_NAME">%1$s</xliff:g>» برای <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> به‌طور دائمی حذف شود؟"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"این ورودی «<xliff:g id="APP_NAME">%s</xliff:g>» به‌طور دائمی حذف شود؟"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"داده‌های <xliff:g id="DATA_TYPE">%1$s</xliff:g> مربوط به «<xliff:g id="APP_NAME">%2$s</xliff:g>» برای همیشه حذف شود؟"</string>
+    <string name="on" msgid="8266542510798355807">"روشن"</string>
+    <string name="off" msgid="6996623844428550649">"خاموش"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"آخرین دسترسی: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"دسترسی در روز گذشته ساعت <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"دسترسی در <xliff:g id="TIME_DATE_0">%1$s</xliff:g> ساعت <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"همیشه مجاز"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"مجاز کردن انتخاب‌ها"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"هنگام استفاده از برنامه"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"رد کردن همه"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌دهید به داده‌های تناسب اندام و تندرستی دسترسی داشته باشد؟"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> درخواست دسترسی به «<xliff:g id="DATA_TYPES">%2$s</xliff:g>» را دارد.\n\nمجاز کردن همه را انتخاب کنید یا آن‌ها را به‌صورت مجزا کنترل کنید."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه دسترسی به <xliff:g id="DATA_TYPE">%2$s</xliff:g> داده شود؟"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"تناسب اندام و تندرستی"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"همیشه"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"درحین استفاده"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"همیشه"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"درحین استفاده"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"«‫<xliff:g id="APP_NAME">%1$s</xliff:g>» می‌تواند <xliff:g id="ALLOW_MODE">%2$s</xliff:g> به همه داده‌های تناسب اندام و سلامتی شما دسترسی داشته باشد"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"مجاز به دسترسی داشتن"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"مجاز به خواندن"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"با این اجازه‌ها «<xliff:g id="APP_NAME">%1$s</xliff:g>» می‌تواند به داده‌ها از حسگرهای دستگاهتان دسترسی داشته باشد."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"‫<xliff:g id="NUMBER_0">%1$d</xliff:g> برنامه از <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> برنامه مجاز است"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"برنامه‌ای درخواست نکرده است"</string>
+    <string name="allowed" msgid="4158456017482263737">"مجاز"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"مجاز نبودن"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"برنامه‌های دارای این اجازه می‌توانند به داده‌های <xliff:g id="DATA_TYPE">%s</xliff:g> از حسگرهای دستگاهتان دسترسی داشته باشند."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"دسترسی به <xliff:g id="DATA_TYPE">%s</xliff:g> برای همه برنامه‌های روی ساعت برداشته شود؟"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"علامت تأیید"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"علامت ضربدر"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"درحال‌حاضر <xliff:g id="APP_NAME">%1$s</xliff:g> می‌تواند <xliff:g id="ALLOW_MODE">%2$s</xliff:g> به داده‌های تناسب اندام و تندرستی دسترسی داشته باشد"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"به <xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌دهید همیشه به داده‌های تناسب اندام و تندرستی دسترسی داشته باشد؟"</string>
+    <string name="current_access" msgid="1457167070428176139">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> به <xliff:g id="DATA_TYPES">%2$s</xliff:g> دسترسی دارد."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"مدیریت اجازه‌های تناسب اندام و تندرستی"</string>
 </resources>
diff --git a/apk/res/values-fi/strings.xml b/apk/res/values-fi/strings.xml
index 051aa51..4e69343 100644
--- a/apk/res/values-fi/strings.xml
+++ b/apk/res/values-fi/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Hallinnoi terveys‑ ja kuntoiludataa laitteellasi ja valitse, millä sovelluksilla on pääsy dataan"</string>
     <string name="data_title" msgid="4456619761533380816">"Data ja pääsyoikeudet"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Selaa terveystietoja"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Näytä terveystietosi ja sovellukset, joilla on pääsy niihin"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Kaikki kategoriat"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Katso kaikki kategoriat"</string>
     <string name="no_data" msgid="1906986019249068659">"Ei dataa"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Eilen"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Luettu: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Kirjoitettu: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Muuta lupia"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Aika: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Treeni"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"pääsy terveysdataan"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Lukea poltetut kalorit"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Sallii sovelluksen lukea dataa poltetuista kaloreista"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Pääsy dataan taustalla"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Voiko <xliff:g id="APP_NAME">%1$s</xliff:g> saada pääsyn dataan taustalla?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> pääsyn dataan taustalla?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn liikunta- ja hyvinvointidataan sekä terveystietoihin, kun et käytä sovellusta."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn terveystietoihin, kun et käytä sovellusta."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn kunto- ja hyvinvointidataan, kun et käytä sovellusta."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn Health Connectin dataan, kun et käytä sovellusta."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> pääsyn aiempaan dataan?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn liikunta‑ ja hyvinvointidataan, joka on lisätty ennen <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn kaikkeen aiempaan liikunta‑ ja hyvinvointidataan."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn Health Connectin dataan, joka on lisätty ennen <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn kaikkeen aiempaan Health Connectin dataan."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> lisäpääsyoikeudet?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> haluaa myös pääsyn näihin Health Connectin asetuksiin"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Pääsy kaikkeen dataan taustalla"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Pääsy terveystietoihin taustalla"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Pääsy liikunta‑ ja hyvinvointidataan taustalla"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Salli sovellukselle pääsy kunto‑ ja hyvinvointidataan sekä terveystietoihin, kun et käytä sovellusta"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Salli sovelluksen käyttää tätä dataa, kun et käytä sovellusta"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Salli sovelluksen käyttää tätä dataa, kun et käytä sovellusta"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Pääsy dataan taustalla"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Kun et käytä sovellusta, salli sille pääsy Health Connectin dataan"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Pääsy aiempaan liikunta‑ ja hyvinvointidataan"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Salli sovellukselle pääsy dataan, joka on lisätty ennen <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Salli sovellukselle pääsy aiempaan dataan"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Pääsy aiempaan dataan"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Salli sovellukselle pääsy Health Connectin dataan, joka on lisätty ennen <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Salli sovellukselle pääsy aiempaan Health Connectin dataan"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> voi jo nyt käyttää aiempaa terveystietojesi dataa"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Lue lisää luvista"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Pääsy kaikkeen dataan taustalla"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Pääsy terveystietoihin taustalla"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Pääsy liikunta‑ ja hyvinvointidataan taustalla"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Salli sovellukselle pääsy kunto‑ ja hyvinvointidataan sekä terveystietoihin, kun et käytä sovellusta"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Salli sovelluksen käyttää tätä dataa, kun et käytä sovellusta"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Salli sovelluksen käyttää tätä dataa, kun et käytä sovellusta"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Pääsy dataan taustalla"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Kun et käytä sovellusta, salli sille pääsy Health Connectin dataan"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Pääsy aiempaan liikunta‑ ja hyvinvointidataan"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Salli sovellukselle pääsy dataan, joka on lisätty ennen <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Salli sovellukselle pääsy aiempaan dataan"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Pääsy aiempaan dataan"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Salli sovellukselle pääsy Health Connectin dataan, joka on lisätty ennen <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Salli sovellukselle pääsy aiempaan Health Connectin dataan"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Liikuntadataa ei tällä hetkellä lueta, koska <xliff:g id="APP_NAME">%1$s</xliff:g> ei ole saanut luvaluvat:"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> voi jo nyt käyttää aiempaa terveystietojesi dataa. Jos haluat muuttaa tätä, laita sovelluksen terveystietojen käyttöoikeudet pois päältä"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Ylläpidä terveystietolupia"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Ota käyttöön vähintään yksi lukuoikeus, jotta taustakäyttöoikeudet tai aiemmat pääsyoikeudet dataan voidaan laittaa päälle tälle sovellukselle"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Ota käyttöön vähintään yksi lukuoikeus, jotta taustakäyttöoikeudet voidaan laittaa päälle tälle sovellukselle"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Ota käyttöön vähintään yksi lukuoikeus, jotta aiemmat pääsyoikeudet voidaan laittaa päälle tälle sovellukselle"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Salli sovellukselle pääsy aiempaan Health Connectin dataan"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Kun et käytä sovellusta, salli sille pääsy Health Connectin dataan"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn Health Connectin dataan, kun et käytä sovellusta."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Pääsy aiempaan dataan"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Voiko <xliff:g id="APP_NAME">%1$s</xliff:g> saada pääsyn aiempaan dataan?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Salli sovellukselle pääsy Health Connectin dataan, joka on lisätty ennen <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Salli sovellukselle pääsy aiempaan Health Connectin dataan"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn Health Connectin dataan, joka on lisätty ennen <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Jos sallit pääsyoikeudet, tämä sovellus saa pääsyn kaikkeen aiempaan Health Connectin dataan."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Liikunnan aikana poltetut kalorit"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"liikunnan aikana poltetut kalorit"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Lukee liikunnan aikana poltetut kalorit"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"pyörätuolin työnnöt"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Lukee dataa pyörätuolin työnnöistä"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Kirjoittaa dataa pyörätuolin työnnöistä"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Treenin intensiteetti"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"treenin intensiteetti"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Lukea dataa treenin intensiteetistä"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Kirjoittaa dataa treenin intensiteetistä"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Perusaineenvaihdunta"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"perusaineenvaihdunta"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Lukee dataa perusaineenvaihdunnasta"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ihon lämpötila"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Lue ihon lämpötila"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Kirjoita ihon lämpötila"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Tämä koskee kaikkia Health Connectiin synkronoituja ja lisättyjä terveystietoja. Niihin ei välttämättä kuulu kaikkia terveystietojasi, eivätkä ne sisällä terveystietojesi lääketieteellistä kuvausta."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Kaikki terveystiedot"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"kaikki terveystiedot"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Kirjoita kaikki terveystiedot"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergiat"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergiat"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lukee allergiadataa"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunisaatio"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunisaatio"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Lue immunisaatio"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratoriotulokset"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratoriotulokset"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Lukee laboratoriotuloksia"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergiat"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergiat"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Lukee allergiadataa"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Sairaudet"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"sairaudet"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Lukee sairauksia"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Rokotteet"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"rokotteet"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Lukee rokotedataa"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratoriotulokset"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratoriotulokset"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Lukee laboratoriotuloksia"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Lääkitys"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"lääkitys"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Lukee lääkkeitä"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Henkilökohtaiset tiedot"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"henkilökohtaiset tiedot"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Lukee henkilökohtaisia tietoja"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"terveydenhuollon ammattilaisen tiedot"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"terveydenhuollon ammattilaisen tiedot"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Lukee terveydenhuollon ammattilaisten tietoja"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Raskaus"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"raskaus"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Lukee raskausdataa"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Ongelmat"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ongelmat"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Lukee ongelmia"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Toimenpiteet"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"toimenpiteet"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Lukee toimenpiteitä"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sosiaalihistoria"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Somehistoria"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"Sosiaalihistoria"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Lukee sosiaalisen historian dataa"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Elintoiminnot"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Käynnit"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"käynnit"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Lukee käyntejä"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Elintoiminnot"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"elintoiminnot"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Lukee elintoimintoja"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Kirjoita mindfulnessdataa"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Salli sovelluksen “<xliff:g id="APP_NAME">%1$s</xliff:g>” lukea"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Salli sovelluksen “<xliff:g id="APP_NAME">%1$s</xliff:g>” kirjoittaa"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Peru"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Salli"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Salli kaikki"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Älä salli"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Valitse, mitä Health Connect dataa‑ haluat sovelluksen kirjoittavan tai lukevan"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Valitse, mitä Health Connect dataa‑ haluat sovelluksen kirjoittavan tai lukevan"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Valitse, mitä Health Connect dataa haluat sovelluksen lukevan"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Valitse, mitä dataa haluat sovelluksen kirjoittavan Health Connectiin"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Jos annat lukupääsyoikeudet, sovellus voi lukea uutta dataa ja dataa 30 viime päivältä"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Jos annat lukupääsyoikeudet, sovellus voi lukea uutta ja aiempaa dataa"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> pääsyn Health Connectiin?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Voit lukea <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> siitä, miten <xliff:g id="APP_NAME">%1$s</xliff:g> käsittelee dataasi"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> pääsyn liikunta‑ ja hyvinvointidataan?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Voit lukea <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> siitä, miten <xliff:g id="APP_NAME">%1$s</xliff:g> käsittelee dataasi"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"tietosuojakäytännöstä"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> pääsyn terveystietoihisi?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Jos myönnät pääsyn, sovellus voi lukea ja kirjoittaa dataa, kuten tietoja allergioista, laboratoriotuloksista ja rokotteista\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Jos myönnät pääsyn, sovellus voi lukea dataa, kuten tietoja allergioista, laboratoriotuloksista ja rokotteista\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Tietoja terveystiedoista"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Jaettavaan dataan sisältyvät datatyypit"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Jos sallit sen, <xliff:g id="APP_NAME">%1$s</xliff:g> voi jakaa terveystietojasi Health Connectille."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synkronoi terveystietosi eri sovelluksista ja lähteistä, jotta ne pysyvät yhdessä paikassa"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Poistetaanko kaikki luvat?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Poista kaikki"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa mitään Health Connectin dataa.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera-, mikrofoni- tai sijaintilupaan."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa mitään Health Connectin dataa, mukaan lukien aiempaa dataa.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten sijainti-, kamera- tai mikrofonilupaan."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa mitään Health Connectin dataa, mukaan lukien taustatietoja ja aiempaa data.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten sijainti-, kamera- tai mikrofonilupaan."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Poista Health Connectista myös tämä data: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Poistetaanko kaikki luvat?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Poistetaanko kaikki terveystietoluvat?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Poistetaanko kaikki liikunta‑ ja hyvinvointiluvat?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Poista Health Connectista myös kuntodata, joka on peräisin täältä: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Poistetaanko kaikki terveystietoluvat?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Poista Health Connectista myös terveystiedot, jotka ovat peräisin täältä: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa tätä dataa Health Connectista.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera-, mikrofoni- tai sijaintilupaan."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa Health Connectista tätä dataa, mukaan lukien taustatietoja.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera‑, mikrofoni‑ tai sijaintilupiin."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa Health Connectista tätä dataa, mukaan lukien aiempaa dataa.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera‑, mikrofoni‑ tai sijaintilupiin."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa Health Connectista tätä dataa, mukaan lukien taustatietoja ja aiempaa dataa.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera‑, mikrofoni‑ tai sijaintilupiin."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Poistetaanko kaikki luvat?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa mitään Health Connectin dataa.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera‑, mikrofoni‑ tai sijaintilupiin."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa dataa Health Connectista, mukaan lukien taustatietoja.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera‑, mikrofoni‑ tai sijaintilupiin."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa dataa Health Connectista, mukaan lukien aiempaa dataa.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera‑, mikrofoni‑ tai sijaintilupiin."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi enää lukea tai kirjoittaa dataa Health Connectista, mukaan lukien taustatietoja ja aiempaa dataa.\n\nTämä ei vaikuta sovelluksen muihin lupiin, kuten kamera‑, mikrofoni‑ tai sijaintilupiin."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Poista Health Connectista myös kuntodata ja terveystiedot, jotka ovat peräisin sovelluksesta <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Sovelluksen luvat poistettu"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Poista myös kaikki Health Connectin data"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Seuraava päivä"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Valittu päivä"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Edellinen päivä"</string>
     <string name="default_error" msgid="7966868260616403475">"Jotain meni pieleen. Yritä uudelleen."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Tuntematon resurssi"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Lähdedata"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Aloittava sulje."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Lopettava sulje."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> (kenttä) <xliff:g id="FIELD">%2$s</xliff:g> (arvo)"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Näillä sovelluksilla ei ole enää pääsyoikeuksia, mutta niillä on edelleen Health Connectiin tallennettua dataa"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> voi lukea <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> jälkeen lisättyä dataa"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Jos haluat muuttaa muita Android-lupia, jotka sovellukselle on myönnetty, valitse Asetukset &gt; Sovellukset"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Sovellukselle (<xliff:g id="APP_NAME">%1$s</xliff:g>) jakamaasi dataa käsitellään sovelluksen tietosuojakäytännön mukaisesti"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Katso kehittäjän tietosuojakäytännöstä, miten <xliff:g id="APP_NAME">%1$s</xliff:g> käsittelee dataasi"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Jos haluat muuttaa muita Android-lupia, jotka sovellukselle on myönnetty, valitse Asetukset ja sitten Sovellukset"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Lue tietosuojakäytäntö"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Käytetty 24 viime tunnin aikana"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Sovellusten pääsyoikeudet"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Sinulla ei ole tällä hetkellä asennettuna yhteensopivia sovelluksia"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Lisäluvat"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Aiempi data, taustatiedot"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Sovelluksen lisäluvat poistettu"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Luvat"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Kuntoilu ja hyvinvointi"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Treenit, uni, ravitsemus ym."</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Terveystiedot"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"terveystiedot"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Labratulokset, lääkitys, rokotukset ym."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Labratulokset, lääkkeet yms."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Poistetut sovellusluvat"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect poisti luvat sovellukselta: <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect poisti luvat näiltä: <xliff:g id="APP_DATA_0">%1$s</xliff:g> ja <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Siirry Play Kauppaan"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Aloita Health Connectin käyttö"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect tallentaa terveys‑ ja kuntodatasi ja tarjoaa helpon tavan synkronoida eri sovelluksia laitteellasi"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect tallentaa ja synkronoi terveys- ja kuntoiludataa eri sovelluksista.\n\n"<b>"Kuntoilu- ja hyvinvointidata,"</b>" esim. treenit, askeleet, ravinto ja uni\n\n"<b>"Terveystiedot,"</b>" esim. rokotukset ja laboratoriotulokset"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connectilla voit tehdä seuraavia asioita"</string>
     <string name="share_data" msgid="3481932156368883946">"Jaa dataa sovelluksille"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Valitse, mitä dataa kukin sovellus voi lukea tai kirjoittaa Health Connectiin"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Tee asetus- ja yksityisyysvalinnat"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Niukka vuoto"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Keskirunsas vuoto"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Runsas vuoto"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Ei tietoja vuodosta"</string>
     <string name="period_day" msgid="3821944462093965882">"Kuukautisten päivä <xliff:g id="DAY">%1$d</xliff:g>/<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Kuukautiset (1 päivä)}other{Kuukautiset (# päivää)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiivinen"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatiivinen"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Korkea"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musiikki"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Muu"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Ohjaamaton"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Kohtalainen"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Raskas"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> t <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> t"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrointi käynnissä"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect integroidaan Android-järjestelmään.\n\nDatan ja lupien siirtämisessä voi mennä jonkin aikaa."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Älä sulje sovellusta, ennen kuin saat ilmoituksen, että prosessi on valmis."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connectin integrointi käynnissä"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Päivitys tarvitaan"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connectia integroidaan Android-järjestelmään, jotta saat pääsyn siihen suoraan asetuksista."</string>
     <string name="update_button" msgid="4544529019832009496">"Päivitä"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Aloita päivitys, jotta Health Connect voi jatkaa integrointia järjestelmäasetuksiin"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Päivitä nyt"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Järjestelmä täytyy päivittää"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Ennen kuin jatkat, päivitä puhelinjärjestelmä."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Jos olet jo päivittänyt puhelinjärjestelmän, kokeile uudelleenkäynnistää puhelin, jotta integrointia voidaan jatkaa"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect täytyy päivittää"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Ennen kuin jatkat, päivitä Health Connect ‑sovellus uusimpaan versioon."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Lisää tallennustilaa tarvitaan"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect tarvitsee <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> tallennustilaa puhelimella, jotta integrointia voidaan jatkaa.\n\nVapauta tilaa puhelimella ja yritä sitten uudelleen."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Yritä uudelleen"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Vapauta tilaa"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Lisää tallennustilaa tarvitaan"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect tarvitsee <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> tallennustilaa puhelimella, jotta integrointia voidaan jatkaa."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrointi keskeytetty"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ‑sovellus sulkeutui, kun sitä integroitiin Android-järjestelmään.\n\nAvaa sovellus uudelleen ja jatka datan ja lupien siirtämistä klikkaamalla \"Jatka\"."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Jos haluat säilyttää Health Connect ‑datan, sinulla on <xliff:g id="TIME_NEEDED">%1$s</xliff:g> aikaa tehdä integrointi"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Jatka Health Connectin integrointia Android-järjestelmään napauttamalla. Jos haluat säilyttää datasi, sinulla on <xliff:g id="TIME_NEEDED">%1$s</xliff:g> aikaa tehdä integrointi"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Jatka Health Connectin integrointia Android-järjestelmään napauttamalla."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Jatka"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Jatka Health Connectin integrointia"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Jos haluat säilyttää datasi, sinulla on <xliff:g id="TIME_NEEDED">%1$s</xliff:g> aikaa tehdä integrointi"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Sovellus täytyy päivittää"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> täytyy päivittää, jotta voit jatkaa Health Connectin kanssa synkronoimista"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Jotkin sovellukset on päivitettävä, jotta voit jatkaa Health Connectin kanssa synkronoimista"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> on päivitettävä, jotta voit jatkaa Health Connectin kanssa synkronoimista Päivityksiä ei ehkä ole saatavilla kaikille sovelluksille."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Jotkin sovellukset on päivitettävä, jotta voit jatkaa Health Connectin kanssa synkronoimista Päivityksiä ei ehkä ole saatavilla kaikille sovelluksille."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Tarkista päivitykset"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Lue lisää"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connectin integrointi"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connectin integrointia ei suoritettu loppuun"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Saat ilmoituksen, kun se on taas saatavilla."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connectin integrointia ei suoritettu loppuun"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Lue lisää"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connectin integrointi valmis"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Avaa"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Uutta"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Voit nyt käyttää Health Connectia suoraan asetuksista. Voit poistaa Health Connect ‑sovelluksen milloin tahansa vapauttaaksesi tallennustilaa."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Muokkaa sovelluslähteitä"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Laitteen oletusasetus"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Sovellusdata"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Täällä näkyy data sovelluksilta, joilla on pääsy Health Connectiin"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data, jonka lähteenä on <xliff:g id="APP_NAME">%1$s</xliff:g>, näkyy täällä"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Täällä näkyy data sovelluksilta, joilla on pääsy Health Connectiin"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Päivä"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Viikko"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Kuukausi"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Viime kuukausi"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Merkinnät"</string>
     <string name="tab_access" msgid="7818197975407243701">"Pääsy"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Voiko <xliff:g id="APP_NAME">%1$s</xliff:g> saada lisäpääsyoikeudet?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> haluaa myös pääsyn näihin Health Connectin asetuksiin"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Ota käyttöön vähintään yksi lukuoikeus, jotta taustakäyttöoikeudet tai aiemmat pääsyoikeudet dataan voidaan laittaa päälle tälle sovellukselle"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Ota käyttöön vähintään yksi lukuoikeus, jotta taustakäyttöoikeudet voidaan laittaa päälle tälle sovellukselle"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Ota käyttöön vähintään yksi lukuoikeus, jotta aiemmat pääsyoikeudet voidaan laittaa päälle tälle sovellukselle"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Aloita Health Connectin käyttö"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synkronoi ensimmäiset sovellukset, jotta voit jakaa terveys- ja kuntoiludataa niiden välillä"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Ota käyttöön"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Näytä yhteensopivat sovellukset"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Etsi lisää sovelluksia, joiden kanssa <xliff:g id="APP_NAME">%s</xliff:g> voidaan synkronoida Health Connectin kautta"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Näytä sovelluskaupassa"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Aseta näytön lukitus"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Paranna terveysdatan suojausta valitsemalla laitteelle PIN-koodi, kuvio tai salasana"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Aseta näytön lukitus"</string>
     <string name="select_all" msgid="837499881590001166">"Valitse kaikki"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Yhdistetyt sovellukset eivät enää voi lukea tätä dataa Health Connectin kautta"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Valittu"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Ei valittu"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Treenireitti saatavilla kartalla"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Seuraava päivä"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Ensi viikko"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Seuraava kuukausi"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Edellinen päivä"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Edellinen viikko"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Edellinen kuukausi"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Poistetaanko kaikki data pysyvästi?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Poistetaanko valittu data pysyvästi?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Poistetaanko kaikki data (<xliff:g id="APP_NAME">%s</xliff:g>) pysyvästi?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Poistetaanko valitut viikolla <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> tehdyt merkinnät (<xliff:g id="APP_NAME">%1$s</xliff:g>)?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Poistetaanko valitut <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> tehdyt merkinnät (<xliff:g id="APP_NAME">%1$s</xliff:g>) pysyvästi?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Poistetaanko <xliff:g id="APP_NAME">%s</xliff:g> pysyvästi?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Poistetaanko <xliff:g id="DATA_TYPE">%1$s</xliff:g> ‑data pysyvästi (<xliff:g id="APP_NAME">%2$s</xliff:g>)?"</string>
+    <string name="on" msgid="8266542510798355807">"Päällä"</string>
+    <string name="off" msgid="6996623844428550649">"Pois päältä"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Avattu <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Avattu eilen klo <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Avattu <xliff:g id="TIME_DATE_0">%1$s</xliff:g> klo <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Salli aina"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Salli valitut"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Sovellusta käytettäessä"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Estä kaikki"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> pääsyn liikunta‑ ja hyvinvointidataan?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää pääsyä näihin: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nSalli pääsy kaikille tai muuta pääsyoikeuksia yksitellen."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> pääsyn (<xliff:g id="DATA_TYPE">%2$s</xliff:g>)?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Kuntoilu ja hyvinvointi"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"aina"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"käytön aikana"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Aina"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Käytön aikana"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> saa pääsyn kaikkeen liikunta- ja hyvinvointidataasi <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Pääsy sallittu"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Lukeminen sallittu"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Näillä luvilla <xliff:g id="APP_NAME">%1$s</xliff:g> saa pääsyn laitteen antureista saatavaan dataan."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> sovelluksella lupa"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ei lupaa pyytäviä sovelluksia"</string>
+    <string name="allowed" msgid="4158456017482263737">"Sallittu"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Ei sallittu"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Sovellukset, joilla on tämä lupa, voivat käyttää laitteen antureista saatavaa dataa (<xliff:g id="DATA_TYPE">%s</xliff:g>)."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Poistetaanko pääsyoikeus (<xliff:g id="DATA_TYPE">%s</xliff:g>) kaikilta kellon sovelluksilta?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Valintamerkki"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Ristimerkki"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Tällä hetkellä <xliff:g id="APP_NAME">%1$s</xliff:g> pääsee liikunta- ja hyvinvointidataan <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Saako <xliff:g id="APP_NAME">%1$s</xliff:g> aina pääsyn liikunta- ja hyvinvointidataan?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> pääsee näihin: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Ylläpidä liikunta- ja hyvinvointilupia"</string>
 </resources>
diff --git a/apk/res/values-fr-feminine/strings.xml b/apk/res/values-fr-feminine/strings.xml
new file mode 100644
index 0000000..1c7729f
--- /dev/null
+++ b/apk/res/values-fr-feminine/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright (C) 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sleep_stage_awake" msgid="4526767634444460862">"éveillée"</string>
+    <string name="sleep_stage_awake_in_bed" msgid="5533385496857888503">"éveillée au lit"</string>
+    <string name="sleep_stage_sleeping" msgid="5122840110107303518">"endormie"</string>
+    <string name="body_position_reclining" msgid="5676889701646839079">"Allongée"</string>
+</resources>
diff --git a/apk/res/values-fr-masculine/strings.xml b/apk/res/values-fr-masculine/strings.xml
new file mode 100644
index 0000000..74e94c4
--- /dev/null
+++ b/apk/res/values-fr-masculine/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright (C) 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sleep_stage_awake" msgid="4526767634444460862">"éveillé"</string>
+    <string name="sleep_stage_awake_in_bed" msgid="5533385496857888503">"éveillé au lit"</string>
+    <string name="sleep_stage_sleeping" msgid="5122840110107303518">"endormi"</string>
+    <string name="body_position_reclining" msgid="5676889701646839079">"Allongé"</string>
+</resources>
diff --git a/apk/res/values-fr-neuter/strings.xml b/apk/res/values-fr-neuter/strings.xml
new file mode 100644
index 0000000..71a3271
--- /dev/null
+++ b/apk/res/values-fr-neuter/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright (C) 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sleep_stage_awake" msgid="4526767634444460862">"éveillé·e"</string>
+    <string name="sleep_stage_awake_in_bed" msgid="5533385496857888503">"éveillé·e, au lit"</string>
+    <string name="sleep_stage_sleeping" msgid="5122840110107303518">"endormi·e"</string>
+    <string name="body_position_reclining" msgid="5676889701646839079">"Allongé·e"</string>
+</resources>
diff --git a/apk/res/values-fr-rCA/strings.xml b/apk/res/values-fr-rCA/strings.xml
index 3814750..7cfdfce 100644
--- a/apk/res/values-fr-rCA/strings.xml
+++ b/apk/res/values-fr-rCA/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Gérez les données de santé et d\'activité physique sur votre téléphone, et contrôlez les applis qui peuvent y accéder"</string>
     <string name="data_title" msgid="4456619761533380816">"Données et accès"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Consulter les dossiers médicaux"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Consulter vos dossiers médicaux et les applis qui peuvent y accéder"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Toutes les catégories"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Afficher toutes les catégories"</string>
     <string name="no_data" msgid="1906986019249068659">"Aucune donnée"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Hier"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lecture : <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Écriture : <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Gérer les autorisations"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Heure : <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activité"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"accéder à vos données de santé"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Lire les calories brûlées"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Autorise l\'appli à lire les calories brûlées"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Accéder aux données en arrière-plan"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données en arrière-plan?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données en arrière-plan?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Si vous l\'autorisez, cette appli peut accéder aux données d\'activité physique et de bien-être ainsi qu\'aux dossiers médicaux lorsque vous ne l\'utilisez pas."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Si vous l\'autorisez, cette appli peut accéder aux dossiers médicaux lorsque vous ne l\'utilisez pas."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Si vous l\'autorisez, cette appli peut accéder aux données d\'activité physique et de bien-être lorsque vous ne l\'utilisez pas."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Si vous l\'autorisez, cette appli peut accéder aux données de Connexion santé lorsque vous ne l\'utilisez pas."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données antérieures?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Si vous l\'autorisez, cette appli peut accéder aux données d\'activité physique et de bien-être ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Si vous l\'autorisez, cette appli peut accéder à toutes les données antérieures d\'activité physique et de bien-être."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Si vous l\'autorisez, cette appli peut accéder aux données de Connexion santé ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Si vous l\'autorisez, cette appli peut accéder à toutes les données antérieures de Connexion santé."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Autoriser un accès supplémentaire pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> veut également accéder à ces paramètres de Connexion santé"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Accéder à toutes les données en arrière-plan"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Accéder aux dossiers médicaux en arrière-plan"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Accéder aux données d\'activité physique et de bien-être en arrière-plan"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Autorisez cette appli à accéder aux données d\'activité physique et de bien-être ainsi qu\'aux dossiers médicaux lorsque vous n\'utilisez pas l\'appli"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Autorisez cette appli à accéder à ces données lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Autorisez cette appli à accéder à ces données lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Accéder aux données en arrière-plan"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Autorisez cette appli à accéder aux données de Connexion santé lorsque vous n\'utilisez pas l\'appli"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Accéder aux données antérieures d\'activité physique et de bien-être"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Autorisez cette appli à accéder aux données ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Autorisez cette appli à accéder à toutes les données antérieures"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Accéder aux données antérieures"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Autorisez cette appli à accéder aux données de Connexion santé ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Autorisez cette appli à accéder à toutes les données antérieures de Connexion santé"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut déjà accéder aux données antérieures de vos dossiers médicaux"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"En savoir plus sur les autorisations"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Accéder à toutes les données en arrière-plan"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Accéder aux dossiers médicaux en arrière-plan"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Accéder aux données d\'activité physique et de bien-être en arrière-plan"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Autorisez cette appli à accéder aux données d\'activité physique et de bien-être ainsi qu\'aux dossiers médicaux lorsque vous n\'utilisez pas l\'appli"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Autorisez cette appli à accéder à ces données lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Autorisez cette appli à accéder à ces données lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Accéder aux données en arrière-plan"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Autorisez cette appli à accéder aux données de Connexion santé lorsque vous n\'utilisez pas l\'appli"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Accéder aux données antérieures d\'activité physique et de bien-être"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Autorisez cette appli à accéder aux données ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Autorisez cette appli à accéder à toutes les données antérieures"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Accéder aux données antérieures"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Autorisez cette appli à accéder aux données de Connexion santé ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Autorisez cette appli à accéder à toutes les données antérieures de Connexion santé"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Aucune donnée d\'activité physique n\'est actuellement lue, car aucune autorisation de lecture n\'est activée pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut déjà accéder aux données passées de vos dossiers médicaux. Pour modifier cela, désactivez les autorisations du dossier médical pour cette appli"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Gérer les autorisations de dossier médical"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Activez au moins une autorisation de lecture afin de permettre l\'accès en arrière-plan ou aux données antérieures pour cette appli"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Activez au moins une autorisation de lecture afin de permettre l\'accès en arrière-plan pour cette appli"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Activez au moins une autorisation de lecture afin de permettre l\'accès aux données antérieures pour cette appli"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Autorisez cette appli à accéder à toutes les données antérieures de Connexion santé"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Autorisez cette appli à accéder aux données de Connexion santé lorsque vous n\'utilisez pas l\'appli"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Si vous l\'autorisez, cette appli peut accéder aux données de Connexion santé lorsque vous n\'utilisez pas l\'appli."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Accéder aux données antérieures"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données antérieures?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Autorisez cette appli à accéder aux données de Connexion santé ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Autorisez cette appli à accéder à toutes les données antérieures de Connexion santé"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Si vous l\'autorisez, cette appli peut accéder aux données de Connexion santé ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Si vous donnez votre autorisation, cette appli peut accéder à toutes les données antérieures de Connexion santé."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calories actives brûlées"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"les calories actives brûlées"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Lecture des données relatives aux calories actives brûlées"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"les poussées de fauteuil roulant"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Lecture des données relatives aux poussées de fauteuil roulant"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Écriture des données relatives aux poussées de fauteuil roulant"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensité de l\'activité"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensité de l\'activité"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Lire des données relatives à l\'intensité de l\'activité"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Écriture des données relatives à l\'intensité de l\'activité"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Métabolisme de base"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"le métabolisme de base"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Lecture des données relatives au métabolisme de base"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"température cutanée"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Lire la température cutanée"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Écrire la température cutanée"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Cela comprend tous les dossiers médicaux synchronisés avec Connexion santé et qui y sont ajoutés. Il ne s\'agit pas nécessairement de l\'intégralité de votre dossier médical, et aucune description médicale de vos dossiers médicaux n\'est incluse."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Tous les dossiers médicaux"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"tous les dossiers médicaux"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Rédigez tous les dossiers médicaux"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergies"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergies"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lecture des données relatives aux allergies"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunisation"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunisation"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Lire les données d\'immunisation"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Résultats de laboratoire"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"résultats de laboratoire"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Lecture des résultats de laboratoire"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergies"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergies"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Lecture des données relatives aux allergies"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Problèmes de santé"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"problèmes de santé"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Lire les données relatives aux problèmes de santé"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccins"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccins"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Lecture des données relatives aux vaccins"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Résultats de laboratoire"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"résultats de laboratoire"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Lecture des données relatives aux résultats de laboratoire"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Médicaments"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"médicaments"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Lire les médicaments"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Renseignements personnels"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"renseignements personnels"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Lire des renseignements personnels"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Données relatives au praticien"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"données relatives au praticien"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Lire des données relatives au praticien"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Grossesse"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"grossesse"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Lecture des données de grossesse"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problèmes"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problèmes"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Lecture des problèmes"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procédures"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procédures"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Lecture des procédures"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Histoire sociale"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Habitudes"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"histoire sociale"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Lecture de l\'histoire sociale"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Signes vitaux"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visites"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visites"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Lire des données relatives aux visites"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Signes vitaux"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"signes vitaux"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Lecture des signes vitaux"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Pleine conscience"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Écriture de la pleine conscience"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Autoriser la lecture des données par « <xliff:g id="APP_NAME">%1$s</xliff:g> »"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Autoriser l\'écriture des données par « <xliff:g id="APP_NAME">%1$s</xliff:g> »"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Annuler"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Autoriser"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Tout autoriser"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ne pas autoriser"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Choisissez les données que vous souhaitez que cette appli puisse lire ou écrire dans Connexion santé"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Choisissez les données que vous voulez que cette appli puisse lire ou écrire dans Connexion santé"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Choisissez les données que vous voulez que l\'appli puisse lire dans Connexion santé"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Choisissez les données que vous voulez que cette appli puisse écrire dans Connexion santé"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Lorsque vous accordez l\'accès à la lecture des données, l\'appli peut lire les nouvelles données et celles des 30 derniers jours"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Lorsque vous accordez l\'accès à la lecture des données, l\'appli peut lire les nouvelles données et les données antérieures"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à Connexion santé?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Vous pouvez découvrir comment <xliff:g id="APP_NAME">%1$s</xliff:g> traite vos données en consultant la <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> du développeur"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données antérieures d\'activité physique et de bien-être?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Vous pouvez découvrir comment <xliff:g id="APP_NAME">%1$s</xliff:g> traite vos données en consultant sa <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"politique de confidentialité"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à vos dossiers médicaux?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Si vous donnez l\'accès, l\'appli pourra lire et écrire des données telles que celles concernant les allergies, les résultats de laboratoire, les vaccins et plus\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Si vous donnez l\'accès, l\'appli pourra lire des données telles que celles concernant les allergies, les résultats de laboratoire, les vaccins et plus\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"À propos des dossiers médicaux"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Les données à partager comprennent"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Si vous l\'autorisez, <xliff:g id="APP_NAME">%1$s</xliff:g> pourra partager vos dossiers médicaux avec Connexion santé."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synchronisez vos dossiers médicaux à partir de vos différentes applis et sources pour les conserver au même endroit"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Retirer toutes les autorisations?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Tout retirer"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire de données dans Connexion santé.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme celles relatives à l\'appareil photo, au microphone ou à la position."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire de données dans Connexion santé, y compris les données antérieures.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme celles relatives à la position, à l\'appareil photo ou au microphone."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire de données dans Connexion santé, y compris les données en arrière-plan ou antérieures.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme celles relatives à la position, à l\'appareil photo ou au microphone."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Supprimer également les données de <xliff:g id="APP_NAME">%1$s</xliff:g> de Connexion santé"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Retirer toutes les autorisations?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Retirer toutes les autorisations liées au dossier médical?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Retirer toutes les autorisations liées à l\'activité physique et au bien-être?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Supprimer également les données d\'activité physique de <xliff:g id="APP_NAME">%1$s</xliff:g> à partir de Connexion santé"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Retirer toutes les autorisations liées au dossier médical?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Supprimer également les dossiers médicaux de <xliff:g id="APP_NAME">%1$s</xliff:g> à partir de Connexion santé"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire ces données dans Connexion santé.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme l\'appareil photo, le microphone ou la position."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire ces données dans Connexion santé, y compris les données en arrière-plan.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme l\'appareil photo, le microphone ou la position."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire ces données dans Connexion santé, y compris les données antérieures.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme l\'appareil photo, le microphone ou la position."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire ces données dans Connexion santé, y compris les données en arrière-plan et antérieures.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme l\'appareil photo, le microphone ou la position."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Retirer toutes les autorisations?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire de données dans Connexion santé.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme l\'appareil photo, le microphone ou la position."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire de données dans Connexion santé, y compris les données en arrière-plan.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme l\'appareil photo, le microphone ou la position."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire de données dans Connexion santé, y compris les données antérieures.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme l\'appareil photo, le microphone ou la position."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus lire ni écrire de données dans Connexion santé, y compris les données en arrière-plan et antérieures.\n\nCela n\'a aucune incidence sur d\'autres autorisations dont peut disposer cette appli, comme l\'appareil photo, le microphone ou la position."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Supprimer également les données d\'activité physique et les dossiers médicaux de <xliff:g id="APP_NAME">%1$s</xliff:g> dans Connexion santé"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Autorisations retirées pour cette appli"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Supprimer également toutes les données de Connexion santé"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Jour suivant"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Jour sélectionné"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Jour précédent"</string>
     <string name="default_error" msgid="7966868260616403475">"Une erreur s\'est produite. Veuillez réessayer."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Ressource inconnue"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Données source"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Accolade gauche."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Accolade droite."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"Valeur du <xliff:g id="PREFIX">%1$s</xliff:g> champ <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Ces applis n\'ont plus accès à Connexion santé, mais leurs données y sont toujours stockées"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut lire les données ajoutées après le <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Pour gérer les autres autorisations Android qui peuvent être accordées à cette appli, accédez à Paramètres &gt; Applis"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Les données que vous partagez avec <xliff:g id="APP_NAME">%1$s</xliff:g> sont couvertes par la politique de confidentialité de celle-ci"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Vous pouvez vous renseigner sur la façon dont <xliff:g id="APP_NAME">%1$s</xliff:g> traite vos données en consultant la politique de confidentialité du développeur"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Pour gérer les autres autorisations Android qui peuvent être accordées à cette appli, accédez à Paramètres, puis touchez Applis"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Lire la politique de confidentialité"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Dernier accès : au cours des dernières 24 heures"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Accès des applis"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Aucune appli compatible n\'est actuellement installée"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Accès supplémentaire"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Données passées, données en arrière-plan"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Autorisations supplémentaires retirées pour cette appli"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Autorisations"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Mise en forme et bien-être"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercice, sommeil, alimentation et autres"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Dossiers médicaux"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"dossiers médicaux"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Résult. de labo, médic./vaccin. et plus"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Résultats de laboratoire, médicaments, vaccins et autres données"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Autorisations d\'applis retirées"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Connexion santé a retiré les autorisations pour <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Connexion santé a retiré les autorisations pour <xliff:g id="APP_DATA_0">%1$s</xliff:g> et <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Accéder à la boutique Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Premiers pas avec Connexion santé"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Connexion santé stocke vos données de santé et d\'activité physique, et vous offre un moyen simple de synchroniser les différentes applis de votre appareil"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Connexion santé stocke et synchronise vos données relatives à la santé et à l\'activité physique à partir de différentes applis.\n\n"<b>"Les données relatives à l\'activité physique et au bien-être,"</b>" y compris les séances d\'exercice, le nombre de pas, la nutrition, le sommeil et d\'autres données\n\n"<b>"Les dossiers médicaux,"</b>" y compris les vaccins, les résultats de laboratoire et d\'autres données"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Avec Connexion santé vous pouvez"</string>
     <string name="share_data" msgid="3481932156368883946">"Partager des données avec vos applis"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Choisissez les données que chaque appli peut lire ou écrire dans Connexion santé"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Gérer vos paramètres et votre confidentialité"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Saignement léger"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Saignement moyen"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Saignement abondant"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Flux inconnu"</string>
     <string name="period_day" msgid="3821944462093965882">"Jour <xliff:g id="DAY">%1$d</xliff:g> de <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> des menstruations"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruations (1 jour)}one{Menstruations (# jour)}other{Menstruations (# jours)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positif"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Négatif"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Élevé"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musique"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Autre"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Sans guide"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Modérée"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Élevée"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -759,7 +838,7 @@
     <string name="specimen_source_tears" msgid="4368541832400624080">"Larmes"</string>
     <string name="specimen_source_whole_blood" msgid="8884838851343307557">"Sang total"</string>
     <string name="blood_glucose_general" msgid="7566279829618085436">"Général"</string>
-    <string name="blood_glucose_fasting" msgid="2122662399203934350">"Jeûne"</string>
+    <string name="blood_glucose_fasting" msgid="2122662399203934350">"À jeun"</string>
     <string name="blood_glucose_before_meal" msgid="5125498172701953751">"Avant le repas"</string>
     <string name="blood_glucose_after_meal" msgid="8101398122897992346">"Après le repas"</string>
     <string name="mealtype_label" msgid="5402474235944051844">"Type de repas"</string>
@@ -793,7 +872,7 @@
     <string name="potassium" msgid="723134189945209756">"Potassium"</string>
     <string name="protein" msgid="2731834509320364994">"Protéines"</string>
     <string name="riboflavin" msgid="5329306869379867435">"Riboflavine"</string>
-    <string name="saturated_fat" msgid="3174504848270051265">"Gras saturés"</string>
+    <string name="saturated_fat" msgid="3174504848270051265">"Grasses saturées"</string>
     <string name="selenium" msgid="8129594078116221891">"Sélénium"</string>
     <string name="sodium" msgid="7687341876185019438">"Sodium"</string>
     <string name="sugar" msgid="656190285547502122">"Sucre"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Intégration en cours…"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Connexion santé est en cours d\'intégration au système Android.\n\nLe transfert de vos données et de vos autorisations peut prendre un certain temps."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ne fermez pas l\'appli jusqu\'à ce que vous receviez une notification indiquant que le processus est terminé."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Intégration de Connexion santé en cours…"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Mise à jour requise"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Connexion santé est en cours d\'intégration au système Android afin que vous puissiez y accéder directement à partir de vos paramètres."</string>
     <string name="update_button" msgid="4544529019832009496">"Mettre à jour"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Lancez cette mise à jour pour continuer l\'intégration de Connexion santé à vos paramètres système"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Mettre à jour maintenant"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Mise à jour système requise"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Avant de continuer, veuillez mettre à jour le système d\'exploitation de votre téléphone."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Si vous avez déjà mis à jour le système d\'exploitation de votre téléphone, essayez de redémarrer celui-ci pour continuer l\'intégration"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Mise à jour de Connexion santé nécessaire"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Avant de continuer, veuillez mettre à jour l\'appli Connexion santé vers la dernière version."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Espace insuffisant"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Connexion santé a besoin de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> d\'espace de stockage sur votre téléphone pour continuer l\'intégration.\n\nLibérez de l\'espace sur votre téléphone, puis réessayez."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Réessayer"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Libérer de l\'espace"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Espace insuffisant"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Connexion santé a besoin de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> d\'espace de stockage sur votre téléphone pour continuer l\'intégration."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Intégration suspendue"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"L\'appli Connexion santé s\'est fermée pendant l\'intégration au système Android.\n\nCliquez sur reprendre pour rouvrir l\'appli et continuer le transfert de vos données et autorisations."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Pour conserver vos données de Connexion santé, complétez l\'intégration dans un délai de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Touchez pour continuer l\'intégration de Connexion santé au système Android. Pour conserver vos données de Connexion santé, complétez l\'intégration dans un délai de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Touchez pour continuer l\'intégration de Connexion santé au système Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continuer"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Reprendre l\'intégration de Connexion santé"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Pour conserver vos données de Connexion santé, complétez l\'intégration dans un délai de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Mise à jour de l\'appli nécessaire"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"L\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> doit être mise à jour pour continuer la synchronisation avec Connexion santé"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Certaines applis ont besoin d\'être mises à jour pour continuer la synchronisation avec Connexion santé"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"L\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> doit être mise à jour pour continuer la synchronisation avec Connexion santé. Les mises à jour peuvent ne pas être offertes pour toutes les applis."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Certaines applis ont besoin d\'être mises à jour pour continuer la synchronisation avec Connexion santé. Les mises à jour peuvent ne pas être offertes pour toutes les applis."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Rechercher des mises à jour"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"En savoir plus"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Intégration Connexion santé"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"L\'intégration de Connexion santé ne s\'est pas terminée"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Vous recevrez une notification lorsque l\'intégration sera à nouveau accessible."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"L\'intégration de Connexion santé ne s\'est pas terminée"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Lire la suite"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Intégration terminée pour Connexion santé"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Ouvrir"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Nouveautés"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Vous pouvez désormais accéder à Connexion santé directement à partir de vos paramètres. Désinstallez l\'appli Connexion santé à tout moment pour libérer de l\'espace de stockage."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Modifier les sources d\'applis"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Valeur par défaut de l\'appareil"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Données de l\'appli"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Les données des applis qui ont accès à Connexion santé s\'afficheront ici"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Les données provenant de <xliff:g id="APP_NAME">%1$s</xliff:g> s\'afficheront ici"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Les données des applis qui ont accès à Connexion santé s\'afficheront ici"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Jour"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Semaine"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mois"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Le mois dernier"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entrées"</string>
     <string name="tab_access" msgid="7818197975407243701">"Accès"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Autoriser un accès supplémentaire pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> veut également accéder à ces paramètres de Connexion santé"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Activez au moins une autorisation de lecture afin de permettre l\'accès en arrière-plan ou aux données antérieures pour cette appli"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Activez au moins une autorisation de lecture afin de permettre l\'accès en arrière-plan pour cette appli"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Activez au moins une autorisation de lecture afin de permettre l\'accès aux données antérieures pour cette appli"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Commencer à utiliser Connexion santé"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synchronisez vos premières applis pour partager vos données de santé et d\'activité physique entre elles"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configurer"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Afficher les applis compatibles"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Trouvez d\'autres applis à synchroniser avec <xliff:g id="APP_NAME">%s</xliff:g> par le biais de Connexion santé"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Voir dans la boutique d\'applis"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Configurer un verrouillage de l\'écran"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Pour une sécurité accrue de vos données relatives à la santé, définissez un NIP, un schéma ou un mot de passe pour cet appareil"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Configurer le verrouillage de l\'écran"</string>
     <string name="select_all" msgid="837499881590001166">"Tout sélectionner"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Les applis connectées ne pourront plus accéder à ces données à partir de Connexion santé"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Sélectionnée"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Non sélectionnée"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Itinéraire d\'exercice sur carte disponible"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Jour suivant"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Semaine suivante"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mois suivant"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Jour précédent"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Semaine précédente"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mois précédent"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Supprimer définitivement toutes les données?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Supprimer définitivement les données sélectionnées?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Supprimer définitivement toutes les données <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Supprimer définitivement les entrées <xliff:g id="APP_NAME">%1$s</xliff:g> sélectionnées pour la semaine du <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Supprimer définitivement les entrées <xliff:g id="APP_NAME">%1$s</xliff:g> sélectionnées pour <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Supprimer définitivement cette entrée <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Supprimer définitivement les données « <xliff:g id="DATA_TYPE">%1$s</xliff:g> » pour <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Activé"</string>
+    <string name="off" msgid="6996623844428550649">"Désactivé"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Dernier accès : <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Accès hier (<xliff:g id="TIME_DATE">%1$s</xliff:g>)"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Accès : <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Autoriser tout le temps"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Autoriser la sélect."</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Lorsque vous utilisez l\'appli"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Tout refuser"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données d\'activité physique et de bien-être?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'accès aux données suivantes : <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nChoisissez de les autoriser toutes ou de les contrôler individuellement."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Mise en forme et bien-être"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"en tout temps"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"durant l\'utilisation"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"En tout temps"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Durant l\'utilisation"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut accéder à toutes vos données d\'activité physique et de bien-être <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Autorisée à accéder"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Autorisée à lire"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ces autorisations permettent à <xliff:g id="APP_NAME">%1$s</xliff:g> d\'accéder aux données des capteurs de votre appareil."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> applis autorisées sur <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Aucune appli ne demande une autorisation"</string>
+    <string name="allowed" msgid="4158456017482263737">"Autorisée"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Non autorisée"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Les applis disposant de cette autorisation peuvent accéder aux données <xliff:g id="DATA_TYPE">%s</xliff:g> des capteurs de votre appareil."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Retirer l\'accès à <xliff:g id="DATA_TYPE">%s</xliff:g> pour toutes les applis sur votre montre?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Coche"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Croix"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Actuellement, <xliff:g id="APP_NAME">%1$s</xliff:g> peut accéder aux données d\'activité physique et de bien-être <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à tout moment aux données d\'activité physique et de bien-être?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> a accès aux données suivantes : <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Gérer les autorisations d\'activité physique et de bien-être"</string>
 </resources>
diff --git a/apk/res/values-fr/strings.xml b/apk/res/values-fr/strings.xml
index b9c930a..43096c7 100644
--- a/apk/res/values-fr/strings.xml
+++ b/apk/res/values-fr/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Gérez les données de santé et remise en forme sur votre appareil, et contrôlez les applis autorisées à y accéder"</string>
     <string name="data_title" msgid="4456619761533380816">"Données et accès"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Parcourir les dossiers médicaux"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Afficher vos dossiers médicaux et les applis qui y ont accès"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Toutes les catégories"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Voir toutes les catégories"</string>
     <string name="no_data" msgid="1906986019249068659">"Aucune donnée"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Hier"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lecture : <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Écriture : <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Gérer les autorisations"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Heure : <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activité"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"accéder à vos données de forme physique"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Lire les calories brûlées"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Autorise l\'appli à répondre à lire les calories brûlées"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Accéder aux données en arrière-plan"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données en arrière-plan ?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données en arrière-plan ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Si vous l\'y autorisez, cette appli peut accéder à vos données de fitness et bien-être, ainsi qu\'à votre dossier médical, lorsque vous ne l\'utilisez pas."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Si vous l\'y autorisez, cette appli peut accéder à votre dossier médical lorsque vous ne l\'utilisez pas."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Si vous l\'y autorisez, cette appli peut accéder à vos données de fitness et de bien-être lorsque vous ne l\'utilisez pas."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Si vous l\'y autorisez, cette appli peut accéder aux données de Santé Connect lorsque vous ne l\'utilisez pas."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données précédentes ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Si vous l\'y autorisez, cette appli peut accéder aux données de fitness et de bien-être ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Si vous l\'y autorisez, cette appli peut accéder à toutes les anciennes données de fitness et de bien-être."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Si vous l\'y autorisez, cette appli peut accéder aux données de Santé Connect ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Si vous l\'y autorisez, cette appli peut accéder à toutes les données précédentes de Santé Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Autoriser les accès supplémentaires pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite également accéder à ces paramètres de Santé Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Accéder à toutes les données en arrière-plan"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Accéder au dossier médical en arrière-plan"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Accéder aux données de fitness et de bien-être en arrière-plan"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Autoriser cette appli à accéder à vos données de fitness et de bien-être, ainsi qu\'à votre dossier médical, lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Autoriser cette appli à accéder à ces données lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Autoriser cette appli à accéder à ces données lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Accéder aux données en arrière-plan"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Autoriser cette appli à accéder aux données de Santé Connect lorsque vous ne l\'utilisez pas"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Accéder à vos anciennes données de fitness et de bien-être"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Autoriser cette appli à accéder aux données ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Autoriser cette appli à accéder à toutes les anciennes données"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Accéder aux anciennes données"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Autoriser cette appli à accéder aux données de Santé Connect ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Autoriser cette appli à accéder à toutes les anciennes données de Santé Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut déjà accéder aux anciennes données de votre dossier médical."</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"En savoir plus sur les autorisations"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Accéder à toutes les données en arrière-plan"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Accéder au dossier médical en arrière-plan"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Accéder aux données de fitness et de bien-être en arrière-plan"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Autoriser cette appli à accéder à vos données de fitness et de bien-être, ainsi qu\'à votre dossier médical, lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Autoriser cette appli à accéder à ces données lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Autoriser cette appli à accéder à ces données lorsque vous ne l\'utilisez pas"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Accéder aux données en arrière-plan"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Autoriser cette appli à accéder aux données de Santé Connect lorsque vous ne l\'utilisez pas"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Accéder à vos anciennes données de fitness et de bien-être"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Autoriser cette appli à accéder aux données ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Autoriser cette appli à accéder à toutes les anciennes données"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Accéder aux anciennes données"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Autoriser cette appli à accéder aux données de Santé Connect ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Autoriser cette appli à accéder à toutes les anciennes données de Santé Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Aucune donnée de fitness n\'est actuellement lue, car <xliff:g id="APP_NAME">%1$s</xliff:g> ne dispose pas d\'autorisations de lecture"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut déjà accéder aux anciennes données de vos dossiers médicaux. Pour modifier cela, désactivez les autorisations de dossier médical pour cette appli"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Gérer les autorisations de dossier médical"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Accordez au moins une autorisation de lecture afin d\'activer l\'accès en arrière-plan et l\'accès aux anciennes données pour cette appli"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Accordez au moins une autorisation de lecture afin d\'activer l\'accès en arrière plan pour cette appli"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Accordez au moins une autorisation de lecture afin d\'activer l\'accès aux données déjà enregistrées pour cette appli"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Autoriser cette appli à accéder à toutes les anciennes données de Santé Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Autoriser cette appli à accéder aux données de Santé Connect lorsque vous ne l\'utilisez pas"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Si vous l\'y autorisez, cette appli pourra accéder aux données de Santé Connect lorsque vous ne l\'utilisez pas."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Accéder aux anciennes données"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données précédentes ?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Autoriser cette appli à accéder aux données de Santé Connect ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Autoriser cette appli à accéder à toutes les anciennes données de Santé Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Si vous l\'y autorisez, cette appli pourra accéder aux données de Santé Connect ajoutées avant le <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Si vous l\'y autorisez, cette appli peut accéder à toutes les données précédentes de Santé Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calories brûlées en activité"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"calories brûlées en activité"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Lire les calories brûlées en activité"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"poussées de fauteuil roulant"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Lire les poussées de fauteuil roulant"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Modifier les poussées de fauteuil roulant"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensité de l\'activité"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensité de l\'activité"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Lire l\'intensité de l\'activité"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Écrire l\'intensité de l\'activité"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Métabolisme de base"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"métabolisme de base"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Lire le métabolisme de base"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"température cutanée"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Lire la température cutanée"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Indiquer la température cutanée"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Cela inclut tous les dossiers médicaux synchronisés et ajoutés à Santé Connect. Il ne s\'agit pas nécessairement de votre dossier médical complet et celui-ci ne contient aucune description de vos dossiers médicaux."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Tous les dossiers médicaux"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"tous les dossiers médicaux"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Écrire tous les dossiers médicaux"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergies"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergies"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lire les allergies"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunisation"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunisation"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Lire les données sur l\'immunisation"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Résultats de laboratoire"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"résultats de laboratoire"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Lire les résultats de laboratoire"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergies"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergies"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Lire les allergies"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Conditions"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"conditions"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Lire les conditions"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccins"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccins"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Lire les vaccins"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Résultats d\'analyses"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"résultats d\'analyses"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Lire les résultats d\'analyses"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Médicaments"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"médicaments"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Lire les données des médicaments"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Informations personnelles"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"informations personnelles"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Lire les informations personnelles"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Informations sur le praticien"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"informations sur le praticien"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Lire les informations sur le praticien"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Grossesse"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"grossesse"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Lire la grossesse"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problèmes"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problèmes"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Lire les problèmes"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procédures"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procédures"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Lire les procédures"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historique social"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historique social"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historique social"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Lire l\'historique social"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Signes vitaux"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Consultations"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"consultations"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Lire les consultations"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Signes vitaux"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"signes vitaux"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Lire les signes vitaux"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Pleine conscience"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Écrire les données de Pleine conscience"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à lire les données suivantes"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à écrire les données suivantes"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Annuler"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Autoriser"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Tout autoriser"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ne pas autoriser"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Sélectionnez les données que cette appli peut lire ou modifier dans Santé Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Sélectionnez les données que vous voulez autoriser cette appli à lire ou à écrire dans Santé Connect."</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Sélectionnez les données que vous voulez autoriser cette appli à lire dans Santé Connect."</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Sélectionnez les données que vous voulez autoriser cette appli à écrire dans Santé Connect."</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Si vous lui donnez accès en lecture, l\'appli pourra lire les nouvelles données et celles des 30 derniers jours."</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Si vous lui donnez accès en lecture, l\'appli pourra lire les anciennes et les nouvelles données."</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à Santé Connect ?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Consultez les <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> du développeur pour découvrir comment <xliff:g id="APP_NAME">%1$s</xliff:g> gère vos données."</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à vos données de fitness et de bien-être ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Consultez les <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g> pour découvrir comment elle gère vos données"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"règles de confidentialité"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à votre dossier médical ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Si vous lui accordez l\'accès, l\'application pourra lire et écrire des données sur les allergies, les résultats d\'analyses, les vaccins, etc.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Si vous lui accordez l\'accès, l\'application pourra lire les données sur les allergies, les résultats d\'analyses, les vaccins, etc.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"À propos du dossier médical"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Types de données à partager"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Si vous l\'y autorisez, <xliff:g id="APP_NAME">%1$s</xliff:g> pourra partager votre dossier médical avec Santé Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synchronisez votre dossier médical depuis vos différentes applis et sources pour les conserver au même endroit"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Supprimer toutes les autorisations ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Tout supprimer"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier les données dans Santé Connect.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la localisation."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier les données dans Santé Connect, y compris les données déjà enregistrées.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à la position, à l\'appareil photo ou au micro."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier les données dans Santé Connect, y compris les données en arrière-plan et les données déjà enregistrées.\n\nCela n\'affectera pas les autres autorisations de cette appli, comme l\'accès à la position, à l\'appareil photo ou au micro."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Supprimer également les données <xliff:g id="APP_NAME">%1$s</xliff:g> de Santé Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Supprimer toutes les autorisations ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Supprimer toutes les autorisations des enregistrements de santé ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Supprimer toutes les autorisations liées à la remise en forme et au bien-être ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Supprimer également de Santé Connect les données de fitness issues de l\'appli <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Supprimer toutes les autorisations des enregistrements de santé ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Supprimer également de Santé Connect les dossiers médicaux issus de l\'appli <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier ces données dans Santé Connect.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la position."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier ces données dans Santé Connect, y compris les données en arrière-plan.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la position."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier ces données dans Santé Connect, y compris les données déjà enregistrées.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la position."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier ces données dans Santé Connect, y compris les données en arrière-plan et les données déjà enregistrées.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la position."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Supprimer toutes les autorisations ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier les données dans Santé Connect.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la position."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier les données dans Santé Connect, y compris les données en arrière-plan.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la position."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier les données dans Santé Connect, y compris les données déjà enregistrées.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la position."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne pourra plus consulter ni modifier les données dans Santé Connect, y compris les données en arrière-plan et les données déjà enregistrées.\n\nCela n\'affecte pas les autres autorisations de cette appli, comme l\'accès à l\'appareil photo, au micro ou à la position."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Supprimer également les données de remise en forme et les enregistrements de santé de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g> de Santé Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Autorisations supprimées pour cette appli"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Supprimer également toutes les données de Santé Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Jour suivant"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Jour sélectionné"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Jour précédent"</string>
     <string name="default_error" msgid="7966868260616403475">"Un problème est survenu. Veuillez réessayer."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Ressource inconnue"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Données sources"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Accolade ouvrante."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Accolade fermante."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Valeur <xliff:g id="FIELD">%2$s</xliff:g> du champ"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Ces applis n\'ont plus accès à Santé Connect, mais ont encore des données qui y sont stockées"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut lire les données ajoutées après le <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Pour gérer d\'autres autorisations Android concernant cette appli, sélectionnez Paramètres &gt; Applis"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Les données que vous partagez avec l\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> sont couvertes par ses règles de confidentialité"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Pour savoir comment <xliff:g id="APP_NAME">%1$s</xliff:g> traite vos données, consultez les règles de confidentialité du développeur"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Pour gérer d\'autres autorisations Android concernant cette appli, sélectionnez \"Paramètres\", puis appuyez sur \"Applis\""</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Lire les règles de confidentialité"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Accès au cours des dernières 24 heures"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Accès de l\'appli"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Aucune appli compatible n\'est installée pour le moment"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Accès supplémentaires"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Anciennes données, données en arrière-plan"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"D\'autres autorisations ont été révoquées pour cette appli"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Autorisations"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness et bien-être"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercice, sommeil, nutrition et autres"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Dossiers médicaux"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"dossiers médicaux"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Résultats d\'analyses, médicaments, vaccins, etc."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Résultats d\'analyses, médicaments, vaccins, etc."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Autorisations d\'applis retirées"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Santé Connect a retiré les autorisations de <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Santé Connect a retiré les autorisations de <xliff:g id="APP_DATA_0">%1$s</xliff:g> et <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Accéder au Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Premiers pas avec Santé Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Santé Connect stocke vos données de santé et de remise en forme, et vous permet de synchroniser facilement les différentes applis de votre appareil"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Santé Connect stocke et synchronise vos données de santé et de remise en forme issues de différentes applications.\n\n"<b>"Les données de fitness et bien-être,"</b>" y compris les séances d\'exercice, le nombre de pas, les informations sur la nutrition et le sommeil, etc.\n\n"<b>"Les dossiers médicaux,"</b>" y compris les vaccins, les résultats d\'analyses et plus encore."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Avec Santé Connect, vous pouvez :"</string>
     <string name="share_data" msgid="3481932156368883946">"Partager des données avec vos applis"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Sélectionnez les données que chaque appli peut lire ou modifier dans Santé Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Gérer vos paramètres et votre confidentialité"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Flux léger"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Flux moyen"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Flux abondant"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Flux inconnu"</string>
     <string name="period_day" msgid="3821944462093965882">"Jour de règles <xliff:g id="DAY">%1$d</xliff:g> sur <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Période (1 jour)}one{Période (# jour)}other{Période (# jours)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positif"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Négatif"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Élevé"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musique"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Autre"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Sans guide"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Modérée"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Élevée"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Intégration en cours"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Santé Connect est en cours d\'intégration au système Android.\n\nLe transfert de vos données et de vos autorisations peut prendre un certain temps."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ne fermez pas l\'appli tant que vous n\'avez pas reçu de notification indiquant que le processus est terminé."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Intégration de Santé Connect en cours"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Mise à jour requise"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Santé Connect est en cours d\'intégration au système Android afin que vous puissiez y accéder directement depuis les paramètres."</string>
     <string name="update_button" msgid="4544529019832009496">"Mettre à jour"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Lancez cette mise à jour pour continuer l\'intégration de Santé Connect à vos paramètres système"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Mettre à jour"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Mise à jour du système nécessaire"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Mettez à jour le système de votre téléphone avant de continuer."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Si vous avez déjà mis à jour le système du téléphone, essayez de le redémarrer pour continuer l\'intégration"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Mise à jour de Santé Connect requise"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Installez la dernière version de l\'appli Santé Connect avant de continuer."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Espace insuffisant"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Santé Connect a besoin de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> d\'espace de stockage sur votre téléphone pour que l\'intégration se poursuive.\n\nLibérez de l\'espace sur votre téléphone, puis réessayez."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Réessayer"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Libérer de l\'espace"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Espace insuffisant"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Santé Connect a besoin de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> d\'espace de stockage sur votre téléphone pour continuer l\'intégration."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Intégration suspendue"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"L\'appli Santé Connect s\'est fermée pendant l\'intégration au système Android.\n\nCliquez sur \"Reprendre\" pour rouvrir l\'appli et continuer le transfert de vos données et autorisations."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Pour conserver vos données Santé Connect, effectuez l\'opération sous <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Appuyez pour continuer l\'intégration de Santé Connect au système Android. Pour conserver vos données, effectuez l\'opération sous <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Appuyez pour continuer l\'intégration de Santé Connect au système Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continuer"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Reprendre l\'intégration de Santé Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Pour conserver vos données, effectuez l\'opération sous <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Mise à jour d\'application requise"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> doit être mise à jour afin de pouvoir continuer à être synchronisée avec Santé Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Certaines applis doivent être mises à jour afin de pouvoir continuer à être synchronisées avec Santé Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"L\'application <xliff:g id="APP_NAME">%1$s</xliff:g> doit être mise à jour afin de pouvoir continuer à être synchronisée avec Santé Connect. Il est possible que les mises à jour ne soient pas disponibles pour toutes les applis."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Certaines applis doivent être mises à jour afin de pouvoir continuer à être synchronisées avec Santé Connect. Il est possible que les mises à jour ne soient pas disponibles pour toutes les applis."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Rechercher les mises à jour"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"En savoir plus"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Intégration de Santé Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"L\'intégration de Santé Connect n\'a pas abouti"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Vous recevrez une notification lorsqu\'elle sera de nouveau disponible."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"L\'intégration de Santé Connect n\'a pas abouti"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"En savoir plus"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Intégration de Santé Connect terminée"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Ouvrir"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Nouveautés"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Vous pouvez désormais accéder à Santé Connect directement depuis les paramètres. Désinstallez l\'application Santé Connect à tout moment pour libérer de l\'espace de stockage."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Modifier les sources d\'application"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Paramètre par défaut"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Données d\'application"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Les données issues des applications ayant accès à Santé Connect s\'afficheront ici."</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Les données de l\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> s\'afficheront ici"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Les données issues des applications ayant accès à Santé Connect s\'afficheront ici"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Jour"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Semaine"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mois"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Mois dernier"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entrées"</string>
     <string name="tab_access" msgid="7818197975407243701">"Accès"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Autoriser les accès supplémentaires pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite également accéder à ces paramètres de Santé Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Accordez au moins une autorisation de lecture afin d\'activer l\'accès en arrière-plan et l\'accès aux anciennes données pour cette appli"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Accordez au moins une autorisation de lecture afin d\'activer l\'accès en arrière plan pour cette appli"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Accordez au moins une autorisation de lecture afin d\'activer l\'accès aux données déjà enregistrées pour cette appli"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Commencer à utiliser Santé Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synchroniser vos premières applis pour partager des données de santé et de remise en forme entre elles"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configurer"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Afficher les applis compatibles"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Trouver d\'autres applis à synchroniser avec <xliff:g id="APP_NAME">%s</xliff:g> via Santé Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Afficher sur la plate-forme de téléchargement d\'applications"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Définir le verrouillage de l\'écran"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Pour mieux sécuriser vos données de forme physique, définissez un code, un schéma ou un mot de passe pour cet appareil"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Définir le verrouillage de l\'écran"</string>
     <string name="select_all" msgid="837499881590001166">"Tout sélectionner"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Les applications connectées ne pourront plus accéder à ces données à partir de Santé Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Cochée"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Non cochée"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Parcours sportif disponible"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Jour suivant"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Semaine suivante"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mois suivant"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Jour précédent"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Semaine précédente"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mois précédent"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Supprimer définitivement toutes les données ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Supprimer définitivement les données sélectionnées de l\'application ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Supprimer définitivement toutes les données de l\'application <xliff:g id="APP_NAME">%s</xliff:g> ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Supprimer définitivement les entrées sélectionnées de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g> pour la semaine du <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Supprimer définitivement les entrées sélectionnées de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g> pour <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Supprimer définitivement cette entrée de l\'application <xliff:g id="APP_NAME">%s</xliff:g> ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Supprimer définitivement les données de type <xliff:g id="DATA_TYPE">%1$s</xliff:g> pour l\'appli <xliff:g id="APP_NAME">%2$s</xliff:g> ?"</string>
+    <string name="on" msgid="8266542510798355807">"Activé"</string>
+    <string name="off" msgid="6996623844428550649">"Désactivé"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Dernière consultation : <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Dernière consultation : hier, à <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Dernière consultation : <xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Toujours autoriser"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Autoriser la sélection"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"En utilisant l\'application"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Tout refuser"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à vos données de fitness et de bien-être ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande à accéder aux données suivantes : <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nVous pouvez autoriser toutes les données ou les contrôler individuellement."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à <xliff:g id="DATA_TYPE">%2$s</xliff:g> ?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness et bien-être"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"tout le temps"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"pendant l\'utilisation"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Tout le temps"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Pendant l\'utilisation"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut accéder à l\'ensemble de vos données de fitness et bien-être <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Accès autorisé"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Lecture autorisée"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Grâce à ces autorisations, <xliff:g id="APP_NAME">%1$s</xliff:g> peut accéder aux données provenant des capteurs de votre appareil."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> application(s) autorisée(s) sur <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Demandée par aucune appli"</string>
+    <string name="allowed" msgid="4158456017482263737">"Autorisée"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Non autorisée"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Les applis disposant de cette autorisation peuvent accéder aux données de <xliff:g id="DATA_TYPE">%s</xliff:g> provenant des capteurs de votre appareil."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Supprimer l\'accès aux données de <xliff:g id="DATA_TYPE">%s</xliff:g> pour toutes les applis sur votre montre ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Coche"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Croix"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Actuellement, <xliff:g id="APP_NAME">%1$s</xliff:g> peut accéder à vos données de fitness et de bien-être <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Toujours autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à vos données de fitness et de bien-être ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> peut accéder aux données suivantes : <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Gérer les autorisations liées au fitness et au bien-être"</string>
 </resources>
diff --git a/apk/res/values-gl/strings.xml b/apk/res/values-gl/strings.xml
index 0474db2..05e9bb2 100644
--- a/apk/res/values-gl/strings.xml
+++ b/apk/res/values-gl/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Xestiona os datos de saúde e actividade física no dispositivo, e controla que aplicacións poden acceder a eles"</string>
     <string name="data_title" msgid="4456619761533380816">"Datos e acceso"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Consultar rexistros de información sanitaria"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Consulta os teus rexistros de información sanitaria e que aplicacións poden acceder a eles"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Todas as categorías"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Ver todas as categorías"</string>
     <string name="no_data" msgid="1906986019249068659">"Sen datos"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Onte"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Ler: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Escribir: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Xestionar permisos"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Hora: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Actividade"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"acceder aos datos sobre a túa saúde"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Ler calorías queimadas"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Permite que a aplicación lea os datos de calorías queimadas"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Acceder aos datos en segundo plano"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda aos datos en segundo plano?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda aos datos en segundo plano?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Se dás permiso, esta aplicación poderá acceder aos datos de actividade física e benestar, ademais de aos rexistros de información sanitaria, cando non a esteas usando."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Se dás permiso, esta aplicación poderá acceder aos rexistros de información sanitaria cando non a esteas usando."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Se dás permiso, esta aplicación poderá acceder aos datos de actividade física e benestar cando non a esteas usando."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Se dás permiso, esta aplicación poderá acceder aos datos de Saúde conectada cando non a esteas usando."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda aos datos anteriores?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Se dás permiso, esta aplicación poderá acceder aos datos de actividade física e benestar engadidos antes do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Se dás permiso, esta aplicación poderá acceder a todos os datos anteriores de actividade física e benestar."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Se dás permiso, esta aplicación poderá acceder aos datos de Saúde conectada engadidos antes do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Se dás permiso, esta aplicación poderá acceder a todos os datos anteriores de Saúde conectada."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Queres permitir o acceso adicional de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> tamén quere ter acceso a estas opcións de configuración de Saúde conectada"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Acceder a todos os datos en segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Acceder aos rexistros de información sanitaria en segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Acceder aos datos de actividade física e benestar en segundo plano"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Permite que esta aplicación acceda aos datos de actividade física e benestar, ademais de aos rexistros de información sanitaria, cando non a esteas usando"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Permite que esta aplicación acceda a estes datos cando non a esteas usando"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Permite que esta aplicación acceda a estes datos cando non a esteas usando"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Acceder aos datos en segundo plano"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Permite que esta aplicación acceda aos datos de Saúde conectada cando non a esteas usando"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Acceder aos datos anteriores de actividade física e benestar"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Permite que esta aplicación acceda aos datos engadidos antes do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Permite que esta aplicación acceda a todos os datos anteriores"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Acceder aos datos anteriores"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Permite que esta aplicación acceda aos datos de Saúde conectada engadidos antes do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Permite que esta aplicación acceda a todos os datos anteriores de Saúde conectada"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa pode acceder aos datos anteriores dos teus rexistros de información sanitaria"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Máis información sobre os permisos"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Acceder a todos os datos en segundo plano"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Acceder aos rexistros de información sanitaria en segundo plano"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Acceder aos datos de actividade física e benestar en segundo plano"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Permite que esta aplicación acceda aos datos de actividade física e benestar, ademais de aos rexistros de información sanitaria, cando non a esteas usando"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Permite que esta aplicación acceda a estes datos cando non a esteas usando"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Permite que esta aplicación acceda a estes datos cando non a esteas usando"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Acceder aos datos en segundo plano"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Permite que esta aplicación acceda aos datos de Saúde conectada cando non a esteas usando"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Acceder aos datos anteriores de actividade física e benestar"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Permite que esta aplicación acceda aos datos engadidos antes do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Permite que esta aplicación acceda a todos os datos anteriores"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Acceder aos datos anteriores"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Permite que esta aplicación acceda aos datos de Saúde conectada engadidos antes do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Permite que esta aplicación acceda a todos os datos anteriores de Saude conectada"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> non pode acceder a ningún dato de actividade física porque carece dos permisos de lectura necesarios"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa pode acceder aos datos anteriores dos teus rexistros de información sanitaria. Para cambiar esta opción, desactiva os permisos de acceso aos devanditos rexistros para esa aplicación."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Xestionar os permisos de acceso aos rexistros de información sanitaria"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Activa polo menos un permiso de lectura para habilitar o acceso aos datos anteriores ou en segundo plano por parte desta aplicación"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Activa polo menos un permiso de lectura para habilitar o acceso en segundo plano por parte desta aplicación"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Activa polo menos un permiso de lectura para habilitar o acceso aos datos anteriores por parte desta aplicación"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Permite que esta aplicación acceda a todos os datos anteriores de Saúde conectada"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Permite que esta aplicación acceda aos datos de Saúde conectada cando non a esteas usando"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Se dás permiso, esta aplicación poderá acceder aos datos de Saúde conectada cando non esteas usando a aplicación."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Acceder aos datos anteriores"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda aos datos anteriores?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Permitir que esta aplicación acceda aos datos de Saúde conectada engadidos antes do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Permitir que esta aplicación acceda a todos os datos antigos de Saúde conectada"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Se dás permiso, esta aplicación poderá acceder aos datos de Saúde conectada engadidos antes do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Se dás permiso, esta aplicación poderá acceder a todos os datos antigos de Saúde conectada."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calorías queimadas durante a actividade"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"calorías queimadas durante a actividade"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Ler datos de calorías queimadas durante a actividade"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"impulsos en cadeira de rodas"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Ler datos de impulsos en cadeira de rodas"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Escribir datos de impulsos en cadeira de rodas"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensidade da actividade"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensidade da actividade"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Ler a intensidade da actividade"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Escribir a intensidade da actividade"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Índice metabólico basal"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"índice metabólico basal"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Ler datos de índice metabólico basal"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura cutánea"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Ler temperatura cutánea"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Escribir temperatura cutánea"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Aquí inclúense todos os rexistros de información sanitaria sincronizados e engadidos a Saúde conectada. Poida que non sexa a túa historia clínica completa. Non se incluirá ningunha descrición médica dos teus rexistros de información sanitaria."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Todos os rexistros de información sanitaria"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"todos os rexistros de información sanitaria"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Escribir todos os rexistros de información sanitaria"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alerxias"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alerxias"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Ler os datos das alerxias"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Inmunización"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"inmunización"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Ler os datos da inmunización"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Resultados do laboratorio"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"resultados do laboratorio"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Ler os resultados do laboratorio"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alerxias"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alerxias"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Ler os datos das alerxias"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Condicións"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"condicións"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Ler as condicións"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vacinas"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vacinas"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Ler os datos das vacinas"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Resultados das análises"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"resultados das análises"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Ler os resultados das análises"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medicación"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medicación"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Ler a medicación"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Datos persoais"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"datos persoais"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Ler os datos persoais"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Información dos profesionais sanitarios"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"información dos profesionais sanitarios"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Ler a información dos profesionais sanitarios"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Embarazo"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"embarazo"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Ler os datos de embarazo"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemas"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemas"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Ler os problemas"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedementos"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedementos"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Ler os procedementos"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historial social"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historial social"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historial social"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Ler o historial social"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Constantes vitais"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Consultas"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"consultas"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Ler as consultas"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Constantes vitais"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"constantes vitais"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Ler as constantes vitais"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Atención plena"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Escribir datos da sesión de atención plena"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> lea"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> escriba"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancelar"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Permitir"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Permitir todo"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Non permitir"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Escolle os datos que queres que lea ou escriba esta aplicación en Saúde conectada"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Escolle os datos que queres que lea ou escriba esta aplicación en Saúde conectada"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Escolle os datos que queres que lea esta aplicación en Saúde conectada"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Escolle os datos que queres que escriba esta aplicación en Saúde conectada"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Se lle dás acceso de lectura a esta aplicación, poderá ler os datos novos e os correspondentes aos últimos 30 días"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Se lle dás acceso de lectura a esta aplicación, poderá ler os datos novos e os anteriores"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a Saúde conectada?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Podes consultar como xestiona <xliff:g id="APP_NAME">%1$s</xliff:g> os teus datos na <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> do programador"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda aos datos de actividade física e benestar?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Se queres saber como xestiona <xliff:g id="APP_NAME">%1$s</xliff:g> os teus datos, consulta a súa <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"política de privacidade"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda aos teus rexistros de información sanitaria?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Se permites o acceso, a aplicación poderá ler e escribir datos relacionados coas alerxias, cos resultados das análises e coas vacinas, entre outra información\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Se permites o acceso, a aplicación poderá ler datos relacionados coas alerxias, cos resultados das análises e coas vacinas, entre outra información\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Acerca dos rexistros de información sanitaria"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Entre os datos que se compartirán inclúense"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Se dás permiso, <xliff:g id="APP_NAME">%1$s</xliff:g> poderá compartir os teus rexistros de información sanitaria con Saúde conectada."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sincroniza os rexistros de información sanitaria das distintas aplicacións e fontes para gardalos nun só lugar"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Queres quitar todos os permisos?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Quitar todos"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> deixará de poder ler e escribir datos de Saúde conectada.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir datos de Saúde conectada, incluídos os datos anteriores.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir datos de Saúde conectada, incluídos os datos anteriores e en segundo plano.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Eliminar tamén os datos de <xliff:g id="APP_NAME">%1$s</xliff:g> almacenados en Saúde conectada"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Queres quitar todos os permisos?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Queres quitar os permisos do rexistro de información sanit.?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Queres quitar todos os permisos de forma física e benestar?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Eliminar tamén de Saúde conectada os datos de actividade física de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Queres quitar os permisos do rexistro de información sanit.?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Eliminar tamén de Saúde conectada os rexistros de información sanitaria de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir estes datos de Saúde conectada.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir estes datos de Saúde conectada, incluídos os datos en segundo plano.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir estes datos de Saúde conectada, incluídos os datos anteriores.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir estes datos de Saúde conectada, incluídos os datos anteriores e en segundo plano.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Queres quitar todos os permisos?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir datos de Saúde conectada.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir datos de Saúde conectada, incluídos os datos en segundo plano.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir datos de Saúde conectada, incluídos os datos anteriores.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> xa non poderá ler nin escribir datos de Saúde conectada, incluídos os datos anteriores e en segundo plano.\n\nEsta acción non lles afecta a outros permisos que poida ter esta aplicación, como os de acceso á localización, á cámara ou ao micrófono."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Eliminar tamén de Saúde conectada os datos de actividade física e os rexistros de información sanitaria de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Quitáronse os permisos para esta aplicación"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Eliminar tamén todos os datos de Saúde conectada"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Día seguinte"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Día seleccionado"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Día anterior"</string>
     <string name="default_error" msgid="7966868260616403475">"Produciuse un erro. Téntao de novo."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Recurso descoñecido"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Datos de orixe"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Chave de apertura."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Chave de peche."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Valor do campo <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Estas aplicacións xa non teñen acceso a Saúde conectada, pero aínda teñen datos almacenados alí"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> pode ler os datos engadidos a partir do <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Para xestionar outros permisos de Android aos que teña acceso esta aplicación, vai a Configuración &gt; Aplicacións"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Os datos que compartes con <xliff:g id="APP_NAME">%1$s</xliff:g> están suxeitos á súa política de privacidade"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Podes consultar como xestiona <xliff:g id="APP_NAME">%1$s</xliff:g> os teus datos na política de privacidade do programador"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Para xestionar outros permisos de Android aos que teña acceso esta aplicación, vai a Configuración e, a continuación, toca Aplicacións"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Consultar a política de privacidade"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"O último acceso produciuse nas últimas 24 horas"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Acceso da aplicación"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Nestes momentos non tes instalada ningunha aplicación compatible"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Acceso adicional"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Datos anteriores, datos en segundo plano"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Quitáronse os permisos adicionais para esta aplicación"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permisos"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Forma física e benestar"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercicio, sono, nutrición e máis"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Rexistros de información sanitaria"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"rexistros de información sanitaria"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Análises, medicación, vacinas e máis"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Análises, medicación, vacinas e máis"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Permisos de aplicacións quitados"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Saúde conectada quitou os permisos de <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Saúde conectada quitou os permisos de <xliff:g id="APP_DATA_0">%1$s</xliff:g> e <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Ir a Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Comeza a usar Saúde conectada"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Saúde conectada almacena os teus datos de saúde e actividade física, e permíteche sincronizar facilmente as distintas aplicacións do dispositivo"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Saúde conectada almacena e sincroniza os teus datos de saúde e actividade física de distintas aplicacións.\n\n"<b>"Datos de actividade física e benestar:"</b>" sesións de exercicio, pasos, nutrición, sono e moito máis\n\n"<b>"Rexistros de información sanitaria:"</b>" vacinas ou resultados de análises, por exemplo"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Con Saúde conectada podes"</string>
     <string name="share_data" msgid="3481932156368883946">"Comparte datos coas túas aplicacións"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Decide que datos pode ler ou escribir cada aplicación en Saúde conectada"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Xestiona a túa configuración e privacidade"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Sangrado leve"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Sangrado medio"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Sangrado abundante"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Fluxo descoñecido"</string>
     <string name="period_day" msgid="3821944462093965882">"Día do período menstrual: <xliff:g id="DAY">%1$d</xliff:g> de <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Período (1 día)}other{Período (# días)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positivo"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativo"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Alta"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Música"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Outro tipo"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Sen guía"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderada"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intensa"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h e <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integración en proceso"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Estase integrando Saúde conectada co sistema Android.\n\nÉ posible que os datos e os permisos tarden un pouco en transferirse."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Non peches a aplicación ata que recibas a notificación de que se completou o proceso."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integración de Saúde conectada en proceso"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"É necesario realizar unha actualización"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Estase integrando Saúde conectada co sistema Android para que poidas acceder a ela directamente desde a configuración."</string>
     <string name="update_button" msgid="4544529019832009496">"Actualizar"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Inicia a actualización para que Saúde conectada poida seguir integrándose coa configuración do sistema"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Actualizar agora"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"É necesario actualizar o sistema"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Antes de continuar, actualiza o sistema do teu teléfono."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Se xa actualizaches o sistema do teléfono, proba a reiniciar o teléfono para continuar coa integración"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Cómpre actualizar Saúde conectada"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Antes de continuar, actualiza a aplicación Saúde conectada á última versión."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Precísase máis espazo"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Saúde conectada precisa <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espazo de almacenamento no teléfono para continuar coa integración.\n\nLibera espazo no teléfono e téntao de novo."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Tentar de novo"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Liberar espazo"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Precísase máis espazo"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Saúde conectada precisa <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espazo de almacenamento no teléfono para continuar coa integración."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integración en pausa"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Pechouse a aplicación Saúde conectada cando se estaba integrando no sistema Android.\n\nFai clic en retomar para volver abrir a aplicación e seguir transferindo os teus datos e permisos."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Para manter os teus datos de Saúde conectada, completa esta acción no prazo de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Toca para continuar coa integración de Saúde conectada co sistema Android. Para manter os teus datos, completa esta acción no prazo de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Toca para continuar coa integración de Saúde conectada co sistema Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continuar"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Retoma a integración de Saúde conectada"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Para manter os teus datos, completa esta acción no prazo de <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"É necesario actualizar a aplicación"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Cómpre actualizar <xliff:g id="APP_NAME">%1$s</xliff:g> para continuar a sincronización con Saúde conectada"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Cómpre actualizar algunhas aplicacións para continuar a sincronización con Saúde conectada"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Cómpre actualizar <xliff:g id="APP_NAME">%1$s</xliff:g> para continuar a sincronización con Saúde conectada. É posible que as actualizacións non estean dispoñibles para todas as aplicacións."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Cómpre actualizar algunhas aplicacións para continuar a sincronización con Saúde conectada. É posible que as actualizacións non estean dispoñibles para todas as aplicacións."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Buscar actualizacións"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Máis información"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integración de Saúde conectada"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Non se completou a integración de Saúde conectada"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Recibirás unha notificación cando volva estar dispoñible."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Entendido"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Non se completou a integración de Saúde conectada"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Ler máis"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integración de Saúde conectada completada"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Abrir"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novidades"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Xa podes acceder a Saúde conectada directamente desde a configuración. Desinstala a aplicación Saúde conectada cando queiras para liberar espazo de almacenamento."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Entendido"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Editar fontes de aplicacións"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Predeterminada do dispositivo"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Datos da aplicación"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Mostraranse aquí os datos das aplicacións con acceso a Saúde conectada"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Os datos de <xliff:g id="APP_NAME">%1$s</xliff:g> mostraranse aquí"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Os datos das aplicacións con acceso a Saúde conectada mostraranse aquí"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Día"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Semana"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mes"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Último mes"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entradas"</string>
     <string name="tab_access" msgid="7818197975407243701">"Acceso"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Queres permitir o acceso adicional de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> tamén quere ter acceso a estas opcións de configuración de Saúde conectada"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Activa polo menos un permiso de lectura para habilitar o acceso aos datos anteriores ou en segundo plano por parte desta aplicación"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Activa polo menos un permiso de lectura para habilitar o acceso en segundo plano por parte desta aplicación"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Activa polo menos un permiso de lectura para habilitar o acceso aos datos anteriores por parte desta aplicación"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Empeza a usar Saúde conectada"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sincroniza as primeiras aplicacións para compartir datos de saúde e forma física entre elas"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configurar"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Consulta as aplicacións compatibles"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Atopa máis aplicacións que sincronizar con <xliff:g id="APP_NAME">%s</xliff:g> a través de Saúde conectada"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Ver na tenda de aplicacións"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Define un bloqueo de pantalla"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Para que os datos sobre a túa saúde dispoñan de maior seguranza, define un PIN, un padrón ou un contrasinal para este dispositivo"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Definir bloqueo de pantalla"</string>
     <string name="select_all" msgid="837499881590001166">"Seleccionar todo"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"As aplicacións conectadas xa non poderán ler estes datos de Saúde conectada"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Caixa marcada"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Caixa non marcada"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Mapa da ruta de exercicio dispoñible"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Día seguinte"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Semana seguinte"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mes seguinte"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Día anterior"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Semana anterior"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mes anterior"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Queres eliminar de forma permanente todos os datos?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Queres eliminar de forma permanente os datos seleccionados?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Queres eliminar de forma de forma permanente todos os datos de <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Queres eliminar de forma permanente as entradas seleccionadas de <xliff:g id="APP_NAME">%1$s</xliff:g> da seguinte semana: <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Queres eliminar de forma permanente as entradas seleccionadas de <xliff:g id="APP_NAME">%1$s</xliff:g> de <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Queres eliminar de forma permanente esta entrada de <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Queres eliminar permanentemente de <xliff:g id="APP_NAME">%2$s</xliff:g> os datos referentes ao seguinte: <xliff:g id="DATA_TYPE">%1$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Activado"</string>
+    <string name="off" msgid="6996623844428550649">"Desactivado"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Último acceso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Último acceso: onte, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Último acceso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Permitir sempre"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Permitir selección"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Mentres se utiliza a aplicación"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Rexeitar todos"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda aos datos de actividade física e benestar?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita permiso para acceder aos seguintes datos: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nDecide se queres dar todos os permisos ou controlalos por separado."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda a este tipo de datos: <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Forma física e benestar"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sempre"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"durante o seu uso"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sempre"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Durante o seu uso"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> pode acceder <xliff:g id="ALLOW_MODE">%2$s</xliff:g> a todos os teus datos de forma física e benestar"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Con permiso de acceso"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Con permiso de lectura"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Con estes permisos, a aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> pode acceder aos datos dos sensores do teu dispositivo."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> aplicacións con permiso"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Non hai ningunha solicitude por parte das aplicacións"</string>
+    <string name="allowed" msgid="4158456017482263737">"Con permiso"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Sen permiso"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"As aplicacións que conten con este permiso poderán acceder a este tipo de datos (<xliff:g id="DATA_TYPE">%s</xliff:g>) dos sensores do teu dispositivo."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Queres quitarlles o acceso a este tipo de datos (<xliff:g id="DATA_TYPE">%s</xliff:g>) a todas as aplicacións do teu reloxo?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Marca de verificación"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Cruz"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Actualmente, <xliff:g id="APP_NAME">%1$s</xliff:g> pode acceder aos teus datos de forma física e benestar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Queres permitir que <xliff:g id="APP_NAME">%1$s</xliff:g> acceda sempre aos teus datos de forma física e benestar?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ten acceso a estes datos: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Xestionar permisos de forma física e benestar"</string>
 </resources>
diff --git a/apk/res/values-gu/strings.xml b/apk/res/values-gu/strings.xml
index 02aee6f..2e16bf4 100644
--- a/apk/res/values-gu/strings.xml
+++ b/apk/res/values-gu/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"તમારા ડિવાઇસ પર આરોગ્ય અને ફિટનેસના ડેટાને મેનેજ કરો તથા કઈ ઍપ તે ઍક્સેસ કરી શકે, તે નિયંત્રિત કરો"</string>
     <string name="data_title" msgid="4456619761533380816">"ડેટા અને ઍક્સેસ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"સ્વાસ્થ્ય સંબંધિત માહિતી બ્રાઉઝ કરો"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"તમારી સ્વાસ્થ્ય સંબંધિત માહિતી અને કઈ ઍપ તેને ઍક્સેસ કરી શકે તે જુઓ"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"બધી કૅટેગરી"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"બધી કૅટેગરી જુઓ"</string>
     <string name="no_data" msgid="1906986019249068659">"કોઈ ડેટા નથી"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ગઈ કાલે"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"વાંચો: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"લખો: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"પરવાનગીઓને મેનેજ કરો"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"સમય: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"પ્રવૃત્તિ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"તમારો આરોગ્ય સંબંધિત ડેટા ઍક્સેસ કરો"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"વપરાયેલી કૅલરીનો ડેટા વાંચો"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"ઍપને વપરાયેલી કૅલરોની ડેટા વાંચવાની મંજૂરી આપે છે"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"બૅકગ્રાઉન્ડમાં ડેટા ઍક્સેસ કરો"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>ને બૅકગ્રાઉન્ડમાં ડેટા ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>ને બૅકગ્રાઉન્ડમાં ડેટા ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"જો તમે મંજૂરી આપશો, તો જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હો, ત્યારે આ ઍપ ફિટનેસ અને સુખાકારી સંબંધિત ડેટા તેમજ સ્વાસ્થ્ય સંબંધિત માહિતી ઍક્સેસ કરી શકે છે."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"જો તમે મંજૂરી આપશો, તો જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હો, ત્યારે આ ઍપ સ્વાસ્થ્ય સંબંધિત માહિતી ઍક્સેસ કરી શકે છે."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"જો તમે મંજૂરી આપશો, તો જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હો, ત્યારે આ ઍપ ફિટનેસ અને સુખાકારી સંબંધિત ડેટા ઍક્સેસ કરી શકે છે."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"જો તમે મંજૂરી આપશો, તો જ્યારે તમે ઍપનો ઉપયોગ ન કરી રહ્યાં હો, ત્યારે આ ઍપ Health Connectનો ડેટા ઍક્સેસ કરી શકે છે."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>ને અગાઉનો ડેટા ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"જો તમે મંજૂરી આપશો, તો આ ઍપ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ના રોજ પહેલાં ઉમેરવામાં આવેલો ફિટનેસ અને સુખાકારી સંબંધિત ડેટા ઍક્સેસ કરી શકે છે."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"જો તમે મંજૂરી આપશો, તો આ ઍપ ફિટનેસ અને સુખાકારી સંબંધિત અગાઉનો તમામ ડેટા ઍક્સેસ કરી શકે છે."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"જો તમે મંજૂરી આપશો, તો આ ઍપ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ના રોજ પહેલાં ઉમેરવામાં આવેલો Health Connectનો ડેટા ઍક્સેસ કરી શકે છે."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"જો તમે મંજૂરી આપશો, તો આ ઍપ Health Connectનો અગાઉનો તમામ ડેટા ઍક્સેસ કરી શકે છે."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"શું <xliff:g id="APP_NAME">%1$s</xliff:g> માટે વધારાના ઍક્સેસની મંજૂરી આપીએ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connectના આ સેટિંગ પણ ઍક્સેસ કરવા માગે છે"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"બૅકગ્રાઉન્ડમાં તમામ ડેટા ઍક્સેસ કરો"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"બૅકગ્રાઉન્ડમાં સ્વાસ્થ્ય સંબંધિત માહિતી ઍક્સેસ કરો"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"બૅકગ્રાઉન્ડમાં ફિટનેસ અને સુખાકારી સંબંધિત ડેટા ઍક્સેસ કરો"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હો, ત્યારે આ ઍપને ફિટનેસ અને સુખાકારી સંબંધિત ડેટા તેમજ સ્વાસ્થ્ય સંબંધિત માહિતી ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"જ્યારે તમે ઍપનો ઉપયોગ ન કરી રહ્યાં હો, ત્યારે આ ઍપને આ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"જ્યારે તમે ઍપનો ઉપયોગ ન કરી રહ્યાં હો, ત્યારે આ ઍપને આ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"બૅકગ્રાઉન્ડમાં ડેટા ઍક્સેસ કરો"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"જ્યારે તમે ઍપનો ઉપયોગ ન કરી રહ્યાં હો, ત્યારે આ ઍપને Health Connectનો ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ફિટનેસ અને સુખાકારી સંબંધિત અગાઉનો ડેટા ઍક્સેસ કરો"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"આ ઍપને <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ના રોજ પહેલાં ઉમેરવામાં આવેલો ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"આ ઍપને અગાઉનો તમામ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"જૂનો ડેટા ઍક્સેસ કરો"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"આ ઍપને <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ના રોજ પહેલાં ઉમેરવામાં આવેલો Health Connectનો ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"આ ઍપને Health Connectનો અગાઉનો તમામ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> પહેલેથી જ તમારી સ્વાસ્થ્ય સંબંધિત માહિતીનો અગાઉનો ડેટા ઍક્સેસ કરી શકે છે"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"પરવાનગીઓ વિશે વધુ વાંચો"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"બૅકગ્રાઉન્ડમાં તમામ ડેટા ઍક્સેસ કરો"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"બૅકગ્રાઉન્ડમાં સ્વાસ્થ્ય સંબંધિત માહિતી ઍક્સેસ કરો"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"બૅકગ્રાઉન્ડમાં ફિટનેસ અને સુખાકારી સંબંધિત ડેટા ઍક્સેસ કરો"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હો, ત્યારે આ ઍપને ફિટનેસ અને સુખાકારી સંબંધિત ડેટા તેમજ સ્વાસ્થ્ય સંબંધિત માહિતી ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"જ્યારે તમે ઍપનો ઉપયોગ ન કરી રહ્યાં હો, ત્યારે આ ઍપને આ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"જ્યારે તમે ઍપનો ઉપયોગ ન કરી રહ્યાં હો, ત્યારે આ ઍપને આ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"બૅકગ્રાઉન્ડમાં ડેટા ઍક્સેસ કરો"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"જ્યારે તમે ઍપનો ઉપયોગ ન કરી રહ્યાં હો, ત્યારે આ ઍપને Health Connectનો ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ફિટનેસ અને સુખાકારી સંબંધિત અગાઉનો ડેટા ઍક્સેસ કરો"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"આ ઍપને <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ના રોજ પહેલાં ઉમેરવામાં આવેલો ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"આ ઍપને અગાઉનો તમામ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"જૂનો ડેટા ઍક્સેસ કરો"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"આ ઍપને <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ના રોજ પહેલાં ઉમેરવામાં આવેલો Health Connectનો ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"આ ઍપને Health Connectનો અગાઉનો તમામ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"હાલમાં ફિટનેસ સંબંધિત કોઈ ડેટા વાંચવામાં આવી રહ્યો નથી, કારણ કે <xliff:g id="APP_NAME">%1$s</xliff:g> પાસે તેને વાંચવાની કોઈ પરવાનગી ચાલુ નથી"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> પહેલેથી જ તમારી સ્વાસ્થ્ય સંબંધિત માહિતીનો અગાઉનો ડેટા ઍક્સેસ કરી શકે છે. આમાં ફેરફાર કરવા, આ ઍપ માટે સ્વાસ્થ્ય સંબંધિત માહિતીની પરવાનગીઓ બંધ કરો"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"સ્વાસ્થ્ય સંબંધિત માહિતીની પરવાનગીઓ મેનેજ કરો"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"આ ઍપ માટે બૅકગ્રાઉન્ડ કે અગાઉના ડેટાનો ઍક્સેસ ચાલુ કરવા માટે, વાંચવાની ઓછામાં ઓછી એક પરવાનગી ચાલુ કરો"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"આ ઍપ માટે બૅકગ્રાઉન્ડ ઍક્સેસ ચાલુ કરવા માટે, વાંચવાની ઓછામાં ઓછી એક પરવાનગી ચાલુ કરો"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"આ ઍપ માટે અગાઉના ડેટાનો ઍક્સેસ ચાલુ કરવા માટે, વાંચવાની ઓછામાં ઓછી એક પરવાનગી ચાલુ કરો"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"આ ઍપને Health Connectનો અગાઉનો તમામ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
     <string name="background_read_description" msgid="3203594555849969283">"જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હો, ત્યારે આ ઍપને Health Connectનો ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"જો તમે મંજૂરી આપશો, તો જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હો, ત્યારે આ ઍપ Health Connectનો ડેટા ઍક્સેસ કરી શકે છે."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"અગાઉનો ડેટા ઍક્સેસ કરો"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>ને અગાઉનો ડેટા ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"આ ઍપને <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ના રોજ પહેલાં ઉમેરવામાં આવેલો Health Connectનો ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"આ ઍપને Health Connectનો અગાઉનો તમામ ડેટા ઍક્સેસ કરવાની મંજૂરી આપો"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"જો તમે મંજૂરી આપશો, તો આ ઍપ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ના રોજ પહેલાં ઉમેરવામાં આવેલો Health Connectનો ડેટા ઍક્સેસ કરી શકે છે."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"જો તમે મંજૂરી આપશો, તો આ ઍપ Health Connectનો અગાઉનો તમામ ડેટા ઍક્સેસ કરી શકે છે."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"વપરાયેલી સક્રિય કૅલરી"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"વપરાયેલી સક્રિય કૅલરી"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"વપરાયેલી સક્રિય કૅલરીનો ડેટા વાંચો"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"વ્હીલચેરને મારવામાં આવેલા ધક્કા"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"વ્હીલચેરને મારવામાં આવેલા ધક્કાનો ડેટા વાંચો"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"વ્હીલચેરને મારવામાં આવેલા ધક્કાનો ડેટા લખો"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"ઍક્ટિવિટીની તીવ્રતા"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ઍક્ટિવિટીની તીવ્રતા"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"ઍક્ટિવિટીની તીવ્રતા વાંચો"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"ઍક્ટિવિટીની તીવ્રતા લખો"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"ચયાપચયનો મૂળભૂત દર"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"ચયાપચયનો મૂળભૂત દર"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"ચયાપચયના મૂળભૂત દરનો ડેટા વાંચો"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ત્વચાનું તાપમાન"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"ત્વચાના તાપમાનનો ડેટા વાંચો"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"ત્વચાના તાપમાનનો ડેટા લખો"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"આમાં Health Connectમાં સિંક કરેલી અને ઉમેરવામાં આવેલી સ્વાસ્થ્ય સંબંધિત બધી માહિતીનો સમાવેશ થાય છે. શક્ય છે કે આ તમારો સંપૂર્ણ મેડિકલ રેકોર્ડ ન હોય અને તેમાં તમારી સ્વાસ્થ્ય સંબંધિત માહિતીનું તબીબી વર્ણન શામેલ ન હોય."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"સ્વાસ્થ્ય સંબંધિત બધી માહિતી"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"સ્વાસ્થ્ય સંબંધિત બધી માહિતી"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"સ્વાસ્થ્ય સંબંધિત બધી માહિતી લખો"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"એલર્જી"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"એલર્જી"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"એલર્જી વિશે વાંચો"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ચેપી રોગથી મુક્તિ"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ચેપી રોગથી મુક્તિ"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"ચેપી રોગથી મુક્તિનો ડેટા વાંચો"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"લેબોરેટરીના પરિણામો"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"લેબોરેટરીના પરિણામો"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"લેબોરેટરીના પરિણામો વાંચો"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"એલર્જી"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"એલર્જી"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"એલર્જી વિશે વાંચો"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"શરતો"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"શરતો"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"વાંચવાની શરતો"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"રસીઓ"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"રસીઓ"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"રસીઓ વિશે વાંચો"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"લેબના પરિણામો"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"લેબના પરિણામો"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"લેબના પરિણામો વિશે વાંચો"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"દવાઓ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"દવાઓ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"દવાઓ વિશે વાંચો"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"વ્યક્તિગત વિગતો"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"વ્યક્તિગત વિગતો"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"વ્યક્તિગત વિગતો વાંચવી"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"તબીબી વ્યવસાયિકની વિગતો"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"તબીબી વ્યવસાયિકની વિગતો"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"તબીબી વ્યવસાયિકની વિગતો વાંચવી"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ગર્ભાવસ્થા"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ગર્ભાવસ્થા"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ગર્ભાવસ્થાનો ડેટા વાંચો"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"સમસ્યાઓ"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"સમસ્યાઓ"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"સમસ્યાઓનો ડેટા વાંચો"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"પ્રક્રિયાઓ"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"પ્રક્રિયાઓ"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"પ્રક્રિયાઓનો ડેટા વાંચો"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"સામાજિક ઇતિહાસ"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"સામાજિક ઇતિહાસ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"સામાજિક ઇતિહાસ"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"સામાજિક ઇતિહાસ વાંચો"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"આરોગ્ય વિશેની મહત્ત્વપૂર્ણ માહિતી આપતા સંકેતો"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"મુલાકાતો"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"મુલાકાતો"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"મુલાકાતોની માહિતી વાંચવી"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"આરોગ્ય વિશેની મહત્ત્વપૂર્ણ માહિતી આપતા સંકેતો"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"આરોગ્ય વિશેની મહત્ત્વપૂર્ણ માહિતી આપતા સંકેતો"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"આરોગ્ય વિશેની મહત્ત્વપૂર્ણ માહિતી આપતા સંકેતોનો ડેટા વાંચો"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"સજગતા"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"સજગતા લખો"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”ને વાંચવાની મંજૂરી આપો"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”ને લખવાની મંજૂરી આપો"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"રદ કરો"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"મંજૂરી આપો"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"બધી મંજૂરી આપો"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"મંજૂરી આપશો નહીં"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Health Connect પર તમે આ ઍપ દ્વારા જે ડેટા વાંચવા કે લખવા માગતા હો, તે ડેટા પસંદ કરો"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Health Connect પર તમે આ ઍપ દ્વારા જે ડેટા વંચાવવા કે લખાવવા માગતા હો, તે ડેટા પસંદ કરો"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connect પર તમે આ ઍપ દ્વારા જે ડેટા વંચાવવા માગતા હો, તે ડેટા પસંદ કરો"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Health Connect પર તમે આ ઍપ દ્વારા જે ડેટા લખાવવા માગતા હો, તે ડેટા પસંદ કરો"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"જો તમે વાંચવાનો ઍક્સેસ આપશો, તો આ ઍપ નવો ડેટા ઉપરાંત છેલ્લા 30 દિવસનો ડેટા પણ વાંચી શકે છે"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"જો તમે વાંચવાનો ઍક્સેસ આપશો, તો આ ઍપ નવો અને અગાઉનો ડેટા વાંચી શકે છે"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g>ને Health Connect ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"તમે ડેવલપરની <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>માં જાણી શકો છો કે <xliff:g id="APP_NAME">%1$s</xliff:g> તમારા ડેટાને કેવી રીતે હૅન્ડલ કરે છે"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>ને ફિટનેસ અને સુખાકારી સંબંધિત ડેટા ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"તમે <xliff:g id="APP_NAME">%1$s</xliff:g>ની તમારો ડેટા હૅન્ડલ કરવાની રીતે વિશે તેમના <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>માં જાણી શકો છો"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"પ્રાઇવસી પૉલિસી"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>ને તમારી સ્વાસ્થ્ય સંબંધિત માહિતી ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"જો તમે ઍક્સેસ આપો, તો ઍપ એલર્જી, લેબના પરિણામો અને રસીઓ જેવી બીજી ઘણી બાબતોનો ડેટા લખી અને વાંચી શકે છે\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"જો તમે ઍક્સેસ આપો, તો ઍપ એલર્જી, લેબના પરિણામો અને રસીઓ જેવી બીજી ઘણી બાબતોનો ડેટા વાંચી શકે છે\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"સ્વાસ્થ્ય સંબંધિત માહિતી વિશે"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"શેર કરવા માટેના ડેટામાં આ માહિતી શામેલ છે"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"જો તમે મંજૂરી આપશો, તો <xliff:g id="APP_NAME">%1$s</xliff:g> તમારી સ્વાસ્થ્ય સંબંધિત માહિતી Health Connect સાથે શેર કરી શકે છે."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"તમારી અલગ-અલગ ઍપ અને સૉર્સમાંથી તમારી સ્વાસ્થ્ય સંબંધિત માહિતી સિંક કરો, જેથી તેને એક જગ્યાએ રાખી શકાય"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"શું બધી પરવાનગીઓ કાઢી નાખીએ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"તમામ કાઢી નાખો"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી કોઈપણ ડેટા વાંચી કે લખી શકશે નહીં.\n\nઆનાથી કૅમેરા, માઇક્રોફોન કે લોકેશન જેવી આ ઍપ ધરાવતી હોઈ શકે એવી અન્ય પરવાનગીઓ પર કોઈ અસર થશે નહીં."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"અગાઉના ડેટા સહિત <xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી કોઈપણ ડેટા વાંચી કે લખી શકશે નહીં.\n\nઆનાથી લોકેશન, કૅમેરા કે માઇક્રોફોન જેવી આ ઍપ ધરાવતી હોઈ શકે એવી અન્ય પરવાનગીઓ પર કોઈ અસર થશે નહીં."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"બૅકગ્રાઉન્ડ અને અગાઉના ડેટા સહિત <xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી કોઈપણ ડેટા વાંચી કે લખી શકશે નહીં.\n\nઆનાથી લોકેશન, કૅમેરા કે માઇક્રોફોન જેવી આ ઍપ ધરાવતી હોઈ શકે એવી અન્ય પરવાનગીઓ પર કોઈ અસર થશે નહીં."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connectમાંથી <xliff:g id="APP_NAME">%1$s</xliff:g>નો ડેટા પણ ડિલીટ કરો"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"શું તમામ પરવાનગીઓ કાઢી નાખીએ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"શું સ્વાસ્થ્ય સંબંધિત માહિતીની તમામ પરવાનગીઓ કાઢી નાખીએ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"શું ફિટનેસ અને સુખાકારી સંબંધિત તમામ પરવાનગીઓ કાઢી નાખીએ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"<xliff:g id="APP_NAME">%1$s</xliff:g>માંથી Health Connectમાંથી ફિટનેસ સંબંધિત ડેટા પણ ડિલીટ કરો"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"શું સ્વાસ્થ્ય સંબંધિત માહિતીની તમામ પરવાનગીઓ કાઢી નાખીએ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"<xliff:g id="APP_NAME">%1$s</xliff:g>માંથી Health Connectમાંથી સ્વાસ્થ્ય સંબંધિત માહિતી પણ ડિલીટ કરો"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી આ ડેટા વાંચી કે લખી શકશે નહીં.\n\nઆ ઍપને કદાચ મળી હોય તેવી અન્ય પરવાનગીઓ જેમ કે કૅમેરા, માઇક્રોફોન કે લોકેશન પર આની કોઈ અસર થતી નથી."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી આ ડેટા વાંચી કે લખી શકશે નહીં, જેમાં બૅકગ્રાઉન્ડ ડેટા શામેલ છે.\n\nઆ ઍપને કદાચ મળી હોય તેવી અન્ય પરવાનગીઓ જેમ કે કૅમેરા, માઇક્રોફોન કે લોકેશન પર આની કોઈ અસર થતી નથી."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી આ ડેટા વાંચી કે લખી શકશે નહીં, જેમાં અગાઉનો ડેટા શામેલ છે.\n\nઆ ઍપને કદાચ મળી હોય તેવી અન્ય પરવાનગીઓ જેમ કે કૅમેરા, માઇક્રોફોન કે લોકેશન પર આની કોઈ અસર થતી નથી."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી આ ડેટા વાંચી કે લખી શકશે નહીં, જેમાં બૅકગ્રાઉન્ડ અને અગાઉનો ડેટા શામેલ છે.\n\nઆ ઍપને કદાચ મળી હોય તેવી અન્ય પરવાનગીઓ જેમ કે કૅમેરા, માઇક્રોફોન કે લોકેશન પર આની કોઈ અસર થતી નથી."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"શું તમામ પરવાનગીઓ કાઢી નાખીએ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી કોઈપણ ડેટા વાંચી કે લખી શકશે નહીં.\n\nઆ ઍપને કદાચ મળી હોય તેવી અન્ય પરવાનગીઓ જેમ કે કૅમેરા, માઇક્રોફોન કે લોકેશન પર આની કોઈ અસર થતી નથી."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી કોઈપણ ડેટા વાંચી કે લખી શકશે નહીં, જેમાં બૅકગ્રાઉન્ડનો ડેટા શામેલ છે.\n\nઆ ઍપને કદાચ મળી હોય તેવી અન્ય પરવાનગીઓ જેમ કે કૅમેરા, માઇક્રોફોન કે લોકેશન પર આની કોઈ અસર થતી નથી."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી કોઈપણ ડેટા વાંચી કે લખી શકશે નહીં, જેમાં અગાઉનો ડેટા શામેલ છે.\n\nઆ ઍપને કદાચ મળી હોય તેવી અન્ય પરવાનગીઓ જેમ કે કૅમેરા, માઇક્રોફોન કે લોકેશન પર આની કોઈ અસર થતી નથી."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> હવેથી Health Connectમાંથી કોઈપણ ડેટા વાંચી કે લખી શકશે નહીં, જેમાં બૅકગ્રાઉન્ડ અને અગાઉનો ડેટા શામેલ છે.\n\nઆ ઍપને કદાચ મળી હોય તેવી અન્ય પરવાનગીઓ જેમ કે કૅમેરા, માઇક્રોફોન કે લોકેશન પર આની કોઈ અસર થતી નથી."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"<xliff:g id="APP_NAME">%1$s</xliff:g> પર Health Connectમાંથી લખવામાં આવેલો ફિટનેસ સંબંધિત ડેટા અને સ્વાસ્થ્ય સંબંધિત માહિતી પણ ડિલીટ કરો"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"આ ઍપમાંથી પરવાનગીઓ કાઢી નાખી"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Health Connectનો તમામ ડેટા પણ ડિલીટ કરો"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"આગલો દિવસ"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"પસંદ કરેલો દિવસ"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"પાછલો દિવસ"</string>
     <string name="default_error" msgid="7966868260616403475">"કંઈક ખોટું થયું. કૃપા કરીને ફરી પ્રયાસ કરો."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"અજાણ સંસાધન"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ડેટા સૉર્સ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>ખુલ્લો છગડિયો કૌંસ."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>બંધ છગડિયો કૌંસ."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ફીલ્ડ <xliff:g id="FIELD">%2$s</xliff:g>નું મૂલ્ય"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"આ બધી ઍપ હવે કોઈ ઍક્સેસ ધરાવતી નથી, પરંતુ હજી પણ Health Connectમાં તેનો ડેટા સ્ટોર કરેલો છે"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> પછી ઉમેરવામાં આવેલા ડેટાને <xliff:g id="APP_NAME">%1$s</xliff:g> વાંચી શકે છે"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"આ ઍપ ઍક્સેસ કરી શકે તેવી અન્ય Android પરવાનગીઓ મેનેજ કરવા માટે, સેટિંગ &gt; ઍપ પર જાઓ"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> સાથે તમે જે ડેટા શેર કરો છો, તે તેમની પ્રાઇવસી પૉલિસીમાં આવરી લેવામાં આવ્યો છે"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"તમે ડેવલપરની પ્રાઇવસી પૉલિસીમાં <xliff:g id="APP_NAME">%1$s</xliff:g> તમારા ડેટાને કેવી રીતે હૅન્ડલ કરે છે, તે જાણી શકો છો"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"આ ઍપ ઍક્સેસ કરી શકે તેવી અન્ય Android પરવાનગીઓ મેનેજ કરવા માટે, સેટિંગ પર જાઓ, પછી ઍપ પર ટૅપ કરો"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"પ્રાઇવસી પૉલિસી વાંચો"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"છેલ્લા 24 કલાકમાં ઍક્સેસ કરેલી પરવાનગીઓ"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ઍપનો ઍક્સેસ"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"તમારી પાસે હાલમાં કોઈપણ સુસંગત ઍપ ઇન્સ્ટૉલ કરેલી નથી"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"વધારાનો ઍક્સેસ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ભૂતકાળનો ડેટા, બૅકગ્રાઉન્ડ ડેટા"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"આ ઍપ માટેની વધારાની પરવાનગીઓ કાઢી નાખી"</string>
     <string name="permissions_header" msgid="6519976063360071569">"પરવાનગીઓ"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ફિટનેસ અને સુખાકારી"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"વ્યાયામ, ઊંઘ, પોષણ અને અન્ય"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"સ્વાસ્થ્ય સંબંધિત માહિતી"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"સ્વાસ્થ્ય સંબંધિત માહિતી"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"લેબના પરિણામો, દવાઓ, રસીકરણ અને અન્ય"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"લેબના પરિણામો, દવાઓ, રસીઓ અને અન્ય"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"કાઢી નાખેલી ઍપ પરવાનગીઓ"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect દ્વારા <xliff:g id="APP_DATA">%s</xliff:g> માટેની પરવાનગીઓ કાઢી નાખવામાં આવી"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect દ્વારા <xliff:g id="APP_DATA_0">%1$s</xliff:g> અને <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> માટેની પરવાનગીઓ કાઢી નાખવામાં આવી"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store પર જાઓ"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect સાથે શરુ કરો"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect તમારો આરોગ્ય અને ફિટનેસ સંબંધિત ડેટા સ્ટોર કરે છે, જેનાથી તમે તમારા ડિવાઇસ પર વિવિધ ઍપ સરળ રીતે સિંક કરી શકો છો"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect અલગ-અલગ ઍપમાંથી આરોગ્ય અને ફિટનેસ સંબંધિત તમારો ડેટા સ્ટોર અને સિંક કરે છે.\n\n"<b>"ફિટનેસ અને સુખાકારી સંબંધિત ડેટા,"</b>" જેમાં વ્યાયામ સત્રો, પગલાં, પોષણ, ઊંઘ અને બીજું ઘણું શામેલ હોય છે\n\n"<b>"સ્વાસ્થ્ય સંબંધિત માહિતી,"</b>" જેમાં રસીઓ, લેબના પરિણામો અને બીજું ઘણું શામેલ હોય છે"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect સાથે તમે આટલું કરી શકો છો"</string>
     <string name="share_data" msgid="3481932156368883946">"તમારી ઍપ સાથે ડેટા શેર કરો"</string>
     <string name="share_data_description" msgid="2919871301634375092">"દરેક ઍપ Health Connect પર વાંચી કે લખી શકે તે ડેટા પસંદ કરો"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"તમારા સેટિંગ અને પ્રાઇવસી મેનેજ કરો"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"ઓછો સ્રાવ"</string>
     <string name="flow_medium" msgid="3783688724668943154">"મધ્યમ સ્રાવ"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ભારે સ્રાવ"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"ફ્લોનું અજાણ્યું પ્રમાણ"</string>
     <string name="period_day" msgid="3821944462093965882">"માસિકના <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> દિવસમાંથી દિવસ <xliff:g id="DAY">%1$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{માસિક (દિવસ 1)}one{માસિક (દિવસ #)}other{માસિક (દિવસ #)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"સકારાત્મક"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"નકારાત્મક"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ઊંચું"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"મ્યુઝિક"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"અન્ય"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"માર્ગદર્શન વિનાના"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"મધ્યમ"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"તીવ્ર"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> મિનિટ"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> કલાક <xliff:g id="MIN">%2$s</xliff:g> મિનિટ"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> કલાક"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"એકીકરણની પ્રક્રિયા ચાલુ છે"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connectનું Android સિસ્ટમ સાથે એકીકરણ કરવામાં આવી રહ્યું છે.\n\nતમારો ડેટા અને પરવાનગીઓ ટ્રાન્સફર થઈ રહી હોય ત્યારે આ પ્રક્રિયામાં થોડો સમય લાગી શકે છે."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"જ્યાં સુધી તમને પ્રક્રિયા પૂર્ણ થઈ ગઈ હોવાનું નોટિફિકેશન ન મળે ત્યાં સુધી ઍપ બંધ કરશો નહીં."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connectનું એકીકરણ ચાલુ છે"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"અપડેટ જરૂરી છે"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connectનું Android સિસ્ટમ સાથે એકીકરણ કરવામાં આવી રહ્યું છે જેથી તમે સીધા તમારા સેટિંગમાંથી તેને ઍક્સેસ કરી શકશો."</string>
     <string name="update_button" msgid="4544529019832009496">"અપડેટ કરો"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"આ અપડેટ કરવાનું શરૂ કરો કે જેથી Health Connect તમારી સિસ્ટમના સેટિંગ સાથે એકીકરણ ચાલુ રાખી શકે"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"હમણાં અપડેટ કરો"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"સિસ્ટમ અપડેટ જરૂરી છે"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"ચાલુ રાખતા પહેલાં, તમારા ફોનની સિસ્ટમ અપડેટ કરો."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"જો તમે પહેલેથી તમારી ફોન સિસ્ટમ અપડેટ કરેલી હોય, તો એકીકરણ ચાલુ રાખવા માટે તમારો ફોન ફરી શરૂ કરવાનો પ્રયાસ કરો"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect ઍપને અપડેટ કરવી જરૂરી છે"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"ચાલુ રાખતા પહેલાં, Health Connect ઍપને એકદમ નવા વર્ઝન પર અપડેટ કરો."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"વધુ સ્પેસની જરૂર છે"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"એકીકરણ ચાલુ રાખવા માટે Health Connectને તમારા ફોન પર <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> સ્ટોરેજ સ્પેસની જરૂર છે.\n\nતમારા ફોન પરથી કેટલીક સ્પેસ સાફ કરીને પછી ફરી પ્રયાસ કરો."</string>
     <string name="try_again_button" msgid="8745496819992160789">"ફરી પ્રયાસ કરો"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"સ્પેસ ખાલી કરો"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"વધુ સ્પેસની જરૂર છે"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"એકીકરણ ચાલુ રાખવા માટે Health Connectને તમારા ફોન પર <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> સ્ટોરેજ સ્પેસની જરૂર છે."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"એકીકરણ થોભાવ્યું"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ઍપના Android સિસ્ટમ સાથે એકીકરણ દરમિયાન તે બંધ થઈ ગઈ હતી.\n\nઍપ ફરી ખોલવા તેમજ ડેટા અને પરવાનગીઓ ટ્રાન્સફર કરવાનું ચાલુ રાખવા માટે ફરી શરૂ કરો પર ક્લિક કરો."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect પરનો તમારો ડેટા રાખવા માટે, આને <xliff:g id="TIME_NEEDED">%1$s</xliff:g>ની અંદર પૂર્ણ કરો"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connectનું Android સિસ્ટમ સાથે એકીકરણ કરવાનું ચાલુ રાખવા માટે ટૅપ કરો. તમારો ડેટા રાખવા માટે, <xliff:g id="TIME_NEEDED">%1$s</xliff:g>ની અંદર આ પૂર્ણ કરો"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connectનું Android સિસ્ટમ સાથે એકીકરણ કરવાનું ચાલુ રાખવા માટે ટૅપ કરો."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ચાલુ રાખો"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect એકીકરણ ફરી શરૂ કરો"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"તમારો ડેટા રાખવા માટે, <xliff:g id="TIME_NEEDED">%1$s</xliff:g>ની અંદર આ પૂર્ણ કરો"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ઍપ સંબંધિત અપડેટ જરૂરી છે"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect સાથે સિંક કરવાનું ચાલુ રાખવા માટે, <xliff:g id="APP_NAME">%1$s</xliff:g> અપડેટ કરવી જરૂરી છે"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect સાથે સિંક કરવાનું ચાલુ રાખવા માટે, અમુક ઍપ અપડેટ કરવી જરૂરી છે"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect સાથે સિંક કરવાનું ચાલુ રાખવા માટે <xliff:g id="APP_NAME">%1$s</xliff:g> અપડેટ કરવી જરૂરી છે. બધી ઍપ માટે અપડેટ ઉપલબ્ધ ન હોય એવું બની શકે છે."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect સાથે સિંક કરવાનું ચાલુ રાખવા માટે અમુક ઍપ અપડેટ કરવી જરૂરી છે. બધી ઍપ માટે અપડેટ ઉપલબ્ધ ન હોય એવું બની શકે છે."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"અપડેટ ચેક કરો"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"વધુ જાણો"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connectનું એકીકરણ"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connectનું એકીકરણ પૂર્ણ થયું નથી"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"તે ફરી ઉપલબ્ધ થશે ત્યારે તમને નોટિફિકેશન મળશે."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"સમજાઈ ગયું"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connectનું એકીકરણ પૂર્ણ થયું નથી"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"વધુ વાંચો"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connectનું એકીકરણ પૂર્ણ થયું"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"ખોલો"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"નવું શું છે"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"હવે તમે Health Connectને સીધા તમારા સેટિંગમાંથી ઍક્સેસ કરી શકો છો. સ્ટોરેજ સ્પેસ ખાલી કરવા માટે, Health Connect ઍપને કોઈપણ સમયે અનઇન્સ્ટૉલ કરો."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"સમજાઈ ગયું"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ઍપના સૉર્સમાં ફેરફાર કરો"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ડિવાઇસ પર ડિફૉલ્ટ"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ઍપનો ડેટા"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connectનો ઍક્સેસ ધરાવતી ઍપનો ડેટા અહીં દેખાશે"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g>માંનો ડેટા અહીં દેખાશે"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connectનો ઍક્સેસ ધરાવતી ઍપનો ડેટા અહીં દેખાશે"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"દિવસ"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"અઠવાડિયું"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"મહિનો"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ગયા મહિને"</string>
     <string name="tab_entries" msgid="3402700951602029493">"એન્ટ્રી"</string>
     <string name="tab_access" msgid="7818197975407243701">"ઍક્સેસ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"શું <xliff:g id="APP_NAME">%1$s</xliff:g> માટે વધારાના ઍક્સેસની મંજૂરી આપીએ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connectના આ સેટિંગ પણ ઍક્સેસ કરવા માગે છે"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"આ ઍપ માટે બૅકગ્રાઉન્ડ કે અગાઉના ડેટાનો ઍક્સેસ ચાલુ કરવા માટે, વાંચવાની ઓછામાં ઓછી એક પરવાનગી ચાલુ કરો"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"આ ઍપ માટે બૅકગ્રાઉન્ડ ઍક્સેસ ચાલુ કરવા માટે, વાંચવાની ઓછામાં ઓછી એક પરવાનગી ચાલુ કરો"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"આ ઍપ માટે અગાઉના ડેટાનો ઍક્સેસ ચાલુ કરવા માટે, વાંચવાની ઓછામાં ઓછી એક પરવાનગી ચાલુ કરો"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connectનો ઉપયોગ કરવાનું શરૂ કરો"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"આરોગ્ય અને ફિટનેસ વિશેના ડેટાને ઍપ વચ્ચે શેર કરવા માટે પહેલા તેને સિંક કરો"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"સેટઅપ કરો"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"સુસંગત ઍપ જુઓ"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect દ્વારા <xliff:g id="APP_NAME">%s</xliff:g> સાથે સિંક કરવા માટે વધુ ઍપ શોધો"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ઍપ સ્ટોર પર જુઓ"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"સ્ક્રીન લૉક સેટ કરો"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"તમારા આરોગ્ય સંબંધિત ડેટાની વધારાની સુરક્ષા માટે, આ ડિવાઇસ માટે પિન, પૅટર્ન અથવા પાસવર્ડ સેટ કરો"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"સ્ક્રીન લૉક સેટ કરો"</string>
     <string name="select_all" msgid="837499881590001166">"તમામ પસંદ કરો"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"હવે કનેક્ટેડ ઍપ Health Connectમાંથી આ ડેટા વાંચી શકશે નહીં"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ચેક કર્યું છે"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ચેક કર્યું નથી"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"વ્યાયામના નકશાનો રસ્તો ઉપલબ્ધ છે"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"આગલો દિવસ"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"આગલું અઠવાડિયું"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"આગલો મહિનો"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"પાછલો દિવસ"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"પાછલું અઠવાડિયું"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"પાછલો મહિનો"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"બધો ડેટા કાયમ માટે ડિલીટ કરીએ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"પસંદ કરવામાં આવેલો ડેટા કાયમ માટે ડિલીટ કરીએ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g>નો બધો ડેટા કાયમ માટે ડિલીટ કરીએ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>ના અઠવાડિયાની <xliff:g id="APP_NAME">%1$s</xliff:g>ની પસંદ કરવામાં આવેલી એન્ટ્રી કાયમ માટે ડિલીટ કરીએ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>ની, <xliff:g id="APP_NAME">%1$s</xliff:g>ની પસંદ કરવામાં આવેલી એન્ટ્રી કાયમ માટે ડિલીટ કરીએ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"શું <xliff:g id="APP_NAME">%s</xliff:g>ની આ એન્ટ્રી કાયમ માટે ડિલીટ કરીએ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> માટે <xliff:g id="DATA_TYPE">%1$s</xliff:g> ડેટા કાયમી રીતે ડિલીટ કરીએ?"</string>
+    <string name="on" msgid="8266542510798355807">"ચાલુ છે"</string>
+    <string name="off" msgid="6996623844428550649">"બંધ છે"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"છેલ્લે <xliff:g id="TIME_DATE">%1$s</xliff:g> વાગ્યે ઍક્સેસ કરી"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"ઍક્સેસ કર્યાનો સમય ગઈકાલે <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"ઍક્સેસ કર્યાનો સમય <xliff:g id="TIME_DATE_0">%1$s</xliff:g>ના રોજ <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"હંમેશાં મંજૂરી આપો"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"પસંદ કરેલી મંજૂર કરો"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ઍપનો ઉપયોગ કરતી વખતે"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"બધી નકારો"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>ને ફિટનેસ અને સુખાકારી સંબંધિત ડેટા ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DATA_TYPES">%2$s</xliff:g>ના ઍક્સેસની વિનંતી કરી રહી છે.\n\nમંજૂરી આપવા માટે બધી પરવાનગીઓને પસંદ કરો અથવા તેમને અલગ-અલગ મેનેજ કરો."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="DATA_TYPE">%2$s</xliff:g>ના ઍક્સેસ માટે <xliff:g id="APP_NAME">%1$s</xliff:g>ને મંજૂરી આપીએ?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ફિટનેસ અને સુખાકારી"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"હંમેશાં"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ઉપયોગ કરતી વખતે"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"હંમેશાં"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ઉપયોગ કરતી વખતે"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા આરોગ્ય અને સુખાકારીનો બધો ડેટા <xliff:g id="ALLOW_MODE">%2$s</xliff:g>માં ઍક્સેસ કરી શકે છે"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"ઍક્સેસ કરવાની મંજૂરી છે"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"વાંચવાની મંજૂરી છે"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"આ પરવાનગીઓ <xliff:g id="APP_NAME">%1$s</xliff:g>ને તમારા ડિવાઇસ સેન્સરમાંના ડેટાનો ઍક્સેસ આપે છે."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g>માંથી <xliff:g id="NUMBER_0">%1$d</xliff:g> ઍપને મંજૂરી છે"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"કોઈ ઍપ વિનંતી કરી રહી નથી"</string>
+    <string name="allowed" msgid="4158456017482263737">"આ ઍપને મંજૂરી છે"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"આ ઍપને મંજૂરી નથી"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"આ પરવાનગી ધરાવતી ઍપ તમારા ડિવાઇસ સેન્સરમાંથી <xliff:g id="DATA_TYPE">%s</xliff:g> ડેટાને ઍક્સેસ કરી શકે છે."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"તમારી વૉચ પર બધી ઍપ માટે <xliff:g id="DATA_TYPE">%s</xliff:g>નો ઍક્સેસ કાઢી નાખીએ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"ચેક માર્ક"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"ક્રૉસ માર્ક"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"હાલમાં, <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="ALLOW_MODE">%2$s</xliff:g> માટે ફિટનેસ અને સુખાકારીના ડેટાને ઍક્સેસ કરી શકે છે"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g>ને હંમેશાં માટે ફિટનેસ અને સુખાકારી સંબંધિત ડેટાના ઍક્સેસની મંજૂરી આપીએ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g>ને <xliff:g id="DATA_TYPES">%2$s</xliff:g>નો ઍક્સેસ છે."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ફિટનેસ અને સુખાકારીની પરવાનગીઓ મેનેજ કરો"</string>
 </resources>
diff --git a/apk/res/values-hi/strings.xml b/apk/res/values-hi/strings.xml
index dd7448d..0d54ccc 100644
--- a/apk/res/values-hi/strings.xml
+++ b/apk/res/values-hi/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"अपने डिवाइस पर, सेहत और फ़िटनेस से जुड़ा डेटा मैनेज करें. साथ ही, यह कंट्रोल करें कि कौनसे ऐप्लिकेशन इसे ऐक्सेस कर सकते हैं"</string>
     <string name="data_title" msgid="4456619761533380816">"डेटा और उसका ऐक्सेस"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"सेहत का डेटा ब्राउज़ करें"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"अपनी सेहत का डेटा देखें और जानें कि कौनसे ऐप्लिकेशन उसे ऐक्सेस कर सकते हैं"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"सभी कैटगरी"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"सभी कैटगरी देखें"</string>
     <string name="no_data" msgid="1906986019249068659">"कोई डेटा उपलब्ध नहीं है"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"बीता हुआ कल"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"पढ़ें: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"लिखें: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"अनुमतियां मैनेज करें"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"समय: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"गतिविधि"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"आपके स्वास्थ्य की जानकारी से जुड़ा डेटा ऐक्सेस करने की अनुमति दें"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"खर्च हुई कैलोरी का डेटा पढ़ने की अनुमति दें"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"इससे ऐप्लिकेशन को खर्च की गई कैलोरी का डेटा पढ़ने की अनुमति मिलती है"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"बैकग्राउंड में डेटा ऐक्सेस करने की अनुमति दें"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को बैकग्राउंड में डेटा ऐक्सेस करने की अनुमति देनी है?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को बैकग्राउंड में डेटा ऐक्सेस करने की अनुमति देनी है?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"अनुमति मिलने पर, यह ऐप्लिकेशन तब भी फ़िटनेस, तंदुरुस्ती, और सेहत के डेटा को ऐक्सेस कर सकता है, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"अनुमति मिलने पर, यह ऐप्लिकेशन तब भी सेहत के डेटा को ऐक्सेस कर सकता है, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"अनुमति मिलने पर, यह ऐप्लिकेशन तब भी फ़िटनेस और तंदुरुस्ती के डेटा को ऐक्सेस कर सकता है, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"अनुमति मिलने पर, यह ऐप्लिकेशन तब भी Health Connect का डेटा ऐक्सेस कर सकता है, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को पुराना डेटा ऐक्सेस करने की अनुमति देनी है?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"अनुमति मिलने पर, यह ऐप्लिकेशन <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> से पहले जोड़े गए, फ़िटनेस और तंदुरुस्ती के डेटा को ऐक्सेस कर सकता है."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"अनुमति मिलने पर यह ऐप्लिकेशन, फ़िटनेस और तंदुरुस्ती का पुराना डेटा ऐक्सेस कर सकता है."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"अनुमति मिलने पर यह ऐप्लिकेशन, Health Connect का <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> से पहले जोड़ा गया डेटा ऐक्सेस कर सकता है."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"अनुमति मिलने पर यह ऐप्लिकेशन, Health Connect का सारा पुराना डेटा ऐक्सेस कर सकता है."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को अन्य ऐक्सेस देने हैं?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> को Health Connect की इन सेटिंग का भी ऐक्सेस चाहिए"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"बैकग्राउंड में सारा डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"सेहत के डेटा को बैकग्राउंड में ऐक्सेस करने की अनुमति दें"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"फ़िटनेस और तंदुरुस्ती के डेटा को बैकग्राउंड में ऐक्सेस करने की अनुमति दें"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"इस ऐप्लिकेशन को अनुमति दें कि यह तब भी फ़िटनेस, तंदुरुस्ती, और सेहत के डेटा को ऐक्सेस कर पाए, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"इस ऐप्लिकेशन को अनुमति दें कि यह तब भी इस डेटा को ऐक्सेस कर पाए, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"इस ऐप्लिकेशन को अनुमति दें कि यह तब भी इस डेटा को ऐक्सेस कर पाए, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"बैकग्राउंड में डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"इस ऐप्लिकेशन को अनुमति दें कि यह तब भी Health Connect का डेटा ऐक्सेस कर पाए, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"फ़िटनेस और तंदुरुस्ती का पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"इस ऐप्लिकेशन को, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> से पहले जोड़ा गया डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"इस ऐप्लिकेशन को, सारा पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"इस ऐप्लिकेशन को, Health Connect का <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> से पहले जोड़ा गया डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"इस ऐप्लिकेशन को, Health Connect का सारा पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास आपकी सेहत का पुराना डेटा ऐक्सेस करने की अनुमति पहले से है"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"अनुमतियों के बारे में ज़्यादा पढ़ें"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"बैकग्राउंड में सारा डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"सेहत के डेटा को बैकग्राउंड में ऐक्सेस करने की अनुमति दें"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"फ़िटनेस और तंदुरुस्ती के डेटा को बैकग्राउंड में ऐक्सेस करने की अनुमति दें"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"इस ऐप्लिकेशन को अनुमति दें कि यह तब भी फ़िटनेस, तंदुरुस्ती, और सेहत के डेटा को ऐक्सेस कर पाए, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"इस ऐप्लिकेशन को अनुमति दें कि यह तब भी इस डेटा को ऐक्सेस कर पाए, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"इस ऐप्लिकेशन को अनुमति दें कि यह तब भी इस डेटा को ऐक्सेस कर पाए, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"बैकग्राउंड में डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"इस ऐप्लिकेशन को अनुमति दें कि यह तब भी Health Connect का डेटा ऐक्सेस कर पाए, जब ऐप्लिकेशन का इस्तेमाल न किया जा रहा हो"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"फ़िटनेस और तंदुरुस्ती का पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"इस ऐप्लिकेशन को, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> से पहले जोड़ा गया डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"इस ऐप्लिकेशन को, सारा पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"इस ऐप्लिकेशन को, Health Connect का <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> से पहले जोड़ा गया डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"इस ऐप्लिकेशन को, Health Connect का सारा पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"फ़िलहाल, फ़िटनेस से जुड़ा कोई भी डेटा नहीं देखा जा रहा है, क्योंकि <xliff:g id="APP_NAME">%1$s</xliff:g> के पास इस डेटा को ऐक्सेस करने की अनुमति नहीं है"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके सेहत से जुड़े पुराने डेटा को पहले से ही ऐक्सेस कर सकता है. इसे बदलने के लिए, इस ऐप्लिकेशन को दी सेहत के डेटा को ऐक्सेस करने की अनुमति को बंद करें"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"सेहत के डेटा के लिए अनुमतियां मैनेज करें"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"डेटा ऐक्सेस करने से जुड़ी कम से कम कोई एक अनुमति दें, ताकि यह ऐप्लिकेशन बैकग्राउंड में या पहले से मौजूद डेटा ऐक्सेस कर सके"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"इस ऐप्लिकेशन में बैकग्राउंड ऐक्सेस करने की सुविधा चालू करने के लिए, पढ़ने की कम से कम एक अनुमति दें"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"इस ऐप्लिकेशन में पहले से मौजूद डेटा ऐक्सेस करने की सुविधा चालू करने के लिए, पढ़ने की कम से कम एक अनुमति दें"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"इस ऐप्लिकेशन को, Health Connect का सारा पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
     <string name="background_read_description" msgid="3203594555849969283">"ऐप्लिकेशन को अनुमति दें कि जब उसका इस्तेमाल न किया जा रहा हो, तब भी वह Health Connect का डेटा ऐक्सेस कर पाए"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"अनुमति देने पर, यह ऐप्लिकेशन इस्तेमाल न किए जाने के दौरान भी Health Connect का डेटा ऐक्सेस कर पाएगा"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को पुराना डेटा ऐक्सेस करने की अनुमति देनी है?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"ऐप्लिकेशन को <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> से पहले जोड़ा गया Health Connect का डेटा ऐक्सेस करने की अनुमति दें"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"इस ऐप्लिकेशन को Health Connect का सारा पुराना डेटा ऐक्सेस करने की अनुमति दें"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"अनुमति मिलने पर, यह Health Connect का वह डेटा ऐक्सेस कर सकता है जिसे <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> से पहले जोड़ा गया है."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"इस ऐप्लिकेशन को अनुमति देने पर, यह Health Connect का सारा पुराना डेटा ऐक्सेस कर सकता है."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"शारीरिक गतिविधि के दौरान खर्च हुई कैलोरी का डेटा"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"शारीरिक गतिविधि के दौरान खर्च हुई कैलोरी का डेटा"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"शारीरिक गतिविधि के दौरान खर्च हुई कैलोरी का डेटा पढ़ने की अनुमति दें"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"व्हीलचेयर ढकेलने से जुड़ा डेटा"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"व्हीलचेयर ढकेलने से जुड़ा डेटा पढ़ने की अनुमति दें"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"व्हीलचेयर ढकेलने से जुड़ा डेटा सेव करने की अनुमति दें"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"गतिविधि की इंटेंसिटी"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"गतिविधि की इंटेंसिटी"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"गतिविधि की इंटेंसिटी का डेटा पढ़ने की अनुमति दें"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"गतिविधि की इंटेंसिटी के डेटा में बदलाव करने की अनुमति दें"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"बेसल मेटाबॉलिक रेट का डेटा"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"बेसल मेटाबॉलिक रेट का डेटा"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"बेसल मेटाबॉलिक रेट का डेटा पढ़ने की अनुमति दें"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"त्वचा का तापमान"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"त्वचा के तापमान से जुड़ी जानकारी देखें"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"त्वचा के तापमान से जुड़ी जानकारी में बदलाव करें"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"इस डेटा में, Health Connect से सिंक किया गया और इसमें जोड़ा गया सेहत का सारा डेटा शामिल है. ऐसा हो सकता है कि इस डेटा में आपका पूरा मेडिकल रिकॉर्ड शामिल न हो और यह आपके सेहत के डेटा से जुड़े ब्यौरे की जानकारी न दे."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"सेहत का सारा डेटा"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"सेहत का सारा डेटा"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"डेटा में बदलाव करने की अनुमति दें"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"एलर्जी"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"एलर्जी"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"एलर्जी से जुड़ा डेटा देखने की अनुमति दें"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"टीकाकरण से जुड़ा डेटा"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"टीकाकरण से जुड़ा डेटा"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"टीकाकरण से जुड़ा डेटा पढ़ने की अनुमति दें"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"लैब में हुई जांच के नतीजे"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"लैब में हुई जांच के नतीजे"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"लैब में हुई जांच के नतीजे देखने की अनुमति दें"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"एलर्जी"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"एलर्जी"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"एलर्जी से जुड़ा डेटा देखने की अनुमति दें"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"स्वास्थ्य से जुड़ी स्थितियां"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"स्वास्थ्य से जुड़ी स्थितियां"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"स्वास्थ्य की स्थिति से जुड़ा डेटा देखने की अनुमति दें"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"टीकाकरण से जुड़ा डेटा"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"टीकाकरण से जुड़ा डेटा"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"टीकाकरण से जुड़ा डेटा देखने की अनुमति दें"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"लैब से मिले नतीजे"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"लैब से मिले नतीजे"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"लैब से मिले नतीजे देखने की अनुमति दें"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"दवाइयां"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"दवाइयां"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"दवाइयों से जुड़ा डेटा देखने की अनुमति दें"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"निजी जानकारी"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"निजी जानकारी"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"निजी जानकारी पढ़ने की अनुमति दें"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"प्रैक्टिशनर की जानकारी"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"प्रैक्टिशनर की जानकारी"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"प्रैक्टिशनर की जानकारी पढ़ने की अनुमति दें"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"गर्भावस्था से जुड़ा डेटा"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"गर्भावस्था से जुड़ा डेटा"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"गर्भावस्था से जुड़ा डेटा देखने की अनुमति दें"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"समस्याओं से जुड़ा डेटा"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"समस्याओं से जुड़ा डेटा"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"समस्याओं से जुड़ा डेटा देखने की अनुमति दें"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"इलाज से जुड़ा डेटा"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"इलाज से जुड़ा डेटा"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"इलाज से जुड़ा डेटा देखने की अनुमति दें"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"सोशल मीडिया के इस्तेमाल से जुड़ा डेटा"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"सोशल मीडिया के इस्तेमाल से जुड़ा डेटा"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"सोशल मीडिया के इस्तेमाल से जुड़ा डेटा"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"सोशल मीडिया से जुड़ा डेटा इस्तेमाल करने की अनुमति दें"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"बीपी, धड़कन की दर वगैरह से जुड़ा डेटा"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"मेडिकल प्रोफ़ेशनल के पास जाने से जुड़ी जानकारी"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"मेडिकल प्रोफ़ेशनल के पास जाने से जुड़ी जानकारी"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"मेडिकल प्रोफ़ेशनल के पास जाने से जुड़ी जानकारी पढ़ने की अनुमति दें"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"बीपी, धड़कन की दर वगैरह से जुड़ा डेटा"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"बीपी, धड़कन की दर वगैरह से जुड़ा डेटा"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"बीपी, धड़कन की दर वगैरह से जुड़ा डेटा देखने की अनुमति दें"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"सजगता"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"सजगता के डेटा में बदलाव करें"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” को डेटा पढ़ने की अनुमति दें"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” को डेटा में बदलाव करने की अनुमति दें"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"रद्द करें"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"अनुमति दें"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"सभी को अनुमति दें"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"अनुमति न दें"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"चुनें कि इस ऐप्लिकेशन को, Health Connect में मौजूद कौनसा डेटा पढ़ने या सेव करने की अनुमति देनी है"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"चुनें कि इस ऐप्लिकेशन को, Health Connect में कौनसा डेटा देखने या सेव करने की अनुमति देनी है"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"चुनें कि इस ऐप्लिकेशन को, Health Connect में कौनसा डेटा देखने की अनुमति देनी है"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"चुनें कि इस ऐप्लिकेशन को, Health Connect में कौनसा डेटा सेव करने की अनुमति देनी है"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"अगर आपने इस ऐप्लिकेशन को पढ़ने का ऐक्सेस दिया है, तो यह नया और पिछले 30 दिनों का डेटा पढ़ सकता है"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"अगर आपने इस ऐप्लिकेशन को पढ़ने का ऐक्सेस दिया है, तो यह नया और पुराना डेटा पढ़ सकता है"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> को Health Connect का डेटा ऐक्सेस करने की अनुमति देनी है?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g>, आपके डेटा को कैसे हैंडल करता है इसके बारे में जानने के लिए, डेवलपर की <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> में जाएं"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को फ़िटनेस और तंदुरुस्ती का डेटा ऐक्सेस करने की अनुमति देनी है?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> में जाकर जानें कि <xliff:g id="APP_NAME">%1$s</xliff:g> आपके डेटा को कैसे मैनेज करता है"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"निजता नीति"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को अपना सेहत का डेटा ऐक्सेस करने की अनुमति देनी है?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"ऐक्सेस देने पर, ऐप्लिकेशन आपका डेटा देख सकता है और उसे सेव कर सकता है. जैसे, एलर्जी, लैब के नतीजे, टीके वगैरह का डेटा\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"ऐक्सेस देने पर, ऐप्लिकेशन आपका डेटा देख सकता है. जैसे, एलर्जी, लैब के नतीजे, टीके वगैरह का डेटा\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"सेहत के डेटा से जुड़ी जानकारी"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"शेयर किए जाने वाले डेटा में यह जानकारी शामिल है"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"अनुमति मिलने पर, <xliff:g id="APP_NAME">%1$s</xliff:g> आपके सेहत के डेटा को Health Connect के साथ शेयर कर सकता है."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"अलग-अलग ऐप्लिकेशन और सोर्स में मौजूद अपने सेहत का डेटा सिंक करें, ताकि वे एक ही जगह पर सेव रहे"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"क्या आपको सभी अनुमतियां हटानी हैं?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"सभी अनुमतियां हटाएं"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के किसी भी डेटा को पढ़ने या उसमें बदलाव करने की अनुमति नहीं होगी.\n\nइससे, इस ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के किसी भी डेटा को पढ़ने या उसमें बदलाव करने की अनुमति नहीं होगी. इसमें पहले से मौजूद डेटा को ऐक्सेस करने की अनुमति भी शामिल है.\n\nऐसा करके, इस ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के किसी भी डेटा को पढ़ने या उसमें बदलाव करने की अनुमति नहीं होगी. इसमें जेनरेट हो रहा नया डेटा और पहले से मौजूद डेटा, दोनों शामिल हैं.\n\nहालांकि, इस ऐप्लिकेशन को मिली दूसरी अनुमतियों पर कोई असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"<xliff:g id="APP_NAME">%1$s</xliff:g> का, Health Connect में सेव किया गया डेटा भी मिटाएं"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"क्या आपको सभी अनुमतियां हटानी हैं?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"क्या आपको सेहत के डेटा से जुड़ी सभी अनुमतियां हटानी हैं?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"क्या आपको फ़िटनेस और सेहत से जुड़ी सभी अनुमतियां हटानी हैं?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर मौजूद फिटनेस का डेटा भी Health Connect से मिटाएं"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"क्या आपको सेहत के डेटा से जुड़ी सभी अनुमतियां हटानी हैं?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर मौजूद सेहत का डेटा भी Health Connect से मिटाएं"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के इस डेटा को देखने या उसमें बदलाव करने की अनुमति नहीं होगी.\n\nइससे ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के इस डेटा को देखने या उसमें बदलाव करने की अनुमति नहीं होगी. इसमें बैकग्राउंड डेटा को ऐक्सेस करने की अनुमति भी शामिल है.\n\nइससे ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के इस डेटा को देखने या उसमें बदलाव करने की अनुमति नहीं होगी. इसमें पुराने डेटा को ऐक्सेस करने की अनुमति भी शामिल है.\n\nइससे ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के इस डेटा को देखने या उसमें बदलाव करने की अनुमति नहीं होगी. इसमें बैकग्राउंड और पुराने डेटा को ऐक्सेस करने की अनुमति भी शामिल है.\n\nइससे ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"क्या आपको सभी अनुमतियां हटानी हैं?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के डेटा को देखने या उसमें बदलाव करने की अनुमति नहीं होगी.\n\nइससे ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के डेटा को देखने या उसमें बदलाव करने की अनुमति नहीं होगी. इसमें बैकग्राउंड डेटा को ऐक्सेस करने की अनुमति भी शामिल है.\n\nइससे ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के डेटा को देखने या उसमें बदलाव करने की अनुमति नहीं होगी. इसमें पुराने डेटा को ऐक्सेस करने की अनुमति भी शामिल है.\n\nइससे ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास Health Connect के डेटा को देखने या उसमें बदलाव करने की अनुमति नहीं होगी. इसमें बैकग्राउंड और पुराने डेटा को ऐक्सेस करने की अनुमति भी शामिल है.\n\nइससे ऐप्लिकेशन की दूसरी अनुमतियों पर असर नहीं पड़ेगा. जैसे, जगह की जानकारी, कैमरे या माइक्रोफ़ोन के इस्तेमाल से जुड़ी अनुमतियां."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर मौजूद फिटनेस और सेहत का डेटा भी Health Connect से मिटाएं"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"इस ऐप्लिकेशन की अनुमतियां हटाई गईं"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"इससे Health Connect का पूरा डेटा भी मिट जाएगा"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"अगला दिन"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"चुना गया दिन"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"पिछला दिन"</string>
     <string name="default_error" msgid="7966868260616403475">"कोई गड़बड़ी हुई. कृपया फिर से कोशिश करें."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"ऐसा संसाधन जिसके बारे में जानकारी नहीं है"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"सोर्स डेटा"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>खुला कर्ली ब्रैकेट."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>बंद कर्ली ब्रैकेट."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> फ़ील्ड <xliff:g id="FIELD">%2$s</xliff:g> की वैल्यू"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ये ऐप्लिकेशन अब Health Connect को ऐक्सेस नहीं कर सकते. हालांकि, जो डेटा इन्होंने पहले सेव किया था वह अब भी Health Connect में मौजूद है"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> के बाद सबमिट किए गए डेटा को देख सकता है"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"यह ऐप्लिकेशन, Android की जिन अन्य अनुमतियों को ऐक्सेस कर सकता है उन्हें मैनेज करने के लिए, सेटिंग &gt; ऐप्लिकेशन पर जाएं"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> के साथ शेयर किए गए डेटा पर, इस ऐप्लिकेशन की निजता नीति लागू होती है"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"डेवलपर की निजता नीति में, यह देखा जा सकता है कि <xliff:g id="APP_NAME">%1$s</xliff:g> आपका डेटा कैसे मैनेज करता है"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"यह ऐप्लिकेशन, Android की जिन अन्य अनुमतियों को ऐक्सेस कर सकता है उन्हें मैनेज करने के लिए, \'सेटिंग\' में जाकर \'ऐप्लिकेशन\' पर टैप करें"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"ऐप्लिकेशन की निजता नीति पढ़ें"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"पिछले 24 घंटे में ऐक्सेस किया गया"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ऐप्लिकेशन को दिया गया ऐक्सेस"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"फ़िलहाल, आपके डिवाइस में कोई ऐसा ऐप्लिकेशन इंस्टॉल नहीं है जो Health Connect के साथ काम करता हो"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"अन्य ऐक्सेस"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"पुराना डेटा और बैकग्राउंड डेटा"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"इस ऐप्लिकेशन को मिली अन्य अनुमतियां हटाई गईं"</string>
     <string name="permissions_header" msgid="6519976063360071569">"अनुमतियां"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"फ़िटनेस और सेहत"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"कसरत, नींद, पोषण वगैरह"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"सेहत का डेटा"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"सेहत का डेटा"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"टेस्ट के नतीजे, दवाइयां, टीकाकरण वगैरह"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"लैब से मिले नतीजे, दवाइयां, टीके वगैरह"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"ऐप्लिकेशन को मिली अनुमतियां हटा दी गई हैं"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect ने <xliff:g id="APP_DATA">%s</xliff:g> को मिली अनुमतियां हटा दी हैं"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect ने <xliff:g id="APP_DATA_0">%1$s</xliff:g> और <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> को मिली अनुमतियां हटा दी हैं"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store पर जाएं"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect का इस्तेमाल शुरू करें"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect में, आपकी सेहत और फ़िटनेस से जुड़ा डेटा सेव किया जाता है. इससे अपने डिवाइस में अलग-अलग ऐप्लिकेशन को आसानी से सिंक करने में मदद मिलती है"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect, अलग-अलग ऐप्लिकेशन से सेहत और फ़िटनेस से जुड़ा आपका डेटा सेव और सिंक करता है.\n\n"<b>"फ़िटनेस और सेहत का डेटा,"</b>" जिसमें कसरत के सेशन, कदमों की संख्या, पोषण, नींद वगैरह का डेटा शामिल है\n\n"<b>"सेहत का डेटा,"</b>" जिसमें टीके, लैब के नतीजे वगैरह शामिल हैं"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect की मदद से ये काम किए जा सकते हैं"</string>
     <string name="share_data" msgid="3481932156368883946">"ऐप्लिकेशन के साथ डेटा शेयर करें"</string>
     <string name="share_data_description" msgid="2919871301634375092">"यह चुनें कि हर ऐप्लिकेशन, Health Connect में कौनसा डेटा देख सकता है और उसमें बदलाव कर सकता है"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"सेटिंग और निजता को मैनेज करें"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"कम रिसाव"</string>
     <string name="flow_medium" msgid="3783688724668943154">"मध्यम रिसाव"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ज़्यादा रिसाव"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"पीरियड्स के फ़्लो की जानकारी मौजूद नहीं है"</string>
     <string name="period_day" msgid="3821944462093965882">"पीरियड (माहवारी) का <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> में से <xliff:g id="DAY">%1$d</xliff:g> दिन"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{माहवारी (1 दिन)}one{माहवारी (# दिन)}other{माहवारी (# दिन)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"पॉज़िटिव"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"नेगेटिव"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ज़्यादा"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"संगीत"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"अन्य"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"बिना गाइड के"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"काफ़ी हद तक ठीक है"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"बहुत हद तक ठीक है"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> मिनट"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> घंटे <xliff:g id="MIN">%2$s</xliff:g> मिनट"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> घंटा"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"इंटिग्रेट किया जा रहा है"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect को Android सिस्टम के साथ इंटिग्रेट किया जा रहा है.\n\nडेटा और अनुमतियों के ट्रांसफ़र होने की वजह से, इस प्रोसेस में कुछ समय लग सकता है."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"प्रोसेस पूरी होने की सूचना मिलने के बाद ही, ऐप्लिकेशन बंद करें."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect को इंटिग्रेट किया जा रहा है"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"अपडेट करना ज़रूरी है"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect को Android सिस्टम के साथ इंटिग्रेट किया जा रहा है, ताकि इसे सीधे आपके डिवाइस की सेटिंग से ऐक्सेस किया जा सके."</string>
     <string name="update_button" msgid="4544529019832009496">"अपडेट करें"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"इसे अपडेट करें, ताकि Health Connect आपके डिवाइस की सिस्टम सेटिंग से इंटिग्रेट करने की प्रोसेस जारी रख सके"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"अभी अपडेट करें"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"सिस्टम अपडेट करना ज़रूरी है"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"आगे बढ़ने से पहले, अपने फ़ोन का सिस्टम अपडेट करें."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"अगर आपने अपने फ़ोन का सिस्टम पहले ही अपडेट कर दिया है, तो इंटिग्रेशन की प्रोसेस को जारी रखने के लिए फ़ोन को रीस्टार्ट करें"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect को अपडेट करना ज़रूरी है"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"आगे बढ़ने से पहले, Health Connect ऐप्लिकेशन को नए वर्शन में अपडेट करें."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"ज़्यादा स्टोरेज की ज़रूरत है"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect को आपके फ़ोन में <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> का स्टोरेज चाहिए, ताकि इंटिग्रेशन की प्रोसेस जारी रखी जा सके.\n\nअपने फ़ोन में कुछ स्टोरेज बढ़ाएं और फिर से कोशिश करें."</string>
     <string name="try_again_button" msgid="8745496819992160789">"फिर से कोशिश करें"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"डिवाइस में स्टोरेज खाली करें"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"ज़्यादा स्टोरेज की ज़रूरत है"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect को आपके फ़ोन में <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> का स्टोरेज चाहिए, ताकि इंटिग्रेट करने की प्रोसेस जारी रखी जा सके."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"इंटिग्रेट करने की प्रोसेस रोक दी गई है"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ऐप्लिकेशन, Android सिस्टम के साथ इंटिग्रेट होने के दौरान बंद किया गया.\n\n\'फिर शुरू करें\' पर क्लिक करके ऐप्लिकेशन दोबारा खोलें और डेटा के साथ-साथ अनुमतियां ट्रांसफ़र करना जारी रखें."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"आपके Health Connect डेटा को सेव रखने के लिए, इस प्रोसेस को <xliff:g id="TIME_NEEDED">%1$s</xliff:g> में पूरा करें"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect को Android सिस्टम के साथ इंटिग्रेट करने की प्रोसेस जारी रखने के लिए टैप करें. आपके डेटा को सेव रखने के लिए, इस प्रोसेस को <xliff:g id="TIME_NEEDED">%1$s</xliff:g> में पूरा करें"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect को Android सिस्टम के साथ इंटिग्रेट करने की प्रोसेस जारी रखने के लिए टैप करें."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"जारी रखें"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect को इंटिग्रेट करने की प्रोसेस फिर शुरू करें"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"आपके डेटा को सेव रखने के लिए, इस प्रोसेस को <xliff:g id="TIME_NEEDED">%1$s</xliff:g> में पूरा करें"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ऐप्लिकेशन को अपडेट करना ज़रूरी है"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> को Health Connect से सिंक रखने के लिए, अपडेट करना ज़रूरी है"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"कुछ ऐप्लिकेशन को Health Connect से सिंक रखने के लिए, उन्हें अपडेट करना ज़रूरी है"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> को अपडेट करने की ज़रूरत है, ताकि Health Connect के साथ इसका सिंक बना रहे. ऐसा हो सकता है कि सभी ऐप्लिकेशन के लिए अपडेट उपलब्ध न हों."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"कुछ ऐप्लिकेशन को अपडेट करने की ज़रूरत है, ताकि Health Connect के साथ उनका सिंक बना रहे. ऐसा हो सकता है कि सभी ऐप्लिकेशन के लिए अपडेट उपलब्ध न हों."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"अपडेट देखें"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"ज़्यादा जानें"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect का इंटिग्रेशन"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect को इंटिग्रेट नहीं किया जा सका"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"इसके दोबारा उपलब्ध होने पर आपको एक सूचना मिलेगी."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"ठीक है"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect को इंटिग्रेट नहीं किया जा सका"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"ज़्यादा जानें"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect को इंटिग्रेट कर दिया गया है"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"खोलें"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"नया क्या है"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Health Connect को अब सीधे अपने डिवाइस की सेटिंग से ऐक्सेस किया जा सकता है. स्टोरेज की जगह खाली करने के लिए, Health Connect ऐप्लिकेशन को कभी भी अनइंस्टॉल किया जा सकता है."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"ठीक है"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ऐप्लिकेशन के सोर्स बदलें"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"डिवाइस की डिफ़ॉल्ट सेटिंग"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ऐप्लिकेशन का डेटा"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect का ऐक्सेस रखने वाले ऐप्लिकेशन का डेटा यहां दिखेगा"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> का डेटा यहां दिखेगा"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect का ऐक्सेस रखने वाले ऐप्लिकेशन का डेटा यहां दिखेगा"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"दिन"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"हफ़्ता"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"महीना"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"पिछला महीना"</string>
     <string name="tab_entries" msgid="3402700951602029493">"एंट्री"</string>
     <string name="tab_access" msgid="7818197975407243701">"ऐक्सेस"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को अन्य ऐक्सेस देने हैं?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> को Health Connect की इन सेटिंग का भी ऐक्सेस चाहिए"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"डेटा ऐक्सेस करने से जुड़ी कम से कम कोई एक अनुमति दें, ताकि यह ऐप्लिकेशन बैकग्राउंड में या पहले से मौजूद डेटा ऐक्सेस कर सके"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"इस ऐप्लिकेशन में बैकग्राउंड ऐक्सेस करने की सुविधा चालू करने के लिए, पढ़ने की कम से कम एक अनुमति दें"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"इस ऐप्लिकेशन में पहले से मौजूद डेटा ऐक्सेस करने की सुविधा चालू करने के लिए, पढ़ने की कम से कम एक अनुमति दें"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect का इस्तेमाल शुरू करें"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"कुछ शुरुआती ऐप्लिकेशन सिंक करें, ताकि उनके बीच सेहत और फ़िटनेस का डेटा शेयर किया जा सके"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"सेट अप करें"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"इसके साथ काम करने वाले ऐप्लिकेशन देखें"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect के ज़रिए <xliff:g id="APP_NAME">%s</xliff:g> से सिंक करने के लिए, और ऐप्लिकेशन ढूंढें"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ऐप स्टोर पर देखें"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"स्क्रीन लॉक सेट करें"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"स्वास्थ्य से जुड़े अपने डेटा को ज़्यादा सुरक्षित रखने के लिए, इस डिवाइस पर कोई पिन, पैटर्न या पासवर्ड सेट करें"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"स्क्रीन लॉक सेट करें"</string>
     <string name="select_all" msgid="837499881590001166">"सभी चुनें"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"ऐसा करने पर, डिवाइस से जुड़े हुए ऐप्लिकेशन, Health Connect के इस डेटा को नहीं पढ़ पाएंगे"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"सही का निशान लगाया गया"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"सही का निशान नहीं लगाया गया"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"कसरत के लिए, मैप रूट उपलब्ध है"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"अगले दिन"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"अगले हफ़्ते"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"अगले महीने"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"पिछले दिन"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"पिछले हफ़्ते"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"पिछले महीने"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"क्या सारा डेटा हमेशा के लिए मिटाना है?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"क्या आपको चुना गया डेटा हमेशा के लिए मिटाना है?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"क्या आपको <xliff:g id="APP_NAME">%s</xliff:g> का सारा डेटा हमेशा के लिए मिटाना है?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> की, <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> वाले हफ़्ते की अपनी चुनी हुई एंट्री हमेशा के लिए मिटानी हैं?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> की,<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> वाली अपनी चुनी हुई एंट्री हमेशा के लिए मिटानी हैं?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"क्या आपको <xliff:g id="APP_NAME">%s</xliff:g> की इस एंट्री को हमेशा के लिए मिटाना है?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"क्या आपको <xliff:g id="APP_NAME">%2$s</xliff:g> के लिए, <xliff:g id="DATA_TYPE">%1$s</xliff:g> का डेटा हमेशा के लिए मिटाना है?"</string>
+    <string name="on" msgid="8266542510798355807">"चालू है"</string>
+    <string name="off" msgid="6996623844428550649">"बंद है"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g> को ऐक्सेस किया गया"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"<xliff:g id="TIME_DATE">%1$s</xliff:g> को कल ऐक्सेस किया गया था"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> को ऐक्सेस किया गया"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"हमेशा के लिए अनुमति दें"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"कुछ अनुमतियां दें"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ऐप्लिकेशन का इस्तेमाल करते समय"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"कोई भी अनुमति न दें"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को फ़िटनेस और सेहत का डेटा ऐक्सेस करने की अनुमति देनी है?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ने <xliff:g id="DATA_TYPES">%2$s</xliff:g> को ऐक्सेस करने का अनुरोध किया है.\n\nसभी अनुमतियां दें या अपने हिसाब से अलग-अलग अनुमतियां दें."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को <xliff:g id="DATA_TYPE">%2$s</xliff:g> के ऐक्सेस की अनुमति देनी है?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"फ़िटनेस और सेहत से जुड़ी अनुमतियां"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"हमेशा"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"इस्तेमाल करते समय"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"हमेशा"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"इस्तेमाल करते समय"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g>, फ़िटनेस और तंदुरुस्ती से जुड़ा आपका पूरा डेटा <xliff:g id="ALLOW_MODE">%2$s</xliff:g> ऐक्सेस कर सकता है"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"डेटा ऐक्सेस करने की अनुमति है"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"डेटा देखने की अनुमति है"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ये अनुमतियां देने पर, <xliff:g id="APP_NAME">%1$s</xliff:g> आपके डिवाइस के सेंसर से डेटा ऐक्सेस कर सकता है."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> में से <xliff:g id="NUMBER_0">%1$d</xliff:g> ऐप्लिकेशन को अनुमति है"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"किसी भी ऐप्लिकेशन ने अनुमति देने का अनुरोध नहीं किया है"</string>
+    <string name="allowed" msgid="4158456017482263737">"अनुमति है"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"अनुमति नहीं है"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"जिन ऐप्लिकेशन के पास यह अनुमति है वे आपके डिवाइस के सेंसर से, <xliff:g id="DATA_TYPE">%s</xliff:g> का डेटा ऐक्सेस कर सकते हैं."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"क्या आपको अपनी स्मार्ट वॉच पर मौजूद सभी ऐप्लिकेशन के लिए, <xliff:g id="DATA_TYPE">%s</xliff:g> का ऐक्सेस हटाना है?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"सही का निशान"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"गलत का निशान"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"फ़िलहाल, <xliff:g id="APP_NAME">%1$s</xliff:g> फ़िटनेस और तंदुरुस्ती से जुड़ा आपका डेटा <xliff:g id="ALLOW_MODE">%2$s</xliff:g> ऐक्सेस कर सकता है"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> को फ़िटनेस और तंदुरुस्ती से जुड़ा डेटा, हमेशा ऐक्सेस करने की अनुमति देनी है?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> के पास <xliff:g id="DATA_TYPES">%2$s</xliff:g> का ऐक्सेस है."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"फ़िटनेस और सेहत से जुड़ी अनुमतियों को मैनेज करें"</string>
 </resources>
diff --git a/apk/res/values-hr/strings.xml b/apk/res/values-hr/strings.xml
index a92b06f..ee61939 100644
--- a/apk/res/values-hr/strings.xml
+++ b/apk/res/values-hr/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Upravljajte podacima o zdravlju i fitnessu na uređaju i odredite koje im aplikacije mogu pristupati"</string>
     <string name="data_title" msgid="4456619761533380816">"Podaci i pristup"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Pregledajte podatke o zdravstvenom stanju"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Pregledajte svoje podatke o zdravstvenom stanju i koje im aplikacije mogu pristupiti"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Sve kategorije"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Pogledajte sve kategorije"</string>
     <string name="no_data" msgid="1906986019249068659">"Nema podataka"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Jučer"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Čitanje: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Bilježenje: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Upravljajte dopuštenjima"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Vrijeme: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivnost"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"pristup podacima o zdravlju"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Očitavanje potrošenih kalorija"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Aplikaciji omogućuje očitavanje podataka o potrošenim kalorijama"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Pristup podacima u pozadini"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima u pozadini?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima u pozadini?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ako to dopustite, ova aplikacija može pristupati podacima o fitnessu i wellnessu te podacima o zdravstvenom stanju kad ne upotrebljavate aplikaciju."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ako to dopustite, ova aplikacija može pristupati podacima o zdravstvenom stanju kad ne upotrebljavate aplikaciju."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ako to dopustite, ova aplikacija može pristupati podacima o fitnessu i wellnessu kad ne upotrebljavate aplikaciju."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ako to dopustite, ova aplikacija može pristupati podacima Health Connecta kad ne upotrebljavate aplikaciju."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa prethodnim podacima?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ako to dopustite, aplikacija može pristupati podacima o fitnessu i wellnessu koji su dodani prije <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ako to dopustite, aplikacija može pristupati svim prethodnim podacima o fitnessu i wellnessu."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ako to dopustite, aplikacija može pristupati podacima Health Connecta koji su dodani prije <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ako to dopustite, aplikacija može pristupati svim prethodnim podacima Health Connecta."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Želite li dopustiti dodatni pristup za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> želi pristupiti i ovim postavkama Health Connecta"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Pristup svim podacima u pozadini"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Pristup podacima o zdravstvenom stanju u pozadini"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Pristup podacima o fitnessu i wellnessu u pozadini"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Dopustite ovoj aplikaciji da pristupa podacima o fitnessu i wellnessu te podacima o zdravstvenom stanju kad ne upotrebljavate aplikaciju"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Dopustite ovoj aplikaciji da pristupa tim podacima kad ne upotrebljavate aplikaciju"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Dopustite ovoj aplikaciji da pristupa tim podacima kad ne upotrebljavate aplikaciju"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Pristup podacima u pozadini"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Dopustite ovoj aplikaciji da pristupa podacima Health Connecta kad ne upotrebljavate aplikaciju"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Pristup prethodnim podacima o fitnessu i wellnessu"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Dopustite ovoj aplikaciji da pristupa podacima koji su dodani prije <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Dopustite ovoj aplikaciji da pristupa svim prethodnim podacima"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Pristup prethodnim podacima"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Dopustite ovoj aplikaciji da pristupa podacima Health Connecta koji su dodani prije <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Dopustite ovoj aplikaciji da pristupa svim prethodnim podacima Health Connecta"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> već može pristupiti prethodnim podacima o vašem zdravstvenom stanju"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Pročitajte više o dopuštenjima"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Pristup svim podacima u pozadini"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Pristup podacima o zdravstvenom stanju u pozadini"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Pristup podacima o fitnessu i wellnessu u pozadini"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Dopustite ovoj aplikaciji da pristupa podacima o fitnessu i wellnessu te podacima o zdravstvenom stanju kad ne upotrebljavate aplikaciju"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Dopustite ovoj aplikaciji da pristupa tim podacima kad ne upotrebljavate aplikaciju"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Dopustite ovoj aplikaciji da pristupa tim podacima kad ne upotrebljavate aplikaciju"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Pristup podacima u pozadini"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Dopustite ovoj aplikaciji da pristupa podacima Health Connecta kad ne upotrebljavate aplikaciju"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Pristup prethodnim podacima o fitnessu i wellnessu"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Dopustite ovoj aplikaciji da pristupa podacima koji su dodani prije <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Dopustite ovoj aplikaciji da pristupa svim prethodnim podacima"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Pristup prethodnim podacima"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Dopustite ovoj aplikaciji da pristupa podacima Health Connecta koji su dodani prije <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Dopustite ovoj aplikaciji da pristupa svim prethodnim podacima Health Connecta"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Trenutačno se ne čitaju podaci o fitnessu jer <xliff:g id="APP_NAME">%1$s</xliff:g> nema dopuštenja za čitanje"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> već može pristupiti prethodnim podacima o vašem zdravstvenom stanju. Da biste to promijenili, isključite dopuštenja za podatke o zdravstvenom stanju za tu aplikaciju"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Upravljajte dopuštenjima za zdravstveni profil"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Omogućite barem jedno dopuštenje za čitanje da biste uključili pristup pozadinskim podacima ili prethodnim podacima za ovu aplikaciju"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Omogućite barem jedno dopuštenje za čitanje da biste uključili pristup iz pozadine za ovu aplikaciju"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Omogućite barem jedno dopuštenje za čitanje da biste uključili pristup prethodnim podacima za ovu aplikaciju"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Dopustite ovoj aplikaciji da pristupa svim prethodnim podacima Health Connecta"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Dopustite aplikaciji da pristupa podacima Health Connecta kad ne upotrebljavate aplikaciju"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ako dopustite, ova aplikacija može pristupati podacima iz aplikacije Health Connect i kad je ne upotrebljavate."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Pristup prethodnim podacima"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa prijašnjim podacima?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Dopustite aplikaciji da pristupa podacima Health Connecta koji su dodani prije <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Dopustite aplikaciji da pristupa svim prethodnim podacima Health Connecta"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ako dopustite, aplikacija može pristupati podacima iz aplikacije Health Connect koji su dodani prije <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ako dopustite, aplikacija može pristupati svim prethodnim podacima Health Connecta."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktivna potrošnja kalorija"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktivna potrošnja kalorija"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Očitavanje aktivne potrošnje kalorija"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"pogurivanja invalidskih kolica"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Očitavanje pogurivanja invalidskih kolica"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Bilježenje pogurivanja invalidskih kolica"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intenzitet aktivnosti"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intenzitet aktivnosti"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Očitava intenzitet aktivnost"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Bilježi intenzitet aktivnosti"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Bazalna metabolička stopa"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"bazalnu metaboličku stopu"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Očitavanje bazalne metaboličke stope"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura kože"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Očitavanje temperature kože"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Zapisivanje temperature kože"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"To uključuje sve podatke o zdravstvenom stanju koji su sinkronizirani i dodani u Health Connect. To možda nije vaša potpuna medicinska dokumentacija i ne uključuje medicinski opis vaših podataka o zdravstvenom stanju."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Svi podaci o zdravstvenom stanju"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"svi podaci o zdravstvenom stanju"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Bilježenje svih podataka o zdravstvenom stanju"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergije"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergije"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Čitanje podataka o alergijama"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Podaci o cijepljenju"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"podaci o cijepljenju"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Čitanje podataka o cijepljenju"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorijski nalazi"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorijski nalazi"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Čitanje laboratorijskih nalaza"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergije"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergije"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Čitanje podataka o alergijama"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Stanja"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"stanja"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Čitanje stanja"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Cjepiva"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"cjepiva"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Čitanje podataka o cjepivima"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratorijski nalazi"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratorijski nalazi"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Čitanje laboratorijskih nalaza"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Lijekovi"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"lijekovi"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Čitanje podataka o lijekovima"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Osobni podaci"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"osobni podaci"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Čitanje osobnih podataka"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Podaci o liječniku"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"podaci o liječniku"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Čitanje podataka o liječniku"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Trudnoća"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"trudnoća"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Čitanje podataka o trudnoći"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemi"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemi"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Čitanje podataka o problemima"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Postupci"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"postupci"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Čitanje podataka o postupcima"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Povijest društvenih mreža"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Povijest društvenih mreža"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"povijest društvenih mreža"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Čitanje podataka o povijesti društvenih mreža"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitalni znakovi"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Posjeti"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"posjeti"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Čitanje podataka o posjetima"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitalni znakovi"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitalni znakovi"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Čitanje podataka o vitalnim znakovima"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Usredotočena svjesnost"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Pisanje podataka sesije usredotočene svjesnosti"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Dopusti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da očita"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Dopusti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da zapiše"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Odustani"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Dopusti"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Dopusti sve"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ne dopuštaj"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Odaberite podatke za koje želite da ih ova aplikacija čita ili bilježi u Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Odaberite podatke za koje želite da ih ova aplikacija čita iz Health Connecta ili bilježi u Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Odaberite podatke za koje želite da ih ova aplikacija čita iz Health Connecta"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Odaberite podatke za koje želite da ih ova aplikacija bilježi u Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ako date pristup za čitanje, aplikacija može čitati nove podatke i podatke iz proteklih 30 dana"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ako date pristup za čitanje, aplikacija može čitati nove i prijašnje podatke"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa Health Connectu?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"U <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> razvojnog programera možete saznati kako aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> postupa s vašim podacima"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima o fitnessu i wellnessu?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Više o tome kako aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> postupa s vašim podacima možete saznati u odjeljku <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> te aplikacije"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"pravilima o privatnosti"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa vašim podacima o zdravstvenom stanju?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ako omogućite pristup, aplikacija može čitati i pisati podatke o alergijama, laboratorijskim nalazima, cjepivima i druge podatke\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ako omogućite pristup, aplikacija može čitati podatke o alergijama, laboratorijskim nalazima, cjepivima i druge podatke\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"O podacima o zdravstvenom stanju"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Podaci koji se dijele uključuju sljedeće"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ako to dopustite, <xliff:g id="APP_NAME">%1$s</xliff:g> može dijeliti podatke o vašem zdravstvenom stanju s Health Connectom."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinkronizirajte podatke o zdravstvenom stanju iz različitih aplikacija i izvora da biste ih zadržali na jednom mjestu"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Želite li ukloniti sva dopuštenja?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Ukloni sve"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti podatke iz Health Connecta.\n\nTo ne utječe na druga dopuštenja koja ova aplikacija može imati, kao što su kamera, mikrofon ili lokacija."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti podatke iz Health Connecta, uključujući prethodne podatke.\n\nTo ne utječe na druga dopuštenja koja ova aplikacija može imati, kao što su lokacija, fotoaparat ili mikrofon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti podatke iz Health Connecta, uključujući pozadinske podatke ili prethodne podatke.\n\nTo ne utječe na druga dopuštenja koja ova aplikacija može imati, kao što su dopuštenja za upotrebu lokacije, kamere ili mikrofona."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Izbriši i podatke aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Health Connecta"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Želite li ukloniti sva dopuštenja?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Želite li ukloniti sva dopuštenja za zdravstveni profil?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Želite li ukloniti sva dopuštenja za fitness i opće stanje?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Izbriši i podatke o fitnessu iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Health Connecta"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Želite li ukloniti sva dopuštenja za zdravstveni profil?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Izbriši i podatke o zdravstvenom stanju iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Health Connecta"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti ove podatke iz Health Connecta.\n\nTo ne utječe na druga dopuštenja dodijeljena ovoj aplikaciji kao što su pristup kameri, mikrofonu ili lokaciji."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti ove podatke iz Health Connecta, uključujući pozadinske podatke.\n\nTo ne utječe na druga dopuštenja dodijeljena ovoj aplikaciji kao što su pristup kameri, mikrofonu ili lokaciji."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti ove podatke iz Health Connecta, uključujući prethodne podatke.\n\nTo ne utječe na druga dopuštenja dodijeljena ovoj aplikaciji kao što su pristup kameri, mikrofonu ili lokaciji."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti ove podatke iz Health Connecta, uključujući pozadinske ili prethodne podatke.\n\nTo ne utječe na druga dopuštenja dodijeljena ovoj aplikaciji kao što su pristup kameri, mikrofonu ili lokaciji."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Želite li ukloniti sva dopuštenja?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti podatke iz Health Connecta.\n\nTo ne utječe na druga dopuštenja dodijeljena ovoj aplikaciji kao što su pristup kameri, mikrofonu ili lokaciji."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti podatke iz Health Connecta, uključujući pozadinske podatke.\n\nTo ne utječe na druga dopuštenja dodijeljena ovoj aplikaciji kao što su pristup kameri, mikrofonu ili lokaciji."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti podatke iz Health Connecta, uključujući prethodne podatke.\n\nTo ne utječe na druga dopuštenja dodijeljena ovoj aplikaciji kao što su pristup kameri, mikrofonu ili lokaciji."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> više neće moći čitati niti bilježiti podatke iz Health Connecta, uključujući pozadinske ili prethodne podatke.\n\nTo ne utječe na druga dopuštenja dodijeljena ovoj aplikaciji kao što su pristup kameri, mikrofonu ili lokaciji."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Izbriši i podatke o fitnessu i zdravstvenom stanju iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> iz Health Connecta"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Uklonjena su dopuštenja za ovu aplikaciju"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Izbriši i sve podatke Health Connecta"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Sljedeći dan"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Odabrani dan"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Prethodni dan"</string>
     <string name="default_error" msgid="7966868260616403475">"Nešto nije u redu. Pokušajte ponovo."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Nepoznati izvor"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Izvorni podaci"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Otvorena vitičasta zagrada."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Zatvorena vitičasta zagrada."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Vrijednost polja <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Ove aplikacije više nemaju pristup, no i dalje imaju pohranjene podatke u Health Connectu"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> može čitati podatke dodane nakon <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Da biste upravljali drugim Androidovim dopuštenjima kojima ova aplikacija može pristupati, otvorite Postavke &gt; Aplikacije"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Na podatke koje dijelite s aplikacijom <xliff:g id="APP_NAME">%1$s</xliff:g> primjenjuju se pravila o privatnosti te aplikacije"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"U pravilima o privatnosti razvojnog programera možete saznati kako aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> upravlja vašim podacima"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Da biste upravljali drugim Androidovim dopuštenjima kojima ova aplikacija može pristupiti, otvorite Postavke i dodirnite Aplikacije"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Pročitajte pravila o privatnosti"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Pristupljeno u posljednja 24 sata"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Pristup aplikacije"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Trenutačno nije instalirana nijedna kompatibilna aplikacija"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Dodatni pristup"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Prethodni podaci, pozadinski podaci"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Uklonjena su dodatna dopuštenja za ovu aplikaciju"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Dopuštenja"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness i wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Vježbanje, spavanje, prehrana i drugo"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Podaci o zdravstvenom stanju"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"podaci o zdravstvenom stanju"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab. nalazi, lijekovi, imunizacija itd."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Nalazi, lijekovi, cjepiva itd."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Uklonjena dopuštenja aplikacije"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect uklonio je dopuštenja za aplikaciju <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect uklonio je dopuštenja za aplikacije <xliff:g id="APP_DATA_0">%1$s</xliff:g> i <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Otvori Trgovinu Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Početak upotrebe Health Connecta"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect sprema podatke o vašem zdravlju i fitnessu i pruža vam jednostavan način za sinkronizaciju različitih aplikacija na uređaju"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect pohranjuje i sinkronizira vaše podatke o zdravlju i fitnessu iz različitih aplikacija.\n\n"<b>"Podaci o fitnessu i zdravlju,"</b>" uključujući sesije vježbanja, korake, prehranu, spavanje i drugo\n\n"<b>"Podaci o zdravstvenom stanju,"</b>" uključujući cjepiva, laboratorijske nalaze i drugo"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect omogućuje vam sljedeće:"</string>
     <string name="share_data" msgid="3481932156368883946">"Dijelite podatke s aplikacijama"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Odaberite podatke koje svaka aplikacija može čitati ili bilježiti u Health Connectu"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Upravljajte postavkama i privatnošću"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Lagano krvarenje"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Srednje krvarenje"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Obilno krvarenje"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Nepoznato menstrualno krvarenje"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="DAY">%1$d</xliff:g>. dan mjesečnice od <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruacija (1 dan)}one{Menstruacija (# dan)}few{Menstruacija (# dana)}other{Menstruacija (# dana)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitivno"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativno"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Visoko"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Glazba"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Drugo"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Bez uputa"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Umjereno"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Visoki intenzitet"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integracija u tijeku"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect se integrira sa sustavom Android.\n\nPrijenos podataka i dopuštenja može potrajati."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Nemojte zatvoriti aplikaciju dok ne primite obavijest da je postupak dovršen."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"U tijeku je integracija Health Connecta"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Potrebno je ažuriranje"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Aplikacija Health Connect integrira se sa sustavom Android kako biste joj mogli pristupiti izravno putem postavki."</string>
     <string name="update_button" msgid="4544529019832009496">"Ažuriraj"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Pokrenite ažuriranje kako bi aplikacija Health Connect mogla nastaviti integraciju s postavkama sustava"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Ažuriraj sada"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Potrebno je ažuriranje sustava"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Prije nastavka ažurirajte sustav telefona."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ako ste već ažurirali sustav telefona, pokušajte ponovo pokrenuti telefon da biste nastavili integraciju"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Potrebno je ažuriranje za Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Prije nastavka ažurirajte aplikaciju Health Connect na najnoviju verziju."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Potrebno je više prostora"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect treba <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> prostora za pohranu na telefonu za nastavak integracije.\n\nOslobodite prostor na telefonu i pokušajte ponovo."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Pokušajte ponovo"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Oslobodite prostor"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Potrebno je više prostora"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect treba <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> prostora za pohranu na telefonu za nastavak integracije."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integracija je pauzirana"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikacija Health Connect se zatvorila tijekom integracije sa sustavom Android.\n\nKliknite Nastavi da biste ponovo otvorili aplikaciju i nastavili prijenos podataka i dopuštenja."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Da biste zadržali podatke Health Connecta, ispunite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Dodirnite za nastavak integracije Health Connecta sa sustavom Android Da biste zadržali svoje podatke, ispunite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Dodirnite za nastavak integracije Health Connecta sa sustavom Android"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Nastavi"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Nastavak integracije Health Connecta"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Da biste zadržali svoje podatke, ispunite ovo u roku od <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Potrebno je ažuriranje aplikacije"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> potrebno je ažurirati da bi se nastavila sinkronizacija s Health Connectom"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Neke se aplikacije trebaju ažurirati da bi se nastavila sinkronizacija s Health Connectom"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> potrebno je ažurirati da bi se nastavila sinkronizirati s Health Connectom. Ažuriranja možda nisu dostupna za sve aplikacije."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Neke se aplikacije trebaju ažurirati da bi se nastavile sinkronizirati s Health Connectom Ažuriranja možda nisu dostupna za sve aplikacije."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Provjerite ima li ažuriranja"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Saznajte više"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integracija Health Connecta"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integracija Health Connecta nije dovršena"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Primit ćete obavijest kada ponovo bude dostupno."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Shvaćam"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integracija Health Connecta nije dovršena"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Pročitajte više"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Dovršena je integracija Health Connecta"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Otvori"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novosti"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Sada aplikaciji Health Connect možete pristupiti izravno putem postavki. Deinstalirajte aplikaciju Health Connect kad god želite da biste oslobodili prostor za pohranu."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Shvaćam"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Uređivanje izvora aplikacija"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Zadana postavka uređaja"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Podaci aplikacije"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Ovdje će se prikazati podaci iz aplikacija s pristupom Health Connectu"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Ovdje će se prikazati podaci iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Ovdje će se prikazati podaci iz aplikacija s pristupom Health Connectu"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dan"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Tjedan"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mjesec"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Prošli mjesec"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Unosi"</string>
     <string name="tab_access" msgid="7818197975407243701">"Pristup"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Želite li dopustiti dodatni pristup za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> želi pristupiti i ovim postavkama Health Connecta"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Omogućite barem jedno dopuštenje za čitanje da biste uključili pristup pozadinskim podacima ili prethodnim podacima za ovu aplikaciju"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Omogućite barem jedno dopuštenje za čitanje da biste uključili pristup iz pozadine za ovu aplikaciju"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Omogućite barem jedno dopuštenje za čitanje da biste uključili pristup prethodnim podacima za ovu aplikaciju"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Započnite upotrebljavati Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinkronizirajte svoje prve aplikacije da biste dijelili podatke o zdravlju i sportskim aktivnostima između njih"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Postavi"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Pregled kompatibilnih aplikacija"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Pronađite više aplikacija za sinkronizaciju s aplikacijom <xliff:g id="APP_NAME">%s</xliff:g> putem aplikacije Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Prikaži u trgovini aplikacija"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Postavite zaključavanje zaslona"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Za dodatnu sigurnost za svoje zdravstvene podatke postavite PIN, uzorak ili zaporku za ovaj uređaj"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Postavi zaključavanje zaslona"</string>
     <string name="select_all" msgid="837499881590001166">"Odaberi sve"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Povezane aplikacije više neće moći čitati te podatke iz Health Connecta"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Potvrđeno"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nije potvrđeno"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Dostupna je ruta na karti za vježbanje"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Sljedeći dan"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Sljedeći tjedan"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Sljedeći mjesec"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Prethodni dan"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Prethodni tjedan"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Prethodni mjesec"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Želite li trajno izbrisati sve podatke?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Želite li trajno izbrisati odabrane podatke?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Želite li trajno izbrisati sve podatke aplikacije <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Želite li trajno izbrisati odabrane unose aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> za tjedan <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Želite li trajno izbrisati odabrane unose aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> za mjesec <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Želite li trajno izbrisati taj unos aplikacije <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Želite li trajno izbrisati podatke vrste <xliff:g id="DATA_TYPE">%1$s</xliff:g> za aplikaciju <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Uključeno"</string>
+    <string name="off" msgid="6996623844428550649">"Isključeno"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Pristupljeno: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Pristupljeno jučer: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Pristupljeno: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Dopusti cijelo vrijeme"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Dopusti odabrano"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Pri upotrebi aplikacije"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Odbij sve"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da pristupa podacima o fitnessu i općem stanju?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva pristup ovim podacima: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nOdaberite želite li dopustiti sve ili upravljati njima pojedinačno."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> pristup sljedećim podacima: <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness i wellness"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"cijelo vrijeme"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"tijekom upotrebe"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Cijelo vrijeme"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Tijekom upotrebe"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> može pristupati svim vašim podacima o fitnessu i wellnessu <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Ima dopuštenje za pristup"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Ima dopuštenje za čitanje"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ta dopuštenja aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> omogućuju pristup podacima senzora vašeg uređaja."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Aplikacije s dopuštenjem: <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nema aplikacija koje traže dopuštenje"</string>
+    <string name="allowed" msgid="4158456017482263737">"Dopušteno"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nije dopušteno"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikacije s tim dopuštenjem mogu pristupati podacima vrste <xliff:g id="DATA_TYPE">%s</xliff:g> sa senzora uređaja."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Želite li ukloniti pristup podacima vrste <xliff:g id="DATA_TYPE">%s</xliff:g> za sve aplikacije na satu?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Kvačica"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Znak križa"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"<xliff:g id="APP_NAME">%1$s</xliff:g> trenutačno može pristupati podacima o fitnessu i općem stanju <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Želite li dopustiti aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> da uvijek pristupa podacima o fitnessu i općem stanju?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ima pristup podacima vrste <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Upravljajte dopuštenjima za fitness i opće stanje"</string>
 </resources>
diff --git a/apk/res/values-hu/strings.xml b/apk/res/values-hu/strings.xml
index 851b469..0cca1c6 100644
--- a/apk/res/values-hu/strings.xml
+++ b/apk/res/values-hu/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Kezelheti az egészségével és a fitnesztevékenységeivel kapcsolatos adatokat az eszközén, és szabályozhatja, hogy mely alkalmazások férhetnek hozzájuk."</string>
     <string name="data_title" msgid="4456619761533380816">"Adatok és hozzáférés"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Az egészségügyi nyilvántartás böngészése"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Megtekintheti az egészségügyi adatait és azt, hogy mely alkalmazások férhetnek hozzájuk."</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Minden kategória"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Minden kategória megtekintése"</string>
     <string name="no_data" msgid="1906986019249068659">"Nincs adat"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Tegnap"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Olvasás: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Írás: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Engedélyek kezelése"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Idő: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Tevékenységek"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"hozzáférés az egészségügyi adataihoz"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Elégetett kalória olvasása"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Engedélyezi az alkalmazásnak az elégetett kalória olvasását"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Hozzáférés az adatokhoz a háttérben"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára, hogy hozzáférjen az adatokhoz a háttérben?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára, hogy hozzáférjen az adatokhoz a háttérben?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ha engedélyezi, ez az alkalmazás hozzáférhet a fitnesz- és wellnessadatokhoz, valamint az egészségügyi nyilvántartásokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ha engedélyezi, ez az alkalmazás hozzáférhet az egészségügyi nyilvántartásokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ha engedélyezi, ez az alkalmazás hozzáférhet a fitnesz- és wellnessadatokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ha engedélyezi, ez az alkalmazás hozzáférhet a Health Connect-adatokhoz, amikor Ön nem használja az appot."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára a korábbi adatokhoz való hozzáférést?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ha engedélyezi, ez az alkalmazás hozzáférhet a(z) <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> előtt hozzáadott fitnesz- és wellnessadatokhoz."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ha engedélyezi, ez az alkalmazás hozzáférhet az összes korábbi fitnesz- és wellnessadathoz."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ha engedélyezi, ez az alkalmazás hozzáférhet a(z) <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> előtt hozzáadott Health Connect-adatokhoz."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ha engedélyezi, ez az alkalmazás hozzáférhet az összes korábbi Health Connect-adathoz."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Engedélyezi a további hozzáférést a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> ezekhez a Health Connect-beállításokhoz is hozzá kíván férni."</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Hozzáférés az összes adathoz a háttérben"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Hozzáférés az egészségügyi nyilvántartásokhoz a háttérben"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Hozzáférés a fitnesz- és wellnessadatokhoz a háttérben"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen a fitnesz- és wellnessadatokhoz, valamint az egészségügyi nyilvántartásokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen ezekhez az adatokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen ezekhez az adatokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Hozzáférés az adatokhoz a háttérben"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Annak engedélyezése, hogy ez az alkalmazás hozzáférjen a Health Connect-adatokhoz, amikor Ön nem használja az appot."</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Hozzáférés a korábbi fitnesz- és wellnessadatokhoz"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen a(z) <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> előtt hozzáadott adatokhoz."</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen az összes korábbi adathoz."</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Hozzáférés korábbi adatokhoz"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen a(z) <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> előtt hozzáadott Health Connect-adatokhoz."</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen az összes korábbi Health Connect-adathoz."</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> már hozzáférhet az Ön egészségügyi nyilvántartásának korábbi adataihoz."</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"További információ az engedélyekről"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Hozzáférés az összes adathoz a háttérben"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Hozzáférés az egészségügyi nyilvántartásokhoz a háttérben"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Hozzáférés a fitnesz- és wellnessadatokhoz a háttérben"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen a fitnesz- és wellnessadatokhoz, valamint az egészségügyi nyilvántartásokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen ezekhez az adatokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen ezekhez az adatokhoz, amikor Ön nem használja az appot."</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Hozzáférés az adatokhoz a háttérben"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Annak engedélyezése, hogy ez az alkalmazás hozzáférjen a Health Connect-adatokhoz, amikor Ön nem használja az appot."</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Hozzáférés a korábbi fitnesz- és wellnessadatokhoz"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen a(z) <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> előtt hozzáadott adatokhoz."</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen az összes korábbi adathoz."</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Hozzáférés korábbi adatokhoz"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen a(z) <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> előtt hozzáadott Health Connect-adatokhoz."</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen az összes korábbi Health Connect-adathoz."</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Jelenleg nem olvashatók fitneszadatok, mert a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára nincsenek megadva az olvasási engedélyek."</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> már hozzáférhet az Ön egészségügyi nyilvántartásának korábbi adataihoz. Ha ezt módosítani szeretné, kapcsolja ki az egészségügyi nyilvántartásra vonatkozó engedélyeket az alkalmazásnál."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Egészségügyi nyilvántartási engedélyek kezelése"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Engedélyezzen legalább egy olvasási engedélyt az alkalmazáshoz való háttérbeli vagy korábbi adathozzáférés bekapcsolásához"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Engedélyezzen legalább egy olvasási engedélyt az alkalmazáshoz való háttérhozzáférés bekapcsolásához"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Engedélyezzen legalább egy olvasási engedélyt az alkalmazáshoz való korábbi adathozzáférés bekapcsolásához"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Engedélyezheti, hogy ez az alkalmazás hozzáférjen az összes korábbi Health Connect-adathoz."</string>
     <string name="background_read_description" msgid="3203594555849969283">"Annak engedélyezése, hogy ez az alkalmazás hozzáférjen a Health Connect-adatokhoz, amikor Ön nem használja az appot."</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ha engedélyezi, ez az alkalmazás hozzáférhet a Health Connect-adatokhoz, amikor Ön nem használja az appot."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Hozzáférés korábbi adatokhoz"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára a korábbi adatokhoz való hozzáférést?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Annak engedélyezése, hogy ez az alkalmazás hozzáférjen a <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> előtt hozzáadott Health Connect-adatokhoz."</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Annak engedélyezése, hogy ez az alkalmazás hozzáférjen az összes korábbi Health Connect-adathoz"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ha engedélyezi, ez az alkalmazás hozzáférhet a(z) <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> előtt hozzáadott Health Connect-adatokhoz."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ha engedélyezi, ez az alkalmazás hozzáférhet az összes korábbi Health Connect-adathoz."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktívan elégetett kalória"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktívan elégetett kalória"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Aktívan elégetett kalóriára vonatkozó adatok olvasása"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"kerekesszéklökés"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Kerekesszéklökésre vonatkozó adatok olvasása"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Kerekesszéklökésre vonatkozó adatok írása"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Tevékenység intenzitása"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"tevékenység intenzitása"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Tevékenységintenzitásra vonatkozó adatok olvasása"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Tevékenységintenzitásra vonatkozó adatok írása"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Alapanyagcsere-sebesség"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"alapanyagcsere-sebesség"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Alapanyagcsere-sebességre vonatkozó adatok olvasása"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"bőrhőmérséklet"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Bőrhőmérséklet olvasása"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Bőrhőmérséklet írása"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Ez magában foglalja a Health Connect szolgáltatással szinkronizált és hozzáadott összes egészségügyi nyilvántartást. Ez nem feltétlenül az Ön teljes egészségügyi nyilvántartása, és nem tartalmazza az egészségügyi nyilvántartásai egészségügyi leírását."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Teljes egészségügyi nyilvántartás"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"teljes egészségügyi nyilvántartás"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Teljes egészségügyi nyilvántartás írása"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergia"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergia"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Allergiainformációk olvasása"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunizáció"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunizáció"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Immunizáció olvasása"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratóriumi eredmények"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratóriumi eredmények"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Laboratóriumi eredmények olvasása"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergia"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergia"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Allergiainformációk olvasása"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Feltételek"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"feltételek"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"A feltételek elolvasása"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Oltások"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"oltások"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Oltásinformációk olvasása"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboreredmények"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboreredmények"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Laboreredmények olvasása"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Gyógyszerek"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"gyógyszerek"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Gyógyszerek olvasása"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Személyes adatok"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"személyes adatok"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Személyes adatok olvasása"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Egészségügyi szakemberek adatai"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"egészségügyi szakemberek adatai"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Egészségügyi szakemberek adatainak olvasása"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Terhesség"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"terhesség"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Terhességi adatok olvasása"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problémák"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problémák"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Problémák elolvasása"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Eljárások"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"eljárások"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Eljárások olvasása"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Közösségimédia-előzmények"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Közösségimédia-előzmények"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"társadalomtörténet"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Közösségi előzmények olvasása"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Életfunkciók"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Látogatások"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"látogatások"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Látogatások olvasása"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Életfunkciók"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"életfunkciók"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Életfunkciók olvasása"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Tudatos jelenlét"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"A Tudatos jelenlét-adatok írása"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Olvasási jogosultság a(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” alkalmazásnak"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Írási jogosultság a(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” alkalmazásnak"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Mégse"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Engedélyezés"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Összes engedélyezése"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Tiltás"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Adja meg, hogy az alkalmazás milyen adatokat olvashasson, illetve írhasson a Health Connect számára"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Adja meg, hogy az alkalmazás milyen adatokat olvashasson a Health Connectből, illetve írhasson a Health Connect számára."</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Adja meg, hogy az alkalmazás milyen adatokat olvashasson a Health Connectből."</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Adja meg, hogy az alkalmazás milyen adatokat írhasson a Health Connect számára."</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Olvasási hozzáférés megadásával az alkalmazás olvashatja az új és az elmúlt 30 napból származó adatokat."</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Olvasási hozzáférés megadásával az alkalmazás olvashatja az új és korábbi adatokat."</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Engedélyezi, hogy a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> hozzáférjen a Health Connect szolgáltatáshoz?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás adatkezeléséről a következő dokumentumban találhat további információt: fejlesztői <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára a fitnesz- és wellnessadatokhoz való hozzáférést?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás adatkezeléséről bővebben a következő oldalon tájékozódhat: <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"adatvédelmi irányelvek"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára, hogy hozzáférjen az Ön egészségügyi adataihoz?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ha hozzáférést biztosít számára, az alkalmazás olvashatja és írhatja a különböző (például az allergiákkal, a laboratóriumi eredményekkel, az oltásokkal stb. kapcsolatos) adatokat.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ha hozzáférést biztosít számára, az alkalmazás olvashatja a különböző (például az allergiákkal, a laboratóriumi eredményekkel, az oltásokkal stb. kapcsolatos) adatokat.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Az egészségügyi nyilvántartások"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"A megosztani kívánt adatok a következőket tartalmazzák:"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ha engedélyezi, a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> megoszthatja az egészségügyi nyilvántartásokat a Health Connect szolgáltatással."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Szinkronizálhatja a különböző alkalmazásokból és forrásokból származó egészségügyi adatait, hogy egy helyen tárolhassa őket"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Az összes engedélyt megvonja?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Összes eltávolítása"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt (például korábbi) adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a helyadatokhoz, a kamerához vagy a mikrofonhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt (például háttér- vagy korábbi) adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a helyadatokhoz, a kamerához vagy a mikrofonhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> adatai is törlődjenek a Health Connectből"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Az összes engedélyt megvonja?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Megvonja az összes egészségügyi nyilvántartási engedélyt?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Eltávolítja az összes fitnesz- és wellnessengedélyt?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásból származó fitneszadatok is legyenek törölve a Health Connect szolgáltatásból"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Megvonja az összes egészségügyi nyilvántartási engedélyt?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásból származó egészségügyi nyilvántartás is legyen törölve a Health Connect szolgáltatásból"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt ilyen adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt ilyen (például háttér-) adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt ilyen (például korábbi) adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt ilyen (például háttér- vagy korábbi) adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Az összes engedélyt megvonja?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt (például háttér-) adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt (például korábbi) adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a továbbiakban nem olvashatja vagy írhatja a Health Connect szolgáltatásban tárolt (például háttér- vagy korábbi) adatokat.\n\nEz nem befolyásolja azokat az egyéb (például a kamerához, a mikrofonhoz vagy a helyadatokhoz tartozó) engedélyeket, amelyekkel ez az alkalmazás esetleg rendelkezik."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásból származó fitneszadatok és egészségügyi nyilvántartás törlése a Health Connect szolgáltatásból"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Az alkalmazásra vonatkozó engedélyek visszavonva"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Az összes Health Connect-adat is legyen törölve"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Következő nap"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Kiválasztott nap"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Előző nap"</string>
     <string name="default_error" msgid="7966868260616403475">"Hiba történt. Próbálja újra."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Ismeretlen forrás"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Forrásadatok"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Nyitó szögletes zárójel."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Záró szögletes zárójel."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> mező <xliff:g id="FIELD">%2$s</xliff:g> értéke"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Ezeknek az alkalmazásoknak már nincs hozzáférésük, de továbbra is tárolnak adatokat a Health Connect szolgáltatásban."</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> olvashatja a következő dátum után hozzáadott adatokat: <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Olyan egyéb Android-engedélyek kezeléséhez, amelyekhez ez az alkalmazás hozzáférhet, lépjen a Beállítások &gt; Alkalmazások menüpontba"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazással megosztott adatokra az alkalmazás adatvédelmi irányelvei vonatkoznak"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"A fejlesztő adatvédelmi irányelveiből tájékozódhat arról, hogy a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> hogyan kezeli az adatokat."</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Olyan egyéb Android-engedélyek kezeléséhez, amelyekhez ez az alkalmazás hozzáférhet, lépjen a Beállításokba, majd koppintson az Alkalmazások menüpontra."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Az adatvédelmi irányelvek elolvasása"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Hozzáfért az elmúlt 24 órában"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Alkalmazás-hozzáférés"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Jelenleg nincs kompatibilis alkalmazás telepítve"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"További hozzáférés"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Korábbi adatok, háttéradatok"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Az alkalmazásra vonatkozó további engedélyek visszavonva"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Engedélyek"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fittség és jóllét"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Edzés, alvás, táplálkozás és egyéb"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Egészségügyi nyilvántartás"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"egészségügyi nyilvántartás"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laborok, gyógyszerek, oltások és egyebek"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Laborok, gyógyszerek, oltások stb."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Eltávolított alkalmazásengedélyek"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"A Health Connect eltávolította a következőnek megadott engedélyeket: <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"A Health Connect eltávolította a következőknek megadott engedélyeket: <xliff:g id="APP_DATA_0">%1$s</xliff:g> és <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"A Play Áruház megnyitása"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Kezdő lépések a Health Connect szolgáltatással"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"A Health Connect tárolja az egészségével és a fitnesztevékenységeivel kapcsolatos adatokat, így könnyedén szinkronizálhatja az eszközén lévő különböző alkalmazásokat."</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"A Health Connect tárolja és szinkronizálja az Ön különböző alkalmazásokból származó egészségügyi és fitneszadatait.\n\n"<b>"Fitnesszel és jólléttel kapcsolatos adatok,"</b>" például edzések, lépésszám, táplálkozás, alvás és egyebek\n\n"<b>"Egészségügyi nyilvántartások,"</b>" például oltások, laboratóriumi eredmények és egyebek"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"A Health Connect segítségével lehetősége van a következőkre:"</string>
     <string name="share_data" msgid="3481932156368883946">"Megoszthat adatokat az alkalmazásaival"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Beállíthatja, hogy az egyes alkalmazások milyen adatokat olvashatnak/írhatnak a Health Connectben"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Kezelheti a beállításokat és az adatvédelmet"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Enyhe vérzés"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Közepes vérzés"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Erős vérzés"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Ismeretlen folyás"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruáció napja: <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>/<xliff:g id="DAY">%1$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruáció (1 nap)}other{Menstruáció (# nap)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitív"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatív"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Magas"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Zene"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Egyéb"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Nem vezetett"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Közepes"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Erőteljes"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> p"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ó <xliff:g id="MIN">%2$s</xliff:g> p"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> óra"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Az integráció folyamatban van"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Folyamatban van a Health Connect integrációja az Android rendszerrel.\n\nBeletelhet egy kis időbe, amíg befejeződik az adatok és az engedélyek átvitele."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ne zárja be az alkalmazást, amíg értesítést nem kap a folyamat befejezéséről."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"A Health Connect integrációja folyamatban van"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Frissítés szükséges"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Folyamatban van a Health Connect integrációja az Android rendszerrel. A folyamat befejezése után közvetlenül a beállításokban férhet hozzá a szolgáltatáshoz."</string>
     <string name="update_button" msgid="4544529019832009496">"Frissítés"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Indítsa el ezt a frissítést most, hogy folytatódhasson a Health Connect integrációja a rendszerbeállításokkal"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Frissítés most"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Rendszerfrissítés szükséges"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"A folytatás előtt frissítse a telefon rendszerét."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ha már frissítette a telefon rendszerét, az integráció folytatásához próbálkozzon a telefon újraindításával."</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"A Health Connect frissítése szükséges"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Továbblépés előtt frissítse a Health Connect alkalmazást a legújabb verzióra."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Több tárhely szükséges"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"A Health Connectnek <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> tárhelyre van szüksége a telefonon az integráció folytatásához.\n\nSzabadítson fel némi tárhelyet a telefonon, majd próbálja újra."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Újra"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Tárhely felszabadítása"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Több tárhely szükséges"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"A Health Connectnek <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> tárhelyre van szüksége a telefonon az integráció folytatásához."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Az integráció szüneteltetve van"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"A Health Connect alkalmazás bezárult az Android rendszerrel való integrációja közben.\n\nKattintson a „Folytatás” lehetőségre az app újbóli megnyitásához, valamint az adatok és az engedélyek átvitelének folytatásához."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"A Health Connect-adatainak megőrzése érdekében végezze el ezt a műveletet a megadott időn belül (<xliff:g id="TIME_NEEDED">%1$s</xliff:g>)"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Koppintson a Health Connect Android rendszerrel való integrációjának folytatásához. Az adatai megőrzése érdekében végezze el ezt a műveletet a megadott időn belül (<xliff:g id="TIME_NEEDED">%1$s</xliff:g>)."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Koppintson a Health Connect Android rendszerrel való integrációjának folytatásához."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Tovább"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"A Health Connect integrációjának folytatása"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Az adatai megőrzése érdekében végezze el ezt a műveletet a megadott időn belül (<xliff:g id="TIME_NEEDED">%1$s</xliff:g>)."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Alkalmazásfrissítés szükséges"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazást frissíteni kell, hogy továbbra is szinkronizálni tudjon a Health Connecttel."</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Néhány alkalmazást frissíteni kell, hogy továbbra is szinkronizálni tudjanak a Health Connecttel."</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazást frissíteni kell, hogy továbbra is szinkronizálni tudjon a Health Connecttel. Előfordulhat, hogy nem minden alkalmazás esetében áll rendelkezésre frissítés."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Néhány alkalmazást frissíteni kell, hogy továbbra is szinkronizálni tudjanak a Health Connecttel. Előfordulhat, hogy nem minden alkalmazás esetében áll rendelkezésre frissítés."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Frissítések keresése"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"További információ"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"A Health Connect integrációja"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"A Health Connect integrációját nem sikerült befejezni"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Értesítést kap, amint újra rendelkezésre áll a lehetőség."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Értem"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"A Health Connect integrációját nem sikerült befejezni"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Továbbiak"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"A Health Connect integrációja befejeződött"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Megnyitás"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Újdonságok"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Mostantól közvetlenül a beállításokban férhet hozzá a Health Connecthez. Bármikor eltávolíthatja a Health Connect alkalmazást tárhely felszabadítása érdekében."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Értem"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Alkalmazásforrások szerkesztése"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Alapértelmezett"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Alkalmazásadatok"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Itt jelennek meg az adatok azokból az alkalmazásokból, amelyeknek hozzáférése van a Health Connecthez"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Itt jelennek majd meg a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> adatai"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Itt jelennek meg az adatok azokból az alkalmazásokból, amelyek hozzáférnek a Health Connecthez"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Nap"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Hét"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Hónap"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Előző hónapban"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Bejegyzések"</string>
     <string name="tab_access" msgid="7818197975407243701">"Hozzáférés"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Engedélyezi a további hozzáférést a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> ezekhez a Health Connect-beállításokhoz is hozzá kíván férni."</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Engedélyezzen legalább egy olvasási engedélyt az alkalmazáshoz való háttérbeli vagy korábbi adathozzáférés bekapcsolásához"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Engedélyezzen legalább egy olvasási engedélyt az alkalmazáshoz való háttérhozzáférés bekapcsolásához"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Engedélyezzen legalább egy olvasási engedélyt az alkalmazáshoz való korábbi adathozzáférés bekapcsolásához"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"A Health Connect használatának megkezdése"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Szinkronizálja első appjait, hogy megoszthassa köztük egészségügyi és fitneszadatait"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Beállítás"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Kompatibilis appok megtekintése"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Keressen további olyan appokat, amelyeket szinkronizálhat a(z) <xliff:g id="APP_NAME">%s</xliff:g> alkalmazással a Health Connecten keresztül"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Megtekintés alkalmazásboltban"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Képernyőzár beállítása"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Az egészségügyi adatok fokozottabb biztonsága érdekében állítson be PIN-kódot, mintát vagy jelszót ezen az eszközön"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Képernyőzár beállítása"</string>
     <string name="select_all" msgid="837499881590001166">"Összes kijelölése"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"A társított alkalmazások a továbbiakban nem tudják majd írni a Health Connect szolgáltatásból származó adatokat"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Bejelölve"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nincs bejelölve"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Rendelkezésre áll edzési térképes útvonal"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Következő nap"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Következő hét"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Következő hónap"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Előző nap"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Előző hét"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Előző hónap"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Véglegesen törli az összes adatot?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Véglegesen törli a kijelölt adatokat?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Véglegesen törli a(z) <xliff:g id="APP_NAME">%s</xliff:g> típusú adatokat?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Véglegesen törli a kijelölt <xliff:g id="APP_NAME">%1$s</xliff:g>-bejegyzéseket a következő hétre vonatkozóan: <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Véglegesen törli a kijelölt <xliff:g id="APP_NAME">%1$s</xliff:g>-bejegyzéseket a következő hónapra vonatkozóan: <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Véglegesen törli a(z) <xliff:g id="APP_NAME">%s</xliff:g> bejegyzését?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Véglegesen törli a következőhöz tartozó <xliff:g id="DATA_TYPE">%1$s</xliff:g> típusú adatokat: <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Be"</string>
+    <string name="off" msgid="6996623844428550649">"Ki"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Hozzáférés: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Hozzáférés: tegnap, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Hozzáférés: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Mindig engedélyezett"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Kijelöltek megadása"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Az alkalmazás használata közben"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Összes elutasítása"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára a fitnesz- és wellnessadatokhoz való hozzáférést?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> hozzáférést kér a következőkhöz: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nEngedélyezheti az összeset, vagy kezelheti őket külön-külön."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára, hogy hozzáférjen a következőhöz: <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fittség és jóllét"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"mindig"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"használat közben"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Mindig"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Használat közben"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="ALLOW_MODE">%2$s</xliff:g> hozzáférhet az Ön összes fitnesz- és wellnessadatához"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Hozzáférés engedélyezve"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Olvashat"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ezek az engedélyek hozzáférést biztosítanak a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára az eszköze érzékelőiből származó adatokhoz."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g>/<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalmazás kapott engedélyt"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nincsenek kérelmező alkalmazások"</string>
+    <string name="allowed" msgid="4158456017482263737">"Engedélyezve"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nem engedélyezett"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Az ezzel az engedéllyel rendelkező alkalmazások hozzáférhetnek az eszközérzékelők <xliff:g id="DATA_TYPE">%s</xliff:g> adataihoz."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Megszünteti az óráján lévő összes alkalmazás <xliff:g id="DATA_TYPE">%s</xliff:g> adatokhoz való hozzáférését?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Pipajel"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Ikszjel"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"A jelenlegi beállítás szerint a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="ALLOW_MODE">%2$s</xliff:g> hozzáférhet a fitnesz- és jóllétadatokhoz"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> számára a fitnesz- és wellnessadatokhoz való folyamatos hozzáférést?"</string>
+    <string name="current_access" msgid="1457167070428176139">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> a következőkhöz férhet hozzá: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Fitnesz- és jóllétengedélyek kezelése"</string>
 </resources>
diff --git a/apk/res/values-hy/strings.xml b/apk/res/values-hy/strings.xml
index 433c7f0..74f6751 100644
--- a/apk/res/values-hy/strings.xml
+++ b/apk/res/values-hy/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Կառավարեք առողջության և ֆիզիկական ակտիվության տվյալները ձեր սարքում և ընտրեք, թե որ հավելվածներին կարող են դրանք հասանելի լինել"</string>
     <string name="data_title" msgid="4456619761533380816">"Տվյալներ և հասանելիություն"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Դիտել առողջության մասին տեղեկությունները"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Դիտել առողջության մասին տեղեկությունները և հավելվածները, որոնց հասանելի են այդ տվյալները"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Բոլոր կատեգորիաները"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Տեսնել բոլոր կատեգորիաները"</string>
     <string name="no_data" msgid="1906986019249068659">"Տվյալներ չկան"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Երեկ"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Կարդալ՝ <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Գրանցել՝ <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Կառավարել թույլտվությունները"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Ժամանակը՝ <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Ակտիվություն"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ձեր առողջության մասին տվյալների հասանելիություն"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Կարդալ՝ որքան կալորիա է այրվել"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Թույլ է տալիս հավելվածին կարդալ այրված կալորիաների մասին տվյալները"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Թույլատրել տվյալների օգտագործումը ֆոնային ռեժիմում"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Թույլատրե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին օգտագործել տվյալները ֆոնային ռեժիմում"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Թույլատրե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին օգտագործել տվյալները ֆոնային ռեժիմում"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Թույլատրել այս հավելվածին օգտագործել ֆիզիկական ակտիվության և ապրելակերպի վերաբերյալ տվյալները և առողջության մասին տեղեկությունները, երբ չեք օգտագործում այս հավելվածը։"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել առողջության մասին տեղեկությունները, երբ չեք օգտագործի հավելվածը։"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել ֆիզիկական ակտիվության և ապրելակերպի վերաբերյալ տվյալները, երբ չեք օգտագործի հավելվածը։"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել Health Connect-ի տվյալները, երբ չեք օգտագործի հավելվածը։"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Թույլատրե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին օգտագործել պահված տվյալները"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել ֆիզիկական ակտիվության և ապրելակերպի վերաբերյալ տվյալները, որոնք ավելացվել են մինչև <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>։"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել ֆիզիկական ակտիվության և ապրելակերպի վերաբերյալ բոլոր պահված տվյալները։"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել Health Connect-ի տվյալները, որոնք ավելացվել են մինչև <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>։"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել Health Connect-ի բոլոր պահված տվյալները։"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Ընդլայնված հասանելիություն տա՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը նաև հայցում է Health Connect-ի այս կարգավորումների օգտագործման թույլտվություն"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Հասանելի դարձնել բոլոր տվյալները ֆոնային ռեժիմում"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Հասանելի դարձնել առողջության մասին տեղեկությունները ֆոնային ռեժիմում"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Հասանելի դարձնել ֆիզիկական ակտիվության և ապրելակերպի վերաբերյալ տվյալները ֆոնային ռեժիմում"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Թույլատրել այս հավելվածին օգտագործել ֆիզիկական ակտիվության և ապրելակերպի վերաբերյալ տվյալները և առողջության մասին տեղեկությունները, երբ չեք օգտագործում հավելվածը"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Թույլատրել այս հավելվածին օգտագործել այս տվյալները, երբ չեք օգտագործում հավելվածը"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Թույլատրել այս հավելվածին օգտագործել այս տվյալները, երբ չեք օգտագործում հավելվածը"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Թույլատրել տվյալների օգտագործումը ֆոնային ռեժիմում"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Թույլատրեք այս հավելվածին օգտագործել Health Connect-ի տվյալները, երբ չեք օգտագործում հավելվածը"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Հասանելի դարձնել ֆիզիկական ակտիվության և ապրելակերպի մասին պահված տվյալները"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Թույլատրել այս հավելվածին օգտագործել տվյալները, որոնք ավելացվել են մինչև <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Թույլատրել այս հավելվածին օգտագործել բոլոր պահված տվյալները"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Հասանելի դարձնել պահված տվյալները"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Թույլատրել այս հավելվածին օգտագործել Health Connect-ի տվյալները, որոնք ավելացվել են մինչև <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Թույլատրել այս հավելվածին օգտագործել Health Connect-ի բոլոր նախկին տվյալները"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին արդեն հասանելի են ձեր առողջության մասին պահված տեղեկությունները"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Կարդալ ավելին թույլտվությունների մասին"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Հասանելի դարձնել բոլոր տվյալները ֆոնային ռեժիմում"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Հասանելի դարձնել առողջության մասին տեղեկությունները ֆոնային ռեժիմում"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Հասանելի դարձնել ֆիզիկական ակտիվության և ապրելակերպի վերաբերյալ տվյալները ֆոնային ռեժիմում"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Թույլատրել այս հավելվածին օգտագործել ֆիզիկական ակտիվության և ապրելակերպի վերաբերյալ տվյալները և առողջության մասին տեղեկությունները, երբ չեք օգտագործում հավելվածը"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Թույլատրել այս հավելվածին օգտագործել այս տվյալները, երբ չեք օգտագործում հավելվածը"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Թույլատրել այս հավելվածին օգտագործել այս տվյալները, երբ չեք օգտագործում հավելվածը"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Թույլատրել տվյալների օգտագործումը ֆոնային ռեժիմում"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Թույլատրեք այս հավելվածին օգտագործել Health Connect-ի տվյալները, երբ չեք օգտագործում հավելվածը"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Հասանելի դարձնել ֆիզիկական ակտիվության և ապրելակերպի մասին պահված տվյալները"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Թույլատրել այս հավելվածին օգտագործել տվյալները, որոնք ավելացվել են մինչև <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Թույլատրել այս հավելվածին օգտագործել բոլոր պահված տվյալները"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Հասանելի դարձնել պահված տվյալները"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Թույլատրել այս հավելվածին օգտագործել Health Connect-ի տվյալները, որոնք ավելացվել են մինչև <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Թույլատրել այս հավելվածին օգտագործել Health Connect-ի բոլոր պահված տվյալները"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Ֆիզիկական ակտիվության տվյալները ներկայումս չեն ընթերցվում, քանի որ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը կարդալու թույլտվություններ չունի"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին արդեն հասանելի են առողջության մասին գրանցված ձեր նախկին տվյալները։ Սա փոխելու համար անջատեք առողջության մասին տեղեկությունների օգտագործման թույլտվությունները այս հավելվածի համար"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Կառավարել առողջության մասին տեղեկությունների օգտագործման թույլտվությունները"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Տրամադրեք կարդալու նվազագույնը մեկ թույլտվություն, որպեսզի այս հավելվածը ստանա ֆոնային ռեժիմում կամ պահված տվյալների հասանելիություն"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Տրամադրեք կարդալու նվազագույնը մեկ թույլտվություն, որպեսզի այս հավելվածը ստանա ֆոնային ռեժիմում հասանելիություն"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Տրամադրեք կարդալու նվազագույնը մեկ թույլտվություն, որպեսզի այս հավելվածը ստանա պահված տվյալների հասանելիություն"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Թույլատրել այս հավելվածին օգտագործել Health Connect-ի բոլոր նախկին տվյալները"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Թույլատրեք այս հավելվածին օգտագործել Health Connect-ի տվյալները, երբ չեք օգտագործում հավելվածը"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել Health Connect-ի տվյալները, երբ չեք օգտագործի հավելվածը։"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Թույլատրել ավելի վաղ տվյալների հասանելիությունը"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Թույլատրե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին օգտագործել պահված տվյալները"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Թույլատրել այս հավելվածին օգտագործել Health Connect-ի տվյալները, որոնք ավելացվել են մինչև <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Թույլատրել այս հավելվածին օգտագործել Health Connect-ի բոլոր նախկին տվյալները"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել Health Connect-ի տվյալները, որոնք ավելացվել են մինչև <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>։"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Եթե թույլատրեք, այս հավելվածը կկարողանա օգտագործել Health Connect-ի բոլոր նախկին տվյալները։"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Ակտիվ գործողությունների ժամանակ այրված կալորիաներ"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"ակտիվ գործողությունների ժամանակ այրված կալորիաներ"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Կարդալ ակտիվ գործողությունների ժամանակ այրված կալորիաների մասին տվյալները"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"անվասայլակի հրումներ"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Կարդալ անվասայլակի հրումների մասին տվյալները"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Գրանցել անվասայլակի հրումների մասին տվյալները"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Պարապմունքների ինտենսիվությունը"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"պարապմունքների ինտենսիվությունը"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Պարապմունքների ինտենսիվության մասին տվյալների ընթերցում"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Պարապմունքների ինտենսիվության մասին տվյալների գրանցում"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Հիմնական նյութափոխանակության ինտենսիվություն"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"հիմնական նյութափոխանակության ինտենսիվություն"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Կարդալ հիմնական նյութափոխանակության ինտենսիվության մասին տվյալները"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"մաշկի ջերմաստիճան"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Կարդալ մարմնի ջերմաստիճանի տվյալները"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Գրել մարմնի ջերմաստիճանի տվյալները"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Ներառում է առողջության մասին տեղեկությունները, որոնք համաժամացված են և ավելացված են Health Connect-ում։ Այն կարող է չներառել ձեր առողջության մասին ամբողջական տեղեկությունները և չի ներառում ձեր առողջության մասին տեղեկությունների նկարագրությունը։"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Առողջության մասին բոլոր տեղեկությունները"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"առողջության մասին բոլոր տեղեկությունները"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Գրանցել առողջության մասին բոլոր տեղեկությունները"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Ալերգիաներ"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ալերգիաներ"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Կարդալ ալերգիաների մասին տվյալները"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Պատվաստումներ"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"պատվաստումներ"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Պատվաստումների մասին տվյալների դիտում"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Լաբորատոր հետազոտությունների արդյունքներ"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"լաբորատոր հետազոտությունների արդյունքներ"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Լաբորատոր հետազոտությունների արդյունքների ընթերցում"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Ալերգիաներ"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ալերգիաներ"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Կարդալ ալերգիաների մասին տվյալները"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Ախտաբանական վիճակներ"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"ախտաբանական վիճակներ"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Կարդալ ախտաբանական վիճակների տվյալները"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Պատվաստանյութեր"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"պատվաստանյութեր"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Կարդալ պատվաստանյութերի մասին տվյալները"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Լաբորատոր արդյունքներ"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"լաբորատոր արդյունքներ"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Կարդալ լաբորատոր արդյունքները"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Դեղորայք"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"դեղորայք"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Կարդալ դեղորայքի մասին տվյալները"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Անձնական տվյալներ"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"անձնական տվյալներ"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Կարդալ անձնական տվյալները"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Մասնագետների մասին տեղեկություններ"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"մասնագետների մասին տեղեկություններ"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Կարդալ մասնագետների մասին տեղեկությունները"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Հղիություն"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"հղիություն"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Հղիության մասին տվյալների ընթերցում"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Խնդիրներ"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"խնդիրներ"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Խնդիրների մասին տվյալների ընթերցում"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Բժշկական միջամտություններ"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"բժշկական միջամտություններ"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Բժշկական միջամտությունների մասին տվյալների ընթերցում"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Սոցիալական անամնեզ"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Սոցիալական անամնեզ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"սոցիալական անամնեզ"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Սոցիալական անամնեզի տվյալների ընթերցում"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Կենսական ցուցանիշներ"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Այցելություններ"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"այցելություններ"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Կարդալ այցելությունների մասին տվյալները"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Կենսական ցուցանիշներ"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"կենսական ցուցանիշներ"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Կենսական ցուցանիշների ընթերցում"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Գիտակցականություն"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Գրանցել գիտակցականության ժամանակաշրջանի տվյալները"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Թույլատրել <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին կարդալ"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Թույլատրել <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին գրանցել"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Չեղարկել"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Թույլատրել"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Թույլատրել բոլորը"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Չթույլատրել"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Ընտրեք, թե ինչ տվյալներ այս հավելվածը կարդա կամ գրանցի Health Connect-ում"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Ընտրեք, թե ինչ տվյալներ այս հավելվածը կարդա կամ գրանցի Health Connect-ում"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Ընտրեք, թե ինչ տվյալներ այս հավելվածը կարդա Health Connect-ից"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Ընտրեք, թե ինչ տվյալներ այս հավելվածը գրանցի Health Connect-ում"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Եթե տրամադրեք կարդալու թույլտվություն, այս հավելվածը կկարողանա կարդալ նոր և նախորդ 30 օրվա տվյալները"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Եթե տրամադրեք կարդալու թույլտվություն, հավելվածը կկարողանա կարդալ նոր և հին տվյալները"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Հասանելի դարձնե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին Health Connect-ը"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Կարդացեք մշակողի <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>ը՝ տեղեկանալու, թե ինչպես է <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը մշակում ձեր տվյալները"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Թույլատրե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին օգտագործել ֆիզիկական ակտիվության և ապրելակերպի մասին պահված տվյալները"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Կարդացեք մշակողի <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>ը՝ տեղեկանալու, թե ինչպես է <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը մշակում ձեր տվյալները"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"գաղտնիության քաղաքականություն"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Հասանելի դարձնե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին ձեր առողջության մասին տեղեկությունները"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Եթե տրամադրեք հասանելիություն, հավելվածը կկարողանա կարդալ և գրանցել տվյալներ, օրինակ՝ ալերգիաների, լաբորատոր արդյունքների, պատվաստանյութերի մասին և ոչ միայն\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Եթե տրամադրեք հասանելիություն, հավելվածը կկարողանա կարդալ տվյալները, օրինակ՝ ալերգիաների, լաբորատոր արդյունքների, պատվաստանյութերի մասին և ոչ միայն\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Առողջության մասին տեղեկությունների վերաբերյալ"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Փոխանցվող տվյալները ներառում են"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Եթե թույլատրեք, <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը կկարողանա ձեր առողջության մասին տեղեկությունները փոխանցել Health Connect-ին։"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Համաժամացրեք ձեր առողջության մասին տեղեկությունները տարբեր հավելվածներից և աղբյուրներից և պահեք դրանք մեկ տեղում"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Հեռացնե՞լ բոլոր թույլտվությունները"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Հեռացնել բոլորը"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա որևէ տվյալ կարդալ կամ գրանցել Health Connect-ում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեսախցիկի, խոսափողի կամ տեղորոշման։"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա որևէ տվյալ կարդալ կամ գրանցել Health Connect-ում, այդ թվում՝ տվյալներ փոխանակել ֆոնային ռեժիմում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեղորոշման, տեսախցիկի կամ խոսափողի։"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա որևէ տվյալ կարդալ կամ գրանցել Health Connect-ում, այդ թվում՝ տվյալներ փոխանակել ֆոնային ռեժիմում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեղորոշման, տեսախցիկի կամ խոսափողի։"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect-ից ջնջել նաև <xliff:g id="APP_NAME">%1$s</xliff:g>-ի տվյալները"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Հեռացնե՞լ բոլոր թույլտվությունները"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Հեռացնե՞լ առողջության մասին տվյալների թույլտվությունները"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Հեռացնե՞լ ֆիթնեսին/առողջությանը վերաբերող թույլտվությունները"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connect-ից նաև ջնջել <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի գրանցած՝ ֆիզիկական ակտիվության տվյալները"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Հեռացնե՞լ առողջության մասին տվյալների թույլտվությունները"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connect-ից նաև ջնջել <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի գրանցած՝ ֆիզիկական ակտիվության տվյալները"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա այս տվյալները կարդալ կամ գրանցել Health Connect-ում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեսախցիկի, խոսափողի կամ տեղորոշման։"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա այս տվյալները կարդալ կամ գրանցել Health Connect-ում, այդ թվում՝ տվյալներ փոխանակել ֆոնային ռեժիմում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեսախցիկի, խոսափողի կամ տեղորոշման։"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա այս տվյալները կարդալ կամ գրանցել Health Connect-ում, այդ թվում՝ տվյալներ փոխանակել ֆոնային ռեժիմում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեսախցիկի, խոսափողի կամ տեղորոշման։"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա այս տվյալները կարդալ կամ գրանցել Health Connect-ում, այդ թվում՝ տվյալներ փոխանակել ֆոնային ռեժիմում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեղորոշման, տեսախցիկի կամ խոսափողի։"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Հեռացնե՞լ բոլոր թույլտվությունները"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա տվյալներ կարդալ կամ գրանցել Health Connect-ում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեսախցիկի, խոսափողի կամ տեղորոշման։"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա տվյալներ կարդալ կամ գրանցել Health Connect-ում, այդ թվում՝ տվյալներ փոխանակել ֆոնային ռեժիմում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեսախցիկի, խոսափողի կամ տեղորոշման։"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա տվյալներ կարդալ կամ գրանցել Health Connect-ում, այդ թվում՝ տվյալներ փոխանակել ֆոնային ռեժիմում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեսախցիկի, խոսափողի կամ տեղորոշման։"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այլևս չի կարողանա տվյալներ կարդալ կամ գրանցել Health Connect-ում, այդ թվում՝ տվյալներ փոխանակել ֆոնային ռեժիմում։\n\nՍա չի ազդի այս հավելվածի մյուս թույլտվությունների վրա, օրինակ՝ տեղորոշման, տեսախցիկի կամ խոսափողի։"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Health Connect-ից նաև ջնջել <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի գրանցած՝ ֆիզիկական ակտիվության տվյալները և առողջության մասին տեղեկությունները։"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Այս հավելվածի թույլտվությունները հեռացվեցին"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Նաև ջնջել Health Connect-ի բոլոր տվյալները"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Հաջորդ օրը"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Ընտրված օրը"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Նախորդ օրը"</string>
     <string name="default_error" msgid="7966868260616403475">"Սխալ առաջացավ։ Նորից փորձեք։"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Անհայտ ռեսուրս"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Աղբյուրի տվյալներ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Ձախ փակագիծ։"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Աջ փակագիծ։"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> <xliff:g id="FIELD">%2$s</xliff:g> դաշտի արժեքը"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Այս հավելվածներն այլևս չունեն հասանելիություն, սակայն դրանց տվյալները նախկինի պես պահվում են Health Connect-ում"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը կարող է կարդալ <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> հետո ավելացված տվյալները"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Android-ում այս հավելվածին հասանելի մյուս թույլտվությունները կառավարելու համար անցեք Կարգավորումներ &gt; Հավելվածներ"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին ձեր փոխանցած տվյալների նկատմամբ կիրառվում է այդ հավելվածի գաղտնիության քաղաքականությունը"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Ծրագրավորողի գաղտնիության քաղաքականության մեջ կարող եք տեղեկանալ, թե ինչպես է <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը մշակում ձեր տվյալները"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Android-ում այս հավելվածին հասանելի մյուս թույլտվությունները կառավարելու համար անցեք Կարգավորումներ, ապա հպեք «Հավելվածներ»"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Կարդալ գաղտնիության քաղաքականությունը"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Օգտագործվել է վերջին 24 ժամվա ընթացքում"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Հասանելիություն հավելվածների համար"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Դուք այս պահին չունեք տեղադրված համատեղելի հավելվածներ"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Լրացուցիչ թույլտվություններ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Նախկին տվյալներ, ֆոնային տվյալներ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Այս հավելվածի համար լրացուցիչ թույլտվությունները հեռացվել են։"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Թույլտվություններ"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Ֆիթնես և առողջություն"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Վարժություններ, քուն, սննդակարգ և այլն"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Առողջության մասին տեղեկություններ"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"առողջության մասին տեղեկություններ"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Լաբ․ արդյունքներ, դեղորայք, պատվաստումներ և այլն"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Լաբ․ արդյունքներ, դեղորայք, պատվաստանյութեր և այլն"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Հավելվածների թույլտվությունները հեռացված են"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect-ը հեռացրել է <xliff:g id="APP_DATA">%s</xliff:g> հավելվածի թույլտվությունները"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect-ը հեռացրել է <xliff:g id="APP_DATA_0">%1$s</xliff:g> և <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> հավելվածների թույլտվությունները"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Անցնել Play Խանութ"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Ներկայացնում ենք Health Connect-ը"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect-ը պահում է ձեր առողջության և ֆիզիկական ակտիվության տվյալները և համաժամացնում տարբեր հավելվածների աշխատանքը ձեր սարքում"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect-ը տարբեր հավելվածներից պահում և համաժամացնում է ձեր առողջության և ֆիզիկական ակտիվության տվյալները։\n\n"<b>"Ֆիթնեսի և առողջության տվյալներ"</b>", այդ թվում՝ մարզումների, քայլերի, սննդի, քնի և այլ բաների մասին\n\n"<b>"Առողջության մասին տեղեկություններ"</b>", այդ թվում՝ պատվաստանյութերի, լաբորատոր արդյունքների և այլ բաների մասին"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect-ի միջոցով դուք կարող եք՝"</string>
     <string name="share_data" msgid="3481932156368883946">"Կիսվեք տվյալներով հավելվածների հետ"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Ընտրեք տվյալները, որոնք յուրաքանչյուր հավելված կարող է կարդալ և գրանցել Health Connect-ում"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Կառավարեք կարգավորումները և գաղտնիությունը"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Թույլ արտազատում"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Միջին արտազատում"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Ուժեղ արտազատում"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Անհայտ"</string>
     <string name="period_day" msgid="3821944462093965882">"Դաշտանի օր <xliff:g id="DAY">%1$d</xliff:g>՝ <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>-ից"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Դաշտան (1 օր)}one{Դաշտան (# օր)}other{Դաշտան (# օր)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Դրական"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Բացասական"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Բարձր"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Երաժշտություն"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Այլ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Առանց ուղղորդման"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Չափավոր"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Բարձր"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> ր"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ժ <xliff:g id="MIN">%2$s</xliff:g> ր"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ժ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Ինտեգրումն ընթացքում է"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect-ն ինտեգրվում է Android համակարգի հետ։\n\nՈրոշ ժամանակ կարող է տևել, մինչև ձեր տվյալները և թույլտվությունները տեղափոխվեն։"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Մի՛ փակեք հավելվածը, մինչև չստանաք ծանուցում այն մասին, որ գործընթացն ավարտված է։"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect-ի ինտեգրումն ընթացքում&amp;nbsp;է"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Պահանջվում է թարմացում"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect-ն ինտեգրվում է Android համակարգի հետ, այնպես որ դուք կկարողանաք բացել հավելվածն անմիջապես ձեր կարգավորումներից։"</string>
     <string name="update_button" msgid="4544529019832009496">"Թարմացնել"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Սկսեք այս թարմացումը, որպեսզի Health Connect-ը կարողանա շարունակել ինտեգրումը ձեր համակարգի կարգավորումների հետ"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Թարմացնել հիմա"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Պահանջվում է համակարգի թարմացում"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Շարունակելուց առաջ թարմացրեք ձեր հեռախոսի համակարգը։"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Եթե արդեն թարմացրել եք հեռախոսի համակարգը, վերագործարկեք հեռախոսը, որպեսզի շարունակեք ինտեգրումը"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Անհրաժեշտ է թարմացնել Health Connect-ը"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Շարունակելուց առաջ թարմացրեք Health Connect հավելվածը վերջին տարբերակով։"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Ավելի շատ տարածք է պահանջվում"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect-ին անհրաժեշտ է <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> տարածք ձեր հեռախոսում, որպեսզի ինտեգրումը շարունակվի։.\n\nՄաքրեք որոշ տարածք հեռախոսում և նորից փորձեք։"</string>
     <string name="try_again_button" msgid="8745496819992160789">"Նորից փորձել"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Տարածք ազատել"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Ավելի շատ տարածք է պահանջվում"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect-ին անհրաժեշտ է <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> տարածք ձեր հեռախոսում՝ ինտեգրումը շարունակելու համար։"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Ինտեգրումը դադարեցվել է"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect հավելվածը փակվել է՝ Android համակարգի հետ ինտեգրվելիս։\n\nՍեղմեք «Վերսկսել», որպեսզի նորից բացեք հավելվածը և շարունակեք ձեր տվյալների ու թույլտվությունների տեղափոխումը։"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect-ի ձեր տվյալները պահպանելու համար ավարտեք ինտեգրումը <xliff:g id="TIME_NEEDED">%1$s</xliff:g>վա ընթացքում"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Հպեք, որպեսզի շարունակեք Health Connect-ի ինտեգրումը Android համակարգի հետ։ Ձեր տվյալները պահպանելու համար ավարտեք ինտեգրումը <xliff:g id="TIME_NEEDED">%1$s</xliff:g>վա ընթացքում"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Հպեք, որպեսզի շարունակեք Health Connect-ի ինտեգրումը Android համակարգի հետ։"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Շարունակել"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Վերսկսեք Health Connect-ի ինտեգրումը"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Ձեր տվյալները պահպանելու համար ավարտեք ինտեգրումը <xliff:g id="TIME_NEEDED">%1$s</xliff:g>վա ընթացքում"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Պահանջվում է հավելվածի թարմացում"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն անհրաժեշտ է թարմացնել, որպեսզի Health Connect-ի հետ համաժամացումը շարունակվի"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Որոշ հավելվածներ անհրաժեշտ է թարմացնել, որպեսզի Health Connect-ի հետ համաժամացումը շարունակվի"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն անհրաժեշտ է թարմացնել, որպեսզի Health Connect-ի հետ համաժամացումը շարունակվի։ Թարմացումները հնարավոր է, որ ոչ բոլոր հավելվածների համար հասանելի լինել։"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Որոշ հավելվածներ անհրաժեշտ է թարմացնել, որպեսզի Health Connect-ի հետ համաժամացումը շարունակվի։ Թարմացումները հնարավոր է, որ ոչ բոլոր հավելվածների համար հասանելի լինել։"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Ստուգել թարմացումների առկայությունը"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Իմանալ ավելին"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-ի ինտեգրում"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect-ի ինտեգրումը չի ավարտվել"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Դուք ծանուցում կստանաք, երբ այն նորից հասանելի դառնա։"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Եղավ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-ի ինտեգրումը չի ավարտվել"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Կարդալ ավելին"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-ի ինտեգրումն ավարտված է"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Բացել"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Ինչ նոր բան կա"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Այժմ դուք կարող եք բացել Health Connect-ն անմիջապես ձեր կարգավորումներից։ Health Connect հավելվածը ցանկացած ժամանակ կարելի է ապատեղադրել՝ տարածք ազատելու համար։"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Եղավ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Հավելվածների աղբյուրների փոփոխում"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Կանխադրված տարբերակ"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Հավելվածի տվյալներ"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect-ին հասանելիություն ունեցող հավելվածների տվյալները կցուցադրվեն այստեղ"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Այստեղ կցուցադրվեն տվյալներ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածից"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect-ի հասանելիություն ունեցող հավելվածների տվյալները կցուցադրվեն այստեղ"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Օր"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Շաբաթ"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Ամիս"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Անցած ամիս"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Մուտքագրված տվյալներ"</string>
     <string name="tab_access" msgid="7818197975407243701">"Հասանելիություն"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Ընդլայնված հասանելիություն տա՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը նաև հայցում է Health Connect-ի այս կարգավորումների օգտագորման թույլտվություն"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Տրամադրեք կարդալու նվազագույնը մեկ թույլտվություն, որպեսզի այս հավելվածը ստանա ֆոնային ռեժիմում կամ պահված տվյալների հասանելիություն"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Տրամադրեք կարդալու նվազագույնը մեկ թույլտվություն, որպեսզի այս հավելվածը ստանա ֆոնային ռեժիմում հասանելիություն"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Տրամադրեք կարդալու նվազագույնը մեկ թույլտվություն, որպեսզի այս հավելվածը ստանա պահված տվյալների հասանելիություն"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Սկսեք օգտագործել Health Connect-ը"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Համաժամացրեք ձեր առաջին հավելվածները՝ նրանց միջև առողջության և ֆիզիկական ակտիվության տվյալները փոխանակելու համար"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Կարգավորել"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Տեսեք համատեղելի հավելվածները"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Գտեք այլ հավելվածներ՝ Health Connect-ի միջոցով <xliff:g id="APP_NAME">%s</xliff:g> հավելվածի հետ համաժամացնելու համար"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Տեսնել հավելվածների խանութում"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Օգտագործեք էկրանի կողպում"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Ձեր առողջական տվյալների լրացուցիչ պաշտպանության համար օգտագործեք PIN կոդ, նախշ կամ գաղտնաբառ այս սարքում։"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Օգտագործել էկրանի կողպում"</string>
     <string name="select_all" msgid="837499881590001166">"Ընտրել բոլորը"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Կապված հավելվածներն այլևս չեն կարողանա կարդալ Health Connect-ի այս տվյալները"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Նշված է"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Նշված չէ"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Մարզումների երթուղին հասանելի է քարտեզի վրա"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Հաջորդ օրը"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Հաջորդ շաբաթ"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Հաջորդ ամիս"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Նախորդ օրը"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Նախորդ շաբաթ"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Նախորդ ամիս"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Ընդմիշտ ջնջե՞լ բոլոր տվյալները"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Ընդմիշտ ջնջե՞լ ընտրված տվյալները"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Ընդմիշտ ջնջե՞լ <xliff:g id="APP_NAME">%s</xliff:g> հավելվածի բոլոր տվյալները"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Ընդմիշտ ջնջե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածում <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ժամանակահատվածի ընտրված գրառումները"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Ընդմիշտ ջնջե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածում <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ժամանակահատվածի ընտրված գրառումները"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Ընդմիշտ ջնջե՞լ <xliff:g id="APP_NAME">%s</xliff:g> հավելվածում կատարած այս գրառումը"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Ընդմիշտ ջնջե՞լ ընտրված տվյալները (<xliff:g id="DATA_TYPE">%1$s</xliff:g>) <xliff:g id="APP_NAME">%2$s</xliff:g> հավելվածի համար"</string>
+    <string name="on" msgid="8266542510798355807">"Միացված է"</string>
+    <string name="off" msgid="6996623844428550649">"Անջատված է"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Բացվել է <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Բացվել է երեկ, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Բացվել է <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Միշտ թույլատրել"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Թույլատրել ընտրվածը"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Հավելվածի օգտագործման ժամանակ"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Մերժել բոլորը"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Թույլատրե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին օգտագործել ֆիզիկական ակտիվության և ապրելակերպի մասին պահված տվյալները"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին անհրաժեշտ է հետևյալ տվյալների հասանելիություն՝ <xliff:g id="DATA_TYPES">%2$s</xliff:g>։\n\nՏրամադրեք բոլոր թույլտվությունները կամ կառավարեք դրանք առանձին-առանձին։"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին հասանելի դարձնե՞լ այս տվյալները՝ <xliff:g id="DATA_TYPE">%2$s</xliff:g>"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Ֆիթնես և առողջություն"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"միշտ"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"օգտագործման ժամանակ"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Միշտ"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Օգտագործման ժամանակ"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ին <xliff:g id="ALLOW_MODE">%2$s</xliff:g> հասանելի են ֆիթնեսի և առողջության վերաբերյալ ձեր բոլոր տվյսլները"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Դիտելու թույլտվություն"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Կարդալու թույլտվություն"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Այս թույլտվություններով <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը կարող է դիտել տվյալները ձեր սարքի սենսորներից։"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Թույլատրված է <xliff:g id="NUMBER_0">%1$d</xliff:g> հավելված՝ <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>-ից"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Հավելվածներից հարցումներ չկան"</string>
+    <string name="allowed" msgid="4158456017482263737">"Թույլատրված է"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Արգելված է"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Այս թույլտվությամբ հավելվածները կարող են դիտել ձեր սարքի սենսորներից «<xliff:g id="DATA_TYPE">%s</xliff:g>» տվյալները։"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Հեռացնե՞լ «<xliff:g id="DATA_TYPE">%s</xliff:g>» տվյալների հասանելիությունը ձեր ժամացույցի բոլոր հավելվածների համար։"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Թռչնանիշ"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Խաչանիշ"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Ներկայումս <xliff:g id="APP_NAME">%1$s</xliff:g>-ին <xliff:g id="ALLOW_MODE">%2$s</xliff:g> հասանելի են ֆիթնեսի և առողջության վերաբերյալ ձեր տվյալները"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Թույլ տա՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին միշտ օգտագործել ֆիթնեսի և առողջության վերաբերյալ տվյալները"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին հասանելի են հետևյալ տվյալները՝ <xliff:g id="DATA_TYPES">%2$s</xliff:g>"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Կառավարել ֆիթնեսի և առողջության մասին տվյալների հասանելիությունը"</string>
 </resources>
diff --git a/apk/res/values-in/strings.xml b/apk/res/values-in/strings.xml
index ffb2386..c47f382 100644
--- a/apk/res/values-in/strings.xml
+++ b/apk/res/values-in/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Kelola data kesehatan dan kebugaran di perangkat, dan kontrol aplikasi yang dapat mengaksesnya"</string>
     <string name="data_title" msgid="4456619761533380816">"Data dan akses"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Cari catatan kesehatan"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Lihat catatan kesehatan Anda dan aplikasi mana yang dapat mengaksesnya"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Semua kategori"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Lihat semua kategori"</string>
     <string name="no_data" msgid="1906986019249068659">"Tidak ada data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Kemarin"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Membaca: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Menulis: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Kelola izin"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Waktu: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivitas"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"mengakses data kesehatan Anda"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Membaca kalori yang dibakar"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Mengizinkan aplikasi membaca kalori yang dibakar"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Mengakses data di latar belakang"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengakses data di latar belakang?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data di latar belakang?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Jika Anda mengizinkan, aplikasi ini dapat mengakses data kebugaran dan kesehatan serta catatan kesehatan saat Anda tidak sedang menggunakan aplikasi."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Jika Anda mengizinkan, aplikasi ini dapat mengakses catatan kesehatan saat Anda tidak sedang menggunakan aplikasi."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Jika Anda mengizinkan, aplikasi ini dapat mengakses data kebugaran dan kesehatan saat Anda tidak sedang menggunakan aplikasi."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Jika Anda mengizinkan, aplikasi ini dapat mengakses data Health Connect saat Anda tidak sedang menggunakan aplikasi."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data lama?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Jika Anda mengizinkan, aplikasi ini dapat mengakses data kebugaran dan kesehatan yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Jika Anda mengizinkan, aplikasi ini dapat mengakses semua data kebugaran dan kesehatan lama."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Jika Anda mengizinkan, aplikasi ini dapat mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Jika Anda mengizinkan, aplikasi ini dapat mengakses semua data Health Connect lama."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Izinkan akses tambahan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> juga ingin mengakses setelan Health Connect ini"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Mengakses semua data di latar belakang"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Mengakses catatan kesehatan di latar belakang"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Mengakses data kebugaran dan kesehatan di latar belakang"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Izinkan aplikasi ini mengakses data kebugaran dan kesehatan serta catatan kesehatan saat Anda tidak sedang menggunakan aplikasi"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Izinkan aplikasi ini mengakses data ini saat Anda tidak sedang menggunakan aplikasi"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Izinkan aplikasi ini mengakses data ini saat Anda tidak sedang menggunakan aplikasi"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Mengakses data di latar belakang"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Izinkan aplikasi ini mengakses data Health Connect saat Anda tidak sedang menggunakan aplikasi"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Mengakses data kebugaran dan kesehatan lama"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Izinkan aplikasi ini mengakses data yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Izinkan aplikasi ini mengakses semua data lama"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Akses data lama"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Izinkan aplikasi ini mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Izinkan aplikasi ini mengakses semua data Health Connect lama"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> dapat mengakses data lama untuk catatan kesehatan Anda"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Baca selengkapnya tentang izin"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Mengakses semua data di latar belakang"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Mengakses catatan kesehatan di latar belakang"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Mengakses data kebugaran dan kesehatan di latar belakang"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Izinkan aplikasi ini mengakses data kebugaran dan kesehatan serta catatan kesehatan saat Anda tidak sedang menggunakan aplikasi"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Izinkan aplikasi ini mengakses data ini saat Anda tidak sedang menggunakan aplikasi"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Izinkan aplikasi ini mengakses data ini saat Anda tidak sedang menggunakan aplikasi"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Akses data di latar belakang"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Izinkan aplikasi ini mengakses data Health Connect saat Anda tidak sedang menggunakan aplikasi"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Mengakses data kebugaran dan kesehatan lama"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Izinkan aplikasi ini mengakses data yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Izinkan aplikasi ini mengakses semua data lama"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Mengakses data lama"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Izinkan aplikasi ini mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Izinkan aplikasi ini mengakses semua data lama Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Saat ini tidak ada data kebugaran yang dibaca karena <xliff:g id="APP_NAME">%1$s</xliff:g> tidak memiliki izin baca"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> dapat mengakses data lama untuk catatan kesehatan Anda. Untuk mengubahnya, nonaktifkan izin catatan kesehatan untuk aplikasi ini"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Kelola izin catatan kesehatan"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aktifkan setidaknya satu izin baca untuk mengaktifkan akses latar belakang atau data sebelumnya untuk aplikasi ini"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aktifkan setidaknya satu izin baca untuk mengaktifkan akses latar belakang untuk aplikasi ini"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aktifkan setidaknya satu izin baca untuk mengaktifkan akses data sebelumnya untuk aplikasi ini"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Izinkan aplikasi ini mengakses semua data Health Connect lama"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Izinkan aplikasi ini mengakses data Health Connect saat Anda tidak menggunakan aplikasi"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Jika Anda mengizinkan, aplikasi ini dapat mengakses data Health Connect saat Anda tidak menggunakan aplikasi."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Mengakses data lama"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengakses data lama?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Izinkan aplikasi ini mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Izinkan aplikasi ini mengakses semua data lama Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Jika Anda mengizinkan, aplikasi ini dapat mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Jika Anda mengizinkan, aplikasi ini dapat mengakses semua data lama Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Kalori aktif yang dibakar"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"kalori aktif yang dibakar"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Baca kalori aktif yang dibakar"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"dorongan kursi roda"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Baca dorongan kursi roda"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Tulis dorongan kursi roda"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensitas aktivitas"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensitas aktivitas"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Baca intensitas aktivitas"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Tulis intensitas aktivitas"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Laju metabolisme basal"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"laju metabolisme basal"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Baca laju metabolisme basal"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"suhu kulit"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Membaca suhu kulit"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Menulis suhu kulit"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Data ini mencakup semua catatan kesehatan yang disinkronkan dan ditambahkan ke Health Connect. Rekam medis ini mungkin tidak lengkap dan tidak menyertakan deskripsi medis dari catatan kesehatan Anda."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Semua catatan kesehatan"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"semua catatan kesehatan"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Menulis semua catatan kesehatan"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergi"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergi"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Baca alergi"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunisasi"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunisasi"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Baca imunisasi"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Hasil Laboratorium"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"hasil laboratorium"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Baca hasil laboratorium"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergi"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergi"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Baca alergi"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Kondisi"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"kondisi"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Baca kondisi"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaksinasi"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaksinasi"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Baca vaksinasi"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Hasil lab"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"hasil lab"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Baca hasil lab"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Pengobatan"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"pengobatan"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Baca pengobatan"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Detail pribadi"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"detail pribadi"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Baca detail pribadi"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Detail praktisi"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"detail praktisi"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Baca detail praktisi"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Kehamilan"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"kehamilan"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Baca kehamilan"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Masalah"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"masalah"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Baca masalah"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Prosedur"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"prosedur"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Baca prosedur"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Histori Sosial"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Histori sosial"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"histori sosial"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Baca histori sosial"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Tanda-Tanda Vital"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Kunjungan"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"kunjungan"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Baca kunjungan"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Tanda-tanda vital"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"tanda-tanda vital"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Baca tanda-tanda vital"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Tulis mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Izinkan “<xliff:g id="APP_NAME">%1$s</xliff:g>” untuk membaca"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Izinkan “<xliff:g id="APP_NAME">%1$s</xliff:g>” untuk menulis"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Batal"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Izinkan"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Izinkan semua"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Jangan izinkan"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Pilih data yang dapat dibaca atau ditulis oleh aplikasi ini ke Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Pilih data yang dapat dibaca atau ditulis oleh aplikasi ini ke Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Pilih data yang dapat dibaca oleh aplikasi ini dari Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Pilih data yang dapat ditulis oleh aplikasi ini ke Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Jika Anda memberikan akses baca, aplikasi dapat membaca data baru dan data dari 30 hari terakhir"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Jika Anda memberikan akses baca, aplikasi dapat membaca data baru dan data lama"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Anda dapat mempelajari cara <xliff:g id="APP_NAME">%1$s</xliff:g> menangani data Anda di <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> developer"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data kebugaran dan kesehatan?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Anda dapat mempelajari cara <xliff:g id="APP_NAME">%1$s</xliff:g> menangani data Anda di <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>-nya"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"kebijakan privasi"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses catatan kesehatan Anda?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Jika Anda memberikan akses, aplikasi dapat membaca dan menulis data seperti alergi, hasil lab, vaksin, dan lainnya\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Jika Anda memberikan akses, aplikasi dapat membaca data seperti alergi, hasil lab, vaksin, dan lainnya\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Tentang catatan kesehatan"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data yang akan dibagikan mencakup"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Jika Anda mengizinkan, <xliff:g id="APP_NAME">%1$s</xliff:g> dapat membagikan catatan kesehatan Anda ke Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinkronkan catatan kesehatan Anda dari berbagai aplikasi dan sumber untuk menyimpannya di satu tempat"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Hapus semua izin?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Hapus semua"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data dari Health Connect.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data dari Health Connect, termasuk data lama. \n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti lokasi, kamera, atau mikrofon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data dari Health Connect, termasuk data latar belakang dan data lama.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti lokasi, kamera, atau mikrofon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Hapus juga data <xliff:g id="APP_NAME">%1$s</xliff:g> dari Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Hapus semua izin?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Hapus semua izin catatan kesehatan?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Hapus semua izin kebugaran dan kesehatan?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Hapus juga data kebugaran dari <xliff:g id="APP_NAME">%1$s</xliff:g> dari Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Hapus semua izin catatan kesehatan?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Hapus juga catatan kesehatan dari <xliff:g id="APP_NAME">%1$s</xliff:g> dari Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data ini dari Health Connect.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data ini dari Health Connect, termasuk data latar belakang.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data ini dari Health Connect, termasuk data lama.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data ini dari Health Connect, termasuk data latar belakang dan data lama.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Hapus semua izin?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data dari Health Connect.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data dari Health Connect, termasuk data latar belakang.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data dari Health Connect, termasuk data lama.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat lagi membaca atau menulis data dari Health Connect, termasuk data latar belakang dan data lama.\n\nHal ini tidak memengaruhi izin lain yang mungkin dimiliki aplikasi ini, seperti kamera, mikrofon, atau lokasi."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Hapus juga data kebugaran dan catatan kesehatan dari <xliff:g id="APP_NAME">%1$s</xliff:g> dari Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Izin dihapus untuk aplikasi ini"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Hapus juga semua data Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Hari berikutnya"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Hari dipilih"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Hari sebelumnya"</string>
     <string name="default_error" msgid="7966868260616403475">"Terjadi masalah. Coba lagi."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Referensi Tidak Dikenal"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Data sumber"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Tanda kurung buka."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Tanda kurung tutup."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Nilai Kolom <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Aplikasi ini tidak lagi memiliki akses, tetapi masih memiliki data yang tersimpan di Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> dapat membaca data yang ditambahkan setelah <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Untuk mengelola izin Android lainnya yang dapat diakses oleh aplikasi ini, buka Setelan &gt; Aplikasi"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data yang Anda bagikan ke <xliff:g id="APP_NAME">%1$s</xliff:g> dilindungi oleh kebijakan privasinya"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Anda dapat mempelajari cara <xliff:g id="APP_NAME">%1$s</xliff:g> menangani data Anda di kebijakan privasi developer"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Untuk mengelola izin Android lainnya yang dapat diakses oleh aplikasi ini, buka Setelan, lalu ketuk Aplikasi"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Baca kebijakan privasi"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Diakses dalam 24 jam terakhir"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Akses aplikasi"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Anda saat ini tidak memiliki aplikasi terinstal yang kompatibel"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Akses tambahan"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Data lama, data latar belakang"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Menghapus izin tambahan untuk aplikasi ini"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Izin"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Kebugaran dan kesehatan"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Latihan, tidur, nutrisi, dan lainnya"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Catatan kesehatan"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"catatan kesehatan"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Hasil lab, pengobatan, imunisasi, dan lainnya"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Hasil lab, pengobatan, vaksin, dan lainnya"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Izin aplikasi yang dihapus"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect menghapus izin untuk <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect menghapus izin untuk <xliff:g id="APP_DATA_0">%1$s</xliff:g> dan <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Buka Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Mulai menggunakan Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect menyimpan data kesehatan dan kebugaran Anda, yang memberi Anda cara sederhana untuk menyinkronkan berbagai aplikasi di perangkat"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect menyimpan dan menyinkronkan data kesehatan dan kebugaran Anda dari berbagai aplikasi.\n\n"<b>"Data kebugaran dan kesehatan,"</b>" termasuk sesi olahraga, langkah, nutrisi, tidur, dan lainnya\n\n"<b>"Catatan kesehatan,"</b>" termasuk vaksinasi, hasil laboratorium, dan lainnya"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Dengan Health Connect, Anda dapat"</string>
     <string name="share_data" msgid="3481932156368883946">"Berbagi data dengan aplikasi lainnya"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Pilih data yang dapat dibaca atau ditulis ke Health Connect oleh setiap aplikasi"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Kelola setelan dan privasi"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Ringan"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Sedang"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Deras"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Aliran darah tidak diketahui"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruasi hari <xliff:g id="DAY">%1$d</xliff:g> dari <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruasi (1 hari)}other{Menstruasi (# hari)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positif"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatif"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Tinggi"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musik"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Lainnya"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Tanpa panduan"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Sedang"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Berat"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> j <xliff:g id="MIN">%2$s</xliff:g> m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> j"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrasi sedang berlangsung"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect sedang diintegrasikan dengan sistem Android.\n\nProses ini memerlukan waktu beberapa saat selagi data dan izin ditransfer."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Jangan tutup aplikasi sampai Anda mendapatkan notifikasi bahwa proses telah selesai."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integrasi Health Connect sedang berlangsung"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Diperlukan update"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect sedang diintegrasikan dengan sistem Android sehingga Anda dapat mengaksesnya langsung dari setelan."</string>
     <string name="update_button" msgid="4544529019832009496">"Update"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Mulai update ini agar Health Connect dapat melanjutkan integrasi dengan setelan sistem Anda"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Update sekarang"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Update sistem diperlukan"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Sebelum melanjutkan, update sistem ponsel Anda."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Jika sistem ponsel telah diupdate, coba mulai ulang ponsel Anda untuk melanjutkan integrasi"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect perlu diupdate"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Sebelum melanjutkan, update aplikasi Health Connect ke versi terbaru."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Perlu lebih banyak ruang penyimpanan"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect memerlukan ruang penyimpanan ponsel sebesar <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> agar integrasi dapat dilanjutkan.\n\nKosongkan beberapa ruang penyimpanan di ponsel Anda lalu coba lagi."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Coba lagi"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Kosongkan ruang penyimpanan"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Perlu lebih banyak ruang penyimpanan"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect memerlukan ruang penyimpanan ponsel sebesar <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> untuk melanjutkan integrasi."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrasi dijeda"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikasi Health Connect ditutup saat sedang diintegrasikan dengan sistem Android.\n\nKlik lanjutkan untuk membuka kembali aplikasi dan melanjutkan transfer data dan izin."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Untuk menyimpan data Health Connect Anda, selesaikan integrasi ini dalam <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Ketuk untuk melanjutkan integrasi Health Connect dengan sistem Android. Untuk menyimpan data Anda, selesaikan proses ini dalam <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Ketuk untuk melanjutkan integrasi Health Connect dengan sistem Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Lanjutkan"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Lanjutkan integrasi Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Untuk menyimpan data Anda, selesaikan proses ini dalam <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Aplikasi perlu diupdate"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> perlu diupdate agar tetap disinkronkan dengan Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Beberapa aplikasi perlu diupdate agar tetap disinkronkan dengan Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> perlu diupdate agar tetap disinkronkan dengan Health Connect. Update mungkin tidak tersedia untuk semua aplikasi."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Beberapa aplikasi perlu diupdate agar tetap disinkronkan dengan Health Connect. Update mungkin tidak tersedia untuk semua aplikasi."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Periksa update"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Pelajari lebih lanjut"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integrasi Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integrasi Health Connect tidak selesai"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Anda akan mendapatkan notifikasi saat integrasi tersedia kembali."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Oke"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integrasi Health Connect tidak selesai"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Baca selengkapnya"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integrasi Health Connect selesai"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Buka"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Yang baru"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Sekarang Anda dapat mengakses Health Connect langsung dari setelan. Uninstal aplikasi Health Connect kapan saja untuk mengosongkan ruang penyimpanan."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Oke"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Edit sumber aplikasi"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Default perangkat"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Data aplikasi"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data dari aplikasi yang memiliki akses ke Health Connect akan muncul di sini"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data dari <xliff:g id="APP_NAME">%1$s</xliff:g> akan muncul di sini"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data dari aplikasi yang memiliki akses ke Health Connect akan muncul di sini"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Hari"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Minggu"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Bulan"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Bulan lalu"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entri"</string>
     <string name="tab_access" msgid="7818197975407243701">"Akses"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Izinkan aksess tambahan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> juga ingin mengakses setelan Health Connect ini"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aktifkan setidaknya satu izin baca untuk mengaktifkan akses latar belakang atau data sebelumnya untuk aplikasi ini"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aktifkan setidaknya satu izin baca untuk mengaktifkan akses latar belakang untuk aplikasi ini"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aktifkan setidaknya satu izin baca untuk mengaktifkan akses data sebelumnya untuk aplikasi ini"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Mulai menggunakan Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinkronkan aplikasi pertama Anda untuk berbagi data kesehatan dan kebugaran antar-aplikasi"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Siapkan"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Lihat aplikasi yang kompatibel"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Temukan aplikasi lainnya untuk disinkronkan dengan <xliff:g id="APP_NAME">%s</xliff:g> melalui Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Lihat di app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Setel kunci layar"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Untuk keamanan tambahan data kesehatan Anda, setel PIN, pola, atau sandi untuk perangkat ini"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Setel kunci layar"</string>
     <string name="select_all" msgid="837499881590001166">"Pilih semua"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Aplikasi yang terhubung tidak dapat lagi membaca data ini dari Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Dicentang"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Tidak dicentang"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Rute peta olahraga tersedia"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Hari berikutnya"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Minggu berikutnya"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Bulan berikutnya"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Hari sebelumnya"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Minggu sebelumnya"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Bulan sebelumnya"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Hapus permanen semua data?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Hapus permanen data yang dipilih?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Hapus permanen semua data <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Hapus permanen entri <xliff:g id="APP_NAME">%1$s</xliff:g> yang dipilih untuk minggu <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Hapus permanen entri <xliff:g id="APP_NAME">%1$s</xliff:g> yang dipilih untuk bulan <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Hapus permanen entri <xliff:g id="APP_NAME">%s</xliff:g> ini?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Hapus permanen data <xliff:g id="DATA_TYPE">%1$s</xliff:g> untuk <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Aktif"</string>
+    <string name="off" msgid="6996623844428550649">"Nonaktif"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Diakses <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Diakses kemarin <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Diakses <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Selalu izinkan"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Izinkan yang dipilih"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Saat aplikasi digunakan"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Tolak semua"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data kebugaran dan kesehatan?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta akses ke <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nPilih untuk mengizinkan semua atau mengontrolnya satu per satu."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Kebugaran dan kesehatan"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sepanjang waktu"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"saat digunakan"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sepanjang waktu"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Saat digunakan"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> dapat mengakses semua data kebugaran dan kesehatan Anda <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Diizinkan untuk mengakses"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Diizinkan untuk membaca"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Izin ini memberi <xliff:g id="APP_NAME">%1$s</xliff:g> akses ke data dari sensor perangkat Anda."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> dari <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> aplikasi diizinkan"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Tidak ada aplikasi yang meminta"</string>
+    <string name="allowed" msgid="4158456017482263737">"Diizinkan"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Tidak diizinkan"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikasi yang memiliki izin ini dapat mengakses data <xliff:g id="DATA_TYPE">%s</xliff:g> dari sensor perangkat Anda."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Hapus akses <xliff:g id="DATA_TYPE">%s</xliff:g> untuk semua aplikasi di smartwatch?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Tanda centang"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Tanda silang"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Saat ini, <xliff:g id="APP_NAME">%1$s</xliff:g> dapat mengakses data kebugaran dan kesehatan <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Izinkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data kebugaran dan kesehatan kapan saja?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> memiliki akses ke <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Kelola izin kebugaran dan kesehatan"</string>
 </resources>
diff --git a/apk/res/values-is/strings.xml b/apk/res/values-is/strings.xml
index 64e85d6..71103c0 100644
--- a/apk/res/values-is/strings.xml
+++ b/apk/res/values-is/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Stjórnaðu heilsu- og hreystigögnum í tækinu þínu og stjórnaðu hvaða forrit hafa aðgang að þeim"</string>
     <string name="data_title" msgid="4456619761533380816">"Gögn og aðgangur"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Skoða heilsufarsgögn"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Farðu yfir heilsufarsgögnin þín og hvaða forrit hafa aðgang að þeim"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Allir flokkar"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Sjá alla flokka"</string>
     <string name="no_data" msgid="1906986019249068659">"Engin gögn"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Í gær"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lesa: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Skrifa: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Stjórna heimildum"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Tími: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Hreyfing"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"opna heilsugögn"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Lesa brennslu hitaeininga"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Leyfir forritinu að lesa brennslu hitaeininga"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Aðgangur að gögnum í bakgrunninum"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Gefa <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að gögnum í bakgrunninum?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Veita <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að gögnum í bakgrunni?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ef þú veitir forritinu aðgang getur það skoðað gögn um hreysti, vellíðan og heilsufar þegar þú ert ekki að nota það."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ef þú veitir forritinu aðgang getur það skoðað heilsufarsgögn þegar þú ert ekki að nota það."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ef þú veitir forritinu aðgang getur það skoðað gögn um hreysti og vellíðan þegar þú ert ekki að nota það."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ef þú veitir forritinu aðgang getur það skoðað gögn Heilsutengingar þegar þú ert ekki að nota það."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Veita <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að eldri gögnum?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ef þú veitir forritinu aðgang getur það skoðað gögn um hreysti og vellíðan sem bætt var við fyrir <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ef þú veitir forritinu aðgang getur það skoðað öll eldri gögn um hreysti og vellíðan."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ef þú veitir forritinu aðgang getur það skoðað gögn Heilsutengingar sem bætt var við fyrir <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ef þú veitir forritinu aðgang getur það skoðað öll eldri gögn Heilsutengingar."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Veita <xliff:g id="APP_NAME">%1$s</xliff:g> aukinn aðgang?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> vill einnig fá aðgang að þessum stillingum Heilsutengingar"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Aðgangur að öllum gögnum í bakgrunni"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Aðgangur að heilsufarsgögnum í bakgrunni"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Aðgangur að gögnum um hreysti og vellíðan í bakgrunni"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Veita þessu forriti aðgang að gögnum um hreysti, vellíðan og heilsufar þegar þú ert ekki að nota það"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Veita þessu forriti aðgang að þessum gögnum þegar þú ert ekki að nota það"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Veita þessu forriti aðgang að þessum gögnum þegar þú ert ekki að nota það"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Aðgangur að gögnum í bakgrunni"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Veita þessu forriti aðgang að gögnum Heilsutengingar þegar þú ert ekki að nota það"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Aðgangur að eldri gögnum um hreysti og vellíðan"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Veita þessu forriti aðgang að gögnum sem bætt var við fyrir <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Veita þessu forriti aðgang að öllum eldri gögnum"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Aðgangur að eldri gögnum"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Veita þessu forriti aðgang að gögnum Heilsutengingar sem bætt var við fyrir <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Veita þessu forriti aðgang að öllum eldri gögnum Heilsutengingar"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> er nú þegar með aðgang að eldri heilsufarsgögnum"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Nánar um heimildir"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Aðgangur að öllum gögnum í bakgrunni"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Aðgangur að heilsufarsgögnum í bakgrunni"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Aðgangur að gögnum um hreysti og vellíðan í bakgrunni"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Veita þessu forriti aðgang að gögnum um hreysti, vellíðan og heilsufar þegar þú ert ekki að nota það"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Veita þessu forriti aðgang að þessum gögnum þegar þú ert ekki að nota það"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Veita þessu forriti aðgang að þessum gögnum þegar þú ert ekki að nota það"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Aðgangur að gögnum í bakgrunni"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Veita þessu forriti aðgang að gögnum Heilsutengingar þegar þú ert ekki að nota það"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Aðgangur að eldri gögnum um hreysti og vellíðan"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Veita þessu forriti aðgang að gögnum sem bætt var við fyrir <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Veita þessu forriti aðgang að öllum eldri gögnum"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Aðgangur að eldri gögnum"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Veita þessu forriti aðgang að gögnum Heilsutengingar sem bætt var við fyrir <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Veita þessu forriti aðgang að öllum eldri gögnum Heilsutengingar"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Eins og stendur eru engin hreystigögn lesin vegna þess að slökkt er á öllum heimildum <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> er nú þegar með aðgang að eldri heilsufarsgögnum. Slökktu á heimildum forritsins fyrir heilsufarsgögn til að breyta þessu."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Stjórna heimildum fyrir heilsugögn"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Leyfðu að minnsta kosti eina lestrarheimild til þess að kveikja á bakgrunnsaðgangi eða aðgangi að eldri gögnum fyrir þetta forrit"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Leyfðu að minnsta kosti eina lestrarheimild til þess að kveikja á bakgrunnsaðgangi fyrir þetta forrit"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Leyfðu að minnsta kosti eina lestrarheimild til þess að kveikja á aðgangi að eldri gögnum fyrir þetta forrit"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Veita þessu forriti aðgang að öllum eldri gögnum Heilsutengingar"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Gefa þessu forriti aðgang að gögnum úr Heilsutengingu þegar þú ert ekki að nota forritið"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ef þú leyfir þetta getur forritið fengið aðgang að gögnum úr Heilsutengingu þegar þú ert ekki að nota forritið."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Aðgangur að eldri gögnum"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Leyfa <xliff:g id="APP_NAME">%1$s</xliff:g> að fá aðgang að eldri gögnum?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Gefa þessu forriti aðgang að gögnum úr Heilsutengingu sem bætt var við fyrir <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Gefa þessu forriti aðgang að öllum eldri gögnum úr Heilsutengingu"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ef þú leyfir þetta getur forritið fengið aðgang að gögnum úr Heilsutengingu sem bætt var við fyrir <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ef þú gefur leyfi hefur þetta forrit aðgang að öllum eldri gögnum úr Heilsutengingu."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Brennsla hitaeininga við hreyfingu"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"brennsla hitaeininga við hreyfingu"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Lesa brennslu hitaeininga við hreyfingu"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"fjöldi skipta sem hjólastól er ýtt"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Lesa fjölda skipta sem hjólastól er ýtt"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Skrifa fjölda skipta sem hjólastól er ýtt"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Ákefð virkni"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ákefð virkni"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Lesa ákefð virkni"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Skrifa ákefð virkni"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Grunnefnaskiptahraði"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"grunnefnaskiptahraði"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Lesa grunnefnaskiptahraða"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"hitastig húðar"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Lesa hitastig húðar"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Skrifa hitastig húðar"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Þetta felur í sér allar heilsufarsskrár sem eru samstilltar og bætt við Heilsutengingu. Þetta er hugsanlega ekki öll sjúkraskráin þín og innheldur ekki læknisfræðilega lýsingu á heilsufarsskránum þínum."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Öll heilsufarsgögn"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"öll heilsufarsgögn"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Skrifa öll heilsufarsgögn"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Ofnæmi"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ofnæmi"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lesa um ofnæmi"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Ónæming"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ónæming"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Lesa ónæmingu"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Rannsóknarniðurstöður"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"rannsóknarniðurstöður"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Lesa rannsóknarniðurstöður"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Upplýsingar um ofnæmi"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"upplýsingar um ofnæmi"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Lesa upplýsingar um ofnæmi"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Skilmálar"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"skilmálar"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Lesa skilmála"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Upplýsingar um bólusetningar"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"upplýsingar um bólusetningar"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Lesa upplýsingar um bólusetningar"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Rannsóknarniðurstöður"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"rannsóknarniðurstöður"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Lesa rannsóknarniðurstöður"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Upplýsingar um lyf"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"upplýsingar um lyf"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Lesa upplýsingar um lyf"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Persónuupplýsingar"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"persónuupplýsingar"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Lesa persónuupplýsingar"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Upplýsingar frá sérfræðingum"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"upplýsingar frá sérfræðingum"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Lesa upplýsingar frá sérfræðingum"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Upplýsingar um meðgöngu"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"upplýsingar um meðgöngu"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Lesa upplýsingar um meðgöngu"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Vandamál"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"vandamál"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Lesa vandamál"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Upplýsingar um meðferðir"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"upplýsingar um meðferðir"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Lesa upplýsingar um meðferðir"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Upplýsingar um lífstíl"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Upplýsingar um lífstíl"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"upplýsingar um lífstíl"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Lesa upplýsingar um lífstíl"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Lífsmörk"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Upplýsingar um heimsóknir"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"upplýsingar um heimsóknir"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Lesa upplýsingar um heimsóknir"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Lífsmörk"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"lífsmörk"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Lesa lífsmörk"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Núvitund"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Skrifa núvitund"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Leyfa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ að lesa"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Leyfa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ að skrifa"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Hætta við"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Leyfa"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Leyfa allt"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ekki leyfa"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Veldu hvaða gögn þú vilt að forritið lesi eða skrifi á Heilsutengingu"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Veldu gögnin sem þú vilt leyfa forritinu að lesa úr eða skrifa í Heilsutengingu"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Veldu gögnin sem þú vilt leyfa forritinu að lesa úr Heilsutengingu"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Veldu gögnin sem þú vilt leyfa forritinu að skrifa í Heilsutengingu"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ef þú leyfir lesaðgang getur forritið lesið ný gögn og gögn síðustu 30 daga"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ef þú leyfir lesaðgang getur þetta forrit lesið ný og eldri gögn"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Veita <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að Heilsutengingu?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Þú getur séð hvernig <xliff:g id="APP_NAME">%1$s</xliff:g> meðhöndlar gögnin þín í <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> þróunaraðilans"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Veita <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að gögnum um hreysti og vellíðan?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Þú getur kynnt þér hvernig <xliff:g id="APP_NAME">%1$s</xliff:g> meðhöndlar gögnin þín í <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"persónuverndarstefnu"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Veita <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að heilsufarsgögnum?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ef þú veitir forritinu aðgang getur það lesið og skrifað gögn á borð við upplýsingar um ofnæmi, rannsóknarniðurstöður, bólusetningar og fleira\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ef þú veitir forritinu aðgang getur það lesið gögn á borð við upplýsingar um ofnæmi, rannsóknarniðurstöður, bólusetningar og fleira\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Um heilsufarsgögn"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Gögnum sem verður deilt eru m.a."</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ef þú veitir <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang getur forritið deilt heilsufarsgögnunum þínum með Heilsutengingu."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Samstilltu heilsufarsgögnin þín úr mismunandi forritum og af mismunandi upprunum til að nálgast þau á einum stað"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Fjarlægja allar heimildir?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Fjarlægja allt"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað nein gögn frá Heilsutengingu.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað nein gögn frá Heilsutengingu, þ.m.t. eldri gögn.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir staðsetningu, myndavél eða hljóðnema."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað nein gögn frá Heilsutengingu, þ.m.t. bakgrunnsgögn og eldri gögn.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir staðsetningu, myndavél eða hljóðnema."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Eyða einnig gögnum frá <xliff:g id="APP_NAME">%1$s</xliff:g> úr Heilsutengingu"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Fjarlægja allar heimildir?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Fjarlægja allar heimildir fyrir heilsufarsgögn?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Fjarlægja allar heimildir fyrir hreysti og vellíðan?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Eyða einnig hreystigögnum í <xliff:g id="APP_NAME">%1$s</xliff:g> úr Heilsutengingu"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Fjarlægja allar heimildir fyrir heilsufarsgögn?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Eyða einnig heilsufarsgögnum í <xliff:g id="APP_NAME">%1$s</xliff:g> úr Heilsutengingu"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað þessi gögn frá Heilsutengingu.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað þessi gögn frá Heilsutengingu, þ.m.t. bakgrunnsgögn.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað þessi gögn frá Heilsutengingu, þ.m.t. eldri gögn.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað þessi gögn frá Heilsutengingu, þ.m.t. bakgrunnsgögn og eldri gögn.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Fjarlægja allar heimildir?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað gögn frá Heilsutengingu.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað gögn frá Heilsutengingu, þ.m.t. bakgrunnsgögn.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað gögn frá Heilsutengingu, þ.m.t. eldri gögn.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> mun ekki lengur geta lesið eða skrifað gögn frá Heilsutengingu, þ.m.t. bakgrunnsgögn og eldri gögn.\n\nÞetta hefur ekki áhrif á aðrar heimildir sem forritið kann að hafa, eins og fyrir myndavél, hljóðnema eða staðsetningu."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Eyða einnig hreysti- og heilsufarsgögnum í Heilsutengingu úr <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Heimildir forritsins voru fjarlægðar"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Eyða einnig öllum gögnum Heilsutengingar"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Næsti dagur"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Valinn dagur"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Fyrri dagur"</string>
     <string name="default_error" msgid="7966868260616403475">"Eitthvað fór úrskeiðis. Reyndu aftur."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Óþekkt gögn"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Upprunagögn"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Opinn hornklofi."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Lokaður hornklofi."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Reitur <xliff:g id="FIELD">%2$s</xliff:g> Gildi"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Þessi forrit hafa ekki lengur aðgang en gögn frá þeim eru enn vistuð í Heilsutengingu"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> getur lesið gögn sem bætt hefur verið við eftir <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Til að stjórna öðrum Android-heimildum sem þetta forrit hefur aðgang að skaltu fara í „Stillingar &gt; Forrit“"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Gögn sem þú deilir með <xliff:g id="APP_NAME">%1$s</xliff:g> falla undir persónuverndarstefnu viðkomandi forrits"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Kynntu þér hvernig <xliff:g id="APP_NAME">%1$s</xliff:g> meðhöndlar gögnin þín í persónuverndarstefnu þróunaraðilans"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Til að stjórna öðrum Android-heimildum sem þetta forrit hefur aðgang að skaltu fara í stillingar og ýta á „Forrit“"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Lesa persónuverndarstefnuna"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Opnað síðasta sólarhringinn"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Aðgangur forrita"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Engin samhæf forrit eru uppsett eins og stendur"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Aukinn aðgangur"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Eldri gögn, bakgrunnsgögn"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Viðbótarheimildir fjarlægðar fyrir þetta forrit"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Heimildir"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Hreysti og vellíðan"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Líkamsrækt, svefn, næring og fleira"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Upplýsingar um heilsufar"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"upplýsingar um heilsufar"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Rannsóknarniðurstöður, lyf, ónæming ofl."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Rannsóknarniðurstöður, lyf, bólusetningar og fleira"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Fjarlægðar heimildir forrits"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Heilsutenging fjarlægði heimildir fyrir <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Heilsutenging fjarlægði heimildir fyrir <xliff:g id="APP_DATA_0">%1$s</xliff:g> og <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Opna Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Byrjaðu að nota Heilsutengingu"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Heilsutenging varðveitir heilsu- og hreystigögnin þín og gefur þér kost á að samstilla ýmis forrit í tækinu þínu á einfaldan hátt"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Heilsutenging vistar og samstillir heilsu- og hreystigögnin þín úr mismunandi forritum.\n\n"<b>"Heilsu- og hreystigögn,"</b>" þ.m.t. æfingalotur, skref, næring, svefn og fleira\n\n"<b>"Heilsufarsgögn,"</b>" þ.m.t. bólusetningar, rannsóknarniðurstöður og fleira"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Með Heilsutengingu er hægt að"</string>
     <string name="share_data" msgid="3481932156368883946">"Deildu gögnum með forritum"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Veldu hvaða gögn hvert forrit getur lesið eða skrifað yfir í Heilsutengingu"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Stjórnaðu stillingum og persónuvernd"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Lítið flæði"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Miðlungsflæði"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Mikið flæði"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Magn blæðinga óþekkt"</string>
     <string name="period_day" msgid="3821944462093965882">"Dagur blæðinga <xliff:g id="DAY">%1$d</xliff:g> af <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Blæðingar (einn dagur)}one{Blæðingar (# dagur)}other{Blæðingar (# dagar)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Jákvætt"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Neikvætt"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Mikið"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Tónlist"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Annað"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Án leiðsagnar"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Í meðallagi"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Mikil"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> mín."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> klst. <xliff:g id="MIN">%2$s</xliff:g> mín."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> klst."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Samþætting í gangi"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Samþætting Heilsutengingar og Android-kerfisins er í gangi.\n\nÞað gæti tekið nokkurn tíma að flytja gögn og heimildir."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ekki loka forritinu fyrr en þú færð tilkynningu um að ferlinu sé lokið."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Samþætting Heilsutengingar er í gangi"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Uppfærslu krafist"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Verið er að samþætta Heilsutengingu og Android-kerfið svo þú getir opnað forritið beint úr stillingunum."</string>
     <string name="update_button" msgid="4544529019832009496">"Uppfæra"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Uppfærðu núna svo samþætting Heilsutengingar og kerfisstillinga geti haldið áfram"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Uppfæra núna"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Kerfisuppfærslu krafist"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Uppfærðu kerfi símans áður en þú heldur áfram."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ef þú hefur þegar uppfært kerfi símans skaltu prófa að endurræsa símann til að halda samþættingunni áfram"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Uppfærslu Heilsutengingar krafist"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Uppfærðu forrit Heilsutengingar í nýjustu útgáfuna áður en þú heldur áfram."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Aukins geymslurýmis krafist"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Heilsutenging þarf <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> geymslurými í símanum til að halda samþættingunni áfram.\n\nLosaðu um pláss í símanum og reyndu síðan aftur."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Reyna aftur"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Losa um pláss"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Aukins geymslurýmis krafist"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Heilsutenging þarf <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> geymslurými í símanum til að halda samþættingunni áfram."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Hlé var gert á samþættingu"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Forrit Heilsutengingar lokaðist meðan á samþættingu við Android-kerfið stóð.\n\nSmelltu á „Halda áfram“ til að opna forritið aftur og halda flutningi gagna og heimilda áfram."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Ljúktu þessu innan <xliff:g id="TIME_NEEDED">%1$s</xliff:g> til að halda Heilsutengingargögnunum þínum."</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Ýttu til að halda samþættingu Heilsutengingar og Android-kerfisins áfram. Ljúktu þessu innan <xliff:g id="TIME_NEEDED">%1$s</xliff:g> til að halda gögnunum þínum."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Ýttu til að halda samþættingu Heilsutengingar og Android-kerfisins áfram."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Halda áfram"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Halda samþættingu Heilsutengingar áfram"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Ljúktu þessu innan <xliff:g id="TIME_NEEDED">%1$s</xliff:g> til að halda gögnunum þínum."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Uppfærslu forrits krafist"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Þú þarft að uppfæra <xliff:g id="APP_NAME">%1$s</xliff:g> til að geta haldið áfram að samstilla við Heilsutengingu"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Þú þarft að uppfæra einhver forrit til að geta haldið áfram að samstilla við Heilsutengingu"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Þú þarft að uppfæra <xliff:g id="APP_NAME">%1$s</xliff:g> til að geta haldið áfram að samstilla við Heilsutengingu. Uppfærslur eru hugsanlega ekki í boði fyrir öll forrit."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Þú þarft að uppfæra einhver forrit til að geta haldið áfram að samstilla við Heilsutengingu. Uppfærslur eru hugsanlega ekki í boði fyrir öll forrit."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Leita að uppfærslum"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Nánar"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Samþætting Heilsutengingar"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Samþætting Heilsutengingar tókst ekki"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Þú færð tilkynningu þegar þetta verður aftur í boði."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Ég skil"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Samþætting Heilsutengingar tókst ekki"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Lesa meira"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Samþættingu Heilsutengingar er lokið"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Opna"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Nýjungar"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Nú geturðu opnað Heilsutengingu beint úr stillingunum. Þú getur fjarlægt forrit Heilsutengingar hvenær sem er til að losa geymslurými."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Ég skil"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Bæta við eða fjarlægja forrit sem veita upplýsingar"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Sjálfgefin stilling tækis"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Forritsgögn"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Gögn frá forritum með aðgang að Heilsutengingu birtast hér"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Gögn úr <xliff:g id="APP_NAME">%1$s</xliff:g> birtast hér"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Gögn úr forritum með aðgang að Heilsutengingu birtast hér"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dagur"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Vika"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mánuður"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Síðasti mánuður"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Skráningar"</string>
     <string name="tab_access" msgid="7818197975407243701">"Aðgangur"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Gefa <xliff:g id="APP_NAME">%1$s</xliff:g> viðbótaraðgang?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> vill einnig aðgang að þessum stillingum í Heilsutengingu"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Leyfðu að minnsta kosti eina lestrarheimild til þess að kveikja á bakgrunnsaðgangi eða aðgangi að eldri gögnum fyrir þetta forrit"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Leyfðu að minnsta kosti eina lestrarheimild til þess að kveikja á bakgrunnsaðgangi fyrir þetta forrit"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Leyfðu að minnsta kosti eina lestrarheimild til þess að kveikja á aðgangi að eldri gögnum fyrir þetta forrit"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Byrja að nota Heilsutengingu"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Samstilltu fyrstu forritin þín til að deila heilsu- og hreystigögnum á milli þeirra"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Setja upp"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Sjá samhæf forrit"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Finna fleiri forrit til að samstilla með <xliff:g id="APP_NAME">%s</xliff:g> í gegnum Heilsutengingu"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Sjá í forritaverslun"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Stilltu skjálás"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Stilltu PIN-númer, mynstur eða aðgangsorð í tækinu til að auka öryggi heilsugagnanna þinna"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Stilla skjálás"</string>
     <string name="select_all" msgid="837499881590001166">"Velja allt"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Tengd forrit munu ekki lengur geta opnað þessi gögn Heilsutengingar"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Valið"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Ekki valið"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Kort af æfingaleið tiltækt"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Næsti dagur"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Næsta vika"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Næsti mánuður"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Fyrri dagur"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Fyrri vika"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Fyrri mánuður"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Eyða öllum gögnum fyrir fullt og allt?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Eyða völdum gögnum fyrir fullt og allt?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Eyða öllum <xliff:g id="APP_NAME">%s</xliff:g>-gögnum fyrir fullt og allt?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Eyða völdum <xliff:g id="APP_NAME">%1$s</xliff:g>-færslum frá vikunni <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> fyrir fullt og allt?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Eyða völdum <xliff:g id="APP_NAME">%1$s</xliff:g>-færslum frá <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> fyrir fullt og allt?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Eyða þessari <xliff:g id="APP_NAME">%s</xliff:g>-færslu fyrir fullt og allt?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Loka fyrir aðgang <xliff:g id="APP_NAME">%2$s</xliff:g> að <xliff:g id="DATA_TYPE">%1$s</xliff:g>-gögnum varanlega?"</string>
+    <string name="on" msgid="8266542510798355807">"Kveikt"</string>
+    <string name="off" msgid="6996623844428550649">"Slökkt"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Opnað kl. <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Opnað í gær kl. <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Opnað <xliff:g id="TIME_DATE_0">%1$s</xliff:g> kl. <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Leyfa alltaf"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Leyfa valið"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Meðan verið er að nota forritið"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Hafna öllu"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Veita <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að gögnum um hreysti og vellíðan?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um aðgang að <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nVeldu að leyfa allt eða stjórnaðu þeim hverju fyrir sig."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Viltu veita <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Hreysti og vellíðan"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"hvenær sem er"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"á meðan forritið er í notkun"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Hvenær sem er"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Á meðan forritið er í notkun"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> getur skoðað öll heilsu- og hreystigögnin þín <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Með aðgang"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Má lesa"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Þessar heimildir veita <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að gögnum frá skynjurum tækisins."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> af <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> forritum eru með aðgang"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ekkert forrit biður um heimild"</string>
+    <string name="allowed" msgid="4158456017482263737">"Heimild veitt"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Heimild ekki veitt"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Forrit með þessa heimild hafa aðgang að gögnum um <xliff:g id="DATA_TYPE">%s</xliff:g> frá skynjurum tækisins."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Fjarlægja aðgang allra forrita í úrinu að gögnum um <xliff:g id="DATA_TYPE">%s</xliff:g>?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Gátmerki"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Kross"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Eins og er getur <xliff:g id="APP_NAME">%1$s</xliff:g> skoðað öll gögn þín um hreysti og vellíðan <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Viltu veita <xliff:g id="APP_NAME">%1$s</xliff:g> óheftan aðgang að gögnum um hreysti og vellíðan?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> hefur aðgang að <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Stjórna heimildum fyrir hreysti og vellíðan"</string>
 </resources>
diff --git a/apk/res/values-it/strings.xml b/apk/res/values-it/strings.xml
index 23d22c3..5b4fd5f 100644
--- a/apk/res/values-it/strings.xml
+++ b/apk/res/values-it/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Gestisci i dati relativi alla salute e all\'attività fisica sul dispositivo e stabilisci a quali app concedere l\'accesso"</string>
     <string name="data_title" msgid="4456619761533380816">"Dati e accesso"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Sfoglia i riepiloghi salute"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Visualizza i tuoi riepiloghi salute e quali app possono accedervi"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Tutte le categorie"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Vedi tutte le categorie"</string>
     <string name="no_data" msgid="1906986019249068659">"Nessun dato"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Ieri"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Accesso in lettura: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Accesso in scrittura: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Gestisci autorizzazioni"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Ora: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Attività"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"accesso ai dati relativi alla salute"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Lettura delle calorie bruciate"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Consente all\'app di leggere le calorie bruciate"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Accedi ai dati in background"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere ai dati in background?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere ai dati in background?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Se lo consenti, questa app può accedere ai dati relativi a benessere e attività fisica, nonché ai riepiloghi salute quando non la utilizzi."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Se lo consenti, questa app può accedere ai riepiloghi salute quando non la utilizzi."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Se lo consenti, questa app può accedere ai dati relativi a benessere e attività fisica quando non la utilizzi."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Se lo consenti, questa app può accedere ai dati di Connessione Salute quando non la utilizzi."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere ai dati precedenti?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Se lo consenti, questa app può accedere ai dati relativi a benessere e attività fisica aggiunti prima del giorno <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Se lo consenti, questa app può accedere a tutti i dati precedenti relativi a benessere e attività fisica."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Se lo consenti, questa app può accedere ai dati di Connessione Salute aggiunti prima del giorno <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Se lo consenti, questa app può accedere a tutti i dati precedenti di Connessione Salute."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Consentire l\'accesso aggiuntivo per l\'app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> vuole accedere anche a queste impostazioni di Connessione Salute"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Accesso a tutti i dati in background"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Accesso ai riepiloghi salute in background"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Accesso ai dati relativi a benessere e attività fisica in background"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Consenti a questa app di accedere ai dati relativi a benessere e attività fisica, nonché ai riepiloghi salute quando non la utilizzi"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Consenti a questa app di accedere a questi dati quando non la utilizzi"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Consenti a questa app di accedere a questi dati quando non la utilizzi"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Accesso ai dati in background"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Consenti a questa app di accedere ai dati di Connessione Salute quando non la utilizzi"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Accesso ai dati precedenti relativi a benessere e attività fisica"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Consenti a questa app di accedere ai dati aggiunti prima del giorno <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Consenti a questa app di accedere a tutti i dati precedenti"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Accesso ai dati precedenti"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Consenti a questa app di accedere ai dati di Connessione Salute aggiunti prima del giorno <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Consenti a questa app di accedere a tutti i dati precedenti di Connessione Salute"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> può già accedere ai dati precedenti per i tuoi riepiloghi salute"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Scopri di più sulle autorizzazioni"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Accesso a tutti i dati in background"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Accesso ai riepiloghi salute in background"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Accesso ai dati relativi a benessere e attività fisica in background"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Consenti a questa app di accedere ai dati relativi a benessere e attività fisica, nonché ai riepiloghi salute quando non la utilizzi"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Consenti a questa app di accedere a questi dati quando non la utilizzi"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Consenti a questa app di accedere a questi dati quando non la utilizzi"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Accesso ai dati in background"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Consenti a questa app di accedere ai dati di Connessione Salute quando non la utilizzi"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Accesso ai dati precedenti relativi a benessere e attività fisica"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Consenti a questa app di accedere ai dati aggiunti prima del giorno <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Consenti a questa app di accedere a tutti i dati precedenti"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Accesso ai dati precedenti"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Consenti a questa app di accedere ai dati di Connessione Salute aggiunti prima del giorno <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Consenti a questa app di accedere a tutti i dati precedenti di Connessione Salute"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Al momento non vengono letti dati relativi all\'attività fisica perché <xliff:g id="APP_NAME">%1$s</xliff:g> non dispone dei permessi di lettura"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> può già accedere ai dati passati per i tuoi riepiloghi salute. Per modificare questa impostazione, disattiva le autorizzazioni per i riepiloghi salute per questa app."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Gestisci autorizzazioni riepilogo salute"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Abilita almeno un permesso di lettura per attivare l\'accesso in background o ai dati precedenti per questa app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Abilita almeno un permesso di lettura per attivare l\'accesso in background per questa app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Abilita almeno un permesso di lettura per attivare l\'accesso ai dati precedenti per questa app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Consenti a questa app di accedere a tutti i dati precedenti di Connessione Salute"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Consenti a questa app di accedere ai dati di Connessione Salute quando non la utilizzi"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Se lo consenti, questa app può accedere ai dati di Connessione Salute quando non la utilizzi."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Accedi ai dati precedenti"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere ai dati precedenti?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Consenti a questa app di accedere ai dati di Connessione Salute aggiunti prima del giorno <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Consenti a questa app di accedere a tutti i dati precedenti di Connessione Salute"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Se lo consenti, questa app può accedere ai dati di Connessione Salute aggiunti prima del giorno <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Se lo consenti, questa app può accedere a tutti i dati precedenti di Connessione Salute."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calorie bruciate durante l\'attività fisica"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"calorie bruciate durante l\'attività fisica"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Lettura delle calorie bruciate durante l\'attività fisica"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"spinte in sedia a rotelle"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Lettura delle spinte in sedia a rotelle"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Scrittura delle spinte in sedia a rotelle"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensità dell\'attività"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensità dell\'attività"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Lettura di intensità dell\'attività"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Scrittura di intensità dell\'attività"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Tasso metabolico basale"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"tasso metabolico basale"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Lettura del tasso metabolico basale"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura cutanea"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Leggere la temperatura cutanea"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Scrivere la temperatura cutanea"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Sono inclusi tutti i riepiloghi salute sincronizzati e aggiunti a Connessione Salute. Questa potrebbe non essere la tua cartella clinica completa e non include una descrizione medica dei tuoi riepiloghi salute."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Tutti i riepiloghi salute"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"tutti i riepiloghi salute"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Scrittura di tutti i riepiloghi salute"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergie"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergie"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lettura di allergie"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunizzazione"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunizzazione"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Leggi immunizzazione"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Risultati di laboratorio"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"risultati di laboratorio"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Leggi i risultati di laboratorio"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergie"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergie"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Lettura di allergie"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Condizioni"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"condizioni"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Leggi le condizioni"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccini"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccini"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Lettura di vaccini"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Risultati di laboratorio"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"risultati di laboratorio"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Lettura di risultati di laboratorio"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Farmaci"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"farmaci"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Lettura farmaci"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Dettagli personali"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"dettagli personali"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Lettura di dettagli personali"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Dettagli del medico"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"dettagli del medico"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Lettura dei dettagli del medico"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Gravidanza"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"gravidanza"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Lettura gravidanza"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemi"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemi"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Lettura problemi"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedure"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedure"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Lettura procedure"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Cronologia social"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Cronologia social"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"cronologia social"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Lettura cronologia social"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Parametri vitali"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visite"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visite"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Lettura delle visite"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Parametri vitali"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"parametri vitali"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Lettura parametri vitali"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Scrittura dati di mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Consenti lettura all\'app \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Consenti scrittura all\'app \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Annulla"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Consenti"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Consenti tutte"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Non consentire"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Scegli i dati da far leggere o scrivere a questa app in Connessione Salute"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Scegli i dati da far leggere o scrivere a questa app in Connessione Salute"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Scegli i dati da far leggere a questa app in Connessione Salute"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Scegli i dati da far scrivere a questa app in Connessione Salute"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Se concedi l\'accesso in lettura, l\'app può leggere i nuovi dati e quelli degli ultimi 30 giorni"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Se concedi l\'accesso in lettura, l\'app può leggere i dati nuovi e precedenti"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Vuoi consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere a Connessione Salute?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Per sapere come vengono trattati i tuoi dati nell\'app <xliff:g id="APP_NAME">%1$s</xliff:g>, consulta le <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> dello sviluppatore"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere ai dati relativi a benessere e attività fisica?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Per sapere in che modo l\'app <xliff:g id="APP_NAME">%1$s</xliff:g> tratta i tuoi dati, consulta le sue <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"norme sulla privacy"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Vuoi consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere ai tuoi riepiloghi salute?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Se concedi l\'accesso, l\'app può leggere e scrivere dati quali allergie, risultati di laboratorio, vaccini e altro\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Se concedi l\'accesso, l\'app può leggere dati quali allergie, risultati di laboratorio, vaccini e altro\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Informazioni sui riepiloghi salute"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"I dati da condividere includono"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Se lo consenti, <xliff:g id="APP_NAME">%1$s</xliff:g> può condividere i tuoi riepiloghi salute con Connessione Salute."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sincronizza i tuoi riepiloghi salute da diverse app e fonti per conservarli in un unico posto"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Rimuovere tutte le autorizzazioni?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Rimuovi tutto"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere dati da Connessione Salute.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere dati da Connessione Salute, inclusi i dati precedenti.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come posizione, fotocamera o microfono."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere dati da Connessione Salute, inclusi i dati in background e i dati precedenti.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come posizione, fotocamera o microfono."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Elimina anche i dati di <xliff:g id="APP_NAME">%1$s</xliff:g> da Connessione Salute"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Rimuovere tutte le autorizzazioni?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Rimuovere tutte le autorizzazioni per i riepiloghi salute?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Rimuovere tutte le autorizzazioni per fitness e benessere?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Elimina anche i dati relativi all\'attività fisica di <xliff:g id="APP_NAME">%1$s</xliff:g> da Connessione Salute"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Rimuovere tutte le autorizzazioni per i riepiloghi salute?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Elimina anche i riepiloghi salute di <xliff:g id="APP_NAME">%1$s</xliff:g> da Connessione Salute"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere questi dati da Connessione Salute.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere questi dati da Connessione Salute, inclusi i dati in background.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere questi dati da Connessione Salute, inclusi i dati precedenti.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere questi dati da Connessione Salute, inclusi i dati in background e precedenti.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Rimuovere tutte le autorizzazioni?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere dati da Connessione Salute.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere dati da Connessione Salute, inclusi i dati in background.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere dati da Connessione Salute, inclusi i dati precedenti.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> non potrà più leggere o scrivere dati da Connessione Salute, inclusi i dati in background e precedenti.\n\nL\'operazione non inciderà su eventuali altre autorizzazioni dell\'app, come fotocamera, microfono o posizione."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Elimina anche i dati relativi all\'attività fisica e i riepiloghi salute di <xliff:g id="APP_NAME">%1$s</xliff:g> da Connessione Salute"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Autorizzazioni rimosse per questa app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Elimina anche tutti i dati di Connessione Salute"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Giorno successivo"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Giorno selezionato"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Giorno precedente"</string>
     <string name="default_error" msgid="7966868260616403475">"Si è verificato un errore. Riprova."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Risorsa sconosciuta"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Dati di origine"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Parentesi graffa aperta."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Parentesi graffa chiusa."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Campo <xliff:g id="FIELD">%2$s</xliff:g> Valore"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Queste app non possono più accedere, ma hanno dati archiviati in Connessione Salute"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> può leggere i dati aggiunti dopo il giorno <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Per gestire altre autorizzazioni Android a cui questa app può accedere, vai a Impostazioni &gt; App"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"I dati che condividi con <xliff:g id="APP_NAME">%1$s</xliff:g> sono regolati dalle norme sulla privacy dell\'app"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Puoi scoprire come <xliff:g id="APP_NAME">%1$s</xliff:g> gestisce i tuoi dati nelle norme sulla privacy dello sviluppatore"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Per gestire altre autorizzazioni Android a cui questa app può accedere, vai alle Impostazioni, quindi tocca App"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Leggi le norme sulla privacy"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Ultimo accesso: nelle ultime 24 ore"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Accesso dell\'app"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Al momento non hai app compatibili installate"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Accesso aggiuntivo"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Dati precedenti, dati in background"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Autorizzazioni aggiuntive rimosse per questa app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Autorizzazioni"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness e benessere"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Allenamento, sonno, nutrizione e altro"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Riepiloghi salute"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"riepiloghi salute"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Risult. labor., farmaci, vaccini e altro"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Risultati lab, farmaci, vaccini e altro"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Autorizzazioni app rimosse"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Connessione Salute ha rimosso le autorizzazioni per <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Connessione Salute ha rimosso le autorizzazioni per <xliff:g id="APP_DATA_0">%1$s</xliff:g> e <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Vai al Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Inizia a usare Connessione Salute"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Connessione Salute archivia i dati relativi alla salute e all\'attività fisica e ti consente di sincronizzare facilmente le varie app installate sul dispositivo"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Connessione Salute archivia e sincronizza i dati relativi alla salute e all\'attività fisica di diverse app.\n\n"<b>"Dati su fitness e benessere,"</b>" tra cui sessioni di allenamento, passi, alimentazione, sonno e altro ancora\n\n"<b>"Riepiloghi salute,"</b>" tra cui vaccini, risultati di laboratorio e altro ancora"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Con Connessione Salute"</string>
     <string name="share_data" msgid="3481932156368883946">"Condividi i dati con le tue app"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Scegli i dati che ciascuna app può leggere o scrivere su Connessione Salute"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Gestisci le impostazioni e la privacy"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Flusso leggero"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Flusso medio"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Flusso abbondante"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Flusso sconosciuto"</string>
     <string name="period_day" msgid="3821944462093965882">"Giorno del periodo mestruale <xliff:g id="DAY">%1$d</xliff:g> di <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Mestruazioni (1 giorno)}other{Mestruazioni (# giorni)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positivo"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativo"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Alta"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musica"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Altro"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Non guidata"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderata"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intensa"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h e <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrazione in corso"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"È in corso l\'integrazione di Connessione Salute nel sistema Android.\n\nIl trasferimento di dati e autorizzazioni potrebbe richiedere del tempo."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Non chiudere l\'app finché non riceverai una notifica che ti informa che il processo è stato completato."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integrazione di Connessione Salute in corso"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Aggiornamento necessario"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"È in corso l\'integrazione di Connessione Salute nel sistema Android, così potrai accedere all\'app direttamente dalle tue impostazioni."</string>
     <string name="update_button" msgid="4544529019832009496">"Aggiorna"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Avvia questo aggiornamento, in modo che l\'integrazione nelle tue impostazioni di sistema di Connessione Salute possa continuare"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Aggiorna ora"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Aggiornamento di sistema richiesto"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Prima di continuare, aggiorna il sistema del tuo telefono."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Se hai già aggiornato il sistema del tuo telefono, prova a riavviare il dispositivo per continuare con l\'integrazione"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Aggiornamento Connessione Salute richiesto"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Prima di continuare, aggiorna l\'app Connessione Salute all\'ultima versione."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"È necessario più spazio"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Connessione Salute richiede <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> di spazio di archiviazione sul telefono per continuare con l\'integrazione.\n\nLibera un po\' di spazio sul telefono e riprova."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Riprova"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Libera spazio"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"È necessario più spazio"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Connessione Salute richiede <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> di spazio di archiviazione sul telefono per continuare con l\'integrazione."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrazione in pausa"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"L\'app Connessione Salute è stata chiusa durante l\'integrazione nel sistema Android.\n\nFai clic su Riprendi per riaprire l\'app e continuare a trasferire dati e autorizzazioni."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Per mantenere i tuoi dati di Connessione Salute, completa l\'operazione entro <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tocca per continuare con l\'integrazione di Connessione Salute nel sistema Android. Per mantenere i tuoi dati, completa l\'operazione entro <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tocca per continuare con l\'integrazione di Connessione Salute nel sistema Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continua"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Riprendi l\'integrazione di Connessione Salute"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Per mantenere i tuoi dati, completa l\'operazione entro <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Aggiornamento app necessario"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> deve essere aggiornata per continuare a sincronizzarsi con Connessione Salute"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Alcune app devono essere aggiornate per continuare a sincronizzarsi con Connessione Salute"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> deve essere aggiornata per continuare a sincronizzarsi con Connessione Salute. Gli aggiornamenti potrebbero non essere disponibili per tutte le app."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Alcune app devono essere aggiornate per continuare a sincronizzarsi con Connessione Salute. Gli aggiornamenti potrebbero non essere disponibili per tutte le app."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Verifica disponibilità di aggiornamenti"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Scopri di più"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integrazione di Connessione Salute"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integrazione di Connessione Salute non completata"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Riceverai una notifica quando sarà di nuovo disponibile."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integrazione di Connessione Salute non completata"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Scopri di più"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integrazione di Connessione Salute completata"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Apri"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novità"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Ora puoi accedere a Connessione Salute direttamente dalle tue impostazioni. Disinstalla l\'app Connessione Salute in qualsiasi momento per liberare spazio di archiviazione."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Modifica origini di app"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Opzione predefinita"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Dati dell\'app"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"I dati delle app con accesso a Connessione Salute appariranno qui"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"I dati di <xliff:g id="APP_NAME">%1$s</xliff:g> verranno mostrati qui"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"I dati delle app con accesso a Connessione Salute verranno mostrati qui"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Giorno"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Settimana"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mese"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Mese scorso"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Voci"</string>
     <string name="tab_access" msgid="7818197975407243701">"Accesso"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Consentire l\'accesso aggiuntivo per l\'app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> vuole accedere anche a queste impostazioni di Connessione Salute"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Abilita almeno un permesso di lettura per attivare l\'accesso in background o ai dati precedenti per questa app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Abilita almeno un permesso di lettura per attivare l\'accesso in background per questa app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Abilita almeno un permesso di lettura per attivare l\'accesso ai dati precedenti per questa app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Inizia a usare Connessione Salute"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sincronizza le tue prime app per condividere dati relativi all\'attività fisica e alla salute tra di loro"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configura"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Vedi le app compatibili"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Trova altre app da sincronizzare con <xliff:g id="APP_NAME">%s</xliff:g> tramite Connessione Salute"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Vedi nello store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Imposta un blocco schermo"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Per una maggiore sicurezza dei tuoi dati sanitari, imposta un PIN, una sequenza o una password per questo dispositivo"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Imposta il blocco schermo"</string>
     <string name="select_all" msgid="837499881590001166">"Seleziona tutto"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Le app collegate non potranno più leggere questi dati di Connessione Salute"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Elemento selezionato"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Elemento non selezionato"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Mappa percorso per allenamento disponibile"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Giorno successivo"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Settimana successiva"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mese successivo"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Giorno precedente"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Settimana precedente"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mese precedente"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Eliminare definitivamente tutti i dati?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Eliminare definitivamente i dati selezionati?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Eliminare definitivamente tutti i dati relativi all\'app <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Eliminare definitivamente le voci selezionate dell\'app <xliff:g id="APP_NAME">%1$s</xliff:g> per la settimana (<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>)?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Eliminare definitivamente le voci selezionate dell\'app <xliff:g id="APP_NAME">%1$s</xliff:g> per il giorno <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Eliminare definitivamente questa voce dell\'app <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Eliminare definitivamente i dati di <xliff:g id="DATA_TYPE">%1$s</xliff:g> per <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"On"</string>
+    <string name="off" msgid="6996623844428550649">"Off"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Ultimo accesso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Ultimo accesso ieri: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Ultimo accesso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Consenti sempre"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Consenti selezionate"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Mentre usi l\'app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Nega tutto"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere ai dati relativi a benessere e attività fisica?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede l\'accesso a <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nScegli se consentire l\'accesso a tutti i tipi di dati o controllarli singolarmente."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere a <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness e benessere"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sempre"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"durante l\'uso"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sempre"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Durante l\'uso"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> può accedere a tutti i tuoi dati relativi a benessere e attività fisica <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Autorizzazioni di accesso"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Autorizzazioni di lettura"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Queste autorizzazioni consentono a <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere ai dati dei sensori del tuo dispositivo."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"App autorizzate: <xliff:g id="NUMBER_0">%1$d</xliff:g> su <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nessuna app richiede l\'autorizzazione"</string>
+    <string name="allowed" msgid="4158456017482263737">"Autorizzata"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Non autorizzata"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Le app con questa autorizzazione possono accedere ai dati <xliff:g id="DATA_TYPE">%s</xliff:g> dei sensori del tuo dispositivo."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Rimuovere l\'accesso a <xliff:g id="DATA_TYPE">%s</xliff:g> per tutte le app sull\'orologio?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Segno di spunta"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Croce"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Al momento, <xliff:g id="APP_NAME">%1$s</xliff:g> può accedere ai dati relativi a benessere e attività fisica <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Consentire all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> di accedere sempre ai dati relativi a benessere e attività fisica?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ha accesso a: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Gestisci le autorizzazioni per fitness e benessere"</string>
 </resources>
diff --git a/apk/res/values-iw/strings.xml b/apk/res/values-iw/strings.xml
index 63994fb..7250f2d 100644
--- a/apk/res/values-iw/strings.xml
+++ b/apk/res/values-iw/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ניהול נתוני הבריאות והכושר במכשיר, ובחירה האפליקציות שיכולות לגשת לנתונים"</string>
     <string name="data_title" msgid="4456619761533380816">"נתונים וגישה"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"עיון בסיכום המצב הבריאותי"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"צפייה בסיכומים של המצב הבריאותי שלך והצגת האפליקציות שיכולות לגשת אליהם"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"כל הקטגוריות"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"הצגת כל הקטגוריות"</string>
     <string name="no_data" msgid="1906986019249068659">"אין נתונים"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"אתמול"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"קריאה: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"כתיבה: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"ניהול הרשאות"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"זמן: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"פעילות"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"גישה לנתוני הבריאות שלך"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"קריאה של נתוני הקלוריות שנשרפו"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"מאפשרת לאפליקציה לקרוא את נתוני הקלוריות שנשרפו"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"גישה לנתונים ברקע"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאת גישה לנתונים ברקע?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאת גישה לנתונים ברקע?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"אם בוחרים לתת הרשאה, האפליקציה הזו תוכל לגשת לנתוני הכושר והבריאות ולסיכומי המצב הבריאותי גם כשהיא לא בשימוש."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"אם בוחרים לתת הרשאה, האפליקציה הזו תוכל לגשת לסיכומי המצב הבריאותי גם כשהיא לא בשימוש."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"אם בוחרים לתת הרשאה, האפליקציה הזו תוכל לגשת לנתוני הכושר והבריאות גם כשהיא לא בשימוש."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"אם בוחרים לתת הרשאה, האפליקציה הזו תוכל לגשת לנתונים של Health Connect גם כשהיא לא בשימוש."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאה לגשת לנתונים קודמים?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"אם בוחרים לתת הרשאה, האפליקציה הזו תוכל לגשת לנתוני הכושר והבריאות שנוספו לפני <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"אם בוחרים לתת הרשאה, האפליקציה הזו תוכל לגשת לכל הנתונים הקודמים של הכושר והבריאות."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"אם בוחרים לתת הרשאה, האפליקציה תוכל לגשת לנתונים של Health Connect שנוספו לפני <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"אם בוחרים לתת הרשאה, האפליקציה תוכל לגשת לכל הנתונים הקודמים של Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאת גישה נוספת?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת גם גישה להגדרות הבאות של Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"גישה לכל הנתונים ברקע"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"גישה לסיכומי המצב הבריאותי ברקע"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"גישה לנתוני הכושר והבריאות ברקע"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"האפליקציה הזו יכולה לגשת לנתוני הכושר והבריאות ולסיכומי המצב הבריאותי גם כשהיא לא בשימוש"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"האפליקציה הזו יכולה לגשת לנתונים האלה גם כשהיא לא בשימוש"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"האפליקציה הזו יכולה לגשת לנתונים האלה גם כשהיא לא בשימוש"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"גישה לנתונים ברקע"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"האפליקציה הזו יכולה לגשת לנתונים של Health Connect גם כשהיא לא בשימוש"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"גישה לנתוני הכושר והבריאות הקודמים"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"האפליקציה הזו יכולה לגשת לנתונים שנוספו לפני <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"האפליקציה הזו יכולה לגשת לכל הנתונים הקודמים"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"גישה לנתונים קודמים"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"האפליקציה הזו יכולה לגשת לנתונים של Health Connect שנוספו לפני <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"האפליקציה הזו יכולה לגשת לכל הנתונים הקודמים של Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> כבר יש גישה לנתונים קודמים של סיכומי המצב הבריאותי שלך"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"מידע נוסף על הרשאות"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"גישה לכל הנתונים ברקע"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"גישה לסיכומי המצב הבריאותי ברקע"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"גישה לנתוני הכושר והבריאות ברקע"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"האפליקציה הזו יכולה לגשת לנתוני הכושר והבריאות ולסיכומי המצב הבריאותי גם כשהיא לא בשימוש"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"האפליקציה הזו יכולה לגשת לנתונים האלה גם כשהיא לא בשימוש"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"האפליקציה הזו יכולה לגשת לנתונים האלה גם כשהיא לא בשימוש"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"גישה לנתונים ברקע"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"האפליקציה הזו יכולה לגשת לנתונים של Health Connect גם כשהיא לא בשימוש"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"גישה לנתוני הכושר והבריאות הקודמים"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"האפליקציה הזו יכולה לגשת לנתונים שנוספו לפני <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"האפליקציה הזו יכולה לגשת לכל הנתונים הקודמים"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"גישה לנתונים קודמים"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"האפליקציה הזו יכולה לגשת לנתונים של Health Connect שנוספו לפני <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"האפליקציה הזו יכולה לגשת לכל הנתונים הקודמים של Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא קוראת בשלב זה נתונים של אימוני כושר כי הרשאת הקריאה לא מופעלת"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> כבר יש גישה לנתונים קודמים של סיכום המצב הבריאותי שלך. כדי לשנות את ההגדרה, צריך להשבית את ההרשאות לסיכום המצב הבריאותי מהאפליקציה הזו"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"שינוי ההרשאות של סיכום המצב הבריאותי"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"צריך לתת הרשאת קריאה אחת לפחות כדי לאפשר לאפליקציה הזו גישה לנתונים קודמים או גישה ברקע"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"צריך לתת הרשאת קריאה אחת לפחות כדי לאפשר לאפליקציה הזו גישה ברקע"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"צריך לתת הרשאת קריאה אחת לפחות כדי לאפשר לאפליקציה הזו גישה לנתונים קודמים"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"האפליקציה הזו יכולה לגשת לכל הנתונים הקודמים של Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"האפליקציה הזו יכולה לגשת לנתונים של Health Connect גם כשהיא לא בשימוש"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"אם תינתן הרשאה, האפליקציה הזו תוכל לגשת לנתונים של Health Connect גם כשהיא לא בשימוש."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"גישה לנתונים קודמים"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאה לגשת לנתונים קודמים?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"מתן הרשאה לאפליקציה הזו לגשת לנתונים של Health Connect שנוספו לפני <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"מתן הרשאה לאפליקציה הזו לגשת לכל הנתונים הקודמים של Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"אם תינתן הרשאה, האפליקציה הזו תוכל לגשת לנתונים של Health Connect שנוספו לפני <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"אם תינתן הרשאה, האפליקציה הזו תוכל לגשת לכל הנתונים הקודמים של Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"קלוריות שנשרפו בזמן פעילות"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"קלוריות שנשרפו בזמן פעילות"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"קריאה של נתוני הקלוריות שנשרפו בזמן פעילות"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"דחיפות כיסא גלגלים"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"קריאה של נתוני דחיפות כיסא גלגלים"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"כתיבה של נתוני דחיפות כיסא גלגלים"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"עצימות הפעילות"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"עצימות הפעילות"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"קריאה של נתוני עצימות הפעילות"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"כתיבה של נתוני עצימות הפעילות"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"קצב חילוף החומרים הבסיסי"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"קצב חילוף החומרים הבסיסי"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"קריאה של נתוני קצב חילוף החומרים הבסיסי"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"טמפרטורת העור"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"קריאה של טמפרטורת העור"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"כתיבה של טמפרטורת העור"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"זה כולל את כל הסיכומים על המצב הבריאותי שסונכרנו עם Health Connect ונוספו לאפליקציה הזו. המידע לא כולל את התיק הרפואי המלא שלך, וגם לא תיאורים רפואיים מסיכום המצב הבריאותי שלך."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"כל הסיכומים על המצב הבריאותי"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"כל הסיכומים על המצב הבריאותי"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"אישור לכתיבה של כל הסיכומים על המצב הבריאותי"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"אלרגיות"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"אלרגיות"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"קריאת הנתונים על אלרגיות"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"חיסונים"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"חיסונים"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"הרשאה לקרוא את נתוני החיסונים"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"תוצאות בדיקות מעבדה"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"תוצאות בדיקות מעבדה"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"קריאה של תוצאות בדיקות מעבדה"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"אלרגיות"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"אלרגיות"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"קריאת הנתונים על אלרגיות"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"תנאים"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"תנאים"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"קריאת התנאים"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"חיסונים"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"חיסונים"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"קריאה של נתוני החיסונים"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"תוצאות בדיקות מעבדה"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"תוצאות בדיקות מעבדה"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"קריאה של תוצאות בדיקות מעבדה"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"תרופות"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"תרופות"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"קריאה של נתוני התרופות"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"פרטים אישיים"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"פרטים אישיים"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"לקרוא פרטים אישיים"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"פרטי המטפל"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"פרטי המטפל"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"לקרוא את פרטי המטפל"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"היריון"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"היריון"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"קריאה של נתוני ההיריון"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"מצב רפואי"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"מצב רפואי"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"קריאה של המצב הרפואי"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"הליכים רפואיים"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"הליכים רפואיים"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"קריאה של נתוני ההליכים הרפואיים"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"רקע אישי"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"רקע אישי"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"רקע אישי"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"קריאה של הרקע האישי"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"סימנים חיוניים"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ביקורים אצל מומחה רפואי"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ביקורים אצל מומחה רפואי"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"לקרוא את פרטי הביקורים אצל מומחה רפואי"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"סימנים חיוניים"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"סימנים חיוניים"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"קריאה של הסימנים החיוניים"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"מיינדפולנס"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"כתיבה של נתוני מיינדפולנס"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"מתן הרשאה לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לקרוא נתונים"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"מתן הרשאה לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לכתוב נתונים"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"ביטול"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"אישור"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"אישור של הכול"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"אין אישור"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"כאן ניתן לבחור אילו נתונים האפליקציה הזו תקרא או תכתוב ב-Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"כאן ניתן לבחור אילו נתונים האפליקציה הזו תקרא או תכתוב ב-Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"כאן ניתן לבחור אילו נתונים האפליקציה הזו תקרא מ-Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"כאן ניתן לבחור אילו נתונים האפליקציה הזו תכתוב ב-Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"ההרשאה מאפשרת לאפליקציה לקרוא נתונים חדשים ונתונים קודמים מ-30 הימים האחרונים"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"אם תינתן הרשאת קריאה, האפליקציה תוכל לקרוא נתונים חדשים ונתונים קודמים"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"האם לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> גישה אל Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"אפשר לקרוא איך אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> מטפלת בנתונים שלך ב<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> של המפתח"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאת גישה לנתוני כושר ובריאות?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"אפשר לקרוא איך אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> מטפלת בנתונים שלך ב<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> של האפליקציה"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"מדיניות הפרטיות"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> גישה לסיכומים על המצב הבריאותי?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"אם הגישה תאושר, האפליקציה תוכל לקרוא ולכתוב נתונים כמו אלרגיות, תוצאות של בדיקות מעבדה, חיסונים ועוד\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"אם הגישה תאושר, האפליקציה תוכל לקרוא נתונים כמו אלרגיות, תוצאות של בדיקות מעבדה, חיסונים ועוד\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"מידע לגבי הסיכומים על המצב הבריאותי"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"הנתונים שישותפו כוללים"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"אם תינתן הרשאה, האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> תוכל לשתף את הסיכומים על המצב הבריאותי שלך עם Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"אפשר לסנכרן את הסיכומים על המצב הבריאותי שלך מהאפליקציות ומהמקורות השונים כדי לשמור אותם במקום אחד"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"להסיר את כל ההרשאות?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"הסרת כל ההרשאות"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב נתונים ב-Health Connect‏.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב נתונים ב-Health Connect, כולל נתונים קודמים.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו הרשאות המיקום, המצלמה או המיקרופון."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב נתונים ב-Health Connect, כולל נתוני רקע ונתונים קודמים.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו הרשאות המיקום, המצלמה או המיקרופון."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"אני רוצה למחוק גם את הנתונים של <xliff:g id="APP_NAME">%1$s</xliff:g> מ-Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"להסיר את כל ההרשאות?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"להסיר את כל ההרשאות של סיכום המצב הבריאותי?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"להסיר את כל ההרשאות של נתוני הכושר והבריאות?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"אני רוצה למחוק מ-Health Connect גם את הנתונים של אימוני הכושר מ-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"להסיר את כל ההרשאות של סיכום המצב הבריאותי?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"אני רוצה למחוק מ-Health Connect גם את סיכום המצב הבריאותי מ-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב את הנתונים האלה ב-Health Connect‏.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב את הנתונים האלה ב-Health Connect, כולל נתוני רקע.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב את הנתונים האלה ב-Health Connect, כולל נתונים קודמים.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב את הנתונים האלה ב-Health Connect, כולל נתוני רקע ונתונים קודמים.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"להסיר את כל ההרשאות?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב נתונים ב-Health Connect‏.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב נתונים ב-Health Connect, כולל נתוני רקע.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב נתונים ב-Health Connect, כולל נתונים קודמים.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> לא תוכל יותר לקרוא או לכתוב נתונים ב-Health Connect, כולל נתוני רקע ונתונים קודמים.\n\nהשינוי לא משפיע על הרשאות אחרות שעשויות להיות לאפליקציה הזו, כמו המצלמה, המיקרופון או הרשאות המיקום."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"אני רוצה למחוק מ-Health Connect גם את הנתונים של אימוני הכושר ואת סיכום המצב הבריאותי מ-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"הוסרו ההרשאות של האפליקציה הזו"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"אני רוצה למחוק גם את כל הנתונים של Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"מעבר ליום הבא"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"היום שנבחר"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"ליום הקודם"</string>
     <string name="default_error" msgid="7966868260616403475">"משהו השתבש. כדאי לנסות שוב."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"המשאב לא מזוהה"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"נתוני המקור"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"‫<xliff:g id="PREFIX">%1$s</xliff:g>סוגר ימני."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"‫<xliff:g id="PREFIX">%1$s</xliff:g>סוגר שמאלי."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"‫<xliff:g id="PREFIX">%1$s</xliff:g> הערך בשדה <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"לאפליקציות האלה כבר אין גישה, אבל עדיין יש להן נתונים מאוחסנים ב-Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> יכולה לקרוא נתונים שנוספו אחרי <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"כדי לנהל הרשאות Android אחרות שיש לאפליקציה הזו גישה אליהן, עוברים אל \'הגדרות\' &gt; \'אפליקציות\'"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"הנתונים שמשותפים עם אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> כפופים למדיניות הפרטיות שלה"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"במדיניות הפרטיות של המפתח מוסבר איך האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מטפלת בנתונים שלך"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"כדי לנהל הרשאות Android אחרות שיש לאפליקציה הזו גישה אליהן, עוברים ל\'הגדרות\' ומקישים על \'אפליקציות\'"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"לעיון במדיניות הפרטיות"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"הייתה גישה ב-24 השעות האחרונות"</string>
     <string name="app_access_title" msgid="7137018424885371763">"גישה לאפליקציות"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"כרגע אין לך אפליקציות תואמות מותקנות"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"הרשאת גישה נוספת"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"נתונים קודמים, נתוני רקע"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"הוסרו הרשאות נוספות של האפליקציה הזו"</string>
     <string name="permissions_header" msgid="6519976063360071569">"הרשאות"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"כושר ובריאות"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"פעילות גופנית, שינה, תזונה ועוד"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"סיכום מצב בריאותי"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"סיכום מצב בריאותי"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"בדיקות מעבדה, תרופות, חיסונים ועוד"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"תוצאות מעבדה, תרופות, חיסונים ועוד"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"ההרשאות שניתנו לאפליקציה הוסרו"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"אפליקציית Health Connect הסירה את ההרשאות של <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"אפליקציית Health Connect הסירה את ההרשאות של <xliff:g id="APP_DATA_0">%1$s</xliff:g> ושל <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"מעבר לחנות Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"איך מתחילים להשתמש ב-Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"אפליקציית Health Connect מאחסנת את נתוני הבריאות והכושר שלך, ומאפשרת לך לסנכרן בקלות את האפליקציות השונות במכשיר"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"אפליקציית Health Connect מאחסנת ומסנכרנת את נתוני הבריאות והכושר שלך מאפליקציות שונות.\n\n"<b>"נתוני כושר ורווחה אישית,"</b>" כולל אימוני כושר, צעדים, תזונה, שינה ועוד\n\n"<b>"סיכומי מצב בריאותי,"</b>" כולל חיסונים, תוצאות של בדיקות מעבדה ועוד"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect מאפשרת לכם:"</string>
     <string name="share_data" msgid="3481932156368883946">"שיתוף נתונים עם האפליקציות שלך"</string>
     <string name="share_data_description" msgid="2919871301634375092">"בחירה בסוגי הנתונים שכל אפליקציה יכולה לקרוא או לכתוב ב-Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"ניהול ההגדרות והפרטיות"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"דימום חלש"</string>
     <string name="flow_medium" msgid="3783688724668943154">"דימום בינוני"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"דימום חזק"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"דימום לא ידוע"</string>
     <string name="period_day" msgid="3821944462093965882">"יום <xliff:g id="DAY">%1$d</xliff:g> של הווסת מתוך <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{המחזור החודשי (יום אחד)}one{המחזור החודשי (# ימים)}two{המחזור החודשי (יומיים)}other{המחזור החודשי (# ימים)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"תוצאה חיובית"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"תוצאה שלילית"</string>
     <string name="ovulation_high" msgid="205362931427158291">"תוצאה גבוהה"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"מוזיקה"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"אחר"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ללא הדרכה"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"מתונה"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"אינטנסיבית"</string>
     <string name="minute_duration" msgid="9035288227090160206">"דקה (<xliff:g id="MINUTE">%1$s</xliff:g>)"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> שע’ <xliff:g id="MIN">%2$s</xliff:g> דק’"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> שע‘"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"השילוב מתבצע"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"מתבצע שילוב של Health Connect עם מערכת Android‏.\n\nהעברת הנתונים וההרשאות יכולה לקחת קצת זמן."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"אין לסגור את האפליקציה עד לקבלת ההודעה שהתהליך הושלם."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"השילוב של Health Connect מתבצע"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"נדרש עדכון"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"מתבצע שילוב של Health Connect עם מערכת Android כדי שניתן יהיה לגשת אליה ישירות מההגדרות."</string>
     <string name="update_button" msgid="4544529019832009496">"עדכון"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"יש לבצע את העדכון הזה כדי ש-Health Connect תוכל להמשיך בשילוב עם הגדרות המערכת"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"לעדכון"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"נדרש עדכון מערכת"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"לפני המשך הפעולה, עליך לעדכן את מערכת הטלפון שלך."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"אם כבר עדכנת את מערכת הטלפון שלך, אפשר לנסות להפעיל מחדש את הטלפון כדי להמשיך בשילוב"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"צריך לעדכן את Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"לפני המשך הפעולה, יש לעדכן את אפליקציית Health Connect לגרסה האחרונה."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"צריך עוד מקום אחסון"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect זקוקה לנפח אחסון של <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> בטלפון כדי להמשיך בשילוב.\n\nעליך לפנות מקום בטלפון שלך ואז לנסות שוב."</string>
     <string name="try_again_button" msgid="8745496819992160789">"ניסיון חוזר"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"פינוי מקום אחסון"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"צריך עוד מקום אחסון"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect זקוקה לנפח אחסון של <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> בטלפון כדי להמשיך בשילוב."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"השילוב מושהה"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"אפליקציית Health Connect נסגרה בזמן השילוב עם מערכת Android‏.\n\nיש ללחוץ על \'המשך\' כדי לפתוח מחדש את האפליקציה ולהמשיך בהעברת הנתונים וההרשאות."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"כדי שנתוני Health Connect שלך יישמרו, עליך להשלים זאת בתוך <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"יש להקיש כדי להמשיך בשילוב של Health Connect עם מערכת Android. כדי שהנתונים שלך יישמרו, עליך להשלים זאת בתוך <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"יש להקיש כדי להמשיך בשילוב של Health Connect עם מערכת Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"המשך"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"המשך השילוב של Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"כדי שהנתונים שלך יישמרו, עליך להשלים זאת בתוך <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"נדרש עדכון לאפליקציה"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"צריך לעדכן את אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> כדי להמשיך בסנכרון עם Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"צריך לעדכן אפליקציות מסוימות כדי להמשיך בסנכרון עם Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"צריך לעדכן את אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> כדי להמשיך בסנכרון עם Health Connect. יכול להיות שהעדכונים לא זמינים לכל האפליקציות."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"צריך לעדכן אפליקציות מסוימות כדי להמשיך בסנכרון עם Health Connect. יכול להיות שהעדכונים לא זמינים לכל האפליקציות."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"חיפוש עדכונים"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"מידע נוסף"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"שילוב Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"השילוב של Health Connect לא הושלם"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"תוצג הודעה כשאפשר יהיה להמשיך."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"הבנתי"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"השילוב של Health Connect לא הושלם"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"למידע נוסף"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"השילוב של Health Connect הושלם"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"פתיחה"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"מה חדש"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"עכשיו אפשר לגשת ל-Health Connect ישירות מההגדרות. ניתן להסיר את אפליקציית Health Connect בכל שלב, ולפנות מקום אחסון."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"הבנתי"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"עריכת המקורות של האפליקציות"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ברירת המחדל של המכשיר"</string>
     <string name="app_data_title" msgid="6499967982291000837">"נתוני האפליקציה"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"כאן יוצגו נתונים מאפליקציות שיש להן גישה ל-Health Connect"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"כאן יופיעו נתונים מהאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"כאן יופיעו נתונים מאפליקציות שיש להן גישה ל-Health Connect"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"יום"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"שבוע"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"חודש"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"בחודש שעבר"</string>
     <string name="tab_entries" msgid="3402700951602029493">"רשומות"</string>
     <string name="tab_access" msgid="7818197975407243701">"גישה"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאת גישה נוספת?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> ביקשה גם גישה להגדרות הבאות של Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"צריך לתת הרשאת קריאה אחת לפחות כדי לאפשר לאפליקציה הזו גישה לנתונים קודמים או גישה ברקע"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"צריך לתת הרשאת קריאה אחת לפחות כדי לאפשר לאפליקציה הזו גישה ברקע"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"צריך לתת הרשאת קריאה אחת לפחות כדי לאפשר לאפליקציה הזו גישה לנתונים קודמים"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"סנכרון דרך Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"אפשר לסנכרן את האפליקציות הקיימות כדי לשתף ביניהן נתונים של בריאות וכושר"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"הגדרה"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"לעיון באפליקציות התואמות"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"כדאי לחפש עוד אפליקציות שמסתנכרנות עם <xliff:g id="APP_NAME">%s</xliff:g> דרך Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"לעיון בחנות האפליקציות"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"הגדרה של נעילת מסך"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"כדי לשפר את האבטחה של נתוני הבריאות, מומלץ להגדיר קוד אימות, קו ביטול נעילה או סיסמה למכשיר הזה"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"הגדרת נעילת מסך"</string>
     <string name="select_all" msgid="837499881590001166">"בחירת הכול"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"האפליקציות המקושרות לא יוכלו יותר לקרוא את הנתונים האלה מ-Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"מסומנת"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"לא מסומנת"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"יש מסלול של האימון במפה"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"ליום הבא"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"לשבוע הבא"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"לחודש הבא"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"ליום הקודם"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"לשבוע הקודם"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"לחודש הקודם"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"למחוק סופית את כל הנתונים?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"למחוק סופית את הנתונים שנבחרו?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"למחוק סופית את כל הנתונים של <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"למחוק סופית את רשומות <xliff:g id="APP_NAME">%1$s</xliff:g> שנבחרו מהשבוע של <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"למחוק סופית את רשומות <xliff:g id="APP_NAME">%1$s</xliff:g> שנבחרו מחודש <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"למחוק סופית את הרשומה הזו של <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"למחוק לתמיד את הנתונים מסוג <xliff:g id="DATA_TYPE">%1$s</xliff:g> של <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"מופעל"</string>
+    <string name="off" msgid="6996623844428550649">"כבוי"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"הגישה האחרונה נעשתה בתאריך: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"גישה אתמול: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"תאריך גישה: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> ב-<xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"כן, כל הזמן"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"אישור הפריטים שנבחרו"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"בזמן השימוש באפליקציה"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"דחייה של כולם"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאת גישה לנתוני כושר ובריאות?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת גישה אל <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nאפשר לבחור אם לאשר הכול או לשלוט בהרשאות בנפרד."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> גישה אל <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"כושר ובריאות"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"כל הזמן"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"בזמן השימוש"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"כל הזמן"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"בזמן השימוש"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> יש גישה לכל נתוני הכושר והבריאות שלך <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"יש הרשאת גישה"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"יש הרשאת קריאה"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ההרשאות האלה נותנות לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> גישה לנתונים מהחיישנים במכשיר."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"‫<xliff:g id="NUMBER_0">%1$d</xliff:g> מתוך <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> אפליקציות קיבלו הרשאה"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"אין בקשה מאף אפליקציה"</string>
+    <string name="allowed" msgid="4158456017482263737">"יש הרשאה"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"אין הרשאה"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"אפליקציות עם ההרשאה הזו יכולות לגשת לנתוני <xliff:g id="DATA_TYPE">%s</xliff:g> מהחיישנים במכשיר."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"להסיר את הרשאות הגישה לנתוני <xliff:g id="DATA_TYPE">%s</xliff:g> מכל האפליקציות בשעון?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"סימן וי"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"סימן איקס"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"כרגע, לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> יש גישה לנתוני הכושר והבריאות <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"לתת לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> הרשאת גישה לנתוני הכושר והבריאות כל הזמן?"</string>
+    <string name="current_access" msgid="1457167070428176139">"לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> יש גישה אל <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"עריכת ההרשאות של נתוני הכושר והבריאות"</string>
 </resources>
diff --git a/apk/res/values-ja/strings.xml b/apk/res/values-ja/strings.xml
index 5692cf2..9ca82fa 100644
--- a/apk/res/values-ja/strings.xml
+++ b/apk/res/values-ja/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"デバイス上の健康とフィットネスのデータの管理や、そのデータにアクセスできるアプリの管理を行えます"</string>
     <string name="data_title" msgid="4456619761533380816">"データとアクセス"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"医療記録を見る"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"医療記録と医療記録にアクセスできるアプリを確認できます"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"すべてのカテゴリ"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"すべてのカテゴリを表示"</string>
     <string name="no_data" msgid="1906986019249068659">"データがありません"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"昨日"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"読み取り: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"書き込み: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"、 "</string>
+    <string name="separator" msgid="5521285473288943819">"、 "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"権限を管理"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"時間: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"アクティビティ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"健康に関するデータにアクセスします"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"消費カロリーの読み取り"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"消費カロリーの読み取りをアプリに許可します"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"バックグラウンドでのデータアクセス"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g>にバックグラウンドでのデータへのアクセスを許可しますか?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g>にバックグラウンドでのデータへのアクセスを許可しますか?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"許可すると、このアプリは使用されていないときにフィットネスとウェルネスに関するデータと医療記録にアクセスできます。"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"許可すると、このアプリは使用されていないときに医療記録にアクセスできます。"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"許可すると、このアプリは使用されていないときにフィットネスとウェルネスに関するデータにアクセスできます。"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"許可すると、このアプリは使用されていないときにヘルスコネクト データにアクセスできます。"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g>に過去のデータへのアクセスを許可しますか?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"許可すると、このアプリは、<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>以前に追加されたフィットネスとウェルネスに関するデータにアクセスできます。"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"許可すると、このアプリは過去のすべてのフィットネスとウェルネスに関するデータにアクセスできます。"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"許可すると、このアプリは、<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>以前に追加されたヘルスコネクト データにアクセスできます。"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"許可すると、このアプリは過去のすべてのヘルスコネクト データにアクセスできます。"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g>に次のアクセスも許可しますか?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g>は、これらのヘルスコネクトの設定へのアクセスも求めています"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"バックグラウンドでのすべてのデータへのアクセス"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"バックグラウンドでの医療記録へのアクセス"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"バックグラウンドでのフィットネスとウェルネスに関するデータへのアクセス"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"このアプリが使用されていないときに、フィットネスとウェルネスに関するデータと医療記録へのアクセスを許可します"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"このアプリが使用されていないときに、このデータへのアクセスを許可します"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"このアプリが使用されていないときに、このデータへのアクセスを許可します"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"バックグラウンドでのデータアクセス"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"このアプリが使用されていないときにヘルスコネクト データへのアクセスを許可します"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"フィットネスとウェルネスに関する過去のデータへのアクセス"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"このアプリに、<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>以前に追加されたデータへのアクセスを許可します"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"このアプリに、過去のすべてのデータへのアクセスを許可します"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"過去のデータへのアクセス"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"このアプリに、<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>以前に追加されたヘルスコネクト データへのアクセスを許可します"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"このアプリに過去のすべてのヘルスコネクト データへのアクセスを許可します"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g>は医療記録の過去のデータにアクセスできるようになっています"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"権限の詳細"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"バックグラウンドでのすべてのデータへのアクセス"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"バックグラウンドでの医療記録へのアクセス"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"バックグラウンドでのフィットネスとウェルネスに関するデータへのアクセス"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"このアプリが使用されていないときに、フィットネスとウェルネスに関するデータと医療記録へのアクセスを許可します"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"このアプリが使用されていないときに、このデータへのアクセスを許可します"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"このアプリが使用されていないときに、このデータへのアクセスを許可します"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"バックグラウンドでのデータアクセス"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"このアプリが使用されていないときにヘルスコネクト データへのアクセスを許可します"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"フィットネスとウェルネスに関する過去のデータへのアクセス"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"このアプリに、<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>以前に追加されたデータへのアクセスを許可します"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"このアプリに、過去のすべてのデータへのアクセスを許可します"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"過去のデータへのアクセス"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"このアプリに、<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>以前に追加されたヘルスコネクト データへのアクセスを許可します"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"このアプリにヘルスコネクトの過去のすべてのデータへのアクセスを許可します"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g>には読み取り権限がないため、現在読み取られているフィットネス データはありません"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> は医療記録の過去のデータにアクセスできるようになっています。この設定を変更するには、このアプリの医療記録の権限を OFF にしてください"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"医療記録の権限を管理"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"このアプリによるバックグラウンドでのアクセスまたは過去のデータのアクセスを有効にするには、少なくとも 1 つの読み取り権限を付与してください"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"このアプリによるバックグラウンドでのアクセスを有効にするには、少なくとも 1 つの読み取り権限を付与してください"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"このアプリによる過去のデータのアクセスを有効にするには、少なくとも 1 つの読み取り権限を付与してください"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"このアプリに過去のすべてのヘルスコネクト データへのアクセスを許可します"</string>
     <string name="background_read_description" msgid="3203594555849969283">"このアプリが使用されていないときにヘルスコネクト データへのアクセスを許可します"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"許可すると、このアプリは使用されていないときにヘルスコネクト データにアクセスできます。"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"過去のデータへのアクセス"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g>に過去のデータへのアクセスを許可しますか?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"このアプリに、<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>以前に追加されたヘルスコネクト データへのアクセスを許可します"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"このアプリに過去のすべてのヘルスコネクト データへのアクセスを許可します"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"許可すると、このアプリは、<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>以前に追加されたヘルスコネクト データにアクセスできます。"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"許可すると、このアプリは過去のすべてのヘルスコネクト データにアクセスできます。"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"活動中の消費カロリー"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"活動中の消費カロリー"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"活動中の消費カロリーの読み取り"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"車椅子を押した回数"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"車椅子を押した回数の読み取り"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"車椅子を押した回数の書き込み"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"アクティビティの強度"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"アクティビティの強度"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"アクティビティの強度の読み取り"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"アクティビティの強度の書き込み"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"基礎代謝率"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"基礎代謝率"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"基礎代謝率の読み取り"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"皮膚温"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"皮膚温を読み取る"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"皮膚温を書き込む"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"ヘルスコネクトに同期・追加されたすべての健康記録が含まれます。これは必ずしも医療記録とは限らず、健康記録の医学的説明は含まれません。"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"すべての医療記録"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"すべての医療記録"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"医療記録の書き込み"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"アレルギー"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"アレルギー"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"アレルギー不耐性データの読み取り"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"予防接種データ"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"予防接種データ"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"予防接種データの読み取り"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"検査結果"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"検査結果"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"検査結果の読み取り"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"アレルギー不耐性"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"アレルギー不耐性"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"アレルギー不耐性データの読み取り"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"健康状態"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"健康状態"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"健康状態の読み取り"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ワクチン接種"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ワクチン接種"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ワクチン接種データの読み取り"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"検査結果"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"検査結果"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"検査結果データの読み取り"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"服薬情報"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"服薬情報"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"服薬情報を読み取る"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"個人の詳細"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"個人の詳細"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"個人の詳細の読み取り"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"医療従事者の詳細"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"医療従事者の詳細"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"医療従事者の詳細の読み取り"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"妊娠"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"妊娠"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"妊娠データの読み取り"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"問題"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"問題"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"問題の読み取り"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"治療"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"治療"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"治療データの読み取り"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"社会歴"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"社会歴"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"社会歴"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"社会歴の読み取り"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"バイタルサイン"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"受診"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"受診"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"受診の読み取り"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"バイタルサイン"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"バイタルサイン"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"バイタルサインの読み取り"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"マインドフルネス"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"マインドフルネスを書き込む"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」に読み取りを許可する"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」に書き込みを許可する"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"キャンセル"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"許可"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"すべて許可"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"許可しない"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"このアプリにヘルスコネクトでの読み取りまたは書き込みを許可するデータを選択します"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"このアプリにヘルスコネクトでの読み取りまたは書き込みを許可するデータを選択できます"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"このアプリにヘルスコネクトからの読み取りを許可するデータを選択できます"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"このアプリにヘルスコネクトへの書き込みを許可するデータを選択できます"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"読み取りアクセス権を付与すると、このアプリは新規データと過去 30 日間のデータを読み取れるようになります"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"読み取りアクセス権を付与すると、このアプリは新規データと過去のデータを読み取れるようになります"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> にヘルスコネクトへのアクセスを許可しますか?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> でのデータの取り扱いについて、デベロッパーの<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>でご確認ください"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g>に、フィットネスとウェルネスに関するデータへのアクセスを許可しますか?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> によるユーザーデータの取り扱いについては、<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>をご覧ください"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"プライバシー ポリシー"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> に医療記録へのアクセスを許可しますか?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"アクセス権を付与すると、このアプリはアレルギー、検査結果、ワクチン接種などのデータの読み取りと書き込みを行えるようになります\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"アクセス権を付与すると、このアプリはアレルギー、検査結果、ワクチン接種などのデータを読み取れるようになります\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"医療記録について"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"共有するデータには以下が含まれます"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"許可すると、<xliff:g id="APP_NAME">%1$s</xliff:g>は医療記録をヘルスコネクトと共有できるようになります。"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"さまざまなアプリやソースの医療記録を同期して 1 か所で管理できます"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"すべての権限を削除しますか?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"すべて削除"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> はヘルスコネクトのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、過去のデータを含め、ヘルスコネクトのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、位置情報、カメラ、マイクなど、このアプリのその他の権限には影響しません。"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、バックグラウンド データや過去のデータを含め、ヘルスコネクトのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、位置情報、カメラ、マイクなど、このアプリのその他の権限には影響しません。"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"ヘルスコネクトから <xliff:g id="APP_NAME">%1$s</xliff:g> のデータも削除する"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"すべての権限を削除しますか?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"医療記録の権限をすべて削除しますか?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"フィットネスとウェルネスの権限をすべて削除しますか?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"<xliff:g id="APP_NAME">%1$s</xliff:g> のフィットネス データもヘルスコネクトから削除する"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"医療記録の権限をすべて削除しますか?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"<xliff:g id="APP_NAME">%1$s</xliff:g> の医療記録もヘルスコネクトから削除する"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> はヘルスコネクトのこのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、バックグラウンド データを含め、ヘルスコネクトのこのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、過去のデータを含め、ヘルスコネクトのこのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、バックグラウンド データや過去のデータを含め、ヘルスコネクトのこのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"すべての権限を削除しますか?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> はヘルスコネクトのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、バックグラウンド データを含め、ヘルスコネクトのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、過去のデータを含め、ヘルスコネクトのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、バックグラウンド データや過去のデータを含め、ヘルスコネクトのデータの読み取り、書き込みを行えなくなります。\n\nこの設定は、カメラ、マイク、位置情報など、このアプリのその他の権限には影響しません。"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"<xliff:g id="APP_NAME">%1$s</xliff:g> のフィットネス データと医療記録もヘルスコネクトから削除する"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"このアプリの権限を削除しました"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"ヘルスコネクトのデータもすべて削除する"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"翌日"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"選択した日"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"前日"</string>
     <string name="default_error" msgid="7966868260616403475">"エラーが発生しました。もう一度お試しください。"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"不明なリソース"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ソースデータ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>開き角かっこ。"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>閉じ角かっこ。"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> フィールド <xliff:g id="FIELD">%2$s</xliff:g> 値"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"これらのアプリはアクセスできなくなりましたが、ヘルスコネクトからデータが削除されることはありません"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> は、<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>以降に追加されたデータを読み取ることができます"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"このアプリがアクセスできるその他の Android 権限を管理するには、[設定] &gt; [アプリ] に移動してください"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> と共有するデータには、そのアプリのプライバシー ポリシーが適用されます"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> でのデータの取り扱いについて詳しくは、デベロッパーのプライバシー ポリシーをご覧ください"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"このアプリがアクセスできるその他の Android 権限を管理するには、[設定] に移動し、[アプリ] をタップしてください"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"プライバシー ポリシーを読む"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"過去 24 時間にアクセス"</string>
     <string name="app_access_title" msgid="7137018424885371763">"アプリのアクセス権"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"現在、対応アプリがインストールされていません"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"アクセス権の追加"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"過去のデータ、バックグラウンド データ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"このアプリの追加権限を削除しました"</string>
     <string name="permissions_header" msgid="6519976063360071569">"権限"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"フィットネスとウェルネス"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"エクササイズ、睡眠、栄養、その他"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"医療記録"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"医療記録"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"検査結果、医薬品、予防接種記録、その他"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"検査結果、投薬、ワクチン接種、その他"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"アプリの権限を削除しました"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"ヘルスコネクトにより、<xliff:g id="APP_DATA">%s</xliff:g> に対する権限が削除されました"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"ヘルスコネクトにより、<xliff:g id="APP_DATA_0">%1$s</xliff:g> と <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> の権限が削除されました"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Google Play ストアにアクセス"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"ヘルスコネクトを使ってみる"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"ヘルスコネクトを利用すると、健康とフィットネスに関するデータを保存し、デバイス上のさまざまなアプリを簡単に同期することができます"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"ヘルスコネクトは、さまざまなアプリから健康とフィットネスに関するデータを保存、同期します。\n\n"<b>"フィットネスとウェルネスのデータ("</b>" エクササイズ セッション、歩数、栄養、睡眠など)\n\n"<b>"医療記録("</b>"ワクチン接種、検査結果など)"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"ヘルスコネクトを使用すると、次のようなことができます"</string>
     <string name="share_data" msgid="3481932156368883946">"アプリとデータを共有する"</string>
     <string name="share_data_description" msgid="2919871301634375092">"ヘルスコネクトに対して、各アプリが読み取りや書き込みを行えるデータを選択できます"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"設定とプライバシーを管理する"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"出血: 少ない"</string>
     <string name="flow_medium" msgid="3783688724668943154">"出血: 普通"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"出血: 多い"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"不明な経血量"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="DAY">%1$d</xliff:g> 日目(<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> 日間)"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{生理(1 日目)}other{生理(# 日目)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"好ましい"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"好ましくない"</string>
     <string name="ovulation_high" msgid="205362931427158291">"高"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"音楽"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"その他"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ガイドなし"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"中"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"高"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> 分"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> 時間 <xliff:g id="MIN">%2$s</xliff:g> 分"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> 時間"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"統合中"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"ヘルスコネクトを Android システムと統合しています。\n\nデータと権限が移行されるまで時間がかかることがあります。"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"統合完了の通知が表示されるまでアプリを閉じないでください。"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"ヘルスコネクトの統合中"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"更新が必要です"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"設定から直接アクセスできるよう、ヘルスコネクトを Android システムと統合しています。"</string>
     <string name="update_button" msgid="4544529019832009496">"更新"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"ヘルスコネクトとシステム設定との統合を続行できるよう、この更新を開始してください"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"今すぐ更新"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"システム アップデートが必要です"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"続行する前に、電話システムを更新してください。"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"電話システムをすでに更新している場合は、スマートフォンを再起動して統合を続行してください"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"ヘルスコネクトの更新が必要です"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"続行する前に、ヘルスコネクト アプリを最新バージョンに更新してください。"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"空き容量が不足しています"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"ヘルスコネクトの統合を続けるためには、スマートフォンに <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> の空き容量が必要です。\n\nスマートフォンのストレージのデータを一部削除してから、もう一度お試しください。"</string>
     <string name="try_again_button" msgid="8745496819992160789">"再試行"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"空き容量を増やす"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"空き容量が不足しています"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"ヘルスコネクトの統合を続けるには、スマートフォンに <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> の空き容量が必要です。"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"統合が一時停止しました"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Android システムとの統合中にヘルスコネクト アプリが終了しました。\n\n[再開] をクリックしてアプリを再起動し、データと権限の移行を続行してください。"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"ヘルスコネクトのデータを保持するため、<xliff:g id="TIME_NEEDED">%1$s</xliff:g>以内に完了してください"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"ヘルスコネクトと Android システムとの統合を続行するには、タップしてください。データを保持するため、<xliff:g id="TIME_NEEDED">%1$s</xliff:g>以内に統合を完了してください。"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"ヘルスコネクトと Android システムとの統合を続行するには、タップしてください。"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"続行"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"ヘルスコネクトの統合を再開してください"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"データを保持するため、<xliff:g id="TIME_NEEDED">%1$s</xliff:g>以内に統合を完了してください。"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"アプリの更新が必要です"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"ヘルスコネクトとの同期を続けるには、<xliff:g id="APP_NAME">%1$s</xliff:g> の更新が必要です"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"ヘルスコネクトとの同期を続けるには、いくつかのアプリの更新が必要です"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"ヘルスコネクトとの同期を続けるには、<xliff:g id="APP_NAME">%1$s</xliff:g> の更新が必要です。アプリによってはアップデートを利用できない場合があります。"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"ヘルスコネクトとの同期を続けるには、いくつかのアプリの更新が必要です。アプリによってはアップデートを利用できない場合があります。"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"アップデートを確認"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"詳細"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"ヘルスコネクトの統合"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"ヘルスコネクトの統合が完了しませんでした"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"再開できるようになると通知が届きます。"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"ヘルスコネクトの統合が完了しませんでした"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"詳細"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"ヘルスコネクトの統合が完了しました"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"開く"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"新機能"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"設定からヘルスコネクトに直接アクセスできるようになりました。いつでもヘルスコネクト アプリをアンインストールして、ストレージの空き容量を増やすことができます。"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"アプリのソースを編集する"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"デバイスのデフォルト"</string>
     <string name="app_data_title" msgid="6499967982291000837">"アプリデータ"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"ヘルスコネクトにアクセスできるアプリのデータがここに表示されます"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> からのデータがここに表示されます"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"ヘルスコネクトにアクセスできるアプリのデータがここに表示されます"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"日"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"週"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"月"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"先月"</string>
     <string name="tab_entries" msgid="3402700951602029493">"エントリ"</string>
     <string name="tab_access" msgid="7818197975407243701">"アクセス"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g>に次のアクセスも許可しますか?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g>は、これらのヘルスコネクトの設定へのアクセスも求めています"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"このアプリによるバックグラウンドでのアクセスまたは過去のデータのアクセスを有効にするには、少なくとも 1 つの読み取り権限を付与してください"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"このアプリによるバックグラウンドでのアクセスを有効にするには、少なくとも 1 つの読み取り権限を付与してください"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"このアプリによる過去のデータのアクセスを有効にするには、少なくとも 1 つの読み取り権限を付与してください"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"ヘルスコネクトの使用を開始する"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"健康とフィットネスに関するデータを共有する 1 つ目のアプリを同期する"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"設定"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"対応アプリを表示する"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"ヘルスコネクトで <xliff:g id="APP_NAME">%s</xliff:g> と同期するアプリをさらに探す"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"アプリストアで表示する"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"画面ロックの設定"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"健康に関するデータのセキュリティを強化するために、このデバイスの PIN、パターン、またはパスワードを設定してください"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"画面ロックを設定"</string>
     <string name="select_all" msgid="837499881590001166">"すべて選択"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"接続されているアプリは、ヘルスコネクトに追加されたこのデータを読み取れなくなります"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ON"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"OFF"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"エクササイズのマップルートを確認できます"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"翌日"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"来週"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"翌月"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"前日"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"前週"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"前月"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"すべてのデータを完全に削除しますか?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"選択したデータを完全に削除しますか?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g>のすべてのデータを完全に削除しますか?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>の週の <xliff:g id="APP_NAME">%1$s</xliff:g> の選択したエントリを完全に削除しますか?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>の <xliff:g id="APP_NAME">%1$s</xliff:g> の選択したエントリを完全に削除しますか?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"<xliff:g id="APP_NAME">%s</xliff:g> のこのエントリを完全に削除しますか?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> の <xliff:g id="DATA_TYPE">%1$s</xliff:g> のデータを完全に削除しますか?"</string>
+    <string name="on" msgid="8266542510798355807">"ON"</string>
+    <string name="off" msgid="6996623844428550649">"OFF"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g>にアクセス"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"昨日の <xliff:g id="TIME_DATE">%1$s</xliff:g> にアクセス"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> にアクセス"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"常に許可"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"選択された権限を許可する"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"アプリの使用時のみ"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"すべて拒否する"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"フィットネスとウェルネスに関するデータへのアクセスを <xliff:g id="APP_NAME">%1$s</xliff:g> に許可しますか?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> が<xliff:g id="DATA_TYPES">%2$s</xliff:g>へのアクセスをリクエストしています。\n\nすべて許可するか、個別に許可するかを選択してください。"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> に<xliff:g id="DATA_TYPE">%2$s</xliff:g>へのアクセスを許可しますか?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"フィットネスとウェルネス"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"常時"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"使用中"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"常時"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"使用中"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> はフィットネスとウェルネスに関するすべてのデータにアクセスできます(<xliff:g id="ALLOW_MODE">%2$s</xliff:g>)"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"アクセスの許可"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"読み取りの許可"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"これらの権限により、<xliff:g id="APP_NAME">%1$s</xliff:g> はデバイスのセンサーからデータにアクセスできるようになります。"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> 個のアプリを許可"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"リクエストしているアプリはありません"</string>
+    <string name="allowed" msgid="4158456017482263737">"許可"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"許可しない"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"この権限があるアプリは、デバイスのセンサーから<xliff:g id="DATA_TYPE">%s</xliff:g>のデータにアクセスできます。"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"スマートウォッチのすべてのアプリから<xliff:g id="DATA_TYPE">%s</xliff:g>のアクセス権を削除しますか?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"チェックマーク"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"バツマーク"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"現在、<xliff:g id="APP_NAME">%1$s</xliff:g> はフィットネスとウェルネスに関するデータにアクセスできます(<xliff:g id="ALLOW_MODE">%2$s</xliff:g>)"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"フィットネスとウェルネスに関するデータへのアクセスを <xliff:g id="APP_NAME">%1$s</xliff:g> に常に許可しますか?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> は<xliff:g id="DATA_TYPES">%2$s</xliff:g>へのアクセスが可能です。"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"フィットネスとウェルネスに関する権限を管理"</string>
 </resources>
diff --git a/apk/res/values-ka/strings.xml b/apk/res/values-ka/strings.xml
index c1eb824..7223e6e 100644
--- a/apk/res/values-ka/strings.xml
+++ b/apk/res/values-ka/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ჯანმრთელობასა და ფიტნესთან დაკავშირებული მონაცემების მართვა თქვენს მოწყობილობაში და იმის განსაზღვრა, თუ რომელ აპს ჰქონდეს მათზე წვდომა"</string>
     <string name="data_title" msgid="4456619761533380816">"მონაცემები და წვდომა"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"ჯანმრთელობის ჩანაწერების დათვალიერება"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"იხილეთ თქვენი ჯანმრთელობის ჩანაწერები და რომელ აპებს აქვთ მათზე წვდომა"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"ყველა კატეგორია"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"ყველა კატეგორიის ნახვა"</string>
     <string name="no_data" msgid="1906986019249068659">"მონაცემები არ არის"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"გუშინ"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"კითხვა: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"წერა: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"ნებართვების მართვა"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"დრო: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"აქტივობა"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"თქვენს ჯანმრთელობის მონაცემებზე წვდომა"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"დამწვარი კალორიების წაკითხვა"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"საშუალებას აძლევს აპს, წაიკითხოს დამწვარი კალორიები"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"მონაცემებზე წვდომა ფონურ რეჟიმში"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"მიეცეს აპს (<xliff:g id="APP_NAME">%1$s</xliff:g>) მონაცემებზე ფონურ რეჟიმში წვდომის ნებართვა?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"მიეცეს აპს (<xliff:g id="APP_NAME">%1$s</xliff:g>) მონაცემებზე ფონურ რეჟიმში წვდომის ნებართვა?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"თუ ნებართვას მისცემთ, ამ აპს ფიტნესის და კეთილდღეობის მონაცემებზე და ჯანმრთელობის ჩანაწერებზე ექნება წვდომა, როდესაც აპით არ სარგებლობთ."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"თუ ნებართვას მისცემთ, ამ აპს ჯანმრთელობის ჩანაწერებზე ექნება წვდომა, როდესაც აპით არ სარგებლობთ."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"თუ ნებართვას მისცემთ, ამ აპს ფიტნესის და კეთილდღეობის მონაცემებზე ექნება წვდომა, როდესაც აპით არ სარგებლობთ."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"თუ ნებართვას მისცემთ, ამ აპს Health Connect-ის მონაცემებზე ექნება წვდომა, როდესაც აპით არ სარგებლობთ."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"მიეცეს აპს (<xliff:g id="APP_NAME">%1$s</xliff:g>) ძველ მონაცემებზე წვდომის ნებართვა?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"თუ ნებართვას მისცემთ, ამ აპს შეეძლება ფიტნესისა და კეთილდღეობის იმ მონაცემებზე წვდომა, რომლებიც დამატებულია მოცემულ თარიღამდე: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"თუ ნებართვას მისცემთ, ამ აპს შეეძლება ფიტნესისა და კეთილდღეობის ყველა ძველ მონაცემზე წვდომა."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"თუ ნებართვას მისცემთ, ამ აპს შეეძლება Health Connect-ის იმ მონაცემებზე წვდომა, რომლებიც დამატებულია მოცემულ თარიღამდე: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"თუ ნებართვას მისცემთ, ამ აპს შეეძლება Health Connect-ის ყველა ძველ მონაცემზე წვდომა."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"მიეცეს აპს (<xliff:g id="APP_NAME">%1$s</xliff:g>) დამატებითი წვდომის ნებართვა?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> აპი ასევე ითხოვს Health Connect-ის ამ პარამეტრებზე წვდომას"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"ყველა მონაცემზე წვდომა ფონურ რეჟიმში"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ჯანმრთელობის ჩანაწერებზე წვდომა ფონურ რეჟიმში"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ფიტნესის და კეთილდღეობის მონაცემებზე წვდომა ფონურ რეჟიმში"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ნება დართეთ ამ აპს, ჰქონდეს წვდომა ფიტნესის და კეთილდღეობის მონაცემებზე და ჯანმრთელობის ჩანაწერებზე, როცა არ იყენებთ აპს"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ნება დართეთ აღნიშნულ აპს, ჰქონდეს წვდომა ამ მონაცემებზე, როცა არ იყენებთ აპს"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ნება დართეთ აღნიშნულ აპს, ჰქონდეს წვდომა ამ მონაცემებზე, როცა არ იყენებთ აპს"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"მონაცემებზე წვდომა ფონურ რეჟიმში"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"მიეცით აპს Health Connect-ის მონაცემებზე წვდომის ნებართვა, როდესაც აპით არ სარგებლობთ"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ფიტნესის და კეთილდღეობის ძველ მონაცემებზე წვდომა"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"ამ აპისთვის იმ მონაცემებზე წვდომის დაშვება, რომლებიც დამატებულია მოცემულ თარიღამდე: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"ამ აპისთვის ყველა ძველ მონაცემზე წვდომის დაშვება"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"ძველ მონაცემებზე წვდომა"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"ამ აპისთვის Health Connect-ის იმ მონაცემებზე წვდომის დაშვება, რომლებიც დამატებულია მოცემულ თარიღამდე: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"ამ აპისთვის Health Connect-ის ძველ მონაცემებზე წვდომის დაშვება"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს უკვე შეუძლია ძველ მონაცემებზე წვდომა ჯანმრთელობის ჩანაწერებში"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"ნებართვები შესახებ მეტის წაკითხვა"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"ყველა მონაცემზე წვდომა ფონურ რეჟიმში"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ჯანმრთელობის ჩანაწერებზე წვდომა ფონურ რეჟიმში"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ფიტნესის და კეთილდღეობის მონაცემებზე წვდომა ფონურ რეჟიმში"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ნება დართეთ ამ აპს, ჰქონდეს წვდომა ფიტნესის და კეთილდღეობის მონაცემებზე და ჯანმრთელობის ჩანაწერებზე, როცა არ იყენებთ აპს"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ნება დართეთ აღნიშნულ აპს, ჰქონდეს წვდომა ამ მონაცემებზე, როცა არ იყენებთ აპს"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ნება დართეთ აღნიშნულ აპს, ჰქონდეს წვდომა ამ მონაცემებზე, როცა არ იყენებთ აპს"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"მონაცემებზე წვდომა ფონურ რეჟიმში"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"მიეცით აპს Health Connect-ის მონაცემებზე წვდომის ნებართვა, როდესაც აპით არ სარგებლობთ"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ფიტნესის და კეთილდღეობის ძველ მონაცემებზე წვდომა"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"ამ აპისთვის იმ მონაცემებზე წვდომის დაშვება, რომლებიც დამატებულია მოცემულ თარიღამდე: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"ამ აპისთვის ყველა ძველ მონაცემზე წვდომის დაშვება"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"ძველ მონაცემებზე წვდომა"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"ამ აპისთვის Health Connect-ის იმ მონაცემებზე წვდომის დაშვება, რომლებიც დამატებულია მოცემულ თარიღამდე: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"ამ აპისთვის Health Connect-ის ყველა ძველ მონაცემზე წვდომის დაშვება"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"ამჟამად ფიტნესის მონაცემების წაკითხვა არ ხდება, რადგან <xliff:g id="APP_NAME">%1$s</xliff:g>-ს წაკითხვის ნებართვები ჩართული არ აქვს"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს უკვე შეუძლია ძველ მონაცემებზე წვდომა ჯანმრთელობის ჩანაწერებში ამის შესაცვლელად გამორთეთ ჯანმრთელობის ჩანაწერების ნებართვები აღნიშნული აპისთვის"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"ჯანმრთელობის ჩანაწერების ნებართვების მართვა"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ჩართეთ მინიმუმ ერთი წაკითხვის ნებართვა, რათა ჩართოთ ფონურ რეჟიმში ან წარსულ მონაცემებზე წვდომა ამ აპისთვის"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ჩართეთ მინიმუმ ერთი წაკითხვის ნებართვა ამ აპისთვის წვდომის ფონურ რეჟმში ჩართვის მიზნით"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ჩართეთ მინიმუმ ერთი წაკითხვის ნებართვა, რათა ჩართოთ წარსულ მონაცემებზე წვდომა ამ აპისთვის"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"ამ აპისთვის Health Connect-ის ძველ მონაცემებზე წვდომის დაშვება"</string>
     <string name="background_read_description" msgid="3203594555849969283">"მიეცით აპს Health Connect-ის მონაცემებზე წვდომის ნებართვა, როდესაც აპით არ სარგებლობთ"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ნებართვის მიცემის შემთხვევაში, ამ აპს Health Connect-ის მონაცემებზე ექნება წვდომა, როდესაც აპით არ სარგებლობთ."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"ძველ მონაცემებზე წვდომა"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"მიეცეს აპს (<xliff:g id="APP_NAME">%1$s</xliff:g>) ძველ მონაცემებზე წვდომა?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"მიეცით აპს Health Connect-ის მონაცემებზე წვდომის ნებართვა <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-მდე"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"მიეცით აპს Health Connect-ის ძველ მონაცემებზე წვდომის ნებართვა"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ნებართვის მიცემის შემთხვევაში, ამ აპს Health Connect-ის იმ მონაცემებზე ექნება წვდომა, რომლებიც დამატებულია <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-მდე."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ნებართვის მიცემის შემთხვევაში ამ აპს შეუძლია Health Connect-ის ძველ მონაცემებზე წვდომა."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"დამწვარი აქტიური კალორიები"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"დამწვარი აქტიური კალორიები"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"გაეცანით დამწვარი აქტიური კალორიების მონაცემებს"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"უნარშეზღუდულის ეტლის ბიძგები"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"უნარშეზღუდულის ეტლის ბიძგების შესახებ ინფორმაციის წაკითხვა"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"უნარშეზღუდულის ეტლის ბიძგების შესახებ ინფორმაციის ჩაწერა"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"აქტივობის ინტენსიურობა"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"აქტივობის ინტენსიურობა"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"აქტივობის ინტენსიურობის წაკითხვა"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"აქტივობის ინტენსიურობის დაწერა"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"ძირითადი მეტაბოლიზმის სიჩქარე"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"ძირითადი მეტაბოლიზმის სიჩქარე"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"ძირითადი მეტაბოლიზმის სიჩქარის შესახებ ინფორმაციის წაკითხვა"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"კანის ტემპერატურა"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"კანის ტემპერატურის წაკითხვა"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"კანის ტემპერატურის დაწერა"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"ეს მოიცავს Health Connect-ზე სინქრონიზებულ და დამატებულ ჯანმრთელობის ნებისმიერ ჩანაწერს. შესაძლოა, ეს არ იყოს თქვენი სრული სამედიცინო ჩანაწერი და არ შეიცავდეს თქვენი ჯანმრთელობის ჩანაწერების სამედიცინო აღწერას."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"ჯანმრთელობის ყველა ჩანაწერი"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"ჯანმრთელობის ყველა ჩანაწერი"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"ჯანმრთელობის ყველა ჩანაწერის დაწერა"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"ალერგიები"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ალერგიები"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"ალერგიების წაკითხვა"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"იმუნიზაცია"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"იმუნიზაცია"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"იმუნიზაციის წაკითხვა"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ლაბორატორიული შედეგები"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ლაბორატორიული შედეგები"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ლაბორატორიული შედეგების წაკითხვა"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"ალერგიები"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ალერგიები"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"ალერგიების წაკითხვა"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"პირობები"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"პირობები"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"პირობების წაკითხვა"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ვაქცინები"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ვაქცინები"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ვაქცინების წაკითხვა"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ლაბორატორიული შედეგები"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ლაბორატორიული შედეგები"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ლაბორატორიული შედეგების წაკითხვა"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"მედიკამენტები"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"მედიკამენტები"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"მედიკამენტების შესახებ მონაცემების წაკითხვა"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"პერსონალური დეტალები"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"პერსონალური დეტალები"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"პერსონალური დეტალების წაკითხვა"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"პრაქტიკოსთა დეტალები"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"პრაქტიკოსთა დეტალები"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"პრაქტიკოსთა დეტალების წაკითხვა"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ორსულობა"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ორსულობა"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ორსულობის შესახებ მონაცემების წაკითხვა"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"პრობლემები"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"პრობლემები"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"პრობლემების შესახებ ინფორმაციის წაკითხვა"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"პროცედურები"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"პროცედურები"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"პროცედურების შესახებ ინფორმაციის წაკითხვა"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"სოციალური ისტორია"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"სოციალური ისტორია"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"სოციალური ისტორია"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"სოციალური ისტორიის შესახებ ინფორმაციის წაკითხვა"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"სასიცოცხლო მაჩვენებლები"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ვიზიტები"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ვიზიტები"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"ვიზიტების წაკითხვა"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"სასიცოცხლო მაჩვენებლები"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"სასიცოცხლო მაჩვენებლები"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"სასიცოცხლო მაჩვენებლების შესახებ ინფორმაციის წაკითხვა"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"გაცნობიერებულობა"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"გაცნობიერებულობის სესიის დაწერა"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"ნება მიეცით „<xliff:g id="APP_NAME">%1$s</xliff:g>“-ს, წაიკითხოს"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"ნება მიეცით „<xliff:g id="APP_NAME">%1$s</xliff:g>“-ს, წეროს"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"გაუქმება"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"დაშვება"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"ყველას დაშვება"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"უარყოფა"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"აირჩიეთ მონაცემები, რომელთა Health Connect-ის მეშვეობით წაკითხვის და ჩაწერის ნებართვის მიცემაც გსურთ ამ აპისთვის"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"აირჩიეთ მონაცემები, რომლებიც გსურთ, რომ ამ აპმა წაიკითხოს ან ჩაიწეროს Health Connect-ში"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"აირჩიეთ მონაცემები, რომლებიც გსურთ, რომ ამ აპმა წაიკითხოს Health Connect-იდან"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"აირჩიეთ მონაცემები, რომლებიც გსურთ, რომ ამ აპმა ჩაიწეროს Health Connect-ში"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"თუ ამ აპს წაკითხვაზე წვდომის ნებართვას მისცემთ, ის შეძლებს როგორც ახალი, ისე ბოლო 30 დღის მონაცემების წაკითხვას"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"თუ წაკითხვაზე წვდომის ნებართვას მისცემთ, აპი შეძლებს ახალი და ძველი მონაცემების წაკითხვას"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"გსურთ <xliff:g id="APP_NAME">%1$s</xliff:g>-ს მიანიჭოთ Health Connect-ზე წვდომა?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"თქვენ შეგიძლიათ გაიგოთ, თუ როგორ ამუშავებს <xliff:g id="APP_NAME">%1$s</xliff:g> თქვენს მონაცემებს დეველოპერებში აქ: <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"მიეცეს <xliff:g id="APP_NAME">%1$s</xliff:g>-ს ფიტნესის და კეთილდღეობის მონაცემებზე წვდომის ნებართვა?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"შეგიძლიათ გაიგოთ, თუ როგორ ამუშავებს <xliff:g id="APP_NAME">%1$s</xliff:g> თქვენს მონაცემებს აქ:<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"კონფიდენციალურობის დებულება"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"გსურთ, მისცეთ წვდომა <xliff:g id="APP_NAME">%1$s</xliff:g>-ს თქვენს ჯანმრთელობის ჩანაწერებზე?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"თუ მისცემთ წვდომას, აპი შეძლებს წაიკითხოს და ჩაიწეროს ისეთი მონაცემები, როგორიცაა ალერგიები, ლაბორატორიული შედეგები, ვაქცინაციები და სხვა\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"თუ მისცემთ წვდომას, აპი შეძლებს წაიკითხოს ისეთი მონაცემები, როგორიცაა ალერგიები, ლაბორატორიული შედეგები, ვაქცინაციები და სხვა\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ჯანმრთელობის ჩანაწერების შესახებ"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"გასაზიარებელი მონაცემები მოიცავს"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"თუ ნებართვას მისცემთ, <xliff:g id="APP_NAME">%1$s</xliff:g> შეძლებს თქვენი ჯანმრთელობის ჩანაწერების გაზიარებას Health Connect-ისთვის."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"თქვენი ჯანმრთელობის ჩანაწერების სინქრონიზაცია სხვადასხვა აპებიდან და წყაროებიდან, მათ ერთ სივრცეში შესანახად"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"გსურთ ყველა ნებართვის გაუქმება?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"ყველას წაშლა"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-იდან რომელიმე მონაცემის წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ მოახდენს სხვა ნებართვებზე, რომლებიც შეიძლება ჰქონდეს ამ აპს — მაგალითად, კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-ის მონაცემების, მათ შორის, წარსული მონაცემების, წაკითხვას ან ჩაწერას.\n\nეს არ იმოქმედებს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად მდებარეობა, კამერა ან მიკროფონი."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-ის მონაცემების, მათ შორის, ფონური და წარსული მონაცემების, წაკითხვას ან ჩაწერას,.\n\nეს არ იმოქმედებს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად მდებარეობა, კამერა ან მიკროფონი."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"წაიშალოს <xliff:g id="APP_NAME">%1$s</xliff:g> აპის მონაცემებიც Health Connect-იდან"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"გსურთ ყველა ნებართვის ამოშლა?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ამოვშალოთ ჯანმრთელობის ჩანაწერების ყველა ნებართვა?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"გავაუქმოთ ფიტნესისა და გაჯანსაღების ყველა ნებართვა?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"ასევე, წაიშალოს ფიტნესის მონაცემების Health Connect-ის <xliff:g id="APP_NAME">%1$s</xliff:g>-იდან."</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ამოვშალოთ ჯანმრთელობის ჩანაწერების ყველა ნებართვა?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"ასევე, წაიშალოს ჯანმრთელობის ჩანაწერები Health Connect-ის <xliff:g id="APP_NAME">%1$s</xliff:g>-იდან."</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-იდან ამ მონაცემების წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ ახდენს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად, კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-იდან ამ მონაცემების, მათ შორის, ფონური მონაცემების, წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ ახდენს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად, კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-იდან ამ მონაცემების, მათ შორის, ძველი მონაცემების, წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ ახდენს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად, კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-იდან ამ მონაცემების, მათ შორის, ფონური და ძველი მონაცემების, წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ ახდენს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად, კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"გსურთ ყველა ნებართვის ამოშლა?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-ის მონაცემების წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ მოახდენს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-ის მონაცემების, მათ შორის, ფონური მონაცემების, წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ მოახდენს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-ის მონაცემების, მათ შორის, ძველი მონაცემების, წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ მოახდენს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვეღარ შეძლებს Health Connect-ის მონაცემების, მათ შორის, ფონური და ძველი მონაცემების, წაკითხვას ან ჩაწერას.\n\nეს გავლენას არ მოახდენს სხვა ნებართვებზე, რომლებიც ამ აპს შეიძლება ჰქონდეს, მაგალითად კამერაზე, მიკროფონზე ან მდებარეობაზე."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"ფიტნესის მონაცემები და ჯანმრთელობის ჩანაწერებიც წაშალეთ Health Connect-ის <xliff:g id="APP_NAME">%1$s</xliff:g> აპიდან"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ამ აპის ნებართვები ამოიშალა"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"ასევე Health Connect-ის ყველა მონაცემის წაშლა"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"შემდეგი დღე"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"შერჩეული დღე"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"წინა დღე"</string>
     <string name="default_error" msgid="7966868260616403475">"რაღაც შეცდომა მოხდა. გთხოვთ, სცადოთ ხელახლა."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"უცნობი რესურსი"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"წყაროს მონაცემები"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>გახსნილი ფრჩხილი."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>დახურული ფრჩხილი."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ველის <xliff:g id="FIELD">%2$s</xliff:g> მნიშვნელობა"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ამ აპებს აღარ აქვთ წვდომა, მაგრამ Health Connect-ში ჯერ კიდევ აქვთ შენახული მონაცემები"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> შეძლებს მონაცემების წაკითხვას <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>-ის შემდეგ"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Android-ის იმ სხვა ნებართვების სამართავად, რომლებზე წვდომაც ამ აპს აქვს, გადადით სექციაზე პარამტრები და აპები"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g>-თან გაზიარებულ მონაცემებზე ვრცელდება ამ აპის კონფიდენციალურობის დებულება"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ის მიერ თქვენი მონაცემების დამუშავების შესახებ ინფორმაციის გაცნობა შეგიძლიათ დეველოპერის კონფიდენციალურობის დებულებაში"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Android-ის იმ სხვა ნებართვების სამართავად, რომლებზე წვდომაც ამ აპს აქვს, გადადით სექციაზე პარამტრები, შემდეგ შეეხეთ აპებს"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"კონფიდენციალურობის დებულების წაკითხვა"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"წვდომა განხორციელდა ბოლო 24 საათში"</string>
     <string name="app_access_title" msgid="7137018424885371763">"აპზე წვდომა"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"თქვენ ამჟამად არ გაქვთ დაინსტალირებული თავსებადი აპები"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"დამატებითი წვდომა"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ძველი მონაცემები, ფონის მონაცემები"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"წაიშალა დამატებითი ნებართვები ამ აპისთვის"</string>
     <string name="permissions_header" msgid="6519976063360071569">"ნებართვები"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ფიტნესი და კეთილდღეობა"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ვარჯიში, ძილი, კვება და სხვა"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"ჯანმრთელობის ჩანაწერები"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ჯანმრთელობის ჩანაწერები"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ლაბორატორიული შედეგები, მედიკამენტები, იმუნიზაციები და სხვა"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ლაბორატორიული შედეგები, მედიკამენტები, ვაქცინები და სხვა"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"აპის ნებართვები ამოიშალა"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect-მა ამოშალა <xliff:g id="APP_DATA">%s</xliff:g> აპის ნებართვები"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect-მა ამოშალა <xliff:g id="APP_DATA_0">%1$s</xliff:g> და <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> აპების ნებართვები"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store-ში გადასვლა"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"დაიწყეთ Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ინახავს თქვენს ჯანმრთელობასა და ფიტნესთან დაკავშირებულ მონაცემებს და გაძლევთ თქვენს მოწყობილობაში სხვადასხვა აპის მარტივი სინქრონიზაციის საშუალებას."</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect სხვადასხვა აპებიდან ინახავს და ახდენს თქვენი ჯანმრთელობის და ფიტნესის მონაცემების სინქრონიზაციას.\n\n"<b>"ფიტნესის და კეთილდღეობის მონაცემები,"</b>" ვარჯიშის სესიების, ნაბიჯების, კვების, ძილის და სხვა ინფორმაციის ჩათვლით\n\n"<b>"ჯანმრთელობის ჩანაწერები,"</b>" ვაქცინების, ლაბორატორიული შედეგების და სხვა ინფორმაციის ჩათვლით"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"რა შეგიძლიათ Health Connect-ის საშუალებით"</string>
     <string name="share_data" msgid="3481932156368883946">"გააზიარეთ ინფორმაცია თქვენს აპებთან"</string>
     <string name="share_data_description" msgid="2919871301634375092">"აირჩიეთ მონაცემები, რომლებიც თითოეულ აპს შეუძლია წაიკითხოს ან ჩაწეროს Health Connect-Ში"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"მართეთ თქვენი პარამეტრები და კონფიდენციალურობა"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"მსუბუქი სისხლდენა"</string>
     <string name="flow_medium" msgid="3783688724668943154">"ზომიერი სისხლდენა"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ძლიერი სისხლდენა"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"უცნობი სისხლდენა"</string>
     <string name="period_day" msgid="3821944462093965882">"პერიოდის დღე: <xliff:g id="DAY">%1$d</xliff:g>/<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{პერიოდი (1 დღე)}other{პერიოდი (# დღე)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"დადებითი"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"უარყოფითი"</string>
     <string name="ovulation_high" msgid="205362931427158291">"მაღალი"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"მუსიკა"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"სხვა"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"დირექტივების გარეშე"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"ზომიერი"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ენერგიული"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> წთ"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>სთ <xliff:g id="MIN">%2$s</xliff:g>წთ"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> სთ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"მიმდინარეობს ინტეგრაცია"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"მიმდინარეობს Health Connect-ის ინტეგრაცია Android სისტემასთან.\n\nთქვენი მონაცემების და ნებართვების გადატანას გარკვუელი დრო დასჭირდება."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"არ დახუროთ აპი სანამ არ მიიღებთ შეტყობინებას იმის შესახებ, რომ ეს პროცესი დასრულებულია."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"მიმდინარეობს Health Connect-ის ინტეგრაცია"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"საჭიროა განახლება"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"მიმდინარეობს Health Connectის-ის იტეგრაცია Android სისტემასთან, ასე რომ შეგიძლიათ უშუალოდ მიწვდეთ თქვენი პარამეტრებიდან."</string>
     <string name="update_button" msgid="4544529019832009496">"განახლება"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"დაიწყეთ ეს განახლება რათა Health Connect-მა შეძლოს ინტეგრაცია თქვენი სისტემის პარამეტრებთან"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ახლავე განახლება"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"საჭიროა სისტემის განახლება"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"გაგრძელებამდე, განაახლეთ თქვენი ტელეფონის სისტემა."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"თუ თქვენ უკვე განაახლეთ თქვენი ტელეფონის სისტემა, სცადეთ ტელეფონის გადატვირთვა ინტეგრაციის გასაგრძელებლად"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect საჭიროებს განახლებას"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"გაგრძელებამდე, განაახლეთ Health Connect აპი ბოლო ვერსიამდე."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"საჭიროა დამატებითი სივრცე"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect საჭიროებს <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> მეხსიერების საცავს თქვენს ტელეფონში ინტეგრაციის გასაგრძელებლად.\n\nგაასუფთავეთ გარკვეული სივრცე თქვენს ტელეფონში და შემდეგ ისევ სცადეთ.."</string>
     <string name="try_again_button" msgid="8745496819992160789">"ხელახლა ცდა"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"მეხსიერების გათავისუფლება"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"საჭიროა დამატებითი სივრცე"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect საჭიროებს <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> მეხსიერებას საცავში თქვენს ტელეფონში ინტეგრაციის გასაგრძელებლად."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ინტეგრაცია დაპაუზებულია"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect-ის აპი დაიხურა მისი Android სისტემასთან ინტეგრაციისას.\n\nდააწკაპუნეთ ღილაკზე „განახლება“ აპის ხელახლა გასახსნელად და გააგრძელეთ თქვენი მონაცემების და ნებართვების გადატანა."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"თქვენი Health Connect-ის მონაცემების შესანახად, დაასრულეთ ეს <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-ში"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"შეეხეთ Health Connect-ის Android სისტემასთან ინტეგრაციის გასაგრძელებლად. თქვენი მონაცემების სისრულის შესანარჩუნებლად, დაასრულეთ ეს <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-ში"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"შეეხეთ Health Connect-ის Android სისტემასთან ინტეგრაციის გასაგრძელებლად."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"გაგრძელება"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"განაახლეთ Health Connect-ის ინტეგრაცია"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"თქვენი მონაცემების სისრულის შესანარჩუნებლად, დაასრულეთ ეს <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-ში"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"საჭიროა აპის განახლება"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> საჭიროებს განახლებებს Health Connect-თან სინქრონიზაციის გასაგრძელებლად"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"ზოგიერთ აპს Health Connect-თან სინქრონიზაციის გასაგრძელებლად სჭირდება განახლება"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> საჭიროებს განახლებებს Health Connect-თან სინქრონიზაციის გასაგრძელებლად. განახლებები შესაძლოა ხელმისაწვდომი არ იყოს ყველა აპისთვის."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"ზოგიერთ აპს Health Connect-თან სინქრონიზაციის გასაგრძელებლად სჭირდება განახლება. განახლებები შესაძლოა ხელმისაწვდომი არ იყოს ყველა აპისთვის."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"განახლებების მოძებნა"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"შეიტყვეთ მეტი"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"მიმდინარეობს Health Connect-ის ინტეგრაცია"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect-ის ინტეგრაცია არ დასრულებულა"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"თქვენ მიიღებთ შეტყობინებას, როდესაც ის კვლავ ხელმისაწვდომი იქნება."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"გასაგებია"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-ის ინტეგრაცია არ დასრულებულა"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"ვრცლად"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-ის ინტეგრაცია დასრულდა"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"გახსნილი"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"სიახლეები"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Health Connect-ზე წვდომა უკვე პირდაპირ თქვენი პარამეტრებიდან შეგიძლიათ. ნებისმიერ დროს შეგიძლიათ Health Connect აპის დეინსტალაცია საცავში მეხსიერების გასათავისუფლებლად."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"გასაგებია"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"აპების წყაროების რედაქტირება"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"მოწყობილობის ნაგულისხმევი"</string>
     <string name="app_data_title" msgid="6499967982291000837">"აპის მონაცემები"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"მონაცემები იმ აპებიდან, რომლებსაც Health Connect-ზე აქვს წვდომა, აქ გამოჩნდება"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"მონაცემები <xliff:g id="APP_NAME">%1$s</xliff:g>-იდან აქ გამოჩნდება"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"მონაცემები იმ აპებიდან, რომლებსაც Health Connect-ზე აქვთ წვდომა, აქ გამოჩნდება"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"დღე"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"კვირა"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"თვე"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"გასული თვე"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ჩანაწერები"</string>
     <string name="tab_access" msgid="7818197975407243701">"წვდომა"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"მიეცეს აპს (<xliff:g id="APP_NAME">%1$s</xliff:g>) დამატებითი წვდომის ნებართვა?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> აპი ასევე ითხოვს Health Connect-ის ამ პარამეტრებზე წვდომას"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ჩართეთ მინიმუმ ერთი წაკითხვის ნებართვა, რათა ჩართოთ ფონურ რეჟიმში ან წარსულ მონაცემებზე წვდომა ამ აპისთვის"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ჩართეთ მინიმუმ ერთი წაკითხვის ნებართვა ამ აპისთვის წვდომის ფონურ რეჟმში ჩართვის მიზნით"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ჩართეთ მინიმუმ ერთი წაკითხვის ნებართვა, რათა ჩართოთ წარსულ მონაცემებზე წვდომა ამ აპისთვის"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect-ის გამოყენების დაწყება"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"მოახდინეთ თქვენი პირველი აპების სინქრონიზაცია, რათა გააზიაროთ ჯანმრთელობის და ფიტნესის მონაცემები მათ შორის"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"დაყენება"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"თავსებადი აპების ნახვა"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect-ის დახმარებით იპოვეთ მეტი აპი <xliff:g id="APP_NAME">%s</xliff:g>-თან სინქრონიზაციისთვის"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"აპების მაღაზიაში ნახვა"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ეკრანის დაბლოკვის დაყენება"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"თქვენი ჯანმრთელობის მონაცემებზე გაძლიერებული უსაფრთხოებისთვის დააყენეთ PIN-კოდი, ნიმუში ან პაროლი ამ მოწყობილობაზე"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ეკრანის დაბლოკვის დაყენება"</string>
     <string name="select_all" msgid="837499881590001166">"ყველას არჩევა"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"დაკავშირებული აპები ვეღარ წაიკითხავს Health Connect-ის ამ მონაცემებს"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"მონიშნულია"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"არ არის მონიშნული"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"ვარჯიშის მარშრუტის რუკა ხელმისაწვდომია"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"შემდეგი დღე"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"შემდეგი კვირა"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"შემდეგი თვე"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"წინა დღე"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"წინა კვირა"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"წინა თვე"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"გსურთ ყველა მონაცემის სამუდამოდ წაშლა?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"გსურთ არჩეული მონაცემების სამუდამოდ წაშლა?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"გსურთ <xliff:g id="APP_NAME">%s</xliff:g>-ის ყველა მონაცემის სამუდამოდ წაშლა?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"გსურთ <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>-ის კვირისთვის <xliff:g id="APP_NAME">%1$s</xliff:g>-ის არჩეული შენატანების სამუდამოდ წაშლა?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"გსურთ <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>-ისთვის <xliff:g id="APP_NAME">%1$s</xliff:g>-ის არჩეული შენატანების სამუდამოდ წაშლა?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"გსურთ ამ <xliff:g id="APP_NAME">%s</xliff:g>-ის შენატანის სამუდამოდ წაშლა?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"გსურთ <xliff:g id="DATA_TYPE">%1$s</xliff:g> მონაცემების სამუდამოდ წაშლა <xliff:g id="APP_NAME">%2$s</xliff:g>-ისთვის?"</string>
+    <string name="on" msgid="8266542510798355807">"ჩართული"</string>
+    <string name="off" msgid="6996623844428550649">"გამორთული"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"წვდომა განხორციელდა: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"წვდომა განხორციელდა გუშინ: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"წვდომა განხორციელდა: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"ყოველთვის დაშვება"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"შერჩეულის დაშვება"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"აპის გამოყენებისას"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"ყველას უარყოფა"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"გსურთ <xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის წვდომის დაშვება ფიტნესის და კეთილდღეობის მონაცემებზე?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს წვდომას <xliff:g id="DATA_TYPES">%2$s</xliff:g>-ზე.\n\nაირჩიეთ ყველას დაშვება ან გააკონტროლეთ ინდივიდუალურად."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"მიეცეს <xliff:g id="APP_NAME">%1$s</xliff:g>-ს <xliff:g id="DATA_TYPE">%2$s</xliff:g>-ზე წვდომის უფლება?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ფიტნესი და კეთილდღეობა"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"მუდმივად"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"გამოყენებისას"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Მუდმივად"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"გამოყენებისას"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს შეუძლია ფიტნესის და კეთილდღეობის თქვენს ნებისმიერ მონაცემზე წვდომა <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"წვდომა დაშვებულია"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"წაკითხვა დაშვებულია"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ეს ნებართვები <xliff:g id="APP_NAME">%1$s</xliff:g>-ს აძლევს წვდომას თქვენი მოწყობილობის სენსორების მონაცემებზე."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"დაშვებულია <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>-დან <xliff:g id="NUMBER_0">%1$d</xliff:g> აპი"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"მოთხოვნა არ არის არცერთი აპისგან"</string>
+    <string name="allowed" msgid="4158456017482263737">"დაშვებულია"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"არ არის დაშვებული"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ნებართვის მქონე აპებს შეუძლია თქვენი მოწყობილობის სენსორებიდან <xliff:g id="DATA_TYPE">%s</xliff:g>-ის მონაცემებზე წვდომა."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"გსურთ <xliff:g id="DATA_TYPE">%s</xliff:g>-ზე წვდომის ამოშლა თქვენი საათის ყველა აპისთვის?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"თოლია"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"ჯვრის ნიშანი"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"ამჟმად, <xliff:g id="APP_NAME">%1$s</xliff:g>-ს შეუძლია წვდომა ჰქონდეს ფიტნესისა და კეთილდღეობის მონაცემებზე (<xliff:g id="ALLOW_MODE">%2$s</xliff:g>)"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"გსურთ დაუშვათ <xliff:g id="APP_NAME">%1$s</xliff:g>-ის ფიტნესისა და კეთილდღეობის თქვენს მონაცემებზე მუდმივი წვდომა?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს აქვს წვდომა მონაცემთა შემდეგ ტიპებზე: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ფიტნესისა და კეთილდღეობის ნებართვების მართვა"</string>
 </resources>
diff --git a/apk/res/values-kk/strings.xml b/apk/res/values-kk/strings.xml
index 340574a..8dd7517 100644
--- a/apk/res/values-kk/strings.xml
+++ b/apk/res/values-kk/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Құрылғыңыздағы денсаулық және фитнес деректерін реттеп, оларды пайдалана алатын қолданбаларды таңдаңыз."</string>
     <string name="data_title" msgid="4456619761533380816">"Деректер және пайдалану рұқсаты"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Денсаулық туралы ақпаратты шолу"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Денсаулық туралы ақпаратты және оны пайдалана алатын қолданбаларды көру"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Барлық санат"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Барлық санатты көру"</string>
     <string name="no_data" msgid="1906986019249068659">"Ешқандай дерек жоқ."</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Кеше"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Оқу: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Жазу: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Рұқсаттарды басқару"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Уақыты: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Қимыл"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"денсаулық деректерін пайдалану рұқсаты"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Жұмсалған калория дерегін оқу"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Қолданбаға жұмсалған калория деректерін оқуға рұқсат береді."</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Фондағы деректерді пайдалану"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына фондағы деректерді пайдалануға рұқсат берілсін бе?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына фондық режимде деректерді пайдалануға рұқсат берілсін бе?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Рұқсат берсеңіз, пайдаланылмаған кезде, бұл қолданба фитнес пен сауықтыру және денсаулық туралы ақпаратты пайдалана алады."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Рұқсат берсеңіз, бұл қолданба сіз оны пайдаланбаған кезде, денсаулық туралы ақпаратты пайдалана алады."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Рұқсат берсеңіз, бұл қолданба сіз оны пайдаланбаған кезде, фитнес пен сауықтыру деректерін пайдалана алады."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Рұқсат берсеңіз, бұл қолданба сіз оны пайдаланбаған кезде, Health Connect деректерін пайдалана алады."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына бұрынғы деректерді пайдалануға рұқсат берілсін бе?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Рұқсат берсеңіз, бұл қолданба <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> күніне дейін фитнес пен сауықтыру деректерін пайдалана алады."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Рұқсат берсеңіз, бұл қолданба барлық бұрынғы фитнес пен сауықтыру дерегін пайдалана алады."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Рұқсат берсеңіз, бұл қолданба <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> күніне дейін қосылған Health Connect деректерін пайдалана алады."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Рұқсат берсеңіз, бұл қолданба бұрынғы барлық Health Connect дерегін пайдалана алады."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына қосымша пайдалану рұқсаты берілсін бе?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы сондай-ақ осы Health Connect параметрлерін пайдалануға рұқсат сұрайды."</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Фондық режимде барлық деректі пайдалану"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Фондық режимде денсаулық туралы ақпаратты пайдалану"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Фондық режимде фитнес пен сауықтыру деректерін пайдалану"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Бұл қолданбаға сіз оны пайдаланбаған кезде, фитнес пен сауықтыру және денсаулық туралы ақпаратты пайдалануға рұқсат беріңіз."</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Бұл қолданбаға сіз оны пайдаланбаған кезде, осы деректерді пайдалануға рұқсат беріңіз."</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Бұл қолданбаға сіз оны пайдаланбаған кезде, осы деректерді пайдалануға рұқсат беріңіз."</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Фондағы деректерді пайдалану"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Бұл қолданбаға сіз оны пайдаланбаған кезде, Health Connect деректерін пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Бұрынғы фитнес пен сауықтыру деректерін пайдалану"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Бұл қолданбаға <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> күніне дейін қосылған деректерді пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Бұл қолданбаға барлық бұрынғы деректі пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Бұрынғы деректерді пайдалану"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Бұл қолданбаға <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> күніне дейін қосылған Health Connect деректерін пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Бұл қолданбаға бұрынғы барлық Health Connect дерегін пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы денсаулық туралы бұрынғы ақпаратты пайдалануға рұқсат алып қойған."</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Рұқсаттар туралы қосымша ақпарат"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Фондық режимде барлық деректі пайдалану"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Фондық режимде денсаулық туралы ақпаратты пайдалану"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Фондық режимде фитнес пен сауықтыру деректерін пайдалану"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Бұл қолданбаға сіз оны пайдаланбаған кезде, фитнес пен сауықтыру және денсаулық туралы ақпаратты пайдалануға рұқсат беріңіз."</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Бұл қолданбаға сіз оны пайдаланбаған кезде, осы деректерді пайдалануға рұқсат беріңіз."</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Бұл қолданбаға сіз оны пайдаланбаған кезде, осы деректерді пайдалануға рұқсат беріңіз."</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Фондағы деректерді пайдалану"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Бұл қолданбаға сіз оны пайдаланбаған кезде, Health Connect деректерін пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Бұрынғы фитнес пен сауықтыру деректерін пайдалану"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Бұл қолданбаға <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> күніне дейін қосылған деректерді пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Бұл қолданбаға барлық бұрынғы деректі пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Бұрынғы деректерді пайдалану"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Бұл қолданбаға <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> күніне дейін қосылған Health Connect деректерін пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Бұл қолданбаға бұрынғы барлық Health Connect дерегін пайдалануға рұқсат беріңіз."</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасында оқу рұқсаттары болмағандықтан, қазіргі уақытта фитнес дерегі оқылып жатқан жоқ."</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы денсаулық туралы бұрынғы ақпаратты пайдалануға рұқсат алып қойған. Мұны өзгерту үшін осы қолданбаның денсаулық туралы ақпаратты пайдалану рұқсаттарын өшіріп қойыңыз."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Денсаулық туралы ақпаратты пайдалану рұқсаттарын басқару"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Осы қолданбаға фондық режимде кіру немесе оның бұрынғы деректерін алу мүмкіндігін іске қосу үшін кемінде бір оқу рұқсатын қосыңыз."</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Осы қолданбаға фондық режимде кіру мүмкіндігін іске қосу үшін кемінде бір оқу рұқсатын қосыңыз."</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Осы қолданбаның бұрынғы деректерін алу мүмкіндігін іске қосу үшін кемінде бір оқу рұқсатын қосыңыз."</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Бұл қолданбаға бұрынғы барлық Health Connect дерегін пайдалануға рұқсат беріңіз."</string>
     <string name="background_read_description" msgid="3203594555849969283">"Бұл қолданбаға сіз оны пайдаланбаған кездегі Health Connect деректерін пайдалануға рұқсат беру"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Рұқсат берсеңіз, бұл қолданба сіз оны пайдаланбаған кездегі Health Connect деректерін пайдалана алады."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Бұрынғы деректерді пайдалану"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына бұрынғы деректерді пайдалануға рұқсат берілсін бе?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Бұл қолданбаға <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> күніне дейін қосылған Health Connect деректерін пайдалануға рұқсат беру"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Бұл қолданбаға бұрынғы барлық Health Connect дерегін пайдалануға рұқсат беру"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Рұқсат берсеңіз, бұл қолданба <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> күніне дейін қосылған Health Connect деректерін пайдалана алады."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Рұқсат берсеңіз, бұл қолданба бұрынғы барлық Health Connect дерегін пайдалана алады."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Қимыл кезінде жұмсалған калория"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"қимыл кезінде жұмсалған калория"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Қимыл кезінде жұмсалған калория деректерін оқу"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"мүгедек арбасын итеру көрсеткіші"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Мүгедек арбасын итеру көрсеткішін оқу"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Мүгедек арбасын итеру көрсеткішін жазу"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Қимыл қарқыны"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"қимыл қарқыны"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Қимыл қарқыны туралы деректі оқу"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Қимыл қарқыны туралы деректі жазу"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Тыныш күйдегі зат алмасу жылдамдығы"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"тыныш күйдегі зат алмасу жылдамдығы"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Тыныш күйдегі зат алмасу жылдамдығы деректерін оқу"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"Тері температурасы"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Тері температурасын оқу"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Тері температурасын жазу"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Бұған Health Connect қолданбасымен синхрондалған және оған қосылған денсаулық туралы бүкіл ақпарат кіреді. Бұны толық медициналық журналыңыз деп есептеуге болмайды және онда денсаулық туралы ақпаратыңыздың медициналық сипаттамасы жоқ."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Денсаулық туралы бүкіл ақпарат"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"денсаулық туралы бүкіл ақпарат"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Денсаулық туралы бүкіл ақпаратты жазу"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Аллергиялар"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"аллергиялар"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Аллергиялар туралы оқу"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Вакцинация"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"вакцинация"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Вакцинация туралы ақпаратты оқу"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Зертханалық нәтижелер"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"зертханалық нәтижелер"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Зертханалық нәтижелерді оқу"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Аллергиялар"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"аллергиялар"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Аллергиялар туралы оқу"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Шарттар"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"шарттар"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Оқу шарттары"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Вакциналар"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"вакциналар"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Вакциналар туралы оқу"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Зертханалық нәтижелер"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"зертханалық нәтижелер"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Зертханалық нәтижелер туралы оқу"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Дәрі-дәрмек"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"дәрі-дәрмек"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Дәрі-дәрмек мәліметін оқу"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Жеке мәліметтер"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"жеке мәліметтер"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Жеке мәліметтерді оқу"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Маман туралы мәліметтер"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"маман туралы мәліметтер"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Маман туралы мәліметтерді оқу"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Жүктілік деректері"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"жүктілік деректері"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Жүктілік деректерін оқу"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Проблемалар"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"проблемалар"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Проблемаларды оқу"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Процедуралар"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"процедуралар"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Процедураларды оқу"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Әлеуметтік тарих"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Әлеуметтік тарих"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"әлеуметтік тарих"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Әлеуметтік тарихты оқу"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Тіршілік үшін маңызды көрсеткіштер"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Дәрігерге бару деректері"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"дәрігерге бару деректері"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Дәрігерге бару деректерін оқу"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Тіршілік үшін маңызды көрсеткіштер"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"тіршілік үшін маңызды көрсеткіштер"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Тіршілік үшін маңызды көрсеткіштерді оқу"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Ой сергектігі"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Ой сергектігі сеансының деректерін жазу"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына оқуға рұқсат беру"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына жазуға рұқсат беру"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Бас тарту"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Рұқсат беру"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Бәріне рұқсат беру"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Рұқсат бермеу"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Бұл қолданба оқитын немесе Health Connect қолданбасына жазатын деректерді таңдаңыз."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Бұл қолданба оқитын немесе Health Connect қолданбасына жазатын деректерді таңдаңыз."</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Бұл қолданба Health Connect қолданбасынан оқитын деректерді таңдаңыз."</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Бұл қолданба Health Connect қолданбасына жазатын деректерді таңдаңыз."</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Оқуға рұқсат берсеңіз, қолданба жаңа деректер мен соңғы 30 күндегі деректерді оқи алады."</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Оқуға рұқсат берсеңіз, қолданба жаңа және бұрынғы деректерді оқи алады."</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына Health Connect-ті пайдалануға рұқсат берілсін бе?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының деректерді өңдеу жолын әзірлеушінің <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> арқылы біле аласыз."</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына фитнес пен сауықтыру деректерін пайдалануға рұқсат берілсін бе?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының деректеріңізді қалай өңдейтіні туралы <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> құжатынан біле аласыз."</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"құпиялық саясаты"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына денсаулық туралы ақпаратыңызды пайдалануға рұқсат берілсін бе?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Рұқсат берсеңіз, қолданба аллергиялар, зертханалық талдау нәтижелері, вакциналар сияқты деректерді оқып, жаза алады.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Рұқсат берсеңіз, қолданба аллергиялар, зертханалық талдау нәтижелері, вакциналар сияқты деректерді оқи алады.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Денсаулық туралы ақпарат"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Бөлісетін деректер"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Рұқсат берсеңіз, <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы денсаулық туралы ақпаратыңызды Health Connect қолданбасымен бөлісе алады."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Әр қолданбадағы және дереккөздегі денсаулық туралы ақпаратты синхрондап, бір жерде сақтаңыз."</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Барлық рұқсатты өшіру керек пе?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Барлығын өшіру"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі деректерді оқи алмайды немесе жаза алмайды.\n\nБұл жағдай локацияны, камераны немесе микрофонды пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі деректерді, соның ішінде бұрынғы деректі оқи немесе жаза алмайды.\n\nБұл локацияны, камераны немесе микрофонды пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі деректерді, соның ішінде фондық және бұрынғы деректі оқи немесе жаза алмайды.\n\nБұл локацияны, камераны немесе микрофонды пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect-тен <xliff:g id="APP_NAME">%1$s</xliff:g> деректері де жойылсын."</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Барлық рұқсатты өшіру керек пе?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Барлық денсаулық туралы ақпарат рұқсатын өшіру керек пе?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Барлық фитнес және сауықтыру рұқсатын өшіру керек пе?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасынан алынған фитнес дерегі де Health Connect-тен жойылсын"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Барлық денсаулық туралы ақпарат рұқсатын өшіру керек пе?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасынан алынған денсаулық туралы ақпарат та Health Connect-тен жойылсын"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі осы деректерді оқи немесе жаза алмайды.\n\nБұл камераны, микрофонды немесе локацияны пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі осы деректерді, соның ішінде фондық деректерді оқи немесе жаза алмайды.\n\nБұл камераны, микрофонды немесе локацияны пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі осы деректерді, соның ішінде бұрынғы деректерді оқи немесе жаза алмайды.\n\nБұл камераны, микрофонды немесе локацияны пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі осы деректерді, соның ішінде фондық және бұрынғы деректерді оқи немесе жаза алмайды.\n\nБұл камераны, микрофонды немесе локацияны пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Барлық рұқсатты өшіру керек пе?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі деректерді оқи немесе жаза алмайды.\n\nБұл жайт камераны, микрофонды немесе локацияны пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі деректерді, соның ішінде фондық деректерді оқи немесе жаза алмайды.\n\nБұл жайт камераны, микрофонды немесе локацияны пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі деректерді, соның ішінде бұрынғы деректерді оқи немесе жаза алмайды.\n\nБұл жайт камераны, микрофонды немесе локацияны пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы бұдан былай Health Connect-тегі деректерді, соның ішінде фондық және бұрынғы деректерді оқи немесе жаза алмайды.\n\nБұл жайт камераны, микрофонды немесе локацияны пайдалану сияқты осы қолданбадағы басқа рұқсаттарға әсер етпейді."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасынан алынған фитнес дерегі мен денсаулық туралы ақпарат та Health Connect-тен жойылсын"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Осы қолданбаға арналған рұқсаттар өшірілді."</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Барлық Health Connect дерегін де жою"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Келесі күн"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Таңдалған күн"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Алдыңғы күн"</string>
     <string name="default_error" msgid="7966868260616403475">"Бірдеңе дұрыс болмады. Қайталап көріңіз."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Белгісіз ресурс"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Бастапқы деректер"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Ашылатын жақша."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Жабылатын жақша."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Өріс (<xliff:g id="FIELD">%2$s</xliff:g>) Мән"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Бұл қолданбалардың енді рұқсаты жоқ, бірақ олардың деректері бұрынғыша Health Connect-те сақталады."</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> күнінен кейін қосылған деректерді оқи алады."</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Осы қолданба пайдалана алатын Android жүйесіндегі басқа рұқсаттарды басқару үшін \"Параметрлер &gt; Қолданбалар\" тармағына өтіңіз."</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасымен бөлісетін деректерге оның құпиялық саясаты қолданылады."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының деректеріңізді өңдеу жолын әзірлеушінің құпиялық саясатынан біле аласыз."</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Осы қолданба пайдалана алатын Android жүйесіндегі басқа рұқсаттарды басқару үшін параметрлердегі \"Қолданбалар\" бөліміне өтіңіз."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Құпиялық саясатын оқу"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Соңғы 24 сағатта пайдаланылды."</string>
     <string name="app_access_title" msgid="7137018424885371763">"Қолданба рұқсаты"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Орнатылған үйлесімді қолданбалар жоқ"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Қосымша пайдалану рұқсаты"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Бұрынғы деректер, фондық деректер"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Бұл қолданбаның қосымша рұқсаттары өшірілді."</string>
     <string name="permissions_header" msgid="6519976063360071569">"Рұқсаттар"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Фитнес пен денсаулық"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Жаттығу, ұйқы, тамақтану және басқалары"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Денсаулық туралы ақпарат"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"денсаулық туралы ақпарат"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Зертханалық тест нәтижелері, дәрілер, екпелер мен басқалары"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Зертханалық нәтижелер, дәрі-дәрмектер, вакциналар және т.б."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Қолданба рұқсаттары өшірілді"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect платформасы <xliff:g id="APP_DATA">%s</xliff:g> қолданбасы үшін рұқсаттарды өшірді."</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect платформасы <xliff:g id="APP_DATA_0">%1$s</xliff:g> және <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> қолданбалары үшін рұқсаттарды өшірді."</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store дүкеніне өту"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect қолданбасымен жұмысты бастау"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect денсаулық және фитнес деректерін сақтап, құрылғыда әртүрлі қолданбаны синхрондаудың қарапайым жолын ұсынады."</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect әртүрлі қолданбалардағы денсаулық және фитнес деректерін сақтайды және синхрондайды.\n\n"<b>"Фитнес және сауықтыру деректері,"</b>" соның ішінде жаттығулар, қадамдар, тамақтану, ұйқы және т.б.\n\n"<b>"Денсаулық туралы ақпарат,"</b>" соның ішінде вакциналар, зертханалық нәтижелер және т.б."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect қолданбасымен мына әрекеттерді орындай аласыз:"</string>
     <string name="share_data" msgid="3481932156368883946">"Деректерді қолданбалармен бөлісу"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Әр қолданба оқи алатын немесе Health Connect қолданбасына жаза алатын деректерді таңдауға болады."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Параметрлерді және құпиялықты басқару"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Аз мөлшердегі бөлініс"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Орташа мөлшердегі бөлініс"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Көп мөлшердегі бөлініс"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Етеккір ағыны"</string>
     <string name="period_day" msgid="3821944462093965882">"Етеккір: <xliff:g id="DAY">%1$d</xliff:g>/<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> күн"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Етеккір (1 күн)}other{Етеккір (# күн)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Оң"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Теріс"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Жоғары"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Музыка"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Басқа"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Көмекшісіз"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Орташа"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Қарқынды"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> мин"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> сағ <xliff:g id="MIN">%2$s</xliff:g> мин"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> сағ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Біріктіру процесі орындалып жатыр"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect қолданбасы Android жүйесімен біріктіріліп жатыр.\n\nДеректер мен рұқсаттардың тасымалдануына біраз уақыт кетуі мүмкін."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Процестің аяқталғаны жөнінде хабарландыру алғанша, қолданбаны жаппаңыз."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect-ті біріктіру процесі орындалып жатыр"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Жаңарту қажет"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect қолданбасы Android жүйесімен біріктіріліп жатыр, сондықтан қолданбаны тікелей параметрлерден пайдалана аласыз."</string>
     <string name="update_button" msgid="4544529019832009496">"Жаңарту"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Жаңартуды бастасаңыз, Health Connect қолданбасын жүйе параметрлерімен біріктіру процесін жалғастыра аласыз."</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Қазір жаңарту"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Жүйені жаңарту қажет"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Жалғастырмас бұрын, телефондағы операциялық жүйені жаңартыңыз."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Телефондағы операциялық жүйені жаңартып қойсаңыз, біріктіру процесін жалғастыру үшін телефонды өшіріп, сосын қосып көріңіз."</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect-тің жаңа нұсқасын орнату қажет"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Жалғастырмас бұрын, Health Connect қолданбасын соңғы нұсқаға жаңартыңыз."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Қосымша орын қажет"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect-ті біріктіру процесін жалғастыру үшін телефонда <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> жад көлемі қажет.\n\nТелефонда біраз орын босатып, әрекетті қайталап көріңіз."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Қайталау"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Орын босату"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Қосымша орын қажет"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect-ті біріктіру процесін жалғастыру үшін телефонда <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> жад көлемі қажет."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Біріктіру процесі кідіртілді"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect қолданбасы Android жүйесімен біріктіру кезінде жабылды.\n\n\"Жалғастыру\" түймесін басып, қолданбаны қайта ашыңыз және деректер мен рұқсаттарды тасымалдай беріңіз."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect деректерін сақтап қалу үшін процесті <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ішінде аяқтаңыз."</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect-ті Android жүйесімен біріктіру процесін жалғастыру үшін түртіңіз. Деректерді сақтап қалу үшін процесті <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ішінде аяқтаңыз."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect-ті Android жүйесімен біріктіру процесін жалғастыру үшін түртіңіз."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Жалғастыру"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect-ті біріктіру процесін жалғастырыңыз"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Деректерді сақтап қалу үшін процесті <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ішінде аяқтаңыз."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Қолданбаның жаңа нұсқасын орнату қажет"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect платформасымен синхрондала беруі үшін, <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасын жаңарту керек."</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect платформасымен синхрондала беруі үшін, кейбір қолданбаларды жаңарту керек."</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect платформасымен синхрондала беруі үшін, <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасын жаңарту керек. Қолданбалардың бәрінде жаңа нұсқа бола бермейді."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect платформасымен синхрондала беруі үшін, кейбір қолданбаларды жаңарту керек. Қолданбалардың бәрінде жаңа нұсқа бола бермейді."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Жаңартулардың бар-жоғын тексеру"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Толық ақпарат"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-ті біріктіру"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect-ті біріктіру процесі аяқталмады"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Біріктіру процесі қайта басталғанда хабарландыру жіберіледі."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Түсінікті"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-ті біріктіру процесі аяқталмады"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Толық оқу"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-ті біріктіру процесі аяқталды"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Ашу"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Жаңалық"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Енді Health Connect-ті тікелей параметрлерден пайдалана аласыз. Жад көлемін босату үшін Health Connect қолданбасын кез келген уақытта жойыңыз."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Түсінікті"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Қолданба дереккөздерін өзгерту"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Құрылғының әдепкі қолданбасы"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Қолданба деректері"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect-ке кіру рұқсаты бар қолданбалардан алынған дерек осы жерде көрсетіледі."</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> деректері осы жерде көрсетіледі."</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect-ке кіру рұқсаты бар қолданбалардан алынған дерек осы жерде көрсетіледі."</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Күн"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Апта"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Ай"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Өткен ай"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Жазбалар"</string>
     <string name="tab_access" msgid="7818197975407243701">"Пайдалану рұқсаты"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына қосымша пайдалану рұқсаты берілсін бе?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы сондай-ақ осы Health Connect параметрлерін пайдалануға рұқсат сұрайды."</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Осы қолданбаға фондық режимде кіру немесе оның бұрынғы деректерін алу мүмкіндігін іске қосу үшін кемінде бір оқу рұқсатын қосыңыз."</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Осы қолданбаға фондық режимде кіру мүмкіндігін іске қосу үшін кемінде бір оқу рұқсатын қосыңыз."</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Осы қолданбаның бұрынғы деректерін алу мүмкіндігін іске қосу үшін кемінде бір оқу рұқсатын қосыңыз."</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect-ті қолдануды бастаңыз"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Қолданбалар арасында денсаулық және фитнес деректерін жіберу үшін, оларды синхрондаңыз."</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Реттеу"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Үйлесімді қолданбаларды көріңіз"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect арқылы <xliff:g id="APP_NAME">%s</xliff:g> қызметімен қандай қолданбаларды синхрондауға болатынын табыңыз."</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"App Store-дан көру"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Экран құлпын орнатыңыз"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Денсаулық деректерінің қауіпсіздігін арттыру үшін, осы құрылғыға PIN кодын, өрнек немесе құпия сөз орнатыңыз."</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Экран құлпын орнату"</string>
     <string name="select_all" msgid="837499881590001166">"Барлығын таңдау"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Байланысқан қолданбалар бұдан былай Health Connect-тегі бұл деректерді оқи алмайды."</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Құсбелгі қойылған"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Құсбелгі қойылмаған"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Жаттығу картасының бағыты шықты."</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Келесі күн"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Келесі апта"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Келесі ай"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Алдыңғы күн"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Алдыңғы апта"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Алдыңғы ай"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Барлық дерек біржола жойылсын ба?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Таңдалған деректер біржола жойылсын ба?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Барлық <xliff:g id="APP_NAME">%s</xliff:g> дерегі біржола жойылсын ба?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Белгілі бір апта (<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>) бойынша таңдалған <xliff:g id="APP_NAME">%1$s</xliff:g> жазбалары біржола жойылсын ба?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Белгілі бір ай (<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>) бойынша таңдалған <xliff:g id="APP_NAME">%1$s</xliff:g> жазбалары біржола жойылсын ба?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Бұл <xliff:g id="APP_NAME">%s</xliff:g> жазбасы біржола жойылсын ба?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасындағы <xliff:g id="DATA_TYPE">%1$s</xliff:g> деректерін біржола жою керек пе?"</string>
+    <string name="on" msgid="8266542510798355807">"Қосулы"</string>
+    <string name="off" msgid="6996623844428550649">"Өшірулі"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Пайдаланылған уақыты: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Кеше пайдаланылған уақыты: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Пайдаланылған уақыты: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Біржола рұқсат ету"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Таңдалғандарға рұқсат беру"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Қолданбаны пайдаланған кезде"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Барлығын мақұлдамау"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына фитнес пен сауықтыру деректерін пайдалануға рұқсат берілсін бе?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DATA_TYPES">%2$s</xliff:g> дерегін пайдалану рұқсатын сұрап жатыр.\n\nБарлығына рұқсат беруді таңдаңыз немесе әрқайсысын жеке-жеке басқарыңыз."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына деректерді (<xliff:g id="DATA_TYPE">%2$s</xliff:g>) пайдалануға рұқсат етілсін бе?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Фитнес пен денсаулық"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"әрдайым"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"қолданыс кезінде"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Әрдайым"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Қолданыс кезінде"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы барлық фитнес пен денсаулыққа қатысты дерегіңізді <xliff:g id="ALLOW_MODE">%2$s</xliff:g> пайдалана алады."</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Пайдалануға рұқсат берілген"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Оқуға рұқсат берілген"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Бұл рұқсаттар <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына құрылғыңыздың датчиктерінен алынған деректерді пайдалануға мүмкіндік береді."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> қолданбаға рұқсат берілген"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Рұқсат сұрап жатқан қолданбалар жоқ"</string>
+    <string name="allowed" msgid="4158456017482263737">"Рұқсат берілген"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Рұқсат берілмеген"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Осы рұқсат берілген қолданбалар құрылғыңыздың датчиктерінен алынған <xliff:g id="DATA_TYPE">%s</xliff:g> деректерін пайдалана алады."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Сағатыңызда барлық қолданба үшін <xliff:g id="DATA_TYPE">%s</xliff:g> пайдалану рұқсатын өшіру керек пе?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Құсбелгі"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Айқас белгі"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Қазір <xliff:g id="APP_NAME">%1$s</xliff:g> фитнес пен сауықтыру деректерін (<xliff:g id="ALLOW_MODE">%2$s</xliff:g> режимінде) пайдалана алады."</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына фитнес пен сауықтыру деректерін пайдалануға біржола рұқсат берілсін бе?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының мынадай деректерді пайдалануға рұқсаты бар: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Фитнес пен сауықтыру дерегін пайдалану рұқсаттарын басқару"</string>
 </resources>
diff --git a/apk/res/values-km/strings.xml b/apk/res/values-km/strings.xml
index edbcdbd..afd944c 100644
--- a/apk/res/values-km/strings.xml
+++ b/apk/res/values-km/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"គ្រប់គ្រងទិន្នន័យសុខភាព និងសម្បទានៅលើឧបករណ៍របស់អ្នក និងគ្រប់គ្រងថាតើកម្មវិធីណាខ្លះអាចចូលប្រើទិន្នន័យនេះបាន"</string>
     <string name="data_title" msgid="4456619761533380816">"ទិន្នន័យ និងការចូលប្រើ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"រុករកកំណត់ត្រាសុខភាព"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"មើលកំណត់ត្រាសុខភាពរបស់អ្នក និងកម្មវិធីណាខ្លះដែលអាចចូលប្រើកំណត់ត្រាទាំងនោះបាន"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"គ្រប់ប្រភេទ"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"មើលប្រភេទទាំងអស់"</string>
     <string name="no_data" msgid="1906986019249068659">"គ្មាន​ទិន្នន័យទេ"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ម្សិលមិញ"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"អាន៖ <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"សរសេរ៖ <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"គ្រប់គ្រង​ការអនុញ្ញាត"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"ម៉ោង៖ <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"សកម្មភាព"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ចូលប្រើទិន្នន័យសុខភាពរបស់អ្នក"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"អានកាឡូរីដែលបានដុត"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"អនុញ្ញាតឱ្យកម្មវិធីអានកាឡូរីដែលបានដុត"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"ចូលប្រើទិន្នន័យនៅផ្ទៃខាងក្រោយ"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើទិន្នន័យនៅផ្ទៃខាងក្រោយឬ?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើទិន្នន័យនៅផ្ទៃខាងក្រោយឬ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាព ព្រមទាំងកំណត់ត្រាសុខភាព នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ។"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើកំណត់ត្រាសុខភាព នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ។"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាព នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ។"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យ Health Connect នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ។"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើទិន្នន័យពីមុនឬ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពដែលបានបញ្ចូលមុនថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>។"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពទាំងអស់។"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យ Health Connect ដែលបានបញ្ចូលមុនថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>។"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យ Health Connect ពីមុនទាំងអស់។"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"អនុញ្ញាតសិទ្ធិចូលប្រើបន្ថែមសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> ក៏ចង់ចូលប្រើការកំណត់ Health Connect ទាំងនេះផងដែរ"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"ចូលប្រើទិន្នន័យទាំងអស់នៅផ្ទៃខាងក្រោយ"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ចូលប្រើកំណត់ត្រាសុខភាពនៅផ្ទៃខាងក្រោយ"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពនៅផ្ទៃខាងក្រោយ"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាព ព្រមទាំងកំណត់ត្រាសុខភាព នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យនេះ នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យនេះ នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"ចូលប្រើទិន្នន័យនៅផ្ទៃខាងក្រោយ"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពពីមុន"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យដែលបានបញ្ចូលនៅមុនថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យពីមុនទាំងអស់"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"ចូលប្រើទិន្នន័យពីមុន"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect ដែលបានបញ្ចូលមុនថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect ពីមុនទាំងអស់"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> អាចចូលប្រើទិន្នន័យពីមុនស្រាប់ហើយសម្រាប់កំណត់ត្រាសុខភាពរបស់អ្នក"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"អានបន្ថែមទៀតអំពីការអនុញ្ញាត"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"ចូលប្រើទិន្នន័យទាំងអស់នៅផ្ទៃខាងក្រោយ"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ចូលប្រើកំណត់ត្រាសុខភាពនៅផ្ទៃខាងក្រោយ"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពនៅផ្ទៃខាងក្រោយ"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាព ព្រមទាំងកំណត់ត្រាសុខភាព នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យនេះ នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យនេះ នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"ចូលប្រើទិន្នន័យនៅផ្ទៃខាងក្រោយ"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពពីមុន"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យដែលបានបញ្ចូលនៅមុនថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យពីមុនទាំងអស់"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"ចូលប្រើទិន្នន័យពីមុន"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect ដែលបានបញ្ចូលមុនថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect ពីមុនទាំងអស់"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"បច្ចុប្បន្ន មិនមានទិន្នន័យ​សម្បទាដែលត្រូវបានអានទេ ដោយសារ <xliff:g id="APP_NAME">%1$s</xliff:g> មិនត្រូវបានបើកការអនុញ្ញាតឱ្យ​អាន"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> អាចចូលប្រើទិន្នន័យពីមុនស្រាប់ហើយសម្រាប់កំណត់ត្រាសុខភាពរបស់អ្នក។ ដើម្បីផ្លាស់ប្ដូរការចូលប្រើនេះ សូមបិទការអនុញ្ញាតឱ្យប្រើកំណត់ត្រាសុខភាពសម្រាប់កម្មវិធីនេះ"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"គ្រប់គ្រងការអនុញ្ញាតឱ្យប្រើកំណត់ត្រាសុខភាព"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"បើកការអនុញ្ញាតឱ្យ​អានយ៉ាងតិចមួយ ដើម្បីបើកការចូលប្រើទិន្នន័យពីមុន ឬផ្ទៃខាងក្រោយសម្រាប់កម្មវិធីនេះ"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"បើកការអនុញ្ញាតឱ្យ​អានយ៉ាងតិចមួយ ដើម្បីបើកការ​ចូលប្រើ​ផ្ទៃ​ខាងក្រោយសម្រាប់កម្មវិធីនេះ"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"បើកការអនុញ្ញាតឱ្យ​អានយ៉ាងតិចមួយ ដើម្បីបើកការចូលប្រើទិន្នន័យពីមុនសម្រាប់កម្មវិធីនេះ"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect ពីមុនទាំងអស់"</string>
     <string name="background_read_description" msgid="3203594555849969283">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យ Health Connect នៅពេលអ្នកមិនកំពុងប្រើកម្មវិធីនេះ។"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"ចូលប្រើទិន្នន័យពីមុន"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើទិន្នន័យពីមុនឬ?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect ដែលបានបញ្ចូលមុនថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"អនុញ្ញាតឱ្យកម្មវិធីនេះចូលប្រើទិន្នន័យ Health Connect ពីមុនទាំងអស់"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យ Health Connect ដែលបានបញ្ចូលមុនថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>។"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ប្រសិនបើអ្នកអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើទិន្នន័យ Health Connect ពីមុនទាំងអស់។"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"កាឡូរីសកម្មដែលបានដុត"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"កាឡូរីសកម្មដែលបានដុត"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"អានកាឡូរីសកម្មដែលបានដុត"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ចំនួនរុញរទេះរុញ"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"អានចំនួនរុញរទេះរុញ"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"សរសេរចំនួនរុញរទេះរុញ"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"កម្រិតសកម្មភាព"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"កម្រិតសកម្មភាព"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"អានកម្រិតសកម្មភាព"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"សរសេរកម្រិតសកម្មភាព"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"អត្រាមេតាបូលីសគោល"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"អត្រាមេតាបូលីសគោល"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"អាន​អត្រាមេតាបូលីសគោល"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"សីតុណ្ហភាពស្បែក"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"អានសីតុណ្ហភាពស្បែក"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"សរសេរសីតុណ្ហភាពស្បែក"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"ចំណុចនេះរួមបញ្ចូលទាំងកំណត់ត្រាសុខភាពទាំងអស់ដែលបានធ្វើសមកាលកម្ម និងបញ្ចូលទៅ Health Connect។ ករណីនេះប្រហែលជាមិនមែនជាកំណត់ត្រាវេជ្ជសាស្រ្តពេញលេញរបស់អ្នកទេ និងមិនរួមបញ្ចូលការពណ៌នាផ្នែកវេជ្ជសាស្ត្រអំពីកំណត់ត្រាសុខភាពរបស់អ្នកទេ។"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"កំណត់ត្រាសុខភាពទាំងអស់"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"កំណត់ត្រាសុខភាពទាំងអស់"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"សរសេរកំណត់ត្រាសុខភាពទាំងអស់"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"អាឡែហ្ស៊ី"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"អាឡែហ្ស៊ី"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"អាន​ទិន្នន័យ​អាឡែហ្ស៊ី"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ការចាក់ថ្នាំបង្ការ"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ការចាក់ថ្នាំបង្ការ"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"អានអំពីការចាក់ថ្នាំបង្ការ"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"លទ្ធផលមន្ទីរពិសោធន៍"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"លទ្ធផលមន្ទីរពិសោធន៍"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"អានលទ្ធផលមន្ទីរពិសោធន៍"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"អាឡែហ្ស៊ី"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"អាឡែហ្ស៊ី"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"អាន​ទិន្នន័យ​អាឡែហ្ស៊ី"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"លក្ខខណ្ឌ"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"លក្ខខណ្ឌ"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"អានលក្ខខណ្ឌ"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"វ៉ាក់សាំង"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"វ៉ាក់សាំង"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"អាន​វ៉ាក់សាំង"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"លទ្ធផល​ពីមន្ទីរពិសោធន៍"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"លទ្ធផល​ពីមន្ទីរពិសោធន៍"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"អាន​លទ្ធផល​ពីមន្ទីរពិសោធន៍"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ការប្រើឱសថ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ការប្រើឱសថ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"អានអំពីការប្រើឱសថ"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ព័ត៌មានលម្អិត​ផ្ទាល់ខ្លួន"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ព័ត៌មានលម្អិត​ផ្ទាល់ខ្លួន"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"អានព័ត៌មានលម្អិត​ផ្ទាល់ខ្លួន"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"ព័ត៌មានលម្អិតអំពីអ្នកប្រកបវិជ្ជាជីវៈ"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"ព័ត៌មានលម្អិតអំពីអ្នកប្រកបវិជ្ជាជីវៈ"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"អានព័ត៌មានលម្អិតអំពីអ្នកប្រកបវិជ្ជាជីវៈ"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ការមានគភ៌"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ការមានគភ៌"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"អានការមានគភ៌"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"បញ្ហា"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"បញ្ហា"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"អានបញ្ហា"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"នីតិវិធី"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"នីតិវិធី"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"អាននីតិវិធី"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"ប្រវត្តិបណ្ដាញសង្គម"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ប្រវត្តិបណ្ដាញ​សង្គម"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ប្រវត្តិបណ្ដាញសង្គម"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"អានប្រវត្តិបណ្ដាញសង្គម"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"សញ្ញាសរីរាង្គសំខាន់ៗ"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ជំនួប"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ជំនួប"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"អានអំពីជំនួប"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"សញ្ញា​ជីវិត"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"សញ្ញាសរីរាង្គសំខាន់ៗ"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"អានសញ្ញាសរីរាង្គសំខាន់ៗ"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"ការ​ចេះ​គិត​គូរ"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"សរសេរទិន្នន័យអំពីការ​ចេះ​គិត​គូរ"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"អនុញ្ញាតឱ្យ “<xliff:g id="APP_NAME">%1$s</xliff:g>” អាន"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"អនុញ្ញាតឱ្យ “<xliff:g id="APP_NAME">%1$s</xliff:g>” សរសេរ"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"បោះបង់"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"អនុញ្ញាត"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"អនុញ្ញាតទាំងអស់"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"កុំអនុញ្ញាត"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"ជ្រើសរើសទិន្នន័យដែលអ្នកចង់ឱ្យកម្មវិធីនេះអាន ឬសរសេរទៅ Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"ជ្រើសរើសទិន្នន័យដែលអ្នកចង់ឱ្យកម្មវិធីនេះអាន ឬសរសេរទៅ Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"ជ្រើសរើសទិន្នន័យដែលអ្នកចង់ឱ្យកម្មវិធីនេះអានពី Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"ជ្រើសរើសទិន្នន័យដែលអ្នកចង់ឱ្យកម្មវិធីនេះសរសេរទៅ Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"ប្រសិនបើអ្នកផ្ដល់សិទ្ធិចូលអាន កម្មវិធីនេះអាចអានទិន្នន័យថ្មី និងទិន្នន័យពី 30 ថ្ងៃចុងក្រោយ"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"ប្រសិនបើអ្នកផ្ដល់សិទ្ធិចូលអាន កម្មវិធីនេះអាចអានទិន្នន័យថ្មី និងពីមុន"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើ Health Connect ឬ?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"អ្នកអាចស្វែងយល់អំពីរបៀបដែល <xliff:g id="APP_NAME">%1$s</xliff:g> ចាត់ចែងទិន្នន័យរបស់អ្នកនៅក្នុង<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>របស់អ្នកអភិវឌ្ឍន៍"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពឬ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"អ្នកអាចស្វែងយល់អំពីរបៀបដែល <xliff:g id="APP_NAME">%1$s</xliff:g> ចាត់ចែងទិន្នន័យរបស់អ្នកនៅក្នុង<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>របស់កម្មវិធីនោះ"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"គោលការណ៍ឯកជនភាព"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើកំណត់ត្រាសុខភាពរបស់អ្នកឬ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"ប្រសិនបើអ្នកផ្ដល់សិទ្ធិចូលប្រើ កម្មវិធីអាចអាន និងសរសេរទិន្នន័យ ដូចជាអាឡែហ្ស៊ី លទ្ធផលមន្ទីរពិសោធន៍ វ៉ាក់សាំង និងអ្វីៗជាច្រើនទៀត\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"ប្រសិនបើអ្នកផ្ដល់សិទ្ធិចូលប្រើ កម្មវិធីអាចអានទិន្នន័យ ដូចជាអាឡែហ្ស៊ី លទ្ធផលមន្ទីរពិសោធន៍ វ៉ាក់សាំង និងអ្វីៗជាច្រើនទៀត\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"អំពីកំណត់ត្រាសុខភាព"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"ទិន្នន័យដែលត្រូវចែករំលែករួមមាន"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"ប្រសិនបើអ្នកអនុញ្ញាត <xliff:g id="APP_NAME">%1$s</xliff:g> អាចចែករំលែកកំណត់ត្រាសុខភាពរបស់អ្នកជាមួយ Health Connect។"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"ធ្វើសមកាលកម្មកំណត់ត្រាសុខភាពរបស់អ្នកពីប្រភព និងកម្មវិធីផ្សេងៗរបស់អ្នក ដើម្បីរក្សាទុកកំណត់ត្រាទាំងនេះក្នុងកន្លែងតែមួយ"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"ដក​ការអនុញ្ញាត​ទាំងអស់​ឬ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"ដកចេញទាំងអស់"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យពី Health Connect បានទៀតទេ។\n\nការធ្វើបែបនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងទេ។"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យណាមួយពី Health Connect រួមទាំងទិន្នន័យពីមុនបានទៀតទេ។\n\nការធ្វើបែបនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាទីតាំង កាមេរ៉ា ឬមីក្រូហ្វូនជាដើមទេ។"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យណាមួយពី Health Connect រួមទាំងទិន្នន័យ​ផ្ទៃ​ខាង​ក្រោយ និងទិន្នន័យពីមុនបានទៀតទេ។\n\nការធ្វើបែបនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាទីតាំង កាមេរ៉ា ឬមីក្រូហ្វូនជាដើមទេ។"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"លុបទិន្នន័យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចេញពី Health Connect ផងដែរ"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ដក​ការអនុញ្ញាត​ទាំងអស់​ឬ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ដកការអនុញ្ញាតឱ្យប្រើកំណត់ត្រាសុខភាពទាំងអស់ឬ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ដកការអនុញ្ញាតឱ្យប្រើសុខុមាលភាព និងសម្បទាទាំងអស់ចេញឬ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"លុបទិន្នន័យ​សម្បទាពី <xliff:g id="APP_NAME">%1$s</xliff:g> ចេញពី Health Connect ផងដែរ"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ដកការអនុញ្ញាតឱ្យប្រើកំណត់ត្រាសុខភាពទាំងអស់ឬ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"លុបកំណត់ត្រាសុខភាពពី <xliff:g id="APP_NAME">%1$s</xliff:g> ចេញពី Health Connect ផងដែរ"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យនេះពី Health Connect បានទៀតទេ។\n\nសកម្មភាពនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងជាដើម។"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យនេះពី Health Connect រួមទាំងទិន្នន័យ​ផ្ទៃ​ខាង​ក្រោយបានទៀតទេ។\n\nសកម្មភាពនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងជាដើម។"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យនេះពី Health Connect រួមទាំងទិន្នន័យពីមុនបានទៀតទេ។\n\nសកម្មភាពនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងជាដើម។"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យនេះពី Health Connect រួមទាំងទិន្នន័យពីមុន និងផ្ទៃខាងក្រោយបានទៀតទេ។\n\nសកម្មភាពនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងជាដើម។"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ដក​ការអនុញ្ញាត​ទាំងអស់​ឬ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យពី Health Connect បានទៀតទេ។\n\nសកម្មភាពនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងទេ។"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យពី Health Connect រួមទាំងទិន្នន័យ​ផ្ទៃ​ខាង​ក្រោយបានទៀតទេ។\n\nសកម្មភាពនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងទេ។"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យពី Health Connect រួមទាំងទិន្នន័យពីមុនបានទៀតទេ។\n\nសកម្មភាពនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងទេ។"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> នឹងមិនអាចអាន ឬសរសេរទិន្នន័យពី Health Connect រួមទាំងទិន្នន័យពីមុន និងផ្ទៃខាងក្រោយបានទៀតទេ។\n\nសកម្មភាពនេះមិនប៉ះពាល់ដល់ការអនុញ្ញាតផ្សេងទៀត​ដែលកម្មវិធីនេះអាចមាន ដូចជាកាមេរ៉ា មីក្រូហ្វូន ឬទីតាំងទេ។"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"លុបទិន្នន័យ​សម្បទា និងកំណត់ត្រាសុខភាពពី <xliff:g id="APP_NAME">%1$s</xliff:g> ចេញពី Health Connect ផងដែរ"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"បានដកការអនុញ្ញាតចេញសម្រាប់កម្មវិធីនេះ"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"លុបទិន្នន័យ Health Connect ទាំងអស់ផងដែរ"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"ថ្ងៃ​បន្ទាប់"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"ថ្ងៃដែលបានជ្រើសរើស"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"ថ្ងៃ​មុន"</string>
     <string name="default_error" msgid="7966868260616403475">"មានអ្វីមួយខុសប្រក្រតី។ សូមព្យាយាមម្ដងទៀត។"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"ធនធាន​ដែលមិនស្គាល់"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ទិន្នន័យប្រភព"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>វង់តង្កៀប​បើក។"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>វង់តង្កៀបបិទ។"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> កន្លែងបញ្ចូល <xliff:g id="FIELD">%2$s</xliff:g> តម្លៃ"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"កម្មវិធីទាំងនេះ​លែង​មាន​សិទ្ធិ​ចូល​ប្រើប្រាស់​ទៀតហើយ ប៉ុន្តែ​នៅតែ​រក្សាទុក​ទិន្នន័យ​នៅក្នុង Health Connect ដដែល"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> អាចអានទិន្នន័យ​ដែលបានបញ្ចូល​ក្រោយថ្ងៃទី <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ដើម្បីគ្រប់គ្រងការអនុញ្ញាត Android ផ្សេងទៀតដែលកម្មវិធីនេះអាចចូលប្រើប្រាស់ សូមចូលទៅកាន់ការកំណត់ &gt; កម្មវិធី"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"ទិន្នន័យដែលអ្នកចែករំលែកជាមួយ <xliff:g id="APP_NAME">%1$s</xliff:g> ត្រូវអនុលោមតាមគោលការណ៍ឯកជនភាពរបស់វា"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"អ្នកអាចស្វែងយល់អំពីរបៀបដែល <xliff:g id="APP_NAME">%1$s</xliff:g> ចាត់ចែងទិន្នន័យរបស់អ្នកនៅក្នុងគោលការណ៍ឯកជនភាពរបស់អ្នកអភិវឌ្ឍន៍"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ដើម្បីគ្រប់គ្រងការអនុញ្ញាត Android ផ្សេងទៀតដែលកម្មវិធីនេះអាចចូលប្រើប្រាស់ សូមចូលទៅកាន់ការកំណត់ រួចចុចកម្មវិធី"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"អានគោលការណ៍ឯកជនភាព"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"បានចូលប្រើក្នុងរយៈពេល 24 ម៉ោងចុងក្រោយ"</string>
     <string name="app_access_title" msgid="7137018424885371763">"សិទ្ធិចូលប្រើកម្មវិធី"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"បច្ចុប្បន្ននេះ អ្នកមិនបានដំឡើង​កម្មវិធីដែលត្រូវគ្នាទេ"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"សិទ្ធិ​ចូល​ប្រើបន្ថែម"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ទិន្នន័យពីមុន ទិន្នន័យ​ផ្ទៃ​ខាង​ក្រោយ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"បានដកការអនុញ្ញាតបន្ថែមចេញសម្រាប់កម្មវិធីនេះ"</string>
     <string name="permissions_header" msgid="6519976063360071569">"ការអនុញ្ញាត"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"សម្បទា និងសុខុមាលភាព"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"លំហាត់ប្រាណ ការគេង អាហារូបត្ថម្ភ និងផ្សេងទៀត"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"កំណត់ត្រាសុខភាព"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"កំណត់ត្រាសុខភាព"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"លទ្ធផលមន្ទីរពិសោធន៍ ថ្នាំ ការចាក់ថ្នាំបង្ការ និងផ្សេងទៀត"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"លទ្ធផលពីមន្ទីរពិសោធន៍ ថ្នាំ វ៉ាក់សាំង និងផ្សេងទៀត"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"បានដកការអនុញ្ញាតកម្មវិធី"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect បានដកការអនុញ្ញាតសម្រាប់ <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect បានដកការអនុញ្ញាតសម្រាប់ <xliff:g id="APP_DATA_0">%1$s</xliff:g> និង <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"ទៅកាន់ Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"ចាប់ផ្ដើមជាមួយ Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect រក្សាទុក​ទិន្នន័យសុខភាព និងសម្បទា​របស់អ្នក ដោយផ្តល់ឱ្យ​អ្នកនូវ​វិធីសាមញ្ញ​ក្នុងការធ្វើសមកាលកម្ម​កម្មវិធីផ្សេងៗ​នៅលើឧបករណ៍​របស់អ្នក"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect រក្សាទុក និងធ្វើសមកាលកម្មទិន្នន័យសុខភាព និង​សម្បទារបស់អ្នកពីកម្មវិធីផ្សេងៗ។\n\n"<b>"ទិន្នន័យសម្បទា និងសុខុមាលភាព"</b>"រួមមានវគ្គហាត់ប្រាណ ជំហាន អាហារូបត្ថម្ភ ដំណេក និងអ្វីៗជាច្រើនទៀត\n\n"<b>"កំណត់ត្រាសុខភាព"</b>" រួមទាំង​វ៉ាក់សាំង លទ្ធផលពី​មន្ទីរពិសោធន៍ និង​អ្វីៗជាច្រើនទៀត"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"តាមរយៈការប្រើ Health Connect អ្នកអាច"</string>
     <string name="share_data" msgid="3481932156368883946">"ចែករំលែកទិន្នន័យជាមួយកម្មវិធីរបស់អ្នក"</string>
     <string name="share_data_description" msgid="2919871301634375092">"ជ្រើសរើសទិន្នន័យដែលកម្មវិធីនីមួយៗអាចអាន ឬសរសេរទៅកាន់ Health Connect បាន"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"គ្រប់គ្រងការកំណត់ និងឯកជនភាពរបស់អ្នក"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"ការធ្លាក់រដូវតិច"</string>
     <string name="flow_medium" msgid="3783688724668943154">"ការធ្លាក់រដូវមធ្យម"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ការធ្លាក់រដូវច្រើន"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"លំហូរដែលមិនស្គាល់"</string>
     <string name="period_day" msgid="3821944462093965882">"រដូវថ្ងៃទី <xliff:g id="DAY">%1$d</xliff:g> នៃ <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{រយៈពេល (1 ថ្ងៃ)}other{រយៈពេល (# ថ្ងៃ)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"វិជ្ជមាន"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"អវិជ្ជមាន"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ខ្ពស់"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"តន្ត្រី"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"ផ្សេងៗ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"គ្មានការណែនាំ"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"មធ្យម"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ខ្លាំងក្លា"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>ន"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>ម៉ <xliff:g id="MIN">%2$s</xliff:g>ន"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>ម៉"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ការរួមបញ្ចូល​កំពុងដំណើរការ"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect កំពុងត្រូវបាន​រួមបញ្ចូលជាមួយប្រព័ន្ធ Android។\n\nសកម្មភាពនេះ​អាចចំណាយពេលបន្តិច ខណៈពេល​ដែលទិន្នន័យ និងការអនុញ្ញាត​របស់អ្នកកំពុងត្រូវបានផ្ទេរ។"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"កុំបិទកម្មវិធី រហូតទាល់តែអ្នក​ទទួលបានការជូនដំណឹងថា ដំណើរការនេះ​បញ្ចប់។"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"ការរួមបញ្ចូល Health Connect កំពុងដំណើរការ"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"ចាំបាច់ត្រូវមានកំណែថ្មី"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect កំពុងត្រូវបានរួមបញ្ចូល​ជាមួយប្រព័ន្ធ Android ដើម្បីឱ្យអ្នកអាច​ចូលប្រើកម្មវិធីនេះ​ដោយផ្ទាល់​ពីការកំណត់របស់អ្នក។"</string>
     <string name="update_button" msgid="4544529019832009496">"ដំឡើងកំណែ"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"ចាប់ផ្ដើម​ការដំឡើងកំណែនេះ ដើម្បីឱ្យ Health Connect អាចបន្តរួមបញ្ចូល​ជាមួយការកំណត់​ប្រព័ន្ធរបស់អ្នក"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ដំឡើងកំណែ​ឥឡូវនេះ"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"ចាំបាច់ត្រូវមាន​បច្ចុប្បន្នភាព​ប្រព័ន្ធ"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"មុនពេលបន្ត សូមធ្វើបច្ចុប្បន្នភាព​ប្រព័ន្ធទូរសព្ទរបស់អ្នក។"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"ប្រសិនបើអ្នក​បានធ្វើបច្ចុប្បន្នភាព​ប្រព័ន្ធទូរសព្ទ​របស់អ្នករួចហើយ សូមសាកល្បង​ចាប់ផ្ដើមទូរសព្ទ​របស់អ្នកឡើងវិញ ដើម្បីបន្តការរួមបញ្ចូល"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"ចាំបាច់ត្រូវមានកំណែថ្មី Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"មុនពេលបន្ត សូមដំឡើងកំណែ​កម្មវិធី Health Connect ទៅកំណែចុងក្រោយបំផុត។"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"ចាំបាច់ត្រូវមានទំហំផ្ទុកបន្ថែម"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect ត្រូវការទំហំផ្ទុក <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> នៅលើទូរសព្ទ​របស់អ្នក ដើម្បីបន្ត​ការរួមបញ្ចូល។\n\nសូមសម្អាតទំហំផ្ទុកមួយចំនួន​នៅលើទូរសព្ទរបស់អ្នក រួចព្យាយាមម្ដងទៀត។"</string>
     <string name="try_again_button" msgid="8745496819992160789">"ព្យាយាមម្ដងទៀត"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"បង្កើន​ទំហំផ្ទុក​ទំនេរ"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"ចាំបាច់ត្រូវមានទំហំផ្ទុកបន្ថែម"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect ត្រូវការទំហំផ្ទុក <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> នៅលើ​ទូរសព្ទរបស់អ្នក ដើម្បីបន្តរួមបញ្ចូល។"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ការរួមបញ្ចូល​ត្រូវបានផ្អាក"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"កម្មវិធី Health Connect បានបិទ ខណៈពេលដែល​កម្មវិធីនេះកំពុងត្រូវបានរួមបញ្ចូល​ជាមួយប្រព័ន្ធ Android។\n\nសូមចុច \"បន្ត\" ដើម្បីបើក​កម្មវិធីឡើងវិញ និងបន្តផ្ទេរទិន្នន័យនិងការអនុញ្ញាតរបស់អ្នក។"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"ដើម្បីរក្សាទុកទិន្នន័យ Health Connect របស់អ្នក សូមបញ្ចប់សកម្មភាពនេះក្នុងរយៈពេល <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"ចុចដើម្បី​បន្តរួមបញ្ចូល Health Connect ជាមួយប្រព័ន្ធ Android។ ដើម្បីរក្សាទុក​ទិន្នន័យរបស់អ្នក សូមបញ្ចប់​សកម្មភាពនេះក្នុងរយៈពេល <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"ចុចដើម្បី​បន្តរួមបញ្ចូល Health Connect ជាមួយប្រព័ន្ធ Android។"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"បន្ត"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"បន្តការរួមបញ្ចូល Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"ដើម្បីរក្សាទុក​ទិន្នន័យរបស់អ្នក សូមបញ្ចប់​សកម្មភាពនេះក្នុងរយៈពេល <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"តម្រូវឱ្យមានកំណែថ្មី​របស់កម្មវិធី"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"ចាំបាច់ត្រូវដំឡើងកំណែ <xliff:g id="APP_NAME">%1$s</xliff:g> ដើម្បីបន្តការធ្វើសមកាលកម្មជាមួយ Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"ចាំបាច់ត្រូវដំឡើងកំណែកម្មវិធីមួយចំនួន ដើម្បីបន្តការធ្វើសមកាលកម្មជាមួយ Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"ចាំបាច់ត្រូវដំឡើងកំណែ <xliff:g id="APP_NAME">%1$s</xliff:g> ដើម្បីបន្តការធ្វើសមកាលកម្មជាមួយ Health Connect។ កំណែថ្មីៗប្រហែលមិនមានសម្រាប់កម្មវិធីទាំងអស់ទេ។"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"ចាំបាច់ត្រូវដំឡើងកំណែកម្មវិធីមួយចំនួន ដើម្បីបន្តការធ្វើសមកាលកម្មជាមួយ Health Connect។ កំណែថ្មីៗប្រហែលមិនមានសម្រាប់កម្មវិធីទាំងអស់ទេ។"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"រក​មើល​កំណែ​ថ្មី"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"ស្វែងយល់បន្ថែម"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"ការរួមបញ្ចូល Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"ការរួមបញ្ចូល Health Connect មិនបានបញ្ចប់ទេ"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"អ្នកនឹងទទួលបាន​ការជូនដំណឹង នៅពេលអាចផ្ទេរបានម្ដងទៀត។"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"យល់ហើយ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"ការរួមបញ្ចូល Health Connect មិនបានបញ្ចប់ទេ"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"អានបន្ថែម"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"ការរួមបញ្ចូល Health Connect បានបញ្ចប់"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"បើក"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"អ្វី​ដែលថ្មី"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"ឥឡូវនេះ អ្នកអាចចូលប្រើ Health Connect ដោយផ្ទាល់​ពីការកំណត់របស់អ្នក​បានហើយ។ លុបកម្មវិធី Health Connect បានគ្រប់ពេល ដើម្បីបង្កើនទំហំផ្ទុក។"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"យល់ហើយ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"កែប្រភពកម្មវិធី"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"លំនាំដើម​របស់ឧបករណ៍"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ទិន្នន័យកម្មវិធី"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"ទិន្នន័យពីកម្មវិធីដែលមានសិទ្ធិចូលប្រើ Health Connect នឹងបង្ហាញនៅទីនេះ"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"ទិន្នន័យពី <xliff:g id="APP_NAME">%1$s</xliff:g> នឹងបង្ហាញនៅទីនេះ"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"ទិន្នន័យពីកម្មវិធីដែលមានសិទ្ធិចូលប្រើប្រាស់ Health Connect នឹងបង្ហាញនៅទីនេះ"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"ថ្ងៃ"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"សប្ដាហ៍"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"ខែ"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ខែមុន"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ការបញ្ចូល"</string>
     <string name="tab_access" msgid="7818197975407243701">"សិទ្ធិចូលប្រើប្រាស់"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"អនុញ្ញាតសិទ្ធិចូលប្រើបន្ថែមសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ក៏ចង់ចូលប្រើការកំណត់ Health Connect ទាំងនេះផងដែរ"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"បើកការអនុញ្ញាតឱ្យ​អានយ៉ាងតិចមួយ ដើម្បីបើកការចូលប្រើទិន្នន័យពីមុន ឬផ្ទៃខាងក្រោយសម្រាប់កម្មវិធីនេះ"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"បើកការអនុញ្ញាតឱ្យ​អានយ៉ាងតិចមួយ ដើម្បីបើកការ​ចូលប្រើ​ផ្ទៃ​ខាងក្រោយសម្រាប់កម្មវិធីនេះ"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"បើកការអនុញ្ញាតឱ្យ​អានយ៉ាងតិចមួយ ដើម្បីបើកការចូលប្រើទិន្នន័យពីមុនសម្រាប់កម្មវិធីនេះ"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"ចាប់ផ្ដើមប្រើ Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ធ្វើសមកាលកម្មកម្មវិធីដំបូងៗរបស់អ្នក ដើម្បីចែករំលែកទិន្នន័យសុខភាព និង​សម្បទារវាងកម្មវិធីទាំងនេះ"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"រៀបចំ"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"មើលកម្មវិធីដែលត្រូវគ្នា"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"ស្វែងរកកម្មវិធីច្រើនទៀត ដើម្បីធ្វើសមកាលកម្មជាមួយ <xliff:g id="APP_NAME">%s</xliff:g> តាមរយៈ Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"មើលនៅលើហាង​កម្មវិធី"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"កំណត់​ការចាក់​សោអេក្រង់"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"ដើម្បីសុវត្ថិភាពបន្ថែមសម្រាប់ទិន្នន័យសុខភាពរបស់អ្នក សូមកំណត់កូដ PIN, លំនាំ ឬពាក្យ​សម្ងាត់សម្រាប់ឧបករណ៍នេះ"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"កំណត់​ការចាក់​សោ​អេក្រង់"</string>
     <string name="select_all" msgid="837499881590001166">"ជ្រើស​រើសទាំង​អស់"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"កម្មវិធីដែលបានភ្ជាប់នឹងមិនអាចអានទិន្នន័យនេះពី Health Connect បានទៀតទេ"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"បាន​ធីក"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"មិន​បាន​ធីក"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"មានផ្លូវលើផែនទីសម្រាប់ហាត់ប្រាណ"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"ថ្ងៃ​បន្ទាប់"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"សប្ដាហ៍​ក្រោយ"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"ខែបន្ទាប់"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"ថ្ងៃ​មុន"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"សប្ដាហ៍​មុន​"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"ខែមុន"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"លុបទិន្នន័យទាំងអស់ជាអចិន្ត្រៃយ៍ឬ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"លុបទិន្នន័យបានជ្រើសរើសទាំងអស់ជាអចិន្ត្រៃយ៍ឬ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"លុបទិន្នន័យ <xliff:g id="APP_NAME">%s</xliff:g> ទាំងអស់ជាអចិន្ត្រៃយ៍ឬ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"លុបធាតុ <xliff:g id="APP_NAME">%1$s</xliff:g> ដែលបានជ្រើសរើសជាអចិន្ត្រៃយ៍សម្រាប់សប្តាហ៍នៃថ្ងៃទី <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ឬ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"លុបធាតុ <xliff:g id="APP_NAME">%1$s</xliff:g> ដែលបានជ្រើសរើសជាអចិន្ត្រៃយ៍សម្រាប់ខែ<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ឬ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"លុបធាតុ <xliff:g id="APP_NAME">%s</xliff:g> នេះជាអចិន្ត្រៃយ៍ឬ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"លុបទិន្នន័យ<xliff:g id="DATA_TYPE">%1$s</xliff:g>សម្រាប់ <xliff:g id="APP_NAME">%2$s</xliff:g> ជាអចិន្ត្រៃយ៍ឬ?"</string>
+    <string name="on" msgid="8266542510798355807">"បើក"</string>
+    <string name="off" msgid="6996623844428550649">"បិទ"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"បានចូលប្រើនៅម៉ោង <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"បានចូលប្រើម្សិលមិញនៅម៉ោង <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"បានចូលប្រើនៅថ្ងៃទី <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"អនុញ្ញាត​គ្រប់ពេល"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"អនុញ្ញាតតាមការរើស"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ខណៈពេល​កំពុងប្រើ​កម្មវិធី"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"បដិសេធ​ទាំងអស់"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពឬ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំសិទ្ធិចូលប្រើ <xliff:g id="DATA_TYPES">%2$s</xliff:g>។\n\nសូមជ្រើសរើសអនុញ្ញាតទាំងអស់ ឬគ្រប់គ្រងការអនុញ្ញាតដាច់ដោយឡែកពីគ្នា។"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើ <xliff:g id="DATA_TYPE">%2$s</xliff:g> ឬ?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"សម្បទា និងសុខុមាលភាព"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"គ្រប់ពេល"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ពេលកំពុងប្រើ"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"គ្រប់ពេល"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ពេលកំពុងប្រើ"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> អាចចូលប្រើទិន្នន័យសម្បទា និងសុខមាលភាពទាំងអស់របស់អ្នក<xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"បានអនុញ្ញាតឱ្យចូលប្រើ"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"បានអនុញ្ញាតឱ្យអាន"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ការ​អនុញ្ញាតទាំងនេះផ្ដល់សិទ្ធិឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើទិន្នន័យពីសេនស័រឧបករណ៍របស់អ្នក។"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"បានអនុញ្ញាតកម្មវិធី <xliff:g id="NUMBER_0">%1$d</xliff:g> នៃ <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"គ្មានកម្មវិធីដែលកំពុងស្នើសុំទេ"</string>
+    <string name="allowed" msgid="4158456017482263737">"បាន​អនុញ្ញាត"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"មិនបានអនុញ្ញាត"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"កម្មវិធីដែលមានការអនុញ្ញាតនេះអាចចូលប្រើទិន្នន័យ <xliff:g id="DATA_TYPE">%s</xliff:g> ពីសេនស័រឧបករណ៍របស់អ្នក។"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"ដកសិទ្ធិចូលប្រើ <xliff:g id="DATA_TYPE">%s</xliff:g> សម្រាប់កម្មវិធីទាំងអស់នៅលើនាឡិការបស់អ្នកឬ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"សញ្ញា​ធីក"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"សញ្ញា​ខ្វែង"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"បច្ចុប្បន្ន <xliff:g id="APP_NAME">%1$s</xliff:g> អាចចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាព <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"អនុញ្ញាតឱ្យ <xliff:g id="APP_NAME">%1$s</xliff:g> ចូលប្រើទិន្នន័យសម្បទា និងសុខុមាលភាពគ្រប់ពេលឬ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> មានសិទ្ធិចូលប្រើ<xliff:g id="DATA_TYPES">%2$s</xliff:g>។"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"គ្រប់គ្រងការអនុញ្ញាតសម្បទា និងសុខុមាលភាព"</string>
 </resources>
diff --git a/apk/res/values-kn/strings.xml b/apk/res/values-kn/strings.xml
index da3a844..dc85791 100644
--- a/apk/res/values-kn/strings.xml
+++ b/apk/res/values-kn/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆರೋಗ್ಯ ಹಾಗೂ ಫಿಟ್‌ನೆಸ್ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಿ ಮತ್ತು ಯಾವ ಆ್ಯಪ್‌ಗಳು ಅದನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
     <string name="data_title" msgid="4456619761533380816">"ಡೇಟಾ ಮತ್ತು ಆ್ಯಕ್ಸೆಸ್"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಬ್ರೌಸ್ ಮಾಡಿ"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"ನಿಮ್ಮ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಹಾಗೂ ಯಾವ ಆ್ಯಪ್‌ಗಳು ಅವುಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು ಎಂಬುದನ್ನು ವೀಕ್ಷಿಸಿ"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"ಎಲ್ಲಾ ವರ್ಗಗಳು"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"ಎಲ್ಲಾ ವರ್ಗಗಳನ್ನು ನೋಡಿ"</string>
     <string name="no_data" msgid="1906986019249068659">"ಡೇಟಾ ಇಲ್ಲ"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ನಿನ್ನೆ"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"ಓದಿರಿ: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"ಬರೆಯಿರಿ: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"ಅನುಮತಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"ಸಮಯ: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"ಚಟುವಟಿಕೆ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ನಿಮ್ಮ ಹೆಲ್ತ್‌ ಡೇಟಾಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಿರಿ"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"ಕಳೆಕೊಂಡ ಕ್ಯಾಲೋರಿ ಓದುತ್ತದೆ"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"ಕಳೆದುಕೊಂಡ ಕ್ಯಾಲೋರಿಗಳ ಮೊತ್ತವನ್ನು ಆ್ಯಪ್‌ಗೆ ಓದಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
-    <string name="background_read_title" msgid="5061383169517186234">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸುವುದೇ?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಆ್ಯಪ್ ಅನ್ನು ನೀವು ಬಳಸದೇ ಇರುವಾಗ ಈ ಆ್ಯಪ್ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾ ಹಾಗೂ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಆ್ಯಪ್ ಅನ್ನು ನೀವು ಬಳಸದೇ ಇರುವಾಗ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಆ್ಯಪ್ ಅನ್ನು ನೀವು ಬಳಸದೇ ಇರುವಾಗ ಈ ಆ್ಯಪ್ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಆ್ಯಪ್ ಅನ್ನು ನೀವು ಬಳಸದೇ ಇರುವಾಗ ಈ ಆ್ಯಪ್ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"ಹಿಂದಿನ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಈ ಆ್ಯಪ್ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ಕ್ಕಿಂತ ಮೊದಲು ಸೇರಿಸಲಾದ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಈ ಆ್ಯಪ್ ಎಲ್ಲಾ ಹಿಂದಿನ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಈ ಆ್ಯಪ್ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ಕ್ಕೂ ಮೊದಲು ಸೇರಿಸಲಾದ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಈ ಆ್ಯಪ್ ಹಿಂದಿನ ಎಲ್ಲಾ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹೆಚ್ಚುವರಿ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Health Connect ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಸಹ ಬಯಸುತ್ತದೆ"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾ ಹಾಗೂ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ ಈ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸಿ"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ ಈ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸಿ"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ಹಿಂದಿನ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ಕ್ಕಿಂತ ಮೊದಲು ಸೇರಿಸಲಾದ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"ಹಿಂದಿನ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"ಹಿಂದಿನ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ಗೂ ಮೊದಲು ಸೇರಿಸಲಾದ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"ಹಿಂದಿನ ಎಲ್ಲಾ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"ನಿಮ್ಮ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳಿಗಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಈಗಾಗಲೇ ಹಿಂದಿನ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"ಅನುಮತಿಗಳ ಕುರಿತು ಇನ್ನಷ್ಟು ಓದಿ"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾ ಹಾಗೂ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ ಈ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸಿ"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ ಈ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸಿ"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ಹಿಂದಿನ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ಕ್ಕಿಂತ ಮೊದಲು ಸೇರಿಸಲಾದ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"ಹಿಂದಿನ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"ಹಿಂದಿನ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ಗೂ ಮೊದಲು ಸೇರಿಸಲಾದ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"ಹಿಂದಿನ ಎಲ್ಲಾ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"ಯಾವುದೇ ಫಿಟ್‌ನೆಸ್ ಡೇಟಾವನ್ನು ಪ್ರಸ್ತುತ ಓದಲಾಗುತ್ತಿಲ್ಲ, ಏಕೆಂದರೆ <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ರೀಡ್ ಅನುಮತಿಗಳು ಆನ್‌ ಆಗಿಲ್ಲ"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"ನಿಮ್ಮ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳಿಗಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಈಗಾಗಲೇ ಹಿಂದಿನ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು. ಇದನ್ನು ಬದಲಾಯಿಸಲು, ಈ ಆ್ಯಪ್‌ಗೆ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್ ಅನುಮತಿಗಳನ್ನು ಆಫ್ ಮಾಡಿ"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್ ಅನುಮತಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ಈ ಆ್ಯಪ್‌ಗಾಗಿ ಹಿನ್ನೆಲೆ ಅಥವಾ ಹಿಂದಿನ ಡೇಟಾ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಕನಿಷ್ಠ ಒಂದು ರೀಡ್ ಅನುಮತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ಈ ಆ್ಯಪ್‌ಗೆ ಹಿನ್ನೆಲೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಕನಿಷ್ಠ ಒಂದು ರೀಡ್ ಅನುಮತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ಈ ಆ್ಯಪ್‌ಗಾಗಿ ಹಿಂದಿನ ಡೇಟಾ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಕನಿಷ್ಠ ಒಂದು ರೀಡ್ ಅನುಮತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"ಹಿಂದಿನ ಎಲ್ಲಾ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
     <string name="background_read_description" msgid="3203594555849969283">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಳಸದೇ ಇರುವಾಗ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸಿ"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಆ್ಯಪ್ ಅನ್ನು ನೀವು ಬಳಸದೇ ಇರುವಾಗ ಈ ಆ್ಯಪ್ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"ಹಿಂದಿನ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"ಹಿಂದಿನ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ಗೂ ಮೊದಲು ಸೇರಿಸಲಾದ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"ಹಿಂದಿನ ಎಲ್ಲಾ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಈ ಆ್ಯಪ್ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ಕ್ಕೂ ಮೊದಲು ಸೇರಿಸಲಾದ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ನೀವು ಅನುಮತಿಸಿದರೆ, ಈ ಆ್ಯಪ್ ಹಿಂದಿನ ಎಲ್ಲಾ Health Connect ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಲ್ಲದು."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"ಕರಗಿಸಿದ ಸಕ್ರಿಯ ಕ್ಯಾಲೋರಿಗಳು"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"ಸಕ್ರಿಯ ಕ್ಯಾಲೋರಿಗಳನ್ನು ಕಳೆದುಕೊಳ್ಳಲಾಗಿದೆ"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"ಸಕ್ರಿಯ ಕ್ಯಾಲೋರಿಗಳನ್ನು ಕಳೆದುಕೊಂಡಿರುವುದರ ಕುರಿತು ಓದಿರಿ"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ವೀಲ್‌ಚೇರ್ ಪುಶ್‌ಗಳ ಡೇಟಾ"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"ವೀಲ್‌ಚೇರ್ ಪುಶ್‌ಗಳ ಡೇಟಾವನ್ನು ಓದುತ್ತದೆ"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"ವೀಲ್‌ಚೇರ್ ಪುಶ್‌ಗಳ ಡೇಟಾವನ್ನು ಬರೆಯುತ್ತದೆ"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"ಚಟುವಟಿಕೆಯ ತೀವ್ರತೆ"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ಚಟುವಟಿಕೆಯ ತೀವ್ರತೆ"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"ಚಟುವಟಿಕೆಯ ತೀವ್ರತೆಯನ್ನು ಓದಿ"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"ಚಟುವಟಿಕೆಯ ತೀವ್ರತೆಯನ್ನು ಬರೆಯಿರಿ"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"ಮೂಲಭೂತ ಚಯಾಪಚಯ ದರದ ಡೇಟಾ"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"ಮೂಲಭೂತ ಚಯಾಪಚಯ ದರದ ಡೇಟಾ"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"ಮೂಲಭೂತ ಚಯಾಪಚಯ ದರದ ಡೇಟಾವನ್ನು ಓದುತ್ತದೆ"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ಚರ್ಮದ ತಾಪಮಾನ"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"ಚರ್ಮದ ತಾಪಮಾನವನ್ನು ಓದಿ"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"ಚರ್ಮದ ತಾಪಮಾನವನ್ನು ಬರೆಯಿರಿ"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"ಇದು Health Connect ಗೆ ಸಿಂಕ್ ಮಾಡಲಾದ ಮತ್ತು ಸೇರಿಸಲಾದ ಎಲ್ಲಾ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಸಂಪೂರ್ಣ ವೈದ್ಯಕೀಯ ದಾಖಲೆಯಾಗದಿರಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳ ವೈದ್ಯಕೀಯ ವಿವರಣೆಯನ್ನು ಒಳಗೊಂಡಿರುವುದಿಲ್ಲ."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"ಎಲ್ಲಾ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳು"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"ಎಲ್ಲಾ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳು"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"ಎಲ್ಲಾ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಬರೆಯಿರಿ"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"ಅಲರ್ಜಿಗಳು"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ಅಲರ್ಜಿಗಳು"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"ಅಲರ್ಜಿಗಳ ಡೇಟಾವನ್ನು ಓದಿ"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ಇಮ್ಯುನೈಸೇಶನ್"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ಇಮ್ಯುನೈಸೇಶನ್"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"ಇಮ್ಯುನೈಸೇಶನ್ ಡೇಟಾವನ್ನು ಓದಿ"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ಲ್ಯಾಬೋರೇಟರಿ ಫಲಿತಾಂಶಗಳು"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ಲ್ಯಾಬೋರೇಟರಿ ಫಲಿತಾಂಶಗಳು"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ಲ್ಯಾಬೋರೇಟರಿ ಫಲಿತಾಂಶಗಳನ್ನು ಓದಿರಿ"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"ಅಲರ್ಜಿಗಳು"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ಅಲರ್ಜಿಗಳು"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"ಅಲರ್ಜಿಯ ಡೇಟಾವನ್ನು ಓದುತ್ತದೆ"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"ವೈದ್ಯಕೀಯ ಸ್ಥಿತಿಗಳು"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"ವೈದ್ಯಕೀಯ ಸ್ಥಿತಿಗಳು"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"ವೈದ್ಯಕೀಯ ಸ್ಥಿತಿಗಳ ಕುರಿತು ಓದಿರಿ"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ವ್ಯಾಕ್ಸಿನ್‌ಗಳು"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ವ್ಯಾಕ್ಸಿನ್‌ಗಳು"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ವ್ಯಾಕ್ಸಿನ್‌ಗಳ ಕುರಿತು ಓದುತ್ತದೆ"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ಲ್ಯಾಬ್‌ ಫಲಿತಾಂಶಗಳು"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ಲ್ಯಾಬ್‌ ಫಲಿತಾಂಶಗಳು"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ಲ್ಯಾಬ್‌ ಫಲಿತಾಂಶಗಳನ್ನು ಓದಿರಿ"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ಔಷಧಿಗಳು"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ಔಷಧಿಗಳು"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ಔಷಧಿಗಳನ್ನು ಓದಿ"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ವೈಯಕ್ತಿಕ ವಿವರಗಳು"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ವೈಯಕ್ತಿಕ ವಿವರಗಳು"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"ವೈಯಕ್ತಿಕ ವಿವರಗಳನ್ನು ಓದಿರಿ"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"ಪ್ರಾಕ್ಟೀಶನರ್‌ ವಿವರಗಳು"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"ಪ್ರಾಕ್ಟೀಶನರ್‌ ವಿವರಗಳು"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"ಪ್ರಾಕ್ಟೀಶನರ್‌ ವಿವರಗಳನ್ನು ಓದಿರಿ"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ಗರ್ಭಧಾರಣೆ"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ಗರ್ಭಧಾರಣೆ"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ಗರ್ಭಧಾರಣೆಯ ಡೇಟಾವನ್ನು ಓದಿರಿ"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ಸಮಸ್ಯೆಗಳು"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ಸಮಸ್ಯೆಗಳು"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"ಬಳಕೆದಾರರ ಸಮಸ್ಯೆಗಳ ಡೇಟಾವನ್ನು ಓದಿರಿ"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"ಕಾರ್ಯವಿಧಾನಗಳು"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"ಕಾರ್ಯವಿಧಾನಗಳು"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"ಕಾರ್ಯವಿಧಾನಗಳನ್ನು ಓದಿರಿ"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"ಸಾಮಾಜಿಕ ಇತಿಹಾಸ"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ಸಾಮಾಜಿಕ ಇತಿಹಾಸ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ಸಾಮಾಜಿಕ ಇತಿಹಾಸ"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"ಬಳಕೆದಾರರ ಸಾಮಾಜಿಕ ಇತಿಹಾಸ ಡೇಟಾವನ್ನು ಓದಿರಿ"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"ಪ್ರಮುಖ ಆರೋಗ್ಯ ಮಾಪನಗಳು"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ಭೇಟಿಗಳು"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ಭೇಟಿಗಳು"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"ಭೇಟಿಗಳ ಕುರಿತು ಓದಿರಿ"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"ಪ್ರಮುಖ ಚಿಹ್ನೆಗಳು"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"ಪ್ರಮುಖ ಆರೋಗ್ಯ ಮಾಪನಗಳು"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"ಪ್ರಮುಖ ಆರೋಗ್ಯ ಮಾಪನಗಳ ಕುರಿತ ಡೇಟಾವನ್ನು ಓದಿರಿ"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"ಜಾಗರೂಕತೆ ಸೆಶನ್"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"ಜಾಗರೂಕತೆ ಸೆಶನ್‌ನ ಡೇಟಾವನ್ನು ಬರೆಯಿರಿ"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ಗೆ ಓದಲು ಅನುಮತಿಸಿ"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ಗೆ ಬರೆಯಲು ಅನುಮತಿಸಿ"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"ರದ್ದುಗೊಳಿಸಿ"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"ಅನುಮತಿಸಿ"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"ಎಲ್ಲವನ್ನೂ ಅನುಮತಿಸಿ"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"ಅನುಮತಿಸಬೇಡಿ"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Health Connect ಗೆ ಈ ಆ್ಯಪ್ ಓದಬೇಕು ಅಥವಾ ಬರೆಯಬೇಕು ಎಂದು ನೀವು ಬಯಸುವ ಡೇಟಾವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Health Connect ಗೆ ಈ ಆ್ಯಪ್ ಓದಬೇಕು ಅಥವಾ ಬರೆಯಬೇಕು ಎಂದು ನೀವು ಬಯಸುವ ಡೇಟಾವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connect ನಿಂದ ಈ ಆ್ಯಪ್ ಓದಬೇಕು ಎಂದು ನೀವು ಬಯಸುವ ಡೇಟಾವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Health Connect ಗೆ ಈ ಆ್ಯಪ್ ಬರೆಯಬೇಕು ಎಂದು ನೀವು ಬಯಸುವ ಡೇಟಾವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"ನೀವು ಓದಲು ಆ್ಯಕ್ಸೆಸ್ ನೀಡಿದರೆ, ಹೊಸ ಡೇಟಾವನ್ನು ಹಾಗೂ ಕಳೆದ 30 ದಿನಗಳ ಡೇಟಾವನ್ನು ಈ ಆ್ಯಪ್ ಓದಬಹುದು"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"ನೀವು ಓದಲು ಆ್ಯಕ್ಸೆಸ್ ನೀಡಿದರೆ, ಆ್ಯಪ್ ಹೊಸ ಮತ್ತು ಹಿಂದಿನ ಡೇಟಾವನ್ನು ಓದಬಹುದು"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Health Connect ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ಅನುಮತಿಸಬೇಕೆ?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಡೆವಲಪರ್ ಅವರ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ಯಲ್ಲಿ ನೀವು ತಿಳಿದುಕೊಳ್ಳಬಹುದು"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಅವರ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ಯಲ್ಲಿ ನೀವು ತಿಳಿದುಕೊಳ್ಳಬಹುದು"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"ಗೌಪ್ಯತೆ ನೀತಿ"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"ನಿಮ್ಮ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"ನೀವು ಆ್ಯಕ್ಸೆಸ್ ನೀಡಿದರೆ, ಅಲರ್ಜಿಗಳು, ಲ್ಯಾಬ್ ಫಲಿತಾಂಶಗಳು, ವ್ಯಾಕ್ಸಿನ್‌ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನವುಗಳಂತಹ ಡೇಟಾವನ್ನು ಆ್ಯಪ್ ಓದಬಹುದು ಮತ್ತು ಬರೆಯಬಹುದು\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"ನೀವು ಆ್ಯಕ್ಸೆಸ್ ನೀಡಿದರೆ, ಅಲರ್ಜಿಗಳು, ಲ್ಯಾಬ್ ಫಲಿತಾಂಶಗಳು, ವ್ಯಾಕ್ಸಿನ್‌ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನವುಗಳಂತಹ ಡೇಟಾವನ್ನು ಆ್ಯಪ್ ಓದಬಹುದು \n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳ ಕುರಿತು"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"ಹಂಚಿಕೊಳ್ಳಲು ಡೇಟಾ ಒಳಗೊಂಡಿದೆ"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"ನೀವು ಅನುಮತಿಸಿದರೆ, <xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಮ್ಮ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು Health Connect ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಬಹುದು."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"ನಿಮ್ಮ ವಿಭಿನ್ನ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಮೂಲಗಳಿಂದ ಒದಗಿರುವ ನಿಮ್ಮ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಒಂದೇ ಸ್ಥಳದಲ್ಲಿ ಇರಿಸಲು ಅವುಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿ"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"ಎಲ್ಲಾ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"ಎಲ್ಲವನ್ನೂ ತೆಗೆದುಹಾಕಿ"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಇನ್ನು ಮುಂದೆ Health Connect ನಿಂದ ಯಾವುದೇ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಇದು ಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಸ್ಥಳ, ಕ್ಯಾಮರಾ ಅಥವಾ ಮೈಕ್ರೊಫೋನ್‌ನಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಯಾವುದೇ ಪ್ರಭಾವ ಬೀರುವುದಿಲ್ಲ."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹಿನ್ನೆಲೆ ಡೇಟಾ ಸೇರಿದಂತೆ Health Connect ನಿಂದ ಯಾವುದೇ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಇನ್ನು ಮುಂದೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಸ್ಥಳ, ಕ್ಯಾಮರಾ ಅಥವಾ ಮೈಕ್ರೊಫೋನ್‌ನಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹಿನ್ನೆಲೆ ಮತ್ತು ಹಿಂದಿನ ಡೇಟಾ ಸೇರಿದಂತೆ Health Connect ನಿಂದ ಯಾವುದೇ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಇನ್ನು ಮುಂದೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಸ್ಥಳ, ಕ್ಯಾಮರಾ ಅಥವಾ ಮೈಕ್ರೊಫೋನ್‌ನಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect ನಿಂದ <xliff:g id="APP_NAME">%1$s</xliff:g> ಡೇಟಾವನ್ನು ಸಹ ಅಳಿಸಿ"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ಎಲ್ಲಾ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ಎಲ್ಲಾ ಆರೋಗ್ಯ ಸಂಬಂಧಿತ ರೆಕಾರ್ಡ್ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ಎಲ್ಲಾ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ವೆಲ್‌ನೆಸ್ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್‌ನ Health Connect ನಲ್ಲಿನ ಫಿಟ್‌ನೆಸ್ ಡೇಟಾವನ್ನು ಸಹ ಅಳಿಸಿ"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ಎಲ್ಲಾ ಆರೋಗ್ಯ ಸಂಬಂಧಿತ ರೆಕಾರ್ಡ್ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್‌ನ Health Connect ನಲ್ಲಿನ ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳನ್ನು ಸಹ ಅಳಿಸಿ"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಇನ್ನು ಮುಂದೆ Health Connect ನಲ್ಲಿನ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಇದು ಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಸ್ಥಳ, ಕ್ಯಾಮರಾ ಅಥವಾ ಮೈಕ್ರೊಫೋನ್‌ನಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಯಾವುದೇ ಪ್ರಭಾವ ಬೀರುವುದಿಲ್ಲ."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹಿನ್ನೆಲೆ ಡೇಟಾ ಸೇರಿದಂತೆ Health Connect ನಲ್ಲಿನ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಇನ್ನು ಮುಂದೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಕ್ಯಾಮರಾ, ಮೈಕ್ರೊಫೋನ್ ಅಥವಾ ಸ್ಥಳದಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹಿಂದಿನ ಡೇಟಾ ಸೇರಿದಂತೆ Health Connect ನಲ್ಲಿನ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಇನ್ನು ಮುಂದೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಕ್ಯಾಮರಾ, ಮೈಕ್ರೊಫೋನ್ ಅಥವಾ ಸ್ಥಳದಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹಿನ್ನೆಲೆ ಮತ್ತು ಹಿಂದಿನ ಡೇಟಾ ಸೇರಿದಂತೆ Health Connect ನಲ್ಲಿನ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಇನ್ನು ಮುಂದೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಕ್ಯಾಮರಾ, ಮೈಕ್ರೊಫೋನ್ ಅಥವಾ ಸ್ಥಳದಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ಎಲ್ಲಾ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಇನ್ನು ಮುಂದೆ Health Connect ನಿಂದ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಇದು ಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಸ್ಥಳ, ಕ್ಯಾಮರಾ ಅಥವಾ ಮೈಕ್ರೊಫೋನ್‌ನಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಯಾವುದೇ ಪ್ರಭಾವ ಬೀರುವುದಿಲ್ಲ."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹಿನ್ನೆಲೆ ಡೇಟಾ ಸೇರಿದಂತೆ Health Connect ನಿಂದ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಇನ್ನು ಮುಂದೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಕ್ಯಾಮರಾ, ಮೈಕ್ರೊಫೋನ್ ಅಥವಾ ಸ್ಥಳದಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹಿಂದಿನ ಡೇಟಾ ಸೇರಿದಂತೆ Health Connect ನಿಂದ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಇನ್ನು ಮುಂದೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಕ್ಯಾಮರಾ, ಮೈಕ್ರೊಫೋನ್ ಅಥವಾ ಸ್ಥಳದಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹಿನ್ನೆಲೆ ಮತ್ತು ಹಿಂದಿನ ಡೇಟಾ ಸೇರಿದಂತೆ Health Connect ನಿಂದ ಡೇಟಾವನ್ನು ಓದಲು ಅಥವಾ ಬರೆಯಲು ಇನ್ನು ಮುಂದೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.\n\nಈ ಆ್ಯಪ್ ಹೊಂದಿರಬಹುದಾದ ಕ್ಯಾಮರಾ, ಮೈಕ್ರೊಫೋನ್ ಅಥವಾ ಸ್ಥಳದಂತಹ ಇತರ ಅನುಮತಿಗಳ ಮೇಲೆ ಇದು ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್‌ನ Health Connect ನಲ್ಲಿನ ಫಿಟ್‌ನೆಸ್ ಡೇಟಾ ಮತ್ತು ಆರೋಗ್ಯ ದಾಖಲೆಗಳನ್ನು ಸಹ ಅಳಿಸಿ"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"ಎಲ್ಲಾ Health Connect ಡೇಟಾವನ್ನು ಸಹ ಅಳಿಸಿ"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"ಮುಂದಿನ ದಿನ"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"ಆಯ್ಕೆ ಮಾಡಿದ ದಿನ"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"ಹಿಂದಿನ ದಿನ"</string>
     <string name="default_error" msgid="7966868260616403475">"ಏನೋ ಸಮಸ್ಯೆ ಉಂಟಾಗಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"ಅಪರಿಚಿತ ಮಾಹಿತಿಯ ಮೂಲ"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ಮೂಲ ಡೇಟಾ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>ತೆರೆದ ಬ್ರಾಕೆಟ್."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>ಮುಚ್ಚಿದ ಬ್ರಾಕೆಟ್."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ಫೀಲ್ಡ್‌ <xliff:g id="FIELD">%2$s</xliff:g> ಮೌಲ್ಯ"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ಈ ಆ್ಯಪ್‌ಗಳು ಇನ್ನು ಮುಂದೆ ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿರುವುದಿಲ್ಲ ಆದರೆ ಈಗಲೂ Health Connect ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ ಡೇಟಾ ಇರುತ್ತದೆ"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> ನಂತರ ಸೇರಿಸಲಾಗುವ ಡೇಟಾವನ್ನು <xliff:g id="APP_NAME">%1$s</xliff:g> ಓದಬಹುದು"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ಈ ಆ್ಯಪ್ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದಾದ ಇತರ Android ಅನುಮತಿಗಳನ್ನು ನಿರ್ವಹಿಸುವುದಕ್ಕಾಗಿ, ಸೆಟ್ಟಿಂಗ್‌ಗಳು &gt; ಆ್ಯಪ್‌ಗಳು ಎಂಬಲ್ಲಿಗೆ ಹೋಗಿ"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನೊಂದಿಗೆ ನೀವು ಹಂಚಿಕೊಳ್ಳುವ ಡೇಟಾ ಅದರ ಗೌಪ್ಯತೆ ನೀತಿಗೆ ಒಳಪಟ್ಟಿರುತ್ತದೆ"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ನೀವು ಡೆವಲಪರ್‌ಗಳ ಗೌಪ್ಯತೆ ನೀತಿಯಲ್ಲಿ ತಿಳಿಯಬಹುದು"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ಈ ಆ್ಯಪ್ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದಾದ ಇತರ Android ಅನುಮತಿಗಳನ್ನು ನಿರ್ವಹಿಸುವುದಕ್ಕಾಗಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ, ನಂತರ ಆ್ಯಪ್‌ಗಳು ಎಂಬುದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"ಗೌಪ್ಯತೆ ನೀತಿಯನ್ನು ಓದಿ"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"ಕಳೆದ 24 ಗಂಟೆಗಳಲ್ಲಿ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ಆ್ಯಪ್ ಆ್ಯಕ್ಸೆಸ್"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"ಹೊಂದಾಣಿಕೆಯಾಗುವ ಯಾವುದೇ ಆ್ಯಪ್‌ಗಳನ್ನು ನೀವು ಪ್ರಸ್ತುತ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿಲ್ಲ"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"ಹೆಚ್ಚುವರಿ ಆ್ಯಕ್ಸೆಸ್"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ಹಿಂದಿನ ಡೇಟಾ, ಹಿನ್ನೆಲೆ ಡೇಟಾ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"ಈ ಆ್ಯಪ್‌ಗೆ ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
     <string name="permissions_header" msgid="6519976063360071569">"ಅನುಮತಿಗಳು"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ವೆಲ್‌ನೆಸ್"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ವ್ಯಾಯಾಮ, ನಿದ್ರೆ, ಪೌಷ್ಟಿಕತೆ ಮತ್ತು ಇತರೆ"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳು"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳು"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ಲ್ಯಾಬ್ ಫಲಿತಾಂಶ, ಔಷಧಿ, ರೋಗನಿರೋಧಕ &amp; ಇತರೆ"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ಲ್ಯಾಬ್‌ ಫಲಿತಾಂಶಗಳು, ಔಷಧಿಗಳು, ವ್ಯಾಕ್ಸಿನ್‌ಗಳು ಮತ್ತು ಇತ್ಯಾದಿ"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"ತೆಗೆದುಹಾಕಲಾದ ಆ್ಯಪ್ ಅನುಮತಿಗಳು"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect, <xliff:g id="APP_DATA">%s</xliff:g> ಗೆ ಸಂಬಂಧಿಸಿದ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಿದೆ"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect, <xliff:g id="APP_DATA_0">%1$s</xliff:g> ಮತ್ತು <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> ಗೆ ಸಂಬಂಧಿಸಿದ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಿದೆ"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store ಗೆ ಹೋಗಿ"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ನಿಮ್ಮ ಆರೋಗ್ಯ ಹಾಗೂ ಫಿಟ್‌ನೆಸ್ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ, ಅದರಿಂದ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿರುವ ವಿವಿಧ ಆ್ಯಪ್‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲು ನಿಮಗೆ ಸರಳವಾದ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತದೆ"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ವಿವಿಧ ಆ್ಯಪ್‌ಗಳಿಂದ ನಿಮ್ಮ ಆರೋಗ್ಯ ಮತ್ತು ಫಿಟ್‌ನೆಸ್‌ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ ಮತ್ತು ಸಿಂಕ್‌ ಮಾಡುತ್ತದೆ.\n\n"<b>"ವ್ಯಾಯಾಮ ಸೆಶನ್‌ಗಳು, ಹಂತಗಳು, ಪೋಷಣೆ, ನಿದ್ರೆ ಮತ್ತು ಹೆಚ್ಚಿನವುಗಳನ್ನು ಒಳಗೊಂಡಂತೆ,"</b>" ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ವೆಲ್‌ನೆಸ್‌ ಡೇಟಾ\n\n"<b>"ರೋಗನಿರೋಧಕಗಳು, ಲ್ಯಾಬ್‌ ಫಲಿತಾಂಶಗಳು ಮತ್ತು ಹೆಚ್ಚಿನವುಗಳನ್ನು ಒಳಗೊಂಡಂತೆ,"</b>" ಆರೋಗ್ಯಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡ್‌ಗಳು"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ಮೂಲಕ ನೀವು ಇವುಗಳನ್ನು ಮಾಡಬಹುದು"</string>
     <string name="share_data" msgid="3481932156368883946">"ನಿಮ್ಮ ಆ್ಯಪ್‌ಗಳೊಂದಿಗೆ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Health Connect ನಲ್ಲಿ ಪ್ರತಿ ಆ್ಯಪ್ ಓದಬಹುದಾದ ಅಥವಾ ಬರೆಯಬಹುದಾದ ಡೇಟಾವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಹಾಗೂ ಗೌಪ್ಯತೆಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"ಕಡಿಮೆ ಫ್ಲೋ"</string>
     <string name="flow_medium" msgid="3783688724668943154">"ಮಧ್ಯಮ ಫ್ಲೋ"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ಹೆಚ್ಚಿನ ಫ್ಲೋ"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"ಫ್ಲೋ ಕುರಿತಾದ ಮಾಹಿತಿ ಇಲ್ಲ"</string>
     <string name="period_day" msgid="3821944462093965882">"ಒಟ್ಟು <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="DAY">%1$d</xliff:g> ನೇ ಪೀರಿಯಡ್ ದಿನ"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ಋತುಚಕ್ರ (1 ದಿನ)}one{ಋತುಚಕ್ರ (# ದಿನಗಳು)}other{ಋತುಚಕ್ರ (# ದಿನಗಳು)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"ಪಾಸಿಟಿವ್"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"ನೆಗೆಟಿವ್"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ಹೆಚ್ಚು"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"ಸಂಗೀತ"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"ಇತರೆ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ಮಾರ್ಗದರ್ಶನವಿಲ್ಲ"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"ಸಾಧಾರಣ"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ಹುರುಪಿನ"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>ನಿ"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>ಗಂ <xliff:g id="MIN">%2$s</xliff:g>ನಿ"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>ಗಂ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ಇಂಟಿಗ್ರೇಶನ್ ಪ್ರಗತಿಯಲ್ಲಿದೆ"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect Android ಸಿಸ್ಟಂನೊಂದಿಗೆ ಸಂಯೋಜನೆಯಾಗಲಿದೆ.\n\nನಿಮ್ಮ ಡೇಟಾ ಮತ್ತು ಅನುಮತಿಗಳು ವರ್ಗಾವಣೆ ಆಗುವಾಗ ಇದು ಸ್ವಲ್ಪ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"ಪ್ರಕ್ರಿಯೆಯು ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂಬ ನೋಟಿಫಿಕೇಶನ್ ಅನ್ನು ನೀವು ಪಡೆಯುವವರೆಗೂ ಆ್ಯಪ್ ಅನ್ನು ಮುಚ್ಚಬೇಡಿ."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect ಇಂಟಿಗ್ರೇಶನ್ ಪ್ರಗತಿಯಲ್ಲಿದೆ"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"ಅಪ್‌ಡೇಟ್‌ನ ಅಗತ್ಯವಿದೆ"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect Android ಸಿಸ್ಟಂನೊಂದಿಗೆ ಸಂಯೋಜನೆಯಾಗಲಿದೆ ಹಾಗಾಗಿ ನೀವು ನೇರವಾಗಿ ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ಅದಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಬಹುದು."</string>
     <string name="update_button" msgid="4544529019832009496">"ಅಪ್‌ಡೇಟ್ ಮಾಡಿ"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"ಈ ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸುವುದರಿಂದ Health Connect ನಿಮ್ಮ ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳೊಂದಿಗೆ ಸಂಯೋಜನೆಯಾಗುವುದನ್ನು ಮುಂದುವರಿಸಬಹುದು"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ಈಗಲೇ ಅಪ್‌ಡೇಟ್ ಮಾಡಿ"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"ಸಿಸ್ಟಂ ಅಪ್‌ಡೇಟ್ ಅಗತ್ಯವಿದೆ"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"ಮುಂದುವರಿಯುವ ಮೊದಲು, ನಿಮ್ಮ ಫೋನ್ ಸಿಸ್ಟಂ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಿ."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"ನೀವು ಈಗಾಗಲೇ ನಿಮ್ಮ ಫೋನ್ ಸಿಸ್ಟಂ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಿದ್ದರೆ, ಇಂಟಿಗ್ರೇಶನ್ ಅನ್ನು ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಪ್ರಯತ್ನಿಸಿ"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect ಅಪ್‌ಡೇಟ್ ಅಗತ್ಯವಿದೆ"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"ಮುಂದುವರಿಯುವ ಮೊದಲು, Health Connect ಆ್ಯಪ್ ಅನ್ನು ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಗೆ ಅಪ್‌ಡೇಟ್ ಮಾಡಿ."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"ಹೆಚ್ಚು ಸ್ಥಳ ಅಗತ್ಯವಿದೆ"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"ಇಂಟಿಗ್ರೇಶನ್ ಅನ್ನು ಮುಂದುವರಿಸಲು Health Connect ಗೆ ನಿಮ್ಮ ಫೋನ್‌ನ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ಸಂಗ್ರಹಣೆಯ ಸ್ಥಳ ಅಗತ್ಯವಿದೆ.\n\nನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಸ್ವಲ್ಪ ಸ್ಥಳವನ್ನು ತೆರವುಗೊಳಿಸಿ ಮತ್ತು ನಂತರ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."</string>
     <string name="try_again_button" msgid="8745496819992160789">"ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ಸ್ಥಳಾವಕಾಶವನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"ಹೆಚ್ಚು ಸ್ಥಳ ಅಗತ್ಯವಿದೆ"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"ಸಂಯೋಜಿಸುವುದನ್ನು ಮುಂದುವರಿಸಲು Health Connect ಗೆ ನಿಮ್ಮ ಫೋನ್‌ನ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ಸಂಗ್ರಹಣೆಯ ಸ್ಥಳ ಅಗತ್ಯವಿದೆ."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ಇಂಟಿಗ್ರೇಶನ್ ಅನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ಆ್ಯಪ್ Android ಸಿಸ್ಟಂನೊಂದಿಗೆ ಸಂಯೋಜನೆಯಾಗುತ್ತಿದ್ದಾಗ ಅದು ಮುಚ್ಚಿದೆ.\n\nಆ್ಯಪ್ ಅನ್ನು ಮತ್ತೆ ತೆರೆಯಲು ಪುನರಾರಂಭಿಸಿ ಎಂಬುದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ನಿಮ್ಮ ಡೇಟಾ ಹಾಗೂ ಅನುಮತಿಗಳನ್ನು ವರ್ಗಾಯಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"ನಿಮ್ಮ Health Connect ಡೇಟಾ ಇರಿಸಿಕೊಳ್ಳಲು <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ಒಳಗಾಗಿ ಇದನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Android ಸಿಸ್ಟಂನೊಂದಿಗೆ Health Connect ಅನ್ನು ಸಂಯೋಜಿಸುವುದನ್ನು ಮುಂದುವರಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಇರಿಸಿಕೊಳ್ಳಲು, <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ಒಳಗಾಗಿ ಇದನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Android ಸಿಸ್ಟಂನೊಂದಿಗೆ Health Connect ಅನ್ನು ಸಂಯೋಜಿಸುವುದನ್ನು ಮುಂದುವರಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ಮುಂದುವರಿಸಿ"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect ಇಂಟಿಗ್ರೇಶನ್ ಅನ್ನು ಪುನರಾರಂಭಿಸಿ"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಇರಿಸಿಕೊಳ್ಳಲು, <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ಒಳಗಾಗಿ ಇದನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ಆ್ಯಪ್ ಅಪ್‌ಡೇಟ್ ಅಗತ್ಯವಿದೆ"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect ಜೊತೆಗೆ ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect ಜೊತೆಗೆ ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಲು ಕೆಲವು ಆ್ಯಪ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect ಜೊತೆಗೆ ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ. ಅಪ್‌ಡೇಟ್‌ಗಳು ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳಿಗೆ ಲಭ್ಯವಿಲ್ಲದಿರಬಹುದು."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect ಜೊತೆಗೆ ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಲು ಕೆಲವು ಆ್ಯಪ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ. ಅಪ್‌ಡೇಟ್‌ಗಳು ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳಿಗೆ ಲಭ್ಯವಿಲ್ಲದಿರಬಹುದು."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"ಅಪ್‌ಡೇಟ್‌ಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಿ"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect ಇಂಟಿಗ್ರೇಶನ್"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect ಇಂಟಿಗ್ರೇಶನ್ ಪೂರ್ಣವಾಗಲಿಲ್ಲ"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"ಅದು ಮತ್ತೆ ಲಭ್ಯವಿರುವಾಗ ನೀವು ನೋಟಿಫಿಕೇಶನ್ ಪಡೆಯುವಿರಿ."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"ಅರ್ಥವಾಯಿತು"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect ಇಂಟಿಗ್ರೇಶನ್ ಪೂರ್ಣವಾಗಲಿಲ್ಲ"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"ಇನ್ನಷ್ಟು ಓದಿ"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect ಇಂಟಿಗ್ರೇಶನ್ ಪೂರ್ಣಗೊಂಡಿದೆ"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"ತೆರೆಯಿರಿ"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"ಹೊಸದೇನಿದೆ"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"ಈಗ ನೀವು ನೇರವಾಗಿ ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ Health Connect ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಬಹುದು. ಸಂಗ್ರಹಣೆ ಸ್ಥಳವನ್ನು ತೆರವುಗೊಳಿಸಲು, ಯಾವುದೇ ಸಮಯದಲ್ಲಿ Health Connect ಆ್ಯಪ್ ಅನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"ಅರ್ಥವಾಯಿತು"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ಆ್ಯಪ್ ಮೂಲಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ಸಾಧನದ ಡೀಫಾಲ್ಟ್"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ಆ್ಯಪ್ ಡೇಟಾ"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿರುವ ಆ್ಯಪ್‌ಗಳ ಡೇಟಾವನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಲ್ಲಿನ ಡೇಟಾವನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿರುವ ಆ್ಯಪ್‌ಗಳ ಡೇಟಾವನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"ದಿನ"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"ವಾರ"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"ತಿಂಗಳು"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ಕಳೆದ ತಿಂಗಳು"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ನಮೂದುಗಳು"</string>
     <string name="tab_access" msgid="7818197975407243701">"ಆ್ಯಕ್ಸೆಸ್"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಹೆಚ್ಚುವರಿ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಅನುಮತಿಸಬೇಕೇ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Health Connect ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಸಹ ಬಯಸುತ್ತದೆ"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ಈ ಆ್ಯಪ್‌ಗಾಗಿ ಹಿನ್ನೆಲೆ ಅಥವಾ ಹಿಂದಿನ ಡೇಟಾ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಕನಿಷ್ಠ ಒಂದು ರೀಡ್ ಅನುಮತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ಈ ಆ್ಯಪ್‌ಗೆ ಹಿನ್ನೆಲೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಕನಿಷ್ಠ ಒಂದು ರೀಡ್ ಅನುಮತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ಈ ಆ್ಯಪ್‌ಗಾಗಿ ಹಿಂದಿನ ಡೇಟಾ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಕನಿಷ್ಠ ಒಂದು ರೀಡ್ ಅನುಮತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect ಅನ್ನು ಬಳಸಿ"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ಆರೋಗ್ಯ ಮತ್ತು ಫಿಟ್‌ನೆಸ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ನಿಮ್ಮ ಮೊದಲ ಆ್ಯಪ್‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿ"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"ಸೆಟಪ್ ಮಾಡಿ"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"ಹೊಂದಾಣಿಕೆಯ ಆ್ಯಪ್‌ಗಳನ್ನು ನೋಡಿ"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect ಮೂಲಕ <xliff:g id="APP_NAME">%s</xliff:g> ನೊಂದಿಗೆ ಸಿಂಕ್ ಮಾಡಲು ಇನ್ನಷ್ಟು ಆ್ಯಪ್‌‌ಗಳನ್ನು ಹುಡುಕಿ"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ಆ್ಯಪ್‌ ಸ್ಟೋರ್‌ನಲ್ಲಿ ನೋಡಿ"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಸೆಟ್ ಮಾಡಿ"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"ನಿಮ್ಮ ಆರೋಗ್ಯದ ಡೇಟಾಗೆ ಹೆಚ್ಚುವರಿ ಸುರಕ್ಷತೆಯನ್ನು ಒದಗಿಸಲು, ಈ ಸಾಧನಕ್ಕಾಗಿ ಪಿನ್, ಪ್ಯಾಟರ್ನ್ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಸೆಟ್ ಮಾಡಿ"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸೆಟ್ ಮಾಡಿ"</string>
     <string name="select_all" msgid="837499881590001166">"ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"ಕನೆಕ್ಟ್ ಮಾಡಲಾದ ಆ್ಯಪ್‌ಗಳಿಗೆ ಇನ್ನು ಮುಂದೆ Health Connect ನಲ್ಲಿನ ಈ ಡೇಟಾವನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ಗುರುತಿಸಲಾಗಿದೆ"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"ವ್ಯಾಯಾಮಕ್ಕಾಗಿ ಮಾರ್ಗ ನಕ್ಷೆ ಲಭ್ಯವಿದೆ"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"ಮುಂದಿನ ದಿನ"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"ಮುಂದಿನ ವಾರ"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"ಮುಂದಿನ ತಿಂಗಳು"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"ಹಿಂದಿನ ದಿನ"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"ಹಿಂದಿನ ವಾರ"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"ಹಿಂದಿನ ತಿಂಗಳು"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಬೇಕೆ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"ಆಯ್ಕೆಮಾಡಿದ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಬೇಕೆ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"ಎಲ್ಲಾ <xliff:g id="APP_NAME">%s</xliff:g> ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಬೇಕೆ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ವಾರದ ಆಯ್ದ <xliff:g id="APP_NAME">%1$s</xliff:g> ನಮೂದುಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಬೇಕೆ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ತಿಂಗಳಿನ ಆಯ್ದ <xliff:g id="APP_NAME">%1$s</xliff:g> ನಮೂದುಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಬೇಕೆ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ಈ <xliff:g id="APP_NAME">%s</xliff:g> ನಮೂದನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಬೇಕೆ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> ನಲ್ಲಿನ <xliff:g id="DATA_TYPE">%1$s</xliff:g> ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಬೇಕೆ?"</string>
+    <string name="on" msgid="8266542510798355807">"ಆನ್ ಆಗಿದೆ"</string>
+    <string name="off" msgid="6996623844428550649">"ಆಫ್ ಆಗಿದೆ"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g> ಸಮಯಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲಾಗಿದೆ"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"ನಿನ್ನೆ <xliff:g id="TIME_DATE">%1$s</xliff:g> ಸಮಯಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲಾಗಿದೆ"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> ಸಮಯಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲಾಗಿದೆ"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"ಎಲ್ಲಾ ಸಮಯದಲ್ಲೂ ಅನುಮತಿಸಿ"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"ಅನುಮತಿಸಿ ಆಯ್ಕೆಮಾಡಿದೆ"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ಆ್ಯಪ್ ಅನ್ನು ಬಳಸುವಾಗ"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"ಎಲ್ಲವನ್ನೂ ನಿರಾಕರಿಸಿ"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ಯೋಗಕ್ಷೇಮ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="DATA_TYPES">%2$s</xliff:g> ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು <xliff:g id="APP_NAME">%1$s</xliff:g> ವಿನಂತಿಸುತ್ತಿದೆ.\n\nಎಲ್ಲವನ್ನೂ ಅನುಮತಿಸಲು ಅಥವಾ ಅವುಗಳನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ನಿಯಂತ್ರಿಸಲು ಆಯ್ಕೆಮಾಡಿ."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="DATA_TYPE">%2$s</xliff:g> ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಅನುಮತಿ ನೀಡಬೇಕೇ?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ವೆಲ್‌ನೆಸ್"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ಯಾವಾಗಲೂ"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ಬಳಕೆಯಲ್ಲಿರುವಾಗ"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"ಯಾವಾಗಲೂ"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ಬಳಕೆಯಲ್ಲಿರುವಾಗ"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಮ್ಮ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ವೆಲ್‌ನೆಸ್ ಡೇಟಾವನ್ನು <xliff:g id="ALLOW_MODE">%2$s</xliff:g> ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಅನುಮತಿಸಲಾಗಿದೆ"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"ಓದಲು ಅನುಮತಿಸಲಾಗಿದೆ"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ಈ ಅನುಮತಿಗಳು ನಿಮ್ಮ ಸಾಧನದ ಸೆನ್ಸರ್‌ಗಳಲ್ಲಿನ ಡೇಟಾಗೆ <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಆ್ಯಕ್ಸೆಸ್ ನೀಡುತ್ತದೆ."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="NUMBER_0">%1$d</xliff:g> ಆ್ಯಪ್‌ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"ಯಾವುದೇ ಆ್ಯಪ್‌ಗಳು ವಿನಂತಿಸಿಕೊಳ್ಳುತ್ತಿಲ್ಲ"</string>
+    <string name="allowed" msgid="4158456017482263737">"ಅನುಮತಿಸಲಾಗಿದೆ"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ಈ ಅನುಮತಿಯನ್ನು ಹೊಂದಿರುವ ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ ಸಾಧನದ ಸೆನ್ಸರ್‌ಗಳಿಂದ <xliff:g id="DATA_TYPE">%s</xliff:g> ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"ನಿಮ್ಮ ವಾಚ್‌ನಲ್ಲಿರುವ ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳಿಗೆ <xliff:g id="DATA_TYPE">%s</xliff:g> ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ತೆಗೆದುಹಾಕಬೇಕೇ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"ಚೆಕ್‌ ಮಾರ್ಕ್"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"ಅಡ್ಡ ಗುರುತು"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"ಪ್ರಸ್ತುತ, <xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಮ್ಮ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ವೆಲ್‌ನೆಸ್ ಡೇಟಾವನ್ನು <xliff:g id="ALLOW_MODE">%2$s</xliff:g> ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"ಎಲ್ಲಾ ಸಮಯದಲ್ಲೂ ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ವೆಲ್‌ನೆಸ್ ಡೇಟಾಗೆ <xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g> ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿದೆ."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ಫಿಟ್‌ನೆಸ್ ಮತ್ತು ವೆಲ್‌ನೆಸ್ ಅನುಮತಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
 </resources>
diff --git a/apk/res/values-ko/strings.xml b/apk/res/values-ko/strings.xml
index 0d1d6a6..82f06d3 100644
--- a/apk/res/values-ko/strings.xml
+++ b/apk/res/values-ko/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"기기에서 건강 및 피트니스 데이터를 관리하고 이러한 데이터에 액세스할 수 있는 앱을 제어하세요."</string>
     <string name="data_title" msgid="4456619761533380816">"데이터 및 액세스"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"건강 기록 살펴보기"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"건강 기록 및 건강 기록에 액세스할 수 있는 앱을 확인합니다."</string>
     <string name="all_categories_title" msgid="1446410643217937926">"모든 카테고리"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"모든 카테고리 보기"</string>
     <string name="no_data" msgid="1906986019249068659">"데이터 없음"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"어제"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"읽기: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"쓰기: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"권한 관리"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"시간: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"활동"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"건강 데이터 액세스"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"칼로리 소모량 읽기"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"앱에서 칼로리 소모량을 읽도록 허용"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"백그라운드에서 데이터에 액세스"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 백그라운드에서 데이터에 액세스하도록 허용하시겠습니까?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 백그라운드에서 데이터에 액세스하도록 허용하시겠습니까?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"허용하면 이 앱을 사용하지 않을 때 앱에서 피트니스 및 웰니스 데이터와 건강 기록에 액세스할 수 있습니다."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"허용하면 이 앱을 사용하지 않을 때 앱에서 건강 기록에 액세스할 수 있습니다."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"허용하면 이 앱을 사용하지 않을 때 앱에서 피트니스 및 웰니스 데이터에 액세스할 수 있습니다."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"허용하면 이 앱을 사용하지 않을 때 앱에서 헬스 커넥트 데이터에 액세스할 수 있습니다."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 이전 데이터에 액세스하도록 허용하시겠습니까?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"허용하면 이 앱에서 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> 이전에 추가된 피트니스 및 웰니스 데이터에 액세스할 수 있습니다."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"허용하면 이 앱에서 모든 이전 피트니스 및 웰니스 데이터에 액세스할 수 있습니다."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"허용하면 이 앱에서 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> 이전에 추가된 헬스 커넥트 데이터에 액세스할 수 있습니다."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"허용하면 이 앱에서 모든 이전 헬스 커넥트 데이터에 액세스할 수 있습니다."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 추가 액세스를 허용하시겠습니까?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 헬스 커넥트 설정에도 액세스하려고 합니다."</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"백그라운드에서 모든 데이터에 액세스"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"백그라운드에서 건강 기록에 액세스"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"백그라운드에서 피트니스 및 웰니스 데이터에 액세스"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"이 앱을 사용하지 않을 때 앱에서 피트니스 및 웰니스 데이터와 건강 기록에 액세스하도록 허용"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"이 앱을 사용하지 않을 때 앱에서 이 데이터에 액세스하도록 허용"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"이 앱을 사용하지 않을 때 앱에서 이 데이터에 액세스하도록 허용"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"백그라운드에서 데이터에 액세스"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"이 앱을 사용하지 않을 때 앱에서 헬스 커넥트 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"이전 피트니스 및 웰니스 데이터에 액세스"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"이 앱에서 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> 이전에 추가된 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"이 앱에서 모든 이전 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"이전 데이터에 액세스"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"이 앱에서 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> 이전에 추가된 헬스 커넥트 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"이 앱에서 모든 이전 헬스 커넥트 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 이미 내 건강 기록의 과거 데이터에 액세스할 수 있습니다."</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"권한에 대해 자세히 알아보기"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"백그라운드에서 모든 데이터에 액세스"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"백그라운드에서 건강 기록에 액세스"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"백그라운드에서 피트니스 및 웰니스 데이터에 액세스"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"이 앱을 사용하지 않을 때 앱에서 피트니스 및 웰니스 데이터와 건강 기록에 액세스하도록 허용"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"이 앱을 사용하지 않을 때 앱에서 이 데이터에 액세스하도록 허용"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"이 앱을 사용하지 않을 때 앱에서 이 데이터에 액세스하도록 허용"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"백그라운드에서 데이터에 액세스"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"이 앱을 사용하지 않을 때 앱에서 헬스 커넥트 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"이전 피트니스 및 웰니스 데이터에 액세스"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"이 앱에서 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> 이전에 추가된 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"이 앱에서 모든 이전 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"이전 데이터에 액세스"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"이 앱에서 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> 이전에 추가된 헬스 커넥트 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"이 앱에서 모든 이전 헬스 커넥트 데이터에 액세스하도록 허용"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 읽기 권한이 없으므로 현재 읽고 있는 피트니스 데이터가 없습니다."</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 이미 내 건강 기록의 과거 데이터에 액세스할 수 있습니다. 변경하려면 이 앱의 건강 기록 권한을 사용 중지하세요."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"건강 기록 권한 관리"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"이 앱의 백그라운드 또는 과거 데이터 액세스를 사용 설정하려면 읽기 권한을 1개 이상 사용 설정하세요."</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"이 앱의 백그라운드 액세스를 사용 설정하려면 읽기 권한을 1개 이상 사용 설정하세요."</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"이 앱의 과거 데이터 액세스를 사용 설정하려면 읽기 권한을 1개 이상 사용 설정하세요."</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"이 앱에서 모든 이전 헬스 커넥트 데이터에 액세스하도록 허용"</string>
     <string name="background_read_description" msgid="3203594555849969283">"이 앱을 사용하지 않을 때 앱에서 헬스 커넥트 데이터에 액세스하도록 허용"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"허용하면 이 앱을 사용하지 않을 때 앱에서 헬스 커넥트 데이터에 액세스할 수 있습니다."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"이전 데이터에 액세스"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 이전 데이터에 액세스하도록 허용하시겠습니까?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"이 앱에서 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> 이전에 추가된 헬스 커넥트 데이터에 액세스하도록 허용"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"이 앱에서 모든 이전 헬스 커넥트 데이터에 액세스하도록 허용"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"허용하면 이 앱에서 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> 이전에 추가된 헬스 커넥트 데이터에 액세스할 수 있습니다."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"허용하면 이 앱에서 모든 이전 헬스 커넥트 데이터에 액세스할 수 있습니다."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"활동 칼로리 소모량"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"활동 칼로리 소모량"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"활동 칼로리 소모량 읽기"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"휠체어 밀기"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"휠체어 밀기 읽기"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"휠체어 밀기 쓰기"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"활동 강도"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"활동 강도"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"활동 강도 읽기"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"활동 강도 쓰기"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"기초대사율"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"기초대사율"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"기초대사율 읽기"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"피부 온도"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"피부 온도 읽기"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"피부 온도 쓰기"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"여기에는 헬스 커넥트에 동기화되고 추가된 모든 건강 기록이 포함됩니다. 전체 의료 기록이 아닐 수 있으며, 건강 기록에 대한 의학적 설명은 포함되지 않습니다."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"모든 건강 기록"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"모든 건강 기록"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"모든 건강 기록 작성"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"알레르기"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"알레르기"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"알레르기 데이터 읽기"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"예방 접종"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"예방 접종"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"예방 접종 데이터를 읽습니다."</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"검사 결과"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"검사 결과"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"검사 결과 데이터 읽기"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"알레르기"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"알레르기"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"알레르기 데이터 읽기"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"조건"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"조건"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"조건 읽기"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"백신"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"백신"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"백신 데이터 읽기"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"실험실 결과"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"실험실 결과"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"실험실 결과 읽기"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"복용약"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"복용약"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"복용약 정보 읽기"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"개인 정보"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"개인 정보"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"개인 정보 읽기"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"의료인 정보"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"의료인 정보"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"의료인 정보 읽기"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"임신"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"임신"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"임신 데이터 읽기"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"문제"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"문제"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"문제 데이터 읽기"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"시술"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"시술"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"시술 데이터 읽기"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"사회력"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"소셜 기록"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"사회력"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"사회력 데이터 읽기"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"활력 징후"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"방문수"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"방문수"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"방문 읽기"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"생체 신호"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"활력 징후"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"활력 징후 데이터 읽기"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"마음챙김"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"마음챙김 작성"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”에 읽기 권한 부여"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”에 쓰기 권한 부여"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"취소"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"허용"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"모두 허용"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"허용 안함"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"앱이 헬스 커넥트에서 읽거나 쓸 수 있도록 허용할 데이터를 선택하세요."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"앱이 헬스 커넥트에서 읽거나 쓸 수 있도록 허용할 데이터를 선택하세요."</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"앱이 헬스 커넥트에서 읽을 수 있도록 허용할 데이터를 선택하세요."</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"앱이 헬스 커넥트에 쓸 수 있도록 허용할 데이터를 선택하세요."</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"읽기 액세스 권한을 부여하면 앱에서 새로운 데이터와 지난 30일간의 데이터를 읽을 수 있습니다."</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"읽기 액세스 권한을 부여하면 앱에서 새로운 데이터와 이전 데이터를 읽을 수 있습니다."</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 헬스 커넥트에 액세스할 수 있도록 허용하시겠습니까?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"개발자의 <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>에서 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱의 데이터 처리 방법을 알아볼 수 있습니다."</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 피트니스 및 웰니스 데이터에 액세스하도록 허용하시겠습니까?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>에서 <xliff:g id="APP_NAME">%1$s</xliff:g>의 데이터 처리 방식을 알아볼 수 있습니다."</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"개인정보처리방침"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 건강 기록에 액세스하도록 허용하시겠습니까?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"액세스 권한을 부여하면 앱에서 알레르기, 임상 결과, 백신 등과 같은 데이터를 읽고 쓸 수 있습니다\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"액세스 권한을 부여하면 앱에서 알레르기, 임상 결과, 백신 등과 같은 데이터를 읽을 수 있습니다\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"건강 기록에 관한 정보"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"공유할 데이터에 포함되는 항목"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"허용하면 <xliff:g id="APP_NAME">%1$s</xliff:g>에서 헬스 커넥트와 건강 기록을 공유할 수 있습니다."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"다양한 앱과 소스의 건강 기록을 동기화하여 한곳에 보관합니다."</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"모든 권한을 삭제하시겠습니까?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"전체 삭제"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 더 이상 헬스 커넥트의 데이터를 읽거나 쓸 수 없습니다.\n\n카메라, 마이크, 위치 등 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 더 이상 헬스 커넥트의 데이터(과거 데이터 포함)를 읽거나 쓸 수 없습니다.\n\n위치, 카메라, 마이크 등 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 더 이상 헬스 커넥트의 데이터(백그라운드 및 과거 데이터 포함)를 읽거나 쓸 수 없습니다.\n\n위치, 카메라, 마이크 등 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"헬스 커넥트에서 <xliff:g id="APP_NAME">%1$s</xliff:g> 데이터도 삭제"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"모든 권한을 삭제하시겠어요?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"모든 건강 기록 권한을 삭제하시겠어요?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"피트니스 및 웰니스 권한을 모두 삭제하시겠어요?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"헬스 커넥트에서 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱의 피트니스 데이터도 삭제"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"모든 건강 기록 권한을 삭제하시겠어요?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"헬스 커넥트에서 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱의 건강 기록도 삭제"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 더 이상 헬스 커넥트의 데이터를 읽거나 쓸 수 없습니다.\n\n이는 카메라, 마이크 또는 위치와 같이 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 더 이상 헬스 커넥트의 데이터(백그라운드 데이터 포함)를 읽거나 쓸 수 없습니다.\n\n이는 카메라, 마이크 또는 위치와 같이 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 더 이상 헬스 커넥트의 데이터(이전 데이터 포함)를 읽거나 쓸 수 없습니다.\n\n이는 카메라, 마이크 또는 위치와 같이 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 더 이상 헬스 커넥트의 데이터(백그라운드 및 이전 데이터 포함)를 읽거나 쓸 수 없습니다.\n\n이는 카메라, 마이크 또는 위치와 같이 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"모든 권한을 삭제하시겠어요?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 더 이상 헬스 커넥트의 데이터를 읽거나 쓸 수 없습니다.\n\n이는 카메라, 마이크 또는 위치와 같이 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 더 이상 헬스 커넥트의 데이터(백그라운드 데이터 포함)를 읽거나 쓸 수 없습니다.\n\n이는 카메라, 마이크 또는 위치와 같이 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 더 이상 헬스 커넥트의 데이터(이전 데이터 포함)를 읽거나 쓸 수 없습니다.\n\n이는 카메라, 마이크 또는 위치와 같이 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 더 이상 헬스 커넥트의 데이터(백그라운드 및 이전 데이터 포함)를 읽거나 쓸 수 없습니다.\n\n이는 카메라, 마이크 또는 위치와 같이 이 앱에 부여된 다른 권한에는 영향을 미치지 않습니다."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"헬스 커넥트에서 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱의 피트니스 데이터 및 건강 기록도 삭제"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"이 앱의 권한이 삭제되었습니다."</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"모든 헬스 커넥트 데이터도 삭제"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"다음 날"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"선택한 날짜"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"전날"</string>
     <string name="default_error" msgid="7966868260616403475">"문제가 발생했습니다. 다시 시도해 주세요."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"알 수 없는 리소스"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"소스 데이터"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>여는 중괄호."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>닫는 중괄호."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> 필드 <xliff:g id="FIELD">%2$s</xliff:g> 값"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"앱의 액세스 권한은 취소되었지만 데이터는 계속해서 헬스 커넥트에 저장됩니다."</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱은 <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> 이후 추가된 데이터를 읽을 수 있습니다."</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"앱이 액세스할 수 있는 다른 Android 권한을 관리하려면 설정 &gt; 앱으로 이동하세요."</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱과 공유하는 데이터에는 앱의 개인정보처리방침이 적용됩니다."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 개발자의 개인정보처리방침에 따라 데이터를 처리하는 방식을 알아볼 수 있습니다."</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"앱이 액세스할 수 있는 다른 Android 권한을 관리하려면 설정으로 이동한 다음 앱을 탭하세요."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"개인정보처리방침 읽기"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"지난 24시간 이내에 액세스함"</string>
     <string name="app_access_title" msgid="7137018424885371763">"앱 액세스"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"현재 설치되어 있는 호환 앱이 없습니다"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"추가 액세스"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"과거 데이터, 백그라운드 데이터"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"이 앱의 추가 권한이 삭제되었습니다."</string>
     <string name="permissions_header" msgid="6519976063360071569">"권한"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"피트니스 및 웰빙"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"운동, 수면, 영양 등"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"건강 기록"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"건강 기록"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"임상 결과, 복용약, 예방 접종 등"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"임상 결과, 복용약, 백신 등"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"앱 권한 삭제됨"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"헬스 커넥트에서 <xliff:g id="APP_DATA">%s</xliff:g>의 권한을 삭제했습니다."</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"헬스 커넥트에서 <xliff:g id="APP_DATA_0">%1$s</xliff:g> 및 <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>의 권한을 삭제했습니다."</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play 스토어로 이동"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"헬스 커넥트 시작하기"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"헬스 커넥트는 건강 및 피트니스 데이터를 저장하여 기기에 설치된 다른 앱과 간편하게 동기화하도록 지원합니다."</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"헬스 커넥트는 여러 앱의 건강/피트니스 데이터를 저장하고 동기화합니다.\n\n"<b>"피트니스 및 웰빙 데이터"</b>"(운동 세션, 걸음 수, 영양, 수면 등)\n\n"<b>"건강 기록"</b>"(백신, 검사 결과 등)"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"헬스 커넥트를 사용하면 다음 작업을 할 수 있습니다."</string>
     <string name="share_data" msgid="3481932156368883946">"앱과 데이터 공유"</string>
     <string name="share_data_description" msgid="2919871301634375092">"각 앱이 헬스 커넥트에서 읽거나 쓸 수 있는 데이터를 선택하세요."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"설정 및 개인 정보 보호 관리"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"생리 양 적음"</string>
     <string name="flow_medium" msgid="3783688724668943154">"생리 양 보통"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"생리 양 많음"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"생리혈 양 알 수 없음"</string>
     <string name="period_day" msgid="3821944462093965882">"생리 <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>일 중 <xliff:g id="DAY">%1$d</xliff:g>일"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{기간(1일)}other{기간(#일)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"양성"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"음성"</string>
     <string name="ovulation_high" msgid="205362931427158291">"높음"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"음악"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"기타"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"자유"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"중간"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"격렬"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>분"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>시간 <xliff:g id="MIN">%2$s</xliff:g>분"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>시간"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"통합 진행 중"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"헬스 커넥트가 Android 시스템과 통합 중입니다.\n\n데이터와 권한을 이전하는 데 시간이 다소 걸릴 수 있습니다."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"절차가 완료되었다는 알림이 표시될 때까지 앱을 닫지 마세요."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"헬스 커넥트 통합 진행 중"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"업데이트 필요"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"설정에서 바로 액세스할 수 있도록 헬스 커넥트가 Android 시스템과 통합 중입니다."</string>
     <string name="update_button" msgid="4544529019832009496">"업데이트"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"헬스 커넥트가 시스템 설정과 통합을 계속할 수 있도록 업데이트를 시작하세요."</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"지금 업데이트"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"시스템 업데이트 필요"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"계속하기 전에 휴대전화 시스템을 업데이트하세요."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"휴대전화 시스템을 이미 업데이트했다면 휴대전화를 다시 시작하여 통합을 계속해 보세요."</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"헬스 커넥트 업데이트 필요"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"계속하기 전에 헬스 커넥트 앱을 최신 버전으로 업데이트하세요."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"추가 저장용량 필요"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"통합을 계속하기 위해 헬스 커넥트에 <xliff:g id="SPACE_NEEDED">%1$s</xliff:g>의 저장용량이 필요합니다.\n\n휴대전화에서 저장용량 일부를 정리한 후 다시 시도해 보세요."</string>
     <string name="try_again_button" msgid="8745496819992160789">"다시 시도"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"여유 공간 확보"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"추가 저장용량 필요"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"통합을 계속하기 위해 헬스 커넥트에 <xliff:g id="SPACE_NEEDED">%1$s</xliff:g>의 저장용량이 필요합니다."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"통합 일시중지됨"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"헬스 커넥트 앱이 Android 시스템과의 통합 중에 종료되었습니다.\n\n재개를 클릭하여 앱을 다시 열고 데이터 및 권한 이전을 계속하세요."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"헬스 커넥트 데이터를 유지하려면 <xliff:g id="TIME_NEEDED">%1$s</xliff:g> 이내에 완료하세요."</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"헬스 커넥트와 Android 시스템과의 통합을 계속하려면 탭하세요. 데이터를 유지하려면 <xliff:g id="TIME_NEEDED">%1$s</xliff:g> 이내에 완료하세요."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"헬스 커넥트와 Android 시스템과의 통합을 계속하려면 탭하세요."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"계속"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"헬스 커넥트 통합 재개"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"데이터를 유지하려면 <xliff:g id="TIME_NEEDED">%1$s</xliff:g> 이내에 완료하세요."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"앱 업데이트 필요"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"헬스 커넥트와 계속 동기화하려면 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 업데이트해야 합니다."</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"헬스 커넥트와 계속 동기화하려면 일부 앱을 업데이트해야 합니다."</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"헬스 커넥트와 계속 동기화하려면 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 업데이트해야 합니다. 앱에 따라 업데이트가 지원되지 않을 수도 있습니다."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"헬스 커넥트와 계속 동기화하려면 일부 앱을 업데이트해야 합니다. 앱에 따라 업데이트가 지원되지 않을 수도 있습니다."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"업데이트 확인"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"자세히 알아보기"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"헬스 커넥트 통합"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"헬스 커넥트 통합이 완료되지 않음"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"다시 사용할 수 있게 되면 알림이 전송됩니다."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"확인"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"헬스 커넥트 통합이 완료되지 않음"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"자세히 알아보기"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"헬스 커넥트 통합 완료"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"열기"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"새로운 기능"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"이제 설정에서 바로 헬스 커넥트에 액세스할 수 있습니다. 언제든 헬스 커넥트 앱을 제거하여 저장공간을 확보하세요."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"확인"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"앱 소스 수정"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"기기 기본값"</string>
     <string name="app_data_title" msgid="6499967982291000837">"앱 데이터"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"헬스 커넥트에 액세스할 수 있는 앱의 데이터가 여기에 표시됩니다."</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 데이터가 여기에 표시됩니다."</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"헬스 커넥트에 액세스할 수 있는 앱의 데이터가 여기에 표시됩니다."</string>
     <string name="date_picker_day" msgid="3076687507968958991">"일"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"주"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"월"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"지난달"</string>
     <string name="tab_entries" msgid="3402700951602029493">"항목"</string>
     <string name="tab_access" msgid="7818197975407243701">"액세스"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에 추가 액세스를 허용하시겠습니까?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에서 다음 헬스 커넥트 설정에도 액세스하려고 합니다."</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"이 앱의 백그라운드 또는 과거 데이터 액세스를 사용 설정하려면 읽기 권한을 1개 이상 사용 설정하세요."</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"이 앱의 백그라운드 액세스를 사용 설정하려면 읽기 권한을 1개 이상 사용 설정하세요."</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"이 앱의 과거 데이터 액세스를 사용 설정하려면 읽기 권한을 1개 이상 사용 설정하세요."</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"헬스 커넥트 사용 시작하기"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"첫 번째 앱을 동기화하여 앱 간에 건강 및 피트니스 데이터를 공유하세요"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"설정"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"호환 가능한 앱 보기"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"헬스 커넥트를 통해 <xliff:g id="APP_NAME">%s</xliff:g> 앱과 동기화할 앱 더보기"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"앱 스토어에서 보기"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"화면 잠금 설정"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"건강 데이터의 보안을 강화하려면 기기의 PIN, 패턴 또는 비밀번호를 설정하세요."</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"화면 잠금 설정"</string>
     <string name="select_all" msgid="837499881590001166">"모두 선택"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"연결된 앱에서 더 이상 이 헬스 커넥트 데이터를 읽을 수 없게 됩니다."</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"선택됨"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"선택되지 않음"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"운동 지도 경로 표시 사용 가능"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"다음 날"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"다음 주"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"다음 달"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"전날"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"지난주"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"지난달"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"모든 데이터를 완전히 삭제하시겠습니까?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"선택한 데이터를 완전히 삭제하시겠습니까?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"모든 <xliff:g id="APP_NAME">%s</xliff:g> 데이터를 완전히 삭제하시겠습니까?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> 주에 해당하는 선택한 <xliff:g id="APP_NAME">%1$s</xliff:g> 항목을 완전히 삭제하시겠습니까?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>에 해당하는 선택한 <xliff:g id="APP_NAME">%1$s</xliff:g> 항목을 완전히 삭제하시겠습니까?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"이 <xliff:g id="APP_NAME">%s</xliff:g> 항목을 완전히 삭제하시겠습니까?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g>의 <xliff:g id="DATA_TYPE">%1$s</xliff:g> 데이터를 완전히 삭제하시겠습니까?"</string>
+    <string name="on" msgid="8266542510798355807">"사용"</string>
+    <string name="off" msgid="6996623844428550649">"사용 안함"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g>에 액세스함"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"어제 <xliff:g id="TIME_DATE">%1$s</xliff:g>에 액세스함"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>에 액세스함"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"항상 허용"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"선택된 권한 허용"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"앱 사용 중"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"모두 거부"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 피트니스 및 웰니스 데이터에 액세스하도록 허용하시겠습니까?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DATA_TYPES">%2$s</xliff:g>에 대한 액세스 권한을 요청합니다.\n\n모두 허용하도록 선택하거나, 권한을 개별적으로 제어하세요"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 <xliff:g id="DATA_TYPE">%2$s</xliff:g>에 액세스하도록 허용하시겠습니까?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"피트니스 및 웰빙"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"항상"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"사용 중일 때"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"항상"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"사용 중일 때"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="ALLOW_MODE">%2$s</xliff:g> 모든 피트니스 및 웰니스 데이터에 액세스할 수 있습니다."</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"액세스 허용됨"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"읽기 허용됨"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"이 권한을 통해 <xliff:g id="APP_NAME">%1$s</xliff:g>에서 기기 센서의 데이터에 액세스할 수 있습니다."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"앱 <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>개 중 <xliff:g id="NUMBER_0">%1$d</xliff:g>개 허용됨"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"권한을 요청하는 앱 없음"</string>
+    <string name="allowed" msgid="4158456017482263737">"허용됨"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"허용되지 않음"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"이 권한이 있는 앱은 기기 센서의 <xliff:g id="DATA_TYPE">%s</xliff:g> 데이터에 액세스할 수 있습니다."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"시계의 모든 앱에서 <xliff:g id="DATA_TYPE">%s</xliff:g> 액세스 권한을 삭제하시겠습니까?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"체크표시"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"곱셈 기호"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"현재 <xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="ALLOW_MODE">%2$s</xliff:g> 피트니스 및 웰니스 데이터에 액세스할 수 있습니다."</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 항상 피트니스 및 웰니스 데이터에 액세스하도록 허용하시겠습니까?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DATA_TYPES">%2$s</xliff:g>에 액세스할 수 있습니다"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"피트니스 및 웰니스 권한 관리"</string>
 </resources>
diff --git a/apk/res/values-ky/strings.xml b/apk/res/values-ky/strings.xml
index b5dd685..a4707a7 100644
--- a/apk/res/values-ky/strings.xml
+++ b/apk/res/values-ky/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Түзмөгүңүздөн ден соолук жана дене-бойду чыңдоо маалыматын тескеп, алар кайсы колдонмолорго жеткиликтүү болорун көзөмөлдөйсүз"</string>
     <string name="data_title" msgid="4456619761533380816">"Колдонмодогу нерселер жана жеткиликтүүлүк"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Ден соолук жөнүндө маалыматты карап чыгуу"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Ден соолук жөнүндө маалыматты жана аларды кайсы колдонмолор пайдалана аларын карап чыгыңыз"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Бардык категориялар"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Бардык категорияларды көрүү"</string>
     <string name="no_data" msgid="1906986019249068659">"Эч нерсе жок"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Кечээ"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Окуу: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Жазуу: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Уруксаттарды башкаруу"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Убакыты: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Кыймылдуулук"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ден соолукка байланыштуу нерселерди көрүү мүмкүнчүлүгү"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Күйгүзүлгөн калорияларды окуу"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Колдонмо күйгүзүлгөн калорияларды окуй алат"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Фондогу нерселерди көрүү"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна маалыматтарды фондо колдонууга уруксат бересизби?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна маалыматты фондук режимде көрүүгө уруксат бересизби?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Эгер уруксат берсеңиз, бул колдонмо иштебей турганда, дене-бойду чыңдоо жана ден соолук жөнүндө маалыматты көрө алат."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Эгер уруксат берсеңиз, бул колдонмо иштебей турганда, ден соолук жөнүндө маалыматты көрө алат."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Эгер уруксат берсеңиз, бул колдонмо иштебей турганда, дене-бойду чыңдоо маалыматын көрө алат."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Эгер уруксат берсеңиз, бул колдонмо иштебей турганда, Health Connect маалыматын көрө алат."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна буга чейин сакталган нерселерди көрүүгө уруксат бересизби?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Эгер уруксат берсеңиз, бул колдонмо <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> чейин кошулган дене-бойду чыңдоо маалыматын көрө алат."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Эгер уруксат берсеңиз, бул колдонмо дене-бойду чыңдоо боюнча бардык мурунку маалыматтарды көрө алат."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Эгер уруксат берсеңиз, бул колдонмо Health Connect\'ке <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> чейин кошулган нерселерди көрө алат."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Эгер уруксат берсеңиз, бул колдонмо Health Connect\'ке буга чейин сакталган бардык нерселерди көрө алат."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кошумча уруксат бересизби?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> төмөнкү Health Connect параметрлерин да көрүүгө уруксат сурап жатат"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Фондук режимде бардык маалыматтарды көрүү"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Фондук режимде ден соолук жөнүндө маалыматты көрүү"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Фондук режимде дене-бойду чыңдоо маалыматын көрүү"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Колдонмо иштебей турганда, ага дене-бойду чыңдоо жана ден соолук жөнүндө маалыматты көрүүгө уруксат берүү"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Колдонмо иштебей турганда, ага бул маалыматты көрүүгө уруксат берүү"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Колдонмо иштебей турганда, ага бул маалыматты көрүүгө уруксат берүү"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Маалыматты фондук режимде көрүү"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Колдонмо иштебей турганда, ага Health Connect маалыматын көрүүгө уруксат берүү"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Дене-бойду чыңдоо боюнча мурунку маалыматты көрүү"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Бул колдонмого <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> чейин кошулган нерселерди көрүүгө уруксат берүү"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Бул колдонмого мурунку нерселердин баарын көрүүгө уруксат берүү"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Сакталган нерселерди көрүү"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Бул колдонмого Health Connect платформасына <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> чейин кошулган нерселерди көрүүгө уруксат берүү"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Бул колдонмого Health Connect платформасына буга чейин сакталган бардык нерселерди көрүүгө уруксат берүү"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ден соолук жөнүндө мурунку маалыматты көрүүгө уруксат алган"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Уруксаттар тууралуу көбүрөөк окуу"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Фондук режимде бардык маалыматтарды көрүү"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Фондук режимде ден соолук жөнүндө маалыматты көрүү"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Фондук режимде дене-бойду чыңдоо маалыматын көрүү"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Колдонмо иштебей турганда, ага дене-бойду чыңдоо жана ден соолук жөнүндө маалыматты көрүүгө уруксат берүү"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Колдонмо иштебей турганда, ага бул маалыматты көрүүгө уруксат берүү"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Колдонмо иштебей турганда, ага бул маалыматты көрүүгө уруксат берүү"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Маалыматты фондук режимде көрүү"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Колдонмо иштебей турганда, ага Health Connect маалыматын көрүүгө уруксат берүү"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Дене-бойду чыңдоо боюнча мурунку маалыматты көрүү"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Бул колдонмого <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> чейин кошулган нерселерди көрүүгө уруксат берүү"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Бул колдонмого мурунку нерселердин баарын көрүүгө уруксат берүү"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Сакталган нерселерди көрүү"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Бул колдонмого Health Connect платформасына <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> чейин кошулган нерселерди көрүүгө уруксат берүү"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Бул колдонмого Health Connect платформасына буга чейин сакталган бардык нерселерди көрүүгө уруксат берүү"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Учурда дене-бойду чыңдоо маалыматы окулбайт, анткени <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунун окууга уруксаты жок"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ден соолук жөнүндө мурунку маалыматтардагы дайындарга кире алат. Муну өзгөртүү үчүн бул колдонмонун ден соолук жөнүндө маалымат уруксаттарын өчүрүңүз"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Ден соолук жөнүндө маалыматтын уруксаттарын тескөө"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Бул колдонмого фондогу жана буга чейин сакталган нерселерди жеткиликтүү кылгыңыз келсе, жок дегенде окуганга уруксат бериңиз"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Бул колдонмого фондогу дайындарды колдонууга уруксат берүү үчүн кеминде бир уруксатты окууну иштетиңиз"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Бул колдонмого мурунку дайындарды колдонууга уруксат берүү үчүн кеминде бир уруксатты окууну иштетиңиз"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Бул колдонмого Health Connect платформасына буга чейин сакталган бардык нерселерди көрүүгө уруксат берүү"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Уруксат берсеңиз, бул колдонмо иштебей турса да, ага Health Connect платформасындагы нерселер жеткиликтүү болот"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Эгер уруксат берсеңиз, бул колдонмо иштебей турганда да, ага Health Connect\'те сакталган нерселер жеткиликтүү болот."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Сакталган нерселерди көрүү"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна буга чейин сакталган нерселерди жеткиликтүү кыласызбы?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Бул колдонмого Health Connect платформасына <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> чейин кошулган нерселерди жеткиликтүү кыласыз"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Бул колдонмого Health Connect платформасында буга чейин сакталган нерселерди жеткиликтүү кыласыз."</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Эгер уруксат берсеңиз, бул колдонмого Health Connect\'те <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> чейин сакталган нерселер жеткиликтүү болот."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Эгер уруксат берсеңиз, бул колдонмого Health Connect\'те сакталган нерселердин баары жеткиликтүү болот."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Кыймылдаганда күйгөн калориялар"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"кыймылдаганда күйгөн калориялар"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Кыймылдаганда күйгөн калорияларды окуу"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"майыптар арабасын түртүү"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Майыптар арабасын түртүүнү окуу"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Майыптар арабасын түртүүнү жазуу"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Кыймыл-аракеттердин интенсивдүүлүгү"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"кыймыл-аракеттердин интенсивдүүлүгү"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Кыймыл-аракеттердин интенсивдүүлүгү жөнүндө маалыматты окуу"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Кыймыл-аракеттердин интенсивдүүлүгүн жазуу"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Негизги зат алмашуу ылдамдыгы"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"негизги зат алмашуу ылдамдыгы"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Негизги зат алмашуу ылдамдыгын окуу"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"теринин температурасы"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Теринин температурасын окуу"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Теринин температурасын жазуу"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Буга Health Connect менен шайкештирилген жана ага кошулган ден соолук жөнүндө бардык маалымат кирет. Ал толук медициналык маалыматты бербей жана ден соолугуңуз жөнүндө маалыматтын түшүндүмөсүн көрсөтпөшү мүмкүн."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Ден соолук жөнүндө бардык маалымат"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"ден соолук жөнүндө бардык маалымат"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Ден соолук жөнүндө бардык маалыматты жазуу"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Аллергия"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"аллергия"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Аллергияны окуу"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Эмдөө"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"эмдөө"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Эмдөө маалыматын окуу"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Лабораториялык натыйжалар"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"лабораториялык натыйжалар"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Лабораториялык натыйжаларды окуу"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Аллергия"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"аллергия"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Аллергияны окуу"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Медициналык абал"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"медициналык абал"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Медициналык абалды окуу"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Эмдөөлөр"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"эмдөөлөр"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Эмдөөлөрдү окуу."</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Лабораториялык натыйжалар"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"лабораториялык натыйжалар"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Лабораториялык натыйжаларды окуу"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Дары-дармектер"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"дары-дармектер"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Дары-дармектер тууралуу маалыматтарды окуу"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Жеке маалымат"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"жеке маалымат"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Жеке маалыматты окуу"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Адис берген маалымат"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"адис берген маалымат"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Адис берген маалыматты окуу"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Кош бойлуулук"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"кош бойлуулук"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Кош бойлуулукту окуу"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Маселелер"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"маселелер"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Маселелерди окуу"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Процедуралар"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"процедуралар"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Процедураларды окуу"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Коомдук тарых"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Коомдук тарых"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"коомдук тарых"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Коомдук тарыхты окуу"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Маанилүү белгилер"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Докторго көрүнүү"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"докторго көрүнүү"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Докторго көрүнүү тууралуу маалыматты окуу"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Маанилүү белгилер"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"маанилүү белгилер"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Маанилүү белгилерди окуу"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Аңдоо"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Аңдоо сеансын жазуу"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” колдонмосуна окууга уруксат берүү"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” колдонмосуна жазууга уруксат берүү"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Жок"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Уруксат берүү"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Баарына уруксат берүү"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Тыюу салуу"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Бул колдонмо окуп же Health Connect\'ке жаза турган нерселерди тандаңыз"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Бул колдонмо окуп же Health Connect\'ке жаза турган нерселерди тандаңыз"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Бул колдонмо Health Connect\'тен окуй турган нерселерди тандаңыз"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Бул колдонмо Health Connect\'ке жаза турган нерселерди тандаңыз"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Эгер окуу мүмкүнчүлүгүн берсеңиз, бул колдонмо жаңы жана соңку 30 күндөгү маалыматтарды окуй алат"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Эгер окуу мүмкүнчүлүгүн берсеңиз, бул колдонмо жаңы жана мурунку маалыматтарды окуй алат"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна Health Connect\'ке кирүүгө уруксат бересизби?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу сизге таандык нерселерди кантип иштете турганын иштеп чыгуучунун бул документинен биле аласыз:<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна дене-бойду чыңдоо маалыматын көрүүгө уруксат бересизби?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу маалыматыңызды кантип иштете турганын анын <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> купуялык эрежелеринен биле аласыз"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"купуялык эрежелери"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна ден соолук жөнүндө маалыматыңызга кирүүгө уруксат бересизби?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Эгер уруксат берсеңиз, колдонмо аллергия, лабораториялык натыйжалар, вакциналар жана башка маалыматтарды окуп жана жаза алат\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Эгер уруксат берсеңиз, колдонмо аллергия, лабораториялык натыйжалар, вакциналар жана башка маалыматтарды окуй алат\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Ден соолук жөнүндө маалымат"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Бөлүшүлө турган маалыматка төмөнкүлөр кирет:"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Эгер уруксат берсеңиз, <xliff:g id="APP_NAME">%1$s</xliff:g> ден соолук жөнүндө маалыматыңызды Health Connect менен бөлүшө алат."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Ден соолук жөнүндө маалыматтарды ар кандай колдонмолордон жана булактардан шайкештирип, бир жерде сактаңыз"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Бардык уруксаттар өчүрүлсүнбү?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Баарын өчүрүү"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги эч кандай маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, камера, микрофон же жайгашкан жерге кедергисин тийгизбейт."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги, ошондой эле буга чейин сакталган нерселерди окуп же жаза албай калат.\n\nБул нерсенин колдонмодогу жайгашкан жерди аныктоо, камераны же микрофонду пайдалануу сыяктуу уруксаттарга таасири тийбейт."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги, ошондой эле фондогу жана сакталган нерселерди окуп же жаза албай калат.\n\nБул нерсенин колдонмодогу жайгашкан жерди аныктоо, камераны же микрофонду пайдалануу сыяктуу уруксаттарга таасири тийбейт."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect\'тен алынган <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосундагы нерселер да өчүрүлсүн"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Бардык уруксаттар өчүрүлсүнбү?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Ден соолук жөнүндө бардык маалымат өчүрүлсүнбү?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Бардык фитнес жана саламаттык уруксаттары өчүрүлсүнбү?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Ошондой эле Health Connect\'теги <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунан дене-бойду чыңдоо маалыматын өчүрүңүз"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Ден соолук жөнүндө бардык маалымат өчүрүлсүнбү?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Ошондой эле Health Connect\'теги <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунан ден соолук жөнүндө маалыматты өчүрүңүз"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, камера, микрофон же жайгашкан жерге кедергисин тийгизбейт."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги эч кандай, анын ичинде фондогу маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, жайгашкан жер, камера же микрофонго кедергисин тийгизбейт."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги эч кандай, анын ичинде мурдагы маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, жайгашкан жер, камера же микрофонго кедергисин тийгизбейт."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги эч кандай, анын ичинде фондогу маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, жайгашкан жер, камера же микрофонго кедергисин тийгизбейт."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Бардык уруксаттар өчүрүлсүнбү?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, камера, микрофон же жайгашкан жерге кедергисин тийгизбейт."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги эч кандай, анын ичинде фондогу маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, жайгашкан жер, камера же микрофонго кедергисин тийгизбейт."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги эч кандай, анын ичинде мурдагы маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, жайгашкан жер, камера же микрофонго кедергисин тийгизбейт."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> мындан ары Health Connect\'теги эч кандай, анын ичинде фондогу маалыматты окуп же жаза албай калат.\n\nБул нерсе колдонмодогу башка уруксаттарга, мисалы, жайгашкан жер, камера же микрофонго кедергисин тийгизбейт."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Ошондой эле Health Connect\'теги <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунан дене-бойду чыңдоо маалыматы жана ден соолук жөнүндө маалыматты өчүрүңүз"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Бул колдонмо үчүн уруксаттар өчүрүлдү"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Health Connect\'теги бардык маалыматтарды да өчүрүү"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Кийинки күн"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Тандалган күн"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Мурунку күн"</string>
     <string name="default_error" msgid="7966868260616403475">"Бир жерден ката кетти. Кайталап көрүңүз."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Белгисиз булак"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Баштапкы маалымат"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Чарчы кашаа."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Жабык кашаа."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g>Талаа<xliff:g id="FIELD">%2$s</xliff:g> мааниси"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Бул колдонмолорго бул нерселер мындан ары жеткиликсиз, бирок алар Health Connect\'те сактала берет"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> кийин кошулган маалыматты окуй алат"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Бул колдонмодогу башка Android уруксаттарын башкаруу үчүн Параметрлер &gt; Колдонмолорго өтүңүз"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> менен бөлүшкөн нерселериңиз анын купуялык эрежелери менен корголот."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Иштеп чыгуучунун купуялык эрежелеринен <xliff:g id="APP_NAME">%1$s</xliff:g> маалыматыңызды кандайча иштетерин биле аласыз"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Бул колдонмодогу башка Android уруксаттарын тескөө үчүн Тууралоого өтүп, Колдонмолорду таптап коюңуз"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Купуялык эрежелерин окуп чыгуу"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Акыркы 24 сааттын ичинде колдонулган"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Колдонмого жеткиликтүү нерселер"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Учурда орнотулган шайкеш колдонмолоруңуз жок"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Кошумча мүмкүнчүлүк берүү"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Мурунку маалыматтар, фондук режим"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Бул колдонмонун кошумча уруксаттары өчүрүлдү"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Уруксаттар"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Фитнес жана саламаттык"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Көнүгүү, уйку, тамактануу жана башкалар"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Ден соолук жөнүндө маалымат"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ден соолук жөнүндө маалымат"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Лабораториялык натыйжалар, дарылар, эмдөөлөр жана башкалар"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Лабораториялык натыйжалар, дарылар, эмдөөлөр жана башкалар"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Колдонмолордун өчүрүлгөн уруксаттары"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect <xliff:g id="APP_DATA">%s</xliff:g> колдонмосунун уруксаттарын өчүрдү"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect <xliff:g id="APP_DATA_0">%1$s</xliff:g> жана <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> колдонмолорунун уруксаттарын өчүрдү"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store\'го өтүү"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect\'ти колдонуп баштоо"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect кызматы ден соолук жана дене-бойду чыңдоо маалыматын сактап, аларды түзмөктөгү башка колдонмолор менен шайкештирет"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ар кайсы колдонмолордон алынган ден соолук жана спорт маалыматтарын сактап жана шайкештирет.\n\n"<b>"Дене-бойду чыңдоо маалыматы,"</b>" анын ичинде машыгуу сеанстары, кадамдар, тамактануу, уйку жана башкалар\n\n"<b>"Ден соолук жөнүндө маалымат,"</b>" анын ичинде эмдөөлөр, лаборатоциялык натыйжалар жана башкалар"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect менен төмөнкүлөрдү аткара аласыз:"</string>
     <string name="share_data" msgid="3481932156368883946">"Колдонмолор менен ар кандай нерселерди бөлүшүү"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Ар бир колдонмо Health Connect кызматында кандай маалыматты окуп, сактай ала турганын тандайсыз"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Параметрлерди жана купуялыкты тескөө"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Аз"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Орточо"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Көп"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Этек кир тууралуу маалымат жок"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> ичинен <xliff:g id="DAY">%1$d</xliff:g>-күн"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Этек кир (1 күн)}other{Этек кир (# күн)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Оң"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Терс"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Жогору"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Музыка"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Башка"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Жетексиз"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Орточо"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Жигердүү"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> мүн."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> с. <xliff:g id="MIN">%2$s</xliff:g> мүн."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> с."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Интеграция аткарылууда"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect Android системасына интеграцияланууда.\n\nАндагы нерселериңиз менен уруксаттарыңызды өткөрүү үчүн бир аз убакыт кетиши мүмкүн."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Интеграцияланып бүттү деген билдирме алынмайынча, колдонмону жаппай туруңуз."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect интеграциясы аткарылууда"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Жаңыртуу талап кылынат"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect Android системасына интеграцияланууда. Бүткөндөн кийин, аны түздөн-түз параметрлерден ача аласыз."</string>
     <string name="update_button" msgid="4544529019832009496">"Жаңыртуу"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Health Connect тутум жөндөөлөрүңүз менен интеграцияны уланта алышы үчүн бул жаңыртууну баштаңыз"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Азыр жаңыртуу"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Системаны жаңыртуу керек"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Улантуудан мурун телефонуңуздун системасын жаңыртыңыз."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Эгер телефонуңуздун системасын жаңырткан болсоңуз, интеграцияны улантуу үчүн телефонуңузду өчүрүп күйгүзүп көрүңүз"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect колдонмосун жаңыртуу керек"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Улантуудан мурун Health Connect колдонмосун эң акыркы версиясына жаңыртыңыз."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Көбүрөөк орун керек"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Интеграцияны улантуу үчүн Health Connect колдонмосуна телефонуңуздан <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> орун керек.\n\nТелефонуңуздан орун бошотуп, кайталап көрүңүз."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Кайталоо"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Орун бошотуу"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Көбүрөөк орун керек"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Интеграцияны улантуу үчүн Health Connect колдонмосуна телефонуңуздан <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> орун керек."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Интеграция тындырылды"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect колдонмосу Android системасына интеграцияланып жатканда жабылды.\n\nКолдонмону кайра ачып, андагы нерселериңизди жана уруксаттарыңызды өткөрүүнү улантуу үчүн \"Улантуу\" баскычын басыңыз."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect дайындарыңызды сактап калуу үчүн муну <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ичинде аягына чыгарыңыз"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect\'ти Android системасына интеграциялоону улантуу үчүн таптап коюңуз. Ал жердеги нерселериңиз жоголуп кетпеши үчүн <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ичинде бүтүрүңүз"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect Android системасына интеграциялана бериши үчүн таптап коюңуз."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Улантуу"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect интеграциясын улантыңыз"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Ал жердеги нерселериңиз жоголуп кетпеши үчүн <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ичинде бүтүрүңүз"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Колдонмону жаңыртуу керек"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect менен шайкештирүүнү улантуу үчүн <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосун жаңыртуу керек"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect менен шайкештирүүнү улантуу үчүн айрым колдонмолорду жаңыртуу керек"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect менен шайкештирүүнү улантуу үчүн <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосун жаңыртуу керек. Жаңыртуулар айрым колдонмолор үчүн жеткиликсиз болушу мүмкүн."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect менен шайкештирүүнү улантуу үчүн айрым колдонмолорду жаңыртуу керек. Жаңыртуулар айрым колдонмолор үчүн жеткиликсиз болушу мүмкүн."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Жаңыртууларды карап көрүү"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Кеңири маалымат"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect интеграциясы"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect интеграцияланган жок"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Ал кайра жеткиликтүү болгондо билдирме аласыз."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Түшүндүм"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect интеграцияланган жок"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Дагы окуу"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect интеграциясы аяктады"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Ачуу"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Эмне жаңылык"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Эми Health Connect\'ке түздөн-түз параметрлериңизден кире аласыз. Сактагычтан орун бошотуу үчүн Health Connect колдонмосун каалаган убакта чыгарып салсаңыз болот."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Түшүндүм"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Колдонмо булактарын түзөтүү"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Түзмөктүн демейки параметри"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Колдонмонун дайындары"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Колдонмолордогу Health Connect кызматына байланыштуу нерселер ушул жерде көрүнөт"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосундагы маалымат бул жерде көрсөтүлөт"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Колдонмолордогу Health Connect кызматына байланыштуу нерселер ушул жерде көрүнөт"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Күн"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Апта"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Ай"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Өткөн ай"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Киргизилген нерселер"</string>
     <string name="tab_access" msgid="7818197975407243701">"Мүмкүнчүлүгү бар колдонмолор"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кошумча уруксат бересизби?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> төмөнкү Health Connect параметрлерин да колдонууга уруксат сурап жатат"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Бул колдонмого фондогу жана буга чейин сакталган нерселерди жеткиликтүү кылгыңыз келсе, жок дегенде окуганга уруксат бериңиз"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Бул колдонмого фондогу дайындарды колдонууга уруксат берүү үчүн кеминде бир уруксатты окууну иштетиңиз"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Бул колдонмого мурунку дайындарды колдонууга уруксат берүү үчүн кеминде бир уруксатты окууну иштетиңиз"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect\'ти колдонуп баштаңыз"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Колдонмолордун арасында ден соолук жана спорт тууралуу маалыматты бөлүшүү үчүн аларды шайкештириңиз"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Тууралоо"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Шайкеш колдонмолорду көрүңүз"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect аркылуу <xliff:g id="APP_NAME">%s</xliff:g> менен шайкештириле турган башка колдонмолорду табыңыз"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Колдонмолор дүкөнүндө көрүү"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Экран кулпусун коюп алыңыз"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Ден-соолук маалыматыңыздын кошумча коопсуздугу үчүн бул түзмөккө PIN кодду, графикалык ачкычты же сырсөздү коюңуз"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Экран кулпусун коюу"</string>
     <string name="select_all" msgid="837499881590001166">"Баарын тандоо"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Байланышкан колдонмолорго Health Connect кызматындагы бул нерселер жеткиликсиз болуп калат"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Белгиленди"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Белгиленген жок"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Картада машыгуу маршруту жеткиликтүү"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Кийинки күн"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Кийинки апта"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Кийинки ай"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Мурунку күн"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Мурунку апта"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Мурунку ай"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Бардык маалыматты биротоло өчүрөсүзбү?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Тандалган маалымат биротоло өчүрүлсүнбү?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Бардык <xliff:g id="APP_NAME">%s</xliff:g> маалыматын биротоло өчүрөсүзбү?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Белгилүү бир апта (<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>) боюнча тандалган <xliff:g id="APP_NAME">%1$s</xliff:g> маалыматы биротоло өчүрүлсүнбү?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Белгилүү бир ай (<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>) боюнча тандалган <xliff:g id="APP_NAME">%1$s</xliff:g> маалыматы биротоло өчүрүлсүнбү?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"<xliff:g id="APP_NAME">%s</xliff:g> маалыматын биротоло өчүрөсүзбү?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> колдонмосундагы <xliff:g id="DATA_TYPE">%1$s</xliff:g> биротоло өчүрүлсүнбү?"</string>
+    <string name="on" msgid="8266542510798355807">"Күйүк"</string>
+    <string name="off" msgid="6996623844428550649">"Өчүк"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Cаат <xliff:g id="TIME_DATE">%1$s</xliff:g> колдонулду"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Кечээ саат <xliff:g id="TIME_DATE">%1$s</xliff:g> колдонулду"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> саат <xliff:g id="TIME_DATE_1">%2$s</xliff:g> колдонулду"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Ар дайым уруксат берүү"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Тандалгандарга уруксат берүү"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Колдонмо ачылып турганда"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Баарын четке кагуу"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна дене-бойду чыңдоо маалыматын көрүүгө уруксат бересизби?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g> тууралуу маалыматты көрүүгө уруксат сурап жатат.\n\nБаарына уруксат берүү үчүн тандап же ар бирин өзүнчө көзөмөлдөңүз."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPE">%2$s</xliff:g> тууралуу маалыматты көрө берсинби?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Фитнес жана саламаттык"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ар дайым"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"колдонулганда"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Ар дайым"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Колдонулганда"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> бардык фитнес жана саламаттык маалыматыңызга кире алат <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Кирүүгө уруксат берилген"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Окууга уруксат берилген"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Бул уруксаттар <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна түзмөгүңүздүн сенсорлорунан маалыматка кирүү мүмкүнчүлүгүн берет."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> колдонмонун ичинен <xliff:g id="NUMBER_0">%1$d</xliff:g> уруксат берилген"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Уруксат сураган колдонмолор жок"</string>
+    <string name="allowed" msgid="4158456017482263737">"Уруксат берилген"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Тыюу салынган"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Бул уруксаты бар колдонмолор түзмөгүңүздүн сенсорлорунан <xliff:g id="DATA_TYPE">%s</xliff:g> маалыматына кире алышат."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Саатыңыздагы бардык колдонмолор үчүн <xliff:g id="DATA_TYPE">%s</xliff:g> кирүү мүмкүнчүлүгү өчүрүлсүнбү?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Белгиленме"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Крест белгиси"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Учурда <xliff:g id="APP_NAME">%1$s</xliff:g> фитнес жана саламаттык маалыматыңызга кире алат: <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна фитнес жана саламаттык маалыматтарын ар дайым колдонууга уруксат бересизби?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> төмөнкүнү колдоно алат: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Фитнес жана саламаттык уруксаттарын тескөө"</string>
 </resources>
diff --git a/apk/res/values-lo/strings.xml b/apk/res/values-lo/strings.xml
index 921c038..a54ddcc 100644
--- a/apk/res/values-lo/strings.xml
+++ b/apk/res/values-lo/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ຈັດການຂໍ້ມູນສຸຂະພາບ ແລະ ການອອກກຳລັງກາຍຢູ່ອຸປະກອນຂອງທ່ານ ແລະ ຄວບຄຸມວ່າແອັບໃດສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້"</string>
     <string name="data_title" msgid="4456619761533380816">"ຂໍ້ມູນ ແລະ ສິດເຂົ້າເຖິງ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"ເລືອກເບິ່ງຂໍ້ມູນສຸຂະພາບ"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"ເບິ່ງຂໍ້ມູນສຸຂະພາບ ແລະ ເບິ່ງວ່າແອັບໃດສາມາດເຂົ້າເຖິງພວກມັນໄດ້"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"ໝວດໝູ່ທັງໝົດ"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"ເບິ່ງໝວດໝູ່ທັງໝົດ"</string>
     <string name="no_data" msgid="1906986019249068659">"ບໍ່ມີຂໍ້ມູນ"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ມື້ວານນີ້"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"ອ່ານ: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"ຂຽນ: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"ຈັດການການອະນຸຍາດ"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"ເວລາ: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"ກິດຈະກຳ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ເຂົ້າເຖິງຂໍ້ມູນສຸຂະພາບຂອງທ່ານ"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"ອ່ານຂໍ້ມູນແຄລໍຣີທີ່ໃຊ້ໄປ"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"ອະນຸຍາດໃຫ້ແອັບອ່ານຂໍ້ມູນແຄລໍຣີທີ່ໃຊ້ໄປ"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"ເຂົ້າເຖິງຂໍ້ມູນໃນພື້ນຫຼັງ"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງຂໍ້ມູນໃນພື້ນຫຼັງບໍ?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງຂໍ້ມູນໃນພື້ນຫຼັງບໍ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນ ພ້ອມທັງຂໍ້ມູນສຸຂະພາບເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບໄດ້."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນສຸຂະພາບເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບໄດ້."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບໄດ້."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນ Health Connect ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບໄດ້."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາບໍ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນທີ່ເພີ່ມໄວ້ກ່ອນວັນທີ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ໄດ້."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນທີ່ຜ່ານມາທັງໝົດໄດ້."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ເພີ່ມໄວ້ກ່ອນວັນທີ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ໄດ້."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ຜ່ານມາທັງໝົດໄດ້."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງການຕັ້ງຄ່າເພີ່ມເຕີມບໍ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຕ້ອງການເຂົ້າເຖິງການຕັ້ງຄ່າ Health Connect ເຫຼົ່ານີ້ນຳ"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"ເຂົ້າເຖິງຂໍ້ມູນທັງໝົດໃນພື້ນຫຼັງ"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ເຂົ້າເຖິງຂໍ້ມູນສຸຂະພາບໃນພື້ນຫຼັງ"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນໃນພື້ນຫຼັງ"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນ ພ້ອມທັງຂໍ້ມູນສຸຂະພາບເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"ເຂົ້າເຖິງຂໍ້ມູນໃນພື້ນຫຼັງ"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນທີ່ຜ່ານມາ"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນທີ່ເພີ່ມໄວ້ກ່ອນວັນທີ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາທັງໝົດ"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"ເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາ"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ເພີ່ມໄວ້ກ່ອນວັນທີ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ຜ່ານມາທັງໝົດ"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ສາມາດເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາໃນຂໍ້ມູນສຸຂະພາບຂອງທ່ານໄດ້ຢູ່ແລ້ວ"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"ອ່ານເພີ່ມເຕີມກ່ຽວກັບການອະນຸຍາດ"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"ເຂົ້າເຖິງຂໍ້ມູນທັງໝົດໃນພື້ນຫຼັງ"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ເຂົ້າເຖິງຂໍ້ມູນສຸຂະພາບໃນພື້ນຫຼັງ"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນໃນພື້ນຫຼັງ"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນ ພ້ອມທັງຂໍ້ມູນສຸຂະພາບເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"ເຂົ້າເຖິງຂໍ້ມູນໃນພື້ນຫຼັງ"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນທີ່ຜ່ານມາ"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນທີ່ເພີ່ມໄວ້ກ່ອນວັນທີ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາທັງໝົດ"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"ເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາ"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ເພີ່ມໄວ້ກ່ອນວັນທີ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ຜ່ານມາທັງໝົດ"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"ຕອນນີ້ບໍ່ມີການອ່ານຂໍ້ມູນຟິດເນສເນື່ອງຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ໄດ້ຮັບການອະນຸຍາດໃຫ້ອ່ານ"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ສາມາດເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາສຳລັບຂໍ້ມູນສຸຂະພາບຂອງທ່ານຢູ່ກ່ອນແລ້ວ. ເພື່ອປ່ຽນແປງສິ່ງນີ້, ໃຫ້ປິດການອະນຸຍາດຂໍ້ມູນສຸຂະພາບສຳລັບແອັບນີ້ໄວ້"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"ຈັດການການອະນຸຍາດຂໍ້ມູນສຸຂະພາບ"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ເປີດການນຳໃຊ້ການອະນຸຍາດອ່ານຢ່າງໜ້ອຍໜຶ່ງອັນເພື່ອເປີດສິດເຂົ້າເຖິງພື້ນຫຼັງ ຫຼື ຂໍ້ມູນທີ່ຜ່ານມາສຳລັບແອັບນີ້"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ເປີດການນຳໃຊ້ການອະນຸຍາດອ່ານຢ່າງໜ້ອຍໜຶ່ງອັນເພື່ອເປີດການເຂົ້າເຖິງພື້ນຫຼັງສຳລັບແອັບນີ້"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ເປີດການນຳໃຊ້ການອະນຸຍາດອ່ານຢ່າງໜ້ອຍໜຶ່ງອັນເພື່ອເປີດສິດເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາສຳລັບແອັບນີ້"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ຜ່ານມາທັງໝົດ"</string>
     <string name="background_read_description" msgid="3203594555849969283">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນ Health Connect ເມື່ອທ່ານບໍ່ໄດ້ໃຊ້ແອັບ."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"ເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາ"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາບໍ?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ໄດ້ເພີ່ມໃສ່ກ່ອນວັນທີ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"ອະນຸຍາດໃຫ້ແອັບນີ້ເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ຜ່ານມາທັງໝົດ"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ໄດ້ເພີ່ມໃສ່ກ່ອນວັນທີ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ຫາກທ່ານອະນຸຍາດ, ແອັບນີ້ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນ Health Connect ທີ່ຜ່ານມາທັງໝົດ."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"ແຄລໍຣີທີ່ໃຊ້ໄປໃນການເຄື່ອນໄຫວຮ່າງກາຍ"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"ແຄລໍຣີທີ່ໃຊ້ໄປໃນການເຄື່ອນໄຫວຮ່າງກາຍ"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"ອ່ານຂໍ້ມູນແຄລໍຣີທີ່ໃຊ້ໄປໃນການເຄື່ອນໄຫວຮ່າງກາຍ"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ການຍູ້ລໍ້ຍູ້"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"ອ່ານຂໍ້ມູນການຍູ້ລໍ້ຍູ້"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"ຂຽນຂໍ້ມູນການຍູ້ລໍ້ຍູ້"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"ຄວາມໜັກຂອງກິດຈະກຳ"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ຄວາມໜັກຂອງກິດຈະກຳ"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"ອ່ານຂໍ້ມູນຄວາມໜັກຂອງກິດຈະກຳ"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"ຂຽນຂໍ້ມູນຄວາມໜັກຂອງກິດຈະກຳ"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"ອັດຕາການເຜົາຜານໃນເວລາພັກຜ່ອນ"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"ອັດຕາການເຜົາຜານໃນເວລາພັກຜ່ອນ"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"ອ່ານອັດຕາການເຜົາຜານໃນເວລາພັກຜ່ອນ"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ອຸນຫະພູມຜິວໜັງ"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"ອ່ານຂໍ້ມູນອຸນຫະພູມຜິວໜັງ"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"ຂຽນຂໍ້ມູນອຸນຫະພູມຜິວໜັງ"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"ເຊິ່ງນີ້ຮວມເຖິງຂໍ້ມູນສຸຂະພາບທັງໝົດທີ່ຊິ້ງ ແລະ ເພີ່ມໃສ່ໃນ Health Connect. ຂໍ້ມູນນີ້ອາດບໍ່ແມ່ນຂໍ້ມູນທາງການແພດທັງໝົດຂອງທ່ານ ແລະ ບໍ່ຮວມເຖິງຄຳອະທິບາຍທາງການແພດກ່ຽວກັບຂໍ້ມູນສຸຂະພາບຂອງທ່ານ."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"ຂໍ້ມູນສຸຂະພາບທັງໝົດ"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"ຂໍ້ມູນສຸຂະພາບທັງໝົດ"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"ຂຽນຂໍ້ມູນສຸຂະພາບທັງໝົດ"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"ພະຍາດພູມແພ້"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ພະຍາດພູມແພ້"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"ອ່ານອາການແພ້"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ການຮັບວັກຊີນສ້າງພູມຄຸ້ມກັນ"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ການຮັບວັກຊີນສ້າງພູມຄຸ້ມກັນ"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"ອ່ານຂໍ້ມູນການຮັບວັກຊີນສ້າງພູມຄຸ້ມກັນ"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ຜົນການທົດລອງຫ້ອງປະຕິບັດການ"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ຜົນການທົດລອງຫ້ອງປະຕິບັດການ"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ອ່ານຜົນການທົດລອງຫ້ອງປະຕິບັດການ"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"ອາການແພ້"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ອາການແພ້"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"ອ່ານຂໍ້ມູນອາການແພ້"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"ເງື່ອນໄຂ"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"ເງື່ອນໄຂ"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"ອ່ານເງື່ອນໄຂ"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ວັກຊີນ"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ວັກຊີນ"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ອ່ານຂໍ້ມູນວັກຊີນ"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ຜົນກວດ"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ຜົນກວດ"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ອ່ານຜົນກວດ"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ຂໍ້ມູນຢາ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ຂໍ້ມູນຢາ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ອ່ານຂໍ້ມູນຢາ"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ຂໍ້ມູນສ່ວນຕົວ"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ຂໍ້ມູນສ່ວນຕົວ"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"ອ່ານຂໍ້ມູນສ່ວນຕົວ"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"ລາຍລະອຽດຂອງຜູ້ປະຕິບັດງານທາງການແພດ"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"ລາຍລະອຽດຂອງຜູ້ປະຕິບັດງານທາງການແພດ"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"ອ່ານລາຍລະອຽດຂອງຜູ້ປະຕິບັດງານທາງການແພດ"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ການຖືພາ"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ການຖືພາ"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ອ່ານການຖືພາ"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ບັນຫາ"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ບັນຫາ"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"ອ່ານບັນຫາ"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"ຂັ້ນຕອນ"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"ຂັ້ນຕອນ"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"ອ່ານຂັ້ນຕອນ"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"ປະຫວັດສາດສັງຄົມ"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ພາວະສັງຄົມ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ປະຫວັດສາດສັງຄົມ"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"ອ່ານປະຫວັດສາດສັງຄົມ"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"ສັນຍານຊີບ"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ຂໍ້ມູນການພົບແພດ"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ຂໍ້ມູນການພົບແພດ"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"ອ່ານຂໍ້ມູນການພົບແພດ"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"ສັນຍານຊີບ"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"ສັນຍານຊີບ"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"ອ່ານສັນຍານຊີບ"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"ສະຕິຊອບ"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"ຂຽນຂໍ້ມູນສະຕິຊອບ"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"ອະນຸຍາດໃຫ້ “<xliff:g id="APP_NAME">%1$s</xliff:g>” ອ່ານ"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"ອະນຸຍາດໃຫ້ “<xliff:g id="APP_NAME">%1$s</xliff:g>” ຂຽນ"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"ຍົກເລີກ"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"ອະນຸຍາດ"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"ອະນຸຍາດທັງໝົດ"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"ບໍ່ອະນຸຍາດ"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"ເລືອກຂໍ້ມູນທີ່ທ່ານຕ້ອງການໃຫ້ແອັບນີ້ອ່ານ ຫຼື ຂຽນລົງໃສ່ Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"ເລືອກຂໍ້ມູນທີ່ທ່ານຕ້ອງການໃຫ້ແອັບນີ້ອ່ານ ຫຼື ຂຽນລົງໃສ່ Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"ເລືອກຂໍ້ມູນທີ່ທ່ານຕ້ອງການໃຫ້ແອັບນີ້ອ່ານຈາກ Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"ເລືອກຂໍ້ມູນທີ່ທ່ານຕ້ອງການໃຫ້ແອັບນີ້ຂຽນລົງໃສ່ Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"ຫາກທ່ານໃຫ້ສິດເຂົ້າເຖິງການອ່ານ, ແອັບຈະສາມາດອ່ານຂໍ້ມູນໃໝ່ ແລະ ຂໍ້ມູນຈາກ 30 ມື້ທີ່ຜ່ານມາໄດ້"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"ຫາກທ່ານໃຫ້ສິດເຂົ້າເຖິງ, ແອັບຈະສາມາດອ່ານຂໍ້ມູນໃໝ່ ແລະ ຂໍ້ມູນທີ່ຜ່ານມາໄດ້"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງ Health Connect ບໍ?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"ທ່ານສາມາດສຶກສາວິທີທີ່ <xliff:g id="APP_NAME">%1$s</xliff:g> ຈັດການຂໍ້ມູນຂອງທ່ານໃນ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ຂອງນັກພັດທະນາໄດ້"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນບໍ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"ທ່ານສາມາດສຶກສາວິທີທີ່ <xliff:g id="APP_NAME">%1$s</xliff:g> ຈັດການຂໍ້ມູນຂອງທ່ານແນວໃດໄດ້ໃນ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ຂອງເຂົາເຈົ້າ"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"ອະນຸຍາດ <xliff:g id="APP_NAME">%1$s</xliff:g> ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນສຸຂະພາບຂອງທ່ານບໍ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"ຫາກທ່ານໃຫ້ສິດເຂົ້າເຖິງ, ແອັບນີ້ຈະສາມາດອ່ານ ແລະ ຂຽນຂໍ້ມູນໄດ້ ເຊັ່ນ: ອາການແພ້, ຜົນກວດ, ວັກຊີນ ແລະ ອື່ນໆ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"ຫາກທ່ານໃຫ້ສິດເຂົ້າເຖິງ, ແອັບນີ້ຈະສາມາດອ່ານຂໍ້ມູນໄດ້ ເຊັ່ນ: ອາການແພ້, ຜົນກວດ, ວັກຊີນ ແລະ ອື່ນໆ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ກ່ຽວກັບຂໍ້ມູນສຸຂະພາບ"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"ຂໍ້ມູນທີ່ຈະແບ່ງປັນຮວມມີ"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"ຫາກທ່ານອະນຸຍາດ, <xliff:g id="APP_NAME">%1$s</xliff:g> ຈະສາມາດແບ່ງປັນຂໍ້ມູນສຸຂະພາບຂອງທ່ານກັບ Health Connect ໄດ້."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"ຊິ້ງຂໍ້ມູນສຸຂະພາບຂອງທ່ານຈາກແອັບ ແລະ ແຫຼ່ງຕ່າງໆຂອງທ່ານເພື່ອເກັບພວກມັນໄວ້ບ່ອນດຽວ"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"ລຶບການອະນຸຍາດທັງໝົດອອກບໍ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"ລຶບທັງໝົດອອກ"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນໃດກໍຕາມຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ.\n\nການດຳເນີນການນີ້ບໍ່ມີຜົນກະທົບຕໍ່ການອະນຸຍາດອື່ນໆທີ່ແອັບນີ້ອາດມີ, ເຊັ່ນ: ກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນໃດກໍຕາມຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ, ຮວມທັງຂໍ້ມູນທີ່ຜ່ານມາ.\n\nສິ່ງນີ້ບໍ່ສົ່ງຜົນກະທົບຕໍ່ການອະນຸຍາດອື່ນໆທີ່ແອັບນີ້ອາດມີ, ເຊັ່ນ: ສະຖານທີ່, ກ້ອງຖ່າຍຮູບ ຫຼື ໄມໂຄຣໂຟນ."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນໃດກໍຕາມຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ, ຮວມທັງຂໍ້ມູນພື້ນຫຼັງ ແລະ ຂໍ້ມູນທີ່ຜ່ານມາ.\n\nສິ່ງນີ້ບໍ່ສົ່ງຜົນກະທົບຕໍ່ການອະນຸຍາດອື່ນໆທີ່ແອັບນີ້ອາດມີ, ເຊັ່ນ: ສະຖານທີ່, ກ້ອງຖ່າຍຮູບ ຫຼື ໄມໂຄຣໂຟນ."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"ລຶບຂໍ້ມູນ <xliff:g id="APP_NAME">%1$s</xliff:g> ອອກຈາກ Health Connect ພ້ອມ"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ລຶບການອະນຸຍາດທັງໝົດອອກບໍ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ລຶບການອະນຸຍາດຂໍ້ມູນສຸຂະພາບທັງໝົດອອກບໍ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ລຶບການອະນຸຍາດຟິດເນສ ແລະ ສຸຂະພາບທັງໝົດບໍ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"ລຶບຂໍ້ມູນຟິດເນສຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ອອກຈາກ Health Connect ນຳ"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ລຶບການອະນຸຍາດຂໍ້ມູນສຸຂະພາບທັງໝົດອອກບໍ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"ລຶບຂໍ້ມູນສຸຂະພາບຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ອອກຈາກ Health Connect ນຳ"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນນີ້ຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ.\n\nການດຳເນີນການນີ້ບໍ່ສົ່ງຜົນຕໍ່ການອະນຸຍາດອື່ນໆທີ່ແອັບນີ້ອາດມີ ເຊັ່ນ: ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນນີ້ຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ, ຮວມທັງຂໍ້ມູນພື້ນຫຼັງ.\n\nການດຳເນີນການນີ້ບໍ່ສົ່ງຜົນຕໍ່ການອະນຸຍາດອື່ນໆທີ່ແອັບນີ້ອາດມີ ເຊັ່ນ: ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນນີ້ຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ, ຮວມທັງຂໍ້ມູນທີ່ຜ່ານມາ.\n\nການດຳເນີນການນີ້ບໍ່ສົ່ງຜົນຕໍ່ການອະນຸຍາດອື່ນໆທີ່ແອັບນີ້ອາດມີ ເຊັ່ນ: ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນນີ້ຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ, ຮວມທັງຂໍ້ມູນພື້ນຫຼັງ ແລະ ຂໍ້ມູນທີ່ຜ່ານມາ.\n\nການດຳເນີນການນີ້ບໍ່ສົ່ງຜົນຕໍ່ການອະນຸຍາດອື່ນໆທີ່ແອັບນີ້ອາດມີ ເຊັ່ນ: ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ລຶບການອະນຸຍາດທັງໝົດອອກບໍ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ.\n\nນີ້ຈະບໍ່ກະທົບກັບການອະນຸຍາດອື່ນທີ່ແອັບນີ້ອາດມີ, ເຊັ່ນ: ກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ, ຮວມທັງຂໍ້ມູນໃນພທ້ນຫຼັງ.\n\nຈະບໍ່ກະທົບກັບການອະນຸຍາດອື່ນທີ່ແອັບນີ້ອາດມີ, ເຊັ່ນ: ກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ, ຮວມທັງຂໍ້ມູນທີ່ຜ່ານມາ.\n\nຈະບໍ່ກະທົບກັບການອະນຸຍາດອື່ນທີ່ແອັບນີ້ອາດມີ, ເຊັ່ນ: ກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຈະບໍ່ສາມາດອ່ານ ຫຼື ຂຽນຂໍ້ມູນຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ, ຮວມທັງຂໍ້ມູນພື້ນຫຼັງ ແລະ ຂໍ້ມູນທີ່ຜ່ານມາ.\n\nນີ້ຈະບໍ່ກະທົບກັບການອະນຸຍາດອື່ນທີ່ແອັບນີ້ອາດມີ, ເຊັ່ນ: ກ້ອງຖ່າຍຮູບ, ໄມໂຄຣໂຟນ ຫຼື ສະຖານທີ່."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"ລຶບຂໍ້ມູນຟິດເນສ ແລະ ຂໍ້ມູນສຸຂະພາບຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ອອກຈາກ Health Connect ນຳ"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ລຶບການອະນຸຍາດສຳລັບແອັບນີ້ອອກແລ້ວ"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"ລຶບຂໍ້ມູນ Health Connect ທັງໝົດນຳ"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"ມື້ຕໍ່ໄປ"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"ມື້ທີ່ເລືອກ"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"ມື້ກ່ອນໜ້າ"</string>
     <string name="default_error" msgid="7966868260616403475">"ມີບາງຢ່າງຜິດພາດເກີດຂຶ້ນ. ກະລຸນາລອງໃໝ່."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"ຊັບພະຍາກອນທີ່ບໍ່ຮູ້ຈັກ"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ແຫຼ່ງຂໍ້ມູນ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>ວົງເລັບປີກກາເປີດ."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>ວົງເລັບປີກກາປິດ."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ຄ່າໃນຊ່ອງຂໍ້ມູນ <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ແອັບເຫຼົ່ານີ້ບໍ່ມີສິດເຂົ້າເຖິງອີກຕໍ່ໄປແລ້ວ, ແຕ່ຍັງຄົງມີຂໍ້ມູນທີ່ຈັດເກັບໄວ້ໃນ Health Connect ຢູ່"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> ສາມາດອ່ານຂໍ້ມູນທີ່ເພີ່ມເຂົ້າຫຼັງຈາກວັນທີ <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> ໄດ້"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ເພື່ອຈັດການການອະນຸຍາດ Android ອື່ນທີ່ແອັບນີ້ສາມາດເຂົ້າເຖິງໄດ້, ໃຫ້ເຂົ້າໄປການຕັ້ງຄ່າ &gt; ແອັບ"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"ຂໍ້ມູນທີ່ທ່ານແບ່ງປັນກັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ແມ່ນຢູ່ພາຍໃຕ້ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງເຂົາເຈົ້າ"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"ທ່ານສາມາດສຶກສາວິທີທີ່ <xliff:g id="APP_NAME">%1$s</xliff:g> ຈັດການຂໍ້ມູນຂອງທ່ານໄດ້ໃນນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງນັກພັດທະນາ"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ເພື່ອຈັດການການອະນຸຍາດອື່ນໆຂອງ Android ທີ່ແອັບນີ້ສາມາດເຂົ້າເຖິງໄດ້, ໃຫ້ເຂົ້າໄປການຕັ້ງຄ່າ, ຈາກນັ້ນແຕະແອັບ"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"ອ່ານນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"ເຂົ້າເຖິງໃນ 24 ຊົ່ວໂມງທີ່ຜ່ານມາ"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ສິດເຂົ້າເຖິງແອັບ"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"ຕອນນີ້ທ່ານບໍ່ມີແອັບໃດທີ່ເຂົ້າກັນໄດ້ຕິດຕັ້ງໄວ້ເລີຍ"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"ສິດເຂົ້າເຖິງເພີ່ມເຕີມ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ຂໍ້ມູນທີ່ຜ່ານມາ, ຂໍ້ມູນພື້ນຫຼັງ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"ລຶບການອະນຸຍາດເພີ່ມເຕີມສຳລັບແອັບນີ້ອອກແລ້ວ"</string>
     <string name="permissions_header" msgid="6519976063360071569">"ການອະນຸຍາດ"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ການອອກກຳລັງກາຍ ແລະ ສຸຂະພາບ"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ການອອກກຳລັງກາຍ, ການນອນ, ໂພຊະນາການ ແລະ ອື່ນໆ"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"ຂໍ້ມູນສຸຂະພາບ"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ຂໍ້ມູນສຸຂະພາບ"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ຜົນກວດ, ຢາ, ການສ້າງພູມຄຸ້ມກັນ ແລະ ອື່ນໆ"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ຜົນກວດ, ຢາ, ວັກຊີນ ແລະ ອື່ນໆ"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"ລຶບການອະນຸຍາດແອັບອອກແລ້ວ"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect ລຶບການອະນຸຍາດສຳລັບ <xliff:g id="APP_DATA">%s</xliff:g> ອອກແລ້ວ"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect ລຶບການອະນຸຍາດສຳລັບ <xliff:g id="APP_DATA_0">%1$s</xliff:g> ແລະ <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> ອອກແລ້ວ"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"ເຂົ້າໄປ Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"ເລີ່ມຕົ້ນການນຳໃຊ້ Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ຈະຈັດເກັບຂໍ້ມູນສຸຂະພາບ ແລະ ການອອກກຳລັງກາຍຂອງທ່ານ, ເຊິ່ງເຮັດໃຫ້ທ່ານຊິ້ງຂໍ້ມູນແອັບຕ່າງໆຢູ່ອຸປະກອນຂອງທ່ານໄດ້ຢ່າງງ່າຍດາຍ"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ຈະຈັດເກັບ ແລະ ຊິ້ງຂໍ້ມູນດ້ານສຸຂະພາບ ແລະ ການອອກກຳລັງກາຍຂອງທ່ານຈາກແອັບຕ່າງໆ.\n\n"<b>"ຂໍ້ມູນການອອກກຳລັງກາຍ ແລະ ຄວາມແຂງແຮງສົມບູນ,"</b>" ຮວມທັງເຊດຊັນການອອກກຳລັງກາຍ, ຈຳນວນກ້າວ, ໂພຊະນາການ, ການນອນຫຼັບ ແລະ ອື່ນໆ\n\n"<b>"ຂໍ້ມູນສຸຂະພາບ,"</b>" ຮວມທັງວັກຊີນ, ຜົນກວດ ແລະ ອື່ນໆ"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ຊ່ວຍໃຫ້ທ່ານເຮັດສິ່ງຕໍ່ໄປນີ້ໄດ້"</string>
     <string name="share_data" msgid="3481932156368883946">"ແບ່ງປັນຂໍ້ມູນກັບແອັບຂອງທ່ານ"</string>
     <string name="share_data_description" msgid="2919871301634375092">"ເລືອກຂໍ້ມູນທີ່ແຕ່ລະແອັບສາມາດອ່ານ ຫຼື ຂຽນລົງໃສ່ Health Connect ໄດ້"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"ຈັດການການຕັ້ງຄ່າ ແລະ ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"ໄຫຼໜ້ອຍ"</string>
     <string name="flow_medium" msgid="3783688724668943154">"ໄຫຼປານກາງ"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ໄຫຼຫຼາຍ"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"ບໍ່ຮູ້ປະລິມານການໄຫຼ"</string>
     <string name="period_day" msgid="3821944462093965882">"ເປັນປະຈຳເດືອນມື້ທີ <xliff:g id="DAY">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> ມື້"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ປະຈຳເດືອນ (1 ມື້)}other{ປະຈຳເດືອນ (# ມື້)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"ຜົນບວກ"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"ຜົນລົບ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ສູງ"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"ເພງ"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"ອື່ນໆ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ຝຶກດ້ວຍຕົນເອງ"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"ປານກາງ"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ແຂງແຮງ"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>ນທ"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>ຊມ <xliff:g id="MIN">%2$s</xliff:g>ນທ"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>ຊມ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ກຳລັງດຳເນີນການເຊື່ອມໂຍງ"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect ກຳລັງຖືກເຊື່ອມໂຍງເຂົ້າກັບລະບົບ Android.\n\nຂັ້ນຕອນນີ້ອາດໃຊ້ເວລາໄລຍະໜຶ່ງໃນລະຫວ່າງທີ່ໂອນຍ້າຍຂໍ້ມູນ ແລະ ການອະນຸຍາດຂອງທ່ານ."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"ກະລຸນາຢ່າປິດແອັບຈົນກວ່າທ່ານຈະໄດ້ຮັບການແຈ້ງເຕືອນວ່າຂະບວນການສຳເລັດແລ້ວ."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"ກຳລັງດຳເນີນການເຊື່ອມໂຍງ Health Connect"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"ຕ້ອງອັບເດດ"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect ກຳລັງຖືກເຊື່ອມໂຍງເຂົ້າກັບລະບົບ Android ເພື່ອໃຫ້ທ່ານສາມາດເຂົ້າເຖິງໄດ້ໂດຍກົງຈາກການຕັ້ງຄ່າຂອງທ່ານ."</string>
     <string name="update_button" msgid="4544529019832009496">"ອັບເດດ"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"ເລີ່ມການອັບເດດນີ້ເພື່ອໃຫ້ Health Connect ສາມາດສືບຕໍ່ການເຊື່ອມໂຍງກັບການຕັ້ງຄ່າລະບົບຂອງທ່ານໄດ້"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ອັບເດດຕອນນີ້"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"ຕ້ອງອັບເດດລະບົບ"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"ກ່ອນທີ່ຈະດຳເນີນການຕໍ່, ໃຫ້ອັບເດດລະບົບໂທລະສັບຂອງທ່ານ."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"ຫາກທ່ານອັບເດດລະບົບໂທລະສັບຂອງທ່ານແລ້ວ, ໃຫ້ລອງຣີສະຕາດໂທລະສັບຂອງທ່ານເພື່ອສືບຕໍ່ການເຊື່ອມໂຍງ"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"ຕ້ອງອັບເດດ Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"ກ່ອນທີ່ຈະດຳເນີນການຕໍ່, ໃຫ້ອັບເດດແອັບ Health Connect ເປັນເວີຊັນຫຼ້າສຸດ."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"ຕ້ອງການພື້ນທີ່ເພີ່ມເຕີມ"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect ຕ້ອງການພື້ນທີ່ຈັດເກັບຂໍ້ມູນ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ຢູ່ໂທລະສັບຂອງທ່ານເພື່ອສືບຕໍ່ການເຊື່ອມໂຍງ.\n\nເພີ່ມພື້ນທີ່ຫວ່າງຢູ່ໂທລະສັບຂອງທ່ານ ແລ້ວລອງໃໝ່."</string>
     <string name="try_again_button" msgid="8745496819992160789">"ລອງໃໝ່"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ເພີ່ມພື້ນທີ່ຫວ່າງ"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"ຕ້ອງການພື້ນທີ່ເພີ່ມເຕີມ"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect ຕ້ອງການພື້ນທີ່ຈັດເກັບຂໍ້ມູນ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ຢູ່ໂທລະສັບຂອງທ່ານເພື່ອສືບຕໍ່ການເຊື່ອມໂຍງ."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ຢຸດການເຊື່ອມໂຍງໄວ້ຊົ່ວຄາວແລ້ວ"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"ແອັບ Health Connect ປິດລົງໃນລະຫວ່າງການເຊື່ອມໂຍງກັບລະບົບ Android.\n\nຄລິກ ສືບຕໍ່ ເພື່ອເປີດແອັບຄືນໃໝ່ ແລະ ສືບຕໍ່ໂອນຍ້າຍຂໍ້ມູນ ແລະ ການອະນຸຍາດຂອງທ່ານ."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"ເພື່ອຮັກສາຂໍ້ມູນ Health Connect ຂອງທ່ານໄວ້, ໃຫ້ສຳເລັດຂະບວນການນີ້ພາຍໃນ <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"ແຕະເພື່ອສືບຕໍ່ການເຊື່ອມໂຍງ Health Connect ກັບລະບົບ Android. ເພື່ອຮັກສາຂໍ້ມູນຂອງທ່ານໄວ້, ໃຫ້ສຳເລັດຂະບວນການນີ້ພາຍໃນ <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"ແຕະເພື່ອສືບຕໍ່ການເຊື່ອມໂຍງ Health Connect ກັບລະບົບ Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ສືບຕໍ່"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"ສືບຕໍ່ການເຊື່ອມໂຍງ Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"ເພື່ອຮັກສາຂໍ້ມູນຂອງທ່ານໄວ້, ໃຫ້ສຳເລັດຂະບວນການນີ້ພາຍໃນ <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ຕ້ອງອັບເດດແອັບ"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"ຕ້ອງໄດ້ອັບເດດ <xliff:g id="APP_NAME">%1$s</xliff:g> ກ່ອນຈຶ່ງຈະຊິ້ງກັບ Health Connect ຕໍ່ໄດ້"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"ບາງແອັບຕ້ອງໄດ້ອັບເດດກ່ອນຈຶ່ງຈະຊິ້ງກັບ Health Connect ຕໍ່ໄດ້"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"ຕ້ອງໄດ້ອັບເດດ <xliff:g id="APP_NAME">%1$s</xliff:g> ກ່ອນຈຶ່ງຈະຊິ້ງກັບ Health Connect ຕໍ່ໄດ້. ການອັບເດດອາດບໍ່ມີໃຫ້ສຳລັບແອັບທັງໝົດ."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"ບາງແອັບຕ້ອງໄດ້ອັບເດດກ່ອນຈຶ່ງຈະຊິ້ງກັບ Health Connect ຕໍ່ໄດ້. ການອັບເດດອາດບໍ່ມີໃຫ້ສຳລັບແອັບທັງໝົດ."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"ກວດສອບການອັບເດດ"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"ສຶກສາເພີ່ມເຕີມ"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"ການເຊື່ອມໂຍງ Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"ການເຊື່ອມໂຍງ Health Connect ບໍ່ສຳເລັດສົມບູນ"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"ທ່ານຈະໄດ້ຮັບການແຈ້ງເຕືອນເມື່ອການເຊື່ອມໂຍງພ້ອມດຳເນີນການອີກເທື່ອໜຶ່ງ."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"ເຂົ້າໃຈແລ້ວ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"ການເຊື່ອມໂຍງ Health Connect ບໍ່ສຳເລັດສົມບູນ"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"ອ່ານເພີ່ມເຕີມ"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"ສຳເລັດການເຊື່ອມໂຍງ Health Connect ແລ້ວ"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"ເປີດ"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"ມີຫຍັງໃໝ່"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"ທ່ານສາມາດເຂົ້າເຖິງ Health Connect ໄດ້ໂດຍກົງຈາກການຕັ້ງຄ່າຂອງທ່ານ. ຖອນການຕິດຕັ້ງແອັບ Health Connect ໄດ້ຕະຫຼອດເວລາເພື່ອເພີ່ມພື້ນທີ່ຈັດເກັບຂໍ້ມູນ."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"ເຂົ້າໃຈແລ້ວ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ແກ້ໄຂແຫຼ່ງທີ່ມາຂອງແອັບ"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ຄ່າເລີ່ມຕົ້ນອຸປະກອນ"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ຂໍ້ມູນແອັບ"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"ຂໍ້ມູນຈາກແອັບທີ່ມີສິດເຂົ້າເຖິງ Health Connect ຈະສະແດງຢູ່ບ່ອນນີ້"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"ຂໍ້ມູນຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ຈະສະແດງຢູ່ບ່ອນນີ້"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"ຂໍ້ມູນຈາກແອັບທີ່ມີສິດເຂົ້າເຖິງ Health Connect ຈະສະແດງຢູ່ບ່ອນນີ້"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"ມື້"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"ອາທິດ"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"ເດືອນ"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ເດືອນທີ່ຜ່ານມາ"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ລາຍການ"</string>
     <string name="tab_access" msgid="7818197975407243701">"ສິດເຂົ້າເຖິງ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"ອະນຸຍາດສິດເຂົ້າເຖິງເພີ່ມເຕີມສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ຍັງຕ້ອງການເຂົ້າເຖິງການຕັ້ງຄ່າ Health Connect ເຫຼົ່ານີ້ນຳ"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ເປີດການນຳໃຊ້ການອະນຸຍາດອ່ານຢ່າງໜ້ອຍໜຶ່ງອັນເພື່ອເປີດສິດເຂົ້າເຖິງພື້ນຫຼັງ ຫຼື ຂໍ້ມູນທີ່ຜ່ານມາສຳລັບແອັບນີ້"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ເປີດການນຳໃຊ້ການອະນຸຍາດອ່ານຢ່າງໜ້ອຍໜຶ່ງອັນເພື່ອເປີດການເຂົ້າເຖິງພື້ນຫຼັງສຳລັບແອັບນີ້"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ເປີດການນຳໃຊ້ການອະນຸຍາດອ່ານຢ່າງໜ້ອຍໜຶ່ງອັນເພື່ອເປີດສິດເຂົ້າເຖິງຂໍ້ມູນທີ່ຜ່ານມາສຳລັບແອັບນີ້"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"ເລີ່ມໃຊ້ Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ຊິ້ງແອັບທຳອິດຂອງທ່ານເພື່ອແບ່ງປັນຂໍ້ມູນສຸຂະພາບ ແລະ ການອອກກຳລັງກາຍລະຫວ່າງກັນ"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"ຕັ້ງຄ່າ"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"ເບິ່ງແອັບທີ່ເຂົ້າກັນໄດ້"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"ຊອກຫາແອັບເພີ່ມເຕີມເພື່ອຊິ້ງກັບ <xliff:g id="APP_NAME">%s</xliff:g> ຜ່ານ Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ເບິ່ງໃນ App Store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ຕັ້ງການລັອກໜ້າຈໍ"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມສໍາລັບຂໍ້ມູນສຸຂະພາບຂອງທ່ານ, ໃຫ້ຕັ້ງ PIN, ຮູບແບບ ຫຼື ລະຫັດຜ່ານສໍາລັບອຸປະກອນນີ້"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ຕັ້ງການລັອກໜ້າຈໍ"</string>
     <string name="select_all" msgid="837499881590001166">"ເລືອກທັງໝົດ"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"ແອັບທີ່ເຊື່ອມຕໍ່ໄວ້ຈະບໍ່ສາມາດອ່ານຂໍ້ມູນນີ້ຈາກ Health Connect ໄດ້ອີກຕໍ່ໄປ"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ເລືອກແລ້ວ"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ຍັງບໍ່ໄດ້ເລືອກ"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"ແຜນທີ່ເສັ້ນທາງອອກກໍາລັງກາຍມີໃຫ້ໃຊ້"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"ມື້ຕໍ່ໄປ"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"ອາທິດໜ້າ"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"ເດືອນຕໍ່ໄປ"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"ມື້ກ່ອນໜ້າ"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"ອາທິດກ່ອນ"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"ເດືອນກ່ອນ"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"ລຶບຂໍ້ມູນທັງໝົດອອກຢ່າງຖາວອນບໍ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"ລຶບຂໍ້ມູນທີ່ເລືອກອອກຢ່າງຖາວອນບໍ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"ລຶບຂໍ້ມູນ <xliff:g id="APP_NAME">%s</xliff:g> ທັງໝົດອອກຢ່າງຖາວອນບໍ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"ລຶບຂໍ້ມູນ <xliff:g id="APP_NAME">%1$s</xliff:g> ທີ່ເລືອກສຳລັບອາທິດ <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ອອກຢ່າງຖາວອນບໍ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"ລຶບຂໍ້ມູນ <xliff:g id="APP_NAME">%1$s</xliff:g> ທີ່ເລືອກສຳລັບ <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ອອກຢ່າງຖາວອນບໍ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ລຶບຂໍ້ມູນ <xliff:g id="APP_NAME">%s</xliff:g> ນີ້ອອກຢ່າງຖາວອນບໍ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"ລຶບຂໍ້ມູນ <xliff:g id="DATA_TYPE">%1$s</xliff:g> ສຳລັບ <xliff:g id="APP_NAME">%2$s</xliff:g> ບໍ?"</string>
+    <string name="on" msgid="8266542510798355807">"ເປີດ"</string>
+    <string name="off" msgid="6996623844428550649">"ປິດ"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"ເຂົ້າເຖິງເມື່ອ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"ເຂົ້າເຖິງມື້ວານນີ້ເມື່ອ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"ເຂົ້າເຖິງເມື່ອ <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"ອະນຸຍາດຕະຫຼອດເວລາ"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"ອະນຸຍາດລາຍການທີ່ເລືອກ"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ອະນຸຍາດສະເພາະໃນເວລາໃຊ້ແອັບ"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"ປະຕິເສດທັງໝົດ"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງຂໍ້ມູນຟິດເນສ ແລະ ຄວາມແຂງແຮງສົມບູນບໍ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍສິດເຂົ້າເຖິງ <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nເລືອກວ່າຈະອະນຸຍາດທັງໝົດ ຫຼື ຄວບຄຸມເທື່ອລະລາຍການ."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງ <xliff:g id="DATA_TYPE">%2$s</xliff:g> ໄດ້ບໍ?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ການອອກກຳລັງກາຍ ແລະ ສຸຂະພາບ"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ຕະຫຼອດເວລາ"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ໃນລະຫວ່າງທີ່ນຳໃຊ້ຢູ່"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"ຕະຫຼອດເວລາ"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ໃນລະຫວ່າງທີ່ນຳໃຊ້ຢູ່"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> ສາມາດເຂົ້າເຖິງຂໍ້ມູນການອອກກໍາລັງກາຍ ແລະ ສຸຂະພາບທັງໝົດຂອງທ່ານ <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"ໄດ້ຮັບອະນຸຍາດໃຫ້ເຂົ້າເຖິງ"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"ໄດ້ຮັບອະນຸຍາດໃຫ້ອ່ານ"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ການອະນຸຍາດເຫຼົ່ານີ້ໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງຂໍ້ມູນຈາກເຊັນເຊີອຸປະກອນຂອງທ່ານ."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"ອະນຸຍາດ <xliff:g id="NUMBER_0">%1$d</xliff:g> ແອັບຈາກທັງໝົດ <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ແອັບແລ້ວ"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"ບໍ່ມີແອັບທີ່ກໍາລັງຮ້ອງຂໍ"</string>
+    <string name="allowed" msgid="4158456017482263737">"ອະນຸຍາດແລ້ວ"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"ບໍ່ອະນຸຍາດ"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ແອັບທີ່ມີການອະນຸຍາດນີ້ສາມາດເຂົ້າເຖິງຂໍ້ມູນ <xliff:g id="DATA_TYPE">%s</xliff:g> ຈາກເຊັນເຊີອຸປະກອນຂອງທ່ານ."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"ລຶບສິດເຂົ້າເຖິງ <xliff:g id="DATA_TYPE">%s</xliff:g> ອອກສໍາລັບແອັບທັງໝົດຢູ່ໂມງຂອງທ່ານບໍ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"ໝາຍຖືກ"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"ເຄື່ອງໝາຍຂີດຂ້າແບບໄຂວ່ກັນ"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"ປັດຈຸບັນ, <xliff:g id="APP_NAME">%1$s</xliff:g> ສາມາດເຂົ້າເຖິງຂໍ້ມູນການອອກກຳລັງກາຍ ແລະ ສຸຂະພາບ <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ເຂົ້າເຖິງຂໍ້ມູນການອອກກຳລັງກາຍ ແລະ ສຸຂະພາບຕະຫຼອດເວລາບໍ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ມີສິດເຂົ້າເຖິງຂໍ້ມູນ <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ຈັດການສິດດ້ານການອອກກຳລັງກາຍ ແລະ ສຸຂະພາບ"</string>
 </resources>
diff --git a/apk/res/values-lt/strings.xml b/apk/res/values-lt/strings.xml
index d910a1a..04c65a5 100644
--- a/apk/res/values-lt/strings.xml
+++ b/apk/res/values-lt/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Tvarkykite įrenginyje esančius sveikatos ir kūno rengybos duomenis ir valdykite, kurios programos gali juos pasiekti"</string>
     <string name="data_title" msgid="4456619761533380816">"Duomenys ir prieiga"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Naršyti įrašus apie sveikatą"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Peržiūrėkite sveikatos įrašus ir kurios programos gali juos pasiekti"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Visos kategorijos"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Žr. visas kategorijas"</string>
     <string name="no_data" msgid="1906986019249068659">"Nėra jokių duomenų"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Vakar"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Perskaityta: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Įrašyta: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Tvarkyti leidimus"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Laikas: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Veikla"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"prieiga prie sveikatos duomenų"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Skaityti sudegintų kalorijų duomenis"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Leidžiama programa skaityti sudegintų kalorijų duomenis"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Pasiekti duomenis fone"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Leisti programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti duomenis fone?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Leisti programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti duomenis fone?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Jei leisite, ši programa galės pasiekti mankštos ir sveikatingumo duomenis bei sveikatos įrašus, kai nenaudosite programos."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Jei leisite, ši programa galės pasiekti sveikatos įrašus, kai nenaudosite programos."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Jei leisite, ši programa galės pasiekti mankštos ir sveikatingumo duomenis, kai nenaudosite programos."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Jei leisite, ši programa galės pasiekti „Health Connect“ duomenis, kai nenaudosite programos."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Leisti programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti ankstesnius duomenis?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Jei leisite, ši programa galės pasiekti mankštos ir sveikatingumo duomenis, pridėtus iki <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Jei leisite, ši programa galės pasiekti visus ankstesnius mankštos ir sveikatingumo duomenis."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Jei leisite, ši programa galės pasiekti „Health Connect“ duomenis, pridėtus iki <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Jei leisite, ši programa galės pasiekti visus ankstesnius „Health Connect“ duomenis."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Leisti papildomą programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prieigą?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ taip pat nori pasiekti šiuos „Health Connect“ nustatymus"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Pasiekti visus duomenis fone"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Pasiekti sveikatos įrašus fone"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Pasiekti mankštos ir sveikatingumo duomenis fone"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Leisti šiai programai pasiekti mankštos ir sveikatingumo duomenis bei sveikatos įrašus, kai nenaudojate programos"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Leisti šiai programai pasiekti šiuos duomenis, kai nenaudojate programos"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Leisti šiai programai pasiekti šiuos duomenis, kai nenaudojate programos"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Pasiekti duomenis fone"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Leisti šiai programai pasiekti „Health Connect“ duomenis, kai nenaudojate programos"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Pasiekti ankstesnius mankštos ir sveikatingumo duomenis"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Leisti šiai programai pasiekti duomenis, pridėtus iki <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Leisti šiai programai pasiekti visus ankstesnius duomenis"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Pasiekti ankstesnius duomenis"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Leisti šiai programai pasiekti „Health Connect“ duomenis, pridėtus iki <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Leisti šiai programai pasiekti visus ankstesnius „Health Connect“ duomenis"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ jau gali pasiekti ankstesnius jūsų sveikatos įrašų duomenis"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Sužinokite daugiau apie leidimus"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Pasiekti visus duomenis fone"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Pasiekti sveikatos įrašus fone"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Pasiekti mankštos ir sveikatingumo duomenis fone"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Leisti šiai programai pasiekti mankštos ir sveikatingumo duomenis bei sveikatos įrašus, kai nenaudojate programos"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Leisti šiai programai pasiekti šiuos duomenis, kai nenaudojate programos"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Leisti šiai programai pasiekti šiuos duomenis, kai nenaudojate programos"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Pasiekti duomenis fone"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Leisti šiai programai pasiekti „Health Connect“ duomenis, kai nenaudojate programos"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Pasiekti ankstesnius mankštos ir sveikatingumo duomenis"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Leisti šiai programai pasiekti duomenis, pridėtus iki <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Leisti šiai programai pasiekti visus ankstesnius duomenis"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Pasiekti ankstesnius duomenis"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Leisti šiai programai pasiekti „Health Connect“ duomenis, pridėtus iki <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Leisti šiai programai pasiekti visus ankstesnius „Health Connect“ duomenis"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Šiuo metu neskaitomi jokie mankštos duomenys, nes „<xliff:g id="APP_NAME">%1$s</xliff:g>“ neturi skaitymo leidimų"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ jau gali pasiekti ankstesnius jūsų sveikatos įrašų duomenis. Jei norite tai pakeisti, išjunkite šios programos sveikatos įrašų leidimus"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Tvarkyti sveikatos įrašų leidimus"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Įgalinkite bent vieną skaitymo leidimą, kad įjungtumėte šios programos prieigą fone ar prie ankstesnių duomenų"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Įgalinkite bent vieną skaitymo leidimą, kad įjungtumėte šios programos prieigą fone"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Įgalinkite bent vieną skaitymo leidimą, kad įjungtumėte šios programos prieigą prie ankstesnių duomenų"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Leisti šiai programai pasiekti visus ankstesnius „Health Connect“ duomenis"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Leisti šiai programai pasiekti „Health Connect“ duomenis, kai nenaudojate programos"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Jei leisite, ši programa galės pasiekti „Health Connect“ duomenis, kai nenaudosite programos."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Pasiekti ankstesnius duomenis"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Leisti programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti ankstesnius duomenis?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Leisti šiai programai pasiekti „Health Connect“ duomenis, pridėtus iki <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Leisti šiai programai pasiekti visus ankstesnius „Health Connect“ duomenis"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Jei leisite, ši programa galės pasiekti „Health Connect“ duomenis, pridėtus iki <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Jei leisite, ši programa galės pasiekti visus ankstesnius „Health Connect“ duomenis."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Sudegintų kalorijų aktyviu metu skaičius"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"sudegintų kalorijų aktyviu metu skaičius"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Skaityti sudegintų kalorijų aktyviu metu skaičių"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"neįgaliųjų vežimėlio pastūmimai"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Skaityti neįgaliųjų vežimėlio pastūmimų duomenis"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Rašyti neįgaliųjų vežimėlio pastūmimų duomenis"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Veiklos intensyvumas"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"veiklos intensyvumas"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Skaityti veiklos intensyvumo duomenis"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Rašyti veiklos intensyvumo duomenis"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Pagrindinis medžiagų apykaitos greitis"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"pagrindinis medžiagų apykaitos greitis"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Skaityti pagrindinio medžiagų apykaitos greičio duomenis"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"odos temperatūra"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Nuskaityti odos temperatūrą"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Įrašyti odos temperatūrą"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Tai apima visus sveikatos įrašus, sinchronizuotus su „Health Connect“ ir pridėtus prie jos. Tai gali būti ne visa sveikatos istorija ir čia nėra medicininio jūsų sveikatos įrašų aprašymo."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Visi sveikatos įrašai"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"visi sveikatos įrašai"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Rašyti visus sveikatos įrašus"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergijos"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergijos"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Skaityti alergijų duomenis"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunizacija"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunizacija"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Imunizacijos skaitymas"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorinių tyrimų rezultatai"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorinių tyrimų rezultatai"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Skaityti laboratorinių tyrimų rezultatus"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergijos"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergijos"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Skaityti alergijų duomenis"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Sąlygos"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"sąlygos"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Skaityti sąlygas"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vakcinos"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vakcinos"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Skaityti vakcinų duomenis"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratorinių tyrimų rezultatai"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratorinių tyrimų rezultatai"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Skaityti laboratorinių tyrimų rezultatus"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Vaistai"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"vaistai"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Skaityti vaistų duomenis"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Asmens informacija"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"asmens informacija"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Skaityti asmens informaciją"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Išsami gydytojo informacija"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"išsami gydytojo informacija"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Skaityti išsamią gydytojo informaciją"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Nėštumo duomenys"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"nėštumo duomenys"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Skaityti nėštumo duomenis"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemų duomenys"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemų duomenys"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Skaityti problemų duomenis"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedūrų duomenys"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedūrų duomenys"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Skaityti procedūrų duomenis"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Socialinės anamnezės duomenys"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Socialinės anamnezės duomenys"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"socialinės anamnezės duomenys"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Skaityti socialinės anamnezės duomenis"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Gyvybinių funkcijų rodikliai"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Apsilankymai"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"apsilankymai"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Skaityti apsilankymus"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Gyvybinių funkcijų rodikliai"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"gyvybinių funkcijų rodikliai"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Skaityti gyvybinių funkcijų rodiklius"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Sąmoningumas"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Rašyti sąmoningumo duomenis"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Leidimas „<xliff:g id="APP_NAME">%1$s</xliff:g>“ skaityti"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Leidimas „<xliff:g id="APP_NAME">%1$s</xliff:g>“ rašyti"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Atšaukti"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Leisti"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Leisti viską"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Neleisti"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Pasirinkite duomenis, kuriuos ši programa galės skaityti ar rašyti naudojant „Health Connect“"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Pasirinkite duomenis, kuriuos ši programa galės skaityti ar rašyti naudojant „Health Connect“"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Pasirinkite duomenis, kuriuos ši programa galės skaityti iš „Health Connect“"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Pasirinkite duomenis, kuriuos ši programa galės rašyti naudojant „Health Connect“"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Suteikus skaitymo prieigą, programa galės skaityti naujus ir pastarųjų trisdešimt dienų duomenis"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Suteikus skaitymo prieigą, programa galės skaityti naujus ir ankstesnius duomenis"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Leisti programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti „Health Connect“?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Kaip „<xliff:g id="APP_NAME">%1$s</xliff:g>“ tvarko jūsų duomenis, sužinosite kūrėjo <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Leisti programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti mankštos ir sveikatingumo duomenis?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Kaip „<xliff:g id="APP_NAME">%1$s</xliff:g>“ tvarko jūsų duomenis, sužinosite <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privatumo politika"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Leisti „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti sveikatos įrašus?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Jei suteiksite prieigą, programa galės skaityti ir rašyti tokius duomenis kaip alergijos, laboratorinių tyrimų rezultatai, vakcinos ir kt.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Jei suteiksite prieigą, programa galės skaityti tokius duomenis kaip alergijos, laboratorinių tyrimų rezultatai, vakcinos ir kt.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Apie sveikatos įrašus"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Bendrinami duomenys apima"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Jei leisite, „<xliff:g id="APP_NAME">%1$s</xliff:g>“ galės bendrinti jūsų sveikatos įrašus su „Health Connect“."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinchronizuokite sveikatos įrašus iš skirtingų programų ir šaltinių, kad jie būtų saugomi vienoje vietoje"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Pašalinti visus leidimus?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Pašalinti viską"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti jokių „Health Connect“ duomenų.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti jokių „Health Connect“ duomenų, įskaitant ankstesnius duomenis.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vietovės, vaizdo kameros ar mikrofono."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti jokių „Health Connect“ duomenų, įskaitant foninius ir ankstesnius duomenis.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vietovės, vaizdo kameros ar mikrofono."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Taip pat ištrinti „<xliff:g id="APP_NAME">%1$s</xliff:g>“ duomenis iš „Health Connect“"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Pašalinti visus leidimus?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Pašalinti visus sveikatos įrašų leidimus?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Pašalinti visus mankštos ir sveikatingumo leidimus?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Taip pat ištrinti programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ mankštos duomenis iš „Health Connect“"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Pašalinti visus sveikatos įrašų leidimus?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Taip pat ištrinti programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ sveikatos įrašus iš „Health Connect“"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti šių „Health Connect“ duomenų.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti šių „Health Connect“ duomenų, įskaitant foninius duomenis.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti šių „Health Connect“ duomenų, įskaitant ankstesnius duomenis.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti šių „Health Connect“ duomenų, įskaitant foninius ir ankstesnius duomenis.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Pašalinti visus leidimus?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti „Health Connect“ duomenų.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti jokių „Health Connect“ duomenų, įskaitant foninius duomenis.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti jokių „Health Connect“ duomenų, įskaitant ankstesnius duomenis.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>” nebegalės skaityti ar rašyti jokių „Health Connect“ duomenų, įskaitant foninius ir ankstesnius duomenis.\n\nTai nepaveiks kitų leidimų, kuriuos ši programa gali turėti, pvz., vaizdo kameros, mikrofono ar vietovės."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Taip pat ištrinti „<xliff:g id="APP_NAME">%1$s</xliff:g>“ mankštos duomenis ir sveikatos įrašus iš „Health Connect“"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Pašalinti šios programos leidimai"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Taip pat ištrinti visus „Health Connect“ duomenis"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Kita diena"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Pasirinkta diena"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Ankstesnė diena"</string>
     <string name="default_error" msgid="7966868260616403475">"Kažkas ne taip. Bandykite dar kartą."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Nežinomas šaltinis"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Pirminiai duomenys"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Atidarantis laužtinis skliaustas."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Uždarantis laužtinis skliaustas."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Lauko „<xliff:g id="FIELD">%2$s</xliff:g>“ vertė"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Šios programos nebeturi prieigos, bet jų duomenys vis tiek saugomi sistemoje „Health Connect“"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ gali nuskaityti duomenis, pridėtus po <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Norėdami valdyti kitus „Android“ leidimus, ką ši programa gali pasiekti, eikite į skiltį „Nustatymai“ &gt; „Programos“"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Duomenims, kuriuos bendrinate su programa „<xliff:g id="APP_NAME">%1$s</xliff:g>”, taikoma šios programos privatumo politika"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Kaip „<xliff:g id="APP_NAME">%1$s</xliff:g>“ tvarko jūsų duomenis, sužinosite kūrėjo privatumo politikoje"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Jei norite valdyti kitus „Android“ leidimus, kuriuos ši programa gali pasiekti, eikite į skiltį „Nustatymai“, tada palieskite „Programos“"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Skaityti privatumo politiką"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Pasiekta per pastarąsias 24 val."</string>
     <string name="app_access_title" msgid="7137018424885371763">"Programos prieiga"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Šiuo metu neturite įdiegtų suderinamų programų"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Papildoma prieiga"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Ankstesni duomenys, foniniai duomenys"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Pašalinti papildomi šios programos leidimai"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Leidimai"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Kūno rengyba ir sveikata"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Mankšta, miegas, mityba ir kt."</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Sveikatos įrašai"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"sveikatos įrašai"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laboratorijų rezultatai, vaistai, imunizacija"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Labor. tyr. rez., vaistai, vakc. ir kt."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Pašalinti programų leidimai"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"„Health Connect“ pašalino „<xliff:g id="APP_DATA">%s</xliff:g>“ leidimus"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"„Health Connect“ pašalino „<xliff:g id="APP_DATA_0">%1$s</xliff:g>“ ir „<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>“ leidimus"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Eiti į „Play“ parduotuvę"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Darbo su „Health Connect“ pradžia"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Sistemoje „Health Connect“ saugomi jūsų sveikatos ir kūno rengybos duomenys ir galite lengvai sinchronizuoti skirtingas programas įrenginyje"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"„Health Connect“ saugo ir sinchronizuoja jūsų sveikatos ir kūno rengybos duomenis iš skirtingų programų.\n\n"<b>"Kūno rengybos ir sveikatingumo duomenys,"</b>" įskaitant mankštos sesijas, žingsnius, mitybą, miegą ir kt.\n\n"<b>"Sveikatos įrašai,"</b>" įskaitant vakcinas, laboratorinių tyrimų rezultatus ir kt."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Naudodami „Health Connect“ galite atlikti toliau nurodytus veiksmus."</string>
     <string name="share_data" msgid="3481932156368883946">"Duomenų bendrinimas su programomis"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Pasirinkite, kokius duomenis kiekviena programa gali skaityti ar rašyti sistemoje „Health Connect“"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Nustatymų ir privatumo valdymas"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Lengvas kraujavimas"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Vidutinis kraujavimas"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Gausus kraujavimas"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Nežinomas srautas"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="DAY">%1$d</xliff:g> menstruacijų diena iš <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruacijos (1 diena)}one{Menstruacijos (# diena)}few{Menstruacijos (# dienos)}many{Menstruacijos (# dienos)}other{Menstruacijos (# dienų)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Teigiamas"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Neigiamas"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Aukšta"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muzika"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Kita"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Be vadovo"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Vidutinis"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Energingas"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> val. <xliff:g id="MIN">%2$s</xliff:g> min."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> val."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Vyksta integravimas"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"„Health Connect“ integruojama su „Android“ sistema.\n\nGali šiek tiek užtrukti, kol bus perkelti jūsų duomenys ir leidimai."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Neuždarykite programos, kol negausite pranešimo, kad procesas baigtas."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Vykdomas „Health Connect“ integravimas"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Reikia atnaujinti"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"„Health Connect“ integruojama su „Android“ sistema, kad galėtumėte ją pasiekti tiesiai iš nustatymų."</string>
     <string name="update_button" msgid="4544529019832009496">"Atnaujinti"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Pradėkite šį atnaujinimą, kad būtų galima ir toliau integruoti „Health Connect“ su jūsų sistemos nustatymais"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Atnaujinti dabar"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Reikalingas sistemos naujinys"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Prieš tęsdami atnaujinkite telefono sistemą."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Jei jau atnaujinote telefono sistemą, pabandykite iš naujo paleisti telefoną, kad būtų tęsiamas integravimas"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Reikia atnaujinti „Health Connect“"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Prieš tęsdami atnaujinkite programą „Health Connect“ į naujausią versiją."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Reikia daugiau vietos"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"„Health Connect“ reikia <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> saugyklos vietos jūsų telefone, kad būtų tęsiamas integravimas.\n\nAtlaisvinkite telefone šiek tiek vietos ir bandykite dar kartą."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Bandyti dar kartą"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Atlaisvinti vietos"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Reikia daugiau vietos"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"„Health Connect“ reikia <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> saugyklos vietos jūsų telefone, kad būtų tęsiamas integravimas."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integravimas pristabdytas"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Programa „Health Connect“ buvo uždaryta vykdant integravimą su „Android“ sistema.\n\nSpustelėkite „Tęsti“, kad iš naujo atidarytumėte programą ir tęstumėte duomenų ir leidimų perkėlimą."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Kad išsaugotumėte „Health Connect“ duomenis, atlikite tai iki <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Palieskite ir tęskite „Health Connect“ integravimą su „Android“ sistema. Kad išsaugotumėte duomenis, atlikite tai iki <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Palieskite ir tęskite „Health Connect“ integravimą su „Android“ sistema."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Tęsti"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Tęsti „Health Connect“ integravimą"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Kad išsaugotumėte duomenis, atlikite tai iki <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Reikalingas programos naujinys"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ reikia atnaujinti, kad būtų galima toliau sinchronizuoti su „Health Connect“"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Kai kurias programas reikia atnaujinti, kad būtų galima toliau sinchronizuoti su „Health Connect“"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ reikia atnaujinti, kad būtų galima toliau sinchronizuoti su „Health Connect“. Naujiniai gali būti pasiekiami ne visose programose."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Kai kurias programas reikia atnaujinti, kad būtų galima toliau sinchronizuoti su „Health Connect“. Naujiniai gali būti pasiekiami ne visose programose."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Patikrinkite, ar yra naujinių"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Sužinokite daugiau"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"„Health Connect“ integravimas"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"„Health Connect“ integravimas nebuvo baigtas"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Gausite pranešimą, kai vėl bus pasiekiama."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Supratau"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"„Health Connect“ integravimas nebuvo baigtas"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Daugiau"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"„Health Connect“ integravimas baigtas"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Atidaryti"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Kas naujo"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Dabar galite pasiekti „Health Connect“ tiesiai iš nustatymų. Bet kuriuo metu pašalinkite „Health Connect“ programą, kad atlaisvintumėte saugyklos vietos."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Supratau"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Redaguoti programų šaltinius"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Numatytasis įrenginio nustatymas"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Programos duomenys"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Čia bus rodomi programų, turinčių prieigą prie „Health Connect“, duomenys"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Duomenys iš programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ bus rodomi čia"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Čia bus rodomi programų, turinčių prieigą prie „Health Connect“, duomenys"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Diena"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Savaitė"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mėnuo"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Praėjęs mėnuo"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Įrašai"</string>
     <string name="tab_access" msgid="7818197975407243701">"Prieiga"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Leisti papildomą programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prieigą?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ taip pat nori pasiekti šiuos „Health Connect“ nustatymus"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Įgalinkite bent vieną skaitymo leidimą, kad įjungtumėte šios programos prieigą fone ar prie ankstesnių duomenų"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Įgalinkite bent vieną skaitymo leidimą, kad įjungtumėte šios programos prieigą fone"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Įgalinkite bent vieną skaitymo leidimą, kad įjungtumėte šios programos prieigą prie ankstesnių duomenų"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"„Health Connect“ naudojimo pradžia"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinchronizuokite pirmąsias programas, kad galėtumėte bendrinti sveikatos ir kūno rengybos duomenis su jomis"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Nustatyti"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Suderinamų programų peržiūra"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Raskite daugiau programų, kurias galėtumėte sinchronizuoti su „<xliff:g id="APP_NAME">%s</xliff:g>“ naudodami „Health Connect“"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Žr. programų parduotuvėje"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ekrano užrakto nustatymas"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Kad pagerintumėte sveikatos duomenų saugą, nustatykite šio įrenginio PIN kodą, atrakinimo piešinį arba slaptažodį"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Nustatyti ekrano užraktą"</string>
     <string name="select_all" msgid="837499881590001166">"Pasirinkti viską"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Prijungtos programos nebegalės skaityti šių duomenų iš „Health Connect“"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Pažymėta"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nepažymėta"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Pasiekiamas pratimų maršruto žemėlapis"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Kita diena"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Kita savaitė"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Kitas mėnuo"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Ankstesnė diena"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Ankstesnė savaitė"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Ankstesnis mėnuo"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Visam laikui ištrinti visus duomenis?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Visam laikui ištrinti pasirinktus duomenis?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Visam laikui ištrinti visus programos „<xliff:g id="APP_NAME">%s</xliff:g>“ duomenis?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Visam laikui ištrinti <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> savaitės programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ įrašus?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Visam laikui ištrinti pasirinktus <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ įrašus?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Visam laikui ištrinti šį programos „<xliff:g id="APP_NAME">%s</xliff:g>“ įrašą?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Visam laikui ištrinti „<xliff:g id="APP_NAME">%2$s</xliff:g>“ <xliff:g id="DATA_TYPE">%1$s</xliff:g> duomenis?"</string>
+    <string name="on" msgid="8266542510798355807">"Įjungta"</string>
+    <string name="off" msgid="6996623844428550649">"Išjungta"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Pasiekta <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Pasiekta vakar <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Pasiekta <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Leisti visą laiką"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Leisti pasirinktus"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Naudojant programą"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Atmesti viską"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Leisti programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti mankštos ir sveikatingumo duomenis?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo prieigos prie šių duomenų: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nGalite leisti viską arba valdyti atskirai."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Leisti „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pasiekti įrenginį (<xliff:g id="DATA_TYPE">%2$s</xliff:g>)?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Kūno rengyba ir sveikata"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"visą laiką"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"kol naudojama"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Visą laiką"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Kol naudojama"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ gali pasiekti visus jūsų mankštos ir sveikatingumo duomenis <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Leidžiama pasiekti"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Leidžiama skaityti"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Šie leidimai suteikia „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prieigą prie įrenginio jutiklių duomenų."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Leidžiama programų: <xliff:g id="NUMBER_0">%1$d</xliff:g> iš <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nėra jokių programų, kurios pateiktų užklausą"</string>
+    <string name="allowed" msgid="4158456017482263737">"Leidžiama"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Neleidžiama"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Programos, kurioms suteiktas šis leidimas, gali pasiekti <xliff:g id="DATA_TYPE">%s</xliff:g> duomenis iš įrenginio jutiklių."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Pašalinti <xliff:g id="DATA_TYPE">%s</xliff:g> prieigą prie visų programų laikrodyje?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Varnelė"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Kryžiuko ženklas"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Šiuo metu „<xliff:g id="APP_NAME">%1$s</xliff:g>“ gali <xliff:g id="ALLOW_MODE">%2$s</xliff:g> pasiekti visus jūsų mankštos ir sveikatingumo duomenis"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Leisti programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ visada pasiekti mankštos ir sveikatingumo duomenis?"</string>
+    <string name="current_access" msgid="1457167070428176139">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ turi prieigą prie <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Tvarkyti mankštos ir sveikatingumo leidimus"</string>
 </resources>
diff --git a/apk/res/values-lv/strings.xml b/apk/res/values-lv/strings.xml
index 0558aad..0e2bab1 100644
--- a/apk/res/values-lv/strings.xml
+++ b/apk/res/values-lv/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Pārvaldiet ierīcē saglabātos veselības un fitnesa datus un kontrolējiet, kuras lietotnes tiem var piekļūt."</string>
     <string name="data_title" msgid="4456619761533380816">"Dati un piekļuve"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Pārlūkot veselības datus"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Skatiet savus veselības ierakstus un to, kuras lietotnes tiem var piekļūt."</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Visas kategorijas"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Skatīt visas kategorijas"</string>
     <string name="no_data" msgid="1906986019249068659">"Nav datu"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Vakar"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lasīšana: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Rakstīšana: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Pārvaldīt atļaujas"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Laiks: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivitāte"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"piekļuve jūsu veselības rādītāju datiem"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Lasīt patērēto kaloriju datus"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Atļauj lietotnei lasīt patērēto kaloriju datus"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Piekļuve datiem fonā"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt datiem fonā?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt datiem fonā?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ja atļausiet, šī lietotne varēs piekļūt fitnesa un labsajūtas datiem un veselības datiem, kad neizmantosiet lietotni."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ja atļausiet, šī lietotne varēs piekļūt veselības datiem, kad neizmantosiet lietotni."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ja atļausiet, šī lietotne varēs piekļūt fitnesa un labsajūtas datiem, kad neizmantosiet lietotni."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ja atļausiet, šī lietotne varēs piekļūt Health Connect datiem, kad neizmantosiet lietotni."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt iepriekšējiem datiem?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ja atļausiet, šī lietotne varēs piekļūt fitnesa un labsajūtas datiem, kas pievienoti pirms šī datuma: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ja atļausiet, šī lietotne varēs piekļūt visiem iepriekšējiem fitnesa un labsajūtas datiem."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ja atļausiet, šī lietotne varēs piekļūt Health Connect datiem, kas pievienoti pirms šī datuma: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ja atļausiet, šī lietotne varēs piekļūt visiem iepriekšējiem Health Connect datiem."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Vai piešķirt lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> papildu piekļuvi?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vēlas piekļūt arī šiem Health Connect iestatījumiem"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Piekļuve visiem datiem fonā"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Piekļuve veselības datiem fonā"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Piekļuve fitnesa un labsajūtas datiem fonā"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Atļaut šai lietotnei piekļūt fitnesa un labsajūtas datiem un veselības datiem, kad neizmantojat lietotni"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Atļaut šai lietotnei piekļūt šiem datiem, kad neizmantojat lietotni"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Atļaut šai lietotnei piekļūt šiem datiem, kad neizmantojat lietotni"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Piekļuve datiem fonā"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Atļaut šai lietotnei piekļūt Health Connect datiem, kad neizmantojat lietotni"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Piekļuve iepriekšējiem fitnesa un labsajūtas datiem"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Atļaut šai lietotnei piekļūt datiem, kas pievienoti pirms šī datuma: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Atļaut šai lietotnei piekļūt visiem iepriekšējiem datiem"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Piekļuve iepriekšējiem datiem"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Atļaut šai lietotnei piekļūt Health Connect datiem, kas pievienoti pirms šī datuma: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Atļaut šai lietotnei piekļūt visiem iepriekšējiem Health Connect datiem"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> jau var piekļūt iepriekšējiem veselības datiem"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Uzzināt vairāk par atļaujām"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Piekļuve visiem datiem fonā"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Piekļuve veselības datiem fonā"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Piekļuve fitnesa un labsajūtas datiem fonā"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Atļaut šai lietotnei piekļūt fitnesa un labsajūtas datiem un veselības datiem, kad neizmantojat lietotni"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Atļaut šai lietotnei piekļūt šiem datiem, kad neizmantojat lietotni"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Atļaut šai lietotnei piekļūt šiem datiem, kad neizmantojat lietotni"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Piekļuve datiem fonā"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Atļaut šai lietotnei piekļūt Health Connect datiem, kad neizmantojat lietotni"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Piekļuve iepriekšējiem fitnesa un labsajūtas datiem"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Atļaut šai lietotnei piekļūt datiem, kas pievienoti pirms šī datuma: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Atļaut šai lietotnei piekļūt visiem iepriekšējiem datiem"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Piekļuve iepriekšējiem datiem"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Atļaut šai lietotnei piekļūt Health Connect datiem, kas pievienoti pirms šī datuma: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Atļaut šai lietotnei piekļūt visiem iepriekšējiem Health Connect datiem"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Pašlaik netiek lasīti neviena veida fitnesa dati, jo lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> nav ieslēgta neviena lasīšanas atļauja."</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> jau var piekļūt iepriekšējiem veselības datiem. Lai to mainītu, izslēdziet šai lietotnei veselības datu atļaujas."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Pārvaldīt veselības datu atļaujas"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Lai šai lietotnei ieslēgtu piekļuvi fonā vai iepriekšējiem datiem, iespējojiet vismaz vienu lasīšanas atļauju."</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Lai šai lietotnei ieslēgtu piekļuvi fonā, iespējojiet vismaz vienu lasīšanas atļauju."</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Lai šai lietotnei ieslēgtu piekļuvi iepriekšējiem datiem, iespējojiet vismaz vienu lasīšanas atļauju."</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Atļaut šai lietotnei piekļūt visiem iepriekšējiem Health Connect datiem"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Atļaut šai lietotnei piekļūt Health Connect datiem, kad neizmantojat lietotni"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ja atļausiet, šī lietotne varēs piekļūt Health Connect datiem, kad neizmantosiet lietotni."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Piekļuve iepriekšējiem datiem"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt iepriekšējiem datiem?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Atļaut šai lietotnei piekļūt Health Connect datiem, kas pievienoti pirms šī datuma: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Atļaut šai lietotnei piekļūt visiem iepriekšējiem Health Connect datiem"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ja atļausiet, šī lietotne varēs piekļūt Health Connect datiem, kas pievienoti pirms šī datuma: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ja atļausiet, šī lietotne varēs piekļūt visiem iepriekšējiem Health Connect datiem."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktivitātēs patērētās kalorijas"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktivitātēs patērētās kalorijas"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Lasīt aktivitātēs patērēto kaloriju datus"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ratiņkrēsla stūmieni"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Lasīt ratiņkrēsla stūmienu datus"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Rakstīt ratiņkrēsla stūmienu datus"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Aktivitāšu intensitāte"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"aktivitāšu intensitāte"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Lasīt aktivitāšu intensitātes datus"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Rakstīt aktivitāšu intensitātes datus"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Vielmaiņas ātrums"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"vielmaiņas ātrums"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Lasīt bazālās vielmaiņas intensitātes datus"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ādas temperatūra"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Lasīt ādas temperatūru"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Rakstīt ādas temperatūru"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Tas ietver visus veselības datus, kas sinhronizēti ar platformu Health Connect un pievienoti tai. Šie dati var nebūt pilnīgi, un tajos nav ietverts jūsu veselības datu medicīnisks apraksts."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Visi veselības dati"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"visi veselības dati"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Rakstīt visus veselības datus"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alerģijas"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alerģijas"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lasīt datus par alerģijām"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunizācija"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunizācija"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Lasīt imunizācijas datus"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorijas rezultāti"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorijas rezultāti"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Laboratorijas rezultātu lasīšana"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alerģijas"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alerģijas"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Lasīt datus par alerģijām"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Veselības stāvokļi"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"veselības stāvokļi"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Lasīt informāciju par veselības stāvokļiem"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vakcinācijas"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vakcinācijas"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Lasīt datus par vakcinācijām"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratorisko izmeklējumu rezultāti"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratorisko izmeklējumu rezultāti"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Lasīt laboratorisko izmeklējumu rezultātus"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medikamenti"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medikamenti"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Lasīt medikamentu datus"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personas informācija"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personas informācija"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Lasīt personas informāciju"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Informācija par ārstniecības personām"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"informācija par ārstniecības personām"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Lasīt informāciju par ārstniecības personām"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Grūtniecība"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"grūtniecība"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Grūtniecības datu lasīšana"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Veselības problēmas"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"veselības problēmas"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Veselības problēmu datu lasīšana"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedūras"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedūras"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Procedūru datu lasīšana"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sociālo faktoru vēsture"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sociālo faktoru vēsture"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sociālo faktoru vēsture"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Sociālo faktoru vēstures lasīšana"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Veselības rādījumi"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Apmeklējumu dati"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"apmeklējumu dati"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Lasīt apmeklējumu datus"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Veselības rādījumi"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"veselības rādījumi"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Veselības rādījumu lasīšana"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Apzinātība"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Rakstīt apzinātības sesijas datus"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Atļauja lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> lasīt datus"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Atļauja lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> rakstīt datus"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Atcelt"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Atļaut"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Atļaut visu"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Neatļaut"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Izvēlieties, kādus datus šī lietotne drīkst lasīt vai rakstīt platformā Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Izvēlieties, kādus datus šī lietotne drīkst lasīt vai rakstīt platformā Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Izvēlieties, kādus datus šī lietotne drīkst lasīt platformā Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Izvēlieties, kādus datus šī lietotne drīkst rakstīt platformā Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ja piešķirsiet lasīšanas piekļuvi, šī lietotne varēs lasīt jaunus datus, kā arī datus, kas pievienoti pēdējo 30 dienu laikā."</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ja piešķirsiet lasīšanas piekļuvi, šī lietotne varēs lasīt gan jaunos, gan iepriekšējos datus."</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt platformai Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Lai uzzinātu, kā lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> tiek apstrādāti jūsu dati, skatiet izstrādātāja <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>."</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt fitnesa un labsajūtas datiem?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Lai uzzinātu, kā lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> tiek apstrādāti jūsu dati, skatiet: <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>."</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"konfidencialitātes politiku"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt jūsu veselības datiem?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ja piešķirsiet piekļuvi, lietotne varēs lasīt un rakstīt datus, piemēram, par alerģijām, laboratorijas rezultātiem un vakcināciju.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ja piešķirsiet piekļuvi, lietotne varēs lasīt datus, piemēram, par alerģijām, laboratorijas rezultātiem un vakcināciju.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Par veselības datiem"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Kopīgojamie dati ietver tālāk norādītos datus"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ja atļausiet, <xliff:g id="APP_NAME">%1$s</xliff:g> varēs kopīgot jūsu veselības datus ar platformu Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinhronizējiet veselības datus no dažādām lietotnēm un avotiem, lai glabātu tos vienuviet"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Vai noņemt visas atļaujas?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Noņemt visu"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt no platformas Health Connect iegūtos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt no platformas Health Connect iegūtos datus, tostarp iepriekšējos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, atrašanās vietas, kameras vai mikrofona atļauja."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt no platformas Health Connect iegūtos datus, tostarp fona datus un iepriekšējos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, atrašanās vietas, kameras vai mikrofona atļauja."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Dzēst arī lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> datus no platformas Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vai noņemt visas atļaujas?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vai noņemt visas veselības datu atļaujas?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Vai noņemt visas fitnesa un labsajūtas atļaujas?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Turklāt no platformas Health Connect izdzēst fitnesa datus, kas iegūti no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vai noņemt visas veselības datu atļaujas?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Turklāt no platformas Health Connect izdzēst veselības datus, kas iegūti no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt šos no platformas Health Connect iegūtos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt šos no platformas Health Connect iegūtos datus, tostarp fona datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt šos no platformas Health Connect iegūtos datus, tostarp iepriekšējos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt šos no platformas Health Connect iegūtos datus, tostarp fona un iepriekšējos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vai noņemt visas atļaujas?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt no platformas Health Connect iegūtos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt no platformas Health Connect iegūtos datus, tostarp fona datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt no platformas Health Connect iegūtos datus, tostarp iepriekšējos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vairs nevarēs lasīt un rakstīt no platformas Health Connect iegūtos datus, tostarp fona un iepriekšējos datus.\n\nTādējādi netiek ietekmētas citas atļaujas, kas lietotnei var būt piešķirtas, piemēram, kameras, mikrofona vai atrašanās vietas atļaujas."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Turklāt no platformas Health Connect izdzēst fitnesa un veselības datus, kas iegūti no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Šai lietotnei ir noņemtas atļaujas."</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Turklāt dzēst visus Health Connect datus"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Nākamā diena"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Atlasītā diena"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Iepriekšējā diena"</string>
     <string name="default_error" msgid="7966868260616403475">"Radās kļūda. Lūdzu, mēģiniet vēlreiz."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Nezināms resurss"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Avota dati"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Atverošā figūriekava."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Aizverošā figūriekava."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Lauka “<xliff:g id="FIELD">%2$s</xliff:g>” vērtība"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Šīm lietotnēm vairs nav piekļuves, taču to dati joprojām tiek glabāti platformā Health Connect."</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> var lasīt datus, kas pievienoti pēc šī datuma: <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Lai pārvaldītu citas Android atļaujas, kam var piekļūt šī lietotne, pārejiet uz sadaļu Iestatījumi &gt; Lietotnes."</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> konfidencialitātes politika regulē datus, kas tiek kopīgoti ar šo lietotni."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Lai uzzinātu, kā lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> apstrādā jūsu datus, skatiet izstrādātāja konfidencialitātes politiku."</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Lai pārvaldītu citas Android atļaujas, kam var piekļūt šī lietotne, pārejiet uz sadaļu “Iestatījumi” un pēc tam pieskarieties vienumam “Lietotnes”."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Lasīt konfidencialitātes politiku"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Piekļūts pēdējo 24 stundu laikā"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Lietotnes piekļuve"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Pašlaik nav instalēta neviena saderīga lietotne"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Papildu piekļuve"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Iepriekšējie dati, fona dati"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Šai lietotnei ir noņemtas papildu atļaujas."</string>
     <string name="permissions_header" msgid="6519976063360071569">"Atļaujas"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness un labsajūta"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Treniņi, miegs, uzturs un citas atļaujas"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Veselības dati"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"veselības dati"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laboratorijas rezultāti, zāles, potes…"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Laboratorijas rezultāti, zāles, potes…"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Noņemtas lietotņu atļaujas"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Platformā Health Connect tika noņemtas lietotnes <xliff:g id="APP_DATA">%s</xliff:g> atļaujas."</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Platformā Health Connect tika noņemtas lietotņu <xliff:g id="APP_DATA_0">%1$s</xliff:g> un <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> atļaujas."</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Pāriet uz Play veikalu"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Darba sākšana ar Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Lietotnē Health Connect tiek glabāti jūsu veselības un fitnesa dati, tādējādi varat vienkāršā veidā sinhronizēt dažādas lietotnes savā ierīcē."</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Platformā Health Connect tiek uzglabāti un sinhronizēti jūsu veselības un fitnesa dati no dažādām lietotnēm.\n\n"<b>"Fitnesa un labsajūtas dati,"</b>" tostarp treniņu sesijas, noieto soļu skaits, uztura paradumi, miega ilgums un citi dati.\n\n"<b>"Veselības dati,"</b>" tostarp saistībā ar vakcinācijām, laboratorisko izmeklējumu rezultātiem un citām tēmām."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Izmantojot Health Connect, varat veikt tālāk norādītās darbības."</string>
     <string name="share_data" msgid="3481932156368883946">"Datu kopīgošana ar lietotnēm"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Izvēlieties, kādus datus katra lietotne var lasīt vai rakstīt platformā Health Connect."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Iestatījumu un konfidencialitātes pārvaldība"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Viegla asiņošana"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Vidēja asiņošana"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Spēcīga asiņošana"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Nezināma asiņošanas intensitāte"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruālā cikla <xliff:g id="DAY">%1$d</xliff:g>. diena no <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruācija (viena diena)}zero{Menstruācija (# dienu)}one{Menstruācija (# diena)}other{Menstruācija (# dienas)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitīvs"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatīvs"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Augsts līmenis"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Mūzika"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Cits"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Bez vadības"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Vidēji intensīvas"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Enerģiskas"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Notiek integrēšana"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Notiek Health Connect integrēšana Android sistēmā.\n\nDatu un atļauju pārsūtīšana var ilgt kādu brīdi."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Neaizveriet lietotni, kamēr nav parādīts paziņojums par pārsūtīšanas pabeigšanu."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Notiek Health Connect integrēšana"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Nepieciešama atjaunināšana"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Notiek Health Connect integrēšana Android sistēmā, lai jūs tai varētu piekļūt tieši no iestatījumiem."</string>
     <string name="update_button" msgid="4544529019832009496">"Atjaunināt"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Sāciet atjaunināšanu, lai varētu turpināt Health Connect integrēšanu jūsu sistēmas iestatījumos"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Atjaunināt tūlīt"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Nepieciešams atjaunināt sistēmu"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Pirms turpināt, atjauniniet tālruņa sistēmu."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ja esat atjauninājis tālruņa sistēmu, restartējiet tālruni, lai turpinātu integrēšanu."</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Nepieciešams atjaunināt Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Pirms turpināt, atjauniniet Health Connect uz jaunāko versiju."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Nepieciešams vairāk vietas"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Lai turpinātu integrēšanu, lietotnei Health Connect ir nepieciešams <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> krātuves vietas jūsu tālrunī.\n\nAtbrīvojiet vietu tālrunī un mēģiniet vēlreiz."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Mēģināt vēlreiz"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Atbrīvot vietu"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Nepieciešams vairāk vietas"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Lai turpinātu integrēšanu, lietotnei Health Connect ir nepieciešams <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> krātuves vietas jūsu tālrunī."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrēšana ir apturēta"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Lietotne Health Connect tika aizvērta, kamēr notika integrēšana Android sistēmā.\n\nNoklikšķiniet uz Atsākt, lai atkārtoti atvērtu lietotni un turpinātu datu un atļauju pārsūtīšanu."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Lai paturētu savus Health Connect datus, pabeidziet to šajā laikā: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Pieskarieties, lai turpinātu Health Connect integrēšanu Android sistēmā. Lai paturētu savus datus, pabeidziet to šajā laikā: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Pieskarieties, lai turpinātu Health Connect integrēšanu Android sistēmā."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Turpināt"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect integrēšanas atsākšana"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Lai paturētu savus datus, pabeidziet to šajā laikā: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Ir jāatjaunina lietotne"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Lai turpinātu sinhronizēšanu ar Health Connect, ir jāatjaunina lietotne <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Lai turpinātu sinhronizēšanu ar Health Connect, ir jāatjaunina dažas lietotnes."</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Lai turpinātu sinhronizēšanu ar Health Connect, ir jāatjaunina lietotne <xliff:g id="APP_NAME">%1$s</xliff:g>. Atjauninājumi var nebūt pieejami visām lietotnēm."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Lai turpinātu sinhronizēšanu ar Health Connect, ir jāatjaunina dažas lietotnes. Atjauninājumi var nebūt pieejami visām lietotnēm."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Pārbaudīt, vai ir pieejami atjauninājumi"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Uzzināt vairāk"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect integrēšana"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect integrēšana netika pabeigta"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Jūs saņemsiet paziņojumu, kad tā atkal būs pieejama."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Labi"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect integrēšana netika pabeigta"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Lasīt vairāk"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect integrēšana ir pabeigta"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Atvērt"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Jaunumi"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Tagad varat piekļūt lietotnei Health Connect tieši no iestatījumiem. Jebkurā brīdī varat atinstalēt lietotni Health Connect, ja nepieciešams atbrīvot krātuves vietu."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Labi"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Rediģēt lietotņu avotus"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Ierīces noklusējuma lietotne"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Lietotnes dati"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Šeit būs redzami dati no lietotnēm, kurām ir piekļuve platformai Health Connect."</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Šeit tiks rādīti dati no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Šeit būs redzami dati no lietotnēm, kurām ir piekļuve platformai Health Connect."</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Diena"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Nedēļa"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mēnesis"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Iepriekšējais mēnesis"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Ieraksti"</string>
     <string name="tab_access" msgid="7818197975407243701">"Piekļuve"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Vai piešķirt lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> papildu piekļuvi?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> vēlas piekļūt arī šiem Health Connect iestatījumiem"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Lai šai lietotnei ieslēgtu piekļuvi fonā vai iepriekšējiem datiem, iespējojiet vismaz vienu lasīšanas atļauju."</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Lai šai lietotnei ieslēgtu piekļuvi fonā, iespējojiet vismaz vienu lasīšanas atļauju."</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Lai šai lietotnei ieslēgtu piekļuvi iepriekšējiem datiem, iespējojiet vismaz vienu lasīšanas atļauju."</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Sāciet lietot Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinhronizējiet pirmās lietotnes, starp kurām sinhronizēt veselības un fitnesa datus"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Iestatīt"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Skatiet saderīgas lietotnes"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Atrodiet citas lietotnes, ar ko sinhronizēt lietotnes <xliff:g id="APP_NAME">%s</xliff:g> datus, izmantojot Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Skatīt lietotņu veikalā"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ekrāna bloķēšanas iestatīšana"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Lai uzlabotu savu veselības datu drošību, iestatiet šai ierīcei PIN, kombināciju vai paroli"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Iestatīt ekrāna bloķēšanu"</string>
     <string name="select_all" msgid="837499881590001166">"Atlasīt visu"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Pievienotās lietotnes vairs nevarēs lasīt šos datus no lietotnes platformas Health Connect."</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Atzīmēta"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nav atzīmēta"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Ir pieejama treniņu maršruta karte"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Nākamā diena"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Nākamā nedēļa"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Nākamais mēnesis"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Iepriekšējā diena"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Iepriekšējā nedēļa"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Iepriekšējais mēnesis"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Vai neatgriezeniski dzēst visus datus?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Vai neatgriezeniski dzēst atlasītos datus?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Vai neatgriezeniski dzēst visus lietotnes <xliff:g id="APP_NAME">%s</xliff:g> datus?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Vai neatgriezeniski dzēst atlasītos lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g>ierakstus par šo nedēļu: <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Vai neatgriezeniski dzēst atlasītos lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> ierakstus par šo mēnesi: <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Vai neatgriezeniski dzēst šo lietotnes <xliff:g id="APP_NAME">%s</xliff:g> ierakstu?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Vai neatgriezeniski dzēst datus (<xliff:g id="DATA_TYPE">%1$s</xliff:g>) lietotnei <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Ieslēgts"</string>
+    <string name="off" msgid="6996623844428550649">"Izslēgts"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Pēdējā piekļuves reize: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Pēdējā piekļuves reize vakar: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Pēdējā piekļuves reize: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Vienmēr atļaut"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Piešķirt atlasītās"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Lietotnes izmantošanas laikā"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Liegt visas"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt fitnesa un labsajūtas datiem?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa piekļuvi šādiem datiem: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nVarat piešķirt visas atļaujas vai pārvaldīt tās atsevišķi."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> piekļūt pie: <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness un labsajūta"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"vienmēr"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"izmantošanas laikā"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Vienmēr"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Izmantošanas laikā"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="ALLOW_MODE">%2$s</xliff:g> var piekļūt visiem jūsu fitnesa un labsajūtas datiem"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Atļauts piekļūt"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Atļauts lasīt"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ar šīm atļaujām lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> ir piešķirta piekļuve jūsu ierīces sensoru datiem."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> lietotnei(-ēm) no <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ir atļauja"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nav neviena pieprasījuma no lietotnēm"</string>
+    <string name="allowed" msgid="4158456017482263737">"Ir atļauja"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nav atļaujas"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Lietotnes, kurām ir šī atļauja, var piekļūt šādiem datiem no jūsu ierīces sensoriem: <xliff:g id="DATA_TYPE">%s</xliff:g>."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Vai noņemt visu pulksteņa lietotņu piekļuvi šādiem datiem: <xliff:g id="DATA_TYPE">%s</xliff:g>?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Atzīme"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Krustiņš"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Pašlaik lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> var piekļūt fitnesa un labsajūtas datiem (<xliff:g id="ALLOW_MODE">%2$s</xliff:g>)"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Vai atļaut lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> vienmēr piekļūt fitnesa un labsajūtas datiem?"</string>
+    <string name="current_access" msgid="1457167070428176139">"Lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> ir piekļuve šādiem datiem: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Pārvaldīt fitnesa un labsajūtas datu atļaujas"</string>
 </resources>
diff --git a/apk/res/values-mk/strings.xml b/apk/res/values-mk/strings.xml
index 9c417d6..2dccafc 100644
--- a/apk/res/values-mk/strings.xml
+++ b/apk/res/values-mk/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Управувајте со податоците за здравје и фитнес на вашиот уред и контролирајте кои апликации може да пристапуваат до нив"</string>
     <string name="data_title" msgid="4456619761533380816">"Податоци и пристап"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Прелистувајте здравствена евиденција"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Погледнете ја вашата здравствена евиденција и кои апликации може да пристапат до неа"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Сите категории"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Преглед на сите категории"</string>
     <string name="no_data" msgid="1906986019249068659">"Нема податоци"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Вчера"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Прочита: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Внесе: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Управувајте со дозволите"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Време: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Активност"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"пристапување до податоците за здравјето"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Читање потрошени калории"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Дозволува апликацијата да чита потрошени калории"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Пристап до податоците во заднина"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до податоците во заднина?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до податоците во заднина?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ако дозволите, апликацијава ќе може да пристапува до податоците за фитнес и благосостојба, како и до здравствената евиденција кога не ја користите апликацијата."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ако дозволите, апликацијава ќе може да пристапува до здравствената евиденција кога не ја користите апликацијата."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ако дозволите, апликацијава ќе може да пристапува до податоците за фитнес и благосостојбата кога не ја користите апликацијата."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ако дозволите, апликацијава ќе може да пристапува до податоците од Health Connect кога не ја користите апликацијата."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до минатите податоци?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ако дозволите, апликацијава ќе може да пристапува до податоците за фитнес и благосостојба додадени пред <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ако дозволите, апликацијава ќе може да пристапува до сите минати податоци за фитнес и благосостојба."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ако дозволите, апликацијава ќе може да пристапува до податоците од Health Connect додадени пред <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ако дозволите, апликацијава ќе може да пристапува до сите минати податоци од Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Да се дозволи дополнителен пристап за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> сака да пристапува и до овие поставки за Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Пристап до сите податоци во заднина"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Пристап до здравствената евиденција во заднина"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Пристап до податоците за фитнес и благосостојба во заднина"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Дозволете ѝ на апликацијава да пристапува до податоците за фитнес и благосостојба, како и до здравствената евиденција кога не ја користите апликацијата"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Дозволете ѝ на апликацијава да пристапува до податоциве кога не ја користите апликацијата"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Дозволете ѝ на апликацијава да пристапува до податоциве кога не ја користите апликацијата"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Пристап до податоците во заднина"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Дозволете ѝ на апликацијава да пристапува до податоците од Health Connect кога не ја користите апликацијата"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Пристап до минатите податоци за фитнес и благосостојба"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Дозволете ѝ на апликацијава да пристапува до податоците додадени пред <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Дозволете ѝ на апликацијава да пристапува до сите минати податоци"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Пристап до минатите податоци"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Дозволете ѝ на апликацијава да пристапува до податоците од Health Connect додадени пред <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Дозволете ѝ на апликацијава да пристапува до сите минати податоци од Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе може да пристапува до минатите податоци за здравствената евиденција"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Прочитајте повеќе за дозволите"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Пристап до сите податоци во заднина"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Пристап до здравствената евиденција во заднина"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Пристап до податоците за фитнес и благосостојба во заднина"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Дозволете ѝ на апликацијава да пристапува до податоците за фитнес и благосостојба, како и до здравствената евиденција кога не ја користите апликацијата"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Дозволете ѝ на апликацијава да пристапува до податоциве кога не ја користите апликацијата"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Дозволете ѝ на апликацијава да пристапува до податоциве кога не ја користите апликацијата"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Пристап до податоците во заднина"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Дозволете ѝ на апликацијава да пристапува до податоците од Health Connect кога не ја користите апликацијата"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Пристап до минатите податоци за фитнес и благосостојба"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Дозволете ѝ на апликацијава да пристапува до податоците додадени пред <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Дозволете ѝ на апликацијава да пристапува до сите минати податоци"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Пристап до минатите податоци"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Дозволете ѝ на апликацијава да пристапува до податоците од Health Connect додадени пред <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Дозволете ѝ на апликацијава да пристапува до сите минати податоци од Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Во моментов не се читаат податоци за фитнес бидејќи <xliff:g id="APP_NAME">%1$s</xliff:g> нема доделени дозволи за читање"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе може да пристапува до минатите податоци за вашата здравствена евиденција. За да го промените ова, исклучете ги дозволите за здравствената евиденција за апликацијава"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Управувајте со дозволите за здравствената евиденција"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Овозможете најмалку една дозвола за читање за да вклучите пристап на апликацијата до податоците во заднина или пристап до минатите податоци"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Овозможете најмалку една дозвола за читање за да вклучите пристап во заднина за апликацијава"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Овозможете најмалку една дозвола за читање за да вклучите пристап до минати податоци за апликацијава"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Дозволете ѝ на апликацијава да пристапува до сите минати податоци од Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Дозволете ѝ на апликацијава да пристапува до податоците од Health Connect кога не ја користите апликацијата"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ако дозволите, апликацијава ќе може да пристапува до податоците од Health Connect кога не ја користите апликацијата."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Пристап до минатите податоци"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до минатите податоци?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Дозволете ѝ на апликацијава да пристапува до податоците од Health Connect додадени пред <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Дозволете ѝ на апликацијава да пристапува до сите минати податоци од Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ако дозволите, апликацијава ќе може да пристапува до податоците од Health Connect додадени пред <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ако дозволите, апликацијава ќе може да пристапува до сите минати податоци од Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Активно потрошени калории"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"активно потрошени калории"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Читање активно потрошени калории"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"туркања на инвалидска количка"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Запишување туркања на инвалидска количка"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Читање туркања на инвалидска количка"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Интензитет на активноста"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"интензитет на активноста"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Читање на интензитетот на активноста"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Пишување на интензитетот на активноста"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Основна метаболичка стапка"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"основна метаболичка стапка"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Читање основна метаболичка стапка"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"температура на кожата"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Читање на температурата на кожата"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Запишување на температурата на кожата"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Ова ги опфаќа сите здравствени евиденции што се синхронизирани и додадени во Health Connect. Ова може да не е вашето целосно медицинско досие и не опфаќа медицински опис на вашите здравствени евиденции."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Сета здравствена евиденција"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"сета здравствена евиденција"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Пишување на сета здравствена евиденција"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Алергии"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"алергии"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Читај ги алергиите"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Имунизација"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"имунизација"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Читање на податоците за имунизација"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Лабораторски резултати"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"лабораторски резултати"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Читање на лабораторските резултати"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Алергии"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"алергии"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Читање на алергиите"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Услови"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"услови"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Читање на условите"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Вакцини"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"вакцини"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Читање на вакцините"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Лабораториски резултати"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"лабораториски резултати"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Читање на лабораториските резултати"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Лекови"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"лекови"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Читање лекови"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Лични детали"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"лични детали"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Читање на личните детали"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Детали за лекарите"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"детали за лекарите"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Читање детали за лекарите"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Бременост"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"бременост"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Читање на податоците за бременост"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Проблеми"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"проблеми"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Читање на проблемите"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Постапки"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"постапки"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Читање на постапките"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Историја на друштвените мрежи"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Историја на друштвените мрежи"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"историја на друштвените мрежи"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Читање на историјата на друштвените мрежи"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Витални знаци"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Посети"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"посети"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Читање посети"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Витални знаци"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"витални знаци"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Читање на виталните знаци"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Промисленост"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Пишувај за сесијата за промисленост"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Дозволете „<xliff:g id="APP_NAME">%1$s</xliff:g>“ да чита"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Дозволете „<xliff:g id="APP_NAME">%1$s</xliff:g>“ да пишува"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Откажи"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Дозволи"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Дозволи ги сите"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Не дозволувај"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Изберете ги податоците што сакате оваа апликација да ги чита или запишува во Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Изберете ги податоците што сакате да ги чита или запишува апликацијава во Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Изберете ги податоците што сакате да ги чита апликацијава од Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Изберете ги податоците што сакате да ги запишува апликацијава во Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ако ѝ дадете пристап за читање, апликацијата ќе може да ги чита новите податоци и податоците од минатите 30 дена"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ако ѝ дадете пристап за читање, апликацијата ќе може да ги чита новите и минатите податоци"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Може да дознаете како <xliff:g id="APP_NAME">%1$s</xliff:g> постапува со вашите податоци во <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> на програмерот"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до податоците за фитнес и благосостојба?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Може да дознаете како <xliff:g id="APP_NAME">%1$s</xliff:g> постапува со вашите податоци во <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"политика за приватност"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до вашата здравствена евиденција?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ако доделите пристап, апликацијата ќе може да чита и запишува податоци како што се алергии, лабораториски резултати, вакцини и друго \n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ако доделите пристап, апликацијата ќе може да чита податоци како што се алергии, лабораториски резултати, вакцини и друго\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"За здравствената евиденција"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Податоците за споделување опфаќаат"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ако дозволите, <xliff:g id="APP_NAME">%1$s</xliff:g> ќе може да ја споделува вашата здравствена евиденција со Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Синхронизирајте ја вашата здравствена евиденција од различни апликации и извори за да ја чувате на едно место"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Да се отстранат сите дозволи?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Отстрани ги сите"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да чита, ниту да запишува податоци од Health Connect.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, на пр. за пристап до камерата, микрофонот или локацијата."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да чита, ниту да запишува податоци од Health Connect, меѓу кои и претходни податоци.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, на пр. за пристап до локацијата, камерата или микрофонот."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да чита, ниту да запишува податоци од Health Connect, меѓу кои и заднински и претходни податоци.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, на пр. за пристап до локацијата, камерата или микрофонот."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Избриши ги и податоците на <xliff:g id="APP_NAME">%1$s</xliff:g> од Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Да се отстранат сите дозволи?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Да се отстранат сите дозволи за здравствената евиденција?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Да се отстранат сите дозволи за фитнес и благосостојба?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Избриши ги и податоците за фитнес од <xliff:g id="APP_NAME">%1$s</xliff:g> од Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Да се отстранат сите дозволи за здравствената евиденција?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Избриши ги и податоците за здравствената евиденција од <xliff:g id="APP_NAME">%1$s</xliff:g> од Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да ги чита или евидентира податоциве од Health Connect.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, како камера, микрофон или локација."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да ги чита или евидентира податоциве од Health Connect, меѓу кои и заднински податоци.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, како камера, микрофон или локација."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да ги чита или евидентира податоциве од Health Connect, меѓу кои и минати податоци.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, како камера, микрофон или локација."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да ги чита или евидентира податоциве од Health Connect, меѓу кои и заднински и минати податоци.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, како камера, микрофон или локација."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Да се отстранат сите дозволи?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да чита или евидентира податоци од Health Connect.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, како камера, микрофон или локација."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да чита или евидентира податоци од Health Connect, меѓу кои и заднински податоци.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, како камера, микрофон или локација."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да чита или евидентира податоци од Health Connect, меѓу кои и минати податоци.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, како камера, микрофон или локација."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> веќе нема да може да чита или евидентира податоци од Health Connect, меѓу кои и заднински и минати податоци.\n\nОва не влијае на другите дозволи што може да ги има апликацијава, како камера, микрофон или локација."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Избриши ги и податоците за фитнес и здравствената евиденција од <xliff:g id="APP_NAME">%1$s</xliff:g> од Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Дозволите за апликацијава се отстранети"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Избриши ги и сите податоци од Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Следниот ден"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Избран ден"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Претходниот ден"</string>
     <string name="default_error" msgid="7966868260616403475">"Нешто не е во ред. Обидете се повторно."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Непознат ресурс"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Податоци за изворен код"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Отворена заграда."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Затворена заграда."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Вредност на полето <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Апликацииве веќе немаат пристап, но уште имаат зачувани податоци во Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> може да чита податоци додадени по <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"За да управувате со други дозволи за Android до кои може да пристапи оваа апликација, одете во „Поставки &gt; Апликации“"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Податоците што ги споделувате со <xliff:g id="APP_NAME">%1$s</xliff:g> се опфатени со нејзината политика за приватност"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Може да дознаете како <xliff:g id="APP_NAME">%1$s</xliff:g> постапува со вашите податоци во политиката за приватност на програмерот"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"За да управувате со други дозволи за Android до кои може да пристапи оваа апликација, одете во „Поставки“, а потоа допрете „Апликации“"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Прочитајте ја политиката за приватност"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Пристапено во минатите 24 часа"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Пристап на апликацијата"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Во моментов немате инсталирано компатибилни апликации"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Дополнителен пристап"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Минати податоци, податоци во заднина"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Отстранети се дополнителните дозволи за апликацијава"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Дозволи"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Фитнес и благосостојба"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Вежбање, спиење, исхрана и друго"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Здравствена евиденција"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"здравствена евиденција"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Лаборат. резулати, лекови, вакцини итн."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Лаборат. резулати, лекови, вакцини итн."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Отстранети дозволи за апликации"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect ги отстрани дозволите за <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect ги отстрани дозволите за <xliff:g id="APP_DATA_0">%1$s</xliff:g> и <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Одете во Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Започнете со Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ги складира вашите податоци за здравје и фитнес, што ви овозможува едноставен начин да ги синхронизирате различните апликации на вашиот уред"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ги складира и синхронизира податоците за здравје и фитнес од различни апликации.\n\n"<b>"Податоци за фитнес и благосостојба,"</b>" заедно со сесии на вежбање, чекори, исхрана, спиење и друго\n\n"<b>"Здравствена евиденција,"</b>" заедно со вакцини, лабораториски резултати и друго"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Со Health Connect може"</string>
     <string name="share_data" msgid="3481932156368883946">"Споделувајте податоци со вашите апликации"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Изберете ги податоците што секоја апликација може да ги чита или запишува во Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Управувајте со поставките и приватноста"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Слаб проток"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Среден проток"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Силен проток"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Непознат менструален циклус"</string>
     <string name="period_day" msgid="3821944462093965882">"Менструација: ден <xliff:g id="DAY">%1$d</xliff:g> од <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Менструација (1 ден)}one{Менструација (# ден)}other{Менструација (# дена)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Позитивна"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Негативна"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Голема"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Музика"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Друго"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Неводена"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Умерено"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Интензивно"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> м."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ч. <xliff:g id="MIN">%2$s</xliff:g> м."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ч."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Интеграцијата е во тек"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect се интегрира со системот Android.\n\nМоже да потрае некое време додека се префрлаат вашите податоци и дозволи."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Не затворајте ја апликацијата додека не добиете известување дека процесот е завршен."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Интеграцијата на Health Connect е во тек"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Потребно е ажурирање"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect се интегрира со системот Android за да можете да пристапите директно од вашите поставки."</string>
     <string name="update_button" msgid="4544529019832009496">"Ажурирај"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Започнете со ова ажурирање за да може Health Connect да продолжи со интегрирање со поставките на системот"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Ажурирајте сега"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Потребно е ажурирање на системот"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Пред да продолжите, ажурирајте го системот на телефонот."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ако веќе сте го ажурирале системот на телефонот, обидете се да го рестартирате телефонот за да продолжите со интеграцијата"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Потребно е ажурирање на Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Пред да продолжите, ажурирајте ја апликацијата Health Connect на најновата верзија."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Потребен е поголем простор"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"На Health Connect ѝ треба простор од <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> на вашиот телефон за да продолжи со интеграцијата.\n\nОслободете простор на телефонот и обидете се повторно."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Обиди се повторно"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Ослободете простор"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Потребен е поголем простор"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"На Health Connect ѝ треба простор од <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> на вашиот телефон за да продолжи со интеграцијата."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Интеграцијата е паузирана"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Апликацијата Health Connect се затвори додека се интегрираше со системот на Android.\n\nКликнете „продолжи“ за повторно да ја отворите апликацијата и да продолжите со пренесување на вашите податоци и дозволи."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"За да ги зачувате вашите податоци од Health Connect, завршете го ова за <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Допрете за да продолжите со интегрирање на Health Connect со системот со Android. За да ги зачувате вашите податоци, завршете го ова за <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Допрете за да продолжите со интегрирање на Health Connect со системот со Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Продолжи"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Продолжете со интеграција со Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"За да ги зачувате вашите податоци, завршете го ова за <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Потребно е ажурирање на апликацијата"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Апликацијата <xliff:g id="APP_NAME">%1$s</xliff:g> треба да се ажурира за да продолжи да се синхронизира со Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Некои апликации треба да се ажурираат за да продолжат да се синхронизираат со Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Апликацијата <xliff:g id="APP_NAME">%1$s</xliff:g> треба да се ажурира за да продолжи да се синхронизира со Health Connect. Ажурирањата може да не се достапни за сите апликации."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Некои апликации треба да се ажурираат за да продолжат да се синхронизираат со Health Connect. Ажурирањата може да не се достапни за сите апликации."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Проверете дали има ажурирања"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Дознајте повеќе"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Интеграција на Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Интеграцијата на Health Connect не е завршена"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Ќе добиете известување кога ќе стане повторно достапна."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Сфатив"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Интеграцијата на Health Connect не е завршена"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Прочитајте повеќе"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Интеграцијата на Health Connect е завршена"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Отвори"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Што има ново"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Сега може да пристапите до Health Connect директно од вашите поставки. Деинсталирајте ја апликацијата Health Connect во секое време за да ослободите простор за складирање."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Сфатив"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Изменување на изворите на апликации"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Стандардни поставки за уредот"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Податоци од апликација"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Податоците од апликациите со пристап до Health Connect ќе се прикажат тука"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Податоците од <xliff:g id="APP_NAME">%1$s</xliff:g> ќе се прикажуваат тука"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Податоците од апликациите со пристап до Health Connect ќе се прикажуваат тука"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Ден"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Седмица"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Месец"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Минатиот месец"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Записи"</string>
     <string name="tab_access" msgid="7818197975407243701">"Пристап"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Да се дозволи дополнителен пристап за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> сака да пристапува и до овие поставки за Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Овозможете најмалку една дозвола за читање за да вклучите пристап на апликацијата до податоците во заднина или пристап до минатите податоци"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Овозможете најмалку една дозвола за читање за да вклучите пристап во заднина за апликацијава"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Овозможете најмалку една дозвола за читање за да вклучите пристап до минати податоци за апликацијава"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Започнете да користите Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Синхронизирајте ги вашите први апликации за да споделуваат податоци за здравјето и фитнесот меѓусебно"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Поставете"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Погледнете ги компатибилните апликации"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Најдете повеќе апликации за да ги синхронизирате со <xliff:g id="APP_NAME">%s</xliff:g> преку Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Погледнете во App Store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Поставете „Заклучување екран“"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"За дополнителна безбедност на вашите здравствени податоци, поставете PIN, шема или лозинка за уредов"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Поставете „Заклучување екран“"</string>
     <string name="select_all" msgid="837499881590001166">"Избери ги сите"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Поврзаните апликации веќе нема да може да ги читаат податоциве од Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Штиклирано"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Не е штиклирано"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Достапна е маршрутата на картата за вежбање"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Следниот ден"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Следната седмица"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Следниот месец"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Претходниот ден"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Претходната седмица"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Претходниот месец"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Да се избришат трајно сите податоци?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Да се избришат трајно избраните податоци?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Да се избришат трајно сите податоци од <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Да се избришат трајно избраните записи од <xliff:g id="APP_NAME">%1$s</xliff:g> за целата седмица од <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Да се избришат трајно избраните записи од <xliff:g id="APP_NAME">%1$s</xliff:g> за <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Да се избришe трајно записов во <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Да се избришат трајно податоците за <xliff:g id="DATA_TYPE">%1$s</xliff:g> за <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Вклучено"</string>
+    <string name="off" msgid="6996623844428550649">"Исклучено"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Пристапено: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Пристапено вчера: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Пристапено: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Дозволи цело време"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Дозволи ги избраните"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Додека се користи апликацијата"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Одбиј ги сите"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до податоците за фитнес и благосостојба?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара пристап до <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nИзберете да ги дозволите сите или да ги контролирате поединечно."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Фитнес и благосостојба"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"цело време"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"додека се користи"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Цело време"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Додека се користи"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> може да пристапува до сите ваши податоци за фитнес и благосостојба <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Дозволено да пристапува"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Дозволено да чита"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Дозволиве овозможуваат <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до податоците од сензорите на уредот."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Апликации со дозвола: <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Нема барања од апликации"</string>
+    <string name="allowed" msgid="4158456017482263737">"Дозволено"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Не е дозволено"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Апликациите со оваа дозвола може да пристапуваат до податоците за <xliff:g id="DATA_TYPE">%s</xliff:g> од сензорите на уредот."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Да се отстрани пристапот до <xliff:g id="DATA_TYPE">%s</xliff:g> за сите апликации на часовникот?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Знак за штиклирање"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Знак икс"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Во моментов, <xliff:g id="APP_NAME">%1$s</xliff:g> може да пристапува до податоците за фитнес и благосостојба <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Да се дозволи <xliff:g id="APP_NAME">%1$s</xliff:g> да пристапува до податоците за фитнес и благосостојба цело време?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> има пристап до <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Управувајте со дозволите за фитнес и благосостојба"</string>
 </resources>
diff --git a/apk/res/values-ml/strings.xml b/apk/res/values-ml/strings.xml
index 168bb42..d81c2e6 100644
--- a/apk/res/values-ml/strings.xml
+++ b/apk/res/values-ml/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"നിങ്ങളുടെ ഉപകരണത്തിൽ ആരോഗ്യ, ഫിറ്റ്നസ് ഡാറ്റ മാനേജ് ചെയ്യൂ, ഏതെല്ലാം ആപ്പുകൾക്ക് അത് ആക്‌സസ് ചെയ്യാനാകുമെന്ന് നിയന്ത്രിക്കുകയും ചെയ്യൂ"</string>
     <string name="data_title" msgid="4456619761533380816">"ഡാറ്റയും ആക്‌സസും"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"ആരോഗ്യ റെക്കോർഡുകൾ ബ്രൗസ് ചെയ്യുക"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"നിങ്ങളുടെ ആരോഗ്യ റെക്കോർഡുകളും അവ ആക്‌സസ് ചെയ്യാനാകുന്ന ആപ്പുകളും കാണുക"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"എല്ലാ വിഭാഗങ്ങളും"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"എല്ലാ വിഭാഗങ്ങളും കാണുക"</string>
     <string name="no_data" msgid="1906986019249068659">"ഡാറ്റയൊന്നുമില്ല"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ഇന്നലെ"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"വായിച്ചത്: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"എഴുതിയത്: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"അനുമതികൾ മാനേജ് ചെയ്യുക"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"സമയം: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"ആക്റ്റിവിറ്റി"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"നിങ്ങളുടെ ആരോഗ്യ ഡാറ്റ ആക്സസ് ചെയ്യുക"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"കത്തിച്ച കലോറി റീഡ് ചെയ്യുക"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"കത്തിച്ചുകളഞ്ഞ കലോറി സംബന്ധിച്ച ഡാറ്റ റീഡ് ചെയ്യാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"പശ്ചാത്തലത്തിൽ ഡാറ്റ ആക്‌സസ് ചെയ്യുക"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"പശ്ചാത്തലത്തിൽ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനെ അനുവദിക്കണോ?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"പശ്ചാത്തലത്തിൽ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനെ അനുവദിക്കണോ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്ത സമയത്ത് ഈ ആപ്പിന് ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റയും ആരോഗ്യ റെക്കോർഡുകളും ആക്‌സസ് ചെയ്യാൻ കഴിയും."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഈ ആപ്പിന് ആരോഗ്യ റെക്കോർഡുകൾ ആക്‌സസ് ചെയ്യാൻ കഴിയും."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്ത സമയത്ത് ഈ ആപ്പിന് ഫിറ്റ്നസ്, വെൽനസ് ഡാറ്റ ആക്സസ് ചെയ്യാൻ കഴിയും."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഈ ആപ്പിന് Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാം."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"മുമ്പത്തെ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനെ അനുവദിക്കണോ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, ഈ ആപ്പിന് <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-ന് മുമ്പ് ചേർത്ത ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ കഴിയും."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, ഈ ആപ്പിന് കഴിഞ്ഞ എല്ലാ ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റയും ആക്‌സസ് ചെയ്യാൻ കഴിയും."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, ഈ ആപ്പിന് <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-ന് മുമ്പ് ചേർത്ത Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാനാകും."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, ഈ ആപ്പിന് മുമ്പത്തെ എല്ലാ Health Connect ഡാറ്റയും ആക്‌സസ് ചെയ്യാനാകും."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് അധിക ആക്‌സസ് അനുവദിക്കണോ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നത് ഈ Health Connect ക്രമീകരണങ്ങൾ ആക്‌സസ് ചെയ്യാനും ആഗ്രഹിക്കുന്നു"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"പശ്ചാത്തലത്തിൽ എല്ലാ ഡാറ്റയും ആക്സസ് ചെയ്യുക"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"പശ്ചാത്തലത്തിൽ ആരോഗ്യ റെക്കോർഡുകൾ ആക്‌സസ് ചെയ്യുക"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"പശ്ചാത്തലത്തിൽ ഫിറ്റ്നസ്, വെൽനസ് ഡാറ്റ ആക്സസ് ചെയ്യുക"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റയും ആരോഗ്യ റെക്കോർഡുകളും ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഈ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഈ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"പശ്ചാത്തലത്തിൽ ഡാറ്റ ആക്‌സസ് ചെയ്യുക"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"മുമ്പത്തെ ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റ ആക്സസ് ചെയ്യുക"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-ന് മുമ്പ് ചേർത്ത ഡാറ്റ ആക്സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"മുമ്പത്തെ എല്ലാ ഡാറ്റയും ആക്സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"മുമ്പത്തെ ഡാറ്റ ആക്‌സസ് ചെയ്യുക"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-ന് മുമ്പ് ചേർത്ത Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"മുമ്പത്തെ എല്ലാ Health Connect ഡാറ്റയും ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"നിങ്ങളുടെ ആരോഗ്യ റെക്കോർഡുകൾക്കായി <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് ഇതിനകം തന്നെ മുമ്പത്തെ ഡാറ്റ ആക്‌സസ് ചെയ്യാനാകും"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"അനുമതികളെക്കുറിച്ച് കൂടുതൽ വായിക്കുക"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"പശ്ചാത്തലത്തിൽ എല്ലാ ഡാറ്റയും ആക്സസ് ചെയ്യുക"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"പശ്ചാത്തലത്തിൽ ആരോഗ്യ റെക്കോർഡുകൾ ആക്‌സസ് ചെയ്യുക"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"പശ്ചാത്തലത്തിൽ ഫിറ്റ്നസ്, വെൽനസ് ഡാറ്റ ആക്സസ് ചെയ്യുക"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റയും ആരോഗ്യ റെക്കോർഡുകളും ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഈ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഈ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"പശ്ചാത്തലത്തിൽ ഡാറ്റ ആക്‌സസ് ചെയ്യുക"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"മുമ്പത്തെ ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റ ആക്സസ് ചെയ്യുക"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-ന് മുമ്പ് ചേർത്ത ഡാറ്റ ആക്സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"മുമ്പത്തെ എല്ലാ ഡാറ്റയും ആക്സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"മുമ്പത്തെ ഡാറ്റ ആക്‌സസ് ചെയ്യുക"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-ന് മുമ്പ് ചേർത്ത Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"എല്ലാ മുമ്പത്തെ Health Connect ഡാറ്റയും ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് റീഡ് ചെയ്യാനുള്ള അനുമതിയൊന്നും ഓണായിരിക്കാത്തതിനാൽ നിലവിൽ ഫിറ്റ്‌നസ് ഡാറ്റയൊന്നും റീഡ് ചെയ്യുന്നില്ല"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"നിങ്ങളുടെ ആരോഗ്യ റെക്കോർഡുകൾക്കായി <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് ഇതിനകം തന്നെ മുമ്പത്തെ ഡാറ്റ ആക്‌സസ് ചെയ്യാനാകും. ഇത് മാറ്റാൻ, ഈ ആപ്പിനുള്ള ആരോഗ്യ റെക്കോർഡ് അനുമതികൾ ഓഫാക്കുക"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"ആരോഗ്യ റെക്കോർഡ് അനുമതികൾ മാനേജ് ചെയ്യുക"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ഈ ആപ്പിന്റെ പശ്ചാത്തല അല്ലെങ്കിൽ മുമ്പത്തെ ഡാറ്റാ ആക്‌സസ് ഓണാക്കാൻ വായിക്കാനുള്ള അനുമതിയിൽ കുറഞ്ഞത് ഒരെണ്ണമെങ്കിലും പ്രവർത്തനക്ഷമമാക്കുക"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ഈ ആപ്പിന്റെ പശ്ചാത്തല ആക്‌സസ് ഓണാക്കാൻ വായിക്കാനുള്ള അനുമതിയിൽ കുറഞ്ഞത് ഒരെണ്ണമെങ്കിലും പ്രവർത്തനക്ഷമമാക്കുക"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ഈ ആപ്പിന്റെ മുമ്പത്തെ ഡാറ്റാ ആക്‌സസ് ഓണാക്കാൻ വായിക്കാനുള്ള അനുമതിയിൽ കുറഞ്ഞത് ഒരെണ്ണമെങ്കിലും പ്രവർത്തനക്ഷമമാക്കുക"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"മുമ്പത്തെ എല്ലാ Health Connect ഡാറ്റയും ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
     <string name="background_read_description" msgid="3203594555849969283">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ ഈ ആപ്പിന് Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാം."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"മുമ്പത്തെ ഡാറ്റ ആക്‌സസ് ചെയ്യുക"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"മുമ്പത്തെ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനെ അനുവദിക്കണോ?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-ന് മുമ്പ് ചേർത്ത Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"മുമ്പത്തെ എല്ലാ Health Connect ഡാറ്റയും ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുക"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, ഈ ആപ്പിന് <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-ന് മുമ്പ് ചേർത്ത Health Connect ഡാറ്റ ആക്‌സസ് ചെയ്യാനാകും."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, ഈ ആപ്പിന് മുമ്പത്തെ എല്ലാ Health Connect ഡാറ്റയും ആക്‌സസ് ചെയ്യാനാകും."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"സജീവമായിരിക്കുമ്പോൾ കത്തിച്ചുകളഞ്ഞ കലോറി"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"സജീവമായിരിക്കുമ്പോൾ കത്തിച്ചുകളഞ്ഞ കലോറി"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"സജീവമായിരിക്കുമ്പോൾ കത്തിച്ചുകളഞ്ഞ കലോറി സംബന്ധിച്ച ഡാറ്റ റീഡ് ചെയ്യുക"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"വീൽചെയർ പുഷുകൾ"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"വീൽചെയർ പുഷുകൾ സംബന്ധിച്ച ഡാറ്റ റീഡ് ചെയ്യുക"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"വീൽചെയർ പുഷുകൾ സംബന്ധിച്ച ഡാറ്റ റൈറ്റ് ചെയ്യുക"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"ആക്റ്റിവിറ്റിയുടെ തീവ്രത"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ആക്റ്റിവിറ്റിയുടെ തീവ്രത"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"ആക്റ്റിവിറ്റി തീവ്രതയുടെ ഡാറ്റ വായിക്കുക"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"ആക്റ്റിവിറ്റിയുടെ തീവ്രതയുടെ ഡാറ്റ രേഖപ്പെടുത്തുക"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"അടിസ്ഥാന മെറ്റാബോളിക് നിരക്ക്"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"അടിസ്ഥാന മെറ്റാബോളിക് നിരക്ക്"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"അടിസ്ഥാന മെറ്റാബോളിക് നിരക്ക് സംബന്ധിച്ച ഡാറ്റ റീഡ് ചെയ്യുക"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ചർമ്മത്തിലെ താപനില"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"ചർമ്മത്തിലെ താപനില വായിക്കുക"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"ചർമ്മത്തിലെ താപനില എഴുതുക"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Health Connect-ലേക്ക് സമന്വയിപ്പിച്ചതും ചേർത്തതുമായ എല്ലാ ആരോഗ്യ റെക്കോർഡുകളും ഇതിൽ ഉൾപ്പെടുന്നു. ഇത് നിങ്ങളുടെ പൂർണ്ണമായ മെഡിക്കൽ റെക്കോർഡ് ആയിരിക്കില്ല കൂടാതെ നിങ്ങളുടെ ആരോഗ്യ റെക്കോർഡുകളുടെ മെഡിക്കൽ വിവരണം ഉൾപ്പെടുത്തിയിരിക്കില്ല."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"എല്ലാ ആരോഗ്യ റെക്കോർഡുകളും"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"എല്ലാ ആരോഗ്യ റെക്കോർഡുകളും"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"എല്ലാ ആരോഗ്യ റെക്കോർഡുകളും എഴുതുക"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"അലർജികൾ"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"അലർജികൾ"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"അലർജി സംബന്ധിച്ച ഡാറ്റ വായിക്കുക"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"പ്രതിരോധ കുത്തിവയ്പ്പ്"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"പ്രതിരോധ കുത്തിവയ്പ്പ്"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"പ്രതിരോധ കുത്തിവയ്പ്പ് സംബന്ധിച്ച ഡാറ്റ വായിക്കുക"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ലബോറട്ടറി ഫലങ്ങൾ"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ലബോറട്ടറി ഫലങ്ങൾ"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ലബോറട്ടറി ഫലങ്ങൾ റീഡ് ചെയ്യുക"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"അലർജികൾ"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"അലർജികൾ"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"അലർജി സംബന്ധിച്ച ഡാറ്റ വായിക്കുക"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"വ്യവസ്ഥകൾ"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"വ്യവസ്ഥകൾ"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"വ്യവസ്ഥകൾ വായിക്കുക"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"വാക്‌സിനുകൾ"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"വാക്‌സിനുകൾ"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"വാക്‌സിനുകൾ സംബന്ധിച്ച ഡാറ്റ റീഡ് ചെയ്യുക"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ലാബ് ഫലങ്ങൾ"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ലാബ് ഫലങ്ങൾ"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ലാബ് ഫലങ്ങൾ സംബന്ധിച്ച ഡാറ്റ റീഡ് ചെയ്യുക"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"മരുന്നുകൾ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"മരുന്നുകൾ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"മരുന്നുകളുടെ ഡാറ്റ റീഡ് ചെയ്യുക"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"വ്യക്തിപരമായ വിശദാംശങ്ങൾ"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"വ്യക്തിപരമായ വിശദാംശങ്ങൾ"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"വ്യക്തിപരമായ വിശദാംശങ്ങൾ വായിക്കുക"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"പ്രാക്ടീഷണറെ സംബന്ധിച്ച വിശദാംശങ്ങൾ"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"പ്രാക്ടീഷണറെ സംബന്ധിച്ച വിശദാംശങ്ങൾ"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"പ്രാക്ടീഷണറെ സംബന്ധിച്ച വിശദാംശങ്ങൾ വായിക്കുക"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ഗർഭകാലം"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ഗർഭകാലം"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ഗർഭകാല ഡാറ്റ റീഡ് ചെയ്യുക"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"പ്രശ്‌നങ്ങൾ"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"പ്രശ്‌നങ്ങൾ"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"പ്രശ്നങ്ങൾ റീഡ് ചെയ്യുക"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"നടപടിക്രമങ്ങൾ"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"നടപടിക്രമങ്ങൾ"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"നടപടിക്രമങ്ങൾ റീഡ് ചെയ്യുക"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"സാമൂഹിക ചരിത്രം"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ജീവിതരീതി സംബന്ധിച്ച ഡാറ്റ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"സാമൂഹിക ചരിത്രം"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"സാമൂഹിക ചരിത്രം റീഡ് ചെയ്യുക"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"പ്രധാന ആരോഗ്യ വിവരങ്ങൾ"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"സന്ദർശനങ്ങൾ"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"സന്ദർശനങ്ങൾ"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"സന്ദർശനങ്ങൾ വായിക്കുക"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"പ്രധാന ആരോഗ്യ വിവരങ്ങൾ"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"പ്രധാന ആരോഗ്യ വിവരങ്ങൾ"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"പ്രധാന ആരോഗ്യ വിവരങ്ങൾ റീഡ് ചെയ്യുക"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"ഏകാഗ്രത"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"ഏകാഗ്രത വർദ്ധിപ്പിക്കാനുള്ള സെഷന്റെ ഡാറ്റ എഴുതുക"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"റീഡ് ചെയ്യാൻ “<xliff:g id="APP_NAME">%1$s</xliff:g>” ആപ്പിനെ അനുവദിക്കുക"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"റൈറ്റ് ചെയ്യാൻ “<xliff:g id="APP_NAME">%1$s</xliff:g>” ആപ്പിനെ അനുവദിക്കുക"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"റദ്ദാക്കുക"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"അനുവദിക്കുക"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"എല്ലാം അനുവദിക്കുക"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"അനുവദിക്കരുത്"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Health Connect-ൽ നിന്ന് ഈ ആപ്പ് റീഡ് ചെയ്യണമെന്നോ റൈറ്റ് ചെയ്യണമെന്നോ നിങ്ങൾ ആഗ്രഹിക്കുന്ന ഡാറ്റ തിരഞ്ഞെടുക്കുക"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Health Connect-ൽ നിന്ന് ഈ ആപ്പ് റീഡ് ചെയ്യണമെന്നോ റൈറ്റ് ചെയ്യണമെന്നോ നിങ്ങൾ ആഗ്രഹിക്കുന്ന ഡാറ്റ തിരഞ്ഞെടുക്കുക"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connect-ൽ നിന്ന് ഈ ആപ്പ് റീഡ് ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്ന ഡാറ്റ തിരഞ്ഞെടുക്കുക"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Health Connect-ലേക്ക് ഈ ആപ്പ് എഴുതാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്ന ഡാറ്റ തിരഞ്ഞെടുക്കുക"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"നിങ്ങൾ റീഡ് ചെയ്യാനുള്ള ആക്‌സസ് നൽകിയാൽ, പുതിയ ഡാറ്റയും കഴിഞ്ഞ 30 ദിവസത്തെ ഡാറ്റയും ആപ്പിന് റീഡ് ചെയ്യാനാകും"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"നിങ്ങൾ റീഡ് ആക്‌സസ് നൽകിയാൽ, പുതിയ ഡാറ്റയും മുമ്പത്തെ ഡാറ്റയും ആപ്പിന് റീഡ് ചെയ്യാനാകും"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Health Connect ആക്‌സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിനെ അനുവദിക്കണോ?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"നിങ്ങളുടെ ഡാറ്റ <xliff:g id="APP_NAME">%1$s</xliff:g> കൈകാര്യം ചെയ്യുന്നത് എങ്ങനെയെന്ന് ഡെവലപ്പറുടെ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> -യിൽ നിന്ന് മനസ്സിലാക്കാം"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റ ആക്സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനെ അനുവദിക്കണോ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"നിങ്ങളുടെ ഡാറ്റ <xliff:g id="APP_NAME">%1$s</xliff:g> കൈകാര്യം ചെയ്യുന്നത് എങ്ങനെയെന്ന് അവരുടെ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> എന്നതിൽ നിന്ന് മനസ്സിലാക്കാം"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"സ്വകാര്യതാ നയം"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"നിങ്ങളുടെ ആരോഗ്യ റെക്കോർഡുകൾ ആക്സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനെ അനുവദിക്കണോ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"നിങ്ങൾ ആക്സസ് നൽകുകയാണെങ്കിൽ, അലർജികൾ, ലാബ് ഫലങ്ങൾ, വാക്‌സിനുകൾ എന്നിവയും മറ്റും പോലുള്ള ഡാറ്റ റീഡ് ചെയ്യാനും റൈറ്റ് ചെയ്യാനും ആപ്പിന് കഴിയും\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"നിങ്ങൾ ആക്‌സസ് നൽകുകയാണെങ്കിൽ, അലർജികൾ, ലാബ് ഫലങ്ങൾ, വാക്‌സിനുകൾ എന്നിവയും മറ്റും പോലുള്ള ഡാറ്റ ആപ്പിന് വായിക്കാനാകും\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ആരോഗ്യ റെക്കോർഡുകളെ കുറിച്ച്"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"പങ്കിടാനുള്ള ഡാറ്റയിൽ ഇനിപ്പറയുന്നവ ഉൾപ്പെടുന്നു"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"നിങ്ങൾ അനുവദിക്കുകയാണെങ്കിൽ, <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് നിങ്ങളുടെ ആരോഗ്യ റെക്കോർഡുകൾ Health Connect-മായി പങ്കിടാനാകും."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"നിങ്ങളുടെ എല്ലാ ആരോഗ്യ റെക്കോർഡുകളും ഒരിടത്ത് തന്നെ സൂക്ഷിക്കാനായി നിങ്ങളുടെ വിവിധ ആപ്പുകളിൽ നിന്നും ഉറവിടങ്ങളിൽ നിന്നുമുള്ളവ സമന്വയിപ്പിക്കുക"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"എല്ലാ അനുമതികളും നീക്കം ചെയ്യണോ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"എല്ലാം നീക്കം ചെയ്യൂ"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി Health Connect-ൽ നിന്നുള്ള ഒരു ഡാറ്റയും വായിക്കാനോ എഴുതാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി മുമ്പത്തെ ഡാറ്റ ഉൾപ്പെടെ, Health Connect-ൽ നിന്നുള്ള ഒരു ഡാറ്റയും വായിക്കാനോ എഴുതാനോ കഴിയില്ല.\n\nലൊക്കേഷനോ ക്യാമറയോ മൈക്രോഫോണോ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി പശ്ചാത്തല, മുമ്പത്തെ ഡാറ്റ ഉൾപ്പെടെ, Health Connect-ൽ നിന്നുള്ള ഒരു ഡാറ്റയും വായിക്കാനോ എഴുതാനോ കഴിയില്ല.\n\nലൊക്കേഷനോ ക്യാമറയോ മൈക്രോഫോണോ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect-ൽ നിന്നുള്ള <xliff:g id="APP_NAME">%1$s</xliff:g> ഡാറ്റയും ഇല്ലാതാക്കുക"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"എല്ലാ അനുമതികളും നീക്കം ചെയ്യണോ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"എല്ലാ ആരോഗ്യ റെക്കോർഡ് അനുമതികളും നീക്കം ചെയ്യണോ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"എല്ലാ ഫിറ്റ്‌നസ്, ആരോഗ്യക്ഷമതാ അനുമതികളും നീക്കം ചെയ്യണോ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connect-ൽ നിന്നുള്ള <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിൽ നിന്ന് ഫിറ്റ്‌നസ് ഡാറ്റയും ഇല്ലാതാക്കുക"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"എല്ലാ ആരോഗ്യ റെക്കോർഡ് അനുമതികളും നീക്കം ചെയ്യണോ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connect-ൽ നിന്നുള്ള <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിൽ നിന്നുള്ള ആരോഗ്യ റെക്കോർഡുകളും ഇല്ലാതാക്കുക"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി Health Connect-ൽ നിന്നുള്ള ഈ ഡാറ്റ റീഡ് ചെയ്യാനോ റൈറ്റ് ചെയ്യാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി പശ്ചാത്തല ഡാറ്റ ഉൾപ്പെടെ, Health Connect-ൽ നിന്നുള്ള ഈ ഡാറ്റ റീഡ് ചെയ്യാനോ റൈറ്റ് ചെയ്യാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി മുമ്പത്തെ ഡാറ്റ ഉൾപ്പെടെ, Health Connect-ൽ നിന്നുള്ള ഈ ഡാറ്റ റീഡ് ചെയ്യാനോ റൈറ്റ് ചെയ്യാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി മുമ്പത്തെ ഡാറ്റയും പശ്ചാത്തല ഡാറ്റയും ഉൾപ്പെടെ, Health Connect-ൽ നിന്നുള്ള ഈ ഡാറ്റ റീഡ് ചെയ്യാനോ റൈറ്റ് ചെയ്യാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"എല്ലാ അനുമതികളും നീക്കം ചെയ്യണോ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി Health Connect-ൽ നിന്നുള്ള ഡാറ്റ റീഡ് ചെയ്യാനോ റൈറ്റ് ചെയ്യാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി പശ്ചാത്തല ഡാറ്റ ഉൾപ്പെടെ, Health Connect-ൽ നിന്നുള്ള ഡാറ്റ റീഡ് ചെയ്യാനോ റൈറ്റ് ചെയ്യാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി മുമ്പത്തെ ഡാറ്റ ഉൾപ്പെടെ, Health Connect-ൽ നിന്നുള്ള ഡാറ്റ റീഡ് ചെയ്യാനോ റൈറ്റ് ചെയ്യാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ഇനി മുമ്പത്തെ ഡാറ്റയും പശ്ചാത്തല ഡാറ്റയും ഉൾപ്പെടെ, Health Connect-ൽ നിന്നുള്ള ഡാറ്റ റീഡ് ചെയ്യാനോ റൈറ്റ് ചെയ്യാനോ കഴിയില്ല.\n\nക്യാമറ, മൈക്രോഫോൺ, ലൊക്കേഷൻ എന്നിവ പോലെ ഈ ആപ്പിന് ഉണ്ടായിരിക്കാനിടയുള്ള മറ്റ് അനുമതികളെ ഇത് ബാധിക്കില്ല."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Health Connect-ൽ നിന്നുള്ള <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിൽ നിന്നുള്ള ഫിറ്റ്‌നസ് ഡാറ്റയും ആരോഗ്യ റെക്കോർഡുകളും ഇല്ലാതാക്കുക"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ഈ ആപ്പിനുള്ള അനുമതികൾ നീക്കം ചെയ്തു"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"എല്ലാ Health Connect ഡാറ്റയും ഇല്ലാതാക്കുക"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"അടുത്ത ദിവസം"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"തിരഞ്ഞെടുത്ത ദിവസം"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"മുമ്പത്തെ ദിവസം"</string>
     <string name="default_error" msgid="7966868260616403475">"എന്തോ കുഴപ്പമുണ്ടായി. വീണ്ടും ശ്രമിക്കുക."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"അജ്ഞാത വിഭവസാമഗ്രി"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ഉറവിട ഡാറ്റ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>ഓപ്പൺ ബ്രാക്കറ്റ്."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>ക്ലോസ്ഡ് ബ്രാക്കറ്റ്."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ഫീൽഡ് <xliff:g id="FIELD">%2$s</xliff:g> മൂല്യം"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ഈ ആപ്പുകൾക്ക് ഇനി ആക്‌സസ് ഇല്ല, എന്നാലും Health Connect-ൽ ഇപ്പോഴും ഡാറ്റ സംഭരിച്ചിട്ടുണ്ട്"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>-ന് ശേഷം ചേർത്ത ഡാറ്റ റീഡ് ചെയ്യാനാകും"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ഈ ആപ്പിന് ആക്‌സസ് ചെയ്യാനാകുന്ന മറ്റ് Android അനുമതികൾ മാനേജ് ചെയ്യാൻ, ക്രമീകരണം &gt; ആപ്പുകൾ എന്നതിലേക്ക് പോകുക"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതുമായി നിങ്ങൾ പങ്കിടുന്ന ഡാറ്റയ്‌ക്ക് അവരുടെ സ്വകാര്യതാ നയത്തിന്റെ പരിരക്ഷണമുണ്ട്"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പ് നിങ്ങളുടെ ഡാറ്റ കൈകാര്യം ചെയ്യുന്നത് എങ്ങനെയാണെന്ന് ഡെവലപ്പറുടെ സ്വകാര്യതാ നയത്തിൽ മനസ്സിലാക്കാം"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ഈ ആപ്പിന് ആക്‌സസ് ചെയ്യാനാകുന്ന മറ്റ് Android അനുമതികൾ മാനേജ് ചെയ്യാൻ, ക്രമീകരണത്തിലേക്ക് പോയ ശേഷം ആപ്പുകൾ ടാപ്പ് ചെയ്യുക"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"സ്വകാര്യതാ നയം വായിക്കുക"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"കഴിഞ്ഞ 24 മണിക്കൂറിനിടെ ആക്‌സസ് ചെയ്‌തു"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ആപ്പ് ആക്‌സസ്"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"നിലവിൽ നിങ്ങൾ അനുയോജ്യമായ ആപ്പുകളൊന്നും ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"അധിക ആക്‌സസ്"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"മുമ്പത്തെ ഡാറ്റ, പശ്ചാത്തല ഡാറ്റ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"ഈ ആപ്പിനുള്ള അധിക അനുമതികൾ നീക്കം ചെയ്തു"</string>
     <string name="permissions_header" msgid="6519976063360071569">"അനുമതികൾ"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ഫിറ്റ്നസും ശാരീരികക്ഷമതയും"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"വ്യായാമവും ഉറക്കവും പോഷകാഹാരവും മറ്റും"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"ആരോഗ്യ റെക്കോർഡുകൾ"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ആരോഗ്യ റെക്കോർഡുകൾ"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ലാബ് ഫലവും മരുന്നും പ്രതിരോധവും മറ്റും"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ലാബ് ഫലം, മരുന്ന്, വാക്‌സിൻ തുടങ്ങിയവ"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"നീക്കം ചെയ്ത ആപ്പ് അനുമതികൾ"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"<xliff:g id="APP_DATA">%s</xliff:g> ആപ്പിനുള്ള അനുമതികൾ Health Connect നീക്കം ചെയ്തു"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"<xliff:g id="APP_DATA_0">%1$s</xliff:g>, <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> എന്നീ ആപ്പുകൾക്കുള്ള അനുമതികൾ Health Connect നീക്കം ചെയ്തു"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store-ലേക്ക് പോകുക"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect ഉപയോഗിച്ച് തുടങ്ങൂ"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"നിങ്ങളുടെ ആരോഗ്യവും ഫിറ്റ്നസും സംബന്ധിച്ച ഡാറ്റ Health Connect സംഭരിക്കുന്നു, ഇതിലൂടെ നിങ്ങളുടെ ഉപകരണത്തിലെ വ്യത്യസ്ത ആപ്പുകൾ എളുപ്പത്തിൽ സമന്വയിപ്പിക്കാനാകും"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"വ്യത്യസ്ത ആപ്പുകളിൽ നിന്നുള്ള നിങ്ങളുടെ ആരോഗ്യവും ഫിറ്റ്‍നസും സംബന്ധിച്ച ഡാറ്റ, Health Connect സംഭരിക്കുകയും സമന്വയിപ്പിക്കുകയും ചെയ്യുന്നു.\n\nവ്യായാമ സെഷനുകൾ, ചുവടുകൾ, പോഷകാഹാരം, ഉറക്കം എന്നിവയും മറ്റും ഉൾപ്പെടെയുള്ള "<b>"ഫിറ്റ്നസ്, വെൽനസ് ഡാറ്റ"</b>\n\n"വാക്‌സിനുകളും ലാബ് ഫലങ്ങളും മറ്റും ഉൾപ്പെടെയുള്ള "<b>"ആരോഗ്യ റെക്കോർഡുകൾ"</b></string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ഉപയോഗിച്ച് ഇനിപ്പറയുന്നവ ചെയ്യാം"</string>
     <string name="share_data" msgid="3481932156368883946">"നിങ്ങളുടെ ആപ്പുകളുമായി ഡാറ്റ പങ്കിടുക"</string>
     <string name="share_data_description" msgid="2919871301634375092">"ഓരോ ആപ്പിനും റീഡ് ചെയ്യാനോ Health Connect-ലേക്ക് റൈറ്റ് ചെയ്യാനോ കഴിയുന്ന ഡാറ്റ തിരഞ്ഞെടുക്കുക"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"നിങ്ങളുടെ ക്രമീകരണവും സ്വകാര്യതയും മാനേജ് ചെയ്യുക"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"നേരിയ രക്തസ്രാവം"</string>
     <string name="flow_medium" msgid="3783688724668943154">"മിതമായ രക്തസ്രാവം"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"അമിത രക്തസ്രാവം"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"അജ്ഞാത ഫ്ലോ"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> ആർത്തവ ദിനങ്ങളിൽ <xliff:g id="DAY">%1$d</xliff:g>-ാമത്തേത്"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{കാലയളവ് (ഒരു ദിവസം)}other{കാലയളവ് (# ദിവസം)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"പോസിറ്റീവ്"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"നെഗറ്റീവ്"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ഉയർന്ന സാധ്യത"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"സംഗീതം"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"മറ്റുള്ളവ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ഗൈഡ് ചെയ്യാത്തവ"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"മിതമായത്"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ശക്തമായത്"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>മി"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>മ <xliff:g id="MIN">%2$s</xliff:g>മി"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>മ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"സംയോജനം പുരോഗമിക്കുന്നു"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Android സിസ്റ്റവുമായി Health Connect സംയോജിപ്പിക്കുന്നു.\n\nനിങ്ങളുടെ ഡാറ്റയും അനുമതികളും കൈമാറാൻ കുറച്ച് സമയമെടുത്തേക്കാം."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"പ്രക്രിയ പൂർത്തിയായി എന്ന അറിയിപ്പ് ലഭിക്കാതെ ആപ്പ് അടയ്ക്കരുത്."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect സംയോജനം പുരോഗമിക്കുന്നു"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"അപ്‌ഡേറ്റ് ആവശ്യമാണ്"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect നിങ്ങളുടെ ക്രമീകരണത്തിൽ നിന്ന് നേരിട്ട് ആക്സസ് ചെയ്യുന്നതിനായി അത് Android സിസ്റ്റവുമായി സംയോജിപ്പിക്കുകയാണ്."</string>
     <string name="update_button" msgid="4544529019832009496">"അപ്ഡേറ്റ് ചെയ്യുക"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Health Connect നിങ്ങളുടെ സിസ്റ്റം ക്രമീകരണവുമായി സംയോജിപ്പിക്കുന്നത് തുടരാൻ ഈ അപ്ഡേറ്റ് ആരംഭിക്കുക"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ഇപ്പോൾ അപ്‌ഡേറ്റ് ചെയ്യുക"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"സിസ്‌റ്റം അപ്‌ഡേറ്റ് ആവശ്യമാണ്"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"തുടരുന്നതിന് മുമ്പ്, ഫോൺ സിസ്റ്റം അപ്ഡേറ്റ് ചെയ്യുക."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"നിങ്ങൾ ഇതിനകം ഫോൺ സിസ്റ്റം അപ്ഡേറ്റ് ചെയ്തിട്ടുണ്ടെങ്കിൽ, സംയോജനം തുടരാൻ ഫോൺ റീസ്റ്റാർട്ട് ചെയ്തു നോക്കുക"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect അപ്ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"തുടരുന്നതിന് മുമ്പ്, Health Connect ആപ്പ് ഏറ്റവും പുതിയ പതിപ്പിലേക്ക് അപ്ഡേറ്റ് ചെയ്യുക."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"കൂടുതൽ സ്‌പെയ്‌സ് ആവശ്യമാണ്"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"സംയോജനം തുടരാൻ Health Connect-ന് നിങ്ങളുടെ ഫോണിൽ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> സ്‌റ്റോറേജ് സ്‌പെയ്‌സ് ആവശ്യമാണ്.\n\nഫോണിൽ കുറച്ച് ഇടം സൃഷ്ടിച്ച് വീണ്ടും ശ്രമിക്കുക."</string>
     <string name="try_again_button" msgid="8745496819992160789">"വീണ്ടും ശ്രമിക്കുക"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ഇടം സൃഷ്ടിക്കുക"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"കൂടുതൽ സ്‌പെയ്‌സ് ആവശ്യമാണ്"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"സംയോജനം തുടരാൻ Health Connect-ന് നിങ്ങളുടെ ഫോണിൽ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> സ്‌റ്റോറേജ് സ്‌പെയ്‌സ് ആവശ്യമാണ്."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"സംയോജനം താൽക്കാലികമായി നിർത്തി"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ആപ്പ് Android സിസ്റ്റവുമായി സംയോജിപ്പിക്കുമ്പോൾ അതിന്റെ പ്രവർത്തനം അവസാനിച്ചു.\n\nആപ്പ് വീണ്ടും തുറന്ന് നിങ്ങളുടെ ഡാറ്റയും അനുമതികളും കൈമാറുന്നത് തുടരാൻ, \'പുനരാരംഭിക്കുക\' ക്ലിക്ക് ചെയ്യുക."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"നിങ്ങളുടെ Health Connect ഡാറ്റ നിലനിർത്താൻ, <xliff:g id="TIME_NEEDED">%1$s</xliff:g> സമയപരിധിക്കുള്ളിൽ ഇത് പൂർത്തിയാക്കുക"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Android സിസ്റ്റവുമായി Health Connect സംയോജിപ്പിക്കുന്നത് തുടരാൻ ടാപ്പ് ചെയ്യുക. നിങ്ങളുടെ ഡാറ്റ നിലനിർത്താൻ, <xliff:g id="TIME_NEEDED">%1$s</xliff:g> സമയപരിധിക്കുള്ളിൽ ഇത് പൂർത്തിയാക്കുക"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Android സിസ്റ്റവുമായി Health Connect സംയോജിപ്പിക്കുന്നത് തുടരാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"തുടരുക"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect സംയോജനം പുനരാരംഭിക്കുക"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"നിങ്ങളുടെ ഡാറ്റ നിലനിർത്താൻ, <xliff:g id="TIME_NEEDED">%1$s</xliff:g> സമയപരിധിക്കുള്ളിൽ ഇത് പൂർത്തിയാക്കുക"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ആപ്പ് അപ്‌ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect-മായി സമന്വയിപ്പിക്കുന്നത് തുടരാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> അപ്‌ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect-മായി സമന്വയിപ്പിക്കുന്നത് തുടരാൻ, ചില ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect-മായി സമന്വയിപ്പിക്കുന്നത് തുടരാൻ, <xliff:g id="APP_NAME">%1$s</xliff:g> അപ്‌ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്. എല്ലാ ആപ്പുകൾക്കും അപ്‌ഡേറ്റുകൾ ലഭ്യമാകണമെന്നില്ല."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect-മായി സമന്വയിപ്പിക്കുന്നത് തുടരാൻ, ചില ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്. എല്ലാ ആപ്പുകൾക്കും അപ്‌ഡേറ്റുകൾ ലഭ്യമാകണമെന്നില്ല."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുക"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"കൂടുതലറിയുക"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect സംയോജനം"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect സംയോജനം പൂർത്തിയായില്ല"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"ഇത് വീണ്ടും ലഭ്യമാകുമ്പോൾ നിങ്ങൾക്ക് അറിയിപ്പ് ലഭിക്കും."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"മനസ്സിലായി"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect സംയോജനം പൂർത്തിയായില്ല"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"കൂടുതൽ വായിക്കുക"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect സംയോജനം പൂർത്തിയായി"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"തുറക്കുക"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"പുതിയത് എന്തൊക്കെയാണ്"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"നിങ്ങൾക്ക് ഇപ്പോൾ ക്രമീകരണത്തിൽ നിന്ന് നേരിട്ട് Health Connect ആക്‌സസ് ചെയ്യാം. എപ്പോൾ വേണമെങ്കിലും Health Connect ആപ്പ് അൺഇൻസ്റ്റാൾ ചെയ്ത് സ്റ്റോറേജ് സ്പെയ്‌സ് സൃഷ്ടിക്കാം."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"മനസ്സിലായി"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ആപ്പ് ഉറവിടങ്ങൾ എഡിറ്റ് ചെയ്യുക"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ഉപകരണത്തിൽ ഡിഫോൾട്ടായുള്ളത്"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ആപ്പ് ഡാറ്റ"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect-ലേക്ക് ആക്‌സസ് ഉള്ള ആപ്പുകളിൽ നിന്നുള്ള ഡാറ്റ ഇവിടെ കാണിക്കും"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിൽ നിന്നുള്ള ഡാറ്റ ഇവിടെ കാണിക്കും"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect-ലേക്ക് ആക്‌സസുള്ള ആപ്പുകളിൽ നിന്നുള്ള ഡാറ്റ ഇവിടെ കാണിക്കും"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"ദിവസം"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"ആഴ്‌ച"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"മാസം"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"കഴിഞ്ഞ മാസം"</string>
     <string name="tab_entries" msgid="3402700951602029493">"എൻട്രികൾ"</string>
     <string name="tab_access" msgid="7818197975407243701">"ആക്‌സസ്"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് അധിക ആക്‌സസ് അനുവദിക്കണോ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നത് ഈ Health Connect ക്രമീകരണം ആക്‌സസ് ചെയ്യാനും ആഗ്രഹിക്കുന്നു"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ഈ ആപ്പിന്റെ പശ്ചാത്തല അല്ലെങ്കിൽ മുമ്പത്തെ ഡാറ്റാ ആക്‌സസ് ഓണാക്കാൻ വായിക്കാനുള്ള അനുമതിയിൽ കുറഞ്ഞത് ഒരെണ്ണമെങ്കിലും പ്രവർത്തനക്ഷമമാക്കുക"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ഈ ആപ്പിന്റെ പശ്ചാത്തല ആക്‌സസ് ഓണാക്കാൻ വായിക്കാനുള്ള അനുമതിയിൽ കുറഞ്ഞത് ഒരെണ്ണമെങ്കിലും പ്രവർത്തനക്ഷമമാക്കുക"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ഈ ആപ്പിന്റെ മുമ്പത്തെ ഡാറ്റാ ആക്‌സസ് ഓണാക്കാൻ വായിക്കാനുള്ള അനുമതിയിൽ കുറഞ്ഞത് ഒരെണ്ണമെങ്കിലും പ്രവർത്തനക്ഷമമാക്കുക"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect ഉപയോഗിക്കാൻ ആരംഭിക്കുക"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ആരോഗ്യ, ഫിറ്റ്‍നസ് ഡാറ്റ നിങ്ങളുടെ ആദ്യത്തെ ആപ്പുകൾക്ക് ഇടയിൽ പങ്കിടുന്നതിന് അവ സമന്വയിപ്പിക്കുക"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"സജ്ജീകരിക്കുക"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"അനുയോജ്യമായ ആപ്പുകൾ കാണുക"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect വഴി <xliff:g id="APP_NAME">%s</xliff:g> എന്നതിലേക്ക് സമന്വയിപ്പിക്കാൻ കൂടുതൽ ആപ്പുകൾ കണ്ടെത്തുക"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ആപ്പ് സ്‌റ്റോറിൽ കാണുക"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ഒരു സ്ക്രീൻ ലോക്ക് സജ്ജീകരിക്കുക"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"നിങ്ങളുടെ ആരോഗ്യ ഡാറ്റയുടെ അധിക സുരക്ഷയ്ക്കായി, ഈ ഉപകരണത്തിന് ഒരു പിൻ, പാറ്റേൺ അല്ലെങ്കിൽ പാസ്‌വേഡ് സജ്ജീകരിക്കുക"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"സ്‌ക്രീൻ ലോക്ക് സജ്ജീകരിക്കുക"</string>
     <string name="select_all" msgid="837499881590001166">"എല്ലാം തിരഞ്ഞെടുക്കുക"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"കണക്‌റ്റ് ചെയ്‌തിട്ടുള്ള ആപ്പുകൾക്ക് ഇനി Health Connect-ൽ നിന്ന് ഈ ഡാറ്റ വായിക്കാനാകില്ല"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ചെക്ക് മാർക്കിട്ടു"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ചെക്ക് മാർക്കിട്ടിട്ടില്ലാത്തത്"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"വ്യായാമ മാപ്പ് റൂട്ട് ലഭ്യമാണ്"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"അടുത്ത ദിവസം"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"അടുത്ത ആഴ്‌ച"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"അടുത്ത മാസം"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"മുമ്പത്തെ ദിവസം"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"മുമ്പത്തെ ആഴ്‌ച"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"മുമ്പത്തെ മാസം"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"എല്ലാ ഡാറ്റയും ശാശ്വതമായി ഇല്ലാതാക്കണോ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"തിരഞ്ഞെടുത്ത ഡാറ്റ ശാശ്വതമായി ഇല്ലാതാക്കണോ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"എല്ലാ <xliff:g id="APP_NAME">%s</xliff:g> ഡാറ്റയും ശാശ്വതമായി ഇല്ലാതാക്കണോ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> എന്ന ആഴ്ചയിലേക്കുള്ള തിരഞ്ഞെടുത്ത <xliff:g id="APP_NAME">%1$s</xliff:g> എൻട്രികൾ ശാശ്വതമായി ഇല്ലാതാക്കണോ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> എന്ന മാസത്തേക്കുള്ള തിരഞ്ഞെടുത്ത <xliff:g id="APP_NAME">%1$s</xliff:g> എൻട്രികൾ ശാശ്വതമായി ഇല്ലാതാക്കണോ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ഈ <xliff:g id="APP_NAME">%s</xliff:g> എൻട്രി ശാശ്വതമായി ഇല്ലാതാക്കണോ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> എന്നതിനുള്ള <xliff:g id="DATA_TYPE">%1$s</xliff:g> ഡാറ്റ ശാശ്വതമായി നീക്കം ചെയ്യണോ?"</string>
+    <string name="on" msgid="8266542510798355807">"ഓണാണ്"</string>
+    <string name="off" msgid="6996623844428550649">"ഓഫാണ്"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g>-ന് ആക്‌സസ് ചെയ്തു"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"ഇന്നലെ <xliff:g id="TIME_DATE">%1$s</xliff:g>-ന് ആക്‌സസ് ചെയ്തു"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>-ന് ആക്‌സസ് ചെയ്തു"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"എല്ലാ സമയത്തും അനുവദിക്കുക"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"തിരഞ്ഞെടുത്തവ അനുവദിക്കുക"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ആപ്പ് ഉപയോഗിക്കുമ്പോൾ"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"എല്ലാം നിരസിക്കുക"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"ഫിറ്റ്‌നസ്, വെൽനസ് ഡാറ്റ ആക്സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിനെ അനുവദിക്കണോ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പ് <xliff:g id="DATA_TYPES">%2$s</xliff:g> എന്നതിലേക്ക് ആക്‌സസ് അഭ്യർത്ഥിക്കുന്നു.\n\nഎല്ലാം അനുവദിക്കാൻ തിരഞ്ഞെടുക്കുകയോ അവ ഓരോന്നും പ്രത്യേകം നിയന്ത്രിക്കുകയോ ചെയ്യുക."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="DATA_TYPE">%2$s</xliff:g> ആക്‌സസ് ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനെ അനുവദിക്കണോ?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ഫിറ്റ്നസും ശാരീരികക്ഷമതയും"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"എല്ലായ്‌പ്പോഴും"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ഉപയോഗത്തിലുള്ളപ്പോൾ"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"എല്ലായ്‌പ്പോഴും"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ഉപയോഗത്തിലുള്ളപ്പോൾ"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് നിങ്ങളുടെ എല്ലാ ഫിറ്റ്നസ്, ശാരീരികക്ഷമതാ ഡാറ്റയും <xliff:g id="ALLOW_MODE">%2$s</xliff:g> ആക്സസ് ചെയ്യാൻ കഴിയും"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"ആക്സസ് ചെയ്യാൻ അനുവദിച്ചു"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"റീഡ് ചെയ്യാനുള്ള അനുവാദം"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ഈ അനുമതികൾ നിങ്ങളുടെ ഉപകരണ സെൻസറുകളിൽ നിന്നുള്ള ഡാറ്റയിലേക്ക് <xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന് ആക്സസ് നൽകുന്നു."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ആപ്പുകൾ അനുവദനീയം"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"ആപ്പുകളൊന്നും അഭ്യർത്ഥിക്കുന്നില്ല"</string>
+    <string name="allowed" msgid="4158456017482263737">"അനുവാദം ലഭിച്ചു"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"അനുവാദം ലഭിച്ചില്ല"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ഈ അനുമതിയുള്ള ആപ്പുകൾക്ക് നിങ്ങളുടെ ഉപകരണ സെൻസറുകളിൽ നിന്ന് <xliff:g id="DATA_TYPE">%s</xliff:g> ഡാറ്റ ആക്‌സസ് ചെയ്യാനാവും."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"നിങ്ങളുടെ വാച്ചിലെ എല്ലാ ആപ്പുകൾക്കുമുള്ള <xliff:g id="DATA_TYPE">%s</xliff:g> ആക്‌സസ് നീക്കം ചെയ്യണോ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"ചെക്ക് മാർക്ക്"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"ക്രോസ് മാർക്ക്"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"നിലവിൽ, <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് ഫിറ്റ്നസ്, വെൽനെസ് ഡാറ്റ <xliff:g id="ALLOW_MODE">%2$s</xliff:g> ആക്സസ് ചെയ്യാനാകും"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"എല്ലായ്‌പ്പോഴും ഫിറ്റ്‌നസ്, വെൽനെസ് ഡാറ്റയിലേക്ക് <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് ആക്‌സസ് അനുവദിക്കണോ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് <xliff:g id="DATA_TYPES">%2$s</xliff:g> എന്നതിലേക്ക് ആക്‌സസ് ഉണ്ട്."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ഫിറ്റ്നസ്, വെൽനെസ് അനുമതികൾ മാനേജ് ചെയ്യുക"</string>
 </resources>
diff --git a/apk/res/values-mn/strings.xml b/apk/res/values-mn/strings.xml
index df4a003..7e393dd 100644
--- a/apk/res/values-mn/strings.xml
+++ b/apk/res/values-mn/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Төхөөрөмж дээрээ эрүүл мэнд, фитнесийн өгөгдлийг удирдаж, үүнд ямар апп хандаж болохыг хянана уу"</string>
     <string name="data_title" msgid="4456619761533380816">"Өгөгдөл, хандалт"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Эрүүл мэндийн түүхийг үзэх"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Өөрийн эрүүл мэндийн өгөгдөл болон уг өгөгдөлд ямар апп хандаж болохыг харна уу"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Бүх ангилал"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Бүх ангиллыг харах"</string>
     <string name="no_data" msgid="1906986019249068659">"Өгөгдөл байхгүй байна"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Өчигдөр"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Уншсан: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Бичсэн: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Зөвшөөрлийг удирдах"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Цаг: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Дасгал, хөдөлгөөн"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"таны эрүүл мэндийн өгөгдөлд хандах"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Шатаасан калорийг унших"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Аппад шатаасан калори уншихыг зөвшөөрөх"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Ард өгөгдөлд хандах"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д дэвсгэрт өгөгдөлд хандахыг зөвшөөрөх үү?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д өгөгдөлд ард хандахыг зөвшөөрөх үү?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Хэрэв та зөвшөөрвөл таныг ашиглаагүй байхад тус апп фитнес, эрүүл оршихуйн өгөгдөл, эрүүл мэндийн түүхэд хандах боломжтой."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Хэрэв та зөвшөөрвөл таныг ашиглаагүй байхад тус апп эрүүл мэндийн түүхэд хандах боломжтой."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Хэрэв та зөвшөөрвөл таныг ашиглаагүй байхад тус апп фитнес, эрүүл оршихуйн өгөгдөлд хандах боломжтой."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Хэрэв та зөвшөөрвөл таныг ашиглаагүй байхад тус апп Health Connect-н өгөгдөлд хандах боломжтой."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д өнгөрсөн цагийн өгөгдөлд хандахыг зөвшөөрөх үү?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Хэрэв та зөвшөөрвөл энэ апп <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-с өмнө нэмсэн фитнес, эрүүл оршихуйн өгөгдөлд хандах боломжтой."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Хэрэв та зөвшөөрвөл энэ апп фитнес, эрүүл оршихуйн өнгөрсөн цагийн бүх өгөгдөлд хандах боломжтой."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Хэрэв та зөвшөөрвөл энэ апп <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-с өмнө нэмсэн Health Connect-н өгөгдөлд хандах боломжтой."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Хэрэв та зөвшөөрвөл энэ апп Health Connect-н өнгөрсөн цагийн бүх өгөгдөлд хандах боломжтой."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д нэмэлт хандах эрхийг зөвшөөрөх үү?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> мөн Health Connect-н эдгээр тохиргоонд хандахыг хүсэж байна"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Бүх өгөгдөлд ард хандах"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Эрүүл мэндийн түүхэд ард хандах"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Фитнес, эрүүл оршихуйн өгөгдөлд ард хандах"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Таныг энэ аппыг ашиглаагүй байхад фитнес, эрүүл оршихуйн өгөгдөл, эрүүл мэндийн түүхэд хандахыг нь зөвшөөрөх"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Таныг энэ аппыг ашиглаагүй байхад тус өгөгдөлд хандахыг нь зөвшөөрөх"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Таныг энэ аппыг ашиглаагүй байхад тус өгөгдөлд хандахыг нь зөвшөөрөх"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Өгөгдөлд ард хандах"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Таныг энэ аппыг ашиглаагүй байхад Health Connect-н өгөгдөлд хандахыг нь зөвшөөрөх"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Фитнес, эрүүл оршихуйн өнгөрсөн цагийн өгөгдөлд хандах"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Энэ аппад <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-с өмнө нэмсэн өгөгдөлд хандахыг зөвшөөрөх"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Энэ аппад өнгөрсөн цагийн бүх өгөгдөлд хандахыг зөвшөөрөх"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Өнгөрсөн цагийн өгөгдөлд хандах"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Энэ аппад <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-с өмнө нэмсэн Health Connect-н өгөгдөлд хандахыг зөвшөөрөх"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Энэ аппад Health Connect-н өнгөрсөн цагийн бүх өгөгдөлд хандахыг зөвшөөрөх"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны эрүүл мэндийн түүхийн өнгөрсөн цагийн өгөгдөлд хандах эрх аль хэдийн авсан байна"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Зөвшөөрлийн талаар илүү ихийг унших"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Бүх өгөгдөлд ард хандах"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Эрүүл мэндийн түүхэд ард хандах"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Фитнес, эрүүл оршихуйн өгөгдөлд ард хандах"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Таныг энэ аппыг ашиглаагүй байхад фитнес, эрүүл оршихуйн өгөгдөл, эрүүл мэндийн түүхэд хандахыг нь зөвшөөрөх"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Таныг энэ аппыг ашиглаагүй байхад тус өгөгдөлд хандахыг нь зөвшөөрөх"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Таныг энэ аппыг ашиглаагүй байхад тус өгөгдөлд хандахыг нь зөвшөөрөх"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Өгөгдөлд ард хандах"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Таныг энэ аппыг ашиглаагүй байхад Health Connect-н өгөгдөлд хандахыг нь зөвшөөрөх"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Фитнес, эрүүл оршихуйн өнгөрсөн цагийн өгөгдөлд хандах"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Энэ аппад <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-с өмнө нэмсэн өгөгдөлд хандахыг зөвшөөрөх"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Энэ аппад өнгөрсөн цагийн бүх өгөгдөлд хандахыг зөвшөөрөх"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Өнгөрсөн цагийн өгөгдөлд хандах"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Энэ аппад <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-с өмнө нэмсэн Health Connect-н өгөгдөлд хандахыг зөвшөөрөх"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Энэ аппад Health Connect-н өнгөрсөн цагийн бүх өгөгдөлд хандахыг зөвшөөрөх"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д унших зөвшөөрлийг идэвхжүүлээгүй тул одоогоор ямар ч фитнесийн өгөгдлийг уншаагүй байна"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны эрүүл мэндийн түүхийн өмнөх өгөгдөлд хандах эрх аль хэдийн авсан байна. Үүнийг өөрчлөхийн тулд энэ аппад эрүүл мэндийн түүхийн зөвшөөрлийг унтраана уу"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Эрүүл мэндийн түүхийн зөвшөөрлийг удирдах"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Энэ аппад арын эсвэл хуучин өгөгдлийн хандалтыг асаахын тулд дор хаяж нэг унших зөвшөөрлийг идэвхжүүлнэ үү"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Энэ аппад арын хэсгийн хандалтыг асаахын тулд дор хаяж нэг унших зөвшөөрлийг идэвхжүүлнэ үү"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Энэ аппад хуучин өгөгдлийн хандалтыг асаахын тулд дор хаяж нэг унших зөвшөөрлийг идэвхжүүлнэ үү"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Энэ аппад Health Connect-н өнгөрсөн цагийн бүх өгөгдөлд хандахыг зөвшөөрөх"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Та аппыг ашиглаагүй үедээ энэ аппад Health Connect-н өгөгдөлд хандахыг зөвшөөрөх"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Хэрэв та зөвшөөрвөл таныг аппыг ашиглаагүй үед энэ апп Health Connect-н өгөгдөлд хандах боломжтой."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Өмнөх өгөгдөлд хандах"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д өмнөх өгөгдөлд хандахыг зөвшөөрөх үү?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Энэ аппад <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-с өмнө нэмсэн Health Connect-н өгөгдөлд хандахыг зөвшөөрөх"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Энэ аппад Health Connect-н өмнөх бүх өгөгдөлд хандахыг зөвшөөрнө үү"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Хэрэв та зөвшөөрвөл энэ апп <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>-с өмнө нэмсэн Health Connect-н өгөгдөлд хандах боломжтой."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Хэрэв та зөвшөөрвөл энэ апп Health Connect-н өмнөх бүх өгөгдөлд хандах боломжтой."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Идэвхтэй үед шатаасан калори"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"идэвхтэй үед шатаасан калори"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Идэвхтэй үед шатаасан калорийг унших"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"тэргэнцэр түрэх"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Тэргэнцэр түрэхийг унших"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Тэргэнцэр түрэхийг бичих"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Дасгалын эрчим"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"дасгалын эрчим"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Дасгалын эрчмийг унших"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Дасгалын эрчмийг бичих"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Хөдөлгөөнгүй байх үеийн бодисын солилцооны түвшин"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"хөдөлгөөнгүй байх үеийн бодисын солилцооны түвшин"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Хөдөлгөөнгүй байх үеийн бодисын солилцооны түвшнийг унших"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"арьсны температур"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Арьсны температурыг унших"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Арьсны температурыг бичих"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Үүнд Health Connect-д синк хийж, нэмсэн бүх эрүүл мэндийн түүх багтана. Энэ нь таны өвчний бүрэн түүх биш байж болох ба үүнд таны эрүүл мэндийн түүхийн эмнэлгийн тодорхойлолт ордоггүй."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Эрүүл мэндийн бүх түүх"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"эрүүл мэндийн бүх түүх"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Эрүүл мэндийн бүх түүхийг бичих"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Харшил"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"харшил"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Харшлын талаар унших"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Дархлаажуулалт"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"дархлаажуулалт"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Дархлаажуулалтын өгөгдлийг унших"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Лабораторийн хариу"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"лабораторийн хариу"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Лабораторийн хариуг унших"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Харшил"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"харшил"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Харшлын өгөгдлийг унших"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Эрүүл мэндийн байдал"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"эрүүл мэндийн байдал"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Эрүүл мэндийн байдлыг унших"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Вакцин"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"вакцин"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Вакцины өгөгдлийг унших"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Лабораторийн хариу"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"лабораторийн хариу"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Лабораторийн хариуг унших"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Эм"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"эм"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Эмийн өгөгдлийг унших"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Хувийн дэлгэрэнгүй мэдээлэл"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"хувийн дэлгэрэнгүй мэдээлэл"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Хувийн дэлгэрэнгүй мэдээллийг унших"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Мэргэжилтний дэлгэрэнгүй мэдээлэл"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"мэргэжилтний дэлгэрэнгүй мэдээлэл"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Мэргэжилтний дэлгэрэнгүй мэдээллийг унших"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Жирэмслэлт"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"жирэмслэлт"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Жирэмслэлтийн өгөгдлийг унших"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Асуудал"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"асуудал"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Асуудлын өгөгдлийг унших"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Процедур"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"процедур"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Процедурын өгөгдлийг унших"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Нийгмийн хүчин зүйлийн түүх"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Нийгмийн хүчин зүйлийн түүх"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"нийгмийн хүчин зүйлийн түүх"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Нийгмийн хүчин зүйлийн түүхийг унших"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Биеийн ерөнхий үзүүлэлт"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Үзлэг"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"үзлэг"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Үзлэгүүдийн өгөгдлийг унших"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Биеийн ерөнхий үзүүлэлт"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"биеийн ерөнхий үзүүлэлт"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Биеийн ерөнхий үзүүлэлтийг унших"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Анхаарал төвлөрөл"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Анхаарал төвлөрлийн өгөгдлийг бичих"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” г уншихыг зөвшөөрөх"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” г бичихийг зөвшөөрөх"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Цуцлах"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Зөвшөөрөх"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Бүгдийг зөвшөөрөх"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Бүү зөвшөөр"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Та энэ аппад уншуулах эсвэл Health Connect-д бичүүлэхийг хүсэж буй өгөгдлөө сонгоно уу"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Энэ аппад Health Connect-д уншуулах, бичүүлэхийг хүсэж буй өгөгдлөө сонгоно уу"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Энэ аппад Health Connect-с уншуулахыг хүсэж буй өгөгдлөө сонгоно уу"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Энэ аппад Health Connect-д бичүүлэхийг хүсэж буй өгөгдлөө сонгоно уу"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Хэрэв та унших эрх өгвөл апп шинэ өгөгдөл болон сүүлийн 30 хоногийн өгөгдлийг унших боломжтой"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Хэрэв та унших эрх өгвөл апп шинэ болон өмнөх өгөгдлийг унших боломжтой"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г Health Connect-д хандахыг зөвшөөрөх үү?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Таны өгөгдлийг <xliff:g id="APP_NAME">%1$s</xliff:g> хэрхэн зохицуулдаг болохыг та хөгжүүлэгчийн <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>-с мэдэж авах боломжтой"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д фитнес, эрүүл оршихуйн өгөгдөлд хандахыг зөвшөөрөх үү?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Та <xliff:g id="APP_NAME">%1$s</xliff:g> таны өгөгдлийг хэрхэн зохицуулдаг болохыг тухайн аппын <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>-с мэдэж авах боломжтой"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"нууцлалын бодлого"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д таны эрүүл мэндийн түүхэд хандахыг зөвшөөрөх үү?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Хэрэв та хандах эрх өгвөл тус апп харшил, лабораторийн хариу, вакцин болон бусад өгөгдлийг унших, бичих боломжтой\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Хэрэв та хандах эрх өгвөл тус апп харшил, лабораторийн хариу, вакцин болон бусад өгөгдлийг унших боломжтой\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Эрүүл мэндийн түүхийн тухай"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Хуваалцах өгөгдөлд дараах багтана"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Хэрэв та зөвшөөрвөл <xliff:g id="APP_NAME">%1$s</xliff:g> таны эрүүл мэндийн түүхийг Health Connect-тай хуваалцах боломжтой."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Өөр өөр апп болон эх сурвалжийн эрүүл мэндийн түүхээ нэг дор байлгахын тулд синк хийнэ үү"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Бүх зөвшөөрлийг хасах уу?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Бүгдийг хасах"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-н аливаа өгөгдлийг унших эсвэл бичих боломжгүй болно.\n\nЭнэ нь байршил, камер эсвэл микрофон зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> хуучин өгөгдлийг оруулаад цаашид Health Connect-н аливаа өгөгдлийг унших эсвэл бичих боломжгүй болно.\n\nЭнэ нь байршил, камер эсвэл микрофон зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> арын болон хуучин өгөгдлийг оруулаад цаашид Health Connect-н аливаа өгөгдлийг унших эсвэл бичих боломжгүй болно.\n\nЭнэ нь байршил, камер эсвэл микрофон зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Мөн <xliff:g id="APP_NAME">%1$s</xliff:g>-н өгөгдлийг Health Connect-с устгана"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Бүх зөвшөөрлийг хасах уу?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Эрүүл мэндийн түүхийн бүх зөвшөөрлийг хасах уу?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Фитнес болон эрүүл оршихуйн бүх зөвшөөрлийг хасах уу?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Мөн Health Connect-с <xliff:g id="APP_NAME">%1$s</xliff:g>-н фитнесийн өгөгдлийг устгах"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Эрүүл мэндийн түүхийн бүх зөвшөөрлийг хасах уу?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Мөн Health Connect-с <xliff:g id="APP_NAME">%1$s</xliff:g>-н эрүүл мэндийн түүхийг устгах"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-с энэ өгөгдлийг унших, бичих боломжгүй болно.\n\nЭнэ нь камер, микрофон, байршил зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-с энэ өгөгдлийг унших, бичих боломжгүй болох бөгөөд үүнд арын өгөгдөл багтана.\n\nЭнэ нь камер, микрофон, байршил зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-с энэ өгөгдлийг унших, бичих боломжгүй болох бөгөөд үүнд хуучин өгөгдөл багтана.\n\nЭнэ нь камер, микрофон, байршил зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-с энэ өгөгдлийг унших, бичих боломжгүй болох бөгөөд үүнд арын болон хуучин өгөгдөл багтана.\n\nЭнэ нь камер, микрофон, байршил зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Бүх зөвшөөрлийг хасах уу?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-н өгөгдлийг унших эсвэл бичих боломжгүй болно.\n\nЭнэ нь камер, микрофон, байршил зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-н өгөгдлийг унших эсвэл бичих боломжгүй болох бөгөөд үүнд арын өгөгдөл багтана.\n\nЭнэ нь камер, микрофон, байршил зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-н өгөгдлийг унших эсвэл бичих боломжгүй болох бөгөөд үүнд хуучин өгөгдөл багтана.\n\nЭнэ нь камер, микрофон, байршил зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> цаашид Health Connect-н өгөгдлийг унших эсвэл бичих боломжгүй болох бөгөөд үүнд арын болон хуучин өгөгдөл багтана.\n\nЭнэ нь камер, микрофон, байршил зэрэг уг аппад байж болох бусад зөвшөөрөлд нөлөөлөхгүй."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Мөн Health Connect-с <xliff:g id="APP_NAME">%1$s</xliff:g>-н фитнесийн өгөгдөл болон эрүүл мэндийн түүхийг устгах"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Энэ аппын зөвшөөрлүүдийг хассан"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Мөн Health Connect-н бүх өгөгдлийг устгах"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Дараах өдөр"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Сонгосон өдөр"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Өмнөх өдөр"</string>
     <string name="default_error" msgid="7966868260616403475">"Алдаа гарлаа. Дахин оролдоно уу."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Тодорхойгүй нөөц"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Эх өгөгдөл"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Нээх хаалт."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Хаах хаалт."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> <xliff:g id="FIELD">%2$s</xliff:g> талбарын утга"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Эдгээр апп цаашид хандах эрхгүй ч Health Connect-д өгөгдөл нь хадгалагдсан хэвээр байна"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>-с хойш нэмсэн өгөгдлийг унших боломжтой"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Энэ аппын хандах боломжтой Android-н бусад зөвшөөрлийг удирдахын тулд Тохиргоо &gt; Аппууд руу очно уу"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Таны <xliff:g id="APP_NAME">%1$s</xliff:g>-тай хуваалцдаг өгөгдөлд үүний нууцлалын бодлого хамаарна"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Таны өгөгдлийг <xliff:g id="APP_NAME">%1$s</xliff:g> хэрхэн зохицуулдаг болохыг та хөгжүүлэгчийн нууцлалын бодлогоос мэдэж авах боломжтой"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Энэ аппын хандах боломжтой Android-н бусад зөвшөөрлийг удирдахын тулд Тохиргоо руу очиж, дараа нь Аппууд дээр товшино уу"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Нууцлалын бодлогыг унших"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Сүүлийн 24 цагийн дотор хандсан"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Аппын хандалт"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Та одоогоор ямар ч тохирох апп суулгаагүй байна"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Нэмэлт хандах эрх"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Өмнөх өгөгдөл, арын өгөгдөл"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Энэ аппын нэмэлт зөвшөөрлүүдийг хассан"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Зөвшөөрөл"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Фитнес, эрүүл мэнд"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Дасгал, унтлага, шим тэжээл ба бусад"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Эрүүл мэндийн түүх"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"эрүүл мэндийн түүх"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Лабын хариу, эм, дархлаажуулалт ба бусад"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Лабораторийн хариу, эм, вакцин ба бусад"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Аппын зөвшөөрлийг хассан"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect <xliff:g id="APP_DATA">%s</xliff:g>-н зөвшөөрлийг хассан"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect <xliff:g id="APP_DATA_0">%1$s</xliff:g> болон <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>-н зөвшөөрлийг хассан"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store луу очих"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect-г ашиглаж эхлээрэй"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect таны эрүүл мэнд, фитнесийн өгөгдлийг хадгалснаар та төхөөрөмж дээрээ байгаа өөр өөр аппуудыг энгийн аргаар синк хийх боломжтой"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect өөр өөр аппаас эрүүл мэнд, фитнесийн өгөгдлийг тань хадгалж, синк хийдэг.\n\nДасгалын харилцан үйлдэл, алхсан тоо, шим тэжээл, унтлага болон бусад "<b>"фитнес, эрүүл оршихуйн өгөгдөл"</b>\n\n"Вакцин, лабораторийн хариу болон бусад "<b>"эрүүл мэндийн түүх"</b></string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Та Health Connect-р дараахыг хийх боломжтой:"</string>
     <string name="share_data" msgid="3481932156368883946">"Аппуудтайгаа өгөгдөл хуваалцаарай"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Апп бүрийн Health Connect-с унших болон түүнд бичих боломжтой өгөгдлийг сонгоно уу"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Тохиргоо болон нууцлалаа удирдаарай"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Сарын тэмдэг бага ирэх"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Сарын тэмдэг дунд зэрэг ирэх"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Сарын тэмдэг хэт их ирэх"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Хэмжээ нь тодорхойгүй"</string>
     <string name="period_day" msgid="3821944462093965882">"Сарын тэмдгийн <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>-с <xliff:g id="DAY">%1$d</xliff:g> дахь өдөр"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Сарын тэмдэг (1 өдөр)}other{Сарын тэмдэг (# өдөр)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Эерэг"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Сөрөг"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Өндөр"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Хөгжим"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Бусад"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Хөтөчгүй"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Дунд зэрэг"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Эрч хүчтэй"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>мин"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>цаг <xliff:g id="MIN">%2$s</xliff:g>мин"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>цаг"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Нэгтгэж байна"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect-г Android системтэй нэгтгэж байна.\n\nТаны өгөгдөл болон зөвшөөрлийг шилжүүлэхэд хэсэг хугацаа зарцуулж магадгүй."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Та явц дууссан гэх мэдэгдлийг авах хүртлээ аппыг бүү хаагаарай."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect-г нэгтгэж байна"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Шинэчлэх шаардлагатай"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect-г Android системтэй нэгтгэж байгаа тул та үүнд тохиргооноосоо шууд хандах боломжтой."</string>
     <string name="update_button" msgid="4544529019832009496">"Шинэчлэх"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Энэ шинэчлэлтийг эхлүүлснээр Health Connect-г таны системийн тохиргоотой үргэлжлүүлэн нэгтгэх боломжтой"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Одоо шинэчлэх"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Системийн шинэчлэлт шаардлагатай"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Үргэлжлүүлэхээсээ өмнө утасныхаа системийг шинэчилнэ үү."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Хэрэв та утасныхаа системийг аль хэдийн шинэчилсэн бол нэгтгэлийг үргэлжлүүлэхийн тулд утсаа дахин эхлүүлж үзнэ үү"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect-н шинэчлэлт шаардлагатай"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Үргэлжлүүлэхээс өмнө Health Connect аппыг хамгийн сүүлийн үеийн хувилбар луу шинэчилнэ үү."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Илүү их зай шаардлагатай"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect-г үргэлжлүүлэн нэгтгэхийн тулд үүнд таны утасны хадгалах сангийн <xliff:g id="SPACE_NEEDED">%1$s</xliff:g>-н зай шаардлагатай.\n\nУтсандаа сул зай гаргаж, дахин оролдоно уу."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Дахин оролдох"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Сул зай гаргах"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Илүү их зай шаардлагатай"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect-г үргэлжлүүлэн нэгтгэхийн тулд үүнд таны утасны хадгалах сангийн <xliff:g id="SPACE_NEEDED">%1$s</xliff:g>-н зай шаардлагатай."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Нэгтгэхийг түр зогсоосон"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect аппыг Android системтэй нэгтгэх явцад хаагдсан.\n\nАппыг дахин нээхийн тулд үргэлжлүүлэхийг товшиж, өгөгдөл болон зөвшөөрлөө үргэлжлүүлэн шилжүүлнэ үү."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect-н өгөгдлөө хадгалахын тулд үүнийг <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-н дотор дуусгана уу"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect-г Android системтэй үргэлжлүүлэн нэгтгэхийн тулд товшино уу. Өгөгдлөө хадгалахын тулд үүнийг <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-н дотор дуусгана уу"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect-г Android системтэй үргэлжлүүлэн нэгтгэхийн тулд товшино уу."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Үргэлжлүүлэх"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect-н нэгтгэлийг үргэлжлүүлэх"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Өгөгдлөө хадгалахын тулд үүнийг <xliff:g id="TIME_NEEDED">%1$s</xliff:g>-н дотор дуусгана уу"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Аппыг шинэчлэх шаардлагатай"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect-тэй үргэлжлүүлэн синк хийхийн тулд <xliff:g id="APP_NAME">%1$s</xliff:g>-г шинэчилсэн байх шаардлагатай"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect-тэй үргэлжлүүлэн синк хийхийн тулд зарим аппыг шинэчилсэн байх шаардлагатай"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect-тэй үргэлжлүүлэн синк хийхийн тулд <xliff:g id="APP_NAME">%1$s</xliff:g>-г шинэчилсэн байх шаардлагатай. Шинэчлэлт зарим аппад боломжгүй байж магадгүй."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect-тэй үргэлжлүүлэн синк хийхийн тулд зарим аппыг шинэчилсэн байх шаардлагатай. Шинэчлэлт зарим аппад боломжгүй байж магадгүй."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Шинэчлэлт шалгах"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Нэмэлт мэдээлэл авах"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-н нэгтгэл"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect-г нэгтгэж дууссангүй"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Үүнийг дахин боломжтой болох үед та мэдэгдэл авна."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Ойлголоо"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-г нэгтгэж дууссангүй"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Цааш унших"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-г нэгтгэж дууссан"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Нээх"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Шинэ юм юу байна"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Та одоо Health Connect-д тохиргооноосоо шууд хандах боломжтой. Хадгалах сангийн сул зай гаргахын тулд Health Connect аппыг хүссэн үедээ устгана уу."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Ойлголоо"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Аппын эх сурвалжуудыг засах"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Төхөөрөмжийн өгөгдмөл"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Aппын өгөгдөл"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect-д хандах эрхтэй аппуудын өгөгдлийг энд харуулна"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н өгөгдлийг энд харуулна"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect-д хандах эрхтэй аппуудын өгөгдлийг энд харуулна"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Өдөр"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Долоо хоног"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Сар"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Өнгөрсөн сар"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Оролт"</string>
     <string name="tab_access" msgid="7818197975407243701">"Хандалт"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д нэмэлт хандах эрхийг зөвшөөрөх үү?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> мөн Health Connect-н эдгээр тохиргоонд хандахыг хүсэж байна"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Энэ аппад арын эсвэл хуучин өгөгдлийн хандалтыг асаахын тулд дор хаяж нэг унших зөвшөөрлийг идэвхжүүлнэ үү"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Энэ аппад арын хэсгийн хандалтыг асаахын тулд дор хаяж нэг унших зөвшөөрлийг идэвхжүүлнэ үү"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Энэ аппад хуучин өгөгдлийн хандалтыг асаахын тулд дор хаяж нэг унших зөвшөөрлийг идэвхжүүлнэ үү"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect-г ашиглаж эхлэх"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Хооронд нь эрүүл мэнд, фитнесийн өгөгдөл хуваалцах эхний аппуудаа синк хийнэ үү"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Тохируулах"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Тохирох аппуудыг харах"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect-р <xliff:g id="APP_NAME">%s</xliff:g>-тай синк хийх илүү олон апп олоорой"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Апп дэлгүүр дээр харах"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Дэлгэцийн түгжээ тохируулна уу"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Эрүүл мэндийн өгөгдлийнхөө аюулгүй байдлыг нэмэгдүүлэх үүднээс энэ төхөөрөмжид ПИН, хээ, нууц үг тохируулна уу"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Дэлгэцийн түгжээ тохируулах"</string>
     <string name="select_all" msgid="837499881590001166">"Бүгдийг сонгох"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Холбогдсон аппууд цаашид Health Connect-с энэ өгөгдлийг унших боломжгүй болно"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Тэмдэглэсэн"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Тэмдэглээгүй"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Дасгалын газрын зургийн маршрут боломжтой"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Дараагийн өдөр"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Дараагийн долоо хоног"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Дараагийн сар"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Өмнөх өдөр"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Өмнөх долоо хоног"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Өмнөх сар"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Бүх өгөгдлийг бүрмөсөн устгах уу?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Сонгогдсон өгөгдлийг бүрмөсөн устгах уу?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g>-н бүх өгөгдлийг бүрмөсөн устгах уу?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>-н долоо хоногийн сонгогдсон оруулгуудыг бүрмөсөн устгах уу?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>-н сонгогдсон оруулгуудыг бүрмөсөн устгах уу?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"<xliff:g id="APP_NAME">%s</xliff:g>-н энэ оруулгыг бүрмөсөн устгах уу?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="DATA_TYPE">%1$s</xliff:g>-н өгөгдлийг бүрмөсөн устгах уу?"</string>
+    <string name="on" msgid="8266542510798355807">"Асаалттай"</string>
+    <string name="off" msgid="6996623844428550649">"Унтраалттай"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g>-д хандсан"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Өчигдөр <xliff:g id="TIME_DATE">%1$s</xliff:g>-д хандсан"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>-д хандсан"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Үргэлж зөвшөөрөх"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Сонгосныг зөвшөөрөх"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Аппыг ашиглаж байхад"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Бүгдээс нь татгалзах"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д фитнес, эрүүл оршихуйн өгөгдөлд хандахыг зөвшөөрөх үү?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g>-д хандах эрх хүсэж банйа.\n\nТэдгээрийг бүгдийг нь зөвшөөрөхөөр сонгох эсвэл тус тусад нь хянана уу."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д <xliff:g id="DATA_TYPE">%2$s</xliff:g>-д хандахыг зөвшөөрөх үү?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Фитнес, эрүүл оршихуй"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"үргэлж"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ашиглаж байхад"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Үргэлж"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Ашиглаж байхад"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны бүх фитнес, эрүүл оршихуйн өгөгдөлд <xliff:g id="ALLOW_MODE">%2$s</xliff:g> хандах боломжтой"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Хандахыг зөвшөөрсөн"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Уншихыг зөвшөөрсөн"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Эдгээр зөвшөөрөл <xliff:g id="APP_NAME">%1$s</xliff:g>-д таны төхөөрөмжийн мэдрэгчдийн өгөгдөлд хандах эрх өгдөг."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g>-с <xliff:g id="NUMBER_0">%1$d</xliff:g> аппыг зөвшөөрсөн"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ямар ч апп хүсэлт гаргаагүй"</string>
+    <string name="allowed" msgid="4158456017482263737">"Зөвшөөрсөн"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Зөвшөөрөөгүй"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Энэ зөвшөөрөлтэй аппууд таны төхөөрөмжийн мэдрэгчдээс <xliff:g id="DATA_TYPE">%s</xliff:g>-н өгөгдөлд хандах боломжтой."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Таны цаган дээрх бүх аппын <xliff:g id="DATA_TYPE">%s</xliff:g>-н хандалтыг хасах уу?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Зөв тэмдэг"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Х тэмдэг"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Одоогоор <xliff:g id="APP_NAME">%1$s</xliff:g> фитнес, эрүүл оршихуйн өгөгдөлд <xliff:g id="ALLOW_MODE">%2$s</xliff:g> хандах боломжтой"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д фитнес, эрүүл оршихуйн өгөгдөлд үргэлж хандахыг зөвшөөрөх үү?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g>-д хандах эрхтэй."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Фитнес, эрүүл оршихуйн зөвшөөрлийг удирдах"</string>
 </resources>
diff --git a/apk/res/values-mr/strings.xml b/apk/res/values-mr/strings.xml
index b5c56d7..ab2f280 100644
--- a/apk/res/values-mr/strings.xml
+++ b/apk/res/values-mr/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"तुमच्या डिव्हाइसवरील आरोग्य आणि फिटनेससंबंधी डेटा व्यवस्थापित करा व कोणती अ‍ॅप्स तो डेटा अ‍ॅक्सेस करू शकतात हे नियंत्रित करा"</string>
     <string name="data_title" msgid="4456619761533380816">"डेटा आणि ॲक्सेस"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"आरोग्यविषयक माहिती ब्राउझ करा"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"तुमची आरोग्यविषयक माहिती आणि कोणती ॲप्स ती ॲक्सेस करू शकतात ते पहा"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"सर्व वर्गवाऱ्या"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"सर्व वर्गवाऱ्या पहा"</string>
     <string name="no_data" msgid="1906986019249068659">"कोणताही डेटा नाही"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"काल"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"रीड: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"राइट: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"परवानग्या व्यवस्थापित करा"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"वेळ: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"ॲक्टिव्हिटी"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"तुमच्या आरोग्याशी संबंधित डेटा अ‍ॅक्सेस करा"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"घटवलेल्या कॅलरी रीड करा"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"अ‍ॅपला घटवलेल्या कॅलरी रीड करण्याची अनुमती देते"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"बॅकग्राउंडमध्ये डेटा अ‍ॅक्सेस करा"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला बॅकग्राउंडमध्ये डेटा अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला बॅकग्राउंडमध्ये डेटा अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"तुम्ही अनुमती दिल्यास, तुम्ही हे ॲप वापरत नसताना या ॲपला आरोग्य आणि फिटनेससंबंधित डेटा व आरोग्यविषयक माहिती अ‍ॅक्सेस करू शकते."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"तुम्ही अनुमती दिल्यास, तुम्ही हे ॲप वापरत नसताना आरोग्यविषयक माहिती अ‍ॅक्सेस करू शकते."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"तुम्ही अनुमती दिल्यास, तुम्ही हे ॲप वापरत नसताना या ॲपला आरोग्य आणि फिटनेससंबंधित डेटा अ‍ॅक्सेस करू शकते."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"तुम्ही अनुमती दिल्यास, तुम्ही हे ॲप वापरत नसताना ते Health Connect संबंधित डेटा अ‍ॅक्सेस करू शकते."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला मागील डेटा अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"तुम्ही अनुमती दिल्यास, हे अ‍ॅप<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> पूर्वी जोडलेला आरोग्य आणि फिटनेससंबंधित डेटा ॲक्सेस करू शकते."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"तुम्ही अनुमती दिल्यास, हे अ‍ॅप मागील सर्व आरोग्य आणि फिटनेससंबंधित डेटा अ‍ॅक्सेस करू शकते."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"तुम्ही अनुमती दिल्यास, हे ॲप <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> पूर्वी जोडलेला Health Connect संबंधित डेटा ॲक्सेस करू शकते."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"तुम्ही अनुमती दिल्यास, हे ॲप Health Connect संबंधित मागील सर्व डेटा ॲक्सेस करू शकते."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी अतिरिक्त अ‍ॅक्सेसला अनुमती द्यायची आहे का?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला या Health Connect सेटिंग्जदेखील अ‍ॅक्सेस करायचे आहे"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"बॅकग्राउंडमध्ये सर्व डेटा अ‍ॅक्सेस करा"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"बॅकग्राउंडमध्ये आरोग्यविषयक माहिती अ‍ॅक्सेस करा"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"बॅकग्राउंडमध्ये आरोग्य आणि फिटनेससंबंधित डेटा अ‍ॅक्सेस करा"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"तुम्ही हे ॲप वापरत नसताना या ॲपला आरोग्य आणि फिटनेससंबंधित डेटा व आरोग्यविषयक माहिती अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"तुम्ही ॲप वापरत नसताना या ॲपला हा डेटा अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"तुम्ही ॲप वापरत नसताना या ॲपला हा डेटा अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"बॅकग्राउंडमध्ये डेटा अ‍ॅक्सेस करा"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"तुम्ही हे ॲप वापरत नसताना या ॲपला Health Connect संबंधित डेटा अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"मागील आरोग्य आणि फिटनेससंबंधित डेटा अ‍ॅक्सेस करा"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"या अ‍ॅपला <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> पूर्वी जोडलेला डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"या अ‍ॅपला मागील सर्व डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"मागील डेटा अ‍ॅक्सेस करा"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"या ॲपला <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> पूर्वी जोडलेला Health Connect संबंधित डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"या अ‍ॅपला Health Connect संबंधित मागील सर्व डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> तुमच्या आरोग्यविषयक माहितीसाठी आधीपासून डेटा अ‍ॅक्सेस करू शकतात"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"परवानग्यांबद्दल आणखी वाचा"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"बॅकग्राउंडमध्ये सर्व डेटा अ‍ॅक्सेस करा"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"बॅकग्राउंडमध्ये आरोग्यविषयक माहिती अ‍ॅक्सेस करा"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"बॅकग्राउंडमध्ये आरोग्य आणि फिटनेससंबंधित डेटा अ‍ॅक्सेस करा"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"तुम्ही हे ॲप वापरत नसताना या ॲपला आरोग्य आणि फिटनेससंबंधित डेटा व आरोग्यविषयक माहिती अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"तुम्ही ॲप वापरत नसताना या ॲपला हा डेटा अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"तुम्ही ॲप वापरत नसताना या ॲपला हा डेटा अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"बॅकग्राउंडमध्ये डेटा अ‍ॅक्सेस करा"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"तुम्ही हे ॲप वापरत नसताना या ॲपला Health Connect संबंधित डेटा अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"मागील आरोग्य आणि फिटनेससंबंधित डेटा अ‍ॅक्सेस करा"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"या अ‍ॅपला <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> पूर्वी जोडलेला डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"या अ‍ॅपला मागील सर्व डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"मागील डेटा अ‍ॅक्सेस करा"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"या ॲपला <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> पूर्वी जोडलेला Health Connect संबंधित डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"या अ‍ॅपला सर्व Health Connect संबंधित मागील डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"सध्या कोणताही फिटनेससंबंधी डेटा वाचला जात नाही कारण <xliff:g id="APP_NAME">%1$s</xliff:g> ला रीड करायच्या परवानग्या नाहीत"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> तुमच्या आरोग्यविषयक माहितीसाठी आधीपासून डेटा अ‍ॅक्सेस करू शकतात. हे बदलण्यासाठी, या ॲपसाठी आरोग्यविषयक माहिती परवानग्या बंद करा"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"आरोग्यविषयक माहितीच्या परवानग्या व्यवस्थापित करा"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"या ॲपसाठी बॅकग्राउंड किंवा मागील डेटा ॲक्सेस करणे सुरू करण्यासाठी किमान एक रीड परवानगी सुरू करा"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"या ॲपसाठी बॅकग्राउंड अ‍ॅक्सेस सुरू करण्यासाठी किमान एक रीड परवानगी सुरू करा"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"या ॲपसाठी मागील डेटा अ‍ॅक्सेस सुरू करण्यासाठी किमान एक रीड परवानगी सुरू करा"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"या अ‍ॅपला Health Connect संबंधित मागील सर्व डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
     <string name="background_read_description" msgid="3203594555849969283">"तुम्ही हे ॲप वापरत नसाल, तेव्हा या ॲपला Health Connect संबंधित डेटा अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"तुम्ही अनुमती दिल्यास, तुम्ही हे ॲप वापरत नसताना ते Health Connect संबंधित डेटा अ‍ॅक्सेस करू शकते."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"मागील डेटा अ‍ॅक्सेस करा"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला मागील डेटा अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"या ॲपला <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> पूर्वी जोडलेला Health Connect संबंधित डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"या अ‍ॅपला Health Connect संबंधित मागील सर्व डेटा ॲक्सेस करण्याची अनुमती द्या"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"तुम्ही अनुमती दिल्यास, हे ॲप <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> पूर्वी जोडलेला Health Connect संबंधित डेटा ॲक्सेस करू शकते."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"तुम्ही अनुमती दिल्यास, हे ॲप Health Connect संबंधित मागील सर्व डेटा ॲक्सेस करू शकते."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"घटवलेल्या अ‍ॅक्टिव्ह कॅलरी"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"घटवलेल्या अ‍ॅक्टिव्ह कॅलरी"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"घटवलेल्या अ‍ॅक्टिव्ह कॅलरी रीड करा"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"व्हीलचेअर ढकलण्याशी संबंधित डेटा"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"व्हीलचेअर ढकलण्याशी संबंधित डेटा रीड करा"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"व्हीलचेअर ढकलण्याशी संबंधित डेटा राइट करा"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"अ‍ॅक्टिव्हिटीची तीव्रता"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"अ‍ॅक्टिव्हिटीची तीव्रता"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"अ‍ॅक्टिव्हिटीच्या तीव्रतेशी संबंधित वाचा"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"अ‍ॅक्टिव्हिटीच्या तीव्रतेशी संबंधित लिहा"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"मूलभूत चयापचय दराशी संबंधित डेटा"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"मूलभूत चयापचय दराशी संबंधित डेटा"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"मूलभूत चयापचय दराशी संबंधित डेटा रीड करा"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"त्वचेचे तापमान"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"त्वचेचे तापमान वाचा"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"त्वचेचे तापमान लिहा"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"यामध्ये Health Connect मध्ये सिंक केलेली आणि जोडलेली सर्व आरोग्यविषयक माहिती समाविष्ट असते. ही तुमची संपूर्ण वैद्यकीय माहिती नसू शकते आणि त्यात तुमच्या आरोग्यविषयक माहितीचे वैद्यकीय वर्णन समाविष्ट नसते."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"सर्व आरोग्यविषयक माहिती"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"सर्व आरोग्यविषयक माहिती"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"सर्व आरोग्यविषयक माहिती राईट करा"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"ॲलर्जी"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ॲलर्जी"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"ॲलर्जीशी संबंधित वाचा"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"लसीकरण"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"लसीकरण"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"लसीकरणासंबंधित डेटा रीड करा"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"प्रयोगशाळेचे परिणाम"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"प्रयोगशाळेचे परिणाम"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"प्रयोगशाळेचे परिणाम वाचा"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"ॲलर्जी"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ॲलर्जी"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"ॲलर्जीशी संबंधित डेटा वाचा"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"नियम"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"नियम"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"अटी वाचा"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"लसी"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"लसी"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"लसीकरणासंबंधित डेटा वाचा"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"लॅबमधील परिणाम"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"लॅबमधील परिणाम"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"लॅबमधील परिणामाशी संबंधित डेटा वाचा"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"औषधे"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"औषधे"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"औषधांशी संबंधित डेटा रीड करा"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"वैयक्तिक माहिती"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"वैयक्तिक माहिती"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"वैयक्तिक माहिती वाचा"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"वैद्यक व्यावसायिकाचे तपशील"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"वैद्यक व्यावसायिकाचे तपशील"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"वैद्यक व्यावसायिकाचे तपशील वाचा"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"गर्भधारणा"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"गर्भधारणा"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"गर्भधारणेशी संबंधित वाचा"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"समस्या"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"समस्या"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"समस्यांशी संबंधित वाचा"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"प्रक्रिया"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"प्रक्रिया"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"प्रक्रियेशी संबंधित वाचा"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"सामाजिक इतिहास"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"सामाजिक इतिहास"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"सामाजिक इतिहास"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"सामाजिक इतिहासाशी संबंधित वाचा"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"महत्त्वाची लक्षणे"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"भेटी"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"भेटी"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"भेटी वाचा"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"महत्त्वाची लक्षणे"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"महत्त्वाची लक्षणे"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"महत्त्वाच्या लक्षणांशी संबंधित वाचा"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"जागरूकता"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"जागरूकता राइट करा"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ला रीड करण्याची अनुमती द्या"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” राइट करण्याची अनुमती द्या"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"रद्द करा"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"अनुमती द्या"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"सर्वांना अनुमती द्या"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"अनुमती देऊ नका"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"या अ‍ॅपने Health Connect ला रीड किंवा राइट करावा असा तुम्हाला वाटणारा डेटा निवडा"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"या अ‍ॅपने Health Connect ला रीड किंवा राइट करावा असे तुम्हाला वाटत असलेला डेटा निवडा"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"या अ‍ॅपने Health Connect वरून रीड करावा असे तुम्हाला वाटत असलेला डेटा निवडा"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"या अ‍ॅपने Health Connect ला राइट करावा असे तुम्हाला वाटत असलेला डेटा निवडा"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"तुम्ही रीड अ‍ॅक्सेस दिल्यास, अ‍ॅप नवीन डेटा आणि मागील ३० दिवसांचा डेटा रीड करू शकेल"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"तुम्ही रीड अ‍ॅक्सेस दिल्यास, हे अ‍ॅप नवीन आणि मागील डेटा रीड करू शकेल"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला Health Connect अ‍ॅक्सेस करण्याची परवानगी द्यायची आहे का?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> तुमचा डेटा कसा हाताळते हे तुम्ही डेव्हलपरच्या <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> मध्ये जाणून घेऊ शकता"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> आरोग्य आणि फिटनेससंबंधित डेटा अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> तुमचा डेटा कसा हाताळते हे तुम्ही <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> मध्ये जाणून घेऊ शकता"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"गोपनीयता धोरण"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला तुमची आरोग्यविषयक माहिती ॲक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"तुम्ही अनुमती दिल्यास, अ‍ॅप हे ॲलर्जी, लॅबमधील परिणाम, लसी आणि आणखी बरेच काही यांसारखा डेटा वाचू आणि लिहू शकतो\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"तुम्ही अनुमती दिल्यास, अ‍ॅप हे ॲलर्जी, लॅबमधील परिणाम, लसी आणि आणखी बरेच काही यांसारखा डेटा वाचू शकतो\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"आरोग्यविषयक माहितीबद्दल"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"शेअर केल्या जाणाऱ्या डेटामध्ये याचा समावेश असतो"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"तुम्ही अनुमती दिल्यास, <xliff:g id="APP_NAME">%1$s</xliff:g> तुमची आरोग्यविषयक माहिती Health Connect सह शेअर करू शकतो."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"तुमची आरोग्यविषयक माहिती एकाच ठिकाणी ठेवण्यासाठी तुमच्या वेगवेगळ्या अ‍ॅप्स आणि स्रोतांमधून ती सिंक करा"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"सर्व परवानग्या काढून टाकायच्या का?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"सर्व काढून टाका"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे Health Connect वरील कोणताही डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला यापुढे मागील डेटाच्या समावेशासह Health Connect वरून कोणताही डेटा रीड किंवा राइट करता येणार नाही.\n\nयामुळे या अ‍ॅपच्या स्थान, कॅमेरा किंवा मायक्रोफोन यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला यापुढे बॅकग्राउंड डेटा आणि मागील डेटाच्या समावेशासह Health Connect वरून कोणताही डेटा रीड किंवा राइट करता येणार नाही.\n\nयामुळे या अ‍ॅपच्या स्थान, कॅमेरा किंवा मायक्रोफोन यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect मधून <xliff:g id="APP_NAME">%1$s</xliff:g> शी संबंधित डेटादेखील हटवा"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"सर्व परवानग्या काढून टाकायच्या का?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"आरोग्यविषयक माहितीच्या सर्व परवानग्या काढून टाकायच्या का?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"फिटनेस आणि आरोग्यासंबंधित सर्व परवानग्या काढून टाकायच्या का?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connect वरून <xliff:g id="APP_NAME">%1$s</xliff:g> वरील फिटनेससंबंधी डेटादेखील हटवा"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"आरोग्यविषयक माहितीच्या सर्व परवानग्या काढून टाकायच्या का?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connect वरून <xliff:g id="APP_NAME">%1$s</xliff:g> वरील आरोग्यविषयक माहितीदेखील हटवा"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे Health Connect वरील हा डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे बॅकग्राउंड डेटाच्या समावेशासह Health Connect वरील हा डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे मागील डेटाच्या समावेशासह Health Connect वरील हा डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे बॅकग्राउंड आणि मागील डेटाच्या समावेशासह Health Connect वरील हा डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"सर्व परवानग्या काढून टाकायच्या का?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे Health Connect वरील डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे बॅकग्राउंड डेटाच्या समावेशासह Health Connect वरील डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे मागील डेटाच्या समावेशासह Health Connect वरील डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे यापुढे बॅकग्राउंड डेटा आणि मागील डेटाच्या समावेशासह Health Connect वरील डेटा रीड किंवा राइट करू शकणार नाही.\n\nयामुळे या अ‍ॅपच्या कॅमेरा, मायक्रोफोन किंवा स्थान यांसारख्या इतर परवानग्यांवर परिणाम होत नाही."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Health Connect वरून <xliff:g id="APP_NAME">%1$s</xliff:g> वरील फिटनेससंबंधी डेटा आणि आरोग्यविषयक माहितीदेखील हटवा"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"या अ‍ॅपसाठी परवानग्या काढून टाकल्या आहेत"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"सर्व Health Connect डेटादेखील हटवा"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"पुढील दिवस"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"निवडलेला दिवस"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"मागील दिवस"</string>
     <string name="default_error" msgid="7966868260616403475">"काहीतरी चूक झाली. कृपया पुन्हा प्रयत्न करा."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"अज्ञात स्रोत"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"स्रोत डेटा"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>सुरुवातीचा कंस."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>शेवटचा कंस."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> फील्ड <xliff:g id="FIELD">%2$s</xliff:g> मूल्य"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"या अ‍ॅप्सना यापुढे अ‍ॅक्सेस नाही, पण Health Connect मध्ये अजूनही डेटा स्टोअर केलेला राहील"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> नंतर जोडलेला डेटा रीड करू शकते"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"हे अ‍ॅप अ‍ॅक्सेस करू शकणाऱ्या इतर Android परवानग्या व्यवस्थापित करण्यासाठी, सेटिंग्ज &gt; अ‍ॅप्स वर जा"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"तुम्ही <xliff:g id="APP_NAME">%1$s</xliff:g> सह शेअर केलेला डेटा त्यांच्या गोपनीयता धोरणामध्ये समाविष्ट आहे"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> तुमचा डेटा कसा हाताळते हे तुम्ही डेव्हलपरच्या गोपनीयता धोरणामध्ये जाणून घेऊ शकता"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"हे अ‍ॅप अ‍ॅक्सेस करू शकणाऱ्या इतर Android परवानग्या व्यवस्थापित करण्यासाठी, सेटिंग्ज त्यानंतर अ‍ॅप्स वर जा"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"गोपनीयता धोरण वाचा"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"मागील २४ तासांमध्ये अ‍ॅक्सेस केले होते"</string>
     <string name="app_access_title" msgid="7137018424885371763">"अ‍ॅप अ‍ॅक्सेस"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"तुमच्याकडे सध्या कोणतीही कंपॅटिबल अ‍ॅप्स इंस्टॉल केलेली नाहीत"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"अतिरिक्त अ‍ॅक्सेस"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"मागील डेटा, बॅकग्राउंड डेटा"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"या ॲपसाठीच्या अतिरिक्त परवानग्या काढून टाकल्या आहेत"</string>
     <string name="permissions_header" msgid="6519976063360071569">"परवानग्या"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"सुदृढता आणि स्वास्थ्य"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"व्यायाम, झोप, पोषण आणि इतर गोष्टी"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"आरोग्यविषयक माहिती"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"आरोग्यविषयक माहिती"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"लॅब निकाल, औषधे, लसीकरण आणि इतर गोष्टी"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"लॅबमधील परिणाम, औषधे, लसी व इतर गोष्टी"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"काढून टाकलेल्या अ‍ॅप परवानग्या"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect ने <xliff:g id="APP_DATA">%s</xliff:g> साठी परवानग्या काढून टाकल्या"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect ने <xliff:g id="APP_DATA_0">%1$s</xliff:g> आणि <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> साठी परवानग्या काढून टाकल्या"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store वर जा"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect सह सुरुवात करा"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect हे तुमचा आरोग्य आणि फिटनेससंबंधी डेटा स्टोअर करते व तुम्हाला तुमच्या डिव्हाइसवरील वेगवेगळी अ‍ॅप्स सिंक करण्याचा सोपा मार्ग देते"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect हे विविध ॲप्समधील तुमचा आरोग्य आणि फिटनेससंबंधित डेटा स्टोअर करून सिंक करते.\n\n"<b>"व्यायामाची सेशन, पावले, पोषण, झोप"</b>" आणि आणखी बऱ्याच गोष्टींसह \n\n"<b>"आरोग्य आणि स्वास्थ्य डेटा"</b>" लसी, लॅबमधील परिणाम आणि आणखी बरेच काही"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect वापरून तुम्ही पुढील गोष्टी करू शकता"</string>
     <string name="share_data" msgid="3481932156368883946">"तुमच्या अ‍ॅप्ससह डेटा शेअर करा"</string>
     <string name="share_data_description" msgid="2919871301634375092">"प्रत्येक अ‍ॅप हे Health Connect वर कोणता डेटा रीड किंवा राइट करू शकते ते निवडा"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"तुमची सेटिंग्ज आणि गोपनीयता व्यवस्थापित करा"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"कमी रक्तस्राव"</string>
     <string name="flow_medium" msgid="3783688724668943154">"मध्यम रक्तस्राव"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"जास्त रक्तस्राव"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"अज्ञात फ्लो"</string>
     <string name="period_day" msgid="3821944462093965882">"पाळीच्या <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> पैकी <xliff:g id="DAY">%1$d</xliff:g> दिवस"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{कालावधी (१ दिवस)}other{कालावधी (# दिवस)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"पॉझिटीव्ह"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"निगेटीव्ह"</string>
     <string name="ovulation_high" msgid="205362931427158291">"उच्च"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"संगीत"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"इतर"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"मार्गदर्शित नसलेले"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"मध्यम"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"जोशपूर्ण"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>मि"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>ता <xliff:g id="MIN">%2$s</xliff:g>मि"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>ता"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"इंटिग्रेशन प्रगतीपथावर आहे"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect हे Android सिस्टीमसह इंटिग्रेट केले जात आहे.\n\nतुमचा डेटा आणि परवानग्या ट्रान्सफर होत असताना याला वेळ लागू शकतो."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"तुम्हाला प्रक्रिया पूर्ण झाली आहे अशी सूचना मिळेपर्यंत अ‍ॅप बंद करू नका."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect चे इंटिग्रेशन प्रगतीपथावर आहे"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"अपडेट आवश्यक आहे"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect हे Android सिस्टीमसह इंटिग्रेट केले जात आहे, जेणेकरून तुम्ही ते तुमच्या सेटिंग्जमधून थेट ॲक्सेस करू शकता."</string>
     <string name="update_button" msgid="4544529019832009496">"अपडेट करा"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"हे अपडेट सुरू करा, जेणेकरून Health Connect हे तुमच्या सिस्टीम सेटिंग्जसह इंटिग्रेट करणे पुढे सुरू ठेवू शकते"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"आता अपडेट करा"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"सिस्टीम अपडेट करणे आवश्यक आहे"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"पुढे सुरू ठेवण्यापूर्वी, तुमच्या फोनची सिस्टीम अपडेट करा."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"तुम्ही तुमच्या फोनची सिस्टीम आधीच अपडेट केली असल्यास, इंटिग्रेशन पुढे सुरू ठेवण्यासाठी तुमचा फोन रीस्टार्ट करून पहा"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect अपडेट करणे आवश्यक आहे"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"पुढे सुरू ठेवण्यापूर्वी, Health Connect अ‍ॅप नवीनतम आवृत्तीवर अपडेट करा."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"आणखी जागा आवश्यक आहे"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"इंटिग्रेशन पुढे सुरू ठेवण्यासाठी Health Connect ला तुमच्या फोनवर <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> स्टोरेज जागा आवश्यक आहे.\n\nतुमच्या फोनवरील काही जागा साफ करा आणि नंतर पुन्हा प्रयत्न करा."</string>
     <string name="try_again_button" msgid="8745496819992160789">"पुन्हा प्रयत्न करा"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"जागा मोकळी करा"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"आणखी जागा आवश्यक आहे"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"इंटिग्रेट करणे पुढे सुरू ठेवण्यासाठी, Health Connect ला तुमच्या फोनवर <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> स्टोरेज जागा आवश्यक आहे."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"इंटिग्रेशन थांबवले आहे"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ॲप हे Android सिस्टीमसह इंटिग्रेट केले जात असताना बंद झाले.\n\nॲप पुन्हा उघडण्यासाठी पुन्हा सुरू करा वर क्लिक करा आणि तुमचा डेटा व परवानग्या ट्रान्सफर करणे पुढे सुरू ठेवा."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"तुमचा Health Connect डेटा ठेवण्यासाठी, ही <xliff:g id="TIME_NEEDED">%1$s</xliff:g> मध्ये पूर्ण करा"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect हे Android सिस्टीमसह इंटिग्रेट करणे पुढे सुरू ठेवण्यासाठी टॅप करा. तुमचा डेटा ठेवण्यासाठी, ही <xliff:g id="TIME_NEEDED">%1$s</xliff:g> मध्ये पूर्ण करा"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect हे Android सिस्टीमसह इंटिग्रेट करणे पुढे सुरू ठेवण्यासाठी टॅप करा."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"पुढे सुरू ठेवा"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect चे इंटिग्रेशन पुन्हा सुरू करा"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"तुमचा डेटा ठेवण्यासाठी, ही <xliff:g id="TIME_NEEDED">%1$s</xliff:g> मध्ये पूर्ण करा"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"अ‍ॅप अपडेट करणे आवश्यक आहे"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect सह सिंक करणे सुरू ठेवण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> अपडेट केलेले असणे आवश्यक आहे"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect सह सिंक करणे सुरू ठेवण्यासाठी काही अ‍ॅप्स अपडेट केलेली असणे आवश्यक आहे"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect सह सिंक करणे सुरू ठेवण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> अपडेट केलेले असणे आवश्यक आहे. सर्व अ‍ॅप्ससाठी अपडेट उपलब्ध नसू शकतात."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect सह सिंक करणे सुरू ठेवण्यासाठी काही अ‍ॅप्स अपडेट केलेली असणे आवश्यक आहे. सर्व अ‍ॅप्ससाठी अपडेट उपलब्ध नसू शकतात."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"अपडेट तपासा"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"अधिक जाणून घ्या"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect चे इंटिग्रेशन"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect चे इंटिग्रेशन पूर्ण झाले नाही"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"ते पुन्हा उपलब्ध झाल्यावर, तुम्हाला सूचना मिळेल."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"समजले"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect चे इंटिग्रेशन पूर्ण झाले नाही"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"आणखी वाचा"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect चे इंटिग्रेशन पूर्ण झाले"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"उघडा"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"नवीन काय आहे"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"तुम्ही आता थेट तुमच्या सेटिंग्जमधून Health Connect ॲक्सेस करू शकता. स्टोरेज जागा मोकळी करण्यासाठी Health Connect ॲप कधीही अनइंस्टॉल करा."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"समजले"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"अ‍ॅप स्रोत संपादित करा"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"डिव्हाइस डीफॉल्ट"</string>
     <string name="app_data_title" msgid="6499967982291000837">"अ‍ॅप डेटा"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect चा अ‍ॅक्सेस असलेल्या ॲप्सचा डेटा येथे दर्शवला जाईल"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> मधील डेटा इथे दिसेल"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect चा अ‍ॅक्सेस असलेल्या ॲप्सचा डेटा इथे दर्शवला जाईल"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"दिवस"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"आठवडा"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"महिना"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"मागील महिना"</string>
     <string name="tab_entries" msgid="3402700951602029493">"एंट्री"</string>
     <string name="tab_access" msgid="7818197975407243701">"अ‍ॅक्सेस करा"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी अतिरिक्त अ‍ॅक्सेसला अनुमती द्यायची आहे का?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला या Health Connect सेटिंग्जनादेखील अ‍ॅक्सेस करायचे आहे"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"या ॲपसाठी बॅकग्राउंड किंवा मागील डेटा ॲक्सेस करणे सुरू करण्यासाठी किमान एक रीड परवानगी सुरू करा"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"या ॲपसाठी बॅकग्राउंड अ‍ॅक्सेस सुरू करण्यासाठी किमान एक रीड परवानगी सुरू करा"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"या ॲपसाठी मागील डेटा अ‍ॅक्सेस सुरू करण्यासाठी किमान एक रीड परवानगी सुरू करा"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect वापरण्यास सुरुवात करा"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"अ‍ॅप्सदरम्यान आरोग्य आणि फिटनेससंबंधित डेटा शेअर करण्यासाठी तुमची सुरुवातीची अ‍ॅप्स सिंक करा"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"सेट करा"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"कंपॅटिबल अ‍ॅप्स पहा"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect द्वारे <xliff:g id="APP_NAME">%s</xliff:g> सह सिंक करण्यासाठी अधिक अ‍ॅप्स शोधा"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"अ‍ॅप स्टोअरवर पहा"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"स्क्रीन लॉक सेट करा"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"तुमच्या आरोग्यासंबंधित डेटाच्या अतिरिक्त सुरक्षेसाठी, या डिव्हाइससाठी पिन, पॅटर्न किंवा पासवर्ड सेट करा"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"स्क्रीन लॉक सेट करा"</string>
     <string name="select_all" msgid="837499881590001166">"सर्व निवडा"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"कनेक्ट केलेली अ‍ॅप्स यापुढे Health Connect मधील हा डेटा अ‍ॅक्सेस करू शकणार नाहीत"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"खूण केली आहे"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"खूण केली नाही"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"व्यायामाची योजना उपलब्ध आहे"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"पुढील दिवस"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"पुढील आठवडा"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"पुढील महिना"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"मागील दिवस"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"मागील आठवडा"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"मागील महिना"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"सर्व डेटा कायमचा हटवायचा आहे का?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"निवडलेला डेटा कायमचा हटवायचा आहे का?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g> चा सर्व डेटा कायमचा हटवायचा आहे का?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> या आठवड्यासाठीच्या <xliff:g id="APP_NAME">%1$s</xliff:g> च्या निवडलेल्या एंट्री कायमच्या हटवायच्या आहेत का?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> साठी <xliff:g id="APP_NAME">%1$s</xliff:g> च्या निवडलेल्या एंट्री कायमच्या हटवायच्या आहेत का?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ही <xliff:g id="APP_NAME">%s</xliff:g> ची एंट्री कायमची हटवायची आहे का?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> साठीचा सर्व <xliff:g id="DATA_TYPE">%1$s</xliff:g> डेटा कायमचा हटवायचा आहे का?"</string>
+    <string name="on" msgid="8266542510798355807">"सुरू आहे"</string>
+    <string name="off" msgid="6996623844428550649">"बंद आहे"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g> वाजता ॲक्सेस केले"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"काल <xliff:g id="TIME_DATE">%1$s</xliff:g> वाजता ॲक्सेस केले"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> ला <xliff:g id="TIME_DATE_1">%2$s</xliff:g> वाजता ॲक्सेस केले"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"नेहमी अनुमती द्या"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"निवडलेल्या अनुमती द्या"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ॲप वापरताना"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"सर्वांना नकार द्या"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> फिटनेस आणि स्वास्थ्याशी संबंधित डेटा अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ने <xliff:g id="DATA_TYPES">%2$s</xliff:g> अ‍ॅक्सेस करण्याची विनंती केली आहे.\n\nसर्वांना अनुमती देणे किंवा वैयक्तिकरित्या नियंत्रित करणे निवडा."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला <xliff:g id="DATA_TYPE">%2$s</xliff:g> अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"सुदृढता आणि स्वास्थ्य"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"पूर्ण वेळ"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"वापरत असताना"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"पूर्ण वेळ"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"वापरत असताना"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमचा सुदृढता आणि स्वास्थ्य यासंबंधित सर्व डेटा अ‍ॅक्सेस करू शकते <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"अ‍ॅक्सेस करण्याची अनुमती आहे"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"रीड करण्याची अनुमती आहे"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"या परवानग्या तुमच्या डिव्हाइस सेन्सरमधील <xliff:g id="APP_NAME">%1$s</xliff:g> डेटाचा अ‍ॅक्सेस देतात."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> पैकी <xliff:g id="NUMBER_0">%1$d</xliff:g> अ‍ॅप्सना परवानगी दिली आहे"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"कोणत्याही अ‍ॅपची विनंती नाही"</string>
+    <string name="allowed" msgid="4158456017482263737">"अनुमती आहे"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"अनुमती नाही"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ही परवानगी असलेली ॲप्स तुमच्या डिव्हाइस सेन्सरमधून <xliff:g id="DATA_TYPE">%s</xliff:g> डेटा अ‍ॅक्सेस करू शकतात."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"तुमच्या वॉचवरील सर्व ॲप्सचा <xliff:g id="DATA_TYPE">%s</xliff:g> ॲक्सेस काढून टाकायचा आहे का?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"बरोबरची खूण"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"फुलीची खूण"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"सध्या, <xliff:g id="APP_NAME">%1$s</xliff:g> हे आरोग्य आणि स्वास्थ्यासंबंधित डेटा <xliff:g id="ALLOW_MODE">%2$s</xliff:g> अ‍ॅक्सेस करू शकते"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला नेहमी आरोग्य आणि स्वास्थ्यासंबंधित डेटा अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला <xliff:g id="DATA_TYPES">%2$s</xliff:g> चा अ‍ॅक्सेस आहे."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"आरोग्य आणि स्वास्थ्यासंबंधित परवानग्या व्यवस्थापित करा"</string>
 </resources>
diff --git a/apk/res/values-ms/strings.xml b/apk/res/values-ms/strings.xml
index 6d57b62..5b7dc24 100644
--- a/apk/res/values-ms/strings.xml
+++ b/apk/res/values-ms/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Urus data kesihatan dan kecergasan pada peranti anda dan kawal apl yang boleh mengakses data tersebut"</string>
     <string name="data_title" msgid="4456619761533380816">"Data dan akses"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Semak imbas rekod kesihatan"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Lihat rekod kesihatan anda dan apl yang boleh mengakses data tersebut"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Semua kategori"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Lihat semua kategori"</string>
     <string name="no_data" msgid="1906986019249068659">"Tiada data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Semalam"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Baca: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Tulis: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Urus kebenaran"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Masa: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktiviti"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"akses data kesihatan anda"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Baca kalori yang dibakar"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Benarkan apl membaca kalori yang dibakar"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Akses data pada latar"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengakses data pada latar?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data pada latar?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Jika anda memberikan kebenaran, apl ini boleh mengakses data kecergasan dan kesejahteraan serta rekod kesihatan apabila anda tidak menggunakan apl."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Jika anda memberikan kebenaran, apl ini boleh mengakses rekod kesihatan apabila anda tidak menggunakan apl."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Jika anda memberikan kebenaran, apl ini boleh mengakses data kecergasan dan kesejahteraan apabila anda tidak menggunakan apl."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Jika anda memberikan kebenaran, apl ini boleh mengakses data Health Connect apabila anda tidak menggunakan apl."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data yang lalu?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Jika anda memberikan kebenaran, apl ini boleh mengakses data kecergasan dan kesejahteraan yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Jika anda memberikan kebenaran, apl ini boleh mengakses semua data kecergasan dan kesejahteraan yang lalu."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Jika anda memberikan kebenaran, apl ini boleh mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Jika anda memberikan kebenaran, apl ini boleh mengakses semua data Health Connect yang lalu."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Benarkan akses tambahan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> juga mahu mengakses tetapan Health Connect ini"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Akses semua data pada latar"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Akses rekod kesihatan pada latar"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Akses data kecergasan dan kesejahteraan pada latar"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Benarkan apl ini mengakses data kecergasan dan kesejahteraan serta rekod kesihatan apabila anda tidak menggunakan apl"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Benarkan apl ini mengakses data ini apabila anda tidak menggunakan apl"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Benarkan apl ini mengakses data ini apabila anda tidak menggunakan apl"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Akses data pada latar"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Benarkan apl ini mengakses data Health Connect apabila anda tidak menggunakan apl"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Akses data kecergasan dan kesejahteraan yang lalu"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Benarkan apl ini untuk mengakses data ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Benarkan apl ini untuk mengakses semua data yang lalu"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Akses data yang lalu"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Benarkan apl ini mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Benarkan apl ini mengakses semua data Health Connect yang lalu"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> sudah boleh mengakses data yang lalu untuk rekod kesihatan anda"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Baca lebih lanjut tentang kebenaran"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Akses semua data pada latar"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Akses rekod kesihatan pada latar"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Akses data kecergasan dan kesejahteraan pada latar"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Benarkan apl ini mengakses data kecergasan dan kesejahteraan serta rekod kesihatan apabila anda tidak menggunakan apl"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Benarkan apl ini mengakses data ini apabila anda tidak menggunakan apl"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Benarkan apl ini mengakses data ini apabila anda tidak menggunakan apl"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Akses data pada latar"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Benarkan apl ini mengakses data Health Connect apabila anda tidak menggunakan apl"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Akses data kecergasan dan kesejahteraan yang lalu"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Benarkan apl ini untuk mengakses data ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Benarkan apl ini untuk mengakses semua data yang lalu"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Akses data yang lalu"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Benarkan apl ini mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Benarkan apl ini mengakses semua data Health Connect yang lalu"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Tiada data kecergasan dibaca pada masa ini kerana tiada kebenaran baca yang dihidupkan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> sudah boleh mengakses data yang lalu untuk rekod kesihatan anda. Untuk menukar tetapan ini, matikan kebenaran rekod kesihatan untuk apl ini"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Urus kebenaran rekod kesihatan"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Dayakan sekurang-kurangnya satu kebenaran baca untuk menghidupkan latar atau akses data yang terdahulu bagi apl ini"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Dayakan sekurang-kurangnya satu kebenaran baca untuk menghidupkan akses latar bagi apl ini"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Dayakan sekurang-kurangnya satu kebenaran baca untuk menghidupkan akses data yang terdahulu bagi apl ini"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Benarkan apl ini mengakses semua data Health Connect yang lalu"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Benarkan apl ini mengakses data Health Connect apabila anda tidak menggunakan apl"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Jika anda memberikan kebenaran, apl ini boleh mengakses data Health Connect apabila anda tidak menggunakan apl."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Akses data yang lalu"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data yang lalu?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Benarkan apl ini mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Benarkan apl ini mengakses semua data Health Connect yang lalu"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Jika anda memberikan kebenaran, apl ini boleh mengakses data Health Connect yang ditambahkan sebelum <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Jika anda memberikan kebenaran, apl ini boleh mengakses semua data Health Connect yang lalu."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Kalori aktif yang dibakar"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"kalori aktif yang dibakar"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Baca kalori aktif yang dibakar"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"tolakan kerusi roda"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Baca tolakan kerusi roda"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Tulis tolakan kerusi roda"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Keamatan aktiviti"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"keamatan aktiviti"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Baca keamatan aktiviti"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Tulis keamatan aktiviti"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Kadar metabolisme asas"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"kadar metabolisme asas"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Baca kadar metabolisme asas"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"suhu kulit"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Baca suhu kulit"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Tulis suhu kulit"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Data ini termasuk semua rekod kesihatan yang disegerakkan dan ditambahkan pada Health Connect. Data ini mungkin bukan rekod perubatan penuh anda dan tidak termasuk perihalan perubatan rekod kesihatan anda."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Semua rekod kesihatan"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"semua rekod kesihatan"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Tulis semua rekod kesihatan"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alahan"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alahan"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Baca maklumat alahan"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Pengimunan"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"pengimunan"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Baca pengimunan"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Keputusan Makmal"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"keputusan makmal"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Baca keputusan makmal"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alahan"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alahan"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Baca maklumat alahan"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Masalah"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"masalah"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Baca masalah"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaksin"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaksin"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Baca data vaksin"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Keputusan makmal"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"keputusan makmal"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Baca keputusan makmal"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Ubat-ubatan"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ubat-ubatan"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Baca ubat-ubatan"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Butiran peribadi"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"butiran peribadi"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Baca butiran peribadi"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Butiran pengamal"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"butiran pengamal"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Baca butiran pengamal"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Kehamilan"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"kehamilan"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Baca kehamilan"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Masalah"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"masalah"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Baca masalah"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Prosedur"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"prosedur"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Baca prosedur"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sejarah Sosial"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sejarah sosial"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sejarah sosial"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Baca sejarah sosial"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Tanda Vital"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Lawatan"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"lawatan"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Baca lawatan"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Tanda vital"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"tanda vital"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Baca tanda vital"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Kesedaran minda"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Tulis data kesedaran minda"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Benarkan “<xliff:g id="APP_NAME">%1$s</xliff:g>” membaca"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Benarkan “<xliff:g id="APP_NAME">%1$s</xliff:g>” menulis"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Batal"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Benarkan"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Benarkan semua"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Jangan benarkan"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Pilih data yang anda ingin dibaca oleh apl atau tuliskan kepada Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Pilih data yang anda mahu dibaca oleh apl atau tuliskan kepada Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Pilih data yang anda mahu dibaca oleh apl ini daripada Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Pilih data yang anda mahu ditulis oleh apl ini pada Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Jika anda memberikan akses baca, apl tersebut boleh membaca data baharu dan data dari 30 hari yang lalu"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Jika anda memberikan akses baca, apl tersebut boleh membaca data baharu dan data yang lalu"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Anda boleh mengetahui cara <xliff:g id="APP_NAME">%1$s</xliff:g> mengendalikan data anda dalam <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> pembangun"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data kecergasan dan kesejahteraan?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Anda boleh mengetahui cara <xliff:g id="APP_NAME">%1$s</xliff:g> mengendalikan data anda dalam <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> mereka"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"dasar privasi"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengakses rekod kesihatan anda?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Jika anda memberikan akses, apl boleh membaca dan menulis data seperti alahan, keputusan makmal, vaksin dan banyak lagi\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Jika anda memberikan akses, apl boleh membaca data seperti alahan, keputusan makmal, vaksin dan banyak lagi\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Perihal rekod kesihatan"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data untuk berkongsi termasuk"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Jika anda memberikan kebenaran, <xliff:g id="APP_NAME">%1$s</xliff:g> boleh berkongsi rekod kesihatan anda dengan Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Segerakkan rekod kesihatan anda daripada apl dan sumber anda yang lain untuk menyimpan rekod kesihatan tersebut pada satu tempat"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Alih keluar semua kebenaran?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Alih keluar semua"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat membaca atau menulis apa-apa data lagi daripada Health Connect.\n\nKeadaan ini tidak akan menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat membaca atau menulis apa-apa data daripada Health Connect lagi, termasuk data yang terdahulu.\n\nKeadaan ini tidak akan menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti lokasi, kamera atau mikrofon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat membaca atau menulis apa-apa data daripada Health Connect lagi, termasuk data latar dan data yang terdahulu.\n\nKeadaan ini tidak akan menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti lokasi, kamera atau mikrofon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Padamkan juga data <xliff:g id="APP_NAME">%1$s</xliff:g> daripada Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Alih keluar semua kebenaran?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Alih keluar semua kebenaran rekod kesihatan?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Alih keluar semua kebenaran kecergasan dan kesejahteraan?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Padamkan juga data kecergasan daripada <xliff:g id="APP_NAME">%1$s</xliff:g> melalui Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Alih keluar semua kebenaran rekod kesihatan?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Padamkan juga rekod kesihatan daripada <xliff:g id="APP_NAME">%1$s</xliff:g> melalui Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak akan dapat membaca atau menulis data ini daripada Health Connect lagi.\n\nKeadaan ini tidak menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak akan dapat membaca atau menulis data ini daripada Health Connect lagi, termasuk data latar.\n\nKeadaan ini tidak menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak akan dapat membaca atau menulis data ini daripada Health Connect lagi, termasuk data yang terdahulu.\n\nKeadaan ini tidak menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak akan dapat membaca atau menulis data ini daripada Health Connect lagi, termasuk data latar dan data yang terdahulu.\n\nKeadaan ini tidak menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Alih keluar semua kebenaran?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat membaca atau menulis data daripada Health Connect lagi.\n\nKeadaan ini tidak akan menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat membaca atau menulis data daripada Health Connect lagi, termasuk data latar.\n\nKeadaan ini tidak akan menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat membaca atau menulis data daripada Health Connect lagi, termasuk data yang terdahulu.\n\nKeadaan ini tidak akan menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat membaca atau menulis data daripada Health Connect lagi, termasuk data latar dan data yang terdahulu.\n\nKeadaan ini tidak akan menjejaskan kebenaran lain yang mungkin terdapat pada apl ini, seperti kamera, mikrofon atau lokasi."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Padamkan juga data kecergasan dan rekod kesihatan daripada <xliff:g id="APP_NAME">%1$s</xliff:g> melalui Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Kebenaran dialih keluar untuk apl ini"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Padamkan juga semua data Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Hari berikutnya"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Hari yang dipilih"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Hari sebelumnya"</string>
     <string name="default_error" msgid="7966868260616403475">"Kesilapan telah berlaku. Sila cuba lagi."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Sumber Tidak Diketahui"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Data sumber"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Kurungan terbuka."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Kurungan tertutup."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Nilai Medan <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Apl ini tidak lagi mempunyai akses, tetapi masih mempunyai data yang disimpan dalam Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> boleh membaca data yang ditambahkan selepas <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Untuk mengurus kebenaran Android lain yang boleh diakses oleh apl ini, pergi ke Tetapan &gt; Apl"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data yang anda kongsi dengan <xliff:g id="APP_NAME">%1$s</xliff:g> dilindungi oleh dasar privasi apl tersebut"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Anda boleh mengetahui cara <xliff:g id="APP_NAME">%1$s</xliff:g> mengendalikan data anda dalam dasar privasi pembangun"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Untuk mengurus kebenaran Android lain yang boleh diakses oleh apl ini, pergi ke Tetapan, kemudian ketik Apl"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Baca dasar privasi"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Diakses dalam tempoh 24 jam yang lalu"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Akses apl"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Anda tidak mempunyai apa-apa apl serasi terpasang pada masa ini"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Akses tambahan"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Data terdahulu, data latar"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Kebenaran tambahan bagi apl ini dialih keluar"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Kebenaran"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Kecergasan dan kesejahteraan"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Senaman, tidur, pemakanan dan lain-lain"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Rekod kesihatan"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"rekod kesihatan"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Keputusan makmal, ubat, imunisasi dll"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Keputusan makmal, ubat, vaksin dll"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Kebenaran apl yang dialih keluar"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect mengalih keluar kebenaran untuk <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect mengalih keluar kebenaran untuk <xliff:g id="APP_DATA_0">%1$s</xliff:g> dan <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Akses Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Bermula dengan Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect menyimpan data kesihatan dan kecergasan anda, menyediakan cara yang mudah untuk menyegerakkan pelbagai apl pada peranti anda"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect menyimpan dan menyegerakkan data kesihatan dan kecergasan anda daripada apl yang berbeza.\n\n"<b>"Data kecergasan dan kesejahteraan,"</b>" termasuk sesi senaman, langkah, nutrisi, tidur dan banyak lagi\n\n"<b>"Rekod kesihatan,"</b>" termasuk vaksin, keputusan makmal dan banyak lagi"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Dengan Health Connect, anda boleh"</string>
     <string name="share_data" msgid="3481932156368883946">"Kongsi data dengan apl anda"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Pilih data yang boleh dibaca atau ditulis oleh setiap apl pada Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Urus tetapan dan privasi anda"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Aliran ringan"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Aliran sederhana"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Aliran banyak"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Aliran tidak diketahui"</string>
     <string name="period_day" msgid="3821944462093965882">"Haid hari ke-<xliff:g id="DAY">%1$d</xliff:g> daripada <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Haid (1 hari)}other{Haid (# hari)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positif"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatif"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Tinggi"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muzik"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Lain-lain"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Tanpa bimbingan"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Sederhana"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Cergas"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>j <xliff:g id="MIN">%2$s</xliff:g>m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>j"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Penyepaduan dalam proses"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect sedang disepadukan dengan sistem Android.\n\nProses ini mungkin mengambil sedikit masa sementara data dan kebenaran anda dipindahkan."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Jangan tutup apl sehingga anda menerima pemberitahuan bahawa proses telah selesai."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Penyepaduan Health Connect dalam proses"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Kemaskinian diperlukan"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect sedang disepadukan dengan sistem Android agar anda dapat mengakses Health Connect terus daripada tetapan anda."</string>
     <string name="update_button" msgid="4544529019832009496">"Kemas kinikan"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Mulakan kemaskinian ini agar Health Connect boleh meneruskan proses penyepaduan dengan tetapan sistem anda"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Kemas kinikan sekarang"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Kemaskinian keselamatan diperlukan"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Sebelum meneruskan proses, kemas kinikan sistem telefon anda."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Jika anda telah mengemaskinikan sistem telefon anda, cuba mulakan semula telefon anda untuk meneruskan proses penyepaduan"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Kemaskinian Health Connect diperlukan"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Sebelum meneruskan proses, kemas kinikan apl Health Connect kepada versi yang terbaharu."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Lagi ruang diperlukan"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect memerlukan <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ruang storan pada telefon anda untuk meneruskan proses penyepaduan.\n\nKosongkan beberapa ruang pada telefon anda dan kemudian cuba lagi."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Cuba lagi"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Kosongkan ruang"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Lagi ruang diperlukan"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect memerlukan <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ruang storan pada telefon anda untuk meneruskan proses penyepaduan."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Penyepaduan dijeda"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Apl Health Connect ditutup semasa apl ini disepadukan dengan sistem Android.\n\nKlik sambung semula untuk membuka semula apl dan meneruskan proses pemindahan data dan kebenaran anda."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Untuk menyimpan data Health Connect anda, selesaikan penghijrahan ini dalam masa <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Ketik untuk meneruskan proses penyepaduan Health Connect dengan sistem Android. Untuk menyimpan data anda, selesaikan penyepaduan ini dalam masa <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Ketik untuk meneruskan proses penyepaduan Health Connect dengan sistem Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Teruskan"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Sambung semula penyepaduan Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Untuk menyimpan data anda, selesaikan penyepaduan ini dalam masa <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Kemaskinian apl diperlukan"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> perlu dikemaskinikan untuk terus disegerakkan dengan Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Sesetengah apl perlu dikemaskinikan untuk terus disegerakkan dengan Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> perlu dikemaskinikan untuk terus disegerakkan dengan Health Connect. Kemaskinian mungkin tidak tersedia untuk semua apl."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Sesetengah apl perlu dikemaskinikan untuk terus disegerakkan dengan Health Connect. Kemaskinian mungkin tidak tersedia untuk semua apl."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Semak kemaskinian"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Ketahui lebih lanjut"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Penyepaduan Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Penyepaduan Health Connect tidak lengkap"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Anda akan menerima pemberitahuan apabila penyepaduan tersedia semula."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Penyepaduan Health Connect tidak lengkap"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Baca lagi"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Penyepaduan Health Connect selesai"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Buka"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Ciri baharu"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Kini anda boleh mengakses Health Connect terus daripada tetapan anda. Nyahpasang apl Health Connect pada bila-bila masa untuk mengosongkan ruang storan."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Edit sumber apl"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Lalai peranti"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Data apl"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data daripada apl dengan akses kepada Health Connect akan dipaparkan di sini"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data daripada <xliff:g id="APP_NAME">%1$s</xliff:g> akan dipaparkan di sini"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data daripada apl dengan akses kepada Health Connect akan dipaparkan di sini"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Hari"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Minggu"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Bulan"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Bulan lepas"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entri"</string>
     <string name="tab_access" msgid="7818197975407243701">"Akses"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Benarkan akses tambahan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> juga mahu mengakses tetapan Health Connect ini"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Dayakan sekurang-kurangnya satu kebenaran baca untuk menghidupkan latar atau akses data yang terdahulu bagi apl ini"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Dayakan sekurang-kurangnya satu kebenaran baca untuk menghidupkan akses latar bagi apl ini"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Dayakan sekurang-kurangnya satu kebenaran baca untuk menghidupkan akses data yang terdahulu bagi apl ini"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Mula menggunakan Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Segerakkan apl pertama anda untuk berkongsi data kesihatan dan kecergasan antara apl tersebut"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Sediakan"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Lihat apl yang serasi"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Cari lebih banyak apl untuk disegerakkan dengan <xliff:g id="APP_NAME">%s</xliff:g> melalui Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Lihat pada gedung apl"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Tetapkan kunci skrin"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Untuk keselamatan tambahan bagi data kesihatan anda, tetapkan PIN, corak atau kata laluan untuk peranti ini"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Tetapkan kunci skrin"</string>
     <string name="select_all" msgid="837499881590001166">"Pilih semua"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Apl yang disambungkan tidak akan dapat membaca data ini lagi daripada Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Ditandai"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Tidak ditandai"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Laluan peta senaman tersedia"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Hari berikutnya"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Minggu seterusnya"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Bulan seterusnya"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Hari sebelumnya"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Minggu sebelumnya"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Bulan sebelumnya"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Padamkan semua data secara kekal?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Padamkan data yang dipilih secara kekal?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Padamkan semua data <xliff:g id="APP_NAME">%s</xliff:g> secara kekal?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Padamkan entri <xliff:g id="APP_NAME">%1$s</xliff:g> yang dipilih untuk minggu <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> secara kekal?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Padamkan entri <xliff:g id="APP_NAME">%1$s</xliff:g> yang dipilih untuk <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> secara kekal?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Padamkan entri <xliff:g id="APP_NAME">%s</xliff:g> ini secara kekal?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Padamkan data <xliff:g id="DATA_TYPE">%1$s</xliff:g> untuk <xliff:g id="APP_NAME">%2$s</xliff:g> secara kekal?"</string>
+    <string name="on" msgid="8266542510798355807">"Hidup"</string>
+    <string name="off" msgid="6996623844428550649">"Mati"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Diakses <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Diakses semalam <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Diakses <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Benarkan sepanjang masa"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Benarkan kebenaran yang dipilih"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Semasa menggunakan apl"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Nafikan semua"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses data kecergasan dan kesejahteraan?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta akses kepada <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nPilih untuk membenarkan semua akses atau mengawal akses secara berasingan."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Benarkan <xliff:g id="APP_NAME">%1$s</xliff:g> mengakses <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Kecergasan dan kesejahteraan"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sepanjang masa"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"semasa digunakan"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sepanjang masa"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Semasa digunakan"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> boleh mengakses semua data kecergasan dan kesejahteraan anda <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Dibenarkan untuk mengakses"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Dibenarkan untuk membaca"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Kebenaran ini memberi <xliff:g id="APP_NAME">%1$s</xliff:g> akses kepada data daripada penderia peranti anda."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> daripada <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apl dibenarkan"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Tiada apl yang membuat permintaan"</string>
+    <string name="allowed" msgid="4158456017482263737">"Dibenarkan"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Tidak dibenarkan"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apl dengan kebenaran ini boleh mengakses data <xliff:g id="DATA_TYPE">%s</xliff:g> daripada penderia peranti anda."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Alih keluar akses <xliff:g id="DATA_TYPE">%s</xliff:g> untuk semua apl pada jam tangan anda?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Tanda semak"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Tanda silang"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Pada masa ini, <xliff:g id="APP_NAME">%1$s</xliff:g> boleh mengakses data kecergasan dan kesejahteraan <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Benarkan akses <xliff:g id="APP_NAME">%1$s</xliff:g> kepada data kecergasan dan kesejahteraan sepanjang masa?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> memiliki akses kepada <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Urus kebenaran kecergasan dan kesejahteraan"</string>
 </resources>
diff --git a/apk/res/values-my/strings.xml b/apk/res/values-my/strings.xml
index f5c665d..8696ca1 100644
--- a/apk/res/values-my/strings.xml
+++ b/apk/res/values-my/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ကျန်းမာရေးနှင့် ကြံ့ခိုင်ရေးဒေတာကို သင့်စက်တွင် စီမံပြီး ၎င်းအားသုံးနိုင်သည့် အက်ပ်များကို သတ်မှတ်နိုင်သည်"</string>
     <string name="data_title" msgid="4456619761533380816">"ဒေတာနှင့် သုံးခွင့်"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"ကျန်းမာရေး မှတ်တမ်းများ ကြည့်ရန်"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"သင့်ကျန်းမာရေး မှတ်တမ်းနှင့် ၎င်းတို့ကို ဝင်သုံးနိုင်သည့် အက်ပ်များကို ကြည့်နိုင်သည်"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"အမျိုးအစားအားလုံး"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"အမျိုးအစားအားလုံး ကြည့်ရန်"</string>
     <string name="no_data" msgid="1906986019249068659">"ဒေတာမရှိပါ"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"မနေ့က"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"ဖတ်ရန်- <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"ရေးရန်- <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"၊ "</string>
+    <string name="separator" msgid="5521285473288943819">"၊ "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"ခွင့်ပြုချက်များကို စီမံရန်"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"အချိန်- <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"လှုပ်ရှားမှု"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ကျန်းမာရေးဒေတာကို သုံးနိုင်သည်"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"လောင်ကျွမ်းသောကယ်လိုရီဖတ်ခြင်း"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"အက်ပ်ကို လောင်ကျွမ်းသွားသော ကယ်လိုရီများ ဖတ်ခွင့်ပေးသည်"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"နောက်ခံတွင် ဒေတာသုံးခြင်း"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား နောက်ခံတွင် ဒေတာ သုံးခွင့်ပြုမလား။"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား နောက်ခံတွင် ဒေတာသုံးခွင့်ပြုမလား။"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"ခွင့်ပြုပါက ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းက ကျန်းမာကြံ့ခိုင်ရေးဒေတာနှင့် ကျန်းမာရေး မှတ်တမ်းများကို သုံးနိုင်သည်။"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"ခွင့်ပြုပါက ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းက ကျန်းမာရေး မှတ်တမ်းများကို သုံးနိုင်သည်။"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"ခွင့်ပြုပါက ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းက ကျန်းမာကြံ့ခိုင်ရေးဒေတာကို သုံးနိုင်သည်။"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"ခွင့်ပြုပါက ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းက Health Connect ဒေတာကို သုံးနိုင်သည်။"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား ယခင်ဒေတာ သုံးခွင့်ပြုမလား။"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"ခွင့်ပြုပါက ဤအက်ပ်သည် <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> မတိုင်မီ ထည့်ထားသော ကျန်းမာကြံ့ခိုင်ရေးဒေတာကို သုံးနိုင်သည်။"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"ခွင့်ပြုပါက ဤအက်ပ်သည် ယခင် ကျန်းမာကြံ့ခိုင်ရေးဒေတာအားလုံးကို သုံးနိုင်သည်။"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"ခွင့်ပြုပါက ဤအက်ပ်သည် <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> မတိုင်မီ ထည့်ထားသော Health Connect ဒေတာကို သုံးနိုင်သည်။"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"ခွင့်ပြုပါက ဤအက်ပ်သည် ယခင် Health Connect ဒေတာအားလုံးကို သုံးနိုင်သည်။"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် ထပ်ဆောင်းသုံးခွင့်ပြုမလား။"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် ဤ Health Connect ဆက်တင်များကိုလည်း သုံးလိုသည်"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"နောက်ခံတွင် ဒေတာအားလုံးကို သုံးခြင်း"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"နောက်ခံတွင် ကျန်းမာရေး မှတ်တမ်းများကို သုံးခြင်း"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"နောက်ခံတွင် ကျန်းမာကြံ့ခိုင်ရေးဒေတာကို သုံးခြင်း"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းအား ကျန်းမာကြံ့ခိုင်ရေးဒေတာနှင့် ကျန်းမာရေး မှတ်တမ်းဒေတာတို့ကို သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းအား ဤဒေတာကို သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းအား ဤဒေတာကို သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"နောက်ခံတွင် ဒေတာသုံးခြင်း"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းအား Health Connect ဒေတာကို သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ယခင်ကျန်းမာကြံ့ခိုင်ရေးဒေတာများကို သုံးခြင်း"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> မတိုင်မီ ထည့်ထားသော ဒေတာကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"ယခင်ဒေတာအားလုံးကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"ယခင်ဒေတာ သုံးခြင်း"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> မတိုင်မီ ထည့်ထားသော Health Connect ဒေတာကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"ယခင် Health Connect ဒေတာအားလုံးကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်ကျန်းမာရေး မှတ်တမ်းများ၏ ယခင်ဒေတာကို သုံးနိုင်နေပြီဖြစ်သည်"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"ခွင့်ပြုချက်များအကြောင်း ပိုမိုဖတ်ရှုရန်"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"နောက်ခံတွင် ဒေတာအားလုံးကို သုံးခြင်း"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"နောက်ခံတွင် ကျန်းမာရေး မှတ်တမ်းများကို သုံးခြင်း"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"နောက်ခံတွင် ကျန်းမာကြံ့ခိုင်ရေးဒေတာကို သုံးခြင်း"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းအား ကျန်းမာကြံ့ခိုင်ရေးဒေတာနှင့် ကျန်းမာရေး မှတ်တမ်းဒေတာတို့ကို သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းအား ဤဒေတာကို သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းအား ဤဒေတာကို သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"နောက်ခံတွင် ဒေတာသုံးခြင်း"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"ဤအက်ပ်ကို သင်အသုံးမပြုချိန်တွင် ၎င်းအား Health Connect ဒေတာကို သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ယခင်ကျန်းမာကြံ့ခိုင်ရေးဒေတာများကို သုံးခြင်း"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> မတိုင်မီ ထည့်ထားသော ဒေတာကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"ယခင်ဒေတာအားလုံးကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"ယခင်ဒေတာ သုံးခြင်း"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> မတိုင်မီ ထည့်ထားသော Health Connect ဒေတာကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Health Connect ယခင်ဒေတာအားလုံးကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> တွင် ဖတ်ခွင့်ဖွင့်မထားသဖြင့် လက်ရှိဖတ်နေသည့် ကြံ့ခိုင်မှု ဒေတာ မရှိပါ"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်ကျန်းမာရေးမှတ်တမ်းများ၏ ယခင်ဒေတာများကို သုံးနိုင်ပါပြီ။ ၎င်းကိုပြောင်းရန် ဤအက်ပ်အတွက် ကျန်းမာရေးမှတ်တမ်းခွင့်ပြုချက်များကို ပိတ်ပါ"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"ကျန်းမာရေးမှတ်တမ်းခွင့်ပြုချက် စီမံရန်"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ဤအက်ပ်အတွက် နောက်ခံတွင်အသုံးပြုသောဒေတာ (သို့) ယခင်ဒေတာသုံးခွင့် ဖွင့်ရန် အနည်းဆုံး ဖတ်ခွင့်တစ်ခုပေးပါ"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ဤအက်ပ်အတွက် နောက်ကွယ်၌ အသုံးပြုခွင့် ဖွင့်ရန် အနည်းဆုံး ဖတ်ခွင့်တစ်ခုပေးပါ"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ဤအက်ပ်အတွက် ယခင်ဒေတာသုံးခွင့် ဖွင့်ရန် အနည်းဆုံး ဖတ်ခွင့်တစ်ခု ပေးပါ"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"ယခင် Health Connect ဒေတာအားလုံးကို ဤအက်ပ်အား သုံးခွင့်ပြုနိုင်သည်"</string>
     <string name="background_read_description" msgid="3203594555849969283">"ဤအက်ပ်ကို အသုံးမပြုချိန်တွင် ၎င်းအား Health Connect ဒေတာ သုံးခွင့်ပြုနိုင်သည်"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ခွင့်ပြုပါက ဤအက်ပ်ကို အသုံးမပြုချိန်တွင် ၎င်းသည် Health Connect ဒေတာ သုံးနိုင်သည်။"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"ယခင်ဒေတာ သုံးခွင့်"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား ယခင်ဒေတာ သုံးခွင့်ပြုမလား။"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"ဤအက်ပ်ကို <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> မတိုင်မီ ထည့်ထားသော Health Connect ဒေတာ သုံးခွင့်ပြုနိုင်သည်"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"ဤအက်ပ်ကို ယခင် Health Connect ဒေတာအားလုံး သုံးခွင့်ပြုနိုင်သည်"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ခွင့်ပြုပါက ဤအက်ပ်သည် <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> မတိုင်မီ ထည့်ထားသော Health Connect ဒေတာ သုံးနိုင်သည်။"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ခွင့်ပြုပါက ဤအက်ပ်သည် ယခင် Health Connect ဒေတာအားလုံးကို သုံးနိုင်သည်။"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"လောင်ကျွမ်းသည့် လှုပ်ရှားကယ်လိုရီ"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"လောင်ကျွမ်းသည့် လှုပ်ရှားကယ်လိုရီ"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"လောင်ကျွမ်းသည့် လှုပ်ရှားကယ်လိုရီကို ဖတ်ရန်"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ဘီးတပ်ခုံတွန်းသည့် အရေအတွက်"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"ဘီးတပ်ခုံတွန်းသည့် အရေအတွက်ကို ဖတ်ရန်"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"ဘီးတပ်ခုံ တွန်းသည့်အရေအတွက်ကို ရေးရန်"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"လှုပ်ရှားမှုပြင်းထန်ခြင်း"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"လှုပ်ရှားမှုပြင်းထန်ခြင်း"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"လှုပ်ရှားမှုပြင်းထန်ခြင်းကို ဖတ်ရန်"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"လှုပ်ရှားမှုပြင်းထန်ခြင်းကို ရေးရန်"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"နားနေစဉ် ဇီဝတွင်း ဖြစ်ပျက်မှုနှုန်း"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"နားနေစဉ် ဇီဝတွင်း ဖြစ်ပျက်မှုနှုန်း"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"နားနေစဉ် ဇီဝတွင်း ဖြစ်ပျက်မှုနှုန်းကို ဖတ်ရန်"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"အရေပြားအပူချိန်"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"အရေပြားအပူချိန် ဖတ်ရန်"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"အရေပြားအပူချိန် ရေးရန်"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"၎င်းတွင် Health Connect ရှိ စင့်ခ်လုပ်ထားသော၊ ထည့်ထားသော ကျန်းမာရေး မှတ်တမ်းအားလုံး ပါဝင်သည်။ ၎င်းသည် သင်၏ကျန်းမာရေး မှတ်တမ်းအပြည့်အစုံ မဟုတ်နိုင်သည့်အပြင် သင့်ကျန်းမာရေး မှတ်တမ်းများ၏ ကုသမှုဆိုင်ရာဖော်ပြချက် မပါဝင်ပါ။"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"ကျန်းမာရေး မှတ်တမ်းအားလုံး"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"ကျန်းမာရေး မှတ်တမ်းအားလုံး"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"ကျန်းမာရေး မှတ်တမ်းအားလုံးကို ရေးရန်"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"ဓာတ်မတည့်မှုများ"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ဓာတ်မတည့်မှုများ"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"ဓာတ်မတည့်မှုများကို ဖတ်ရန်"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ကာကွယ်ဆေးထိုးခြင်း"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ကာကွယ်ဆေးထိုးခြင်း"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"ကာကွယ်ဆေးထိုးခြင်းကို ဖတ်ရန်"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ဓာတ်ခွဲခန်း ရလဒ်များ"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ဓာတ်ခွဲခန်း ရလဒ်များ"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ဓာတ်ခွဲခန်း ရလဒ်များကို ဖတ်ရန်"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"ဓာတ်မတည့်မှုများ"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ဓာတ်မတည့်မှုများ"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"ဓာတ်မတည့်မှုများကို ဖတ်ရန်"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"အခြေအနေများ"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"အခြေအနေများ"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"အခြေအနေများကို ဖတ်ရန်"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ကာကွယ်ဆေးများ"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ကာကွယ်ဆေးများ"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ကာကွယ်ဆေးများကို ဖတ်ရန်"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ဓာတ်ခွဲခန်းရလဒ်များ"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ဓာတ်ခွဲခန်းရလဒ်များ"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ဓာတ်ခွဲခန်းရလဒ်များကို ဖတ်ရန်"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ဆေးဝါးများ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ဆေးဝါးများ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ဆေးဝါးများအကြောင်း ဖတ်ရန်"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ကိုယ်ရေးကိုယ်တာ အချက်အလက်"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ကိုယ်ရေးကိုယ်တာ အချက်အလက်"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"ကိုယ်ရေးကိုယ်တာ အချက်အလက်ကို ဖတ်ရန်"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"ဆေးပညာကျွမ်းကျင်သူ၏ အသေးစိတ်အချက်အလက်"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"ဆေးပညာကျွမ်းကျင်သူ၏ အသေးစိတ်အချက်အလက်"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"ဆေးပညာကျွမ်းကျင်သူ၏ အသေးစိတ်အချက်အလက်ကို ဖတ်ရန်"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ကိုယ်ဝန်ဆောင်ခြင်း"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ကိုယ်ဝန်ဆောင်ခြင်း"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ကိုယ်ဝန်ဆောင်ခြင်းကို ဖတ်ရန်"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ပြဿနာများ"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ပြဿနာများ"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"ပြဿနာများကို ဖတ်ရန်"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"လုပ်ငန်းစဉ်များ"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"လုပ်ငန်းစဉ်များ"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"လုပ်ငန်းစဉ်များကို ဖတ်ရန်"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"လူနေမှုမှတ်တမ်း"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"လူမှုမှတ်တမ်း"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"လူနေမှုမှတ်တမ်း"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"လူနေမှုမှတ်တမ်းကို ဖတ်ရန်"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"အဓိကကိုယ်တွင်းအင်္ဂါအခြေအနေ လက္ခဏာများ"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"သွားရောက်မှုများ"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"သွားရောက်မှုများ"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"သွားရောက်မှုများကို ဖတ်ရန်"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"အဓိကကိုယ်တွင်းအင်္ဂါအခြေအနေ လက္ခဏာများ"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"အဓိကကိုယ်တွင်းအင်္ဂါအခြေအနေ လက္ခဏာများ"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"အဓိကကိုယ်တွင်းအင်္ဂါအခြေအနေ လက္ခဏာများကို ဖတ်ရန်"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"သတိရှိမှု"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"သတိရှိမှုစက်ရှင် ဒေတာရေးရန်"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ကို ဖတ်ခွင့်ပြုခြင်း"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ကို ရေးခွင့်ပြုခြင်း"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"မလုပ်တော့"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"ခွင့်ပြုရန်"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"အားလုံး ခွင့်ပြုရန်"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"ခွင့်မပြုပါ"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Health Connect တွင် ဤအက်ပ်ကို ဖတ်စေ (သို့) ရေးထည့်စေလိုသော ဒေတာ ရွေးပါ"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Health Connect တွင် ဤအက်ပ်အား ဖတ်စေ (သို့) ရေးစေလိုသော ဒေတာကို ရွေးပါ"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connect တွင် ဤအက်ပ်အား ဖတ်စေလိုသော ဒေတာကို ရွေးပါ"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Health Connect တွင် ဤအက်ပ်အား ရေးစေလိုသော ဒေတာကို ရွေးပါ"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"ဖတ်ခွင့်ပေးပါက အက်ပ်သည် ဒေတာအသစ်နှင့် ပြီးခဲ့သော ရက် ၃၀ မှ ဒေတာများကို ဖတ်နိုင်သည်"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"ဖတ်ခွင့်ပေးပါက အက်ပ်သည် ဒေတာအသစ်နှင့် ယခင်ဒေတာများကို ဖတ်နိုင်သည်"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို Health Connect သုံးခွင့်ပေးမလား။"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> က သင့်ဒေတာအား စီမံဆောင်ရွက်ပုံကို ဆော့ဖ်ဝဲရေးသူ၏ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> တွင် လေ့လာနိုင်သည်"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား ကျန်းမာကြံ့ခိုင်ရေးဒေတာကို သုံးခွင့်ပြုမလား။"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> က သင့်ဒေတာအား စီမံဆောင်ရွက်ပုံကို ၎င်း၏ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> တွင် လေ့လာနိုင်သည်"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒ"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား သင့်ကျန်းမာရေးမှတ်တမ်းများကို သုံးခွင့်ပြုမလား။"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"သုံးခွင့်ပြုပါက ဤအက်ပ်သည် ဓာတ်မတည့်မှု၊ ဓာတ်ခွဲခန်းအဖြေ၊ ကာကွယ်ဆေးများ စသည်တို့ကဲ့သို့ ဒေတာကို ဖတ်နိုင်၊ ရေးနိုင်သည်\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"သုံးခွင့်ပြုပါက ဤအက်ပ်သည် ဓာတ်မတည့်မှု၊ ဓာတ်ခွဲခန်းအဖြေ၊ ကာကွယ်ဆေးများ စသည်တို့ကဲ့သို့ ဒေတာကို ဖတ်နိုင်သည်\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ကျန်းမာရေး မှတ်တမ်းများအကြောင်း"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"မျှဝေမည့်ဒေတာတွင် ပါဝင်သည်များ-"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"ခွင့်ပြုပါက <xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်ကျန်းမာရေး မှတ်တမ်းများကို Health Connect နှင့် မျှဝေနိုင်သည်။"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"သင့်အက်ပ်နှင့် ရင်းမြစ်အမျိုးမျိုးမှ ကျန်းမာရေးမှတ်တမ်းများကို တစ်နေရာတည်းတွင် သိမ်းရန် စင့်ခ်လုပ်ပါ"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"ခွင့်ပြုချက်အားလုံး ဖယ်ရှားမလား။"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"အားလုံး ဖယ်ရှားရန်"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် Health Connect မှ ဒေတာများကို ဖတ်နိုင် (သို့) ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များပေါ် သက်ရောက်မှုမရှိပါ။"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် ယခင်ဒေတာအပါအဝင် Health Connect မှ ဒေတာများကို ဖတ်နိုင် (သို့) ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော တည်နေရာ၊ ကင်မရာ (သို့) မိုက်ခရိုဖုန်းကဲ့သို့ အခြားခွင့်ပြုချက်များပေါ် သက်ရောက်မှုမရှိပါ။"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် နောက်ခံတွင်အသုံးပြုသောဒေတာနှင့် ယခင်ဒေတာအပါအဝင် Health Connect မှ ဒေတာများကို ဖတ်နိုင် (သို့) ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော တည်နေရာ၊ ကင်မရာ (သို့) မိုက်ခရိုဖုန်းကဲ့သို့ အခြားခွင့်ပြုချက်များပေါ် သက်ရောက်မှုမရှိပါ။"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect မှ <xliff:g id="APP_NAME">%1$s</xliff:g> ဒေတာကိုလည်း ဖျက်ရန်"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ခွင့်ပြုချက်အားလုံး ဖယ်ရှားမလား။"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ကျန်းမာရေး မှတ်တမ်း ခွင့်ပြုချက်အားလုံးကို ဖယ်ရှားမလား။"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ကျန်းမာကြံ့ခိုင်ရေး ခွင့်ပြုချက်အားလုံးကို ဖယ်ရှားမလား။"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connect မှ <xliff:g id="APP_NAME">%1$s</xliff:g> ရှိ ကြံ့ခိုင်မှု ဒေတာကိုလည်း ဖျက်ရန်"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ကျန်းမာရေး မှတ်တမ်း ခွင့်ပြုချက်အားလုံးကို ဖယ်ရှားမလား။"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connect မှ <xliff:g id="APP_NAME">%1$s</xliff:g> ရှိ ကျန်းမာရေး မှတ်တမ်းများကိုလည်း ဖျက်ရန်"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် Health Connect မှ ဤဒေတာများကို ဖတ်နိုင်၊ ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များပေါ် သက်ရောက်မှုမရှိပါ။"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် နောက်ခံတွင်အသုံးပြုသောဒေတာ အပါအဝင် Health Connect မှ ဤဒေတာများကို ဖတ်နိုင်၊ ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များပေါ် သက်ရောက်မှုမရှိပါ။"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် ယခင်ဒေတာ အပါအဝင် Health Connect မှ ဤဒေတာများကို ဖတ်နိုင်၊ ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များအပေါ် သက်ရောက်မှုမရှိပါ။"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် နောက်ခံတွင်အသုံးပြုသောဒေတာနှင့် ယခင်ဒေတာ အပါအဝင် Health Connect မှ ဤဒေတာများကို ဖတ်နိုင်၊ ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များအပေါ် သက်ရောက်မှုမရှိပါ။"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ခွင့်ပြုချက်အားလုံး ဖယ်ရှားမလား။"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် Health Connect မှ ဒေတာများကို ဖတ်နိုင် (သို့) ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များပေါ် သက်ရောက်မှုမရှိပါ။"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် နောက်ခံတွင်အသုံးပြုသောဒေတာ အပါအဝင် Health Connect မှ ဒေတာများကို ဖတ်နိုင် (သို့) ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များပေါ် သက်ရောက်မှုမရှိပါ။"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် ယခင်ဒေတာ အပါအဝင် Health Connect မှ ဒေတာများကို ဖတ်နိုင် (သို့) ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များအပေါ် သက်ရောက်မှုမရှိပါ။"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် နောက်ခံတွင်အသုံးပြုသောဒေတာနှင့် ယခင်ဒေတာ အပါအဝင် Health Connect မှ ဒေတာများကို ဖတ်နိုင် (သို့) ရေးနိုင်တော့မည် မဟုတ်ပါ။\n\n၎င်းသည် ဤအက်ပ်တွင်ရှိနိုင်သော ကင်မရာ၊ မိုက်ခရိုဖုန်း (သို့) တည်နေရာကဲ့သို့ အခြားခွင့်ပြုချက်များအပေါ် သက်ရောက်မှုမရှိပါ။"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Health Connect မှ <xliff:g id="APP_NAME">%1$s</xliff:g> ရှိ ကြံ့ခိုင်မှု ဒေတာနှင့် ကျန်းမာရေး မှတ်တမ်းများကိုလည်း ဖျက်ရန်"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ဤအက်ပ်အတွက် ခွင့်ပြုချက်များကို ဖယ်ရှားပြီးပါပြီ"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Health Connect ဒေတာအားလုံးကိုလည်း ဖျက်ရန်"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"နောက်ရက်"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"ရွေးထားသောနေ့"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"ယခင်ရက်"</string>
     <string name="default_error" msgid="7966868260616403475">"တစ်ခုခုမှားသွားသည်။ ထပ်စမ်းကြည့်ပါ။"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"အမျိုးအမည်မသိ ရင်းမြစ်"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ရင်းမြစ်ဒေတာ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>ထောင့်ကွင်းစ။"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>ထောင့်ကွင်းပိတ်။"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> အကွက် <xliff:g id="FIELD">%2$s</xliff:g> တန်ဖိုး"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ဤအက်ပ်များက သုံးခွင့်မရှိတော့သော်လည်း Health Connect တွင် ဒေတာများ သိမ်းထားသေးသည်"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> နောက်ပိုင်း ထည့်သောဒေတာကို ဖတ်နိုင်သည်"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ဤအက်ပ်ဝင်သုံးနိုင်သော အခြား Android ခွင့်ပြုချက်များ စီမံရန် ‘ဆက်တင်များ &gt; အက်ပ်များ’ သို့ သွားနိုင်သည်"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> နှင့် မျှဝေသောဒေတာကို ၎င်း၏ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒဖြင့် ကာကွယ်ထားသည်"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> က သင့်ဒေတာများအား ဆောင်ရွက်ပုံကို ဆော့ဖ်ဝဲရေးသူ၏ ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒတွင် လေ့လာနိုင်သည်"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ဤအက်ပ်ဝင်သုံးနိုင်သော အခြား Android ခွင့်ပြုချက်များ စီမံရန် ဆက်တင်များသို့သွားပြီး အက်ပ်များကို တို့နိုင်သည်"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒကို ဖတ်ရန်"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"ပြီးခဲ့သော ၂၄ နာရီအတွင်း သုံးထားသည်"</string>
     <string name="app_access_title" msgid="7137018424885371763">"အက်ပ်သုံးခွင့်"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"တွဲသုံးနိုင်သောအက်ပ်များကို လောလောဆယ် ထည့်သွင်းမထားပါ"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"ထပ်ဆောင်းသုံးခွင့်"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ယခင်ဒေတာ၊ နောက်ခံတွင်အသုံးပြုသောဒေတာ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"ဤအက်ပ်အတွက် ထပ်ဆောင်းခွင့်ပြုချက်များကို ဖယ်ရှားထားသည်"</string>
     <string name="permissions_header" msgid="6519976063360071569">"ခွင့်ပြုချက်များ"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ကျန်းမာကြံ့ခိုင်ရေး"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"လေ့ကျင့်ခန်း၊ အိပ်စက်ခြင်း၊ အာဟာရ၊ အခြား"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"ကျန်းမာရေး မှတ်တမ်း"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ကျန်းမာရေး မှတ်တမ်း"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ဓာတ်ခွဲခန်းရလဒ်၊ ဆေးကုသမှု၊ ကာကွယ်ဆေးထိုးခြင်း၊ အခြား"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ဓာတ်ခွဲခန်းရလဒ်၊ ဆေး၊ ကာကွယ်ဆေး၊ အခြား"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"ဖယ်ရှားထားသည့် အက်ပ်ခွင့်ပြုချက်များ"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect က <xliff:g id="APP_DATA">%s</xliff:g> အတွက် ခွင့်ပြုချက်များကို ဖယ်ရှားလိုက်သည်"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect က <xliff:g id="APP_DATA_0">%1$s</xliff:g> နှင့် <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> အတွက် ခွင့်ပြုချက်များကို ဖယ်ရှားလိုက်သည်"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store သို့ သွားရန်"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect စတင်အသုံးပြုခြင်း"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect သည် သင့်စက်ပေါ်ရှိ အက်ပ်အမျိုးမျိုး ရိုးရှင်းစွာစင့်ခ်လုပ်နည်းကို ပေးပြီး သင်၏ကျန်းမာရေးနှင့် ကြံ့ခိုင်ရေးဒေတာကို သိမ်းသည်"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect သည် အခြားအက်ပ်များမှ သင့်ကျန်းမာရေးနှင့် ကြံ့ခိုင်ရေးဒေတာကို သိမ်းပြီး စင့်ခ်လုပ်သည်။\n\nလေ့ကျင့်ခန်း စက်ရှင်များ၊ ခြေလှမ်းများ၊ အာဟာရ၊ အိပ်ခြင်း စသည်တို့အပါအဝင် "<b>"ကျန်းမာကြံ့ခိုင်ရေးဒေတာ"</b>\n\n"ကာကွယ်ဆေး၊ ဓာတ်ခွဲခန်းရလဒ် စသည်တို့အပါအဝင် "<b>"ကျန်းမာရေး မှတ်တမ်းများ"</b></string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ဖြင့် သင်လုပ်နိုင်သည်များ"</string>
     <string name="share_data" msgid="3481932156368883946">"သင့်အက်ပ်များနှင့် ဒေတာမျှဝေရန်"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Health Connect တွင် အက်ပ်တစ်ခုစီက ဖတ်နိုင် (သို့) ရေးနိုင်မည့် ဒေတာကို သင်ရွေးနိုင်သည်"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"သင့်ဆက်တင်များနှင့် ကိုယ်ရေးအချက်အလက်လုံခြုံမှုကို စီမံရန်"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"အနည်းငယ် ဆင်းသည်"</string>
     <string name="flow_medium" msgid="3783688724668943154">"အလယ်အလတ် ဆင်းသည်"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"အများကြီး ဆင်းသည်"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"စီးဆင်းမှု မသိရပါ"</string>
     <string name="period_day" msgid="3821944462093965882">"ဓမ္မတာရက် <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> ရက်အနက် <xliff:g id="DAY">%1$d</xliff:g> ရက်"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ဓမ္မတာ (၁ ရက်)}other{ဓမ္မတာ (# ရက်)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"ရှိသည်"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"မရှိပါ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"များ"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"တေးဂီတ"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"အခြား"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"လမ်းမညွှန်"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"အသင့်အတင့်"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ပြင်းထန်"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>h <xliff:g id="MIN">%2$s</xliff:g>m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ပေါင်းစည်းနေဆဲဖြစ်သည်"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect ကို Android စနစ်နှင့် ပေါင်းစည်းနေသည်။\n\nသင်၏ဒေတာနှင့် ခွင့်ပြုချက်များကို လွှဲပြောင်းနေစဉ် အချိန်အနည်းငယ် ကြာနိုင်သည်။"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"လုပ်ငန်းစဉ်ပြီးဆုံးသော အကြောင်းကြားချက်မရမီ အက်ပ်ကို မပိတ်ပါနှင့်။"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect ကို ပေါင်းစည်းနေဆဲဖြစ်သည်"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"အပ်ဒိတ်လုပ်ရန် လိုသည်"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect ကို သင်၏ဆက်တင်များမှ တိုက်ရိုက်သုံးနိုင်ရန်အတွက် ၎င်းကို Android စနစ်နှင့် ပေါင်းစည်းနေသည်။"</string>
     <string name="update_button" msgid="4544529019832009496">"အပ်ဒိတ်လုပ်ရန်"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Health Connect သည် သင်၏စနစ်ဆက်တင်များနှင့် ပေါင်းစည်းခြင်းကို ဆက်လုပ်နိုင်ရန်အတွက် ဤအပ်ဒိတ်ကို စတင်ပါ"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ယခု အပ်ဒိတ်လုပ်ရန်"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"စနစ်အပ်ဒိတ်လုပ်ခြင်း လိုသည်"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"ရှေ့မဆက်မီ ဖုန်းစနစ်ကို အပ်ဒိတ်လုပ်ပါ။"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"ဖုန်းစနစ်ကို အပ်ဒိတ်လုပ်ထားပြီးပါက ပေါင်းစည်းမှုဆက်လုပ်ရန် ဖုန်းကို ပြန်စကြည့်ပါ"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect ကို အပ်ဒိတ်လုပ်ရန်လိုသည်"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"ရှေ့မဆက်မီ Health Connect အက်ပ်ကို နောက်ဆုံးဗားရှင်းသို့ အပ်ဒိတ်လုပ်ပါ။"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"နောက်ထပ်နေရာလွတ် လိုသည်"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect သည် ပေါင်းစည်းမှုဆက်လုပ်ရန် သင့်ဖုန်းရှိ သိုလှောင်ခန်း နေရာထဲမှ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> လိုသည်။\n\nဖုန်းတွင် နေရာအချို့ရှင်းပြီး ထပ်စမ်းကြည့်ပါ။"</string>
     <string name="try_again_button" msgid="8745496819992160789">"ထပ်စမ်းကြည့်ရန်"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"နေရာလွတ်လုပ်ရန်"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"နောက်ထပ်နေရာလွတ် လိုသည်"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect သည် ပေါင်းစည်းမှုဆက်လုပ်ရန် သင့်ဖုန်းရှိ သိုလှောင်ခန်း နေရာထဲမှ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> လိုသည်။"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ပေါင်းစည်းမှု ခဏရပ်ထားသည်"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect အက်ပ်ကို Android စနစ်နှင့် ပေါင်းစည်းနေစဉ် ပိတ်သွားသည်။\n\n‘ဆက်လုပ်ရန်’ ကိုတို့ပြီး အက်ပ်ပြန်ဖွင့်ကာ သင်၏ဒေတာနှင့် ခွင့်ပြုချက်များကို ဆက်လက်လွှဲပြောင်းပါ။"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect ဒေတာများ ဆက်ထားရန် ၎င်းကို <xliff:g id="TIME_NEEDED">%1$s</xliff:g> အတွင်း အပြီးသတ်ပါ"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect ကို Android စနစ်နှင့် ဆက်လက်ပေါင်းစည်းရန် တို့ပါ။ သင့်ဒေတာများ ဆက်ထားရန် ၎င်းကို <xliff:g id="TIME_NEEDED">%1$s</xliff:g> အတွင်း အပြီးသတ်ပါ"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect ကို Android စနစ်နှင့် ဆက်လက်ပေါင်းစည်းရန် တို့ပါ။"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ရှေ့ဆက်ရန်"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect ပေါင်းစည်းမှု ဆက်လုပ်ပါ"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"သင့်ဒေတာများ ဆက်ထားရန် ၎င်းကို <xliff:g id="TIME_NEEDED">%1$s</xliff:g> အတွင်း အပြီးသတ်ပါ"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"အက်ပ်အပ်ဒိတ် လိုသည်"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect နှင့် စင့်ခ်ဆက်လုပ်ရန် <xliff:g id="APP_NAME">%1$s</xliff:g> ကို အပ်ဒိတ်လုပ်ရပါမည်"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect နှင့် စင့်ခ်ဆက်လုပ်ရန် အက်ပ်အချို့ကို အပ်ဒိတ်လုပ်ရပါမည်"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect နှင့် စင့်ခ်ဆက်လုပ်ရန် <xliff:g id="APP_NAME">%1$s</xliff:g> ကို အပ်ဒိတ်လုပ်ရပါမည်။ အပ်ဒိတ်များကို အက်ပ်အားလုံးအတွက် မရနိုင်ပါ။"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect နှင့် စင့်ခ်ဆက်လုပ်ရန် အက်ပ်အချို့ကို အပ်ဒိတ်လုပ်ရပါမည်။ အပ်ဒိတ်များကို အက်ပ်အားလုံးအတွက် မရနိုင်ပါ။"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"အပ်ဒိတ်များ ရှာရန်"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"ပိုမိုလေ့လာရန်"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect ပေါင်းစည်းမှု"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect ပေါင်းစည်းမှု မပြီးစီးပါ"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"၎င်းကို ထပ်စမ်းကြည့်နိုင်သောအခါ အကြောင်းကြားချက်ရမည်။"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"ရပြီ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect ပေါင်းစည်းမှု မပြီးစီးပါ"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"နောက်ထပ်ဖတ်ရန်"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect ပေါင်းစည်းမှု ပြီးသွားပါပြီ"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"ဖွင့်ရန်"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"ဘာတွေထူးသလဲ"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Health Connect ကို ဆက်တင်များမှ တိုက်ရိုက်သုံးနိုင်ပါပြီ။ သိုလှောင်ခန်း နေရာလွတ်ပြုလုပ်ရန် Health Connect အက်ပ်ကို အချိန်မရွေး ဖယ်ရှားနိုင်သည်။"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"ရပြီ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"အက်ပ်ရင်းမြစ်များ တည်းဖြတ်ရန်"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"စက်ပစ္စည်းမူရင်း"</string>
     <string name="app_data_title" msgid="6499967982291000837">"အက်ပ်ဒေတာ"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect သုံးခွင့်ရှိသော အက်ပ်များမှ ဒေတာကို ဤနေရာတွင် ပြပါမည်"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှ ဒေတာကို ဤနေရာတွင် ပြပါမည်"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect သုံးခွင့်ရှိသော အက်ပ်များမှ ဒေတာကို ဤနေရာတွင် ပြပါမည်"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"ရက်"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"သီတင်းပတ်"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"လ"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ပြီးခဲ့သောလ"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ထည့်သွင်းမှုများ"</string>
     <string name="tab_access" msgid="7818197975407243701">"သုံးခွင့်"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် ထပ်ဆောင်းသုံးခွင့်ပြုမလား။"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် ဤ Health Connect ဆက်တင်များကိုလည်း သုံးလိုသည်"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ဤအက်ပ်အတွက် နောက်ခံတွင်အသုံးပြုသောဒေတာ (သို့) ယခင်ဒေတာသုံးခွင့် ဖွင့်ရန် အနည်းဆုံး ဖတ်ခွင့်တစ်ခုပေးပါ"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ဤအက်ပ်အတွက် နောက်ကွယ်၌ အသုံးပြုခွင့် ဖွင့်ရန် အနည်းဆုံး ဖတ်ခွင့်တစ်ခုပေးပါ"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ဤအက်ပ်အတွက် ယခင်ဒေတာသုံးခွင့် ဖွင့်ရန် အနည်းဆုံး ဖတ်ခွင့်တစ်ခု ပေးပါ"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect စသုံးခြင်း"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"အက်ပ်များအကြား ကျန်းမာရေးနှင့် ကြံ့ခိုင်ရေးဒေတာ မျှဝေရန် သင့်ပထမဆုံးအက်ပ်များကို စင့်ခ်လုပ်ပါ"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"စနစ်ထည့်သွင်းရန်"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"တွဲသုံးနိုင်သော အက်ပ်များကို ကြည့်ခြင်း"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect မှတစ်ဆင့် <xliff:g id="APP_NAME">%s</xliff:g> ဖြင့် စင့်ခ်လုပ်ရန် နောက်ထပ်အက်ပ်များ ရှာပါ"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"အက်ပ်စတိုးတွင် ကြည့်ရန်"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ဖန်သားပြင်လော့ခ် သတ်မှတ်ခြင်း"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"သင့်ကျန်းမာရေးဒေတာ ပိုမိုလုံခြုံစေရန် ဤစက်အတွက် ပင်နံပါတ်၊ ပုံဖော်ခြင်း (သို့) စကားဝှက် သတ်မှတ်ပါ"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ဖန်သားပြင်လော့ခ် သတ်မှတ်ရန်"</string>
     <string name="select_all" msgid="837499881590001166">"အားလုံး ရွေးရန်"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"ချိတ်ဆက်ထားသည့် အက်ပ်များက Health Connect ထံမှ ဤဒေတာကို ဖတ်နိုင်တော့မည်မဟုတ်ပါ"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"အမှန်ခြစ်ထားသည်"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"အမှန်ခြစ်မထားပါ"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"လေ့ကျင့်ခန်းမြေပုံ လမ်းကြောင်း ရနိုင်သည်"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"နောက်ရက်"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"နောက်အပတ်"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"နောက်လ"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"ယခင်ရက်"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"ယခင်အပတ်"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"ယခင်လ"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"ဒေတာအားလုံးကို အပြီးဖျက်မလား။"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"ရွေးထားသော ဒေတာကို အပြီးဖျက်မလား။"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g> ဒေတာအားလုံးကို အပြီးဖျက်မလား။"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> အပတ်အတွက် ရွေးထားသော <xliff:g id="APP_NAME">%1$s</xliff:g> ထည့်သွင်းမှုများကို အပြီးဖျက်မလား။"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> အတွက် ရွေးထားသော <xliff:g id="APP_NAME">%1$s</xliff:g> ထည့်သွင်းမှုများကို အပြီးဖျက်မလား။"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ဤ <xliff:g id="APP_NAME">%s</xliff:g> ထည့်သွင်းမှုကို အပြီးဖျက်မလား။"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> အတွက် <xliff:g id="DATA_TYPE">%1$s</xliff:g> ဒေတာကို အပြီးဖျက်မလား။"</string>
+    <string name="on" msgid="8266542510798355807">"ဖွင့်"</string>
+    <string name="off" msgid="6996623844428550649">"ပိတ်"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g> တွင် သုံးထားသည်"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"မနေ့ <xliff:g id="TIME_DATE">%1$s</xliff:g> တွင် ဝင်ကြည့်ထားသည်"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g> တွင် ဝင်ကြည့်ထားသည်"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"အမြဲခွင့်ပြုရန်"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"ရွေးထားသမျှ ခွင့်ပြုရန်"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"အက်ပ်ကို သုံးနေစဉ်"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"အားလုံး ငြင်းပယ်ရန်"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား ကျန်းမာကြံ့ခိုင်ရေးဒေတာကို သုံးခွင့်ပြုမလား။"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် <xliff:g id="DATA_TYPES">%2$s</xliff:g> သုံးခွင့် တောင်းဆိုနေသည်။\n\nအားလုံးခွင့်ပြုရန် (သို့) တစ်ခုချင်းစီ ထိန်းချုပ်ရန် ရွေးပါ။"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို <xliff:g id="DATA_TYPE">%2$s</xliff:g> သုံးခွင့် ပြုမလား။"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ကျန်းမာကြံ့ခိုင်ရေး"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"အချိန်တိုင်း"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"သုံးနေစဉ်"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"အချိန်တိုင်း"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"သုံးနေစဉ်"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင်၏ကျန်းမာကြံ့ခိုင်ရေးဒေတာအားလုံးကို <xliff:g id="ALLOW_MODE">%2$s</xliff:g> သုံးနိုင်သည်"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"သုံးခွင့်ပြုထားသည်များ"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"ဖတ်ခွင့်ပေးထားသည်များ"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ဤခွင့်ပြုချက်များသည် <xliff:g id="APP_NAME">%1$s</xliff:g> အား သင်၏စက်အာရုံခံကိရိယာများမှ ဒေတာကို သုံးခွင့်ပေးသည်။"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"အက်ပ် <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ခုအနက် <xliff:g id="NUMBER_0">%1$d</xliff:g> ခု ခွင့်ပြုထားသည်"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"အက်ပ်တောင်းဆိုခြင်း မရှိပါ"</string>
+    <string name="allowed" msgid="4158456017482263737">"ခွင့်ပြုထားသည်"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"ခွင့်ပြုမထားပါ"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ဤခွင့်ပြုချက်ရှိသော အက်ပ်များသည် သင်၏စက်အာရုံခံကိရိယာများမှ <xliff:g id="DATA_TYPE">%s</xliff:g> ဒေတာကို သုံးနိုင်သည်။"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"သင့်လက်ပတ်နာရီရှိ အက်ပ်အားလုံးအတွက် <xliff:g id="DATA_TYPE">%s</xliff:g> သုံးခွင့် ဖယ်ရှားမလား။"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"အမှန်ခြစ်"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"ကြက်ခြေခတ် အမှတ်အသား"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"လက်ရှိတွင် <xliff:g id="APP_NAME">%1$s</xliff:g> သည် ကျန်းမာကြံ့ခိုင်ရေးဒေတာများ သုံးခွင့်ရှိသည် <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို ကျန်းမာကြံ့ခိုင်ရေးဒေတာများ အချိန်တိုင်းသုံးခွင့်ပြုမလား။"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် <xliff:g id="DATA_TYPES">%2$s</xliff:g> တို့သုံးခွင့်ရှိသည်။"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ကျန်းမာကြံ့ခိုင်ရေးခွင့်ပြုချက်များ စီမံရန်"</string>
 </resources>
diff --git a/apk/res/values-nb/strings.xml b/apk/res/values-nb/strings.xml
index 7c11722..13c069e 100644
--- a/apk/res/values-nb/strings.xml
+++ b/apk/res/values-nb/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Administrer helse- og treningsdata på enheten, og kontroller hvilke apper som har tilgang til dem"</string>
     <string name="data_title" msgid="4456619761533380816">"Data og tilgang"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Bla gjennom helsejournaler"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Se helsejournalene dine og hvilke apper som kan bruke dem"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Alle kategorier"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Se alle kategoriene"</string>
     <string name="no_data" msgid="1906986019249068659">"Ingen data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"I går"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lest: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Skrevet: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Administrer tillatelser"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Tidspunkt: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivitet"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"bruke helsedataene dine"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Les forbrente kalorier"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Gir appen tillatelse til å lese forbrente kalorier"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Bruk data i bakgrunnen"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Vil du la <xliff:g id="APP_NAME">%1$s</xliff:g> bruke data i bakgrunnen?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Vil du la <xliff:g id="APP_NAME">%1$s</xliff:g> bruke data i bakgrunnen?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Hvis du tillater det, har denne appen tilgang til trenings- og velværedata og helsejournaldata når du ikke bruker appen."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Hvis du tillater det, kan denne appen bruke helsejournaldata når du ikke bruker appen."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Hvis du tillater det, har denne appen tilgang til trenings- og velværedata når du ikke bruker appen."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Hvis du tillater det, kan denne appen bruke Health Connect-data når du ikke bruker appen."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Vil du la <xliff:g id="APP_NAME">%1$s</xliff:g> bruke tidligere data?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Hvis du tillater det, kan denne appen bruke trenings- og velværedata som ble lagt til før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Hvis du tillater det, kan denne appen bruke alle tidligere trenings- og velværedata."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Hvis du tillater det, kan denne appen bruke Health Connect-data som ble lagt til før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Hvis du tillater det, kan denne appen bruke alle tidligere Health Connect-data."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Vil du tillate mer tilgang for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil også bruke disse Health Connect-innstillingene"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"bruke alle data i bakgrunnen"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"bruke helsejournaldata i bakgrunnen"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"bruke trenings- og velværedata i bakgrunnen"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Gi denne appen tilgang til trenings- og velværedata og helsejournaldata når du ikke bruker appen"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Gi denne appen tilgang til disse dataene når du ikke bruker appen"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Gi denne appen tilgang til disse dataene når du ikke bruker appen"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"bruke data i bakgrunnen"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Gi denne appen tilgang til Health Connect-data når du ikke bruker appen"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"bruke tidligere trenings- og velværedata"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Gi denne appen tilgang til data som ble lagt til før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Gi denne appen tilgang til alle tidligere data"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"bruke tidligere data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"La denne appen bruke Health Connect-data som ble lagt til før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"La denne appen bruke alle tidligere Health Connect-data"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> har allerede tilgang til tidligere helsejournaldata"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Les mer om tillatelser"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"bruke alle data i bakgrunnen"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"bruke helsejournaldata i bakgrunnen"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"bruke trenings- og velværedata i bakgrunnen"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Gi denne appen tilgang til trenings- og velværedata og helsejournaldata når du ikke bruker appen"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Gi denne appen tilgang til disse dataene når du ikke bruker appen"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Gi denne appen tilgang til disse dataene når du ikke bruker appen"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"bruke data i bakgrunnen"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Gi denne appen tilgang til Health Connect-data når du ikke bruker appen"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"bruke tidligere trenings- og velværedata"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Gi denne appen tilgang til data som ble lagt til før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Gi denne appen tilgang til alle tidligere data"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"bruke tidligere data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"La denne appen bruke Health Connect-data som ble lagt til før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Gi denne appen tilgang til alle tidligere Health Connect-data"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Ingen treningsdata leses for øyeblikket, fordi <xliff:g id="APP_NAME">%1$s</xliff:g> ikke har lesetillatelser"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> har allerede tilgang til tidligere data for helsejournalen din. For å endre dette, slå av helsejournal-tillatelser for denne appen"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Administrer helsejournal-tillatelser"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Gi minst én lesetillatelse for å slå på tilgang i bakgrunnen eller tilgang til tidligere data for denne appen"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Gi minst én lesetillatelse for å slå på tilgang i bakgrunnen for denne appen"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Gi minst én lesetillatelse for å slå på tilgang til tidligere data for denne appen"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"La denne appen bruke alle tidligere Health Connect-data"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Gi denne appen tilgang til Health Connect-data når du ikke bruker appen"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Hvis du tillater det, kan denne appen bruke Health Connect-data når du ikke bruker appen."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Bruk tidligere data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Vil du la <xliff:g id="APP_NAME">%1$s</xliff:g> bruke tidligere data?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"La denne appen bruke Health Connect-data som ble lagt til før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"La denne appen bruke alle tidligere Health Connect-data"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Hvis du tillater det, kan denne appen bruke Health Connect-data som ble lagt til før <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Hvis du tillater det, kan denne appen bruke alle tidligere Health Connect-data."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Aktive forbrente kalorier"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"aktive forbrente kalorier"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Les aktive forbrente kalorier"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"rullestoldytt"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Les rullestoldytt"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Skriv rullestoldytt"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Aktivitetsintensitet"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"aktivitetsintensitet"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Lesing av aktivitetsintensitet"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Skriving av aktivitetsintensitet"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basalstoffskifte"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basalstoffskifte"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Les basalstoffskifte"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"hudtemperatur"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Les hudtemperatur"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Skriv hudtemperatur"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Dette inkluderer alle helsejournalene som er synkronisert med og lagt til i Health Connect. Dette er kanskje ikke den fullstendige medisinske journalen din, og det inkluderer ikke noen medisinsk beskrivelse av helsejournalene dine."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Alle helsejournaler"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"alle helsejournaler"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Skriv alle helsejournaler"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergier"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergier"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lesing av allergier"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Vaksinering"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"vaksinering"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Les vaksinering"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorieresultater"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorieresultater"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Lesing av laboratorieresultater"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergier"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergier"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Lesing av allergier"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Tilstander"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"tilstander"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Les tilstander"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaksiner"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaksiner"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Lesing av vaksiner"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratorieresultater"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratorieresultater"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Lesing av laboratorieresultater"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medisiner"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medisiner"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Les medisiner"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personlige opplysninger"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personlige opplysninger"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Les personlige opplysninger"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Informasjon om lege"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"informasjon om lege"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Les informasjon om lege"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Graviditet"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"graviditet"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Lesing av graviditet"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemer"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemer"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Lesing av problemer"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Prosedyrer"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"prosedyrer"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Lesing av prosedyrer"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sosiallogg"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sosiallogg"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sosiallogg"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Lesing av sosialloggen"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitale tegn"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Besøk"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"besøk"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Les besøk"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitale tegn"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitale tegn"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Lesing av vitale tegn"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Oppmerksomt nærvær"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Skriv oppmerksomt nærvær"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"La «<xliff:g id="APP_NAME">%1$s</xliff:g>» lese"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"La «<xliff:g id="APP_NAME">%1$s</xliff:g>» skrive"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Avbryt"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Tillat"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Tillat alle"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ikke tillat"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Velg dataene du vil gi denne appen tillatelse til å lese eller skrive til Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Velg dataene du vil gi denne appen tillatelse til å lese eller skrive til Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Velg dataene du vil gi denne appen tillatelse til å lese fra Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Velg dataene du vil gi denne appen tillatelse til å skrive til Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Hvis du gir lesetilgang, kan appen lese nye data og data fra de siste 30 dagene"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Hvis du gir lesetilgang, kan appen lese nye og tidligere data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Vil du gi <xliff:g id="APP_NAME">%1$s</xliff:g> tilgang til Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Du kan finne ut hvordan <xliff:g id="APP_NAME">%1$s</xliff:g> håndterer dataene dine, i utviklerens <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Vil du la <xliff:g id="APP_NAME">%1$s</xliff:g> bruke trenings- og velværedata?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Du kan finne ut hvordan <xliff:g id="APP_NAME">%1$s</xliff:g> håndterer dataene dine, i <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"personvernregler"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Vil du gi <xliff:g id="APP_NAME">%1$s</xliff:g> tilgang til helsejournalene dine?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Hvis du gir tilgang, kan appen lese og skrive data som allergier, laboratorieresultater, vaksiner med mer\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Hvis du gir tilgang, kan appen lese data som allergier, laboratorieresultater, vaksiner med mer\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Om helsejournaler"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Dataene som skal deles, inkluderer"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Hvis du tillater det, kan <xliff:g id="APP_NAME">%1$s</xliff:g> dele helsejournaldataene dine med Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synkroniser helsejournalene fra de ulike appene og kildene dine for å holde dem på ett sted"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Vil du fjerne alle tillatelsene?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Fjern alle"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive data fra Health Connect.\n\nDette påvirker ikke andre tillatelser appen har, for eksempel kamera, mikrofon eller posisjon."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive data fra Health Connect, inkludert tidligere data.\n\nDette påvirker ikke andre tillatelser appen har, for eksempel posisjon, kamera eller mikrofon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive data fra Health Connect, inkludert bakgrunnsdata eller tidligere data.\n\nDette påvirker ikke andre tillatelser appen har, for eksempel posisjon, kamera eller mikrofon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Slett også <xliff:g id="APP_NAME">%1$s</xliff:g>-data fra Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vil du fjerne alle tillatelser?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vil du fjerne alle tillatelser til helsejournalen?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Vil du fjerne alle tillatelser for trening og velvære?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Slett også treningsdata fra <xliff:g id="APP_NAME">%1$s</xliff:g> fra Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vil du fjerne alle tillatelser til helsejournalen?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Slett også helsejournalen fra <xliff:g id="APP_NAME">%1$s</xliff:g> fra Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive disse dataene fra Health Connect.\n\nDette påvirker ikke andre tillatelser appen kanskje har, for eksempel kamera, mikrofon eller posisjon."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive disse dataene fra Health Connect, inkludert bakgrunnsdata.\n\nDette påvirker ikke andre tillatelser appen kanskje har, for eksempel kamera, mikrofon eller posisjon."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive disse dataene fra Health Connect, inkludert tidligere data.\n\nDette påvirker ikke andre tillatelser appen kanskje har, for eksempel kamera, mikrofon eller posisjon."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive disse dataene fra Health Connect, inkludert bakgrunnsdata og tidligere data.\n\nDette påvirker ikke andre tillatelser appen kanskje har, for eksempel kamera, mikrofon eller posisjon."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vil du fjerne alle tillatelser?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive data fra Health Connect.\n\nDette påvirker ikke andre tillatelser appen kanskje har, for eksempel kamera, mikrofon eller posisjon."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive data fra Health Connect, inkludert bakgrunnsdata.\n\nDette påvirker ikke andre tillatelser appen kanskje har, for eksempel kamera, mikrofon eller posisjon."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive data fra Health Connect, inkludert tidligere data.\n\nDette påvirker ikke andre tillatelser appen kanskje har, for eksempel kamera, mikrofon eller posisjon."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke lenger lese eller skrive data fra Health Connect, inkludert bakgrunnsdata og tidligere data.\n\nDette påvirker ikke andre tillatelser appen kanskje har, for eksempel kamera, mikrofon eller posisjon."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Slett også treningsdata og helsejournalen fra <xliff:g id="APP_NAME">%1$s</xliff:g> fra Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Fjernet tillatelsene for denne appen"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Slett også alle Health Connect-data"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Neste dag"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Valgt dag"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Forrige dag"</string>
     <string name="default_error" msgid="7966868260616403475">"Noe gikk galt. Prøv igjen."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Ukjent ressurs"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Kildedata"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Venstre krøllparentes."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Høyre krøllparentes."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> feltverdi for <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Disse appene har ikke tilgang lenger, men har fremdeles data lagret i Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan lese data som er lagt til etter <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"For å administrere andre Android-tillatelser denne appen har, gå til Innstillinger &gt; Apper"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data du deler med <xliff:g id="APP_NAME">%1$s</xliff:g>, dekkes av personvernreglene for appen"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Du kan finne ut hvordan <xliff:g id="APP_NAME">%1$s</xliff:g> håndterer dataene dine, i personvernreglene til utvikleren"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"For å kontrollere andre Android-tillatelser denne appen har, gå til Innstillinger og trykk på Apper"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Les personvernreglene"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Brukt de siste 24 timene"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Apptilgang"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Du har ingen kompatible apper installert"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Annen tilgang"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Tidligere data, bakgrunnsdata"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Fjernet tilleggstillatelser for denne appen"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Tillatelser"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Trening og velvære"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Trening, søvn, ernæring og annet"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Helsejournaler"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"helsejournaler"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Labresultater/medisiner/vaksinering m.m."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Lab.-resultater/medisiner/vaksiner m.m."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Fjernet apptillatelser"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect fjernet tillatelser for <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect fjernet tillatelser for <xliff:g id="APP_DATA_0">%1$s</xliff:g> og <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Gå til Play Butikk"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Kom i gang med Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect lagrer helse- og treningsdataene dine, slik at du enkelt kan synkronisere de forskjellige appene på enheten"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect lagrer og synkroniserer helse- og treningsdataene dine fra forskjellige apper.\n\n"<b>"Trenings- og velværedata,"</b>" inkludert treningsøkter, skritt, ernæring, søvn med mer\n\n"<b>"Helsejournaler,"</b>" inkludert vaksiner, laboratorieresultater med mer"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Med Health Connect kan du"</string>
     <string name="share_data" msgid="3481932156368883946">"Del data med appene"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Velg dataene hver app kan lese eller skrive til Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Innstillinger og personvern"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Lett blødning"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Middels blødning"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Kraftig blødning"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Ukjent mengde"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruasjonsdag <xliff:g id="DAY">%1$d</xliff:g> av <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruasjon (1 dag)}other{Menstruasjon (# dager)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiv"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Høy"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musikk"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Annet"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Uten veiledning"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderat"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intensiv"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> t <xliff:g id="MIN">%2$s</xliff:g> m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> t"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integreringen pågår"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect integreres med Android-systemet.\n\nDet kan ta litt tid før dataene og tillatelsene dine er overført."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ikke lukk appen før du får et varsel om at prosessen er ferdig."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect- integreringen pågår"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"En oppdatering er nødvendig"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect integreres med Android-systemet, slik at du kan gå til den direkte fra innstillingene."</string>
     <string name="update_button" msgid="4544529019832009496">"Oppdater"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Start denne oppdateringen, slik at Health Connect kan fortsette integreringen med systeminnstilingene dine"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Oppdater nå"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Systemet må oppdateres"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Du må oppdatere telefonsystemet før du fortsetter."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Hvis du har oppdatert systemet på telefonen allerede, bør du prøve å starte telefonen på nytt for å fortsette integreringen"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect må oppdateres"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Før du fortsetter, må du oppdatere Health Connect-appen til nyeste versjon."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Mer plass er nødvendig"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect trenger <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> lagringsplass på telefonen for å fortsette integreringen.\n\nFrigjør litt plass på telefonen og prøv på nytt."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Prøv igjen"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Frigjør plass"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Mer plass er nødvendig"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect trenger <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> lagringsplass på telefonen for å fortsette integreringen."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integreringen er på pause"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect-appen ble lukket mens den ble integrert med Android-systemet.\n\nKlikk på Gjenoppta for å åpne appen igjen og fortsette å overføre dataene og tillatelsene dine."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"For å beholde Health Connect-dataene dine må du fullføre dette innen <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Trykk for å fortsette å integrere Health Connect med Android-systemet. For å beholde dataene dine må du gjøre ferdig dette innen <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Trykk for å fortsette å integrere Health Connect med Android-systemet."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Fortsett"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Gjenoppta Health Connect-integreringen"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"For å beholde dataene dine må du gjøre ferdig dette innen <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Appen må oppdateres"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> må oppdateres for å fortsette å synkronisere med Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Noen apper må oppdateres for å fortsette å synkronisere med Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> må oppdateres for å fortsette å synkronisere med Health Connect. Oppdateringer er kanskje ikke tilgjengelige for alle apper."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Noen apper må oppdateres for å fortsette å synkronisere med Health Connect. Oppdateringer er kanskje ikke tilgjengelige for alle apper."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Se etter oppdateringer"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Finn ut mer"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-integrering"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect- integreringen ble ikke ferdig"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Du får et varsel når den blir tilgjengelig igjen."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Greit"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-integreringen ble ikke ferdig"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Finn ut mer"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-integreringen er ferdig"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Åpne"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Nyheter"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Nå kan du gå til Health Connect direkte fra innstillingene. Du kan avinstallere Health Connect-appen når som helst for å frigjøre lagringsplass."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Greit"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Endre appkilder"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Standard for enheten"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Appdata"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data fra apper med tilgang til Health Connect vises her"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data fra <xliff:g id="APP_NAME">%1$s</xliff:g> vises her"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data fra apper med tilgang til Health Connect vises her"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dag"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Uke"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Måned"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Forrige måned"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Oppføringer"</string>
     <string name="tab_access" msgid="7818197975407243701">"Tilgang"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Vil du tillate mer tilgang for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> vil også bruke disse Health Connect-innstillingene"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Gi minst én lesetillatelse for å slå på tilgang i bakgrunnen eller tilgang til tidligere data for denne appen"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Gi minst én lesetillatelse for å slå på tilgang i bakgrunnen for denne appen"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Gi minst én lesetillatelse for å slå på tilgang til tidligere data for denne appen"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Begynn å bruke Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synkroniser de første appene dine for å dele helse- og treningsdata mellom dem"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Konfigurer"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Se kompatible apper"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Finn flere apper å synkronisere med <xliff:g id="APP_NAME">%s</xliff:g> via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Se i appbutikken"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Angi en skjermlås"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"For å øke sikkerheten for helsedataene dine bør du angi en PIN-kode, et mønster eller et passord for denne enheten"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Angi skjermlås"</string>
     <string name="select_all" msgid="837499881590001166">"Merk alt"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Tilknyttede apper mister muligheten til å lese disse dataene fra Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Avmerket"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Ikke avmerket"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Rute på treningskart er tilgjengelig"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Neste dag"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Neste uke"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Neste måned"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Forrige dag"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Forrige uke"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Forrige måned"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Vil du slette alle data permanent?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Vil du slette de valgte dataene permanent?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Vil du slette alle <xliff:g id="APP_NAME">%s</xliff:g>-data permanent?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Vil du slette de valgte <xliff:g id="APP_NAME">%1$s</xliff:g>-oppføringene for uken som startet <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>, permanent?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Vil du slette de valgte <xliff:g id="APP_NAME">%1$s</xliff:g>-oppføringene for <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> permanent?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Vil du slette denne <xliff:g id="APP_NAME">%s</xliff:g>-oppføringen permanent?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Vil du slette <xliff:g id="DATA_TYPE">%1$s</xliff:g>-dataene for <xliff:g id="APP_NAME">%2$s</xliff:g> permanent?"</string>
+    <string name="on" msgid="8266542510798355807">"På"</string>
+    <string name="off" msgid="6996623844428550649">"Av"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Åpnet <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Åpnet i går <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Åpnet <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Tillat hele tiden"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Tillat valgte"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Når appen brukes"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Avvis alle"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Vil du la <xliff:g id="APP_NAME">%1$s</xliff:g> bruke trenings- og velværedata?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tilgang til <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nVelg om du vil tillate alle eller kontrollere dem enkeltvis."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Vil du gi <xliff:g id="APP_NAME">%1$s</xliff:g> tilgang til <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Trening og velvære"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"hele tiden"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"når den er i bruk"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Hele tiden"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Når den er i bruk"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan bruke alle trenings- og velværedataene dine <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Har tilgang"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Kan lese"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Disse tillatelsene gir <xliff:g id="APP_NAME">%1$s</xliff:g> tilgang til data fra enhetssensorene."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apper har denne tillatelsen"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ingen apper ber om dette"</string>
+    <string name="allowed" msgid="4158456017482263737">"Tillatt"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Ikke tillatt"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apper med denne tillatelsen har tilgang til <xliff:g id="DATA_TYPE">%s</xliff:g>-data fra enhetssensorene."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Vil du fjerne <xliff:g id="DATA_TYPE">%s</xliff:g>-tilgangen for alle apper på klokken?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Hake"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Kryss"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"For øyeblikket kan <xliff:g id="APP_NAME">%1$s</xliff:g> bruke trenings- og velværedata <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Vil du gi <xliff:g id="APP_NAME">%1$s</xliff:g> tilgang til trenings- og velværedata hele tiden?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> har tilgang til <xliff:g id="DATA_TYPES">%2$s</xliff:g>"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Administrer tillatelser for trening og velvære"</string>
 </resources>
diff --git a/apk/res/values-ne/strings.xml b/apk/res/values-ne/strings.xml
index f947411..dbb0c8c 100644
--- a/apk/res/values-ne/strings.xml
+++ b/apk/res/values-ne/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"आफ्नो डिभाइसमा भएका स्वास्थ्य र तन्दुरुस्तीसम्बन्धी जानकारी व्यवस्थापन गर्नुहोस् र ती जानकारी कुन कुन एपलाई प्रयोग गर्न दिने भन्ने कुरा नियन्त्रण गर्नुहोस्"</string>
     <string name="data_title" msgid="4456619761533380816">"डेटा र अनुमति"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"स्वास्थ्य अभिलेखहरू ब्राउज गर्नुहोस्"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"आफ्ना स्वास्थ्य अभिलेख र ती स्वास्थ्य अभिलेख एक्सेस गर्न सक्ने एपहरू हेर्नुहोस्"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"सबै कोटीहरू"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"सबै कोटीहरू हेर्नुहोस्"</string>
     <string name="no_data" msgid="1906986019249068659">"डेटा छैन"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"हिजो"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"रिड एक्सेस: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"राइट एक्सेस: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"अनुमतिहरू व्यवस्थापन गर्नुहोस्"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"समय: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"क्रियाकलाप"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"आफ्नो स्वास्थ्यसम्बन्धी डेटा हेर्ने तथा प्रयोग गर्ने अनुमति दिनुहोस्"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"खर्च गरिएको क्यालोरीसम्बन्धी डेटा रिड गर्ने अनुमति दिनुहोस्"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"एपलाई खर्च गरिएको क्यालोरीसम्बन्धी डेटा रिड गर्ने अनुमति दिन्छ"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"ब्याकग्राउन्डमा डेटा एक्सेस गर्ने अनुमति"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई ब्याकग्राउन्डमा डेटा एक्सेस गर्न दिने हो?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई ब्याकग्राउन्डमा जानकारी एक्सेस गर्न दिने हो?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"तपाईंले यो अनुमति दिनुभयो भने तपाईंले यो एप प्रयोग नगरेका बेला यसले व्यायाम तथा तन्दुरुस्तीसम्बन्धी जानकारी र स्वास्थ्य अभिलेखहरू एक्सेस गर्न सक्छ।"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"तपाईंले यो अनुमति दिनुभयो भने तपाईंले यो एप प्रयोग नगरेका बेला यसले स्वास्थ्य अभिलेखहरू एक्सेस गर्न सक्छ।"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"तपाईंले यो अनुमति दिनुभयो भने तपाईंले यो एप प्रयोग नगरेका बेला यसले व्यायाम तथा तन्दुरुस्तीसम्बन्धी जानकारी एक्सेस गर्न सक्छ।"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"तपाईंले यो अनुमति दिनुभयो भने तपाईंले एप प्रयोग नगरेका बेला पनि यसले Health Connect मा भएको जानकारी एक्सेस गर्न सक्छ।"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई पुराना जानकारी एक्सेस गर्न दिने हो?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"तपाईंले यो अनुमति दिनुभयो भने यो एपले <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> अघि हालिएका व्यायाम तथा तन्दुरुस्तीसम्बन्धी जानकारी एक्सेस गर्न सक्छ।"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"तपाईंले यो अनुमति दिनुभयो भने यो एपले व्यायाम तथा तन्दुरुस्तीसम्बन्धी सबै पुराना जानकारी एक्सेस गर्न सक्छ।"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"तपाईंले यो अनुमति दिनुभयो भने यो एपले <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> अघि Health Connect मा हालिएका जानकारी एक्सेस गर्न सक्छ।"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"तपाईंले यो अनुमति दिनुभयो भने यो एपले Health Connect का सबै पुराना जानकारी एक्सेस गर्न सक्छ।"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई अतिरिक्त एक्सेस दिने हो?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले Health Connect का यी सेटिङ पनि एक्सेस गर्ने अनुमति माग्दै छ"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"ब्याकग्राउन्डमा सबै जानकारी एक्सेस गर्ने"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ब्याकग्राउन्डमा स्वास्थ्य अभिलेखहरू एक्सेस गर्ने"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ब्याकग्राउन्डमा व्यायाम तथा तन्दुरुस्तीसम्बन्धी जानकारी एक्सेस गर्ने"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"तपाईंले यो एप प्रयोग नगरेका बेला पनि यसलाई व्यायाम तथा तन्दुरुस्तीसम्बन्धी जानकारी र स्वास्थ्य अभिलेखहरू एक्सेस गर्न दिनुहोस्"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"तपाईंले यो एप प्रयोग नगरेका बेला यसलाई यो जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"तपाईंले यो एप प्रयोग नगरेका बेला यसलाई यो जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"ब्याकग्राउन्डमा जानकारी एक्सेस गर्ने"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"तपाईंले यो एप प्रयोग नगरिरहेका बेला पनि यसलाई Health Connect मा भएका जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"व्यायाम तथा तन्दुरुस्तीसम्बन्धी पुराना जानकारी एक्सेस गर्ने"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"यो एपलाई <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> अघि हालिएका जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"यो एपलाई सबै पुराना जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"पुराना जानकारी एक्सेस गर्ने"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"यो एपलाई <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> अघि Health Connect मा हालिएका जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"यो एपलाई Health Connect का सबै पुराना जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले पहिल्यैदेखि तपाईंका स्वास्थ्य अभिलेखसम्बन्धी पुराना जानकारी एक्सेस गर्न सक्छ"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"अनुमतिहरूका बारेमा थप पढ्नुहोस्"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"ब्याकग्राउन्डमा सबै जानकारी एक्सेस गर्ने"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ब्याकग्राउन्डमा स्वास्थ्य अभिलेखहरू एक्सेस गर्ने"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ब्याकग्राउन्डमा व्यायाम तथा तन्दुरुस्तीसम्बन्धी जानकारी एक्सेस गर्ने"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"तपाईंले यो एप प्रयोग नगरेका बेला पनि यसलाई व्यायाम तथा तन्दुरुस्तीसम्बन्धी जानकारी र स्वास्थ्य अभिलेखहरू एक्सेस गर्न दिनुहोस्"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"तपाईंले यो एप प्रयोग नगरेका बेला यसलाई यो जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"तपाईंले यो एप प्रयोग नगरेका बेला यसलाई यो जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"ब्याकग्राउन्डमा जानकारी एक्सेस गर्ने"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"तपाईंले यो एप प्रयोग नगरिरहेका बेला पनि यसलाई Health Connect मा भएका जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"व्यायाम तथा तन्दुरुस्तीसम्बन्धी पुराना जानकारी एक्सेस गर्ने"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"यो एपलाई <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> अघि हालिएका जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"यो एपलाई सबै पुराना जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"पुराना जानकारी एक्सेस गर्ने"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"यो एपलाई <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> अघि Health Connect मा हालिएका जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"यो एपलाई Health Connect का सबै पुराना जानकारी एक्सेस गर्न दिनुहोस्"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई रिड गर्ने अनुमति नदिइएको हुनाले हाल व्यायामसम्बन्धी कुनै पनि जानकारी रिड गरिँदै छैन"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले पहिल्यैदेखि तपाईंका स्वास्थ्य अभिलेखसम्बन्धी विगतको जानकारी एक्सेस गर्न सक्छ। यो सेटिङ परिवर्तन गर्न यस एपलाई दिइएको स्वास्थ्य अभिलेखसम्बन्धी अनुमति रद्द गर्नुहोस्"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"स्वास्थ्य अभिलेखसम्बन्धी अनुमति व्यवस्थापन गर्नुहोस्"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"यो एपका हकमा ब्याकग्राउन्ड वा पुरानो डेटा एक्सेस अन गर्न रिड गर्नेसम्बन्धी कम्तीमा एउटा अनुमति अन गर्नुहोस्"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"यो एपका हकमा ब्याकग्राउन्ड एक्सेस अन गर्न रिड गर्नेसम्बन्धी कम्तीमा एउटा अनुमति अन गर्नुहोस्"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"यो एपका हकमा पुरानो डेटा एक्सेस अन गर्न रिड गर्नेसम्बन्धी कम्तीमा एउटा अनुमति अन गर्नुहोस्"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"यो एपलाई Health Connect का सबै पुराना जानकारी एक्सेस गर्न दिनुहोस्"</string>
     <string name="background_read_description" msgid="3203594555849969283">"तपाईंले यो एप प्रयोग नगरिरहेका बेला पनि यो एपलाई Health Connect मा भएका डेटा एक्सेस गर्न दिनुहोस्"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"तपाईंले यो अनुमति दिनुभयो भने तपाईंले एप प्रयोग नगरेका बेला पनि यो एपले Health Connect मा भएको डेटा एक्सेस गर्न सक्छ।"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"पुराना डेटा एक्सेस गर्ने अनुमति"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई पुराना डेटा एक्सेस गर्न दिने हो?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"यो एपलाई <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> अघि Health Connect मा हालिएका डेटा एक्सेस गर्न दिनुहोस्"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"यो एपलाई Health Connect को विगतको सबै डेटा एक्सेस गर्न दिनुहोस्"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"तपाईंले यो अनुमति दिनुभयो भने यो एपले <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> अघि Health Connect मा हालिएका डेटा एक्सेस गर्न सक्छ।"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"तपाईंले यो अनुमति दिनुभयो भने यो एपले Health Connect को विगतको सबै डेटा एक्सेस गर्न सक्छ।"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"सक्रिय हुँदा खर्च गरिएको क्यालोरी"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"सक्रिय हुँदा खर्च गरिएको क्यालोरी"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"सक्रिय हुँदा खर्च गरिएको क्यालोरी रिड गर्ने अनुमति दिनुहोस्"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ह्विलचेयरको ठेलाइ"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"ह्विलचेयरको ठेलाइसम्बन्धी डेटा रिड गर्ने अनुमति दिनुहोस्"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"ह्विलचेयरको ठेलाइसम्बन्धी डेटा राइट गर्ने अनुमति दिनुहोस्"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"क्रियाकलापको इन्टेन्सिटी"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"क्रियाकलापको इन्टेन्सिटी"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"क्रियाकलापको इन्टेन्सिटी रिड गर्नुहोस्"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"क्रियाकलापको इन्टेन्सिटी राइट गर्नुहोस्"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"बेसल मेटाबोलिक रेट"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"बेसल मेटाबोलिक रेट"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"बेसल मेटाबोलिक रेट रिड गर्ने अनुमति दिनुहोस्"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"छालाको तापक्रम"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"छालाको तापक्रमसम्बन्धी जानकारी रिड गर्ने"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"छालाको तापक्रमसम्बन्धी जानकारी राइट गर्ने"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"यसमा Health Connect मा सिंक गरिएका वा हालिएका सबै स्वास्थ्य अभिलेख समावेश गरिन्छ। यो तपाईंको पूर्ण मेडिकल रेकर्ड नहुन सक्छ र यसमा तपाईंका स्वास्थ्य अभिलेखका मेडिकल विवरण समावेश गरिँदैन।"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"सबै स्वास्थ्य अभिलेखहरू"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"सबै स्वास्थ्य अभिलेखहरू"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"सबै स्वास्थ्य अभिलेखहरू राइट गर्नुहोस्"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"एलर्जीहरू"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"एलर्जीहरू"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"एलर्जीहरू रिड गर्नुहोस्"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"खोप"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"खोप"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"खोपसम्बन्धी जानकारी रिड गर्नुहोस्"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"प्रयोगशालाका परिणामसम्बन्धी जानकारी"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"प्रयोगशालाका परिणामसम्बन्धी जानकारी"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"प्रयोगशालाका परिणामहरू रिड गर्नुहोस्"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"एलर्जीहरू"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"एलर्जीहरू"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"एलर्जीसम्बन्धी जानकारी रिड गर्नुहोस्"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"रोगहरू"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"रोगहरू"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"रोगसम्बन्धी जानकारी रिड गर्ने"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"खोपहरू"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"खोपहरू"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"खोपसम्बन्धी जानकारी रिड गर्नुहोस्"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ल्याब परीक्षणका नतिजाहरू"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ल्याब परीक्षणका नतिजाहरू"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ल्याब परीक्षणका नतिजाहरू रिड गर्नुहोस्"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"औषधि"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"औषधि"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"औषधिसम्बन्धी जानकारी रिड गर्नुहोस्"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"व्यक्तिगत विवरणहरू"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"व्यक्तिगत विवरणहरू"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"व्यक्तिगत विवरणहरू रिड गर्ने"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"चिकित्सकका विवरणहरू"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"चिकित्सकका विवरणहरू"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"चिकित्सकका विवरणहरू रिड गर्ने"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"गर्भावस्थासम्बन्धी जानकारी"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"गर्भावस्थासम्बन्धी जानकारी"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"गर्भावस्थासम्बन्धी जानकारी रिड गर्नुहोस्"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"समस्यासम्बन्धी जानकारी"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"समस्यासम्बन्धी जानकारी"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"समस्यासम्बन्धी जानकारी रिड गर्नुहोस्"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"प्रक्रियासम्बन्धी जानकारी"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"प्रक्रियासम्बन्धी जानकारी"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"प्रक्रियासम्बन्धी जानकारी रिड गर्नुहोस्"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"सामाजिक सञ्जालसम्बन्धी जानकारी"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"व्यक्तिगत जीवनसम्बन्धी विगतका जानकारी"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"सामाजिक सञ्जालसम्बन्धी जानकारी"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"सामाजिक सञ्जालसम्बन्धी जानकारीको हिस्ट्री रिड गर्नुहोस्"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"स्वास्थ्यसम्बन्धी आधारभूत विवरणसम्बन्धी जानकारी"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"भेटघाटहरू"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"भेटघाटहरू"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"भेटघाटसम्बन्धी विवरणहरू रिड गर्ने"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"स्वास्थ्यसम्बन्धी आधारभूत विवरण"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"स्वास्थ्यसम्बन्धी आधारभूत विवरणसम्बन्धी जानकारी"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"स्वास्थ्यसम्बन्धी आधारभूत विवरणसम्बन्धी जानकारी रिड गर्नुहोस्"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"सचेतना"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"सचेतना सत्रसम्बन्धी डेटा राइट गर्नुहोस्"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” लाई रिड गर्ने अनुमति दिनुहोस्"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” लाई राइट गर्ने अनुमति दिनुहोस्"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"रद्द गर्नुहोस्"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"अनुमति दिनुहोस्"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"एपलाई सबै अनुमति दिनुहोस्"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"अनुमति नदिनुहोस्"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"तपाईं यो एपलाई Health Connect मा कुन कुन डेटा रिड वा राइट गर्न दिन चाहनुहुन्छ छनौट गर्नुहोस्।"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"तपाईं यो एपलाई Health Connect मा कुन कुन जानकारी रिड वा राइट गर्न दिन चाहनुहुन्छ छनौट गर्नुहोस्"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"तपाईं यो एपलाई Health Connect मा कुन कुन जानकारी रिड गर्न दिन चाहनुहुन्छ छनौट गर्नुहोस्"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"तपाईं यो एपलाई Health Connect मा कुन कुन जानकारी राइट गर्न दिन चाहनुहुन्छ छनौट गर्नुहोस्"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"तपाईंले डेटा रिड गर्ने अनुमति दिनुभयो भने यो एपले नयाँ डेटाका साथै पछिल्ला ३० दिनका डेटा पनि रिड गर्न सक्छ"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"तपाईंले डेटा रिड गर्ने अनुमति दिनुभयो भने यो एपले नयाँ तथा पुराना डेटा रिड गर्न सक्छ"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई Health Connect प्रयोग गर्ने अनुमति दिने हो?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"तपाईं विकासकर्ताको <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> मा गई <xliff:g id="APP_NAME">%1$s</xliff:g> ले तपाईंको डेटा कसरी व्यवस्थापन गर्छ भन्ने बारेमा जान्न सक्नुहुन्छ"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई व्यायाम तथा तन्दुरुस्तीसम्बन्धी जानकारी एक्सेस गर्न दिने हो?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"तपाईं <xliff:g id="APP_NAME">%1$s</xliff:g> को <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> पढेर यसले तपाईंको जानकारी कसरी व्यवस्थापन गर्छ भन्ने बारेमा जान्न सक्नुहुन्छ"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"गोपनीयता नीति"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई तपाईंका स्वास्थ्य अभिलेखहरू एक्सेस गर्न दिने हो?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"तपाईंले यो एपलाई एक्सेस दिनुभयो भने यसले एलर्जी, ल्याब परीक्षणका नतिजा र खोपलगायतका जानकारी रिड र राइट गर्न सक्छ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"तपाईंले यो एपलाई एक्सेस दिनुभयो भने यसले एलर्जी, ल्याब परीक्षणका नतिजा र खोपलगायतका जानकारी रिड गर्न सक्छ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"स्वास्थ्य अभिलेखका बारेमा जानकारी"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"सेयर गर्नु पर्ने डेटाअन्तर्गत निम्न कुरा पर्छन्:"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"तपाईंले <xliff:g id="APP_NAME">%1$s</xliff:g> लाई यो अनुमति दिनुभयो भने यसले Health Connect सँग तपाईंका स्वास्थ्य अभिलेखहरू सेयर गर्न सक्छ।"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"आफ्ना सबै स्वास्थ्य अभिलेखहरू एउटै ठाउँमा राख्न विभिन्न एप र स्रोतका स्वास्थ्य अभिलेखहरू सिंक गर्नुहोस्"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"एपलाई दिइएका सबै अनुमति हटाउने हो?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"सबै हटाउनुहोस्"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि Health Connect मा भएको कुनै पनि डेटा रिड वा राइट गर्न सक्ने छैन।\n\nयसले गर्दा यो एपलाई दिइएका क्यामेरा, माइक्रोफोन वा लोकेसनलगायतका कुरा प्रयोग गर्ने अनुमति बदलिने छैन।"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अब पुरानो डेटासहित Health Connect मा भएको कुनै पनि डेटा रिड वा राइट गर्न सक्ने छैन।\n\nयसले गर्दा यो एपलाई दिइएका लोकेसन, क्यामेरा वा माइक्रोफोन प्रयोग गर्नेलगायतका अनुमतिमा कुनै प्रभाव पार्दैन।"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अब ब्याकग्राउन्ड र पुरानो डेटासहित Health Connect मा भएको कुनै पनि डेटा रिड वा राइट गर्न सक्ने छैन।\n\nयसले गर्दा यो एपलाई दिइएका लोकेसन, क्यामेरा वा माइक्रोफोन प्रयोग गर्नेलगायतका अनुमतिमा कुनै प्रभाव पार्दैन।"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect बाट <xliff:g id="APP_NAME">%1$s</xliff:g> को डेटा पनि मेटाउनुहोस्"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"एपलाई दिइएका सबै अनुमति हटाउने हो?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"स्वास्थ्य अभिलेखसम्बन्धी सबै अनुमति हटाउने हो?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"तन्दुरुस्ती तथा आरोग्यसम्बन्धी सबै अनुमतिहरू हटाउने हो?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connect बाट <xliff:g id="APP_NAME">%1$s</xliff:g> मा भएको व्यायामसम्बन्धी जानकारी पनि मेटाउनुहोस्"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"स्वास्थ्य अभिलेखसम्बन्धी सबै अनुमति हटाउने हो?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connect बाट <xliff:g id="APP_NAME">%1$s</xliff:g> मा भएका स्वास्थ्य अभिलेख पनि मेटाउनुहोस्"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि Health Connect मा भएको यो जानकारी रिड वा राइट गर्न सक्ने छैन।\n\nतपाईंले यसो गर्नुभयो भने यो एपलाई दिइएको हुन सक्ने क्यामेरा, माइक्रोफोन वा लोकेसन प्रयोग गर्ने अनुमति जस्ता अन्य अनुमतिमा कुनै प्रभाव पर्ने छैन।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि ब्याकग्राउन्डसम्बन्धी जानकारीसहित Health Connect मा भएको यो जानकारी रिड वा राइट गर्न सक्ने छैन।\n\nतपाईंले यसो गर्नुभयो भने यो एपलाई दिइएको हुन सक्ने क्यामेरा, माइक्रोफोन वा लोकेसन प्रयोग गर्ने अनुमति जस्ता अन्य अनुमतिमा कुनै प्रभाव पर्ने छैन।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि विगतको जानकारीसहित Health Connect मा भएको यो जानकारी रिड वा राइट गर्न सक्ने छैन।\n\nतपाईंले यसो गर्नुभयो भने यो एपलाई दिइएको हुन सक्ने क्यामेरा, माइक्रोफोन वा लोकेसन प्रयोग गर्ने अनुमति जस्ता अन्य अनुमतिमा कुनै प्रभाव पर्ने छैन।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि ब्याकग्राउन्डसम्बन्धी जानकारी र विगतको जानकारीसहित Health Connect मा भएको यो जानकारी रिड वा राइट गर्न सक्ने छैन।\n\nतपाईंले यसो गर्नुभयो भने यो एपलाई दिइएको हुन सक्ने क्यामेरा, माइक्रोफोन वा लोकेसन प्रयोग गर्ने अनुमति जस्ता अन्य अनुमतिमा कुनै प्रभाव पर्ने छैन।"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"एपलाई दिइएका सबै अनुमति हटाउने हो?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि Health Connect मा भएका जानकारी रिड वा राइट गर्न सक्ने छैन।\n\nयसले गर्दा यो एपलाई दिइएका क्यामेरा, माइक्रोफोन वा लोकेसन प्रयोग गर्ने अनुमतिलगायतको अन्य कुनै पनि अनुमति परिवर्तन हुने छैन।"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि Health Connect मा भएका ब्याकग्राउन्डका जानकारीलगायतका जानकारी रिड वा राइट गर्न सक्ने छैन।\n\nयसले गर्दा यो एपलाई दिइएका क्यामेरा, माइक्रोफोन वा लोकेसन प्रयोग गर्ने अनुमतिलगायतको अन्य कुनै पनि अनुमति परिवर्तन हुने छैन।"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि Health Connect मा भएका विगतका जानकारीलगायतका जानकारी रिड वा राइट गर्न सक्ने छैन।\n\nयसले गर्दा यो एपलाई दिइएका क्यामेरा, माइक्रोफोन वा लोकेसन प्रयोग गर्ने अनुमतिलगायतको अन्य कुनै पनि अनुमति परिवर्तन हुने छैन।"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अबदेखि Health Connect मा भएका ब्याकग्राउन्ड र विगतका जानकारीलगायतका जानकारी रिड वा राइट गर्न सक्ने छैन।\n\nयसले गर्दा यो एपलाई दिइएका क्यामेरा, माइक्रोफोन वा लोकेसन प्रयोग गर्ने अनुमतिलगायतको अन्य कुनै पनि अनुमति परिवर्तन हुने छैन।"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Health Connect बाट <xliff:g id="APP_NAME">%1$s</xliff:g> मा भएका व्यायामसम्बन्धी जानकारी र स्वास्थ्य अभिलेख पनि मेटाउनुहोस्"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"यो एपलाई दिइएका अनुमति हटाइएको छ"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Health Connect का सबै डेटा पनि मेटाउनुहोस्"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"अर्को दिन"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"चयन गरिएको दिन"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"अघिल्लो दिन"</string>
     <string name="default_error" msgid="7966868260616403475">"कुनै समस्या आयो। कृपया फेरि प्रयास गर्नुहोस्।"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"अज्ञात स्रोत"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"डेटाको स्रोत"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>ओपन ब्राकेट।"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>क्लोज्ड ब्राकेट।"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> फिल्ड <xliff:g id="FIELD">%2$s</xliff:g> को मान"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"यी एपहरूले अबदेखि Health Connect प्रयोग गर्न पाउँदैनन् तर Health Connect मा भने अझै पनि यी एपहरूसम्बन्धी डेटा भण्डारण गरिएको छ"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> पछि हालिएका जानकारी रिड गर्न सक्छ"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"तपाईं यो एपले प्रयोग गर्न सक्ने Android का अन्य अनुमति व्यवस्थापन गर्न चाहनुहुन्छ भने \"सेटिङ &gt; एपहरू\" मा जानुहोस्"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"तपाईंले <xliff:g id="APP_NAME">%1$s</xliff:g> सँग सेयर गर्नुभएको डेटा उक्त एपको गोपनीयता नीतिबमोजिम प्रयोग गरिन्छ"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"तपाईं विकासकर्ताको गोपनीयता नीतिमा गई <xliff:g id="APP_NAME">%1$s</xliff:g> ले तपाईंको जानकारी कसरी व्यवस्थापन गर्छ भन्ने बारेमा जान्न सक्नुहुन्छ"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"तपाईं यो एपले प्रयोग गर्न सक्ने Android का अन्य अनुमति व्यवस्थापन गर्न चाहनुहुन्छ भने सेटिङमा गई \"एपहरू\" मा ट्याप गर्नुहोस्"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"गोपनीयता नीति पढ्नुहोस्"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"पछिल्लो २४ घण्टामा प्रयोग गरिएको"</string>
     <string name="app_access_title" msgid="7137018424885371763">"एपलाई दिइएका अनुमति"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"तपाईंले अहिले कुनै पनि कम्प्याटिबल एप इन्स्टल गर्नुभएको छैन"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"अतिरिक्त एक्सेस"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"विगतको डेटा, ब्याकग्राउन्ड डेटा"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"यो एपलाई दिइएका अतिरिक्त अनुमतिहरू हटाइएका छन्"</string>
     <string name="permissions_header" msgid="6519976063360071569">"अनुमति"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"तन्दुरुस्ती तथा आरोग्य"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"कसरत, निद्रा, पोषण र अन्य कुरा"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"स्वास्थ्य अभिलेखहरू"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"स्वास्थ्य अभिलेखहरू"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ल्याबका परिणाम, औषधि, खोप र अन्य कुरा"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ल्याब परीक्षणका नतिजा, औषधि, खोप र अन्य कुरा"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"एपलाई दिइएका अनुमति रद्द गरिएका छन्"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect ले <xliff:g id="APP_DATA">%s</xliff:g> लाई दिइएका अनुमति रद्द गरेको छ"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect ले <xliff:g id="APP_DATA_0">%1$s</xliff:g> र <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> लाई दिइएका अनुमति रद्द गरेको छ"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play स्टोरमा जानुहोस्"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect चलाउन थाल्नुहोस्"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ले तपाईंको स्वास्थ्य र तन्दुरुस्तीसम्बन्धी जानकारी भण्डारण गर्छ र तपाईंलाई आफ्नो डिभाइसमा विभिन्न एपहरू सरल तरिकाले सिंक गर्ने सुविधा दिन्छ"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ले विभिन्न एपहरूमा भएको तपाईंको स्वास्थ्य र तन्दुरुस्तीसम्बन्धी जानकारी भण्डारण र सिंक गर्छ।\n\n"<b>"कसरत सत्र, पाइलाको सङ्ख्या, पोषण र निद्रालगायत"</b>" स्वास्थ्य र तन्दुरुस्तीसम्बन्धी जानकारी\n\n"<b>"खोप तथा ल्याब परीक्षणका नतिजालगायत"</b>" स्वास्थ्य अभिलेखहरू"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"तपाईं Health Connect मार्फत निम्न कार्यहरू गर्न सक्नुहुन्छ:"</string>
     <string name="share_data" msgid="3481932156368883946">"आफ्ना एपहरूसँग डेटा सेयर गर्नुहोस्"</string>
     <string name="share_data_description" msgid="2919871301634375092">"हरेक एपलाई कुन कुन डेटा Health Connect मा रिड वा राइट गर्न दिने भन्ने कुरा छनौट गर्नुहोस्"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"आफ्ना सेटिङ मिलाउनुहोस् र गोपनीयता व्यवस्थापन गर्नुहोस्"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"हल्का रजस्राव"</string>
     <string name="flow_medium" msgid="3783688724668943154">"मध्यम रजस्राव"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"उच्च रजस्राव"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"रगत बहाबका बारेमा थाहा छैन"</string>
     <string name="period_day" msgid="3821944462093965882">"महिनावारी भएको <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> मध्ये <xliff:g id="DAY">%1$d</xliff:g> दिन"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{महिनावारी (१ दिन)}other{महिनावारी (# दिन)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"पोजेटिभ"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"नेगेटिभ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"उच्च"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"सङ्गीत"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"अन्य"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"निर्देशन नदिइने"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"मध्यम"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"कडा"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> मिनेट"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> घण्टा <xliff:g id="MIN">%2$s</xliff:g> मिनेट"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> घण्टा"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"इन्टिग्रेट गरिँदै छ"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect Android सिस्टममा इन्टिग्रेट गरिँदै छ।\n\nतपाईंका जानकारी र अनुमति ट्रान्स्फर भइरहेकाले यो प्रक्रिया पूरा हुन केही समय लाग्न सक्छ।"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"तपाईंले यो प्रक्रिया पूरा भएको सूचना प्राप्त नगरुन्जेल यो एप बन्द नगर्नुहोला।"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect इन्टिग्रेट गरिँदै छ"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"अपडेट गर्नु पर्ने हुन्छ"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"तपाईं सीधै सेटिङबाटै Health Connect प्रयोग गर्न सक्नुहोस् भन्नाका लागि उक्त एप Android सिस्टममा इन्टिग्रेट गरिँदै छ।"</string>
     <string name="update_button" msgid="4544529019832009496">"अपडेट गर्नुहोस्"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Health Connect ले तपाईंको सिस्टमसम्बन्धी सेटिङअनुसार इन्टिग्रेट गरिराख्न सकोस् भन्नाका लागि यो अपडेट गर्न थाल्नुहोस्"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"अहिले नै अपडेट गर्नुहोस्"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"सिस्टम अपडेट गर्नु पर्ने हुन्छ"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"जारी राख्नुअघि आफ्नो फोनको सिस्टम अपडेट गर्नुहोस्।"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"तपाईंले आफ्नो फोनको सिस्टम अपडेट गरिसक्नुभएको छ भने आफ्नो फोन रिस्टार्ट गरेर इन्टिग्रेट गर्ने प्रक्रिया जारी राख्ने प्रयास गर्नुहोस्"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect अपडेट गर्नु पर्ने हुन्छ"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"जारी राख्नुअघि Health Connect एप अपडेट गरी नवीनतम संस्करण इन्स्टल गर्नुहोस्।"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"अझ धेरै खाली ठाउँ चाहिन्छ"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect लाई इन्टिग्रेट गर्ने प्रक्रिया जारी राख्नका निम्ति तपाईंको फोनको भण्डारणमा <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> खाली ठाउँ चाहिन्छ।\n\nआफ्नो फोनको भण्डारणमा केही ठाउँ खाली गर्नुहोस् अनि फेरि प्रयास गर्नुहोस्।"</string>
     <string name="try_again_button" msgid="8745496819992160789">"फेरि प्रयास गर्नुहोस्"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ठाउँ खाली गर्नुहोस्"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"अझ धेरै खाली ठाउँ चाहिन्छ"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect लाई इन्टिग्रेट गर्ने प्रक्रिया जारी राख्नका निम्ति तपाईंको फोनको भण्डारणमा <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> खाली ठाउँ चाहिन्छ।"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"इन्टिग्रेट गर्ने प्रक्रिया पज गरिएको छ"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Android सिस्टममा इन्टिग्रेट गर्ने क्रममा Health Connect एप बन्द भएको थियो।\n\nयो एप फेरि खोल्न \"सुचारु गर्नुहोस्\" बटनमा क्लिक गर्नुहोस् र आफ्ना जानकारी तथा अनुमति ट्रान्स्फर गर्ने कार्य जारी राख्नुहोस्।"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect मा भएको आफ्नो जानकारी सुरक्षित राख्नका निम्ति यो प्रक्रिया <xliff:g id="TIME_NEEDED">%1$s</xliff:g> भित्र पूरा गर्नुहोस्"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect लाई Android सिस्टममा इन्टिग्रेट गर्ने प्रक्रिया जारी राख्न ट्याप गर्नुहोस्। आफ्नो जानकारी सुरक्षित राख्नका निम्ति यो प्रक्रिया <xliff:g id="TIME_NEEDED">%1$s</xliff:g> भित्र पूरा गर्नुहोस्"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect Android system मा इन्टिग्रेट गर्ने प्रक्रिया जारी राख्न ट्याप गर्नुहोस्।"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"जारी राख्नुहोस्"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect इन्ट्रिग्रेट गर्ने प्रक्रिया सुचारु गर्नुहोस्"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"आफ्नो जानकारी सुरक्षित राख्नका निम्ति यो प्रक्रिया <xliff:g id="TIME_NEEDED">%1$s</xliff:g> भित्र पूरा गर्नुहोस्"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"एप अपडेट गर्नु आवश्यक छ"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect सँग सिंक गरिरहन <xliff:g id="APP_NAME">%1$s</xliff:g> अपडेट गर्नु पर्ने हुन्छ"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect सँग सिंक गरिरहन केही एपहरू अपडेट गर्नु पर्ने हुन्छ"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect सँग सिंक गरिरहन <xliff:g id="APP_NAME">%1$s</xliff:g> अपडेट गर्नु पर्ने हुन्छ। सबै एपहरूका हकमा अपडेट उपलब्ध नहुन सक्छ।"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect सँग सिंक गरिरहन केही एपहरू अपडेट गर्नु पर्ने हुन्छ। सबै एपहरूका हकमा अपडेट उपलब्ध नहुन सक्छ।"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"अपडेटहरू उपलब्ध छन् कि छैनन् भन्ने कुरा जाँच्नुहोस्"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"थप जान्नुहोस्"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect इन्टिग्रेट गर्ने प्रक्रिया"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect इन्टिग्रेट गर्ने प्रक्रिया पूरा भएन"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"यो फेरि उपलब्ध भएपछि तपाईं एउटा सूचना प्राप्त गर्नु हुने छ।"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"बुझेँ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect इन्टिग्रेट गर्ने प्रक्रिया पूरा भएन"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"थप पढ्नुहोस्"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect इन्टिग्रेट गर्ने प्रक्रिया पूरा भयो"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"खोल्नुहोस्"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"नयाँ के छ"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"तपाईं अब सेटिङमा गई सीधै Health Connect एक्सेस गर्न सक्नुहुन्छ। जुनसुकै बेला Health Connect एप अनइन्स्टल गरेर भण्डारणमा ठाउँ खाली गर्नुहोस्।"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"बुझेँ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"एपका स्रोत सम्पादन गर्नुहोस्"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"डिफल्ट डिभाइस"</string>
     <string name="app_data_title" msgid="6499967982291000837">"एपसम्बन्धी डेटा"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect एक्सेस गर्न सक्ने एपहरूको डेटा यहाँ देखिने छ"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा भएको डेटा यहाँ देखिने छ"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect एक्सेस गर्न सक्ने एपहरूमा भएको डेटा यहाँ देखिने छ"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"दिन"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"हप्ता"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"महिना"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"गत महिना"</string>
     <string name="tab_entries" msgid="3402700951602029493">"इन्ट्रीहरू"</string>
     <string name="tab_access" msgid="7818197975407243701">"एक्सेस"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई थप अनुमति दिने हो?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले Health Connect का यी सेटिङ पनि एक्सेस गर्ने अनुमति माग्दै छ"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"यो एपका हकमा ब्याकग्राउन्ड वा पुरानो डेटा एक्सेस अन गर्न रिड गर्नेसम्बन्धी कम्तीमा एउटा अनुमति अन गर्नुहोस्"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"यो एपका हकमा ब्याकग्राउन्ड एक्सेस अन गर्न रिड गर्नेसम्बन्धी कम्तीमा एउटा अनुमति अन गर्नुहोस्"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"यो एपका हकमा पुरानो डेटा एक्सेस अन गर्न रिड गर्नेसम्बन्धी कम्तीमा एउटा अनुमति अन गर्नुहोस्"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect प्रयोग गर्न थाल्नुहोस्"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"तपाईं सर्वप्रथम जुन जुन एपहरूका बिचमा स्वास्थ्य तथा तन्दुरुस्तीसम्बन्धी डेटा सेयर गर्न चाहनुहुन्छ ती एपहरू सिंक गर्नुहोस्"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"सेटअप गर्नुहोस्"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"कम्प्याटिबल एपहरू हेर्नुहोस्"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect मार्फत <xliff:g id="APP_NAME">%s</xliff:g> सँग सिंक गर्नका निम्ति थप एपहरू भेट्टाउनुहोस्"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"एप स्टोरमा हेर्नुहोस्"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"स्क्रिन लक सेट गर्नुहोस्"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"आफ्नो स्वास्थ्यसम्बन्धी जानकारी अझ सुरक्षित राख्न यो डिभाइसमा PIN, प्याटर्न वा पासवर्ड सेट गर्नुहोस्"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"स्क्रिन लक सेट गर्नुहोस्"</string>
     <string name="select_all" msgid="837499881590001166">"सबै चयन गर्नुहोस्"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"कनेक्ट गरिएका एपहरूले अबदेखि Health Connect मा भएको यो जानकारी रिड गर्न सक्ने छैनन्"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"चिन्ह लगाइएको"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"चिन्ह नलगाइएको"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"कसरत गर्ने ठाउँमा जाने मार्गको नक्सा उपलब्ध छ"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"अर्को दिन"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"अर्को हप्ता"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"अर्को महिना"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"अघिल्लो दिन"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"अघिल्लो हप्ता"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"अघिल्लो महिना"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"सबै जानकारी सदाका लागि मेटाउने हो?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"चयन गरिएका जानकारी सदाका लागि मेटाउने हो?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g> मा भएका सबै जानकारी सदाका लागि मेटाउने हो?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा भएका <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> का चयन गरिएका इन्ट्रीहरू सदाका लागि मेटाउने हो?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा भएका <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> का चयन गरिएका इन्ट्रीहरू सदाका लागि मेटाउने हो?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"<xliff:g id="APP_NAME">%s</xliff:g> मा भएको यो इन्ट्री सदाका लागि मेटाउने हो?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> मा भएको <xliff:g id="DATA_TYPE">%1$s</xliff:g> सम्बन्धी डेटा सदाका लागि मेटाउने हो?"</string>
+    <string name="on" msgid="8266542510798355807">"अन छ"</string>
+    <string name="off" msgid="6996623844428550649">"अफ छ"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g> मा एक्सेस गरिएको"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"हिजो <xliff:g id="TIME_DATE">%1$s</xliff:g> मा एक्सेस गरिएको"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> मा एक्सेस गरिएको"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"सधैँ अनुमति दिनुहोस्"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"चयन गरिएका कुराहरूको एक्सेस दिनुहोस्"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"एप चलाएका बेला"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"सबै अस्वीकार गर्नुहोस्"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई व्यायाम तथा तन्दुरुस्तीसम्बन्धी डेटा एक्सेस गर्न दिने हो?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले <xliff:g id="DATA_TYPES">%2$s</xliff:g> एक्सेस गर्ने अनुमति मागिरहेको छ।\n\nसबै डेटा एक्सेस गर्ने अनुमति दिनुहोस् वा तिनीहरूलाई एक एक गरी नियन्त्रण गर्नुहोस्।"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई <xliff:g id="DATA_TYPE">%2$s</xliff:g> प्रयोग गर्ने अनुमति दिने हो?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"तन्दुरुस्ती तथा आरोग्य"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"सधैँ"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"प्रयोग गर्दै गर्दा"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"सधैँ"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"प्रयोग गर्दै गर्दा"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> तन्दुरुस्ती तथा आरोग्यसम्बन्धी तपाईंका सबै जानकारी <xliff:g id="ALLOW_MODE">%2$s</xliff:g> एक्सेस गर्न सक्छ"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"एक्सेस गर्ने अनुमति दिइएको छ"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"रिड गर्ने अनुमति दिइएको छ"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"तपाईंले यी अनुमति दिनुभयो भने <xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइसका सेन्सरहरूबाट लिइएको जानकारी एक्सेस गर्न सक्छ।"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> वटामध्ये <xliff:g id="NUMBER_0">%1$d</xliff:g> वटा एपलाई अनुमति दिइएको छ"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"कुनै पनि एपले अनुमति मागिरहेको छैन"</string>
+    <string name="allowed" msgid="4158456017482263737">"अनुमति दिइएको छ"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"अनुमति दिइएको छैन"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"यो अनुमति पाएका एपहरू तपाईंको डिभाइसका सेन्सरहरूबाट लिइएको <xliff:g id="DATA_TYPE">%s</xliff:g> सँग सम्बन्धित जानकारी एक्सेस गर्न सक्छन्।"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"आफ्नो स्मार्ट वाचमा भएका सबै एपहरूका हकमा <xliff:g id="DATA_TYPE">%s</xliff:g> को एक्सेस हटाउने हो?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"जाँच चिन्ह"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"क्रस चिन्ह"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"हाल <xliff:g id="APP_NAME">%1$s</xliff:g> लाई <xliff:g id="ALLOW_MODE">%2$s</xliff:g> तन्दुरुस्ती तथा आरोग्यसम्बन्धी जानकारी एक्सेस गर्ने अनुमति दिइएको छ"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई सधैँ तन्दुरुस्ती तथा आरोग्यसम्बन्धी जानकारी एक्सेस गर्न दिने हो?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई <xliff:g id="DATA_TYPES">%2$s</xliff:g> एक्सेस गर्ने अनुमति दिइएको छ।"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"तन्दुरुस्ती तथा आरोग्यसम्बन्धी अनुमतिहरू व्यवस्थापन गर्नुहोस्"</string>
 </resources>
diff --git a/apk/res/values-nl/strings.xml b/apk/res/values-nl/strings.xml
index baee43d..301f9ec 100644
--- a/apk/res/values-nl/strings.xml
+++ b/apk/res/values-nl/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Beheer de gezondheids- en fitnessgegevens op je apparaat en bepaal welke apps er toegang toe krijgen"</string>
     <string name="data_title" msgid="4456619761533380816">"Gegevens en toegang"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Browsen door medisch dossier"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Bekijk je medische dossiers en welke apps er toegang toe hebben"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Alle categorieën"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Alle categorieën bekijken"</string>
     <string name="no_data" msgid="1906986019249068659">"Geen gegevens"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Gisteren"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lezen: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Schrijven: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Rechten beheren"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Tijd: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activiteit"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"je gezondheidsgegevens openen"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Verbrande calorieën lezen"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Hiermee kan een app de verbrande calorieën lezen"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Toegang tot gegevens op de achtergrond"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot gegevens op de achtergrond?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot gegevens op de achtergrond?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Als je dit toestaat, heeft deze app toegang tot fitness- en welzijnsgegevens en medische dossiers wanneer je de app niet gebruikt."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Als je dit toestaat, heeft deze app toegang tot medische dossiers wanneer je de app niet gebruikt."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Als je dit toestaat, heeft deze app toegang tot fitness- en welzijnsgegevens wanneer je de app niet gebruikt."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Als je dit toestaat, heeft deze app toegang tot Health Connect-gegevens wanneer je de app niet gebruikt."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot eerdere gegevens?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Als je dit toestaat, heeft deze app toegang tot fitness- en welzijnsgegevens die vóór <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> zijn toegevoegd."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Als je dit toestaat, heeft deze app toegang tot alle eerdere fitness- en welzijnsgegevens."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Als je dit toestaat, heeft deze app toegang tot Health Connect-gegevens die vóór <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> zijn toegevoegd."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Als je dit toestaat, heeft deze app toegang tot alle eerdere Health Connect-gegevens."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Aanvullende toegang geven voor <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> wil ook toegang tot deze Health Connect-instellingen"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Toegang tot alle gegevens op de achtergrond"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Toegang tot medische dossiers op de achtergrond"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Toegang tot fitness- en welzijnsgegevens op de achtergrond"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Geef deze app toegang tot fitness- en welzijnsgegevens en medische dossiers wanneer je de app niet gebruikt"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Geef deze app toegang tot deze gegevens wanneer je de app niet gebruikt"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Geef deze app toegang tot deze gegevens wanneer je de app niet gebruikt"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Toegang tot gegevens op de achtergrond"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Geef deze app toegang tot Health Connect-gegevens wanneer je de app niet gebruikt"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Toegang tot eerdere fitness- en welzijnsgegevens"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Geef deze app toegang tot gegevens die vóór <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> zijn toegevoegd"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Geef deze app toegang tot alle eerdere gegevens"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Toegang tot eerdere gegevens"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Geef deze app toegang tot Health Connect-gegevens die vóór <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> zijn toegevoegd"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Geef deze app toegang tot alle eerdere Health Connect-gegevens"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> heeft al toegang tot eerdere gegevens van je medische dossiers"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Meer informatie over rechten"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Toegang tot alle gegevens op de achtergrond"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Toegang tot medische dossiers op de achtergrond"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Toegang tot fitness- en welzijnsgegevens op de achtergrond"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Geef deze app toegang tot fitness- en welzijnsgegevens en medische dossiers wanneer je de app niet gebruikt"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Geef deze app toegang tot deze gegevens wanneer je de app niet gebruikt"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Geef deze app toegang tot deze gegevens wanneer je de app niet gebruikt"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Toegang tot gegevens op de achtergrond"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Geef deze app toegang tot Health Connect-gegevens wanneer je de app niet gebruikt"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Toegang tot eerdere fitness- en welzijnsgegevens"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Geef deze app toegang tot gegevens die vóór <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> zijn toegevoegd"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Geef deze app toegang tot alle eerdere gegevens"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Toegang tot eerdere gegevens"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Geef deze app toegang tot Health Connect-gegevens die vóór <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> zijn toegevoegd"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Geef deze app toegang tot alle eerdere Health Connect-gegevens"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Er worden op dit moment geen fitnessgegevens gelezen omdat <xliff:g id="APP_NAME">%1$s</xliff:g> geen leesrechten heeft"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> heeft al toegang tot eerdere gegevens voor je medische dossiers. Zet de rechten voor medische dossiers voor deze app uit om dit te wijzigen"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Rechten voor medische dossiers beheren"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Zet ten minste één toestemming voor lezen aan om toegang tot achtergrondgegevens of eerdere gegevens voor deze app aan te zetten"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Zet ten minste één toestemming voor lezen aan om achtergrondtoegang voor deze app aan te zetten"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Zet ten minste één toestemming voor lezen aan om toegang tot eerdere gegevens voor deze app aan te zetten"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Geef deze app toegang tot alle eerdere Health Connect-gegevens"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Geef deze app toegang tot Health Connect-gegevens als je de app niet gebruikt"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Als je dit toestaat, heeft deze app toegang tot Health Connect-gegevens als je de app niet gebruikt."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Toegang tot eerdere gegevens"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot eerdere gegevens?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Geef deze app toegang tot Health Connect-gegevens die vóór <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> zijn toegevoegd"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Geef deze app toegang tot alle eerdere Health Connect-gegevens"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Als je dit toestaat, heeft deze app toegang tot Health Connect-gegevens die vóór <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> zijn toegevoegd."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Als je dit toestaat, heeft deze app toegang tot alle eerdere Health Connect-gegevens."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Verbrande actieve calorieën"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"verbrande actieve calorieën"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Gegevens over verbrande actieve calorieën lezen"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"rolstoelduwen"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Gegevens over rolstoelduwen lezen"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Gegevens over rolstoelduwen schrijven"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Activiteitsintensiteit"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"activiteitsintensiteit"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Gegevens over activiteitsintensiteit lezen"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Gegevens over activiteitsintensiteit schrijven"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basaal metabolisme"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basaal metabolisme"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Gegevens over basaal metabolisme lezen"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"huidtemperatuur"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Huidtemperatuur lezen"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Huidtemperatuur schrijven"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Dit omvat alle medische gegevens die zijn gesynchroniseerd met en toegevoegd aan Health Connect. Dit is misschien niet je volledige medische dossier en dit bevat geen medische beschrijving van je medische gegevens."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Alle medische gegevens"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"alle medische gegevens"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Alle medische gegevens schrijven"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergieën"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergieën"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Allergieën lezen"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Vaccinatie"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"vaccinatie"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Vaccinatie lezen"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratoriumresultaten"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratoriumresultaten"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Laboratoriumresultaten lezen"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergieën"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergieën"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Allergieën lezen"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Aandoeningen"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"aandoeningen"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Aandoeningen lezen"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccinaties"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccinaties"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Vaccinaties lezen"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Labuitslagen"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"labuitslagen"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Labuitslagen lezen"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Gegevens over geneesmiddelen"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"gegevens over geneesmiddelen"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Gegevens over geneesmiddelen lezen"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Persoonsgegevens"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"persoonsgegevens"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Persoonsgegevens lezen"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Gegevens van de behandelaar"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"gegevens van de behandelaar"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Gegevens van de behandelaar lezen"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Zwangerschap"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"zwangerschap"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Zwangerschap lezen"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemen"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"Problemen"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Problemen lezen"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedures"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedures"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Procedures lezen"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sociale geschiedenis"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sociale geschiedenis"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sociale geschiedenis"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Sociale geschiedenis lezen"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitale functies"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Bezoeken"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"bezoeken"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Bezoeken lezen"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitale functies"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitale functies"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Vitale functies lezen"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Mindfulness schrijven"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"<xliff:g id="APP_NAME">%1$s</xliff:g> toestaan te lezen"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"<xliff:g id="APP_NAME">%1$s</xliff:g> toestaan te schrijven"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Annuleren"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Toestaan"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Alles toestaan"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Niet toestaan"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Bepaal welke gegevens deze app mag lezen of schrijven in Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Bepaal welke gegevens deze app mag lezen of schrijven in Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Bepaal welke gegevens deze app mag lezen in Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Bepaal welke gegevens deze app mag schrijven in Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Als je leestoegang geeft, kan de app nieuwe gegevens en gegevens van de afgelopen 30 dagen lezen"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Als je leestoegang geeft, kan de app nieuwe en eerdere gegevens lezen"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"In het <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> van de ontwikkelaar lees je hoe <xliff:g id="APP_NAME">%1$s</xliff:g> omgaat met je gegevens."</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot eerdere fitness- en welzijnsgegevens?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"In het <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> van <xliff:g id="APP_NAME">%1$s</xliff:g> staat de app omgaat met je gegevens."</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"privacybeleid"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot je medische dossiers?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Als je toegang geeft, kan de app gegevens lezen en schrijven, zoals allergieën, labresultaten en vaccinaties\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Als je toegang geeft, kan de app gegevens lezen, zoals allergieën, labresultaten en vaccinaties\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Over medische dossiers"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Gegevens om te delen zijn onder andere"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Als je dit toestaat, kan <xliff:g id="APP_NAME">%1$s</xliff:g> je medische dossiers delen met Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synchroniseer je medische dossiers uit verschillende apps en bronnen om deze op één plek te bewaren"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Alle rechten verwijderen?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Alles verwijderen"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan geen gegevens van Health Connect meer lezen of schrijven.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan geen gegevens van Health Connect meer lezen of schrijven, waaronder eerdere gegevens.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor locatie, de camera of de microfoon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan dan geen gegevens van Health Connect meer lezen of schrijven, waaronder achtergrondgegevens en eerdere gegevens.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor locatie, de camera of de microfoon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Gegevens van <xliff:g id="APP_NAME">%1$s</xliff:g> ook verwijderen uit Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"All rechten verwijderen?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Alle rechten voor medische dossiers verwijderen?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Alle rechten voor fitness en welzijn verwijderen?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Fitnessgegevens van <xliff:g id="APP_NAME">%1$s</xliff:g> ook verwijderen uit Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Alle rechten voor medische dossiers verwijderen?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Medische dossiers van <xliff:g id="APP_NAME">%1$s</xliff:g> ook verwijderen uit Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan deze gegevens van Health Connect niet meer lezen of schrijven.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan deze gegevens van Health Connect niet meer lezen of schrijven, waaronder achtergrondgegevens.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan deze gegevens van Health Connect niet meer lezen of schrijven, waaronder eerdere gegevens.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan deze gegevens van Health Connect niet meer lezen of schrijven, waaronder achtergrondgegevens en eerdere gegevens.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"All rechten verwijderen?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan geen gegevens van Health Connect meer lezen of schrijven.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan geen gegevens van Health Connect meer lezen of schrijven, waaronder achtergrondgegevens.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan geen gegevens van Health Connect meer lezen of schrijven, waaronder eerdere gegevens.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan geen gegevens van Health Connect meer lezen of schrijven, waaronder achtergrondgegevens en eerdere gegevens.\n\nDit heeft geen effect op andere rechten die deze app misschien heeft, zoals voor de camera, microfoon of locatie."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Fitnessgegevens en medische dossiers van <xliff:g id="APP_NAME">%1$s</xliff:g> ook verwijderen uit Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Rechten voor deze app verwijderd"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Alle Health Connect-gegevens ook verwijderen"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Volgende dag"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Geselecteerde dag"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Vorige dag"</string>
     <string name="default_error" msgid="7966868260616403475">"Er is iets misgegaan. Probeer het opnieuw."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Onbekende bron"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Brongegevens"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Vierkant haakje openen."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Vierkant haakje sluiten."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Veld <xliff:g id="FIELD">%2$s</xliff:g> Waarde"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Deze apps hebben geen toegang meer, maar hebben nog wel opgeslagen gegevens in Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan gegevens lezen die zijn toegevoegd na <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>."</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Ga naar Instellingen &gt; Apps om andere Android-rechten te geven aan deze app."</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Gegevens die je met <xliff:g id="APP_NAME">%1$s</xliff:g> deelt, vallen onder het privacybeleid van die app."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"In het privacybeleid van de ontwikkelaar kun je nagaan hoe <xliff:g id="APP_NAME">%1$s</xliff:g> je gegevens verwerkt"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Ga naar Instellingen en tik op Apps om andere Android-rechten te geven aan deze app."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Privacybeleid lezen"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Geopend in de afgelopen 24 uur"</string>
     <string name="app_access_title" msgid="7137018424885371763">"App-toegang"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Je hebt momenteel geen compatibele apps geïnstalleerd"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Aanvullende toegang"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Eerdere gegevens, achtergrondgegevens"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Aanvullende rechten voor deze app verwijderd"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Rechten"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness en wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Training, slaap, voeding en andere"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Medische dossiers"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"medische dossiers"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Labuitslagen, medicatie, vaccinaties en andere"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Labuitslagen, medicatie, vaccinaties en andere"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"App-rechten verwijderd"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect heeft rechten verwijderd voor <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect heeft rechten verwijderd voor <xliff:g id="APP_DATA_0">%1$s</xliff:g> en <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Naar de Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Aan de slag met Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect slaat je gezondheids- en fitnessgegevens op zodat je de verschillende apps op je apparaat makkelijk kunt synchroniseren"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect slaat je gezondheids- en fitnessgegevens uit verschillende apps op en synchroniseert deze.\n\n"<b>"Fitness- en welzijnsgegevens,"</b>" waaronder trainingssessies, stappen, voeding en slaap\n\n"<b>"Medische dossiers,"</b>" waaronder vaccinaties, labresultaten en meer"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Met Health Connect kun je het volgende doen"</string>
     <string name="share_data" msgid="3481932156368883946">"Gegevens delen met je apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Kies de gegevens die elke app mag lezen in of sturen naar Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Je instellingen en privacy beheren"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Licht bloedverlies"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Gemiddeld bloedverlies"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Zwaar bloedverlies"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Bloedverlies onbekend"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruatie dag <xliff:g id="DAY">%1$d</xliff:g> van <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruatie (1 dag)}other{Menstruatie (# dagen)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positief"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatief"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Hoog"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muziek"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Anders"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Niet-begeleid"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Gemiddeld"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Energiek"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> u <xliff:g id="MIN">%2$s</xliff:g> m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> u"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integratie is bezig"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect wordt geïntegreerd met het Android-systeem.\n\nHet kan even duren voordat je gegevens en rechten zijn overgezet."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Sluit de app niet voordat je een melding krijgt dat het proces is afgerond."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integratie met Health Connect is bezig"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Update nodig"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect wordt geïntegreerd met het Android-systeem zodat je er direct vanuit je instellingen toegang toe hebt."</string>
     <string name="update_button" msgid="4544529019832009496">"Updaten"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Start deze update zodat de integratie van Health Connect met je systeeminstellingen kan worden voortgezet"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Nu updaten"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Systeemupdate nodig"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Update je telefoonsysteem voordat je doorgaat."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Heb je je telefoonsysteem al geüpdatet, start je telefoon dan opnieuw op om door te gaan met de integratie"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect moet worden geüpdatet"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Update de Health Connect-app naar de nieuwste versie voordat je doorgaat."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Meer ruimte nodig"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect heeft <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> opslagruimte op je telefoon nodig om door te gaan met de integratie.\n\nMaak wat ruimte vrij op je telefoon en probeer het opnieuw."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Opnieuw proberen"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Ruimte vrijmaken"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Meer ruimte nodig"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect heeft <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> opslagruimte op je telefoon nodig om door te gaan met de integratie."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integratie onderbroken"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"De Health Connect-app is tijdens de integratie met het Android-systeem gesloten.\n\nKlik op Hervatten om de app opnieuw te openen en door te gaan met het overzetten van je gegevens en rechten."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Als je je Health Connect-gegevens wilt behouden, moet je dit binnen <xliff:g id="TIME_NEEDED">%1$s</xliff:g> afronden."</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tik om door te gaan met de integratie van Health Connect met het Android-systeem. Als je je gegevens wilt behouden, moet je dit binnen <xliff:g id="TIME_NEEDED">%1$s</xliff:g> afronden."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tik om door te gaan met de integratie van Health Connect met het Android-systeem."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Doorgaan"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Integratie van Health Connect hervatten"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Als je je gegevens wilt behouden, moet je dit binnen <xliff:g id="TIME_NEEDED">%1$s</xliff:g> afronden."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"App-update nodig"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> moet worden geüpdatet om te blijven synchroniseren met Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Sommige apps moeten worden geüpdatet om te blijven synchroniseren met Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> moet worden geüpdatet om te blijven synchroniseren met Health Connect. Updates zijn misschien niet beschikbaar voor alle apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Sommige apps moeten worden geüpdatet om te blijven synchroniseren met Health Connect. Updates zijn misschien niet beschikbaar voor alle apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Zoeken naar updates"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Meer informatie"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-integratie"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"De integratie van Health Connect is niet afgerond"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Je krijgt een melding als migratie weer mogelijk is."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"De integratie van Health Connect is niet afgerond"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Meer lezen"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integratie met Health Connect afgerond"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Openen"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Wat is er nieuw"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Je hebt nu direct vanuit je instellingen toegang tot Health Connect. Je kunt de Health Connect-app altijd verwijderen om opslagruimte vrij te maken."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"App-bronnen bewerken"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Apparaatstandaard"</string>
     <string name="app_data_title" msgid="6499967982291000837">"App-gegevens"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Gegevens van apps met toegang tot Health Connect worden hier getoond"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Gegevens van <xliff:g id="APP_NAME">%1$s</xliff:g> worden hier getoond"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Gegevens van apps met toegang tot Health Connect worden hier getoond"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dag"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Week"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Maand"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Vorige maand"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Items"</string>
     <string name="tab_access" msgid="7818197975407243701">"Toegang"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Aanvullende toegang geven voor <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> wil ook toegang tot deze Health Connect-instellingen"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Zet ten minste één toestemming voor lezen aan om toegang tot achtergrondgegevens of eerdere gegevens voor deze app aan te zetten"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Zet ten minste één toestemming voor lezen aan om achtergrondtoegang voor deze app aan te zetten"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Zet ten minste één toestemming voor lezen aan om toegang tot eerdere gegevens voor deze app aan te zetten"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect gebruiken"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synchroniseer je eerste apps om gezondheids- en fitnessgegevens tussen ze te delen"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Instellen"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Compatibele apps bekijken"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Vind meer apps om te synchroniseren met <xliff:g id="APP_NAME">%s</xliff:g> via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Bekijken in appstore"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Schermvergrendeling instellen"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Stel een pincode, patroon of wachtwoord voor dit apparaat in voor extra beveiliging van je gezondheidsgegevens"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Schermvergrendeling instellen"</string>
     <string name="select_all" msgid="837499881590001166">"Alles selecteren"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Gekoppelde apps kunnen deze gegevens van Health Connect niet meer lezen"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Aangevinkt"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Niet aangevinkt"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Trainingsroute beschikbaar"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Volgende dag"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Volgende week"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Volgende maand"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Vorige dag"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Vorige week"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Vorige maand"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Alle gegevens definitief verwijderen?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"De geselecteerde gegevens definitief verwijderen?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Alle <xliff:g id="APP_NAME">%s</xliff:g>-gegevens definitief verwijderen?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"De geselecteerde <xliff:g id="APP_NAME">%1$s</xliff:g>-vermeldingen voor de week van <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> definitief verwijderen?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"De geselecteerde <xliff:g id="APP_NAME">%1$s</xliff:g>-vermeldingen voor <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> definitief verwijderen?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Deze <xliff:g id="APP_NAME">%s</xliff:g>-vermelding definitief verwijderen?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Gegevens van het type <xliff:g id="DATA_TYPE">%1$s</xliff:g> voor <xliff:g id="APP_NAME">%2$s</xliff:g> definitief verwijderen?"</string>
+    <string name="on" msgid="8266542510798355807">"Aan"</string>
+    <string name="off" msgid="6996623844428550649">"Uit"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Geopend: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Geopend: gisteren om <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Geopend: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> om <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Altijd toestaan"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Selectie toestaan"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Tijdens gebruik van de app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Alles weigeren"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot fitness- en welzijnsgegevens?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt om toegang tot <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nKies of je alles wilt toestaan of ze afzonderlijk wilt beheren."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> toegang geven tot <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness en welzijn"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"altijd"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"tijdens gebruik"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Altijd"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Tijdens gebruik"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> heeft toegang tot al je fitness- en welzijnsgegevens <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Toegang toegestaan"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Lezen toegestaan"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Met deze rechten heeft <xliff:g id="APP_NAME">%1$s</xliff:g> toegang tot gegevens van de apparaatsensoren."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps toegestaan"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Geen apps die dit aanvragen"</string>
+    <string name="allowed" msgid="4158456017482263737">"Toegestaan"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Niet toegestaan"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps met dit recht hebben toegang tot <xliff:g id="DATA_TYPE">%s</xliff:g>-gegevens van de apparaatsensoren."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"<xliff:g id="DATA_TYPE">%s</xliff:g>-toegang intrekken voor alle apps op je smartwatch?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Vinkje"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Kruis"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Op dit moment heeft <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="ALLOW_MODE">%2$s</xliff:g> toegang tot fitness- en welzijnsgegevens"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> altijd toegang geven tot fitness- en welzijnsgegevens?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> heeft toegang tot <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Rechten voor fitness en welzijn beheren"</string>
 </resources>
diff --git a/apk/res/values-or/strings.xml b/apk/res/values-or/strings.xml
index b8db058..775a6e4 100644
--- a/apk/res/values-or/strings.xml
+++ b/apk/res/values-or/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ଆପଣଙ୍କ ଡିଭାଇସରେ ସ୍ୱାସ୍ଥ୍ୟ ଏବଂ ଫିଟନେସ ଡାଟାକୁ ପରିଚାଳନା କରନ୍ତୁ ଓ କେଉଁ ଆପ୍ସ ଏହାକୁ ଆକ୍ସେସ କରିପାରିବ ତାହା ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
     <string name="data_title" msgid="4456619761533380816">"ଡାଟା ଏବଂ ଆକ୍ସେସ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ବ୍ରାଉଜ କରନ୍ତୁ"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକ ଏବଂ କେଉଁ ଆପ୍ସ ସେଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିପାରିବ ତାହା ଭ୍ୟୁ କରନ୍ତୁ"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"ସମସ୍ତ ବର୍ଗ"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"ସମସ୍ତ ବର୍ଗ ଦେଖନ୍ତୁ"</string>
     <string name="no_data" msgid="1906986019249068659">"କୌଣସି ଡାଟା ନାହିଁ"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ଗତକାଲି"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"ପଢ଼ନ୍ତୁ: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"ଲେଖନ୍ତୁ: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"ଅନୁମତିଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"ସମୟ: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"କାର୍ଯ୍ୟକଳାପ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"ଖର୍ଚ୍ଚ ହୋଇଥିବା କେଲୋରୀର ଡାଟା ପଢ଼"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"ଖର୍ଚ୍ଚ ହୋଇଥିବା କେଲୋରୀର ଡାଟା ପଢ଼ିବାକୁ ଆପକୁ ଅନୁମତି ଦିଏ"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ବେଳେ ଏହି ଆପ ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟା ଏବଂ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଆପଣ ଆପକୁ ବ୍ୟବହାର କରୁନଥିବା ବେଳେ ଏହି ଆପ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ବେଳେ ଏହି ଆପ ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ସମୟରେ ଏହି ଆପ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"ଅତୀତର ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଏହି ଆପ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ପୂର୍ବରୁ ଯୋଗ କରାଯାଇଥିବା ଫିଟନେସ ଏବଂ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଏହି ଆପ ଅତୀତର ସମସ୍ତ ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ପୂର୍ବରୁ ଯୋଗ କରାଯାଇଥିବା Health Connect ଡାଟାକୁ ଏହି ଆପ ଆକ୍ସେସ କରିପାରିବ।"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଏହି ଆପ ଅତୀତର ସମସ୍ତ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଅତିରିକ୍ତ ଆକ୍ସେସକୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> ମଧ୍ୟ ଏହି Health Connect ସେଟିଂସକୁ ଆକ୍ସେସ କରିବାକୁ ଚାହେଁ"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ସମସ୍ତ ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକୁ ବେକଗ୍ରାଉଣ୍ଡରେ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ସମୟରେ ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟା ଏବଂ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ଆପଣ ଆପକୁ ବ୍ୟବହାର କରୁନଥିବା ବେଳେ ଏହି ଡାଟା ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ଆପଣ ଆପକୁ ବ୍ୟବହାର କରୁନଥିବା ବେଳେ ଏହି ଡାଟା ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ସମୟରେ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ଅତୀତର ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ପୂର୍ବରୁ ଯୋଗ କରାଯାଇଥିବା ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"ଅତୀତର ସମସ୍ତ ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"ଅତୀତର ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ପୂର୍ବରୁ ଯୋଗ କରାଯାଇଥିବା Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"ଅତୀତର ସମସ୍ତ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପୂର୍ବରୁ ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକ ପାଇଁ ଅତୀତର ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"ଅନୁମତିଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ ପଢ଼ନ୍ତୁ"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ସମସ୍ତ ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକୁ ବେକଗ୍ରାଉଣ୍ଡରେ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ସମୟରେ ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟା ଏବଂ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ଆପଣ ଆପକୁ ବ୍ୟବହାର କରୁନଥିବା ବେଳେ ଏହି ଡାଟା ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ଆପଣ ଆପକୁ ବ୍ୟବହାର କରୁନଥିବା ବେଳେ ଏହି ଡାଟା ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"ବେକଗ୍ରାଉଣ୍ଡରେ ଥିବା ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ସମୟରେ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ଅତୀତର ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ପୂର୍ବରୁ ଯୋଗ କରାଯାଇଥିବା ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"ଅତୀତର ସମସ୍ତ ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"ଅତୀତର ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ପୂର୍ବରୁ ଯୋଗ କରାଯାଇଥିବା Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"ଅତୀତର Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଖରେ କୌଣସି ପଢ଼ିବା ଅନୁମତି ନଥିବା ଯୋଗୁଁ ବର୍ତ୍ତମାନ କୌଣସି ଫିଟନେସ ଡାଟା ପଢ଼ାଯାଉନାହିଁ"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପୂର୍ବରୁ ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ପାଇଁ ଅତୀତର ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ। ଏହାକୁ ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ ଏହି ଆପ ନିମନ୍ତେ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ଅନୁମତିଗୁଡ଼ିକୁ ବନ୍ଦ କରନ୍ତୁ"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ଅନୁମତିଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ଏହି ଆପ ପାଇଁ ବେକଗ୍ରାଉଣ୍ଡ କିମ୍ବା ପୂର୍ବର ଡାଟା ଆକ୍ସେସ ଚାଲୁ କରିବା ପାଇଁ ଅତି କମରେ ଗୋଟିଏ ପଢ଼ିବାର ଅନୁମତିକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ଏହି ଆପ ପାଇଁ ପୃଷ୍ଠପଟ ଆକ୍ସେସ ଚାଲୁ କରିବା ପାଇଁ ଅତି କମରେ ଗୋଟିଏ ପଢ଼ିବାର ଅନୁମତିକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ଏହି ଆପ ପାଇଁ ପୂର୍ବର ଡାଟା ଆକ୍ସେସ ଚାଲୁ କରିବା ପାଇଁ ଅତି କମରେ ଗୋଟିଏ ପଢ଼ିବାର ଅନୁମତିକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"ଅତୀତର ସମସ୍ତ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="background_read_description" msgid="3203594555849969283">"ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ସମୟରେ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଆପଣ ଆପ ବ୍ୟବହାର କରୁନଥିବା ସମୟରେ ଏହି ଆପ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"ଅତୀତର ଡାଟାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"ଅତୀତର ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ପୂର୍ବରୁ ଯୋଗ କରାଯାଇଥିବା Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"ଅତୀତର ସମସ୍ତ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ପୂର୍ବରୁ ଯୋଗ କରାଯାଇଥିବା Health Connect ଡାଟାକୁ ଏହି ଆପ ଆକ୍ସେସ କରିପାରିବ।"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ ଏହି ଆପ ଅତୀତର ସମସ୍ତ Health Connect ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ।"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"ଖର୍ଚ୍ଚ ହୋଇଥିବା ସକ୍ରିୟ କେଲୋରୀ"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"ଖର୍ଚ୍ଚ ହୋଇଥିବା ସକ୍ରିୟ କେଲୋରୀ"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"ଖର୍ଚ୍ଚ ହୋଇଥିବା ସକ୍ରିୟ କେଲୋରୀର ଡାଟା ପଢ଼ନ୍ତୁ"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ହ୍ୱିଲଚେୟାର ପୁସ"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"ହ୍ୱିଲଚେୟାର ପୁସର ଡାଟା ପଢ଼ନ୍ତୁ"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"ହ୍ୱିଲଚେୟାର ପୁସର ଡାଟା ଲେଖନ୍ତୁ"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"କାର୍ଯ୍ୟକଳାପର ତୀବ୍ରତା"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"କାର୍ଯ୍ୟକଳାପର ତୀବ୍ରତା"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"କାର୍ଯ୍ୟକଳାପର ତୀବ୍ରତାକୁ ପଢ଼େ"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"କାର୍ଯ୍ୟକଳାପର ତୀବ୍ରତାକୁ ଲେଖେ"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"ଅତ୍ୟାବଶ୍ୟକ ମେଟାବୋଲିକ ରେଟ"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"ଅତ୍ୟାବଶ୍ୟକ ମେଟାବୋଲିକ ରେଟ"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"ଅତ୍ୟାବଶ୍ୟକ ମେଟାବୋଲିକ ରେଟର ଡାଟା ପଢ଼ନ୍ତୁ"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ସ୍କିନ ତାପମାତ୍ରା"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"ସ୍କିନ ତାପମାତ୍ରା ପଢ଼ନ୍ତୁ"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"ସ୍କିନ ତାପମାତ୍ରା ଲେଖନ୍ତୁ"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"ଏଥିରେ Health Connectରେ ସିଙ୍କ ଏବଂ ଯୋଗ କରାଯାଇଥିବା ସମସ୍ତ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ଅନ୍ତର୍ଭୁକ୍ତ। ଏହା ଆପଣଙ୍କର ସମ୍ପୂର୍ଣ୍ଣ ମେଡିକାଲ ରେକର୍ଡ ହୋଇନପାରେ ଏବଂ ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକର ଏକ ମେଡିକାଲ ବର୍ଣ୍ଣନା ଅନ୍ତର୍ଭୁକ୍ତ କରେ ନାହିଁ।"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"ସମସ୍ତ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"ସମସ୍ତ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"ସମସ୍ତ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ଲେଖନ୍ତୁ"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"ଆଲର୍ଜି ଅସହିଷ୍ଣୁତା ଡାଟା"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ଆଲର୍ଜି ଅସହିଷ୍ଣୁତା ଡାଟା"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"ଆଲର୍ଜି ଅସହିଷ୍ଣୁତା ଡାଟା ପଢ଼ନ୍ତୁ"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ଟୀକାକରଣ"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ଟୀକାକରଣ"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"ଟୀକାକରଣ ପଢ଼ନ୍ତୁ"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ଲାବୋରେଟୋରୀ ଫଳାଫଳ"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ଲାବୋରେଟୋରୀ ଫଳାଫଳ"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ସମସ୍ତ ଲାବୋରେଟୋରୀ ଫଳାଫଳ ପଢ଼ନ୍ତୁ"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"ଆଲର୍ଜି"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ଆଲର୍ଜି"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"ଆଲର୍ଜି ଅସହିଷ୍ଣୁତା ଡାଟା ପଢ଼ନ୍ତୁ"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"ଅବସ୍ଥା"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"ଅବସ୍ଥା"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"ଅବସ୍ଥା ପଢ଼ନ୍ତୁ"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ଟୀକା"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ଟୀକା"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ଟୀକା ସମ୍ବନ୍ଧିତ ଡାଟା ପଢ଼ନ୍ତୁ"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ଲେବ ଫଳାଫଳ"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ଲେବ ଫଳାଫଳ"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ଲେବ ଫଳାଫଳ ଡାଟା ପଢ଼ନ୍ତୁ"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ଔଷଧ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ଔଷଧ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ଔଷଧ ସମ୍ପର୍କିତ ଡାଟା ପଢ଼ନ୍ତୁ"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ବ୍ୟକ୍ତିଗତ ବିବରଣୀ"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ବ୍ୟକ୍ତିଗତ ବିବରଣୀ"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"ବ୍ୟକ୍ତିଗତ ବିବରଣୀ ପଢ଼ିପାରିବେ"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"ପ୍ରାକ୍ଟିସନର ବିବରଣୀ"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"ପ୍ରାକ୍ଟିସନର ବିବରଣୀ"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"ପ୍ରାକ୍ଟିସନର ବିବରଣୀ ପଢ଼ିପାରିବେ"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ଗର୍ଭାବସ୍ଥା"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ଗର୍ଭାବସ୍ଥା"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ଗର୍ଭାବସ୍ଥାର ଡାଟା ପଢ଼ନ୍ତୁ"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ସମସ୍ୟା"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ସମସ୍ୟା"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"ସମସ୍ୟାର ଡାଟା ପଢ଼ନ୍ତୁ"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"ପ୍ରକ୍ରିୟା"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"ପ୍ରକ୍ରିୟା"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"ପ୍ରକ୍ରିୟାଗୁଡ଼ିକର ଡାଟା ପଢ଼ନ୍ତୁ"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"ସାମାଜିକ ଇତିହାସ"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ସାମାଜିକ ଇତିହାସ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ସାମାଜିକ ଇତିହାସ"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"ସାମାଜିକ ଇତିହାସର ଡାଟା ପଢ଼ନ୍ତୁ"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ସଙ୍କେତ"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ଭିଜିଟ"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ଭିଜିଟ"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"ଭିଜିଟ ପଢ଼ିପାରିବେ"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ସଙ୍କେତ"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ସଙ୍କେତ"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ସଙ୍କେତଗୁଡ଼ିକର ଡାଟା ପଢ଼ନ୍ତୁ"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"ଏକାଗ୍ରତା"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"ଏକାଗ୍ରତା ସେସନ ଡାଟା ଲେଖନ୍ତୁ"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"ପଢ଼ିବା ପାଇଁ “<xliff:g id="APP_NAME">%1$s</xliff:g>”କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"ଲେଖିବା ପାଇଁ “<xliff:g id="APP_NAME">%1$s</xliff:g>”କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"ବାତିଲ କରନ୍ତୁ"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"ସବୁକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Health Connectରେ ଏହି ଆପ ଯେଉଁ ଡାଟାକୁ ପଢ଼ୁ କିମ୍ବା ଲେଖୁ ବୋଲି ଆପଣ ଚାହୁଁଛନ୍ତି ତାହା ବାଛନ୍ତୁ"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Health Connectରେ ଏହି ଆପ ଯେଉଁ ଡାଟାକୁ ପଢ଼ୁ କିମ୍ବା ଲେଖୁ ବୋଲି ଆପଣ ଚାହୁଁଛନ୍ତି ତାହା ବାଛନ୍ତୁ"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connectରେ ଏହି ଆପ ଯେଉଁ ଡାଟାକୁ ପଢ଼ୁ ବୋଲି ଆପଣ ଚାହୁଁଛନ୍ତି ତାହା ବାଛନ୍ତୁ"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Health Connectରେ ଏହି ଆପ ଯେଉଁ ଡାଟାକୁ ଲେଖୁ ବୋଲି ଆପଣ ଚାହୁଁଛନ୍ତି ତାହା ବାଛନ୍ତୁ"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"ଯଦି ଆପଣ ପଢ଼ିବା ଆକ୍ସେସ ଦିଅନ୍ତି, ତେବେ ଆପ ନୂଆ ଡାଟା ଏବଂ ଗତ 30 ଦିନର ଡାଟାକୁ ପଢ଼ିପାରିବ"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"ଯଦି ଆପଣ ପଢ଼ିବା ଆକ୍ସେସ ଦିଅନ୍ତି, ତେବେ ଆପ ନୂଆ ଏବଂ ଅତୀତର ଡାଟାକୁ ପଢ଼ିପାରିବ"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Health Connectକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"ଆପଣ ଡେଭେଲପରଙ୍କ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>ରେ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କ ଡାଟାକୁ କିପରି ପରିଚାଳନା କରେ ତାହା ଜାଣିପାରିବେ"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> ତା\'ର <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>ରେ ଆପଣଙ୍କ ଡାଟାକୁ କିପରି ପରିଚାଳନା କରେ ତାହା ଆପଣ ଜାଣିପାରିବେ"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"ଗୋପନୀୟତା ନୀତି"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦିଅନ୍ତୁ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"ଯଦି ଆପଣ ଆକ୍ସେସ ଦିଅନ୍ତି, ତେବେ ଆଲର୍ଜି, ଲେବ ଫଳାଫଳ, ଟୀକା ଏବଂ ଆହୁରି ଅନେକ କିଛି ପରି ଡାଟାକୁ ଆପ ପଢ଼ି ଲେଖିପାରିବ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"ଯଦି ଆପଣ ଆକ୍ସେସ ଦିଅନ୍ତି, ତେବେ ଆଲର୍ଜି, ଲେବ ଫଳାଫଳ, ଟୀକା ଏବଂ ଆହୁରି ଅନେକ କିଛି ପରି ଡାଟାକୁ ଆପ ପଢ଼ିପାରିବ \n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ବିଷୟରେ"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"ସେୟାର କରିବାକୁ ଥିବା ଡାଟାରେ ଏସବୁ ଅନ୍ତର୍ଭୁକ୍ତ ଅଟେ"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"ଯଦି ଆପଣ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡକୁ Health Connect ସହ ସେୟାର କରିପାରେ।"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"ଆପଣଙ୍କର ବିଭିନ୍ନ ଆପ୍ସ ଏବଂ ସୋର୍ସରୁ ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକୁ ଗୋଟିଏ ସ୍ଥାନରେ ରଖିବା ପାଇଁ ସିଙ୍କ କରନ୍ତୁ"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"ସବୁ ଅନୁମତିକୁ କାଢ଼ି ଦେବେ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"ସବୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connectରୁ କୌଣସି ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହି ଆପର କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ରହିଥିବା ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ଏହା ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g>, ପୂର୍ବର ଡାଟା ସମେତ Health Connectରୁ କୌଣସି ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହି ଆପର ଲୋକେସନ, କେମେରା କିମ୍ବା ମାଇକ୍ରୋଫୋନ ପରି ରହିଥିବା ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ଏହା ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g>, ବେକଗ୍ରାଉଣ୍ଡ ଏବଂ ପୂର୍ବର ଡାଟା ସମେତ Health Connectରୁ କୌଣସି ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହି ଆପର ଲୋକେସନ, କେମେରା କିମ୍ବା ମାଇକ୍ରୋଫୋନ ପରି ରହିଥିବା ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ଏହା ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"ଏହା ସହିତ, Health Connectରୁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଡାଟାକୁ ଡିଲିଟ କରନ୍ତୁ"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ସବୁ ଅନୁମତିକୁ କାଢ଼ି ଦେବେ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ସମସ୍ତ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ଅନୁମତି କାଢ଼ି ଦେବେ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ସମସ୍ତ ଫିଟନେସ ଏବଂ ସୁସ୍ଥତାର ଅନୁମତିକୁ କାଢ଼ି ଦେବେ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connectରୁ <xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ଥିବା ଫିଟନେସ ଡାଟାକୁ ମଧ୍ୟ ଡିଲିଟ କରେ"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ସମସ୍ତ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ଅନୁମତି କାଢ଼ି ଦେବେ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connectରୁ <xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ଥିବା ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡକୁ ମଧ୍ୟ ଡିଲିଟ କରେ"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connectରୁ ଏହି ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହା ଏହି ଆପରେ ଥିବା କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବେକଗ୍ରାଉଣ୍ଡ ଡାଟା ସମେତ Health Connectରୁ ଏହି ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହା ଏହି ଆପରେ ଥିବା କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପୂର୍ବର ଡାଟା ସମେତ Health Connectରୁ ଏହି ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହା ଏହି ଆପରେ ଥିବା କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବେକଗ୍ରାଉଣ୍ଡ ଏବଂ ପୂର୍ବର ଡାଟା ସମେତ Health Connectରୁ ଏହି ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହା ଏହି ଆପରେ ଥିବା କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ସବୁ ଅନୁମତିକୁ କାଢ଼ି ଦେବେ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g>, Health Connectରୁ ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହା ଏହି ଆପରେ ଥିବା କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବେକଗ୍ରାଉଣ୍ଡ ଡାଟା ସମେତ Health Connectରୁ ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହା ଏହି ଆପରେ ଥିବା କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପୂର୍ବର ଡାଟା ସମେତ Health Connectରୁ ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହା ଏହି ଆପରେ ଥିବା କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବେକଗ୍ରାଉଣ୍ଡ ଏବଂ ପୂର୍ବର ଡାଟା ସମେତ Health Connectରୁ ଡାଟାକୁ ଆଉ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ସକ୍ଷମ ହେବ ନାହିଁ।\n\nଏହା ଏହି ଆପରେ ଥିବା କେମେରା, ମାଇକ୍ରୋଫୋନ କିମ୍ବା ଲୋକେସନ ପରି ଅନ୍ୟ ଅନୁମତିଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ ନାହିଁ।"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Health Connectରୁ <xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ଥିବା ଫିଟନେସ ଡାଟା ଏବଂ ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ ମଧ୍ୟ ଡିଲିଟ କରେ"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ଏହି ଆପରୁ ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଆଯାଇଛି"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"ସମସ୍ତ Health Connect ଡାଟା ମଧ୍ୟ ଡିଲିଟ କରନ୍ତୁ"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"ପରବର୍ତ୍ତୀ ଦିନ"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"ଚୟନିତ ଦିନ"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"ପୂର୍ବବର୍ତ୍ତୀ ଦିନ"</string>
     <string name="default_error" msgid="7966868260616403475">"କିଛି ତ୍ରୁଟି ହୋଇଛି। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"ଅଜଣା ରିସୋର୍ସ"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ସୋର୍ସ ଡାଟା"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>ଓପନ ବ୍ରାକେଟ।"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>କ୍ଲୋଜ୍ଡ ବ୍ରାକେଟ।"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ଫିଲ୍ଡ <xliff:g id="FIELD">%2$s</xliff:g> ମୂଲ୍ୟ"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ଏହି ଆପ୍ସର ଆଉ ଆକ୍ସେସ ନାହିଁ, କିନ୍ତୁ ଏବେ ବି ଷ୍ଟୋର କରାଯାଇଥିବା ଡାଟା Health Connectରେ ଅଛି"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> ପରେ ଯୋଗ କରାଯାଇଥିବା ଡାଟାକୁ ପଢ଼ିପାରିବ"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ଏହି ଆପ ଆକ୍ସେସ କରିପାରୁଥିବା ଅନ୍ୟ Android ଅନୁମତିଗୁଡ଼ିକୁ ପରିଚାଳନା କରିବା ପାଇଁ, ସେଟିଂସ &gt; ଆପ୍ସକୁ ଯାଆନ୍ତୁ"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"ଆପଣ <xliff:g id="APP_NAME">%1$s</xliff:g> ସହ ସେୟାର କରୁଥିବା ଡାଟା ଏହାର ଗୋପନୀୟତା ନୀତି ଅଧିନସ୍ଥ ଅଟେ"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କ ଡାଟାକୁ କିପରି ପରିଚାଳନା କରେ ତାହା ଆପଣ ଡେଭେଲପରଙ୍କ ଗୋପନୀୟତା ନୀତିରେ ଜାଣିପାରିବେ"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ଏହି ଆପ ଆକ୍ସେସ କରିପାରୁଥିବା ଅନ୍ୟ Android ଅନୁମତିଗୁଡ଼ିକୁ ପରିଚାଳନା କରିବା ପାଇଁ, ସେଟିଂସକୁ ଯାଆନ୍ତୁ, ତା\'ପରେ ଆପ୍ସରେ ଟାପ କରନ୍ତୁ"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"ଗୋପନୀୟତା ନୀତି ପଢ଼ନ୍ତୁ"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"ଗତ 24 ଘଣ୍ଟାରେ ଆକ୍ସେସ କରାଯାଇଛି"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ଆପ ଆକ୍ସେସ"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"ବର୍ତ୍ତମାନ ଆପଣଙ୍କର କୌଣସି କମ୍ପାଟିବଲ ଆପ୍ସ ଇନଷ୍ଟଲ କରାଯାଇନାହିଁ"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"ଅତିରିକ୍ତ ଆକ୍ସେସ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ଅତୀତର ଡାଟା, ବେକଗ୍ରାଉଣ୍ଡ ଡାଟା"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"ଏହି ଆପ ପାଇଁ ଅତିରିକ୍ତ ଅନୁମତିକୁ କାଢ଼ି ଦିଆଯାଇଛି"</string>
     <string name="permissions_header" msgid="6519976063360071569">"ଅନୁମତି"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ଫିଟନେସ ଏବଂ ସୁସ୍ଥତା"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ବ୍ୟାୟାମ, ଶୋଇବା, ନ୍ୟୁଟ୍ରିସନ ଓ ଅନ୍ୟାନ୍ୟ"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡ"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ଲେବ ଫଳାଫଳ, ଔଷଧ, ଟୀକାକରଣ ଓ ଅନ୍ୟାନ୍ୟ"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ଲେବ ଫଳାଫଳ, ଔଷଧ, ଟୀକା ଓ ଅନ୍ୟାନ୍ୟ"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"ଆପ ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଆଯାଇଛି"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect <xliff:g id="APP_DATA">%s</xliff:g> ପାଇଁ ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦେଇଛି"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect <xliff:g id="APP_DATA_0">%1$s</xliff:g> ଏବଂ <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> ପାଇଁ ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦେଇଛି"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Storeକୁ ଯାଆନ୍ତୁ"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect ସହ ଆରମ୍ଭ କରନ୍ତୁ"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ଏବଂ ଫିଟନେସ ଡାଟାକୁ ଷ୍ଟୋର କରେ, ଯାହା ଆପଣଙ୍କ ଡିଭାଇସରେ ବିଭିନ୍ନ ଆପ୍ସ ସିଙ୍କ କରିବାକୁ ଆପଣଙ୍କୁ ଏକ ସହଜ ଉପାୟ ଦେଇଥାଏ"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ବିଭିନ୍ନ ଆପ୍ସରୁ ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ଏବଂ ଫିଟନେସ ଡାଟାକୁ ଷ୍ଟୋର ଓ ସିଙ୍କ କରେ।\n\n"<b>"ବ୍ୟାୟାମ ସେସନ, ଷ୍ଟେପ, ନ୍ୟୁଟ୍ରିସନ, ଶୋଇବା ଏବଂ ଆହୁରି ଅନେକ କିଛି ସମେତ"</b>" ଫିଟନେସ ଏବଂ ସୁସ୍ଥତା ଡାଟା\n\n"<b>"ଟୀକା, ଲେବ ଫଳାଫଳ ଏବଂ ଆହୁରି ଅନେକ କିଛି ସମେତ"</b>" ସ୍ୱାସ୍ଥ୍ୟ ରେକର୍ଡଗୁଡ଼ିକ"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ସହିତ ଆପଣ"</string>
     <string name="share_data" msgid="3481932156368883946">"ଆପଣଙ୍କ ଆପ୍ସ ସହ ଡାଟା ସେୟାର କରନ୍ତୁ"</string>
     <string name="share_data_description" msgid="2919871301634375092">"ପ୍ରତ୍ୟେକ ଆପ Health Connectରୁ କେଉଁ ଡାଟା ପଢ଼ିପାରିବ କିମ୍ବା ଲେଖିପାରିବ ତାହା ବାଛନ୍ତୁ"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"ଆପଣଙ୍କ ସେଟିଂସ ଏବଂ ଗୋପନୀୟତାକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"ସାମାନ୍ୟ ରକ୍ତସ୍ରାବ"</string>
     <string name="flow_medium" msgid="3783688724668943154">"ମଧ୍ୟମ ରକ୍ତସ୍ରାବ"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ଅତ୍ୟଧିକ ରକ୍ତସ୍ରାବ"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"ଅଜଣା ଫ୍ଲୋ"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>ରୁ ଋତୁସ୍ରାବ ଅବଧିର ଦିନ <xliff:g id="DAY">%1$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ଋତୁସ୍ରାବ ଅବଧି ଦିନ (1 ଦିନ)}other{ଋତୁସ୍ରାବ ଅବଧି ଦିନ (# ଦିନ)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"ପଜିଟିଭ"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"ନେଗେଟିଭ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ଅଧିକ"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"ମ୍ୟୁଜିକ"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"ଅନ୍ୟ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ଗାଇଡ କରାଯାଇନଥିବା"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"ମଧ୍ୟମ"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ଭିଗୋରୋସ"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>ମି"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>ଘ <xliff:g id="MIN">%2$s</xliff:g>ମି"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>ଘ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ଇଣ୍ଟିଗ୍ରେସନ ଚାଲିଛି"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connectକୁ Android ସିଷ୍ଟମ ସହ ଇଣ୍ଟିଗ୍ରେଟ କରାଯାଉଛି।\n\nଆପଣଙ୍କ ଡାଟା ଓ ଅନୁମତିଗୁଡ଼ିକ ଟ୍ରାନ୍ସଫର ହେବା ବେଳେ କିଛି ସମୟ ଲାଗିପାରେ।"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"ପ୍ରକ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି ବୋଲି ଆପଣ ଏକ ବିଜ୍ଞପ୍ତି ନପାଇବା ପର୍ଯ୍ୟନ୍ତ ଆପ ବନ୍ଦ କରନ୍ତୁ ନାହିଁ।"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connectର ଇଣ୍ଟିଗ୍ରେସନ ଚାଲିଛି"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"ଅପଡେଟ ଆବଶ୍ୟକ"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connectକୁ Android ସିଷ୍ଟମ ସହ ଇଣ୍ଟିଗ୍ରେଟ କରାଯାଉଛି ଯାହା ଫଳରେ ଆପଣ ସିଧାସଳଖ ଆପଣଙ୍କ ସେଟିଂସରୁ ଏହାକୁ ଆକ୍ସେସ କରିପାରିବେ।"</string>
     <string name="update_button" msgid="4544529019832009496">"ଅପଡେଟ କରନ୍ତୁ"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"ଏହି ଅପଡେଟକୁ ଆରମ୍ଭ କରନ୍ତୁ ଯାହା ଫଳରେ Health Connect ଆପଣଙ୍କ ସିଷ୍ଟମ ସେଟିଂସ ସହ ଇଣ୍ଟିଗ୍ରେଟ କରିବା ଜାରି ରଖିପାରିବ"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ଏବେ ଅପଡେଟ କରନ୍ତୁ"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"ସିଷ୍ଟମ୍ ଅପଡେଟ୍ ଆବଶ୍ୟକ ଅଟେ"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"ଜାରି ରଖିବା ପୂର୍ବରୁ, ଆପଣଙ୍କ ଫୋନ ସିଷ୍ଟମକୁ ଅପଡେଟ କରନ୍ତୁ।"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"ଯଦି ଆପଣ ପୂର୍ବରୁ ଆପଣଙ୍କ ଫୋନ ସିଷ୍ଟମକୁ ଅପଡେଟ କରିଛନ୍ତି, ତେବେ ଇଣ୍ଟିଗ୍ରେସନ ଜାରି ରଖିବା ପାଇଁ ଆପଣଙ୍କ ଫୋନକୁ ରିଷ୍ଟାର୍ଟ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connectର ଅପଡେଟ ଆବଶ୍ୟକ"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"ଜାରି ରଖିବା ପୂର୍ବରୁ, Health Connect ଆପକୁ ନବୀନତମ ସଂସ୍କରଣରେ ଅପଡେଟ କରନ୍ତୁ।"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"ଅଧିକ ସ୍ପେସ ଆବଶ୍ୟକ"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"ଇଣ୍ଟିଗ୍ରେସନ ଜାରି ରହିବା ପାଇଁ Health Connect ଆପଣଙ୍କ ଫୋନରେ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g>ର ଷ୍ଟୋରେଜ ସ୍ପେସ ଆବଶ୍ୟକ କରେ।\n\nଆପଣଙ୍କ ଫୋନରେ କିଛି ସ୍ପେସ ଖାଲି କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
     <string name="try_again_button" msgid="8745496819992160789">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ସ୍ପେସ ଖାଲି କରନ୍ତୁ"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"ଅଧିକ ସ୍ପେସ ଆବଶ୍ୟକ"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"ଇଣ୍ଟିଗ୍ରେଟ କରିବା ଜାରି ରଖିବା ପାଇଁ Health Connect ଆପଣଙ୍କ ଫୋନରେ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g>ର ଷ୍ଟୋରେଜ ସ୍ପେସ ଆବଶ୍ୟକ କରେ।"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ଇଣ୍ଟିଗ୍ରେସନକୁ ବିରତ କରାଯାଇଛି"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ଆପକୁ Android ସିଷ୍ଟମ ସହ ଇଣ୍ଟିଗ୍ରେଟ କରାଯାଉଥିବା ସମୟରେ ଏହା ବନ୍ଦ ହୋଇଯାଇଛି।\n\nଆପକୁ ପୁଣି ଖୋଲି ଆପଣଙ୍କ ଡାଟା ଓ ଅନୁମତିଗୁଡ଼ିକୁ ଟ୍ରାନ୍ସଫର କରିବା ଜାରି ରଖିବା ପାଇଁ \"ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ\"ରେ କ୍ଲିକ କରନ୍ତୁ।"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"ଆପଣଙ୍କ Health Connect ଡାଟା ରଖିବା ପାଇଁ, ଏହାକୁ <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ମଧ୍ୟରେ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connectକୁ Android ସିଷ୍ଟମ ସହ ଇଣ୍ଟିଗ୍ରେଟ କରିବା ଜାରି ରଖିବା ପାଇଁ ଟାପ କରନ୍ତୁ। ଆପଣଙ୍କ ଡାଟା ରଖିବା ପାଇଁ, ଏହାକୁ <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ମଧ୍ୟରେ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connectକୁ Android ସିଷ୍ଟମ ସହ ଇଣ୍ଟିଗ୍ରେଟ କରିବା ଜାରି ରଖିବା ପାଇଁ ଟାପ କରନ୍ତୁ।"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ଜାରି ରଖନ୍ତୁ"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connectର ଇଣ୍ଟିଗ୍ରେସନ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"ଆପଣଙ୍କ ଡାଟା ରଖିବା ପାଇଁ, ଏହାକୁ <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ମଧ୍ୟରେ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ଆପ ଅପଡେଟ ଆବଶ୍ୟକ"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect ସହ ସିଙ୍କ କରିବା ଜାରି ରଖିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅପଡେଟ କରାଯିବା ଆବଶ୍ୟକ"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect ସହ ସିଙ୍କ କରିବା ଜାରି ରଖିବାକୁ କିଛି ଆପ୍ସକୁ ଅପଡେଟ କରାଯିବା ଆବଶ୍ୟକ"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect ସହ ସିଙ୍କ କରିବା ଜାରି ରଖିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅପଡେଟ କରାଯିବା ଆବଶ୍ୟକ। ସମସ୍ତ ଆପ ପାଇଁ ଅପଡେଟଗୁଡ଼ିକ ଉପଲବ୍ଧ ହୋଇନପାରେ।"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect ସହ ସିଙ୍କ କରିବା ଜାରି ରଖିବା ପାଇଁ କିଛି ଆପକୁ ଅପଡେଟ କରାଯିବା ଆବଶ୍ୟକ। ସମସ୍ତ ଆପ ପାଇଁ ଅପଡେଟଗୁଡ଼ିକ ଉପଲବ୍ଧ ହୋଇନପାରେ।"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"ଅପଡେଟଗୁଡ଼ିକ ପାଇଁ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connectର ଇଣ୍ଟିଗ୍ରେସନ"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connectର ଇଣ୍ଟିଗ୍ରେସନ ସମ୍ପୂର୍ଣ୍ଣ ହେଲା ନାହିଁ"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"ଏହା ପୁଣି ଉପଲବ୍ଧ ହେଲେ ଆପଣ ଏକ ବିଜ୍ଞପ୍ତି ପାଇବେ।"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"ବୁଝିଗଲି"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connectର ଇଣ୍ଟିଗ୍ରେସନ ସମ୍ପୂର୍ଣ୍ଣ ହେଲା ନାହିଁ"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"ଅଧିକ ପଢ଼ନ୍ତୁ"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connectର ଇଣ୍ଟିଗ୍ରେସନ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"ଖୋଲନ୍ତୁ"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"ନୂଆ କଣ ଅଛି"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"ବର୍ତ୍ତମାନ ଆପଣ ସିଧାସଳଖ ଆପଣଙ୍କ ସେଟିଂସରୁ Health Connectକୁ ଆକ୍ସେସ କରିପାରିବେ। ଷ୍ଟୋରେଜ ସ୍ପେସ ଖାଲି କରିବାକୁ ଯେ କୌଣସି ସମୟରେ Health Connect ଆପକୁ ଅନଇନଷ୍ଟଲ କରନ୍ତୁ।"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"ବୁଝିଗଲି"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ଆପ ସୋର୍ସଗୁଡ଼ିକୁ ଏଡିଟ କରନ୍ତୁ"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ଡିଭାଇସ୍ ଡିଫଲ୍ଟ"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ଆପ ଡାଟା"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connectକୁ ଆକ୍ସେସ ଥିବା ଆପ୍ସରୁ ଡାଟା ଏଠାରେ ଦେଖାଯିବ"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g>ରୁ ଡାଟା ଏଠାରେ ଦେଖାଯିବ"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connectକୁ ଆକ୍ସେସ ଥିବା ଆପ୍ସରୁ ଡାଟା ଏଠାରେ ଦେଖାଯିବ"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"ଦିନ"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"ସପ୍ତାହ"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"ମାସ"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ଗତ ମାସ"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ଏଣ୍ଟ୍ରିଗୁଡ଼ିକ"</string>
     <string name="tab_access" msgid="7818197975407243701">"ଆକ୍ସେସ କରନ୍ତୁ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଅତିରିକ୍ତ ଆକ୍ସେସକୁ ଅନୁମତି ଦେବେ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ମଧ୍ୟ ଏହି Health Connect ସେଟିଂସକୁ ଆକ୍ସେସ କରିବାକୁ ଚାହେଁ"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ଏହି ଆପ ପାଇଁ ବେକଗ୍ରାଉଣ୍ଡ କିମ୍ବା ପୂର୍ବର ଡାଟା ଆକ୍ସେସ ଚାଲୁ କରିବା ପାଇଁ ଅତି କମରେ ଗୋଟିଏ ପଢ଼ିବାର ଅନୁମତିକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ଏହି ଆପ ପାଇଁ ପୃଷ୍ଠପଟ ଆକ୍ସେସ ଚାଲୁ କରିବା ପାଇଁ ଅତି କମରେ ଗୋଟିଏ ପଢ଼ିବାର ଅନୁମତିକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ଏହି ଆପ ପାଇଁ ପୂର୍ବର ଡାଟା ଆକ୍ସେସ ଚାଲୁ କରିବା ପାଇଁ ଅତି କମରେ ଗୋଟିଏ ପଢ଼ିବାର ଅନୁମତିକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect ବ୍ୟବହାର କରିବା ଆରମ୍ଭ କରନ୍ତୁ"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ଏଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱାସ୍ଥ୍ୟ ଏବଂ ଫିଟନେସ ଡାଟା ସେୟାର କରିବା ପାଇଁ ଆପଣଙ୍କ ପ୍ରଥମ ଆପ୍ସକୁ ସିଙ୍କ କରନ୍ତୁ"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"ସେଟ ଅପ କରନ୍ତୁ"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"କମ୍ବାଟିବଲ ଆପ୍ସ ଦେଖନ୍ତୁ"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect ଜରିଆରେ <xliff:g id="APP_NAME">%s</xliff:g> ସହ ସିଙ୍କ କରିବାକୁ ଅଧିକ ଆପ୍ସ ପାଆନ୍ତୁ"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ଆପ ଷ୍ଟୋରରେ ଦେଖନ୍ତୁ"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ଏକ ସ୍କ୍ରିନ ଲକ ସେଟ କରନ୍ତୁ"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"ଆପଣଙ୍କ ସ୍ୱାସ୍ଥ୍ୟ ଡାଟାର ଅତିରିକ୍ତ ସୁରକ୍ଷା ନିମନ୍ତେ ଏହି ଡିଭାଇସ ପାଇଁ ଏକ PIN, ପାର୍ଟନ କିମ୍ୱା ପାସୱାର୍ଡ ସେଟ କରନ୍ତୁ"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ସ୍କ୍ରିନ ଲକ ସେଟ କରନ୍ତୁ"</string>
     <string name="select_all" msgid="837499881590001166">"ସବୁ ଚୟନ କରନ୍ତୁ"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"କନେକ୍ଟ ହୋଇଥିବା ଆପ୍ସ Health Connectରୁ ଏହି ଡାଟାକୁ ପଢ଼ିବା ପାଇଁ ଆଉ ସକ୍ଷମ ହେବ ନାହିଁ"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ଚେକ କରାଯାଇଛି"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ଯାଞ୍ଚ ହୋଇନାହିଁ"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"କସରତ କରିବା ସ୍ଥାନକୁ ଯିବାର ମେପ ରୁଟ ଉପଲବ୍ଧ ଅଛି"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"ପରବର୍ତ୍ତୀ ଦିନ"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"ପରବର୍ତ୍ତୀ ସପ୍ତାହ"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"ପରବର୍ତ୍ତୀ ମାସ"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"ପୂର୍ବବର୍ତ୍ତୀ ଦିନ"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"ପୂର୍ବବର୍ତ୍ତୀ ସପ୍ତାହ"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"ପୂର୍ବବର୍ତ୍ତୀ ମାସ"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"ସମସ୍ତ ଡାଟାକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିବେ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"ଚୟନିତ ଡାଟାକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିବେ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"ସମସ୍ତ <xliff:g id="APP_NAME">%s</xliff:g> ଡାଟାକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିବେ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>ର ସପ୍ତାହ ପାଇଁ ଚୟନିତ <xliff:g id="APP_NAME">%1$s</xliff:g> ଏଣ୍ଟ୍ରିଗୁଡ଼ିକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିବେ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ପାଇଁ ଚୟନିତ <xliff:g id="APP_NAME">%1$s</xliff:g> ଏଣ୍ଟ୍ରିଗୁଡ଼ିକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିବେ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ଏହି <xliff:g id="APP_NAME">%s</xliff:g> ଏଣ୍ଟ୍ରିକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିବେ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> ପାଇଁ <xliff:g id="DATA_TYPE">%1$s</xliff:g> ଡାଟାକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିବେ?"</string>
+    <string name="on" msgid="8266542510798355807">"ଚାଲୁ ଅଛି"</string>
+    <string name="off" msgid="6996623844428550649">"ବନ୍ଦ ଅଛି"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇଛି"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"ଗତକାଲି <xliff:g id="TIME_DATE">%1$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇଛି"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇଛି"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"ସର୍ବଦା ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"ଚୟନିତ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ଆପ ବ୍ୟବହାର କରିବା ସମୟରେ"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"ସବୁ ଅଗ୍ରାହ୍ୟ କରନ୍ତୁ"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"ଫିଟନେସ ଓ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g>କୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଅନୁରୋଧ କରୁଛି।\n\nସବୁ ଅନୁମତି ଦେବା ପାଇଁ ବାଛନ୍ତୁ କିମ୍ବା ସେଗୁଡ଼ିକୁ ପୃଥକ ଭାବେ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ।"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="DATA_TYPE">%2$s</xliff:g>କୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ଫିଟନେସ ଏବଂ ସୁସ୍ଥତା"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ସର୍ବଦା"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ବ୍ୟବହାର ସମୟରେ"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"ସର୍ବଦା"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ବ୍ୟବହାର ସମୟରେ"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="ALLOW_MODE">%2$s</xliff:g> ଆପଣଙ୍କର ସମସ୍ତ ଫିଟନେସ ଏବଂ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରିପାରେ"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"ଆକ୍ସେସ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇଛି"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"ପଢ଼ିବାକୁ ଅନୁମତି ଦିଆଯାଇଛି"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ଏହି ଅନୁମତିଗୁଡ଼ିକ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଆପଣଙ୍କ ଡିଭାଇସ ସେନ୍ସରଗୁଡ଼ିକରୁ ଡାଟାକୁ ଆକ୍ସେସ କରିବାକୁ ଦେଇଥାଏ।"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ଆପ୍ସରୁ <xliff:g id="NUMBER_0">%1$d</xliff:g>କୁ ଅନୁମତି ଦିଆଯାଇଛି"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"କୌଣସି ଆପ୍ସ ଅନୁରୋଧ କରୁନାହିଁ"</string>
+    <string name="allowed" msgid="4158456017482263737">"ଅନୁମତି ଦିଆଯାଇଛି"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"ଅନୁମତି ଦିଆଯାଇନାହିଁ"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ଏହି ଅନୁମତି ଥିବା ଆପ୍ସ ଆପଣଙ୍କ ଡିଭାଇସ ସେନ୍ସରରୁ <xliff:g id="DATA_TYPE">%s</xliff:g> ଡାଟାକୁ ଆକ୍ସେସ କରିପାରେ।"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"ଆପଣଙ୍କ ୱାଚରେ ଥିବା ସମସ୍ତ ଆପ ପାଇଁ <xliff:g id="DATA_TYPE">%s</xliff:g>ର ଆକ୍ସେସକୁ କାଢ଼ି ଦେବେ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"ଚେକ ମାର୍କ"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"କ୍ରସ ମାର୍କ"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"ବର୍ତ୍ତମାନ <xliff:g id="APP_NAME">%1$s</xliff:g> ଫିଟନେସ ଏବଂ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରିପାରିବ <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"ସର୍ବଦା ଫିଟନେସ ଏବଂ ସୁସ୍ଥତା ଡାଟାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g>ର <xliff:g id="DATA_TYPES">%2$s</xliff:g>କୁ ଆକ୍ସେସ ଅଛି।"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ଫିଟନେସ ଏବଂ ସୁସ୍ଥତା ଅନୁମତିଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
 </resources>
diff --git a/apk/res/values-pa/strings.xml b/apk/res/values-pa/strings.xml
index d4a2737..76de100 100644
--- a/apk/res/values-pa/strings.xml
+++ b/apk/res/values-pa/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਸਿਹਤ ਅਤੇ ਫਿੱਟਨੈੱਸ ਸੰਬੰਧੀ ਡਾਟੇ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ ਅਤੇ ਕੰਟਰੋਲ ਕਰੋ ਕਿ ਕਿਹੜੀਆਂ ਐਪਾਂ ਇਸ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀਆਂ ਹਨ"</string>
     <string name="data_title" msgid="4456619761533380816">"ਡਾਟਾ ਅਤੇ ਪਹੁੰਚ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਨੂੰ ਬ੍ਰਾਊਜ਼ ਕਰੋ"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"ਆਪਣੇ ਸਿਹਤ ਰਿਕਾਰਡ ਦੇਖੋ ਅਤੇ ਨਾਲ ਹੀ ਇਹ ਵੀ ਦੇਖੋ ਕਿ ਉਨ੍ਹਾਂ ਤੱਕ ਕਿਹੜੀਆਂ ਐਪਾਂ ਪਹੁੰਚ ਕਰ ਸਕਦੀਆਂ ਹਨ"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"ਸਾਰੀਆਂ ਸ਼੍ਰੇਣੀਆਂ"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"ਸਾਰੀਆਂ ਸ਼੍ਰੇਣੀਆਂ ਦੇਖੋ"</string>
     <string name="no_data" msgid="1906986019249068659">"ਕੋਈ ਡਾਟਾ ਨਹੀਂ"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ਬੀਤਿਆ ਕੱਲ੍ਹ"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"ਪੜ੍ਹੋ: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"ਲਿਖੋ: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"ਇਜਾਜ਼ਤਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"ਸਮਾਂ: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"ਸਰਗਰਮੀ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ਆਪਣੀ ਸਿਹਤ ਸੰਬੰਧੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"ਖਰਚ ਹੋਈਆਂ ਕੈਲੋਰੀਆਂ ਸੰਬੰਧੀ ਡਾਟਾ ਪੜ੍ਹੋ"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"ਐਪ ਨੂੰ ਖਰਚ ਹੋਈਆਂ ਕੈਲੋਰੀਆਂ ਸੰਬੰਧੀ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨਾ"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਹ ਐਪ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਅਤੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਹ ਐਪ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਹ ਐਪ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਹ ਐਪ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਇਹ ਐਪ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਮਲ ਕੀਤੇ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਇਹ ਐਪ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਪੁਰਾਣੇ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਇਹ ਐਪ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਮਲ ਕੀਤੇ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਇਹ ਐਪ Health Connect ਦੇ ਪੁਰਾਣੇ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਵਧੀਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਇਨ੍ਹਾਂ Health Connect ਸੈਟਿੰਗਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਵੀ ਲੋੜ ਹੈ"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਅਤੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ ਇਸ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ ਇਸ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"ਇਸ ਐਪ ਨੂੰ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਮਲ ਕੀਤੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"ਇਸ ਐਪ ਨੂੰ ਪੁਰਾਣੇ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"ਇਸ ਐਪ ਨੂੰ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਮਲ ਕੀਤੇ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"ਇਸ ਐਪ ਨੂੰ Health Connect ਦੇ ਪੁਰਾਣੇ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਦੇ ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹਿਲਾਂ ਹੀ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"ਇਜਾਜ਼ਤਾਂ ਬਾਰੇ ਹੋਰ ਪੜ੍ਹੋ"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਅਤੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ ਇਸ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ ਇਸ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"ਇਸ ਐਪ ਨੂੰ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਮਲ ਕੀਤੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"ਇਸ ਐਪ ਨੂੰ ਪੁਰਾਣੇ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"ਇਸ ਐਪ ਨੂੰ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਮਲ ਕੀਤੇ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"ਇਸ ਐਪ ਨੂੰ Health Connect ਦੇ ਪੁਰਾਣੇ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"ਫ਼ਿਲਹਾਲ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟਾ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਰਿਹਾ ਕਿਉਂਕਿ <xliff:g id="APP_NAME">%1$s</xliff:g> ਕੋਲ ਪੜ੍ਹਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤਾਂ ਨਹੀਂ ਹਨ"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਦੇ ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹਿਲਾਂ ਹੀ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ। ਇਸ ਨੂੰ ਬਦਲਣ ਲਈ, ਇਸ ਐਪ ਲਈ ਸਿਹਤ ਰਿਕਾਰਡ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਬੰਦ ਕਰੋ"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"ਸਿਹਤ ਰਿਕਾਰਡ ਲਈ ਇਜਾਜ਼ਤਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ਇਸ ਐਪ ਲਈ ਬੈਕਗ੍ਰਾਊਂਡ ਜਾਂ ਪਿਛਲੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਪੜ੍ਹਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ ਚਾਲੂ ਕਰੋ"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ਇਸ ਐਪ ਲਈ ਬੈਕਗ੍ਰਾਊਂਡ ਪਹੁੰਚ ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਪੜ੍ਹਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ ਚਾਲੂ ਕਰੋ"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ਇਸ ਐਪ ਲਈ ਪਿਛਲੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਪੜ੍ਹਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ ਚਾਲੂ ਕਰੋ"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"ਇਸ ਐਪ ਨੂੰ Health Connect ਦੇ ਪੁਰਾਣੇ ਸਾਰੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
     <string name="background_read_description" msgid="3203594555849969283">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਸ ਐਪ ਨੂੰ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਣ ਦੌਰਾਨ, ਇਹ ਐਪ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨਾ"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"ਇਸ ਐਪ ਨੂੰ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਮਲ ਕੀਤੇ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"ਇਸ ਐਪ ਨੂੰ Health Connect ਦੇ ਸਾਰੇ ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਇਹ ਐਪ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਮਲ ਕੀਤੇ Health Connect ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਇਹ ਐਪ Health Connect ਦੇ ਸਾਰੇ ਪੁਰਾਣੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"ਕਸਰਤ ਦੌਰਾਨ ਖਰਚ ਹੋਈਆਂ ਕੈਲੋਰੀਆਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"ਕਸਰਤ ਦੌਰਾਨ ਖਰਚ ਹੋਈਆਂ ਕੈਲੋਰੀਆਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"ਕਸਰਤ ਦੌਰਾਨ ਖਰਚ ਹੋਈਆਂ ਕੈਲੋਰੀਆਂ ਸੰਬੰਧੀ ਡਾਟਾ ਪੜ੍ਹੋ"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ਵ੍ਹੀਲਚੇਅਰ ਪੁਸ਼ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"ਵ੍ਹੀਲਚੇਅਰ ਪੁਸ਼ ਸੰਬੰਧੀ ਡਾਟਾ ਪੜ੍ਹੋ"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"ਵ੍ਹੀਲਚੇਅਰ ਪੁਸ਼ ਸੰਬੰਧੀ ਡਾਟੇ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"ਸਰਗਰਮੀ ਦੀ ਤੀਬਰਤਾ"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ਸਰਗਰਮੀ ਦੀ ਤੀਬਰਤਾ"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"ਸਰਗਰਮੀ ਦੀ ਤੀਬਰਤਾ ਸੰਬੰਧੀ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"ਸਰਗਰਮੀ ਦੀ ਤੀਬਰਤਾ ਸੰਬੰਧੀ ਡਾਟੇ ਵਿੱਚ ਤਬਦੀਲੀ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"ਮੂਲ ਆਹਾਰ ਪਾਚਕ ਕਿਰਿਆ ਦੀ ਦਰ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"ਮੂਲ ਆਹਾਰ ਪਾਚਕ ਕਿਰਿਆ ਦੀ ਦਰ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"ਮੂਲ ਆਹਾਰ ਪਾਚਕ ਕਿਰਿਆ ਦੀ ਦਰ ਸੰਬੰਧੀ ਡਾਟਾ ਪੜ੍ਹੋ"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"ਚਮੜੀ ਦਾ ਤਾਪਮਾਨ"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"ਚਮੜੀ ਦਾ ਤਾਪਮਾਨ ਪੜ੍ਹੋ"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"ਚਮੜੀ ਦਾ ਤਾਪਮਾਨ ਲਿਖੋ"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"ਇਸ ਵਿੱਚ Health Connect ਵਿੱਚ ਸਿੰਕ ਕੀਤੇ ਅਤੇ ਸ਼ਾਮਲ ਕੀਤੇ ਸਾਰੇ ਸਿਹਤ ਰਿਕਾਰਡ ਸ਼ਾਮਲ ਹਨ। ਇਸ ਵਿੱਚ ਤੁਹਾਡਾ ਸਾਰਾ ਡਾਕਟਰੀ ਰਿਕਾਰਡ ਨਹੀਂ ਹੋ ਸਕਦਾ ਅਤੇ ਇਸ ਵਿੱਚ ਤੁਹਾਡੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਦਾ ਡਾਕਟਰੀ ਵਰਣਨ ਸ਼ਾਮਲ ਨਹੀਂ ਹੈ।"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"ਸਾਰੇ ਸਿਹਤ ਰਿਕਾਰਡ"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"ਸਾਰੇ ਸਿਹਤ ਰਿਕਾਰਡ"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"ਸਾਰੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਵਿੱਚ ਦਬਦੀਲੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"ਅਲਰਜੀਆਂ"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ਅਲਰਜੀਆਂ"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"ਅਲਰਜੀਆਂ ਨੂੰ ਪੜ੍ਹੋ"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ਇਮਿਊਨਾਈਜ਼ੇਸ਼ਨ"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ਇਮਿਊਨਾਈਜ਼ੇਸ਼ਨ"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"ਇਮਿਊਨਾਈਜ਼ੇਸ਼ਨ ਡਾਟਾ ਪੜ੍ਹੋ"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ਪ੍ਰਯੋਗਸ਼ਾਲਾ ਦੇ ਨਤੀਜੇ"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ਪ੍ਰਯੋਗਸ਼ਾਲਾ ਦੇ ਨਤੀਜੇ"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ਪ੍ਰਯੋਗਸ਼ਾਲਾ ਦੇ ਨਤੀਜੇ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"ਅਲਰਜੀਆਂ"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ਅਲਰਜੀਆਂ"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"ਅਲਰਜੀਆਂ ਨੂੰ ਪੜ੍ਹੋ"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"ਡਾਕਟਰੀ ਸਥਿਤੀਆਂ"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"ਡਾਕਟਰੀ ਸਥਿਤੀਆਂ"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"ਡਾਕਟਰੀ ਸਥਿਤੀਆਂ ਪੜ੍ਹੋ"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ਟੀਕੇ"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ਟੀਕੇ"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ਟੀਕਾਕਰਨ ਸੰਬੰਧੀ ਡਾਟਾ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ਲੈਬ ਤੋਂ ਮਿਲੇ ਨਤੀਜੇ"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ਲੈਬ ਤੋਂ ਮਿਲੇ ਨਤੀਜੇ"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ਲੈਬ ਤੋਂ ਮਿਲੇ ਨਤੀਜੇ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ਦਵਾਈਆਂ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ਦਵਾਈਆਂ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ਦਵਾਈਆਂ ਸੰਬੰਧੀ ਡਾਟਾ ਪੜ੍ਹੋ"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ਨਿੱਜੀ ਵੇਰਵੇ"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ਨਿੱਜੀ ਵੇਰਵੇ"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"ਨਿੱਜੀ ਵੇਰਵੇ ਪੜ੍ਹਨਾ"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"ਡਾਕਟਰੀ ਪੇਸ਼ੇਵਰ ਸੰਬੰਧੀ ਵੇਰਵੇ"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"ਡਾਕਟਰੀ ਪੇਸ਼ੇਵਰ ਸੰਬੰਧੀ ਵੇਰਵੇ"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"ਡਾਕਟਰੀ ਪੇਸ਼ੇਵਰ ਸੰਬੰਧੀ ਵੇਰਵੇ ਪੜ੍ਹਨਾ"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ਗਰਭ-ਅਵਸਥਾ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ਗਰਭ-ਅਵਸਥਾ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ਗਰਭ-ਅਵਸਥਾ ਸੰਬੰਧੀ ਡਾਟਾ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ਸਮੱਸਿਆਵਾਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ਸਮੱਸਿਆਵਾਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"ਸਮੱਸਿਆਵਾਂ ਸੰਬੰਧੀ ਡਾਟਾ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"ਇਲਾਜ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"ਇਲਾਜ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"ਇਲਾਜ ਸੰਬੰਧੀ ਡਾਟਾ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"ਸੋਸ਼ਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ਸੋਸ਼ਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ਸੋਸ਼ਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"ਸੋਸ਼ਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਸੰਬੰਧੀ ਡਾਟਾ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"ਮਹੱਤਵਪੂਰਨ ਲੱਛਣਾਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ਡਾਕਟਰ ਕੋਲ ਫੇਰੀਆਂ"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ਡਾਕਟਰ ਕੋਲ ਫੇਰੀਆਂ"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"ਡਾਕਟਰ ਕੋਲ ਫੇਰੀਆਂ ਦੀ ਜਾਣਕਾਰੀ ਪੜ੍ਹਨਾ"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"ਮਹੱਤਵਪੂਰਨ ਲੱਛਣਾਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"ਮਹੱਤਵਪੂਰਨ ਲੱਛਣਾਂ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"ਮਹੱਤਵਪੂਰਨ ਲੱਛਣਾਂ ਸੰਬੰਧੀ ਡਾਟਾ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"ਚੌਕਸੀ"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"ਚੌਕਸੀ ਸੰਬੰਧੀ ਸੈਸ਼ਨ ਦੇ ਡਾਟੇ ਨੂੰ ਲਿਖੋ"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ਨੂੰ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ਨੂੰ ਲਿਖਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"ਰੱਦ ਕਰੋ"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"ਆਗਿਆ ਦਿਓ"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"ਸਭ ਨੂੰ ਆਗਿਆ ਦਿਓ"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"ਆਗਿਆ ਨਾ ਦਿਓ"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"ਉਹ ਡਾਟਾ ਚੁਣੋ ਜਿਸ ਲਈ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ Health Connect ਨੂੰ ਪੜ੍ਹਨ ਜਾਂ ਲਿਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਚਾਹੁੰਦੇ ਹੋ"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"ਚੁਣੋ ਕਿ ਇਸ ਐਪ ਨੂੰ Health Connect ਵਿੱਚ ਮੌਜੂਦ ਕਿਹੜਾ ਡਾਟਾ ਪੜ੍ਹਨ ਜਾਂ ਲਿਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਹੈ"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"ਚੁਣੋ ਕਿ ਇਸ ਐਪ ਨੂੰ Health Connect ਵਿੱਚ ਮੌਜੂਦ ਕਿਹੜਾ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਹੈ"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"ਚੁਣੋ ਕਿ ਇਸ ਐਪ ਨੂੰ Health Connect ਵਿੱਚ ਮੌਜੂਦ ਕਿਹੜਾ ਡਾਟਾ ਲਿਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਹੈ"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"ਜੇ ਤੁਸੀਂ ਪੜ੍ਹਨ ਦੀ ਪਹੁੰਚ ਕਰਨ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਐਪ ਨਵੇਂ ਡਾਟੇ ਅਤੇ ਪਿਛਲੇ 30 ਦਿਨਾਂ ਦੇ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"ਜੇ ਤੁਸੀਂ ਪੜ੍ਹਨ ਦੀ ਪਹੁੰਚ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਐਪ ਨਵੇਂ ਅਤੇ ਪੁਰਾਣੇ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ Health Connect ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"ਤੁਸੀਂ ਜਾਣ ਸਕਦੇ ਹੋ ਕਿ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿਕਾਸਕਾਰ ਦੀ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ਵਿੱਚ ਤੁਹਾਡੇ ਡਾਟੇ ਨੂੰ ਕਿਵੇਂ ਸੰਭਾਲਦੀ ਹੈ"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"ਤੁਸੀਂ ਜਾਣ ਸਕਦੇ ਹੋ ਕਿ <xliff:g id="APP_NAME">%1$s</xliff:g> ਉਨ੍ਹਾਂ ਦੀ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ਮੁਤਾਬਕ ਤੁਹਾਡੇ ਡਾਟੇ ਨੂੰ ਕਿਵੇਂ ਸੰਭਾਲਦੀ ਹੈ"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"ਪਰਦੇਦਾਰੀ ਨੀਤੀ"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਤੁਹਾਡੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"ਜੇ ਤੁਸੀਂ ਪਹੁੰਚ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਐਪ ਅਲਰਜੀਆਂ, ਲੈਬ ਨਤੀਜਿਆਂ, ਟੀਕਿਆਂ ਅਤੇ ਹੋਰ ਜਾਣਕਾਰੀ ਵਰਗੇ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਅਤੇ ਲਿਖ ਸਕਦੀ ਹੈ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"ਜੇ ਤੁਸੀਂ ਪਹੁੰਚ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਐਪ ਅਲਰਜੀਆਂ, ਲੈਬ ਨਤੀਜਿਆਂ, ਟੀਕਿਆਂ ਅਤੇ ਹੋਰ ਜਾਣਕਾਰੀ ਵਰਗੇ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਬਾਰੇ"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"ਸਾਂਝਾ ਕਰਨ ਵਾਲੇ ਡਾਟਾ ਵਿੱਚ ਸ਼ਾਮਲ ਹੈ"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"ਜੇ ਤੁਸੀਂ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ <xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ Health Connect ਨਾਲ ਤੁਹਾਡੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"ਵੱਖ-ਵੱਖ ਐਪਾਂ ਅਤੇ ਸਰੋਤਾਂ ਤੋਂ ਆਪਣੇ ਸਿਹਤ ਰਿਕਾਰਡਾਂ ਨੂੰ ਸਿੰਕ ਕਰੋ, ਤਾਂ ਸਾਰੇ ਡਾਟੇ ਨੂੰ ਇੱਕੋ ਥਾਂ \'ਤੇ ਬਰਕਰਾਰ ਰੱਖਿਆ ਜਾ ਸਕੇ"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"ਕੀ ਸਾਰੀਆਂ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"ਸਭ ਹਟਾਓ"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ Health Connect ਤੋਂ ਕਿਸੇ ਵੀ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ ਪਿਛਲੇ ਡਾਟੇ ਸਮੇਤ, Health Connect ਤੋਂ ਕਿਸੇ ਵੀ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਟਿਕਾਣੇ, ਕੈਮਰੇ ਜਾਂ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਪਿਛਲੇ ਡਾਟੇ ਸਮੇਤ, Health Connect ਤੋਂ ਕਿਸੇ ਵੀ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਟਿਕਾਣੇ, ਕੈਮਰੇ ਜਾਂ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect ਤੋਂ <xliff:g id="APP_NAME">%1$s</xliff:g> ਦਾ ਡਾਟਾ ਵੀ ਮਿਟਾਓ"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ਕੀ ਸਾਰੀਆਂ ਇਜਾਜ਼ਤਾਂ ਹਟਾਉਣੀਆਂ ਹਨ?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ਕੀ ਸਿਹਤ ਰਿਕਾਰਡ ਸੰਬੰਧੀ ਸਾਰੀਆਂ ਇਜਾਜ਼ਤਾਂ ਹਟਾਉਣੀਆਂ ਹਨ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ਕੀ ਫਿੱਟਨੈੱਸ ਅਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਸਾਰੀਆਂ ਇਜਾਜ਼ਤਾਂ ਹਟਾਉਣੀਆਂ ਹਨ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"<xliff:g id="APP_NAME">%1$s</xliff:g> \'ਤੇ ਮੌਜੂਦ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟਾ ਵੀ Health Connect ਤੋਂ ਮਿਟਾਓ"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ਕੀ ਸਿਹਤ ਰਿਕਾਰਡ ਸੰਬੰਧੀ ਸਾਰੀਆਂ ਇਜਾਜ਼ਤਾਂ ਹਟਾਉਣੀਆਂ ਹਨ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"<xliff:g id="APP_NAME">%1$s</xliff:g> \'ਤੇ ਮੌਜੂਦ ਸਿਹਤ ਰਿਕਾਰਡ ਵੀ Health Connect ਤੋਂ ਮਿਟਾਓ"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ Health Connect ਤੋਂ ਇਸ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ ਬੈਕਗ੍ਰਾਊਂਡ ਡਾਟੇ ਸਮੇਤ, Health Connect ਤੋਂ ਇਸ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ ਪਿਛਲੇ ਡਾਟੇ ਸਮੇਤ, Health Connect ਤੋਂ ਇਸ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਪਿਛਲੇ ਡਾਟੇ ਸਮੇਤ, Health Connect ਤੋਂ ਇਸ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"ਕੀ ਸਾਰੀਆਂ ਇਜਾਜ਼ਤਾਂ ਹਟਾਉਣੀਆਂ ਹਨ?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ Health Connect ਤੋਂ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ ਬੈਕਗ੍ਰਾਊਂਡ ਡਾਟੇ ਸਮੇਤ, Health Connect ਤੋਂ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ ਪਿਛਲੇ ਡਾਟੇ ਸਮੇਤ, Health Connect ਤੋਂ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਹੁਣ ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਪਿਛਲੇ ਡਾਟੇ ਸਮੇਤ, Health Connect ਤੋਂ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਨਹੀਂ ਸਕੇਗੀ।\n\nਇਸ ਨਾਲ ਐਪ ਦੀਆਂ ਕੈਮਰੇ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜਾਂ ਟਿਕਾਣੇ ਵਰਗੀਆਂ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੀਆਂ।"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"<xliff:g id="APP_NAME">%1$s</xliff:g> \'ਤੇ ਮੌਜੂਦ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟਾ ਅਤੇ ਸਿਹਤ ਰਿਕਾਰਡ ਵੀ Health Connect ਤੋਂ ਮਿਟਾਓ"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ਇਸ ਐਪ ਲਈ ਇਜਾਜ਼ਤਾਂ ਹਟਾਈਆਂ ਗਈਆਂ"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"ਸਾਰਾ Health Connect ਡਾਟਾ ਵੀ ਮਿਟਾਓ"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"ਅਗਲਾ ਦਿਨ"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"ਚੁਣਿਆ ਹੋਇਆ ਦਿਨ"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"ਪਿਛਲਾ ਦਿਨ"</string>
     <string name="default_error" msgid="7966868260616403475">"ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"ਅਗਿਆਤ ਸਰੋਤ"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ਸਰੋਤ ਸੰਬੰਧੀ ਡਾਟਾ"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>ਖੁੱਲ੍ਹੀ ਬਰੈਕਟ।"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>ਬੰਦ ਬਰੈਕਟ।"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ਖੇਤਰ <xliff:g id="FIELD">%2$s</xliff:g> ਦਾ ਮੁੱਲ"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ਇਨ੍ਹਾਂ ਐਪਾਂ ਕੋਲ ਹੁਣ ਪਹੁੰਚ ਨਹੀਂ ਹੈ, ਪਰ ਹਾਲੇ ਵੀ ਇਨ੍ਹਾਂ ਨੇ Health Connect ਵਿੱਚ ਡਾਟਾ ਸਟੋਰ ਕੀਤਾ ਹੋਇਆ ਹੈ"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> ਤੋਂ ਬਾਅਦ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ ਡਾਟਾ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ਇਸ ਐਪ ਵੱਲੋਂ ਪਹੁੰਚ ਕੀਤੀਆਂ ਜਾ ਸਕਣ ਵਾਲੀਆਂ ਹੋਰ Android ਇਜਾਜ਼ਤਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ &gt; ਐਪਾਂ \'ਤੇ ਜਾਓ"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"ਤੁਹਾਡੇ ਵੱਲੋਂ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨਾਲ ਸਾਂਝਾ ਕੀਤਾ ਗਿਆ ਡਾਟਾ, ਇਸਦੀ ਪਰਦੇਦਾਰੀ ਨੀਤੀ ਹੇਠ ਆਉਂਦਾ ਹੈ"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"ਤੁਸੀਂ ਵਿਕਾਸਕਾਰ ਦੀ ਪਰਦੇਦਾਰੀ ਨੀਤੀ ਵਿੱਚ ਇਹ ਜਾਣ ਸਕਦੇ ਹੋ ਕਿ <xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ ਡਾਟੇ ਨੂੰ ਕਿਵੇਂ ਸੰਭਾਲਦੀ ਹੈ"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ਹੋਰ Android ਇਜਾਜ਼ਤਾਂ, ਜਿਨ੍ਹਾਂ ਤੱਕ ਇਹ ਐਪ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਉਨ੍ਹਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ, ਫਿਰ ਐਪਾਂ \'ਤੇ ਟੈਪ ਕਰੋ"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"ਪਰਦੇਦਾਰੀ ਨੀਤੀ ਪੜ੍ਹੋ"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"ਪਿਛਲੇ 24 ਘੰਟਿਆਂ ਵਿੱਚ ਪਹੁੰਚ ਕੀਤੀ ਗਈ"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ਐਪ ਤੱਕ ਪਹੁੰਚ"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਵੀ ਅਨੁਰੂਪ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਹੈ"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"ਵਧੀਕ ਪਹੁੰਚ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ਪਿਛਲਾ ਡਾਟਾ, ਬੈਕਗ੍ਰਾਊਂਡ ਡਾਟਾ"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"ਇਸ ਐਪ ਲਈ ਵਧੀਕ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ"</string>
     <string name="permissions_header" msgid="6519976063360071569">"ਇਜਾਜ਼ਤਾਂ"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ਫਿੱਟਨੈੱਸ ਅਤੇ ਤੰਦਰੁਸਤੀ"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ਕਸਰਤ, ਨੀਂਦ, ਪੋਸ਼ਣ ਅਤੇ ਹੋਰ"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"ਸਿਹਤ ਰਿਕਾਰਡ"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ਸਿਹਤ ਰਿਕਾਰਡ"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ਨਤੀਜੇ, ਦਵਾਈਆਂ, ਰੋਗ-ਪ੍ਰਤੀਰੋਗੀ ਯੋਗਤਾ ਆਦਿ"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ਲੈਬ ਤੋਂ ਮਿਲੇ ਨਤੀਜੇ, ਦਵਾਈਆਂ, ਟੀਕੇ ਅਤੇ ਹੋਰ"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"ਐਪ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect ਨੇ <xliff:g id="APP_DATA">%s</xliff:g> ਦੀਆਂ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਹੈ"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect ਨੇ <xliff:g id="APP_DATA_0">%1$s</xliff:g> ਅਤੇ <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> ਦੀਆਂ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਹੈ"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store \'ਤੇ ਜਾਓ"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect ਨਾਲ ਸ਼ੁਰੂਆਤ ਕਰੋ"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ਤੁਹਾਡੇ ਸਿਹਤ ਅਤੇ ਫਿੱਟਨੈੱਸ ਸੰਬੰਧੀ ਡਾਟੇ ਨੂੰ ਸਟੋਰ ਕਰਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਤੁਹਾਨੂੰ ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਵੱਖ-ਵੱਖ ਐਪਾਂ ਨੂੰ ਸਿੰਕ ਕਰਨ ਦਾ ਸਰਲ ਤਰੀਕਾ ਮਿਲਦਾ ਹੈ"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ਐਪ ਵੱਖ-ਵੱਖ ਐਪਾਂ ਤੋਂ ਤੁਹਾਡਾ ਸਿਹਤ ਅਤੇ ਫਿੱਟਨੈੱਸ ਡਾਟਾ ਸਟੋਰ ਅਤੇ ਸਿੰਕ ਕਰਦੀ ਹੈ।\n\n"<b>"ਫਿਟਨੈੱਸ ਅਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟਾ,"</b>" ਇਸ ਵਿੱਚ ਕਸਰਤ ਸੈਸ਼ਨ, ਕਦਮ, ਪੋਸ਼ਣ, ਨੀਂਦ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਸ਼ਾਮਲ ਹਨ\n\n"<b>"ਸਿਹਤ ਰਿਕਾਰਡ,"</b>" ਇਸ ਵਿੱਚ ਟੀਕੇ, ਲੈਬ ਨਤੀਜੇ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਸ਼ਾਮਲ ਹਨ"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ਐਪ ਨਾਲ ਤੁਸੀਂ ਇਹ ਕਰ ਸਕਦੇ ਹੋ"</string>
     <string name="share_data" msgid="3481932156368883946">"ਆਪਣੀਆਂ ਐਪਾਂ ਨਾਲ ਡਾਟਾ ਸਾਂਝਾ ਕਰੋ"</string>
     <string name="share_data_description" msgid="2919871301634375092">"ਉਹ ਡਾਟਾ ਚੁਣੋ ਜਿਸਨੂੰ Health Connect ਵਿੱਚ ਹਰੇਕ ਐਪ ਪੜ੍ਹ ਜਾਂ ਲਿਖ ਸਕੇ"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"ਆਪਣੀਆਂ ਸੈਟਿੰਗਾਂ ਅਤੇ ਪਰਦੇਦਾਰੀ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"ਘੱਟ ਪ੍ਰਵਾਹ"</string>
     <string name="flow_medium" msgid="3783688724668943154">"ਦਰਮਿਆਨਾ ਪ੍ਰਵਾਹ"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ਵਧੇਰੇ ਪ੍ਰਵਾਹ"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"ਮਾਹਵਾਰੀ ਸੰਬੰਧੀ ਅਗਿਆਤ ਡਾਟਾ"</string>
     <string name="period_day" msgid="3821944462093965882">"ਮਾਹਵਾਰੀ ਦੇ <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> ਦਿਨਾਂ ਵਿੱਚੋਂ <xliff:g id="DAY">%1$d</xliff:g> ਦਿਨ"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ਮਾਹਵਾਰੀ (1 ਦਿਨ)}one{ਮਾਹਵਾਰੀ (# ਦਿਨ)}other{ਮਾਹਵਾਰੀ (# ਦਿਨ)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"ਸਕਾਰਾਤਮਕ"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"ਨਕਾਰਾਤਮਕ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ਜ਼ਿਆਦਾ"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"ਸੰਗੀਤ"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"ਹੋਰ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ਮਾਰਗਦਰਸ਼ਨ ਤੋਂ ਬਿਨਾਂ"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"ਸਧਾਰਨ"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ਕਾਫ਼ੀ ਹੱਦ ਤੱਕ ਠੀਕ ਹੈ"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> ਮਿੰ."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ਘੰ. <xliff:g id="MIN">%2$s</xliff:g> ਮਿੰ."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ਘੰ."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ਏਕੀਕਰਨ ਜਾਰੀ ਹੈ"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect ਦਾ Android ਸਿਸਟਮ ਨਾਲ ਏਕੀਕਰਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡੇ ਡਾਟਾ ਅਤੇ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰਨ ਵਿੱਚ ਕੁਝ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ।"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"ਐਪ ਨੂੰ ਪ੍ਰਕਿਰਿਆ ਪੂਰੀ ਹੋਣ ਦੀ ਸੂਚਨਾ ਮਿਲਣ ਤੱਕ ਬੰਦ ਨਾ ਕਰੋ।"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect ਏਕੀਕਰਨ ਜਾਰੀ ਹੈ"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"ਅੱਪਡੇਟ ਦੀ ਲੋੜ ਹੈ"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect ਦਾ Android ਸਿਸਟਮ ਨਾਲ ਏਕੀਕਰਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ, ਇਸ ਲਈ ਤੁਸੀਂ ਇਸ ਤੱਕ ਸਿੱਧਾ ਆਪਣੀਆਂ ਸੈਟਿੰਗਾਂ ਤੋਂ ਪਹੁੰਚ ਕਰ ਸਕਦੇ ਹੋ।"</string>
     <string name="update_button" msgid="4544529019832009496">"ਅੱਪਡੇਟ ਕਰੋ"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"ਅੱਪਡੇਟ ਸ਼ੁਰੂ ਕਰੋ, ਤਾਂ ਜੋ Health Connect ਤੁਹਾਡੀਆਂ ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਨਾਲ ਏਕੀਕਰਨ ਕਰਨਾ ਜਾਰੀ ਰੱਖ ਸਕੇ"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ਹੁਣੇ ਅੱਪਡੇਟ ਕਰੋ"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"ਸਿਸਟਮ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"ਅੱਗੇ ਵਧਣ ਤੋਂ ਪਹਿਲਾਂ, ਆਪਣੇ ਫ਼ੋਨ ਸਿਸਟਮ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ।"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"ਜੇ ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ ਸਿਸਟਮ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਲਿਆ ਹੈ, ਤਾਂ ਏਕੀਕਰਨ ਨੂੰ ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰ ਕੇ ਦੇਖੋ"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect ਲਈ ਅੱਪਡੇਟ ਲੋੜੀਂਦੀ ਹੈ"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"ਅੱਗੇ ਵਧਣ ਤੋਂ ਪਹਿਲਾਂ, Health Connect ਐਪ ਨੂੰ ਨਵੀਨਤਮ ਵਰਜਨ \'ਤੇ ਅੱਪਡੇਟ ਕਰੋ।"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"ਜ਼ਿਆਦਾ ਜਗ੍ਹਾ ਦੀ ਲੋੜ ਹੈ"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect ਨੂੰ ਏਕੀਕਰਨ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣ ਲਈ, ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ਦੀ ਸਟੋਰੇਜ ਜਗ੍ਹਾ ਚਾਹੀਦੀ ਹੈ।\n\nਆਪਣੇ ਫ਼ੋਨ \'ਤੇ ਕੁਝ ਜਗ੍ਹਾ ਖਾਲੀ ਕਰੋ ਅਤੇ ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
     <string name="try_again_button" msgid="8745496819992160789">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ਜਗ੍ਹਾ ਖਾਲੀ ਕਰੋ"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"ਜ਼ਿਆਦਾ ਜਗ੍ਹਾ ਦੀ ਲੋੜ ਹੈ"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect ਨੂੰ ਏਕੀਕਰਨ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣ ਲਈ, ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ਦੀ ਸਟੋਰੇਜ ਜਗ੍ਹਾ ਚਾਹੀਦੀ ਹੈ।"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ਏਕੀਕਰਨ ਰੋਕਿਆ ਗਿਆ"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ਐਪ ਦੇ Android ਸਿਸਟਮ ਨਾਲ ਏਕੀਕਰਨ ਹੋਣ ਦੌਰਾਨ, ਇਹ ਐਪ ਬੰਦ ਹੋ ਗਈ ਸੀ।\n\nਐਪ ਨੂੰ ਮੁੜ ਤੋਂ ਖੋਲ੍ਹਣ ਲਈ, ਮੁੜ-ਚਾਲੂ ਕਰੋ \'ਤੇ ਕਲਿੱਕ ਕਰੋ ਅਤੇ ਆਪਣੇ ਡਾਟਾ ਅਤੇ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰਨਾ ਜਾਰੀ ਰੱਖੋ।"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"ਆਪਣੇ Health Connect ਡਾਟੇ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਣ ਲਈ, ਇਸ ਨੂੰ <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ਦੇ ਅੰਦਰ ਪੂਰਾ ਕਰੋ"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect ਦਾ Android ਸਿਸਟਮ ਨਾਲ ਏਕੀਕਰਨ ਜਾਰੀ ਰੱਖਣ ਲਈ, ਟੈਪ ਕਰੋ। ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਣ ਲਈ, ਇਸ ਨੂੰ <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ਦੇ ਅੰਦਰ ਪੂਰਾ ਕਰੋ"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect ਦਾ Android ਸਿਸਟਮ ਨਾਲ ਏਕੀਕਰਨ ਜਾਰੀ ਰੱਖਣ ਲਈ, ਟੈਪ ਕਰੋ।"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ਜਾਰੀ ਰੱਖੋ"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect ਦਾ ਏਕੀਕਰਨ ਮੁੜ-ਚਾਲੂ ਕਰੋ"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਣ ਲਈ, ਇਸ ਨੂੰ <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ਦੇ ਅੰਦਰ ਪੂਰਾ ਕਰੋ"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ਐਪ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect ਨਾਲ ਸਿੰਕ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣ ਲਈ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਜ਼ਰੂਰੀ ਹੈ"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect ਨਾਲ ਸਿੰਕ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣ ਲਈ ਕੁਝ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਜ਼ਰੂਰੀ ਹੈ"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect ਨਾਲ ਸਿੰਕ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣ ਲਈ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਪਵੇਗਾ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਅੱਪਡੇਟ ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ ਉਪਲਬਧ ਨਾ ਹੋਣ।"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect ਨਾਲ ਸਿੰਕ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣ ਲਈ ਕੁਝ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਪਵੇਗਾ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਅੱਪਡੇਟ ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ ਉਪਲਬਧ ਨਾ ਹੋਣ।"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਕਰੋ"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"ਹੋਰ ਜਾਣੋ"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect ਏਕੀਕਰਨ"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect ਏਕੀਕਰਨ ਪੂਰਾ ਨਹੀਂ ਹੋਇਆ"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"ਇਸ ਦੇ ਦੁਬਾਰਾ ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਤੁਹਾਨੂੰ ਇੱਕ ਸੂਚਨਾ ਮਿਲੇਗੀ।"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"ਸਮਝ ਲਿਆ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect ਏਕੀਕਰਨ ਪੂਰਾ ਨਹੀਂ ਹੋਇਆ"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"ਹੋਰ ਪੜ੍ਹੋ"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect ਏਕੀਕਰਨ ਪੂਰਾ ਹੋਇਆ"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"ਖੋਲ੍ਹੋ"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"ਨਵਾਂ ਕੀ ਹੈ"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"ਤੁਸੀਂ ਹੁਣ Health Connect ਤੱਕ ਸਿੱਧਾ ਆਪਣੀਆਂ ਸੈਟਿੰਗਾਂ ਤੋਂ ਪਹੁੰਚ ਕਰ ਸਕਦੇ ਹੋ। ਸਟੋਰੇਜ ਜਗ੍ਹਾ ਨੂੰ ਖਾਲੀ ਕਰਨ ਲਈ ਕਿਸੇ ਵੀ ਵੇਲੇ Health Connect ਐਪ ਨੂੰ ਅਣਸਥਾਪਤ ਕਰੋ।"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"ਸਮਝ ਲਿਆ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ਐਪ ਸਰੋਤਾਂ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਡੀਵਾਈਸ"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ਐਪ ਡਾਟਾ"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect ਤੱਕ ਪਹੁੰਚ ਵਾਲੀਆਂ ਐਪਾਂ ਦਾ ਡਾਟਾ ਇੱਥੇ ਦਿਖੇਗਾ"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਦਾ ਡਾਟਾ ਇੱਥੇ ਦਿਖਾਇਆ ਜਾਵੇਗਾ"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect ਤੱਕ ਪਹੁੰਚ ਵਾਲੀਆਂ ਐਪਾਂ ਦਾ ਡਾਟਾ ਇੱਥੇ ਦਿਖੇਗਾ"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"ਦਿਨ"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"ਹਫ਼ਤਾ"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"ਮਹੀਨਾ"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"ਪਿਛਲੇ ਮਹੀਨੇ"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ਇੰਦਰਾਜ"</string>
     <string name="tab_access" msgid="7818197975407243701">"ਪਹੁੰਚ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਵਧੀਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਇਨ੍ਹਾਂ Health Connect ਸੈਟਿੰਗਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਵੀ ਲੋੜ ਹੈ"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ਇਸ ਐਪ ਲਈ ਬੈਕਗ੍ਰਾਊਂਡ ਜਾਂ ਪਿਛਲੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਪੜ੍ਹਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ ਚਾਲੂ ਕਰੋ"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ਇਸ ਐਪ ਲਈ ਬੈਕਗ੍ਰਾਊਂਡ ਪਹੁੰਚ ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਪੜ੍ਹਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ ਚਾਲੂ ਕਰੋ"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ਇਸ ਐਪ ਲਈ ਪਿਛਲੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਪੜ੍ਹਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ ਚਾਲੂ ਕਰੋ"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect ਨੂੰ ਵਰਤਣਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ਆਪਣੀਆਂ ਪਹਿਲੀਆਂ ਐਪਾਂ ਨੂੰ ਸਿੰਕ ਕਰੋ, ਤਾਂ ਜੋ ਉਨ੍ਹਾਂ ਵਿਚਕਾਰ ਸਿਹਤ ਅਤੇ ਫਿੱਟਨੈੱਸ ਸੰਬੰਧੀ ਡਾਟਾ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਸਕੇ"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"ਸੈੱਟਅੱਪ ਕਰੋ"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"ਅਨੁਰੂਪ ਐਪਾਂ ਦੇਖੋ"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect ਰਾਹੀਂ <xliff:g id="APP_NAME">%s</xliff:g> ਨਾਲ ਸਿੰਕ ਕਰਨ ਲਈ ਹੋਰ ਐਪਾਂ ਲੱਭੋ"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ਐਪ ਸਟੋਰ \'ਤੇ ਦੇਖੋ"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ਸਕ੍ਰੀਨ ਲਾਕ ਸੈੱਟ ਕਰੋ"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"ਆਪਣੇ ਸਿਹਤ ਸੰਬੰਧੀ ਡਾਟੇ ਦੀ ਵਧੇਰੇ ਸੁਰੱਖਿਆ ਲਈ, ਇਸ ਡੀਵਾਈਸ ਲਈ ਪਿੰਨ, ਪੈਟਰਨ ਜਾਂ ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ਸਕ੍ਰੀਨ ਲਾਕ ਸੈੱਟ ਕਰੋ"</string>
     <string name="select_all" msgid="837499881590001166">"ਸਭ ਚੁਣੋ"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"ਕਨੈਕਟ ਕੀਤੀਆਂ ਐਪਾਂ ਹੁਣ Health Connect ਦੇ ਇਸ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹ ਨਹੀਂ ਕਰ ਸਕਣਗੀਆਂ"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ਨਿਸ਼ਾਨ ਲਗਾਇਆ"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ਸਹੀ ਦਾ ਨਿਸ਼ਾਨ ਨਹੀਂ ਲਾਇਆ ਗਿਆ"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"ਕਸਰਤ ਲਈ ਨਕਸ਼ੇ ਦਾ ਰਸਤਾ ਉਪਲਬਧ ਹੈ"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"ਅਗਲਾ ਦਿਨ"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"ਅਗਲਾ ਹਫ਼ਤਾ"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"ਅਗਲਾ ਮਹੀਨਾ"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"ਪਿਛਲਾ ਦਿਨ"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"ਪਿਛਲਾ ਹਫ਼ਤਾ"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"ਪਿਛਲਾ ਮਹੀਨਾ"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"ਕੀ ਸਾਰਾ ਡਾਟਾ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾਉਣਾ ਹੈ?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"ਕੀ ਚੁਣਿਆ ਗਿਆ ਡਾਟਾ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾਉਣਾ ਹੈ?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"ਕੀ <xliff:g id="APP_NAME">%s</xliff:g> ਦਾ ਸਾਰਾ ਡਾਟਾ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾਉਣਾ ਹੈ?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"ਕੀ ਚੁਣੀ ਗਈ <xliff:g id="APP_NAME">%1$s</xliff:g> ਦੇ, <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ਵਾਲੇ ਹਫ਼ਤੇ ਦੇ ਇੰਦਰਾਜ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾਉਣੇ ਹਨ?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"ਕੀ ਚੁਣੀ ਗਈ <xliff:g id="APP_NAME">%1$s</xliff:g> ਦੇ <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ਵਾਲੇ ਇੰਦਰਾਜ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾਉਣੇ ਹਨ?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ਕੀ ਇਸ <xliff:g id="APP_NAME">%s</xliff:g> ਦਾ ਇਹ ਇੰਦਰਾਜ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾਉਣਾ ਹੈ?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"ਕੀ <xliff:g id="APP_NAME">%2$s</xliff:g> ਲਈ <xliff:g id="DATA_TYPE">%1$s</xliff:g> ਡਾਟੇ ਨੂੰ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾਉਣਾ ਹੈ?"</string>
+    <string name="on" msgid="8266542510798355807">"ਚਾਲੂ"</string>
+    <string name="off" msgid="6996623844428550649">"ਬੰਦ"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g> ਵਜੇ ਪਹੁੰਚ ਕੀਤੀ ਗਈ"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"<xliff:g id="TIME_DATE">%1$s</xliff:g> ਵਜੇ ਕੱਲ੍ਹ ਪਹੁੰਚ ਕੀਤੀ ਗਈ"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> ਨੂੰ <xliff:g id="TIME_DATE_1">%2$s</xliff:g> ਵਜੇ ਪਹੁੰਚ ਕੀਤੀ ਗਈ"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"ਹਮੇਸ਼ਾਂ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"ਚੁਣੀ ਐਪ ਨੂੰ ਆਗਿਆ ਦਿਓ"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ਐਪ ਵਰਤਣ ਦੌਰਾਨ"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"ਸਭ ਨੂੰ ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਫਿਟਨੈੱਸ ਤੇ ਤੰਦਰੁਸਤੀ ਸੰਬੰਧੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ <xliff:g id="DATA_TYPES">%2$s</xliff:g> ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕਰ ਰਹੀ ਹੈ।\n\nਸਭ ਦੀ ਆਗਿਆ ਦੇਣ ਜਾਂ ਉਨ੍ਹਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਤੌਰ \'ਤੇ ਕੰਟਰੋਲ ਕਰਨ ਬਾਰੇ ਚੁਣੋ।"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"ਕੀ <xliff:g id="DATA_TYPE">%2$s</xliff:g> ਤੱਕ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ਫਿੱਟਨੈੱਸ ਅਤੇ ਤੰਦਰੁਸਤੀ"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ਹਰ ਸਮੇਂ"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ਵਰਤਣ ਵੇਲੇ"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"ਹਰ ਸਮੇਂ"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ਵਰਤਣ ਵੇਲੇ"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਤੁਹਾਡੇ ਸਾਰੇ ਫਿੱਟਨੈੱਸ ਅਤੇ ਤੰਦਰੁਸਤੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੈ"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਹੈ"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ਇਨ੍ਹਾਂ ਇਜਾਜ਼ਤਾਂ ਨਾਲ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਸੈਂਸਰਾਂ ਤੋਂ <xliff:g id="APP_NAME">%1$s</xliff:g> ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਮਿਲਦੀ ਹੈ।"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ਵਿੱਚੋਂ <xliff:g id="NUMBER_0">%1$d</xliff:g> ਐਪਾਂ ਨੂੰ ਆਗਿਆ ਦਿੱਤੀ"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"ਕੋਈ ਵੀ ਐਪ ਬੇਨਤੀ ਨਹੀਂ ਕਰ ਰਹੀ ਹੈ"</string>
+    <string name="allowed" msgid="4158456017482263737">"ਆਗਿਆ ਹੈ"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"ਆਗਿਆ ਨਹੀਂ ਹੈ"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ਇਸ ਇਜਾਜ਼ਤ ਵਾਲੀਆਂ ਐਪਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਸੈਂਸਰ ਤੋਂ <xliff:g id="DATA_TYPE">%s</xliff:g> ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"ਕੀ ਤੁਹਾਡੀ ਘੜੀ ਤੋਂ ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ <xliff:g id="DATA_TYPE">%s</xliff:g> ਦੀ ਪਹੁੰਚ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"ਸਹੀ ਦਾ ਨਿਸ਼ਾਨ"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"ਗਲਤ ਦਾ ਨਿਸ਼ਾਨ"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"ਫ਼ਿਲਹਾਲ, <xliff:g id="APP_NAME">%1$s</xliff:g> ਫਿੱਟਨੈੱਸ ਅਤੇ ਤੰਦਰੁਸਤੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਫਿੱਟਨੈੱਸ ਅਤੇ ਤੰਦਰੁਸਤੀ ਡਾਟੇ ਤੱਕ ਹਮੇਸ਼ਾਂ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਕੋਲ <xliff:g id="DATA_TYPES">%2$s</xliff:g> ਤੱਕ ਪਹੁੰਚ ਹੈ।"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ਫਿੱਟਨੈੱਸ ਅਤੇ ਤੰਦਰੁਸਤੀ ਦੀਆਂ ਇਜਾਜ਼ਤਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
 </resources>
diff --git a/apk/res/values-pl/strings.xml b/apk/res/values-pl/strings.xml
index 2f3493e..a8b9762 100644
--- a/apk/res/values-pl/strings.xml
+++ b/apk/res/values-pl/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Zarządzaj na urządzeniu danymi o zdrowiu i aktywności fizycznej oraz kontroluj, które aplikacje mogą z nich korzystać"</string>
     <string name="data_title" msgid="4456619761533380816">"Dane i dostęp"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Przeglądaj dane o stanie zdrowia"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Wyświetl dane o stanie zdrowia i aplikacje, które mają do nich dostęp"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Wszystkie kategorie"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Zobacz wszystkie kategorie"</string>
     <string name="no_data" msgid="1906986019249068659">"Brak danych"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Wczoraj"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Odczyt: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Zapis: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Zarządzaj uprawnieniami"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Czas: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktywność"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"dostęp do Twoich danych dotyczących zdrowia"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Odczytuj spalone kalorie"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Zezwala aplikacji na odczytywanie spalonych kalorii"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Dostęp do danych w tle"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do danych w tle?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do danych w tle?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do danych dotyczących aktywności fizycznej i samopoczucia oraz do danych o stanie zdrowia, gdy nie będziesz jej używać."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do danych o stanie zdrowia, gdy nie będziesz jej używać."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do danych dotyczących aktywności fizycznej i samopoczucia, gdy nie będziesz jej używać."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do danych z Health Connect, gdy nie będziesz jej używać."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do wcześniejszych danych?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do danych dotyczących aktywności fizycznej i samopoczucia dodanych przed <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do wszystkich wcześniejszych danych dotyczących aktywności fizycznej i samopoczucia."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do danych z Health Connect dodanych przed <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do wszystkich wcześniejszych danych z Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dodatkowy dostęp?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> wymaga też dostępu do tych ustawień Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Dostęp do wszystkich danych w tle"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Dostęp do danych o stanie zdrowia w tle"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Dostęp do danych dotyczących aktywności fizycznej i samopoczucia w tle"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Zezwól tej aplikacji na dostęp do danych dotyczących aktywności fizycznej i samopoczucia oraz do danych o stanie zdrowia, gdy jej nie używasz"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Zezwól tej aplikacji na dostęp do tych danych, gdy jej nie używasz"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Zezwól tej aplikacji na dostęp do tych danych, gdy jej nie używasz"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Dostęp do danych w tle"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Zezwól tej aplikacji na dostęp do danych z Health Connect, gdy jej nie używasz"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Dostęp do wcześniejszych danych dotyczących aktywności fizycznej i samopoczucia"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Zezwól tej aplikacji na dostęp do danych dodanych przed <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Zezwól tej aplikacji na dostęp do wszystkich wcześniejszych danych"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Dostęp do wcześniejszych danych"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Zezwól tej aplikacji na dostęp do danych z Health Connect dodanych przed <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Zezwól tej aplikacji na dostęp do wszystkich wcześniejszych danych z Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> może już uzyskać dostęp do Twoich wcześniejszych danych o stanie zdrowia"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Więcej informacji o uprawnieniach"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Dostęp do wszystkich danych w tle"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Dostęp do danych o stanie zdrowia w tle"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Dostęp do danych dotyczących aktywności fizycznej i samopoczucia w tle"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Zezwól tej aplikacji na dostęp do danych dotyczących aktywności fizycznej i samopoczucia oraz do danych o stanie zdrowia, gdy jej nie używasz"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Zezwól tej aplikacji na dostęp do tych danych, gdy jej nie używasz"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Zezwól tej aplikacji na dostęp do tych danych, gdy jej nie używasz"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Dostęp do danych w tle"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Zezwól tej aplikacji na dostęp do danych z Health Connect, gdy jej nie używasz"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Dostęp do wcześniejszych danych dotyczących aktywności fizycznej i samopoczucia"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Zezwól tej aplikacji na dostęp do danych dodanych przed <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Zezwól tej aplikacji na dostęp do wszystkich wcześniejszych danych"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Dostęp do wcześniejszych danych"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Zezwól tej aplikacji na dostęp do danych z Health Connect dodanych przed <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Zezwól tej aplikacji na dostęp do wszystkich wcześniejszych danych z Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Obecnie nie są odczytywane żadne dane o aktywności fizycznej, ponieważ aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie ma uprawnień do ich odczytu"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> może już uzyskać dostęp do Twoich wcześniejszych danych o stanie zdrowia. Aby to zmienić, wyłącz uprawnienia dostępu do tego typu danych w przypadku tej aplikacji."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Zarządzaj dostępem do danych o stanie zdrowia"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aby przyznać tej aplikacji dostęp w tle lub dostęp do wcześniejszych danych, włącz co najmniej 1 uprawnienie do odczytu"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aby przyznać tej aplikacji dostęp w tle, włącz co najmniej 1 uprawnienie do odczytu"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aby przyznać tej aplikacji dostęp do wcześniejszych danych, włącz co najmniej 1 uprawnienie do odczytu"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Zezwól tej aplikacji na dostęp do wszystkich wcześniejszych danych z Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Zezwól tej aplikacji na dostęp do danych z Health Connect, gdy jej nie używasz"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do danych z Health Connect, gdy nie będziesz jej używać."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Dostęp do wcześniejszych danych"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do wcześniejszych danych?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Zezwól tej aplikacji na dostęp do danych z Health Connect dodanych przed <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Zezwól tej aplikacji na dostęp do wszystkich wcześniejszych danych z Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do danych z Health Connect dodanych przed <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Jeśli na to zezwolisz, aplikacja będzie miała dostęp do wszystkich wcześniejszych danych z Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Kalorie spalone podczas aktywności"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"kalorie spalone podczas aktywności"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Odczytuj informacje o kaloriach spalonych podczas aktywności"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"pchnięcia wózka inwalidzkiego"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Odczytuj dane o pchnięciach wózka inwalidzkiego"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Zapisuj dane o pchnięciach wózka inwalidzkiego"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensywność aktywności"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensywność aktywności"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Odczytuj dane o intensywności aktywności"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Zapisuj dane o intensywności aktywności"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Podstawowa przemiana materii"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"podstawowa przemiana materii"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Odczytuj dane o podstawowej przemianie materii"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura skóry"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Odczytuj temperaturę skóry"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Zapisuj temperaturę ciała"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Obejmuje to wszystkie dane o stanie zdrowia zsynchronizowane z Health Connect i dodane do tej usługi. Nie musi to być pełna dokumentacja medyczna i nie obejmuje to medycznego opisu danych o Twoim stanie zdrowia."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Wszystkie dane o stanie zdrowia"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"wszystkie dane o stanie zdrowia"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Zapisuj wszystkie dane o stanie zdrowia"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergie"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergie"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Odczytywanie informacji o alergiach"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Uodpornienie"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"uodpornienie"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Odczytuj dane o uodpornieniu"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Wyniki badań laboratoryjnych"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"wyniki badań laboratoryjnych"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Odczytaj wyniki badań laboratoryjnych"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergie"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergie"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Odczytywanie informacji o alergiach"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Schorzenia"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"schorzenia"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Odczytuj informacje o schorzeniach"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Szczepienia"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"szczepienia"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Odczytywanie informacji o szczepieniach"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Wyniki badań laboratoryjnych"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"wyniki badań laboratoryjnych"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Odczytywanie wyników badań laboratoryjnych"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Leki"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"leki"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Odczytaj dane o lekach"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Dane osobowe"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"dane osobowe"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Odczytuj dane osobowe"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Dane specjalisty"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"dane specjalisty"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Odczytuj dane specjalisty"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Ciąża"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ciąża"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Odczytaj dane o ciąży"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemy"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemy"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Zapoznaj się z problemami"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedury"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedury"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Odczytaj procedury"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historia danych związanych ze stylem życia"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historia danych związanych ze stylem życia"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historia danych związanych ze stylem życia"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Odczytaj historię danych związanych ze stylem życia"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Parametry życiowe"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Wizyty"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"wizyty"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Odczytaj informacje o wizytach"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Parametry życiowe"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"parametry życiowe"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Odczytaj parametry życiowe"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Uważność"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Zapisuj dane o uważności"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Zezwól aplikacji „<xliff:g id="APP_NAME">%1$s</xliff:g>” na odczytywanie"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Zezwól aplikacji „<xliff:g id="APP_NAME">%1$s</xliff:g>” na zapisywanie"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Anuluj"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Zezwól"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Zezwalaj na wszystko"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Nie zezwalaj"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Wybierz, które dane aplikacja będzie mogła odczytywać lub zapisywać w Health Connect."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Wybierz, które dane aplikacja będzie mogła odczytywać lub zapisywać w Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Wybierz, które dane aplikacja będzie mogła odczytywać w Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Wybierz, które dane aplikacja będzie mogła zapisywać w Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Jeśli przyznasz uprawnienia do odczytu, aplikacja będzie mogła odczytywać nowe dane i dane z ostatnich 30 dni"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Jeśli przyznasz uprawnienia do odczytu, aplikacja będzie mogła odczytywać nowe i wcześniejsze dane"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Aby dowiedzieć się, jak aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> posługuje się Twoimi danymi, zajrzyj do dokumentu <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> dewelopera aplikacji"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do danych dotyczących aktywności fizycznej i samopoczucia?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Aby dowiedzieć się, jak aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> wykorzystuje Twoje dane, zajrzyj do dokumentu <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"polityka prywatności"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do Twoich danych o stanie zdrowia?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Jeśli przyznasz dostęp, aplikacja będzie mogła odczytywać i zapisywać dane, takie jak informacje o alergiach i szczepieniach oraz wyniki badań laboratoryjnych i nie tylko\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Jeśli przyznasz dostęp, aplikacja będzie mogła odczytywać dane, takie jak informacje o alergiach i szczepieniach oraz wyniki badań laboratoryjnych i nie tylko\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Informacje o danych o stanie zdrowia"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Dane objęte udostępnianiem"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Jeśli na to zezwolisz, aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> będzie mogła udostępniać Twoje dane o stanie zdrowia w Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Zsynchronizuj dane o stanie zdrowia z różnych aplikacji i źródeł, aby przechowywać je w jednym miejscu"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Usunąć wszystkie uprawnienia?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Usuń wszystko"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać żadnych danych z Health Connect ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać żadnych danych z Health Connect (w tym wcześniejszych danych) ani ich zapisywać.\n\nNie wpływa na to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące lokalizacji, aparatu czy mikrofonu."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać żadnych danych z Health Connect (w tym danych w tle i wcześniejszych danych) ani ich zapisywać.\n\nNie wpływa na to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące lokalizacji, aparatu czy mikrofonu."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Usuń z Health Connect także dane zapisane w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Usunąć wszystkie uprawnienia?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Usunąć wszystkie uprawnienia dostępu do danych o stanie zdrowia?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Usunąć uprawnienia dot. aktywności fizycznej i samopoczucia?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Usuń z Health Connect dane o aktywności fizycznej z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Usunąć wszystkie uprawnienia dostępu do danych o stanie zdrowia?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Usuń z Health Connect dane o stanie zdrowia z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać danych z Health Connect ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać danych z Health Connect (w tym danych w tle) ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać danych z Health Connect (w tym wcześniejszych danych) ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać danych z Health Connect (w tym danych w tle i wcześniejszych danych) ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Usunąć wszystkie uprawnienia?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać danych z Health Connect ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać danych z Health Connect (w tym danych w tle) ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać danych z Health Connect (w tym wcześniejszych danych) ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie będzie już mogła odczytywać danych z Health Connect (w tym danych w tle i wcześniejszych danych) ani ich zapisywać.\n\nNie wpływa to na inne uprawnienia, które może mieć ta aplikacja, np. dotyczące aparatu, mikrofonu czy lokalizacji."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Usuń z Health Connect dane o aktywności fizycznej i dane o stanie zdrowia z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Uprawnienia tej aplikacji zostały usunięte"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Usuń też wszystkie dane z Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Następny dzień"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Wybrany dzień"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Poprzedni dzień"</string>
     <string name="default_error" msgid="7966868260616403475">"Coś poszło nie tak. Spróbuj ponownie."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Nieznany zasób"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Dane źródłowe"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Nawias otwierający."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Nawias zamykający."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Wartość pola <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Te aplikacje nie mają już dostępu, ale ich dane wciąż są przechowywane w Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> może odczytywać dane dodane po <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>."</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Aby zarządzać innymi uprawnieniami urządzeń z Androidem, do których ta aplikacja ma dostęp, otwórz Ustawienia &gt; Aplikacje."</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Dane, które udostępniasz aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>, podlegają jej polityce prywatności."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Informacje o tym, jak aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> zarządza Twoimi danymi, znajdziesz w polityce prywatności określonej przez dewelopera"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Aby zarządzać innymi uprawnieniami systemu Android, do których ta aplikacja ma dostęp, otwórz Ustawienia, a potem Aplikacje"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Przeczytaj politykę prywatności"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Dostęp w ciągu ostatnich 24 godzin"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Dostęp aplikacji"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Nie masz obecnie zainstalowanych żadnych zgodnych aplikacji"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Dodatkowy dostęp"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Wcześniejsze dane, dane w tle"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Usunięto dodatkowe uprawnienia dla tej aplikacji"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Uprawnienia"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness i dbanie o zdrowie"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Ćwiczenia, sen, odżywianie itp."</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Dane o stanie zdrowia"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"dane o stanie zdrowia"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Wyniki badań, leki, szczepienia itp."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Wyniki badań, leki, szczepienia itp."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Uprawnienia aplikacji zostały usunięte"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Aplikacja Health Connect usunęła uprawnienia aplikacji <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Aplikacja Health Connect usunęła uprawnienia aplikacji <xliff:g id="APP_DATA_0">%1$s</xliff:g> i <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Otwórz Sklep Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Pierwsze kroki w Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect przechowuje Twoje dane o zdrowiu i aktywności fizycznej i jest prostym sposobem na synchronizację danych z różnych aplikacji na urządzeniu"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect przechowuje i synchronizuje Twoje dane o zdrowiu i aktywności fizycznej z różnych aplikacji.\n\n"<b>"Dane o zdrowiu i aktywności fizycznej"</b>", w tym sesje ćwiczeń, liczba kroków, informacje o odżywianiu i śnie oraz inne dane\n\n"<b>"Dane o stanie zdrowia"</b>", w tym szczepienia, wyniki badań laboratoryjnych oraz inne dane"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Dzięki Health Connect możesz:"</string>
     <string name="share_data" msgid="3481932156368883946">"Udostępniaj dane aplikacjom"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Wybierz dane, jakie każda aplikacja będzie mogła odczytywać i zapisywać w Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Zarządzaj ustawieniami i prywatnością"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Słabe krwawienie"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Średnie krwawienie"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Obfite krwawienie"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Nieznany przepływ"</string>
     <string name="period_day" msgid="3821944462093965882">"Dzień okresu: <xliff:g id="DAY">%1$d</xliff:g> z <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Okres (1 dzień)}few{Okres (# dni)}many{Okres (# dni)}other{Okres (# dnia)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozytywny wynik"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatywny wynik"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Wysoka"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muzyka"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Inne"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Bez wskazówek"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Umiarkowana"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intensywna"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> godz. <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> godz."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Trwa integracja"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Trwa integracja Health Connect z systemem Android.\n\nPrzenoszenie danych i uprawnień może trochę potrwać."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Nie zamykaj aplikacji, dopóki nie otrzymasz powiadomienia o ukończeniu procesu."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Trwa integracja Health Connect"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Wymagana aktualizacja"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Trwa integracja Health Connect z systemem Android, więc możesz korzystać z tej aplikacji bezpośrednio przez ustawienia."</string>
     <string name="update_button" msgid="4544529019832009496">"Zaktualizuj"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Rozpocznij aktualizację, aby kontynuować integrowanie Health Connect z ustawieniami systemu"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Aktualizuj teraz"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Wymagana aktualizacja systemu"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Zanim przejdziesz dalej, zaktualizuj system telefonu."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Jeśli system telefonu został już zaktualizowany, uruchom telefon ponownie, aby kontynuować integrację"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Wymagana aktualizacja Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Zanim przejdziesz dalej, zaktualizuj aplikację Health Connect do najnowszej wersji."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Potrzebne więcej miejsca"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Aby można było kontynuować integrację, Health Connect musi mieć <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> dostępnego miejsca na telefonie.\n\nWyczyść trochę miejsca na telefonie i spróbuj ponownie."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Spróbuj ponownie"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Zwolnij miejsce"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Potrzebne więcej miejsca"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Aby można było kontynuować integrację, Health Connect musi mieć <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> dostępnego miejsca na telefonie."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Wstrzymano integrację"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikacja Health Connect została zamknięta podczas integracji z systemem Android.\n\nAby ponownie otworzyć aplikację i kontynuować przenoszenie danych oraz uprawnień, kliknij Wznów."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Aby dane z Health Connect zostały zachowane, cały proces nie może trwać dłużej niż <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Kliknij, aby kontynuować integrowanie Health Connect z systemem Android. Aby dane zostały zachowane, cały proces nie może trwać dłużej niż <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Kliknij, aby kontynuować integrowanie Health Connect z systemem Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Dalej"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Wznów integrację Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Aby dane zostały zachowane, cały proces nie może trwać dłużej niż <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Wymagana jest aktualizacja aplikacji"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> musi zostać zaktualizowana, aby kontynuować synchronizację z Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Niektóre aplikacje muszą zostać zaktualizowane, aby kontynuować synchronizację z Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> musi zostać zaktualizowana, aby kontynuować synchronizację z Health Connect. Aktualizacje mogą być niedostępne w przypadku niektórych aplikacji."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Niektóre aplikacje muszą zostać zaktualizowane, aby kontynuować synchronizację z Health Connect. Aktualizacje mogą być niedostępne w przypadku niektórych aplikacji."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Sprawdź dostępność aktualizacji"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Więcej informacji"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integracja Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integracja Health Connect nie została ukończona"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Gdy proces będzie ponownie dostępny, otrzymasz powiadomienie."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integracja Health Connect nie została ukończona"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Więcej informacji"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Ukończono integrację Health Connect"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Otwórz"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Nowości"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Możesz teraz korzystać z Health Connect bezpośrednio przez ustawienia. Aplikację Health Connect możesz odinstalować w dowolnym momencie, aby zwolnić dostępne miejsce."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Edytuj źródła aplikacji"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Ustawienie domyślne urządzenia"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Dane aplikacji"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Tutaj pojawią się dane z aplikacji z dostępem do Health Connect"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Tutaj pojawią się dane z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Tutaj pojawią się dane z aplikacji z dostępem do Health Connect"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dzień"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Tydzień"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Miesiąc"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Ostatni miesiąc"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Wpisy"</string>
     <string name="tab_access" msgid="7818197975407243701">"Dostęp"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dodatkowy dostęp?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> wymaga też dostępu do tych ustawień Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aby przyznać tej aplikacji dostęp w tle lub dostęp do wcześniejszych danych, włącz co najmniej 1 uprawnienie do odczytu"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aby przyznać tej aplikacji dostęp w tle, włącz co najmniej 1 uprawnienie do odczytu"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aby przyznać tej aplikacji dostęp do wcześniejszych danych, włącz co najmniej 1 uprawnienie do odczytu"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Zacznij korzystać z Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Zsynchronizuj pierwsze aplikacje, aby udostępniały sobie dane o Twoim zdrowiu i aktywności fizycznej"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Skonfiguruj"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Zobacz zgodne aplikacje"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Znajdź więcej aplikacji do synchronizacji z aplikacją <xliff:g id="APP_NAME">%s</xliff:g> przez Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Zobacz w sklepie z aplikacjami"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ustaw blokadę ekranu"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Aby zwiększyć bezpieczeństwo swoich danych dotyczących zdrowia, ustaw na urządzeniu kod PIN, wzór lub hasło"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Ustaw blokadę ekranu"</string>
     <string name="select_all" msgid="837499881590001166">"Zaznacz wszystko"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Połączone aplikacje nie będą już mogły odczytywać tych danych z Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Zaznaczono"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nie zaznaczono"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Dostępna jest trasa ćwiczeń na mapie"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Następny dzień"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Następny tydzień"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Następny miesiąc"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Poprzedni dzień"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Poprzedni tydzień"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Poprzedni miesiąc"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Trwale usunąć wszystkie te dane?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Trwale usunąć wybrane dane?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Trwale usunąć wszystkie dane aplikacji <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Trwale usunąć wybrane wpisy z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> dotyczące tego tygodnia: <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Trwale usunąć wybrane wpisy z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> dotyczące tego miesiąca: <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Trwale usunąć ten wpis z aplikacji <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Trwale usunąć te dane (<xliff:g id="DATA_TYPE">%1$s</xliff:g>) w przypadku aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Włączony"</string>
+    <string name="off" msgid="6996623844428550649">"Wyłączony"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Ostatni dostęp: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Ostatni dostęp wczoraj, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Ostatni dostęp <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Zawsze zezwalaj"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Zaakceptuj wybrane"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Podczas używania aplikacji"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Odrzuć wszystkie"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do danych dotyczących aktywności fizycznej i samopoczucia?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi o dostęp do: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nMożesz zezwolić na wszystkie te działania lub kontrolować je pojedynczo."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do tych danych: <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness i dbanie o zdrowie"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"przez cały czas"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"podczas używania"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Przez cały czas"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Podczas używania"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> może mieć dostęp do wszystkich Twoich danych dotyczących aktywności fizycznej i samopoczucia <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Dozwolony dostęp"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Dozwolony odczyt"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Dzięki tym uprawnieniom <xliff:g id="APP_NAME">%1$s</xliff:g> ma dostęp do danych z czujników Twojego urządzenia."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Przyznano dostęp <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> aplikacji"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Brak aplikacji proszących o dostęp"</string>
+    <string name="allowed" msgid="4158456017482263737">"Dozwolone"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Niedozwolone"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikacje z tymi uprawnieniami mają dostęp do danych (<xliff:g id="DATA_TYPE">%s</xliff:g>) z czujników na urządzeniu."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Usunąć dostęp do danych (<xliff:g id="DATA_TYPE">%s</xliff:g>) dla wszystkich aplikacji na zegarku?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Znacznik wyboru"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Krzyżyk"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Obecnie <xliff:g id="APP_NAME">%1$s</xliff:g> ma dostęp do danych dotyczących aktywności fizycznej i samopoczucia <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Zezwolić aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na stały dostęp do danych dotyczących aktywności fizycznej i samopoczucia?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ma dostęp do tych danych: <xliff:g id="DATA_TYPES">%2$s</xliff:g>"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Zarządzaj uprawnieniami dotyczącymi aktywności fizycznej i samopoczucia"</string>
 </resources>
diff --git a/apk/res/values-pt-rPT/strings.xml b/apk/res/values-pt-rPT/strings.xml
index 686868d..cb87bb2 100644
--- a/apk/res/values-pt-rPT/strings.xml
+++ b/apk/res/values-pt-rPT/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Faça a gestão dos dados de saúde e fitness no seu dispositivo e defina que apps podem aceder a estes"</string>
     <string name="data_title" msgid="4456619761533380816">"Dados e acesso"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Procurar registos de saúde"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Veja os seus registos de saúde e que apps podem aceder a estes"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Todas as categorias"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Ver todas as categorias"</string>
     <string name="no_data" msgid="1906986019249068659">"Sem dados"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Ontem"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Leitura: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Escrita: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Gerir autorizações"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Hora: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Atividade"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"aceder aos seus dados de saúde"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Ler calorias queimadas"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Permite que a app leia as calorias queimadas"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Aceder aos dados em segundo plano"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda aos dados em segundo plano?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda aos dados em segundo plano?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Se permitir, esta app pode aceder aos dados de fitness e bem-estar, e aos registos de saúde, quando não estiver a usá-la."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Se permitir, esta app pode aceder aos registos de saúde quando não estiver a usá-la."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Se permitir, esta app pode aceder aos dados de fitness e bem-estar quando não estiver a usá-la."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Se permitir, esta app pode aceder aos dados da Saúde Connect quando não estiver a usar a app."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda aos dados anteriores?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Se permitir, esta app pode aceder aos dados de fitness e bem-estar adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Se permitir, esta app pode aceder a todos os dados de fitness e bem-estar anteriores."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Se permitir, esta app pode aceder aos dados da Saúde Connect adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Se permitir, esta app pode aceder a todos os dados anteriores da Saúde Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Permitir o acesso adicional à app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> também quer aceder a estas definições da Saúde Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Aceder a todos os dados em segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Aceder aos registos de saúde em segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Aceder a dados de fitness e bem-estar em segundo plano"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Permita que esta app aceda aos dados de fitness e bem-estar, e aos registos de saúde, quando não estiver a usá-la"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Permita que esta app aceda a estes dados quando não estiver a usá-la"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Permita que esta app aceda a estes dados quando não estiver a usá-la"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Aceder aos dados em segundo plano"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Permita que esta app aceda aos dados da Saúde Connect quando não estiver a usar a app"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Aceder a dados de fitness e bem-estar anteriores"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Permita que esta app aceda a dados adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Permita que esta app aceda a todos os dados anteriores"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Aceder a dados anteriores"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Permita que esta app aceda aos dados da Saúde Connect adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Permitir que esta app aceda a todos os dados anteriores da Saúde Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> já pode aceder a dados anteriores dos seus registos de saúde"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Leia mais sobre as autorizações"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Aceder a todos os dados em segundo plano"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Aceder aos registos de saúde em segundo plano"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Aceder a dados de fitness e bem-estar em segundo plano"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Permita que esta app aceda aos dados de fitness e bem-estar, e aos registos de saúde, quando não estiver a usá-la"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Permita que esta app aceda a estes dados quando não estiver a usá-la"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Permita que esta app aceda a estes dados quando não estiver a usá-la"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Aceder aos dados em segundo plano"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Permita que esta app aceda aos dados da Saúde Connect quando não estiver a usar a app"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Aceder a dados de fitness e bem-estar anteriores"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Permita que esta app aceda a dados adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Permita que esta app aceda a todos os dados anteriores"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Aceder a dados anteriores"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Permita que esta app aceda aos dados da Saúde Connect adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Permita que esta app aceda a todos os dados anteriores da Saúde Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"De momento, não estão a ser lidos dados de fitness porque a app <xliff:g id="APP_NAME">%1$s</xliff:g> não tem autorizações de leitura ativas"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> já pode aceder a dados anteriores dos seus registos de saúde. Para alterar esta definição, desative as autorizações do registo de saúde desta app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Faça a gestão das autorizações do registo de saúde"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Ative, pelo menos, uma autorização de leitura para permitir o acesso a dados antigos ou de segundo plano para esta app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Ative, pelo menos, uma autorização de leitura para ativar o acesso em segundo plano para esta app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Ative, pelo menos, uma autorização de leitura para ativar o acesso a dados antigos para esta app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Permitir que esta app aceda a todos os dados anteriores da Saúde Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Permita que esta app aceda aos dados da Saúde Connect quando não estiver a usá-la"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Se permitir, esta app pode aceder aos dados da Saúde Connect quando não estiver a usar a app."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Aceder aos dados anteriores"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda aos dados anteriores?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Permita que esta app aceda aos dados da Saúde Connect adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Permitir que esta app aceda a todos os dados anteriores da Saúde Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Se permitir, esta app pode aceder aos dados da Saúde Connect adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Se permitir, esta app pode aceder a todos os dados anteriores da Saúde Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calorias queimadas em atividade"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"calorias queimadas em atividade"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Ler calorias queimadas em atividade"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"empurrar cadeira de rodas"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Ler dados de empurrar cadeira de rodas"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Escrever dados de empurrar cadeira de rodas"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensidade da atividade"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensidade da atividade"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Ler intensidade da atividade"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Escrever intensidade da atividade"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Taxa metabólica basal"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"taxa metabólica basal"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Ler taxa metabólica basal"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura da pele"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Ler temperatura da pele"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Escrever temperatura da pele"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Isto inclui todos os registos de saúde sincronizados e adicionados à Saúde Connect. Este registo pode não ser o seu registo médico completo e não inclui uma descrição médica dos seus registos de saúde."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Todos os registos de saúde"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"todos os registos de saúde"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Escrever todos os registos de saúde"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergias"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergias"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Ler alergias"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunização"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunização"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Ler dados de imunização"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Resultados de laboratório"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"resultados de laboratório"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Ler resultados de laboratório"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergias"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergias"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Ler alergias"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Condições"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"condições"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Leia as condições"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vacinas"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vacinas"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Ler vacinas"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Resultados laboratoriais"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"resultados laboratoriais"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Ler resultados laboratoriais"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medicamentos"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"medicamentos"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Ler medicamentos"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Detalhes pessoais"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"detalhes pessoais"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Leia detalhes pessoais"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Detalhes do médico"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"detalhes do médico"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Leia detalhes do médico"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Gravidez"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"gravidez"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Ler gravidez"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemas"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemas"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Ler problemas"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedimentos"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedimentos"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Ler procedimentos"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Histórico social"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Histórico social"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"histórico social"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Ler histórico social"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Sinais vitais"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Consultas"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"consultas"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Leia as consultas"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Sinais vitais"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"sinais vitais"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Ler sinais vitais"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Escrever dados de mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Permita a leitura pela app \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Permita a escrita pela app \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancelar"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Permitir"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Permitir tudo"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Não permitir"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Escolha os dados que quer que esta app leia ou escreva na Saúde Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Escolha os dados que quer que esta app leia ou escreva na Saúde Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Escolha os dados que quer que esta app leia da Saúde Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Escolha os dados que quer que esta app escreva na Saúde Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Se conceder acesso de leitura, a app pode ler dados novos e dados dos últimos 30 dias"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Se conceder acesso de leitura, a app pode ler dados novos e anteriores"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda à Saúde Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Pode saber como a app <xliff:g id="APP_NAME">%1$s</xliff:g> processa os seus dados na <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> do programador"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda a dados de fitness e bem-estar?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Pode saber como a app <xliff:g id="APP_NAME">%1$s</xliff:g> trata os seus dados na respetiva <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"política de privacidade"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda aos seus registos de saúde?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Se der acesso, a app pode ler e escrever dados, como alergias, resultados de laboratório, vacinas e muito mais\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Se der acesso, a app pode ler dados, como alergias, resultados de laboratório, vacinas e muito mais\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Acerca dos registos de saúde"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Os dados a partilhar incluem"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Se permitir, a app <xliff:g id="APP_NAME">%1$s</xliff:g> pode partilhar os seus registos de saúde com a Saúde Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sincronize os seus registos de saúde de diferentes apps e origens para os manter num único lugar"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Remover todas as autorizações?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Remover tudo"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler e escrever dados da Saúde Connect.\n\nIsto não afeta outras autorizações que esta app possa ter, como Localização, Câmara ou Microfone."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler e escrever dados da Saúde Connect, incluindo dados antigos.\n\nIsto não afeta outras autorizações que esta app possa ter, como Localização, Câmara ou Microfone."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler e escrever dados da Saúde Connect, incluindo dados antigos e de segundo plano.\n\nIsto não afeta outras autorizações que esta app possa ter, como Localização, Câmara ou Microfone."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Apagar também os dados da app <xliff:g id="APP_NAME">%1$s</xliff:g> da Saúde Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remover todas as autorizações?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remover todas as autorizações do registo de saúde?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Remover todas as autorizações de fitness e bem-estar?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Eliminar também os dados de fitness da app <xliff:g id="APP_NAME">%1$s</xliff:g> da Saúde Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remover todas as autorizações do registo de saúde?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Eliminar também os registos de saúde da app <xliff:g id="APP_NAME">%1$s</xliff:g> da Saúde Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler ou escrever estes dados da Saúde Connect.\n\nIsto não afeta outras autorizações que esta app possa ter, como o acesso à câmara, ao microfone ou à localização."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler ou escrever estes dados da Saúde Connect, incluindo dados de segundo plano.\n\nIsto não afeta outras autorizações que esta app possa ter, como o acesso à câmara, ao microfone ou à localização."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler ou escrever estes dados da Saúde Connect, incluindo dados antigos.\n\nIsto não afeta outras autorizações que esta app possa ter, como o acesso à câmara, ao microfone ou à localização."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler ou escrever estes dados da Saúde Connect, incluindo dados antigos e de segundo plano.\n\nIsto não afeta outras autorizações que esta app possa ter, como o acesso à câmara, ao microfone ou à localização."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remover todas as autorizações?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler e escrever dados da Saúde Connect.\n\nIsto não afeta outras autorizações que esta app possa ter, como o acesso à câmara, ao microfone ou à localização."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler ou escrever dados da Saúde Connect, incluindo dados de segundo plano.\n\nIsto não afeta outras autorizações que esta app possa ter, como o acesso à câmara, ao microfone ou à localização."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler ou escrever dados da Saúde Connect, incluindo dados antigos.\n\nIsto não afeta outras autorizações que esta app possa ter, como o acesso à câmara, ao microfone ou à localização."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> vai deixar de poder ler ou escrever dados da Saúde Connect, incluindo dados antigos e de segundo plano.\n\nIsto não afeta outras autorizações que esta app possa ter, como o acesso à câmara, ao microfone ou à localização."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Eliminar também os dados de fitness e os registos de saúde da app <xliff:g id="APP_NAME">%1$s</xliff:g> da Saúde Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Autorizações removidas para esta app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Eliminar também todos os dados da Saúde Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Dia seguinte"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Dia selecionado"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Dia anterior"</string>
     <string name="default_error" msgid="7966868260616403475">"Algo correu mal. Tente novamente."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Recurso desconhecido"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Dados de origem"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Parêntese reto de abertura."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Parêntese reto de fecho."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Campo <xliff:g id="FIELD">%2$s</xliff:g> Valor"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Estas apps já não têm acesso, mas ainda têm dados armazenados na Saúde Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> pode ler os dados adicionados após <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Para gerir outras autorizações do Android às quais esta app pode aceder, aceda a Definições &gt; Apps"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Os dados que partilha com a app <xliff:g id="APP_NAME">%1$s</xliff:g> são abrangidos pela respetiva política de privacidade"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Pode saber como a app <xliff:g id="APP_NAME">%1$s</xliff:g> trata os seus dados na política de privacidade do programador"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Para gerir outras autorizações do Android às quais esta app pode aceder, aceda a Definições e, em seguida, toque em Apps"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Leia a política de privacidade"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Acesso nas últimas 24 horas"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Acesso de apps"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Atualmente, não tem nenhuma app compatível instalada"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Acesso adicional"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Dados anteriores, dados de segundo plano"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Autorizações adicionais removidas para esta app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Autorizações"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness e bem-estar"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercício, sono, nutrição e mais"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Registos de saúde"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"registos de saúde"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Result. lab., medic., imunizações, etc."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Result. laborat./medicamentos/vacinas, etc."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Autorizações de apps removidas"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"A Saúde Connect removeu autorizações para a app <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"A Saúde Connect removeu autorizações para as apps <xliff:g id="APP_DATA_0">%1$s</xliff:g> e <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Aceda à Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Comece a usar a Saúde Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"A Saúde Connect armazena os seus dados de saúde e fitness, oferecendo-lhe uma forma simples de sincronizar as diferentes apps no seu dispositivo"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"A Saúde Connect armazena e sincroniza os seus dados de saúde e fitness de diferentes apps.\n\n"<b>"Dados de fitness e bem-estar,"</b>" incluindo sessões de exercício, passos, nutrição, sono e muito mais\n\n"<b>"Registos de saúde,"</b>" incluindo vacinas, resultados laboratoriais e muito mais"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Com a Saúde Connect, pode"</string>
     <string name="share_data" msgid="3481932156368883946">"Partilhar dados com as suas apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Escolha os dados que cada app pode ler ou escrever na Saúde Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Gerir as definições e a privacidade"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Fluxo ligeiro"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Fluxo médio"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Fluxo intenso"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Fluxo desconhecido"</string>
     <string name="period_day" msgid="3821944462093965882">"Dia <xliff:g id="DAY">%1$d</xliff:g> de <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> do período"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Período (1 dia)}other{Período (# dias)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiva"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativa"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Elevada"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Música"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Outro"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Sem orientação"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderada"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intensa"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integração em curso"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"A Saúde Connect está a ser integrada com o sistema Android.\n\nPode demorar algum tempo enquanto os seus dados e autorizações estão a ser transferidos."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Não feche a app até receber uma notificação de que o processo está concluído."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integração da Saúde Connect em curso"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Atualização necessária"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"A Saúde Connect está a ser integrada com o sistema Android para que possa aceder a esta diretamente nas definições."</string>
     <string name="update_button" msgid="4544529019832009496">"Atualizar"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Inicie esta atualização para que a Saúde Connect possa continuar a integração com as definições do seu sistema"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Atualizar agora"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Atualização do sistema necessária"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Antes de continuar, atualize o sistema do seu telemóvel."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Se já atualizou o sistema do seu telemóvel, tente reiniciar o telemóvel para continuar a integração"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Atualização da Saúde Connect necessária"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Antes de continuar, atualize a app Saúde Connect para a versão mais recente."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Mais espaço necessário"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"A Saúde Connect precisa de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espaço de armazenamento no seu telemóvel para continuar a integração.\n\nLiberte algum espaço no seu telemóvel e, em seguida, tente novamente."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Tentar novamente"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Libertar espaço"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Mais espaço necessário"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"A Saúde Connect precisa de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espaço de armazenamento no seu telemóvel para continuar a integração."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integração pausada"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"A app Saúde Connect foi fechada enquanto estava a ser integrada com o sistema Android.\n\nClique em Retomar para reabrir a app e continuar a transferir os seus dados e autorizações."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Para manter os seus dados da Saúde Connect, conclua esta ação em <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Toque para continuar a integrar a Saúde Connect com o sistema Android. Para manter os seus dados, conclua esta ação em <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Toque para continuar a integrar a Saúde Connect com o sistema Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continuar"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Retome a integração da Saúde Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Para manter os seus dados, conclua esta ação em <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Atualização da app necessária"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"É necessário atualizar a app <xliff:g id="APP_NAME">%1$s</xliff:g> para continuar a sincronização com a Saúde Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"É necessário atualizar algumas apps para continuar a sincronização com a Saúde Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"É necessário atualizar a app <xliff:g id="APP_NAME">%1$s</xliff:g> para continuar a sincronização com a Saúde Connect. As atualizações podem não estar disponíveis para todas as apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"É necessário atualizar algumas apps para continuar a sincronização com a Saúde Connect. As atualizações podem não estar disponíveis para todas as apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Procurar atualizações"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Saber mais"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integração da Saúde Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"A integração da Saúde Connect não foi concluída"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Vai receber uma notificação quando estiver novamente disponível."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"A integração da Saúde Connect não foi concluída"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Ler mais"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integração da Saúde Connect concluída"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Abrir"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novidades"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Já pode aceder à Saúde Connect diretamente nas definições. Desinstale a app Saúde Connect em qualquer altura para libertar espaço de armazenamento."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Editar origens de apps"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Predefinição do dispositivo"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Dados de apps"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Os dados de apps com acesso à Saúde Connect são apresentados aqui"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Os dados da app <xliff:g id="APP_NAME">%1$s</xliff:g> são apresentados aqui"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Os dados de apps com acesso à Saúde Connect são apresentados aqui"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dia"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Semana"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mês"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Mês passado"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entradas"</string>
     <string name="tab_access" msgid="7818197975407243701">"Acesso"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Permitir o acesso adicional à app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> também quer aceder a estas definições da Saúde Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Ative, pelo menos, uma autorização de leitura para permitir o acesso a dados antigos ou de segundo plano para esta app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Ative, pelo menos, uma autorização de leitura para ativar o acesso em segundo plano para esta app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Ative, pelo menos, uma autorização de leitura para ativar o acesso a dados antigos para esta app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Comece a usar a Saúde Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sincronize as suas primeiras apps para partilhar os dados de saúde e fitness entre elas"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configurar"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Veja apps compatíveis"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Encontre mais apps para sincronizar com a app <xliff:g id="APP_NAME">%s</xliff:g> através da Saúde Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Ver na loja de apps"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Defina um bloqueio de ecrã"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Para uma segurança adicional para os seus dados de saúde, defina um PIN, um padrão ou uma palavra-passe para este dispositivo"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Definir bloqueio de ecrã"</string>
     <string name="select_all" msgid="837499881590001166">"Selecionar tudo"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"As apps associadas deixam de poder ler estes dados da Saúde Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Selecionada"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Não selecionada"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Rota no mapa do exercício disponível"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Dia seguinte"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Semana seguinte"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mês seguinte"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Dia anterior"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Semana anterior"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mês anterior"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Eliminar permanentemente todos os dados?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Eliminar permanentemente os dados selecionados?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Eliminar permanentemente todos os dados da app <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Eliminar permanentemente as entradas da app <xliff:g id="APP_NAME">%1$s</xliff:g> selecionadas da semana de <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Eliminar permanentemente as entradas da app <xliff:g id="APP_NAME">%1$s</xliff:g> selecionadas de <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Eliminar permanentemente esta entrada da app <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Eliminar permanentemente os dados de <xliff:g id="DATA_TYPE">%1$s</xliff:g> da app <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Ativado"</string>
+    <string name="off" msgid="6996623844428550649">"Desativado"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Último acesso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Acedido ontem à(s) <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Acedido a <xliff:g id="TIME_DATE_0">%1$s</xliff:g> à(s) <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Permitir sempre"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Permitir seleção"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Durante a utilização da app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Recusar tudo"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda a dados de fitness e bem-estar?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir acesso a <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nEscolha permitir tudo ou controlar cada autorização individualmente."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda a <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness e bem-estar"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sempre"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"durante a utilização"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sempre"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Durante a utilização"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> pode aceder a todos os seus dados de fitness e bem-estar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Com autorização para aceder"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Com autorização para ler"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Estas autorizações dão à app <xliff:g id="APP_NAME">%1$s</xliff:g> acesso aos dados dos sensores do seu dispositivo."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps autorizadas"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nenhuma app a pedir"</string>
+    <string name="allowed" msgid="4158456017482263737">"Autorizada"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Não autorizada"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"As apps com esta autorização podem aceder aos dados de <xliff:g id="DATA_TYPE">%s</xliff:g> dos sensores do seu dispositivo."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Remover o acesso aos dados de <xliff:g id="DATA_TYPE">%s</xliff:g> para todas as apps no relógio?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Marca de verificação"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Marca de cruz"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Atualmente, a app <xliff:g id="APP_NAME">%1$s</xliff:g> pode aceder a dados de fitness e bem-estar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Permitir que a app <xliff:g id="APP_NAME">%1$s</xliff:g> aceda sempre a dados de fitness e bem-estar?"</string>
+    <string name="current_access" msgid="1457167070428176139">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> tem acesso a dados de <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Gerir autorizações de fitness e bem-estar"</string>
 </resources>
diff --git a/apk/res/values-pt/strings.xml b/apk/res/values-pt/strings.xml
index 0a1e73e..5987080 100644
--- a/apk/res/values-pt/strings.xml
+++ b/apk/res/values-pt/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Gerencie os dados de saúde e condicionamento físico no seu dispositivo e controle quais apps podem ter acesso a eles"</string>
     <string name="data_title" msgid="4456619761533380816">"Dados e acesso"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Procurar histórico de saúde"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Veja seus históricos de saúde e quais apps podem acessá-los"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Todas as categorias"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Acessar todas as categorias"</string>
     <string name="no_data" msgid="1906986019249068659">"Não há dados"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Ontem"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Leitura: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Gravação: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Gerenciar permissões"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Horário: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Atividade"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"acesse seus dados de saúde"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Ler informações de calorias queimadas"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Permite que o app leia as calorias queimadas"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Acessar dados em segundo plano"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse dados em segundo plano?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse dados em segundo plano?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Se você autorizar, o app poderá acessar dados de condicionamento físico e bem-estar e históricos de saúde quando você não estiver usando o aplicativo."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Se você autorizar, o app poderá acessar históricos de saúde quando você não estiver usando o aplicativo."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Se você autorizar, o app poderá acessar dados de condicionamento físico e bem-estar quando você não estiver usando o aplicativo."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Se você autorizar, este app poderá acessar os dados da Conexão Saúde quando você não estiver usando o aplicativo."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse dados antigos?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Se você autorizar, o app poderá acessar dados de condicionamento físico e bem-estar adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Se você autorizar, o app poderá acessar todos os dados anteriores de condicionamento físico e bem-estar."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Se você autorizar, este app poderá acessar dados da Conexão Saúde adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Se você autorizar, este app poderá acessar todos os dados antigos da Conexão Saúde."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> tenha mais acesso?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> também quer acessar as configurações da Conexão Saúde"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Acessar todos os dados em segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Acessar históricos de saúde em segundo plano"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Acessar dados de condicionamento físico e bem-estar em segundo plano"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Permitir que o app acesse dados de condicionamento físico e bem-estar e históricos de saúde quando você não estiver usando o aplicativo"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Permitir que o app acesse os dados quando você não estiver usando o aplicativo"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Permitir que o app acesse os dados quando você não estiver usando o aplicativo"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Acessar dados em segundo plano"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Permitir que este app acesse os dados da Conexão Saúde quando você não estiver usando o aplicativo"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Acessar dados anteriores de condicionamento físico e bem-estar"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Permitir que o app acesse os dados adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Permitir que o app acesse todos os dados anteriores"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Acessar dados antigos"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Permitir que o app acesse os dados da Conexão Saúde adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Permitir que este app acesse todos os dados antigos da Conexão Saúde"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> já pode acessar dados anteriores dos seus históricos de saúde"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Leia mais sobre permissões"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Acessar todos os dados em segundo plano"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Acessar históricos de saúde em segundo plano"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Acessar dados de condicionamento físico e bem-estar em segundo plano"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Permitir que o app acesse dados de condicionamento físico e bem-estar e históricos de saúde quando você não estiver usando o aplicativo"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Permitir que o app acesse os dados quando você não estiver usando o aplicativo"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Permitir que o app acesse os dados quando você não estiver usando o aplicativo"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Acessar dados em segundo plano"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Permitir que este app acesse os dados da Conexão Saúde quando você não estiver usando o aplicativo"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Acessar dados anteriores de condicionamento físico e bem-estar"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Permitir que o app acesse os dados adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Permitir que o app acesse todos os dados anteriores"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Acessar dados antigos"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Permitir que o app acesse os dados da Conexão Saúde adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Permitir que este app acesse todos os dados anteriores da Conexão Saúde"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Nenhum dado de condicionamento físico está sendo lido, porque o app <xliff:g id="APP_NAME">%1$s</xliff:g> não tem permissões de leitura ativadas"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> já pode acessar dados anteriores dos seus históricos de saúde. Para mudar isso, desative as permissões de histórico de saúde para esse app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Gerenciar permissões: histórico de saúde"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Habilitar pelo menos uma permissão de leitura para ativar o acesso aos dados históricos ou em segundo plano desse app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Habilitar pelo menos uma permissão de leitura para ativar o acesso em segundo plano desse app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Habilitar pelo menos uma permissão de leitura para ativar o acesso aos dados históricos desse app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Permitir que este app acesse todos os dados antigos da Conexão Saúde"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Permitir que o app acesse os dados da Conexão Saúde quando você não estiver usando o aplicativo"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Se você autorizar, o app poderá acessar os dados da Conexão Saúde quando você não estiver usando o aplicativo."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Acessar dados antigos"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse dados antigos?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Permitir que o app acesse os dados da Conexão Saúde adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Permitir que este app acesse todos dados antigos da Conexão Saúde"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Se você autorizar, este app poderá acessar dados da Conexão Saúde adicionados antes de <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Se você autorizar, este app poderá acessar todos os dados antigos da Conexão Saúde."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calorias ativas queimadas"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"calorias ativas queimadas"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Ler informações de calorias ativas queimadas"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"impulsos na cadeira de rodas"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Ler informações de impulsos na cadeira de rodas"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Gravar impulsos na cadeira de rodas"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensidade da atividade"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensidade da atividade"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Ler intensidade da atividade"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Gravar intensidade da atividade"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Taxa metabólica basal"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"taxa metabólica basal"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Ler informações de taxa metabólica basal"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura da pele"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Ler temperatura da pele"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Gravar temperatura da pele"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Isso inclui todo o histórico de saúde sincronizado e adicionado ao app Conexão Saúde. Talvez esse não seja seu histórico médico completo, e ele não inclui uma descrição médica do seu histórico de saúde."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Todos os históricos de saúde"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"todos os históricos de saúde"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Gravar todos os históricos de saúde"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergias"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergias"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Ler dados sobre alergias"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunização"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunização"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Ler dados de imunização"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Resultados de laboratório"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"resultados de laboratório"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Ler resultados de laboratório"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergias"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergias"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Ler dados sobre alergias"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Condições"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"condições"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Ler condições"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vacinas"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vacinas"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Ler dados de vacinas"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Resultados de laboratório"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"resultados de laboratório"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Ler resultados de laboratório"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Medicamentos"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"dados de medicamentos"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Ler dados de medicamentos"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Dados pessoais"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"dados pessoais"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Ler dados pessoais"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Detalhes do profissional de saúde"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"detalhes do profissional de saúde"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Ler detalhes do profissional de saúde"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Gravidez"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"gravidez"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Ler dados de gravidez"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemas"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemas"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Ler dados de problemas"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedimentos"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedimentos"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Ler dados de procedimentos"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"História de redes sociais"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Histórico de redes sociais"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"histórico de redes sociais"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Ler histórico de redes sociais"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Sinais vitais"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Visitas"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"visitas"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Ler visitas"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Sinais vitais"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"sinais vitais"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Ler sinais vitais"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Gravar dados de mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Permitir a leitura pelo app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Permitir gravação pelo app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Cancelar"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Permitir"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Permitir tudo"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Não permitir"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Escolha dados que você quer que esse app acesse ou grave na plataforma Conexão Saúde"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Escolha dados que você quer que esse app acesse ou grave na Conexão Saúde"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Escolha dados que você quer que esse app leia na Conexão Saúde"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Escolha dados que você quer que esse app grave na Conexão Saúde"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Se o app tiver permissão de leitura, ele poderá acessar dados novos e dos últimos 30 dias"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Se o app tiver permissão de leitura, ele poderá acessar dados novos e antigos"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse a plataforma Conexão Saúde?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Descubra como o <xliff:g id="APP_NAME">%1$s</xliff:g> processa seus dados na <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> do desenvolvedor"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse dados de condicionamento físico e bem-estar?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Leia a <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> do app <xliff:g id="APP_NAME">%1$s</xliff:g> para saber como ele trata seus dados"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"política de privacidade"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse seus históricos de saúde?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Se você conceder acesso, o app poderá ler e gravar dados, como alergias, resultados de laboratório, vacinas e muito mais\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Se você conceder acesso, o app poderá ler dados, como alergias, resultados de laboratório, vacinas e muito mais\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Sobre os históricos de saúde"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Os dados a serem compartilhados incluem"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Se você permitir, o app <xliff:g id="APP_NAME">%1$s</xliff:g> poderá compartilhar seus históricos de saúde com a Conexão Saúde."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sincronize seus históricos de saúde de diferentes apps e fontes para que eles fiquem em um só lugar"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Remover todas as permissões?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Remover tudo"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar dados da plataforma Conexão Saúde.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não vai mais poder ler nem gravar dados da plataforma Conexão Saúde, incluindo dados históricos.\n\nIsso não afeta outras permissões que esse app possa ter, como de localização, câmera ou microfone."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar dados da plataforma Conexão Saúde, incluindo dados históricos e em segundo plano.\n\nIsso não afeta outras permissões que esse app possa ter, como de localização, câmera ou microfone."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Também excluir dados do app <xliff:g id="APP_NAME">%1$s</xliff:g> da plataforma Conexão Saúde"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remover todas as permissões?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remover todas as permissões de histórico de saúde?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Remover permissões de condicionamento físico e bem-estar?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Também excluir da Conexão Saúde os dados de condicionamento físico do app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Remover todas as permissões de histórico de saúde?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Também excluir da Conexão Saúde os históricos de saúde do app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar esses dados da Conexão Saúde.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar esses dados da Conexão Saúde, incluindo dados em segundo plano.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar esses dados da Conexão Saúde, incluindo dados históricos.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar esses dados da Conexão Saúde, incluindo dados históricos e em segundo plano.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Remover todas as permissões?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar dados da Conexão Saúde.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar dados da Conexão Saúde, incluindo dados em segundo plano.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar dados da Conexão Saúde, incluindo dados históricos.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não poderá mais ler nem gravar dados da Conexão Saúde, incluindo dados históricos e em segundo plano.\n\nIsso não afeta outras permissões que esse app possa ter, como de câmera, microfone ou localização."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Também excluir da Conexão Saúde os dados de condicionamento físico e os históricos de saúde do app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Permissões removidas do app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Também excluir todos os dados da plataforma Conexão Saúde"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Dia seguinte"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Dia selecionado"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Dia anterior"</string>
     <string name="default_error" msgid="7966868260616403475">"Ocorreu um erro. Tente de novo."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Recurso desconhecido"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Origem dos dados"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Colchete aberto."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Colchete fechado."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Valor do campo <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Estes apps não têm mais acesso, mas ainda possuem dados armazenados na plataforma Conexão Saúde"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> pode ler dados adicionados após <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Para gerenciar outras permissões do Android que esse app pode acessar, vá até \"Configurações &gt; Apps\""</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Os dados compartilhados com <xliff:g id="APP_NAME">%1$s</xliff:g> estão cobertos pela Política de Privacidade desse app."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Veja na Política de Privacidade do desenvolvedor como o app <xliff:g id="APP_NAME">%1$s</xliff:g> processa seus dados"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Para gerenciar outras permissões do Android que esse app pode acessar, vá até \"Configurações\" e toque em \"Apps\""</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Leia a Política de Privacidade"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Acessado nas últimas 24 horas"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Acesso de apps"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Não há apps compatíveis instalados no momento"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Acesso adicional"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Dados anteriores, dados em segundo plano"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Outras permissões foram removidas desse app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permissões"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Condicionamento físico e bem-estar"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exercício, sono, nutrição e outros"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Históricos de saúde"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"históricos de saúde"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Result. de lab., remédios, vacinas, etc."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Resultados de laboratório, remédios, vacinas etc."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Permissões de apps removidas"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"A plataforma Conexão Saúde removeu as permissões do app <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"A plataforma Conexão Saúde removeu as permissões dos apps <xliff:g id="APP_DATA_0">%1$s</xliff:g> e <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Acessar a Google Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Comece a usar o app Conexão Saúde"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"O app Conexão Saúde armazena seus dados de saúde e condicionamento físico, oferecendo uma maneira simples de sincronizar os diferentes apps no dispositivo"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"A plataforma Conexão Saúde armazena e sincroniza seus dados de saúde e condicionamento físico de diferentes apps.\n\n"<b>"Dados de condicionamento físico e bem-estar,"</b>" incluindo sessões de exercícios, passos, nutrição, sono e muito mais\n\n"<b>"Históricos de saúde,"</b>" incluindo vacinas, resultados de laboratório e muito mais"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Com o app Conexão Saúde, é possível:"</string>
     <string name="share_data" msgid="3481932156368883946">"Compartilhar dados com seus apps"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Escolha os dados que cada app pode ler ou gravar na plataforma Conexão Saúde"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Gerenciar suas configurações e privacidade"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Fluxo leve"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Fluxo moderado"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Fluxo intenso"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Fluxo desconhecido"</string>
     <string name="period_day" msgid="3821944462093965882">"Dia <xliff:g id="DAY">%1$d</xliff:g> de <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> da menstruação"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruação (1 dia)}one{Menstruação (# dia)}other{Menstruação (# dias)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positivo"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativo"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Alta"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Música"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Outro"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Não guiada"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderada"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intensa"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>h<xliff:g id="MIN">%2$s</xliff:g>min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integração em andamento"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"O app Conexão Saúde está sendo integrado ao sistema Android.\n\nA transferência de dados e permissões pode demorar um pouco."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Não feche o app até receber uma notificação informando que o processo foi concluído."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integração do app Conexão Saúde em andamento"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Atualização necessária"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"O app Conexão Saúde está sendo integrado ao sistema Android para você conseguir acessá-lo diretamente nas configurações."</string>
     <string name="update_button" msgid="4544529019832009496">"Atualizar"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Inicie esta atualização para que o app Conexão Saúde continue a integração com as configurações do sistema"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Atualizar agora"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Atualização do sistema necessária"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Atualize o sistema do smartphone antes de continuar."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Se você já atualizou o sistema, tente reiniciar o smartphone para continuar a integração"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Atualização necessária no app Conexão Saúde"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Atualize o app Conexão Saúde para a versão mais recente antes de continuar."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Espaço insuficiente"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"O app Conexão Saúde precisa de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espaço de armazenamento no smartphone para continuar a integração.\n\nLibere espaço no smartphone e tente outra vez."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Tentar de novo"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Liberar espaço"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Espaço insuficiente"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"O app Conexão Saúde precisa de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de espaço de armazenamento no smartphone para continuar a integração."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integração pausada"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"O app Conexão Saúde foi fechado durante a integração com o sistema Android.\n\nClique em \"retomar\" para abrir novamente e continuar a transferência de dados e permissões."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Para manter os dados do app Conexão Saúde, conclua em <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Toque para continuar a integração do app Conexão Saúde ao sistema Android. Para manter seus dados, conclua em <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Toque para continuar integrando o app Conexão Saúde ao sistema Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continuar"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Retomar a integração do app Conexão Saúde"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Para manter seus dados, conclua em <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Atualização do app necessária"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> precisa ser atualizado para continuar a sincronização com a Conexão Saúde"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Alguns apps precisam ser atualizados para continuar a sincronização com a Conexão Saúde"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> precisa ser atualizado para continuar a sincronização com a Conexão Saúde. As atualizações podem não estar disponíveis para todos os apps."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Alguns apps precisam ser atualizados para continuar a sincronização com a Conexão Saúde. As atualizações podem não estar disponíveis para todos os apps."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Verificar se há atualizações"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Saiba mais"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integração do app Conexão Saúde"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"A integração do app Conexão Saúde não foi concluída"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Você vai receber uma notificação quando ela estiver disponível novamente."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Entendi"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"A integração do app Conexão Saúde não foi concluída"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Leia mais"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integração do app Conexão Saúde concluída"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Abrir"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novidades"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Já é possível acessar o app Conexão Saúde diretamente nas configurações. Desinstale quando quiser para liberar espaço de armazenamento."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Entendi"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Editar fontes de apps"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Padrão do dispositivo"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Dados do app"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Os dados de apps com acesso à Conexão Saúde vão aparecer aqui"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Os dados do app <xliff:g id="APP_NAME">%1$s</xliff:g> vão aparecer aqui"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Os dados de apps com acesso à Conexão Saúde vão aparecer aqui"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dia"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Semana"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mês"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Mês passado"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Entradas"</string>
     <string name="tab_access" msgid="7818197975407243701">"Acesso"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> tenha mais acesso?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> também quer acessar as configurações da Conexão Saúde"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Habilitar pelo menos uma permissão de leitura para ativar o acesso aos dados históricos ou em segundo plano desse app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Habilitar pelo menos uma permissão de leitura para ativar o acesso em segundo plano desse app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Habilitar pelo menos uma permissão de leitura para ativar o acesso aos dados históricos desse app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Comece a usar a Conexão Saúde"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sincronize seus primeiros apps para compartilhar dados de saúde e condicionamento físico entre eles"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configurar"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Ver apps compatíveis"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Encontrar mais apps para sincronizar com <xliff:g id="APP_NAME">%s</xliff:g> usando a Conexão Saúde"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Ver na app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Defina um bloqueio de tela"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Para aumentar a segurança dos seus dados de saúde, defina um PIN, padrão ou senha para este dispositivo"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Definir bloqueio de tela"</string>
     <string name="select_all" msgid="837499881590001166">"Selecionar tudo"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Os apps conectados não poderão mais ler esses dados da plataforma Conexão Saúde"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Marcada"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Desmarcada"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Trajeto do mapa de exercícios disponível"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Dia seguinte"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Semana seguinte"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mês seguinte"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Dia anterior"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Semana anterior"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mês anterior"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Excluir permanentemente todos os dados?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Excluir permanentemente os dados selecionados?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Excluir permanentemente todos os dados do app <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Excluir permanentemente as entradas selecionadas do app <xliff:g id="APP_NAME">%1$s</xliff:g> na semana dos dias <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Excluir permanentemente as entradas selecionadas do app <xliff:g id="APP_NAME">%1$s</xliff:g> em <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Excluir permanentemente esta entrada do app <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Excluir permanentemente os dados de <xliff:g id="DATA_TYPE">%1$s</xliff:g> no app <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Ativado"</string>
+    <string name="off" msgid="6996623844428550649">"Desativado"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Último acesso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Último acesso: ontem, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Último acesso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Permitir o tempo todo"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Permitir seleção"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Durante o uso do app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Negar tudo"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse dados de condicionamento físico e bem-estar?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando acesso a dados de <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nVocê pode permitir o acesso a todos ou controlar individualmente."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse dados de <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Condicionamento físico e bem-estar"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"o tempo todo"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"durante o uso"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"O tempo todo"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Durante o uso"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> pode acessar todos os seus dados de condicionamento físico e bem-estar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Com permissão de acesso"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Com permissão de leitura"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Essas permissões dão ao app <xliff:g id="APP_NAME">%1$s</xliff:g> acesso aos dados dos sensores do dispositivo."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> apps permitidos"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nenhum app solicitando"</string>
+    <string name="allowed" msgid="4158456017482263737">"Permitido"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Não permitido"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Apps com essa permissão podem acessar dados de <xliff:g id="DATA_TYPE">%s</xliff:g> dos sensores do dispositivo."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Remover o acesso aos dados de <xliff:g id="DATA_TYPE">%s</xliff:g> para todos os apps no seu relógio?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Marca de seleção"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Sinal de X"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"No momento, o app <xliff:g id="APP_NAME">%1$s</xliff:g> pode acessar dados de condicionamento físico e bem-estar <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Permitir que o app <xliff:g id="APP_NAME">%1$s</xliff:g> acesse dados de condicionamento físico e bem-estar o tempo todo?"</string>
+    <string name="current_access" msgid="1457167070428176139">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> tem acesso aos dados de <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Gerenciar permissões de condicionamento físico e bem-estar"</string>
 </resources>
diff --git a/apk/res/values-ro/strings.xml b/apk/res/values-ro/strings.xml
index 066e5ea..d6f5927 100644
--- a/apk/res/values-ro/strings.xml
+++ b/apk/res/values-ro/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Gestionează datele despre sănătate și fitness de pe dispozitiv și alege aplicațiile care le pot accesa"</string>
     <string name="data_title" msgid="4456619761533380816">"Date și acces"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Răsfoiește datele medicale"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Vezi datele medicale și ce aplicații le pot accesa"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Toate categoriile"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Vezi toate categoriile"</string>
     <string name="no_data" msgid="1906986019249068659">"Fără date"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Ieri"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Citire: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Scriere: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Gestionează permisiunile"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Oră: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Activitate"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"să-ți acceseze datele despre sănătate"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Să citească numărul de calorii arse"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Permite aplicației să citească numărul de calorii arse"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Să acceseze datele din fundal"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Permiți ca <xliff:g id="APP_NAME">%1$s</xliff:g> să acceseze datele din fundal?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Permiți ca <xliff:g id="APP_NAME">%1$s</xliff:g> să acceseze datele din fundal?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Dacă acorzi permisiunea, aplicația poate să acceseze datele despre fitness și wellness și datele medicale atunci când nu o folosești."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Dacă acorzi permisiunea, aplicația poate să acceseze datele medicale atunci când nu o folosești."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Dacă acorzi permisiunea, aplicația poate să acceseze datele despre fitness și wellness atunci când nu o folosești."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Dacă acorzi permisiunea, aplicația poate să acceseze datele Health Connect atunci când nu o folosești."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Permiți accesul <xliff:g id="APP_NAME">%1$s</xliff:g> la datele anterioare?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Dacă acorzi permisiunea, aplicația poate să acceseze datele despre fitness și wellness adăugate până pe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Dacă acorzi permisiunea, aplicația poate să acceseze toate datele anterioare despre fitness și wellness."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Dacă acorzi permisiunea, aplicația poate să acceseze datele Health Connect adăugate până pe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Dacă acorzi permisiunea, aplicația poate să acceseze toate datele Health Connect anterioare."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Permiți accesul suplimentar pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită și permisiunea de a accesa aceste setări Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Să acceseze toate datele din fundal"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Să acceseze datele medicale din fundal"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Să acceseze datele despre fitness și wellness din fundal"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Permite accesul aplicației la datele despre fitness și wellness și la datele medicale atunci când nu o folosești"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Permite accesul aplicației la aceste date atunci când nu o folosești"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Permite accesul aplicației la aceste date atunci când nu o folosești"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Accesează datele din fundal"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Permite accesul aplicației la datele Health Connect atunci când nu o folosești"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Să acceseze datele anterioare despre fitness și wellness"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Permite accesul aplicației la datele adăugate până pe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Permite accesul aplicației la toate datele anterioare"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Să acceseze datele anterioare"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Permite accesul aplicației la datele Health Connect adăugate până pe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Permite accesul aplicației la toate datele Health Connect anterioare"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> poate deja să acceseze datele anterioare din evidențele medicale"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Citește mai multe despre permisiuni"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Să acceseze toate datele din fundal"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Să acceseze datele medicale din fundal"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Să acceseze datele despre fitness și wellness din fundal"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Permite accesul aplicației la datele despre fitness și wellness și la datele medicale atunci când nu o folosești"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Permite accesul aplicației la aceste date atunci când nu o folosești"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Permite accesul aplicației la aceste date atunci când nu o folosești"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Accesează datele din fundal"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Permite accesul aplicației la datele Health Connect atunci când nu o folosești"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Să acceseze datele anterioare despre fitness și wellness"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Permite accesul aplicației la datele adăugate până pe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Permite accesul aplicației la toate datele anterioare"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Să acceseze datele anterioare"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Permite accesul aplicației la datele Health Connect adăugate până pe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Permite accesul aplicației la toate datele Health Connect anterioare"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Momentan nu se citesc date despre fitness deoarece <xliff:g id="APP_NAME">%1$s</xliff:g> nu are permisiuni de citire activate"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> poate deja să acceseze datele anterioare din evidențele medicale. Pentru a modifica această opțiune, dezactivează permisiunile pentru date medicale ale acestei aplicații."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Gestionează permisiunile pentru date medicale"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Activează cel puțin o permisiune de citire ca să activezi accesul la fundal sau la datele anterioare pentru această aplicație"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Activează cel puțin o permisiune de citire ca să activezi accesul la fundal pentru această aplicație"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Activează cel puțin o permisiune de citire ca să activezi accesul la datele anterioare pentru această aplicație"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Permite accesul aplicației la toate datele Health Connect anterioare"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Permite accesul aplicației la datele Health Connect atunci când nu o folosești"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Dacă acorzi permisiunea, aplicația poate să acceseze datele Health Connect atunci când nu o folosești."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Să acceseze datele anterioare"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Permiți accesul <xliff:g id="APP_NAME">%1$s</xliff:g> la datele anterioare?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Permite accesul aplicației la datele Health Connect adăugate până pe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Permite accesul aplicației la toate datele Health Connect anterioare"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Dacă acorzi permisiunea, aplicația poate să acceseze datele Health Connect adăugate până pe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Dacă acorzi permisiunea, aplicația poate să acceseze toate datele Health Connect anterioare."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Calorii active arse"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"calorii active arse"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Să citească date despre caloriile active arse"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"împingerile scaunului cu rotile"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Să citească împingerile scaunului cu rotile"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Să scrie împingerile scaunului cu rotile"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensitatea activității"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensitatea activității"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Să citească date despre intensitatea activității"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Să scrie date despre intensitatea activității"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Rata metabolismului bazal"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"rata metabolismului bazal"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Să citească rata metabolismului bazal"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura pielii"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Citește temperatura pielii"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Scrie temperatura pielii"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Aceasta include toate datele medicale sincronizate și adăugate în Health Connect. Este posibil ca acestea să nu reprezinte evidența ta medicală completă și să nu includă o descriere a datelor medicale."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Toate datele medicale"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"toate datele medicale"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Scrie toate datele medicale"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergii"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergii"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Citește datele despre alergii"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunizarea"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunizarea"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Citește imunizarea"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Rezultatele analizelor"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"rezultatele analizelor"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Să citească rezultatele analizelor"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergii"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergii"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Citește datele despre alergii"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Condiții"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"condiții"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Să citească condițiile"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaccinuri"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaccinuri"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Citește datele despre vaccinuri"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Rezultatele analizelor"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"rezultatele analizelor"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Citește rezultatele analizelor"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Tratamente medicamentoase"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"tratamente medicamentoase"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Să citească medicamentele"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Date cu caracter personal"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"date cu caracter personal"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Să citească datele cu caracter personal"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Detalii despre practicieni"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"detalii despre practicieni"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Să citească detaliile despre practicieni"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Date despre sarcină"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"date despre sarcină"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Să citească datele despre sarcină"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Date despre problemele medicale"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"date despre problemele medicale"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Să citească datele despre problemele medicale"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Date despre proceduri"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"date despre proceduri"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Să citească datele despre proceduri"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Istoricul rețelelor sociale"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Istoricul rețelelor sociale"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"istoricul rețelelor sociale"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Să citească istoricul rețelelor sociale"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Date despre semnele vitale"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Vizite"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"vizite"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Să citească vizitele"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Date despre semnele vitale"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"date despre semnele vitale"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Să citească datele despre semnele vitale"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Atenție susținută"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Scrie date despre atenția susținută"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Permite aplicației <xliff:g id="APP_NAME">%1$s</xliff:g> să citească"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Permite aplicației <xliff:g id="APP_NAME">%1$s</xliff:g> să scrie"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Anulează"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Permite"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Permite-le pe toate"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Nu permite"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Alege datele pe care dorești să le citească sau scrie această aplicație în Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Alege datele pe care dorești să le citească sau scrie această aplicație în Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Alege datele pe care dorești să le citească această aplicație în Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Alege datele pe care dorești să le scrie această aplicație în Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Dacă acorzi acces pentru citire, aplicația poate să citească date noi și date din ultimele 30 de zile"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Dacă acorzi acces pentru citire, aplicația poate să citească date noi și anterioare"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Permiți accesul <xliff:g id="APP_NAME">%1$s</xliff:g> la Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Află cum îți gestionează <xliff:g id="APP_NAME">%1$s</xliff:g> datele din <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> a dezvoltatorului"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Permiți accesul <xliff:g id="APP_NAME">%1$s</xliff:g> la datele despre fitness și wellness?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Află cum îți gestionează <xliff:g id="APP_NAME">%1$s</xliff:g> datele din <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"politica de confidențialitate"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Permiți ca <xliff:g id="APP_NAME">%1$s</xliff:g> să-ți acceseze datele medicale?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Dacă acorzi acces, aplicația poate să citească și să scrie date precum alergii, rezultate de laborator, vaccinuri și altele\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Dacă acorzi acces, aplicația poate să citească date precum alergii, rezultate de laborator, vaccinuri și altele\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Despre datele medicale"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Datele de trimis includ"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Dacă permiți, <xliff:g id="APP_NAME">%1$s</xliff:g> poate să-ți trimită datele medicale la Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sincronizează-ți datele medicale din diferite aplicații și surse pentru a le păstra într-un singur loc"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Elimini toate permisiunile?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Elimină-le pe toate"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie date din Health Connect.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru locație, camera foto sau microfon."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie date din Health Connect, inclusiv date anterioare.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru locație, camera foto sau microfon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie date din Health Connect, inclusiv date de fundal și date anterioare.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru locație, camera foto sau microfon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Șterge datele <xliff:g id="APP_NAME">%1$s</xliff:g> din Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Elimini toate permisiunile?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Elimini toate permisiunile pentru datele medicale?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Elimini toate permisiunile pentru fitness și starea de bine?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Șterge și datele despre fitness de la <xliff:g id="APP_NAME">%1$s</xliff:g> din Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Elimini toate permisiunile pentru datele medicale?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Șterge și datele medicale de la <xliff:g id="APP_NAME">%1$s</xliff:g> din Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie aceste date din Health Connect.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru camera foto, microfon sau locație."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie aceste date din Health Connect, inclusiv date de fundal.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru camera foto, microfon sau locație."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie aceste date din Health Connect, inclusiv date anterioare.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru camera foto, microfon sau locație."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie aceste date din Health Connect, inclusiv date de fundal și anterioare.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru camera foto, microfon sau locație."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Elimini toate permisiunile?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie date din Health Connect.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru camera foto, microfon sau locație."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie date din Health Connect, inclusiv date de fundal.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru camera foto, microfon sau locație."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie date din Health Connect, inclusiv date anterioare.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru camera foto, microfon sau locație."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu va mai putea să citească sau să scrie date din Health Connect, inclusiv date de fundal și anterioare.\n\nAcest lucru nu afectează celelalte permisiuni pe care le poate avea aplicația, cum ar fi cele pentru camera foto, microfon sau locație."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Șterge și datele despre fitness și datele medicale de la <xliff:g id="APP_NAME">%1$s</xliff:g> din Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"S-au eliminat permisiunile pentru această aplicație"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Șterge și toate datele Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Ziua următoare"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Ziua selectată"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Ziua anterioară"</string>
     <string name="default_error" msgid="7966868260616403475">"A apărut o eroare. Încearcă din nou."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Resursă necunoscută"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Date despre sursă"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Deschide paranteza."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Paranteză închisă."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Valoarea câmpului <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Aceste aplicații nu mai au acces, dar totuși au date stocate în Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> poate să citească date adăugate după <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Ca să gestionezi alte permisiuni pentru Android pe care le poate accesa aplicația, accesează Setări &gt; Aplicații"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Datele la care permiți accesul <xliff:g id="APP_NAME">%1$s</xliff:g> sunt acoperite de politica sa de confidențialitate"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Află cum îți gestionează <xliff:g id="APP_NAME">%1$s</xliff:g> datele din politica de confidențialitate a dezvoltatorului"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Ca să gestionezi alte permisiuni pentru Android pe care le poate accesa aplicația, accesează Setări, apoi atinge Aplicații"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Citește politica de confidențialitate"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Accesate în ultimele 24 de ore"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Accesul la aplicații"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Momentan, nu ai aplicații compatibile instalate"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Acces suplimentar"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Date anterioare, date de fundal"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"S-au eliminat permisiunile suplimentare pentru această aplicație"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Permisiuni"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness și wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Exerciții fizice, somn, nutriție etc."</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Date medicale"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"date medicale"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Rezultate lab., medicamente, imunizare"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Analize, medicamente, vaccinuri etc."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"S-au eliminat permisiunile pentru aplicație"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect a eliminat permisiunile pentru <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect a eliminat permisiunile pentru <xliff:g id="APP_DATA_0">%1$s</xliff:g> și <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Accesează Magazinul Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Noțiuni introductive despre Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect îți stochează datele despre sănătate și fitness, oferindu-ți o metodă simplă de a sincroniza aplicațiile diverse de pe dispozitiv"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect stochează și sincronizează datele despre sănătate și fitness din diferite aplicații.\n\n"<b>"Date despre fitness și wellness,"</b>" inclusiv sesiunile de exerciții, pașii, nutriția, somnul și altele\n\n"<b>"Înregistrări de sănătate,"</b>" inclusiv vaccinările, rezultatele analizelor și altele"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Cu Health Connect"</string>
     <string name="share_data" msgid="3481932156368883946">"Permite accesul aplicațiilor la date"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Alege datele pe care fiecare aplicație le poate citi sau scrie în Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Gestionează-ți setările și confidențialitatea"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Menstruație redusă"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Menstruație medie"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Menstruație abundentă"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Flux necunoscut"</string>
     <string name="period_day" msgid="3821944462093965882">"Ziua menstruației <xliff:g id="DAY">%1$d</xliff:g> din <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruație (o zi)}few{Menstruație (# zile)}other{Menstruație (# de zile)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitiv"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Fertilitate ridicată"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muzică"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Altele"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Fără ghidare"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Moderat"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intens"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrare în curs"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect se integrează cu sistemul Android.\n\nTransferul datelor și permisiunilor poate dura un timp."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Nu închide aplicația până când nu primești o notificare privind finalizarea procesului."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integrarea Health Connect este în curs"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Este necesară actualizarea"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Aplicația Health Connect se integrează cu sistemul Android ca să o poți accesa direct din setări."</string>
     <string name="update_button" msgid="4544529019832009496">"Actualizează"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Inițiază actualizarea pentru ca Health Connect să poată continua integrarea cu setările sistemului"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Actualizează acum"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Este necesară o actualizare de sistem"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Înainte de a continua, actualizează sistemul telefonului."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Dacă ai actualizat deja sistemul telefonului, repornește telefonul pentru a continua integrarea"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Este necesară actualizarea Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Înainte de a continua, actualizează aplicația Health Connect la cea mai recentă versiune."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Este necesar mai mult spațiu"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect are nevoie de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de spațiu de stocare pe telefon pentru a continua integrarea.\n\nEliberează spațiu pe telefon, apoi încearcă din nou."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Încearcă din nou"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Eliberează spațiu"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Este necesar mai mult spațiu"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect are nevoie de <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> de spațiu de stocare pe telefon pentru a continua integrarea."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrarea s-a întrerupt"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplicația Health Connect s-a închis în timpul integrării cu sistemul Android.\n\nDă clic pe Reia pentru a redeschide aplicația și a continua transferul datelor și permisiunilor."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Pentru a păstra datele Health Connect, finalizează procesul în cel mult <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Atinge pentru a continua integrarea Health Connect cu sistemul Android. Pentru a păstra datele, finalizează procesul în cel mult <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Atinge pentru a continua integrarea Health Connect cu sistemul Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Continuă"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Reia integrarea Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Pentru a păstra datele, finalizează procesul în cel mult <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Este necesară actualizarea aplicației"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> trebuie să se actualizeze pentru a continua sincronizarea cu Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Unele aplicații trebuie să se actualizeze pentru a continua sincronizarea cu Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> trebuie să se actualizeze pentru a continua sincronizarea cu Health Connect. Actualizările pot să nu fie disponibile pentru toate aplicațiile."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Unele aplicații trebuie să se actualizeze pentru a continua sincronizarea cu Health Connect. Actualizările pot să nu fie disponibile pentru toate aplicațiile."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Caută actualizări"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Află mai multe"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integrarea Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integrarea Health Connect nu s-a finalizat"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Vei primi o notificare când integrarea devine din nou disponibilă."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integrarea Health Connect nu s-a finalizat"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Citește mai mult"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integrarea Health Connect s-a finalizat"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Deschide"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Noutăți"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Acum poți accesa Health Connect direct din setări. Poți să dezinstalezi aplicația Health Connect oricând pentru a elibera spațiu de stocare."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Editează sursele de aplicații"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Prestabilită pentru dispozitiv"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Datele aplicației"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Datele din aplicațiile cu acces la Health Connect se vor afișa aici"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Datele din <xliff:g id="APP_NAME">%1$s</xliff:g> vor apărea aici"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Datele din aplicațiile cu acces la Health Connect se vor afișa aici"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Zi"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Săptămână"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Lună"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Luna trecută"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Intrări"</string>
     <string name="tab_access" msgid="7818197975407243701">"Acces"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Permiți accesul suplimentar pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită și permisiunea de a accesa aceste setări Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Activează cel puțin o permisiune de citire ca să activezi accesul la fundal sau la datele anterioare pentru această aplicație"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Activează cel puțin o permisiune de citire ca să activezi accesul la fundal pentru această aplicație"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Activează cel puțin o permisiune de citire ca să activezi accesul la datele anterioare pentru această aplicație"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Începe să folosești Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sincronizează primele aplicații pentru a trimite date despre sănătate și fitness între ele"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Configurează"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Vezi aplicațiile compatibile"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Găsește mai multe aplicații de sincronizat cu <xliff:g id="APP_NAME">%s</xliff:g> prin Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Vezi în magazinul de aplicații"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Setează o blocare a ecranului"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Pentru mai multă securitate pentru datele de sănătate, setează un PIN, un model sau o parolă pentru acest dispozitiv"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Setează blocarea ecranului"</string>
     <string name="select_all" msgid="837499881590001166">"Selectează tot"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Aplicațiile conectate nu vor mai putea să acceseze aceste date din Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Bifată"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nebifată"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Este disponibilă harta traseului pentru exerciții"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Ziua următoare"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Săptămâna viitoare"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Luna viitoare"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Ziua anterioară"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Săptămâna trecută"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Luna trecută"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Ștergi definitiv toate datele?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Ștergi definitiv datele selectate?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Ștergi definitiv toate datele <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Ștergi definitiv <xliff:g id="APP_NAME">%1$s</xliff:g> intrări selectate pentru săptămâna <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Ștergi definitiv <xliff:g id="APP_NAME">%1$s</xliff:g> intrări selectate pentru <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Ștergi definitiv intrarea din <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Ștergi definitiv datele despre <xliff:g id="DATA_TYPE">%1$s</xliff:g> pentru <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Activat"</string>
+    <string name="off" msgid="6996623844428550649">"Dezactivat"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Data ultimei accesări: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Data accesării: ieri, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Data accesării: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Permite întotdeauna"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Permite selecțiile"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"În timpul folosirii aplicației"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Refuză-le pe toate"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Permiți accesul <xliff:g id="APP_NAME">%1$s</xliff:g> la datele despre fitness și wellness?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită acces la <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nAlege să acorzi toate permisiunile sau să le gestionezi individual."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Permiți ca <xliff:g id="APP_NAME">%1$s</xliff:g> să acceseze <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness și wellness"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"tot timpul"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"în timpul folosirii"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Tot timpul"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"În timpul folosirii"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> poate să acceseze toate datele tale despre fitness și wellness <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Poate accesa"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Poate citi"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Aceste permisiuni oferă acces <xliff:g id="APP_NAME">%1$s</xliff:g> la datele de la senzorii dispozitivului."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> din <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> aplicație(i) au această permisiune"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nicio aplicație care solicită"</string>
+    <string name="allowed" msgid="4158456017482263737">"Permisă"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nepermisă"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplicațiile cu această permisiune pot accesa datele <xliff:g id="DATA_TYPE">%s</xliff:g> de la senzorii dispozitivului."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Elimini accesul <xliff:g id="DATA_TYPE">%s</xliff:g> pentru toate aplicațiile de pe ceas?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Bifă"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Semn x"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Momentan, <xliff:g id="APP_NAME">%1$s</xliff:g> poate să acceseze datele despre fitness și wellness <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Permiți accesul <xliff:g id="APP_NAME">%1$s</xliff:g> la datele despre fitness și wellness tot timpul?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> are acces la <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Gestionează permisiunile pentru fitness și starea de bine"</string>
 </resources>
diff --git a/apk/res/values-ru/strings.xml b/apk/res/values-ru/strings.xml
index f3c5987..5194138 100644
--- a/apk/res/values-ru/strings.xml
+++ b/apk/res/values-ru/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Управляйте данными о физической активности и здоровье с устройства и контролируйте доступ приложений к этой информации."</string>
     <string name="data_title" msgid="4456619761533380816">"Данные и доступ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Просмотреть информацию о здоровье"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Информация о здоровье и приложения, имеющие к ней доступ"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Все категории"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Показать все категории"</string>
     <string name="no_data" msgid="1906986019249068659">"Нет данных"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Вчера"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Чтение: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Запись: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Настроить разрешения"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Время: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Активность"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"доступ к вашим данным о здоровье"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Чтение данных о калориях"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Приложение сможет считывать данные о количестве сожженных калорий."</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Доступ к данным в фоновом режиме"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Разрешить приложению <xliff:g id="APP_NAME">%1$s</xliff:g> доступ к данным в фоновом режиме?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Открыть приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к данным в фоновом режиме?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Если вы предоставите разрешение, данные о здоровье, самочувствии и физической активности будут доступны приложению, когда вы им не пользуетесь."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Если вы предоставите разрешение, данные о здоровье будут доступны приложению, когда вы им не пользуетесь."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Если вы предоставите разрешение, данные о физической активности и самочувствии будут доступны приложению, когда вы им не пользуетесь."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Если вы предоставите разрешение, данные платформы \"Здоровье и спорт\" будут доступны приложению, когда вы им не пользуетесь."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Открыть приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к сохраненным ранее данным?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Если вы предоставите разрешение, приложению будут доступны данные о физической активности и самочувствии, добавленные до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Если вы предоставите разрешение, приложению будут доступны все сохраненные ранее данные о физической активности и самочувствии."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Если вы предоставите разрешение, приложению будут доступны данные платформы \"Здоровье и спорт\", добавленные до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Если вы предоставите разрешение, приложению будут доступны все сохраненные ранее данные платформы \"Здоровье и спорт\"."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Открыть приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" расширенный доступ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" также запрашивает доступ к настройкам платформы \"Здоровье и спорт\", указанным ниже."</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Доступ ко всем данным в фоновом режиме"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Доступ к данным о здоровье в фоновом режиме"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Доступ к данным о физической активности и самочувствии в фоновом режиме"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Данные о здоровье, самочувствии и физической активности будут доступны приложению, когда вы им не пользуетесь"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Эти данные будут доступны приложению, когда вы им не пользуетесь"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Эти данные будут доступны приложению, когда вы им не пользуетесь"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Доступ к данным в фоновом режиме"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Данные платформы \"Здоровье и спорт\" будут доступны приложению, когда вы им не пользуетесь"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Доступ к сохраненным ранее данным о самочувствии и физической активности"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Приложению будут доступны данные, добавленные до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Приложению будут доступны все сохраненные ранее данные"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Доступ к сохраненным ранее данным"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Приложению будут доступны данные платформы \"Здоровье и спорт\", добавленные до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Приложению будут доступны все сохраненные ранее данные платформы \"Здоровье и спорт\""</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"У приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" уже есть доступ к сохраненным ранее данным о здоровье."</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Подробнее о разрешениях…"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Доступ ко всем данным в фоновом режиме"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Доступ к данным о здоровье в фоновом режиме"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Доступ к данным о физической активности и самочувствии в фоновом режиме"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Данные о здоровье, самочувствии и физической активности будут доступны приложению, когда вы им не пользуетесь"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Эти данные будут доступны приложению, когда вы им не пользуетесь"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Эти данные будут доступны приложению, когда вы им не пользуетесь"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Доступ к данным в фоновом режиме"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Данные платформы \"Здоровье и спорт\" будут доступны приложению, когда вы им не пользуетесь"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Доступ к сохраненным ранее данным о самочувствии и физической активности"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Приложению будут доступны данные, добавленные до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Приложению будут доступны все сохраненные ранее данные"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Доступ к сохраненным ранее данным"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Приложению будут доступны данные платформы \"Здоровье и спорт\", добавленные до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Приложению будут доступны все сохраненные ранее данные платформы \"Здоровье и спорт\""</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" не считывает данные о физической активности, так как у него нет необходимых разрешений."</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"У приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" уже есть доступ к сохраненной ранее информации о здоровье. Вы можете это изменить, отозвав разрешение."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Настроить доступ к информации о здоровье"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Чтобы открыть приложению доступ в фоновом режиме или доступ к сохраненным данным, предоставьте хотя бы одно разрешение на чтение."</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Чтобы открыть приложению доступ в фоновом режиме, предоставьте хотя бы одно разрешение на чтение."</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Чтобы открыть приложению доступ к сохраненным данным, предоставьте хотя бы одно разрешение на чтение."</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Приложению будут доступны все сохраненные ранее данные платформы \"Здоровье и спорт\""</string>
     <string name="background_read_description" msgid="3203594555849969283">"Разрешить этому приложению доступ к данным платформы \"Здоровье и спорт\", когда вы им не пользуетесь"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Приложению будут доступны данные платформы \"Здоровье и спорт\", когда вы им не пользуетесь."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Доступ к сохраненным данным"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Разрешить приложению <xliff:g id="APP_NAME">%1$s</xliff:g> доступ к сохраненным данным?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Разрешить этому приложению доступ к данным Здоровья и спорта, добавленным до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Разрешить этому приложению доступ ко всем сохраненным данным платформы \"Здоровье и спорт\""</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Приложению будут доступны данные платформы \"Здоровье и спорт\", добавленные до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Приложению будут доступны все сохраненные данные платформы \"Здоровье и спорт\"."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Сожжено калорий во время активности"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"сожжено калорий во время активности"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Чтение данных о количестве сожженных калорий во время активности"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"толчки коляски"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Чтение количества толчков коляски"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Запись количества толчков коляски"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Интенсивность занятий"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"интенсивность занятий"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Чтение данных об интенсивности занятий"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Запись данных об интенсивности занятий"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Интенсивность основного обмена"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"интенсивность основного обмена"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Чтение данных об интенсивности основного обмена"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"температура кожи"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Доступ к данным о температуре кожи"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Запись данных о температуре кожи"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"В том числе информация о здоровье, связанная и синхронизированная с платформой \"Здоровье и спорт\". Эта информация может не включать данные вашей медицинской карты и заключения специалистов."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Все данные о здоровье"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"все данные о здоровье"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Запись всех данных о здоровье"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Аллергия"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"аллергия"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Чтение данных об аллергии"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Вакцинация"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"вакцинация"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Просмотр данных о вакцинации"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Результаты лабораторных исследований"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"результаты лабораторных исследований"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Чтение результатов лабораторных исследований"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Аллергия"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"аллергия"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Чтение данных об аллергии"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Заболевания"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"заболевания"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Чтение данных о заболеваниях"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Вакцинация"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"вакцинация"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Чтение данных о вакцинации"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Результаты анализов"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"результаты анализов"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Чтение результатов анализов"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Медикаменты"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"медикаменты"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Чтение данных о медикаментах"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Личные данные"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"личные данные"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Чтение личных данных"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Информация о специалистах"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"информация о специалистах"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Чтение информации о специалистах"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Беременность"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"беременность"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Чтение данных о беременности"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Проблемы"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"проблемы"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Чтение данных о проблемах"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Процедуры"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"процедуры"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Чтение данных о процедурах"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Социальный анамнез"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Социальный анамнез"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"социальный анамнез"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Чтение данных о социальном анамнезе"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Жизненные показатели"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Посещения"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"посещения"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Чтение информации о посещениях"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Жизненные показатели"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"жизненные показатели"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Чтение жизненных показателей"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Самоосознанность"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Записывать данные о повышении самоосознанности"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"<xliff:g id="APP_NAME">%1$s</xliff:g>: разрешение на чтение"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"<xliff:g id="APP_NAME">%1$s</xliff:g>: разрешение на запись"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Отмена"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Разрешить"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Разрешить все"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Не разрешать"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Выберите, какие данные это приложение сможет читать и записывать в сервисе \"Здоровье и спорт\"."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Выберите, какие данные это приложение сможет считывать и записывать на платформе \"Здоровье и спорт\"."</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Выберите, какие данные это приложение сможет считывать на платформе \"Здоровье и спорт\"."</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Выберите, какие данные это приложение сможет записывать на платформе \"Здоровье и спорт\"."</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Если вы предоставите приложению доступ для чтения, оно сможет получать как новые данные, так и информацию за последние 30 дней."</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Если вы предоставите приложению доступ для чтения, оно сможет получать как новые, так и старые данные."</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Открыть приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к сервису \"Здоровье и спорт\"?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Подробнее о том, как приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" обрабатывает ваши данные, можно прочитать в <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> разработчика."</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Открыть приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к данным о самочувствии и физической активности?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Сведения о том, как приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" обрабатывает ваши данные, содержит <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>."</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"политике конфиденциальности"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Разрешить приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к информации о здоровье?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Если вы предоставите разрешение, приложение сможет считывать и записывать данные, например о вакцинации, анализах и аллергии.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Если вы предоставите разрешение, приложение сможет считывать данные, например об аллергии, вакцинации и анализах.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Об информации, касающейся здоровья"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Примеры данных, которыми можно поделиться"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Если вы предоставите разрешение, приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" сможет делиться данными о вашем здоровье с платформой \"Здоровье и спорт\"."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Синхронизируйте информацию о здоровье из разных приложений и источников и храните ее централизованно"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Удалить все разрешения?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Удалить все"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> больше не сможет читать и записывать данные на платформе \"Здоровье и спорт\".\n\nЭто не повлияет на другие разрешения, такие как доступ к камере, микрофону или данным о местоположении."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> больше не сможет читать и записывать данные на платформе \"Здоровье и спорт\", включая сохраненные данные.\n\nЭто не повлияет на другие разрешения, такие как доступ к данным о местоположении, камере или микрофону."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не сможет читать и записывать данные на платформе \"Здоровье и спорт\", в том числе сохраненные ранее или в фоновом режиме.\n\nЭто не повлияет на другие разрешения, которые есть у приложения, например на доступ к сведениям о местоположении, камере или микрофону."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Также удалить данные приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" из Здоровья и спорта"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Удалить все разрешения?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Удалить все разрешения на доступ к данным о здоровье?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Удалить разрешения в области физ. активности и самочувствия?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Также удалить с платформы \"Здоровье и спорт\" данные о физической активности, полученные от приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Удалить все разрешения на доступ к данным о здоровье?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Также удалить с платформы \"Здоровье и спорт\" информацию о здоровье, полученную от приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не сможет читать и записывать эти данные на платформе \"Здоровье и спорт\".\n\nДругие разрешения, например на использование камеры, микрофона или информации о местоположении, затронуты не будут."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не сможет читать и записывать эти данные на платформе \"Здоровье и спорт\", в том числе в фоновом режиме.\n\nДругие разрешения, например на использование камеры, микрофона или информации о местоположении, затронуты не будут."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не сможет читать и записывать эти данные на платформе \"Здоровье и спорт\", в том числе сохраненные ранее.\n\nДругие разрешения, например на использование камеры, микрофона или информации о местоположении, затронуты не будут."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не сможет читать и записывать эти данные на платформе \"Здоровье и спорт\", в том числе сохраненные ранее или в фоновом режиме.\n\nДругие разрешения, например на использование камеры, микрофона или информации о местоположении, затронуты не будут."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Удалить все разрешения?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"У приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не будет доступа к данным платформы \"Здоровье и спорт\".\n\nДругие разрешения, например на использование камеры, микрофона или геоданных, затронуты не будут."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"У приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не будет доступа к данным платформы \"Здоровье и спорт\", в том числе сохраненным в фоновом режиме.\n\nДругие разрешения, например на использование камеры, микрофона или геоданных, затронуты не будут."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"У приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не будет доступа к данным платформы \"Здоровье и спорт\", в том числе сохраненным ранее.\n\nДругие разрешения, например на использование камеры, микрофона или геоданных, затронуты не будут."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"У приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" больше не будет доступа к данным платформы \"Здоровье и спорт\", в том числе сохраненным ранее или в фоновом режиме.\n\nДругие разрешения, например на использование камеры, микрофона или геоданных, затронуты не будут."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Также удалить с платформы \"Здоровье и спорт\" данные приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" о физической активности и здоровье"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Разрешения для этого приложения удалены."</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Также удалить все данные из сервиса \"Здоровье и спорт\""</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Следующий день"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Выбранный день"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Предыдущий день"</string>
     <string name="default_error" msgid="7966868260616403475">"Произошла ошибка. Повторите попытку."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Неизвестный ресурс"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Исходные данные"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Открывающая скобка."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Закрывающая скобка."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Значение поля \"<xliff:g id="FIELD">%2$s</xliff:g>\""</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"У этих приложений больше нет доступа, но их данные по-прежнему хранятся в сервисе \"Здоровье и спорт\"."</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> получит доступ к данным, добавленным после <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Чтобы задать разрешения для этого приложения в Android, выберите \"Настройки &gt; Приложения\"."</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"На данные, которые вы предоставляете приложению <xliff:g id="APP_NAME">%1$s</xliff:g>, распространяется его политика конфиденциальности."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Подробнее о том, как приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" обрабатывает ваши данные, можно прочитать в политике конфиденциальности разработчика."</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Чтобы задать разрешения для этого приложения в Android, выберите \"Настройки &gt; Приложения\"."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Ознакомиться с политикой конфиденциальности"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Разрешение использовалось в последние 24 часа"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Доступ для приложения"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"На устройстве нет совместимых приложений"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Дополнительные права доступа"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Сохраненные данные, фоновый режим"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"У приложения отозваны дополнительные разрешения."</string>
     <string name="permissions_header" msgid="6519976063360071569">"Разрешения"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Физическая активность и самочувствие"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Тренировки, сон, питание и не только"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Информация о здоровье"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"информация о здоровье"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Анализы, лекарства, иммунизация и прочее"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Анализы, медикаменты, вакцины и др."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Разрешения отозваны"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Сервис \"Здоровье и спорт\" отозвал разрешения для приложения \"<xliff:g id="APP_DATA">%s</xliff:g>\"."</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Сервис \"Здоровье и спорт\" отозвал разрешения для приложений \"<xliff:g id="APP_DATA_0">%1$s</xliff:g>\" и \"<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>\"."</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Перейти в Google Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Начало работы с сервисом \"Здоровье и спорт\""</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Приложение \"Здоровье и спорт\" надежно хранит ваши данные о физической активности и здоровье, а также синхронизирует работу разных приложений на устройстве."</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Платформа \"Здоровье и спорт\" объединяет и синхронизирует сведения из всех ваших приложений для отслеживания физической активности и состояния здоровья, а именно:\n\n"<b>"Информацию о самочувствии и физической активности,"</b>" в том числе о занятиях спортом, количестве пройденных шагов, питании, сне и не только.\n\n"<b>"Информацию о здоровье,"</b>" включая данные о вакцинации, результаты анализов и многое другое."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Благодаря платформе \"Здоровье и спорт\" вы можете:"</string>
     <string name="share_data" msgid="3481932156368883946">"Делиться данными с приложениями"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Выбирайте, какую информацию каждое приложение сможет читать и сохранять в сервисе \"Здоровье и спорт\"."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Управлять настройками и конфиденциальностью"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Скудные выделения"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Умеренные выделения"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Обильные выделения"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Объем выделений неизвестен"</string>
     <string name="period_day" msgid="3821944462093965882">"День менструации: <xliff:g id="DAY">%1$d</xliff:g> из <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Менструация (1 день)}one{Менструация (# день)}few{Менструация (# дня)}many{Менструация (# дней)}other{Менструация (# дня)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Положительный результат"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Отрицательный результат"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Высокий уровень фертильности"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Музыка"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Другое"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Без руководства"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Умеренные"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Интенсивные"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> мин."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ч. <xliff:g id="MIN">%2$s</xliff:g> мин."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ч."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Выполняется интеграция"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Выполняется интеграция приложения \"Здоровье и спорт\" с Android.\n\nПеренос ваших данных и разрешений займет некоторое время."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Не закрывайте приложение, пока не получите уведомление о том, что интеграция завершена."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Интеграция приложения \"Здоровье и спорт\""</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Требуется обновление"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Выполняется интеграция приложения \"Здоровье и спорт\" с Android. После окончания вы сможете открывать его прямо из настроек."</string>
     <string name="update_button" msgid="4544529019832009496">"Обновить"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Установите это обновление, чтобы продолжить интеграцию приложения \"Здоровье и спорт\" с настройками системы."</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Обновить"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Требуется обновление системы"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Прежде чем продолжить, обновите систему."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Если вы уже обновили систему, перезапустите телефон, чтобы продолжить интеграцию."</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Обновите Здоровье и спорт"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Прежде чем продолжить, обновите Здоровье и спорт до последней версии."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Недостаточно места"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Чтобы продолжить интеграцию приложения \"Здоровье и спорт\", освободите место в хранилище телефона (<xliff:g id="SPACE_NEEDED">%1$s</xliff:g>).\n\nЗатем повторите попытку."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Повторить попытку"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Освободить место"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Недостаточно места"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Чтобы продолжить интеграцию приложения \"Здоровье и спорт\", освободите место в хранилище телефона (<xliff:g id="SPACE_NEEDED">%1$s</xliff:g>)."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Интеграция приостановлена"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Во время интеграции с Android приложение \"Здоровье и спорт\" было закрыто.\n\nНажмите \"Возобновить\", чтобы заново открыть приложение и продолжить перенос данных и разрешений."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Чтобы не потерять данные из сервиса \"Здоровье и спорт\", завершите перенос в течение <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Нажмите, чтобы продолжить интеграцию приложения \"Здоровье и спорт\" с Android. Чтобы не потерять данные, завершите процесс в течение <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Нажмите, чтобы продолжить интеграцию приложения \"Здоровье и спорт\" с Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Продолжить"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Возобновите интеграцию приложения \"Здоровье и спорт\""</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Чтобы не потерять данные, завершите процесс в течение <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Требуется обновление"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> нужно обновить, чтобы оно синхронизировалось с платформой \"Здоровье и спорт\"."</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Некоторые приложения нужно обновить, чтобы они синхронизировались с платформой \"Здоровье и спорт\"."</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Чтобы приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" синхронизировалось с сервисом \"Здоровье и спорт\", обновите его. Обновления могут быть доступны не для всех приложений."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Необходимо обновить некоторые приложения, чтобы они синхронизировались с сервисом \"Здоровье и спорт\". Обновления могут быть доступны не для всех приложений."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Проверить наличие обновлений"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Подробнее"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Интеграция приложения \"Здоровье и спорт\""</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Интеграция приложения \"Здоровье и спорт\" не завершена"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Когда она снова станет доступна, вы получите уведомление."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"ОК"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Интеграция приложения \"Здоровье и спорт\" не завершена"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Подробнее"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Интеграция приложения \"Здоровье и спорт\" завершена"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Открыть"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Что изменилось"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Теперь вы можете открывать приложение \"Здоровье и спорт\" из настроек системы. Его можно удалить в любой момент, чтобы очистить хранилище."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"ОК"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Изменить список приложений"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Приложение по умолчанию"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Данные приложения"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Здесь будут появляться данные из приложений, у которых есть доступ к приложению \"Здоровье и спорт\"."</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Здесь показываются данные из приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Здесь показываются данные из приложений, у которых есть доступ к приложению \"Здоровье и спорт\"."</string>
     <string name="date_picker_day" msgid="3076687507968958991">"День"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Неделя"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Месяц"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Прошлый месяц"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Записи"</string>
     <string name="tab_access" msgid="7818197975407243701">"Доступ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Разрешить приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" получить дополнительные права доступа?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> также запрашивает доступ к указанным настройкам платформы \"Здоровье и спорт\"."</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Чтобы открыть приложению доступ в фоновом режиме или доступ к сохраненным данным, предоставьте хотя бы одно разрешение на чтение."</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Чтобы открыть приложению доступ в фоновом режиме, предоставьте хотя бы одно разрешение на чтение."</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Чтобы открыть приложению доступ к сохраненным данным, предоставьте хотя бы одно разрешение на чтение."</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Начните использовать платформу \"Здоровье и спорт\""</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Синхронизируйте приложения, чтобы они могли передавать друг другу данные о физической активности и здоровье."</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Начать"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Посмотрите совместимые приложения"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Узнайте, какие ещё приложения можно синхронизировать с сервисом \"<xliff:g id="APP_NAME">%s</xliff:g>\" через платформу \"Здоровье и спорт\"."</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Открыть магазин"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Настройте блокировку экрана"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Установите на этом устройстве PIN-код, графический ключ или пароль, чтобы лучше защитить данные о здоровье."</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Настроить блокировку экрана"</string>
     <string name="select_all" msgid="837499881590001166">"Выбрать все"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Связанные приложения больше не смогут читать эти данные платформы \"Здоровье и спорт\"."</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Выбрано"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Не выбрано"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Доступна карта маршрута тренировки"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Следующий день"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Следующая неделя"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Следующий месяц"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Предыдущий день"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Предыдущая неделя"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Предыдущий месяц"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Навсегда удалить все данные?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Навсегда удалить выбранные данные?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Навсегда удалить все данные приложения \"<xliff:g id="APP_NAME">%s</xliff:g>\"?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Навсегда удалить выбранные записи в приложении \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" за <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Навсегда удалить выбранные записи в приложении \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" за <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Навсегда удалить эту запись в приложении \"<xliff:g id="APP_NAME">%s</xliff:g>\"?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Удалить данные (<xliff:g id="DATA_TYPE">%1$s</xliff:g>) приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" без возможности восстановления?"</string>
+    <string name="on" msgid="8266542510798355807">"Включено"</string>
+    <string name="off" msgid="6996623844428550649">"Отключено"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Последний доступ в <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Последний доступ вчера: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Последний доступ: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Разрешить в любом режиме"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Разрешить выбранные"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"В самом приложении при его использовании"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Отклонить все"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Открыть приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к данным о самочувствии и физической активности?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запрашивает доступ к следующим типам данных: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nВы можете предоставить сразу все разрешения или настроить их по отдельности."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Разрешить приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к данным \"<xliff:g id="DATA_TYPE">%2$s</xliff:g>\"?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Физическая активность и самочувствие"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"всегда"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"при использовании приложения"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Всегда"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"При использовании приложения"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" имеет доступ ко всем вашим данным о физической активности и самочувствии <xliff:g id="ALLOW_MODE">%2$s</xliff:g>."</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Разрешен доступ"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Разрешено чтение данных"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Эти разрешения дают приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к данным датчиков устройства."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Приложений с разрешением: <xliff:g id="NUMBER_0">%1$d</xliff:g> из <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Нет запросов от приложений"</string>
+    <string name="allowed" msgid="4158456017482263737">"Разрешено"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Не разрешено"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Приложения с этим разрешением могут получать доступ к следующим данным датчиков устройства: <xliff:g id="DATA_TYPE">%s</xliff:g>."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Закрыть для всех приложений на часах доступ к следующим данным: <xliff:g id="DATA_TYPE">%s</xliff:g>?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Флажок"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Крестик"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" имеет доступ к вашим данным о физической активности и самочувствии <xliff:g id="ALLOW_MODE">%2$s</xliff:g>."</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Разрешить приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" постоянный доступ к данным о самочувствии и физической активности?"</string>
+    <string name="current_access" msgid="1457167070428176139">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" имеет доступ к следующим типам данных: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Настройки доступа к данным о физической активности и самочувствии"</string>
 </resources>
diff --git a/apk/res/values-si/strings.xml b/apk/res/values-si/strings.xml
index 53c1d61..cf0400f 100644
--- a/apk/res/values-si/strings.xml
+++ b/apk/res/values-si/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ඔබේ උපාංගයෙහි සෞඛ්‍ය සහ යෝග්‍යතා දත්ත කළමනාකරණය කරන්න, සහ එයට ප්‍රවේශ විය හැකි යෙදුම් පාලනය කරන්න"</string>
     <string name="data_title" msgid="4456619761533380816">"දත්ත සහ ප්‍රවේශය"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"සෞඛ්‍ය වාර්තා බ්‍රවුස් කරන්න"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"ඔබේ සෞඛ්‍ය වාර්තා සහ ඒවාට ප්‍රවේශ විය හැකි යෙදුම් බලන්න"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"ප්‍රවර්ග සියල්ල"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"සියලු ප්‍රවර්ග බලන්න"</string>
     <string name="no_data" msgid="1906986019249068659">"දත්ත නැත"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"ඊයේ"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"කියවන්න: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"ලියන්න: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"අවසර කළමනාකරණය කරන්න"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"වේලාව: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"ක්‍රියාකාරකම"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"ඔබේ සෞඛ්‍ය දත්ත වෙත ප්‍රවේශය"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"දහනය කරන ලද කැලරි කියවන්න"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"යෙදුමට දහන කරන ලද කැලරි කියවීමට ඉඩ දෙයි"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"පසුබිමේ දත්ත ප්‍රවේශ කරන්න"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට පසුබිමේ දත්ත වෙත ප්‍රවේශ වීමට ඉඩ දෙන්න ද?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට පසුබිමේ දත්ත වෙත ප්‍රවේශ වීමට ඉඩ දෙන්න ද?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"ඔබ ඉඩ දෙන්නේ නම්, මෙම යෙදුමට ඔබ යෙදුම භාවිතා නොකරන විට යෝග්‍යතා සහ සුවතා දත්ත සහ සෞඛ්‍ය වාර්තා වෙත ප්‍රවේශ විය හැක."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"ඔබ ඉඩ දෙන්නේ නම්, ඔබ යෙදුම භාවිතා නොකරන විට මෙම යෙදුමට සෞඛ්‍ය වාර්තා වෙත ප්‍රවේශ විය හැක."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"ඔබ ඉඩ දෙන්නේ නම්, ඔබ යෙදුම භාවිතා නොකරන විට මෙම යෙදුමට යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ විය හැක."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"ඔබ ඉඩ දෙන්නේ නම්, ඔබ යෙදුම භාවිත නොකරන විට මෙම යෙදුමට Health Connect දත්ත වෙත ප්‍රවේශ විය හැක."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"පසුගිය දත්ත වෙත ප්‍රවේශ වීමට <xliff:g id="APP_NAME">%1$s</xliff:g> හට ඉඩ දෙන්න ද?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"ඔබ ඉඩ දෙන්නේ නම්, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ට පෙර එක් කරන ලද යෝග්‍යතා සහ සුවතා දත්ත මෙම යෙදුමට ප්‍රවේශ විය හැක."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"ඔබ ඉඩ දෙන්නේ නම්, මෙම යෙදුමට සියලු ම අතීත යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ විය හැක."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"ඔබ ඉඩ දෙන්නේ නම්, මෙම යෙදුමට <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ට පෙර එක් කරන ලද Health Connect දත්ත වෙත ප්‍රවේශ විය හැක."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"ඔබ ඉඩ දෙන්නේ නම්, මෙම යෙදුමට පසුගිය Health Connect දත්ත සියල්ල වෙත ප්‍රවේශ විය නොහැක."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා අමතර ප්‍රවේශයට ඉඩ දෙන්න ද?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g>ට මෙම Health Connect සැකසීම් වෙත ප්‍රවේශ වීමට ද අවශ්‍යයි"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"පසුබිමේ ඇති සියලු ම දත්ත වෙත ප්‍රවේශ වන්න"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"පසුබිමේ සෞඛ්‍ය වාර්තා වෙත ප්‍රවේශ වන්න"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"පසුබිමේ යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ වන්න"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ඔබ යෙදුම භාවිතා නොකරන විට යෝග්‍යතා සහ සුවතා දත්ත සහ සෞඛ්‍ය වාර්තා වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ඔබ යෙදුම භාවිතා නොකරන විට මෙම දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ඔබ යෙදුම භාවිතා නොකරන විට මෙම දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"පසුබිමේ දත්ත ප්‍රවේශ කරන්න"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"ඔබ යෙදුම භාවිත නොකරන විට Health Connect දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"අතීත යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ වන්න"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ට පෙර එක් කළ දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"සියලු ම අතීත දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"අතීත දත්ත වෙත ප්‍රවේශය"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ට පෙර එක් කරන ලද Health Connect දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"පසුගිය Health Connect දත්ත සියල්ල වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට දැනටමත් ඔබේ සෞඛ්‍ය වාර්තා සඳහා අතීත දත්ත වෙත ප්‍රවේශ විය හැක"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"අවසර ගැන වැඩිදුර කියවන්න"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"පසුබිමේ ඇති සියලු ම දත්ත වෙත ප්‍රවේශ වන්න"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"පසුබිමේ සෞඛ්‍ය වාර්තා වෙත ප්‍රවේශ වන්න"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"පසුබිමේ යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ වන්න"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ඔබ යෙදුම භාවිතා නොකරන විට යෝග්‍යතා සහ සුවතා දත්ත සහ සෞඛ්‍ය වාර්තා වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ඔබ යෙදුම භාවිතා නොකරන විට මෙම දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ඔබ යෙදුම භාවිතා නොකරන විට මෙම දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"පසුබිමේ දත්ත ප්‍රවේශ කරන්න"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"ඔබ යෙදුම භාවිත නොකරන විට Health Connect දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"අතීත යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ වන්න"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ට පෙර එක් කළ දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"සියලු ම අතීත දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"අතීත දත්ත වෙත ප්‍රවේශය"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ට පෙර එක් කරන ලද Health Connect දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"සියලු ම Health Connect අතීත දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට කියවීමේ අවසරයක් නොමැති නිසා දැනට යෝග්‍යතා දත්ත කිසිවක් කියවනු නොලැබේ"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට දැනටමත් ඔබේ සෞඛ්‍ය වාර්තා සඳහා අතීත දත්ත වෙත ප්‍රවේශ විය හැක. මෙය වෙනස් කිරීමට, මෙම යෙදුම සඳහා සෞඛ්‍ය වාර්තා අවසර ක්‍රියාවිරහිත කරන්න"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"සෞඛ්‍ය වාර්තා අවසර කළමනාකරණය කරන්න"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"මෙම යෙදුම සඳහා පසුබිම හෝ අතීත දත්ත ප්‍රවේශය ක්‍රියාත්මක කිරීමට අවම වශයෙන් එක් කියවීම් අවසරයක්වත් සබල කරන්න"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"මෙම යෙදුම සඳහා පසුබිම් ප්‍රවේශය ක්‍රියාත්මක කිරීමට අවම වශයෙන් එක් කියවීම් අවසරයක්වත් සබල කරන්න"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"මෙම යෙදුම සඳහා අතීත දත්ත ප්‍රවේශය ක්‍රියාත්මක කිරීමට අවම වශයෙන් එක් කියවීම් අවසරයක්වත් සබල කරන්න"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"පසුගිය Health Connect දත්ත සියල්ල වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
     <string name="background_read_description" msgid="3203594555849969283">"ඔබ යෙදුම භාවිත නොකරන විට Health Connect දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"ඔබ ඉඩ දෙන්නේ නම්, ඔබ යෙදුම භාවිත නොකරන විට මෙම යෙදුමට Health Connect දත්ත වෙත ප්‍රවේශ විය හැක."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"අතීත දත්ත වෙත ප්‍රවේශය"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"පසුගිය දත්ත වෙත ප්‍රවේශ වීමට <xliff:g id="APP_NAME">%1$s</xliff:g> හට ඉඩ දෙන්න ද?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ට පෙර එක් කරන ලද Health Connect දත්ත වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"පසුගිය Health Connect දත්ත සියල්ල වෙත ප්‍රවේශ වීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"ඔබ ඉඩ දෙන්නේ නම්, මෙම යෙදුමට <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>ට පෙර එක් කරන ලද Health Connect දත්ත වෙත ප්‍රවේශ විය හැක."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"ඔබ ඉඩ දෙන්නේ නම්, මෙම යෙදුමට පසුගිය Health Connect දත්ත සියල්ල වෙත ප්‍රවේශ විය නොහැක."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"දහනය කළ ක්‍රීයාකාරී කැලරි"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"දහනය කළ ක්‍රීයාකාරී කැලරි"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"දහනය කළ ක්‍රියාකාරී කැලරි කියවන්න"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"රෝද පුටු තල්ලු කිරීම්"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"රෝද පුටු තල්ලු කිරීම් කියවන්න"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"රෝද පුටු තල්ලු කිරීම් ලියන්න"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"ක්‍රියාකාරකම් තීව්‍රතාව"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ක්‍රියාකාරකම් තීව්‍රතාව"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"කියවීම් ක්‍රියාකාරකම් තීව්‍රතාව"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"ලිවීම් ක්‍රියාකාරකම් තීව්‍රතාව"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"මූලස්ථ පරිවෘත්තීය ශීඝ්‍රතාව"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"මූලස්ථ පරිවෘත්තීය ශීඝ්‍රතාව"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"මූලස්ථ පරිවෘත්තීය ශීඝ්‍රතාව කියවන්න"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"සමේ උෂ්ණත්වය"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"සමේ උෂ්ණත්වය කියවන්න"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"සමේ උෂ්ණත්වය ලියන්න"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Health Connect වෙත සමමුහුර්ත කර එක් කළ සියලු ම සෞඛ්‍ය වාර්තා මෙයට ඇතුළත් වේ. මෙය ඔබේ සම්පූර්ණ වෛද්‍ය වාර්තාව නොවිය හැකි අතර ඔබේ සෞඛ්‍ය වාර්තා පිළිබඳ වෛද්‍ය විස්තරයක් ඇතුළත් නොවේ."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"සියලු ම සෞඛ්‍ය වාර්තා"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"සියලු ම සෞඛ්‍ය වාර්තා"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"සියලු ම සෞඛ්‍ය වාර්තා ලියන්න"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"අසාත්මිකතා"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"අසාත්මිකතා"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"අසාත්මිකතා කියවන්න"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"ප්‍රතිශක්තිකරණය"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ප්‍රතිශක්තිකරණය"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"ප්‍රතිශක්තිකරණය කියවන්න"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"රසායනාගාර ප්‍රතිඵල"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"රසායනාගාර ප්‍රතිඵල"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"රසායනාගාර ප්‍රතිඵල කියවන්න"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"අසාත්මිකතා"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"අසාත්මිකතා"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"අසාත්මිකතා කියවන්න"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"කොන්දේසි"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"කොන්දේසි"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"කොන්දේසි කියවන්න"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"එන්නත්"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"එන්නත්"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"එන්නත් කියවන්න"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"රසායනාගාර ප්‍රතිඵල"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"රසායනාගාර ප්‍රතිඵල"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"රසායනාගාර ප්‍රතිඵල කියවන්න"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ඖෂධ"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ඖෂධ"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ඖෂධ කියවන්න"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"පුද්ගලික විස්තර"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"පුද්ගලික විස්තර"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"පුද්ගලික විස්තර කියවන්න"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"වෘත්තිකයාගේ විස්තර"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"වෘත්තිකයාගේ විස්තර"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"වෘත්තිකයාගේ විස්තර කියවන්න"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"ගර්භනීභාවය"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ගර්භනීභාවය"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"ගර්භනීභාවය කියවන්න"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ගැටලු"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ගැටලු"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"ගැටලු කියවන්න"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"ක්‍රියා පටිපාටි"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"ක්‍රියා පටිපාටි"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"ක්‍රියා පටිපාටි කියවන්න"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"සමාජ ඉතිහාසය"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"සමාජ ඉතිහාසය"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"සමාජ ඉතිහාසය"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"සමාජ ඉතිහාසය කියවන්න"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"වැදගත් සංඥා"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"පැමිණීම්"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"පැමිණීම්"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"පැමිණීම් කියවන්න"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"වැදගත් සංඥා"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"වැදගත් සංඥා"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"වැදගත් සංඥා කියවන්න"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"සිහිකල්පනාව"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"සිහිකල්පනාව ලියන්න"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” හට කියවීමට ඉඩ දෙන්න"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” හට ලිවීමට ඉඩ දෙන්න"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"අවලංගු කරන්න"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"ඉඩ දෙන්න"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"සියල්ලට ඉඩ දෙන්න"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"ඉඩ නොදෙන්න"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"ඔබට මෙම යෙදුම Health Connect වෙත කියවීමට හෝ ලිවීමට අවශ්‍ය දත්ත තෝරන්න"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"ඔබට මෙම යෙදුම Health Connect වෙත කියවීමට හෝ ලිවීමට අවශ්‍ය දත්ත තෝරන්න"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connect වෙතින් ඔබට මෙම යෙදුම කියවීමට අවශ්‍ය දත්ත තෝරා ගන්න"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"ඔබට මෙම යෙදුම Health Connect වෙත ලිවීමට අවශ්‍ය දත්ත තෝරා ගන්න"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"ඔබ කියවීම් ප්‍රවේශය ලබා දෙන්නේ නම්, යෙදුමට පසුගිය දින 30 සිට නව දත්ත සහ දත්ත කියවිය හැක"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"ඔබ කියවීමට ප්‍රවේශය ලබා දෙන්නේ නම්, යෙදුමට නව සහ අතීත දත්ත කියවිය හැක"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට Health Connect වෙත ප්‍රවේශ වීමට ඉඩ දෙන්නද?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"ඔබට <xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ දත්ත හසුරුවන ආකාරය ගැන සංවර්ධකගේ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> තුළ දැන ගත හැක"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ වීමට ඉඩ දෙන්න ද?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"ඔවුන්ගේ <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> හි <xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ දත්ත හසුරුවන ආකාරය ඔබට දැන ගත හැක"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"පෞද්ගලිකත්ව ප්‍රතිපත්තිය"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට ඔබේ සෞඛ්‍ය වාර්තා වෙත ප්‍රවේශ වීමට ඉඩ දෙන්න ද?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"ඔබ ප්‍රවේශය ලබා දෙන්නේ නම්, යෙදුමට අසාත්මිකතා, පරීක්ෂණාගාර ප්‍රතිඵල, එන්නත් සහ තවත් බොහෝ දත්ත කියවීමට සහ ලිවීමට හැක\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"ඔබ ප්‍රවේශය ලබා දෙන්නේ නම්, යෙදුමට අසාත්මිකතා, පරීක්ෂණාගාර ප්‍රතිඵල, එන්නත් සහ තවත් බොහෝ දත්ත කියවීමට හැක\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"සෞඛ්‍ය වාර්තා ගැන"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"බෙදා ගැනීමට දත්තවල ඇතුළත් වේ"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"ඔබ ඉඩ දෙන්නේ නම්, <xliff:g id="APP_NAME">%1$s</xliff:g> හට ඔබේ සෞඛ්‍ය වාර්තා Health Connect සමග බෙදා ගත හැක."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"ඔබේ සෞඛ්‍ය වාර්තා එක තැනක තබා ගැනීමට ඔබේ විවිධ යෙදුම් සහ මූලාශ්‍රවලින් සමමුහුර්ත කරන්න"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"සියලු අවසර ඉවත් කරන්න ද?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"සියල්ල ඉවත් කරන්න"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් Health Connect වෙතින් දත්ත කිසිවක් කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nමෙම යෙදුමට කැමරාව, මයික්‍රෆෝනය, හෝ ස්ථානය වැනි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් අතීත දත්ත ඇතුළුව, Health Connect වෙතින් දත්ත කිසිවක් කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nස්ථානය, කැමරාව, හෝ මයික්‍රෆෝනය වැනි, මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් පසුබිම් සහ අතීත දත්ත ඇතුළුව, Health Connect වෙතින් දත්ත කිසිවක් කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nස්ථානය, කැමරාව, හෝ මයික්‍රෆෝනය වැනි, මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect වෙතින් <xliff:g id="APP_NAME">%1$s</xliff:g> දත්ත ද මකන්න"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"සියලු අවසර ඉවත් කරන්න ද?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"සියලුම සෞඛ්‍ය වාර්තා අවසර ඉවත් කරන්න ද?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"සියලුම යෝග්‍යතා සහ සුවතා අවසර ඉවත් කරන්න ද?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connect වෙතින් <xliff:g id="APP_NAME">%1$s</xliff:g> හි යෝග්‍යතා දත්ත ද මකන්න"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"සියලුම සෞඛ්‍ය වාර්තා අවසර ඉවත් කරන්න ද?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connect වෙතින් <xliff:g id="APP_NAME">%1$s</xliff:g> හි සෞඛ්‍ය වාර්තා ද මකන්න"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් Health Connect වෙතින් මෙම දත්ත කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nකැමරාව, මයික්‍රොෆෝනය හෝ ස්ථානය වැනි මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් පසුබිම් දත්ත ඇතුළුව Health Connect වෙතින් මෙම දත්ත කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nකැමරාව, මයික්‍රොෆෝනය හෝ ස්ථානය වැනි මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් අතීත දත්ත ඇතුළුව Health Connect වෙතින් මෙම දත්ත කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nකැමරාව, මයික්‍රොෆෝනය හෝ ස්ථානය වැනි මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් පසුබිම් සහ අතීත දත්ත ඇතුළුව Health Connect වෙතින් මෙම දත්ත කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nකැමරාව, මයික්‍රොෆෝනය හෝ ස්ථානය වැනි මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"සියලු අවසර ඉවත් කරන්න ද?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් Health Connect වෙතින් දත්ත කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nකැමරාව, මයික්‍රොෆෝනය හෝ ස්ථානය වැනි මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් පසුබිම් දත්ත ඇතුළුව Health Connect වෙතින් දත්ත කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nකැමරාව, මයික්‍රොෆෝනය හෝ ස්ථානය වැනි මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් අතීත දත්ත ඇතුළුව Health Connect වෙතින් දත්ත කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nකැමරාව, මයික්‍රොෆෝනය හෝ ස්ථානය වැනි මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට තවදුරටත් පසුබිම් සහ අතීත දත්ත ඇතුළුව Health Connect වෙතින් දත්ත කියවීමට හෝ ලිවීමට නොහැකි වනු ඇත.\n\nකැමරාව, මයික්‍රොෆෝනය හෝ ස්ථානය වැනි මෙම යෙදුමට තිබිය හැකි වෙනත් අවසරවලට මෙය බලපාන්නේ නැත."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Health Connect වෙතින් <xliff:g id="APP_NAME">%1$s</xliff:g> හි යෝග්‍යතා දත්ත සහ සෞඛ්‍ය වාර්තා ද මකන්න"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"මෙම යෙදුම සඳහා අවසර ඉවත් කරන ලදි"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"එසේම සියලු Health Connect දත්ත මකන්න"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"ඊළඟ දිනය"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"තෝරා ගත් දිනය"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"පෙර දිනය"</string>
     <string name="default_error" msgid="7966868260616403475">"යමක් වැරදිණි. නැවත උත්සාහ කරන්න."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"නොදන්නා සම්පත"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"මූලාශ්‍ර දත්ත"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>විවෘත වරහන."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>වැසුණු වරහන."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ක්ෂේත්‍රය <xliff:g id="FIELD">%2$s</xliff:g> අගය"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"මෙම යෙදුම්වලට තවදුරටත් ප්‍රවේශය නැති නමුත්, තවමත් Health Connect තුළ දත්ත ගබඩා කර ඇත"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g>ට <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>ට පසුව එක් කළ දත්ත කියවිය හැක"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"මෙම යෙදුමට ප්‍රවේශ විය හැකි වෙනත් Android අවසර කළමනාකරණය කිරීමට, සැකසීම් &gt; යෙදුම් වෙත යන්න"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"ඔබ <xliff:g id="APP_NAME">%1$s</xliff:g> සමග බෙදා ගන්නා දත්ත ඒවායේ පෞද්ගලිකත්ව ප්‍රතිපත්තියෙන් ආවරණය වේ"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"ඔබට <xliff:g id="APP_NAME">%1$s</xliff:g> ඔබගේ දත්ත හසුරුවන ආකාරය ගැන සංවර්ධකගේ පෞද්ගලිකත්ව ප්‍රතිපත්තිය තුළ දැන ගත හැකිය"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"මෙම යෙදුමට ප්‍රවේශ විය හැකි වෙනත් Android අවසර කළමනාකරණය කිරීමට, සැකසීම්, පසුව යෙදුම් වෙත යන්න"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"පෞද්ගලිකත්ව ප්‍රතිපත්තිය කියවන්න"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"පසුගිය පැය 24 තුළ ප්‍රවේශ විය"</string>
     <string name="app_access_title" msgid="7137018424885371763">"යෙදුම් ප්‍රවේශය"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"ඔබට දැනට ගැළපෙන යෙදුම් කිසිවක් ස්ථාපන කර නැත"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"අතිරේක ප්‍රවේශය"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"අතීත දත්ත, පසුබිම් දත්ත"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"මෙම යෙදුම සඳහා අතිරේක අවසර ඉවත් කරන ලදි"</string>
     <string name="permissions_header" msgid="6519976063360071569">"අවසර"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"යෝග්‍යතාවය සහ සුවතාවය"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ව්‍යායාම, නින්ද, පෝෂණය සහ වෙනත් ඒවා"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"සෞඛ්‍ය වාර්තා"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"සෞඛ්‍ය වාර්තා"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"රසායනාගාර ප්‍රතිඵල, ඖෂධ, ප්‍රතිශක්තිකරණ සහ වෙනත් ඒවා"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"රසායනාගාර ප්‍රතිඵල, ඖෂධ, එන්නත් සහ වෙනත්"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"යෙදුම් අවසර ඉවත් කර ඇත"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"<xliff:g id="APP_DATA">%s</xliff:g> සඳහා Health Connect අවසර ඉවත් කර ඇත"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"<xliff:g id="APP_DATA_0">%1$s</xliff:g> සහ <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> සඳහා Health Connect අවසර ඉවත් කර ඇත"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store වෙත යන්න"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect සමග පටන් ගන්න"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ඔබට ඔබේ උපාංගයෙහි විවිධ යෙදුම් සමමුහුර්ත කිරීමට සරල ක්‍රමයක් ලබා දෙමින්, ඔබේ සෞඛ්‍ය සහ යෝග්‍යතා දත්ත ගබඩා කරයි"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect විවිධ යෙදුම්වලින් ඔබේ සෞඛ්‍ය සහ යෝග්‍යතා දත්ත ගබඩා කර සමමුහුර්ත කරයි.\n\nව්‍යායාම සැසි, පියවර, පෝෂණය, නින්ද සහ තවත් දේ ඇතුළුව, "<b>"යෝග්‍යතා සහ සුවතා දත්ත"</b>\n\n"එන්නත්, රසායනාගාර ප්‍රතිඵල සහ තවත් දේ ඇතුළුව, "<b>"සෞඛ්‍ය වාර්තා"</b></string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect සමගින් ඔබට හැකියි"</string>
     <string name="share_data" msgid="3481932156368883946">"ඔබේ යෙදුම් සමග දත්ත බෙදා ගන්න"</string>
     <string name="share_data_description" msgid="2919871301634375092">"එක් එක් යෙදුමට Health Connect වෙත කියවීමට හෝ ලිවීමට හැකි දත්ත තෝරා ගන්න"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"ඔබේ සැකසීම් සහ පෞද්ගලිකත්වය කළමනා කරන්න"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"සුළු වහනයක් සහිත"</string>
     <string name="flow_medium" msgid="3783688724668943154">"මධ්‍යම වහනයක් සහිත"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"දැඩි වහනයක් සහිත"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"නොදන්නා ප්‍රවාහය"</string>
     <string name="period_day" msgid="3821944462093965882">"ඔසප් වීම <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> න් <xliff:g id="DAY">%1$d</xliff:g> වෙනි දිනය"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ඔසප් වීම (1 දිනයක්)}one{ඔසප් වීම (දින #ක්)}other{ඔසප් වීම (දින #ක්)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"පොසිටිව්"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"නෙගටිව්"</string>
     <string name="ovulation_high" msgid="205362931427158291">"ඉහළ"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"සංගීතය"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"වෙනත්"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"මගපෙන්වීමක් නැත"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"මධ්‍යස්ථ"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"ජවසම්පන්න"</string>
     <string name="minute_duration" msgid="9035288227090160206">"මිනි <xliff:g id="MINUTE">%1$s</xliff:g>ක්"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"පැ<xliff:g id="HOUR">%1$s</xliff:g> මි<xliff:g id="MIN">%2$s</xliff:g>"</string>
     <string name="hour_duration" msgid="3472489613837138711">"පැය <xliff:g id="HOUR">%1$s</xliff:g>ක්"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ඒකාබද්ධ කිරීම සිදු වෙමින් පවතී"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect, Android පද්ධතිය සමග ඒකාබද්ධ වෙමින් පවතී.\n\nඔබේ දත්ත සහ අවසර මාරු කරන අතරතුර යම් කාලයක් ගත විය හැක."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"ක්‍රියාවලිය සම්පූර්ණ වූ බවට ඔබට දැනුම්දීමක් ලැබෙන තුරු යෙදුම නොවසන්න."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect ඒකාබද්ධ කිරීම සිදු වෙමින් පවතී"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"යාවත්කාලීනය අවශ්‍යයි"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect, Android පද්ධතිය සමග ඒකාබද්ධ වෙමින් පවතින බැවින් ඔබට ඔබේ සැකසීම් වෙතින් එයට සෘජුවම ප්‍රවේශ විය හැක."</string>
     <string name="update_button" msgid="4544529019832009496">"යාවත්කාලීන කරන්න"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Health Connect හට ඔබේ පද්ධති සැකසීම් සමග දිගටම ඒකාබද්ධ කළ හැකි පරිදි මෙම යාවත්කාලීනය ආරම්භ කරන්න"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"දැන් යාවත්කාලීන කරන්න"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"පද්ධති යාවත්කාලීනය අවශ්‍යයි"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"ඉදිරියට යාමට පෙර, ඔබේ දුරකථන පද්ධතිය යාවත්කාලීන කරන්න."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"ඔබ දැනටමත් ඔබේ දුරකථන පද්ධතිය යාවත්කාලීන කර ඇති නම්, දිගටම ඒකාබද්ධ කිරීමට ඔබේ දුරකථනය යළි ඇරඹීමට උත්සාහ කරන්න"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect යාවත්කාලීන කිරීම අවශ්‍යයි"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"ඉදිරියට යාමට පෙර, Health Connect යෙදුම නවතම අනුවාදයට යාවත්කාලීන කරන්න."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"තව ඉඩ අවශ්‍යයි"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"දිගටම ඒකාබද්ධ කිරීමට Health Connect හට ඔබේ දුරකථනයේ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ගබඩා ඉඩ අවශ්‍ය වෙයි.\n\nඔබේ දුරකථනයේ යම් ඉඩක් හිස් කර නැවත උත්සාහ කරන්න."</string>
     <string name="try_again_button" msgid="8745496819992160789">"නැවත උත්සාහ කරන්න"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"ඉඩ නිදහස් කර ගන්න"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"තව ඉඩ අවශ්‍යයි"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect හට දිගටම ඒකාබද්ධ කිරීමට ඔබේ දුරකථනයේ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> ගබඩා ඉඩ අවශ්‍යයි."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ඒකාබද්ධ කිරීම විරාම කරන ලදී"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect යෙදුම Android පද්ධතිය සමග ඒකාබද්ධ වෙමින් තිබියදී වැසුණා.\n\nයෙදුම නැවත විවෘත කර ඔබේ දත්ත සහ අවසර දිගටම මාරු කිරීමට නැවත පටන් ගන්න ක්ලික් කරන්න."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"ඔබේ Health Connect දත්ත තබා ගැනීමට මෙය <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ඇතුළත සම්පූර්ණ කරන්න"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect, Android පද්ධතිය සමග දිගටම ඒකාබද්ධ කිරීමට තට්ටු කරන්න. ඔබේ දත්ත තබා ගැනීම සඳහා, මෙය <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ඇතුළත සම්පූර්ණ කරන්න"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect, Android පද්ධතිය සමග දිගටම ඒකාබද්ධ කිරීමට තට්ටු කරන්න."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ඉදිරියට යන්න"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect ඒකාබද්ධ කිරීම නැවත ආරම්භ කරන්න"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"ඔබේ දත්ත තබා ගැනීම සඳහා, මෙය <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ඇතුළත සම්පූර්ණ කරන්න"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"යෙදුම් යාවත්කාලීනය අවශ්‍යයි"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect සමඟ සමමුහුර්ත කිරීම දිගටම කරගෙන යාමට යාවත්කාලීන කිරීමට අවශ්‍ය වේ"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect සමග සමමුහුර්ත කිරීම දිගටම කරගෙන යාමට සමහර යෙදුම් යාවත්කාලීන කිරීමට අවශ්‍ය වේ"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect සමඟ සමමුහුර්ත කිරීම දිගටම කරගෙන යාමට යාවත්කාලීන කිරීමට අවශ්‍ය වේ. සියලු ම යෙදුම් සඳහා යාවත්කාලීන නොතිබිය හැක."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect සමග සමමුහුර්ත කිරීම දිගටම කරගෙන යාමට සමහර යෙදුම් යාවත්කාලීන කිරීමට අවශ්‍ය වේ. සියලු ම යෙදුම් සඳහා යාවත්කාලීන නොතිබිය හැක."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"යාවත්කාලීන තිබේද පරීක්‍ෂා කරන්න"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"තව දැන ගන්න"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect ඒකාබද්ධ කිරීම"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect ඒකාබද්ධ කිරීම සම්පූර්ණ නොවුණි"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"එය නැවත ලබා ගත හැකි වූ විට ඔබට දැනුම්දීමක් ලැබෙයි."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"තේරුණා"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect ඒකාබද්ධ කිරීම සම්පූර්ණ නොවුණි"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"තව කියවන්න"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect ඒකාබද්ධ කිරීම සම්පූර්ණයි"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"විවෘත කරන්න"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"අලුත් මොනවා ද"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"ඔබට දැන් ඔබේ සැකසීම්වලින් සෘජුවම Health Connect වෙත ප්‍රවේශ විය හැක. ගබඩා ඉඩ නිදහස් කර ගැනීමට ඕනෑම වේලාවක Health Connect යෙදුම අස්ථාපන කරන්න."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"තේරුණා"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"යෙදුම් මූලාශ්‍ර සංස්කරණය කරන්න"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"උපාංගයේ පෙරනිමිය"</string>
     <string name="app_data_title" msgid="6499967982291000837">"යෙදුම් දත්ත"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect වෙත ප්‍රවේශය ඇති යෙදුම් වෙතින් දත්ත මෙහි පෙන්වනු ඇත"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> වෙතින් දත්ත මෙහි පෙන්වනු ඇත"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect වෙත ප්‍රවේශය ඇති යෙදුම් වෙතින් දත්ත මෙහි පෙන්වනු ඇත"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"දිනය"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"සතිය"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"මාසය"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"පසුගිය මාසය"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ඇතුළත් කිරීම්"</string>
     <string name="tab_access" msgid="7818197975407243701">"ප්‍රවේශය"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා අමතර ප්‍රවේශයට ඉඩ දෙන්න ද?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g>ට මෙම Health Connect සැකසීම් වෙත ප්‍රවේශ වීමට ද අවශ්‍යයි"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"මෙම යෙදුම සඳහා පසුබිම හෝ අතීත දත්ත ප්‍රවේශය ක්‍රියාත්මක කිරීමට අවම වශයෙන් එක් කියවීම් අවසරයක්වත් සබල කරන්න"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"මෙම යෙදුම සඳහා පසුබිම් ප්‍රවේශය ක්‍රියාත්මක කිරීමට අවම වශයෙන් එක් කියවීම් අවසරයක්වත් සබල කරන්න"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"මෙම යෙදුම සඳහා අතීත දත්ත ප්‍රවේශය ක්‍රියාත්මක කිරීමට අවම වශයෙන් එක් කියවීම් අවසරයක්වත් සබල කරන්න"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect භාවිත කිරීම අරඹන්න"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ඔවුන් අතර සෞඛ්‍ය සහ යෝග්‍යතා දත්ත බෙදා ගැනීමට ඔබේ පළමු යෙදුම් සමමුහුර්ත කරන්න"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"පිහිටුවන්න"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"ගැළපෙන යෙදුම් බලන්න"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect හරහා <xliff:g id="APP_NAME">%s</xliff:g> සමමුහුර්ත කිරීමට තවත් යෙදුම් සොයා ගන්න"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"App Store හි බලන්න"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"තිර අගුලක් සකසන්න"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"ඔබේ සෞඛ්‍ය දත්ත සඳහා අමතර ආරක්ෂාවක් ලබා ගැනීමට, මෙම උපාංගය සඳහා PIN, රටාව හෝ මුරපදය සකසන්න"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"තිර අගුල සකසන්න"</string>
     <string name="select_all" msgid="837499881590001166">"සියල්ල තෝරන්න"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"සම්බන්ධිත යෙදුම්වලට තවදුරටත් Health Connect වෙතින් මෙම දත්ත කියවීමට නොහැකි වනු ඇත"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"සලකුණු කරන ලදි"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"සලකුණු නොකළ"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"අභ්‍යාස සිතියම් මාර්ගය තිබේ"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"ඊළඟ දිනය"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"ඊළඟ සතිය"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"ඊළඟ මාසය"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"පෙර දිනය"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"පෙර සතිය"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"පෙර මාසය"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"සියලු දත්ත ස්ථිරවම මකන්න ද?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"තෝරා ගත් දත්ත ස්ථිරවම මකන්න ද?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"සියලු <xliff:g id="APP_NAME">%s</xliff:g> දත්ත ස්ථිරවම මකන්න ද?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> සතිය සඳහා තෝරා ගත් <xliff:g id="APP_NAME">%1$s</xliff:g> ඇතුළත් කිරීම් ස්ථිරවම මකන්න ද?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> සඳහා තෝරා ගත් <xliff:g id="APP_NAME">%1$s</xliff:g> ඇතුළත් කිරීම් ස්ථිරවම මකන්න ද?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"මෙම <xliff:g id="APP_NAME">%s</xliff:g> ඇතුළත් කිරීම ස්ථිරවම මකන්න ද?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> සඳහා <xliff:g id="DATA_TYPE">%1$s</xliff:g> දත්ත ස්ථිරවම මකන්න ද?"</string>
+    <string name="on" msgid="8266542510798355807">"ක්‍රියාත්මකයි"</string>
+    <string name="off" msgid="6996623844428550649">"ක්‍රියාවිරහිතයි"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"ප්‍රවේශ වූයේ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"ප්‍රවේශ වූයේ ඊයේ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"ප්‍රවේශ වූයේ <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"සැම විට ඉඩ දෙන්න"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"තෝරා ගැනීමට ඉඩ දෙන්න"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"යෙදුම භාවිත කරන අතරතුර"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"සියල්ල ප්‍රතික්ෂේප කරන්න"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ වීමට ඉඩ දෙන්න ද?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g> වෙත ප්‍රවේශය.\n\nසියල්ලට ඉඩ දීමට හෝ ඒවා තනි තනිව පාලනය කිරීමට තෝරා ගන්න."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට <xliff:g id="DATA_TYPE">%2$s</xliff:g> වෙත ප්‍රවේශයට ඉඩ දෙන්න ද?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"යෝග්‍යතාවය සහ සුවතාවය"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"සෑම විට ම"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"භාවිත කරන අතරේ"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"සෑම විට ම"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"භාවිත කරන අතරේ"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට ඔබේ සියලුම යෝග්‍යතා සහ සුවතා දත්ත වෙත <xliff:g id="ALLOW_MODE">%2$s</xliff:g> ප්‍රවේශ විය හැක"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"ප්‍රවේශ වීමට අවසර ඇත"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"කියවීමට ඉඩ දී ඇත"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"මෙම අවසර ඔබේ උපාංග සංවේදක වලින් දත්ත වෙත <xliff:g id="APP_NAME">%1$s</xliff:g> ප්‍රවේශය ලබා දෙයි."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"යෙදුම් <xliff:g id="NUMBER_0">%1$d</xliff:g>කින් <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>කට ඉඩ දෙන ලදි"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"යෙදුම් කිසිවක් ඉල්ලා නැත"</string>
+    <string name="allowed" msgid="4158456017482263737">"ඉඩ දී ඇත"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"ඉඩ නොදෙයි"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"මෙම අවසරය ඇති යෙදුම් වලට ඔබේ උපාංග සංවේදකවලින් <xliff:g id="DATA_TYPE">%s</xliff:g> දත්ත වෙත ප්‍රවේශ විය හැක."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"ඔබේ ඔරලෝසුවේ ඇති සියලුම යෙදුම් සඳහා <xliff:g id="DATA_TYPE">%s</xliff:g> ප්‍රවේශය ඉවත් කරන්න ද?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"හරි ලකුණ"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"හරස් ලකුණ"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"දැනට, <xliff:g id="APP_NAME">%1$s</xliff:g> හට යෝග්‍යතා සහ සුවතා දත්ත වෙත ප්‍රවේශ විය හැක <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"සැම විට ම යෝග්‍යතා සහ සුවතා දත්ත වෙත <xliff:g id="APP_NAME">%1$s</xliff:g> හට ප්‍රවේශයට ඉඩ දෙන්න ද?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට <xliff:g id="DATA_TYPES">%2$s</xliff:g> වෙත ප්‍රවේශය ඇත."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"යෝග්‍යතා සහ සුවතා අවසර කළමනාකරණය කරන්න"</string>
 </resources>
diff --git a/apk/res/values-sk/strings.xml b/apk/res/values-sk/strings.xml
index a4ef2f5..164ab6e 100644
--- a/apk/res/values-sk/strings.xml
+++ b/apk/res/values-sk/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Spravujte údaje o zdraví a kondícii vo svojom zariadení a ovládajte, ktoré aplikácie k nim majú mať prístup"</string>
     <string name="data_title" msgid="4456619761533380816">"Údaje a prístup"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Prehliadať zdravotné záznamy"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Zobraziť zdravotné záznamy a aplikácie, ktoré k nim majú prístup"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Všetky kategórie"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Zobraziť všetky kategórie"</string>
     <string name="no_data" msgid="1906986019249068659">"Žiadne údaje"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Včera"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Číta: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Zapisuje: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Spravovať povolenia"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Čas: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivita"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"prístup k vašim údajom o zdraví"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Čít. údajov o spál. kalóriách"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Umožňuje aplikáciám čítať údaje o spálených kalóriách"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Prístup k údajom na pozadí"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť prístup k údajom na pozadí?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť prístup k údajom na pozadí?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ak povolíte, táto aplikácia bude mať prístup k údajom o kondícii a zdraví a zdravotným záznamom, keď ju nebudete používať."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ak povolíte, táto aplikácia bude mať prístup k zdravotným záznamom, keď ju nebudete používať."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ak povolíte, táto aplikácia bude mať prístup k údajom o kondícii a zdraví, keď ju nebudete používať."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ak povolíte, táto aplikácia bude mať prístup k údajom Dát o zdraví, keď ju nebudete používať."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť prístup k minulým údajom?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ak povolíte, táto aplikácia bude mať prístup k údajom o kondícii a zdraví pridaným do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ak povolíte, táto aplikácia bude mať prístup k všetkým minulým údajom o kondícii a zdraví."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ak povolíte, táto aplikácia bude mať prístup k údajom Dát o zdraví pridaným do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ak povolíte, táto aplikácia bude mať prístup k všetkým minulým údajom Dát o zdraví."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť ďalší prístup?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje aj prístup k týmto nastaveniam Dát o zdraví"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Prístup k všetkým údajom na pozadí"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Prístup k zdravotným záznamom na pozadí"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Prístup k údajom o kondícii a zdraví na pozadí"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Povoľte tejto aplikácii prístup k údajom o kondícii a zdraví a zdravotným záznamom, keď ju nebudete používať"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Povoľte tejto aplikácii prístup k týmto údajom, keď ju nebudete používať"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Povoľte tejto aplikácii prístup k týmto údajom, keď ju nebudete používať"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Prístup k údajom na pozadí"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Povoľte tejto aplikácii prístup k údajom Dát o zdraví, keď ju nebudete používať"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Prístup k minulým údajom o kondícii a zdraví"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Povoľte tejto aplikácii prístup k údajom pridaným do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Povoľte tejto aplikácii prístup k všetkým minulým údajom"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Prístup k minulým údajom"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Povoľte tejto aplikácii prístup k údajom Dát o zdraví pridaným do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Povoľte tejto aplikácii prístup k všetkým minulým údajom Dát o zdraví"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> už má prístup k minulým údajom vo vašich zdravotných záznamoch"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Ďalšie informácie o povoleniach"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Prístup k všetkým údajom na pozadí"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Prístup k zdravotným záznamom na pozadí"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Prístup k údajom o kondícii a zdraví na pozadí"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Povoľte tejto aplikácii prístup k údajom o kondícii a zdraví a zdravotným záznamom, keď ju nebudete používať"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Povoľte tejto aplikácii prístup k týmto údajom, keď ju nebudete používať"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Povoľte tejto aplikácii prístup k týmto údajom, keď ju nebudete používať"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Prístup k údajom na pozadí"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Povoľte tejto aplikácii prístup k údajom Dát o zdraví, keď ju nebudete používať"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Prístup k minulým údajom o kondícii a zdraví"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Povoľte tejto aplikácii prístup k údajom pridaným do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Povoľte tejto aplikácii prístup k všetkým minulým údajom"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Prístup k minulým údajom"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Povoľte tejto aplikácii prístup k údajom Dát o zdraví pridaným do <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Povoľte tejto aplikácii prístup k všetkým minulým údajom Dát o zdraví"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Momentálne sa nečítajú žiadne údaje o kondícii, pretože <xliff:g id="APP_NAME">%1$s</xliff:g> nemá povolenia na čítanie"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> už má prístup k predchádzajúcim údajom vo vašich zdravotných záznamoch. Ak to chcete zmeniť, vypnite povolenia tejto aplikácie pre zdravotné záznamy."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Spravovať povolenia pre zdravotné záznamy"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Zadajte aspoň jedno povolenie na čítanie, aby mohol byť zapnutý prístup na pozadí alebo prístup k minulým údajom pre túto aplikáciu"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Zadajte aspoň jedno povolenie na čítanie, aby mohol byť zapnutý prístup na pozadí pre túto aplikáciu"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Zadajte aspoň jedno povolenie na čítanie, aby mohol byť zapnutý prístup k minulým údajom pre túto aplikáciu"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Povoľte tejto aplikácii prístup k všetkým minulým údajom Dát o zdraví"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Povoliť tejto aplikácii prístup k údajom Dát o zdraví, keď ju nebudete používať"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ak ho povolíte, táto aplikácia bude mať prístup k údajom Dát o zdraví, keď ju nebudete používať."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Prístup k minulým údajom"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť prístup k minulým údajom?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Povoliť tejto aplikácii prístup k údajom Dát o zdraví pridaným pred <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Povoliť tejto aplikácii prístup k všetkým minulým údajom Dát o zdraví"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ak ho povolíte, táto aplikácia bude mať prístup k údajom Dát o zdraví pridaným pred <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ak ho povolíte, táto aplikácia bude mať prístup k všetkým minulým údajom Dát o zdraví."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Kalórie spálené počas aktivity"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"kalórie spálené počas aktivity"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Čítanie údajov o kalóriách spálených počas aktivity"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"potlačenia invalidného vozíka"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Čítanie údajov o potlačeniach invalidného vozíka"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Zapisovanie údajov o potlačeniach invalidného vozíka"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intenzita aktivity"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intenzita aktivity"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Čítať intenzitu aktivity"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Zapisovať intenzitu aktivity"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Bazálny metabolizmus"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"bazálny metabolizmus"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Čítanie údajov o bazálnom metabolizme"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"teplota pokožky"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Čítať teplotu pokožky"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Zapisovať teplotu pokožky"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Týka sa to všetkých zdravotných záznamov, ktoré sú pridané do Dát o zdraví a synchronizované s nimi. Nemusí to byť váš úplný zdravotný záznam a nemusí obsahovať lekársky opis vašich zdravotných záznamov."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Všetky zdravotné záznamy"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"všetky zdravotné záznamy"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Zapisovať všetky zdravotné záznamy"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergie"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergie"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Čítanie alergií"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunizácia"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunizácia"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Čítať imunizáciu"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratórne výsledky"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratórne výsledky"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Čítať laboratórne výsledky"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergie"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergie"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Čítať údaje o alergiách"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Zdravotné ťažkosti"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"zdravotné ťažkosti"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Čítať zdravotné ťažkosti"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Očkovania"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"očkovania"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Čítať údaje o očkovaniach"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratórne výsledky"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratórne výsledky"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Čítať laboratórne výsledky"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Lieky"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"lieky"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Čítanie údajov o liekoch"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Osobné informácie"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"osobné informácie"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Čítať osobné informácie"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Informácie o lekárovi"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"informácie o lekárovi"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Čítať informácie o lekárovi"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Tehotenstvo"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"tehotenstvo"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Čítať údaje o tehotenstve"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problémy"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problémy"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Čítať problémy"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedúry"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedúry"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Čítať údaje o procedúrach"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sociálna história"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sociálna história"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sociálna história"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Čítať sociálnu históriu"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Životné funkcie"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Údaje o návštevách"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"údaje o návštevách"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Čítať údaje o návštevách"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Životné funkcie"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"životné funkcie"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Čítať údaje o životných funkciách"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Bdelá pozornosť"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Zapisovať údaje bdelej pozornosti"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Povolenie aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> čítať"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Povolenie aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> zapisovať"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Zrušiť"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Povoliť"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Povoliť všetko"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Nepovoliť"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Vyberte údaje, ktoré chcete povoliť tejto aplikácii čítať alebo zapisovať do Dát o zdraví"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Vyberte údaje, ktoré má táto aplikácia čítať z Dát o zdraví alebo do nich zapisovať"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Vyberte údaje, ktoré má táto aplikácia čítať z Dát o zdraví"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Vyberte údaje, ktoré má táto aplikácia zapisovať do Dát o zdraví"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ak udelíte prístup na čítanie, aplikácia bude môcť čítať nové údaje aj údaje z posledných 30 dní"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ak udelíte prístup na čítanie, aplikácia bude môcť čítať nové aj minulé údaje"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Chcete povoliť aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> prístup k Dátam o zdraví?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Spôsob, akým <xliff:g id="APP_NAME">%1$s</xliff:g> spracúva vaše údaje, zistíte v <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> príslušného vývojára"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť prístup k údajom o kondícii a zdraví?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Spôsob, akým aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> spracúva vaše údaje, zistíte v jej <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"pravidlách ochrany súkromia"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Chcete povoliť aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> prístup k vašim zdravotným záznamom?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ak udelíte prístup, aplikácia bude môcť čítať a zapisovať údaje, ako sú alergie, výsledky laboratórnych vyšetrení, očkovania a ďalšie\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ak udelíte prístup, aplikácia bude môcť čítať údaje, ako sú alergie, výsledky laboratórnych vyšetrení, očkovania a ďalšie\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"O zdravotných záznamoch"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Údaje na zdieľanie zahŕňajú"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ak povolíte, <xliff:g id="APP_NAME">%1$s</xliff:g> bude môcť zdieľať vaše zdravotné záznamy s Dátami o zdraví."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synchronizujte svoje zdravotné záznamy z rôznych aplikácií a zdrojov, aby ste ich mali na jednom mieste"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Chcete odstrániť všetky povolenia?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Odstrániť všetky"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať údaje z Dát o zdraví ani ich do nich zapisovať.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón alebo poloha."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať údaje z Dát o zdraví ani ich do nich zapisovať. Týka sa to aj minulých údajov.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako je poloha, kamera alebo mikrofón."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať údaje z Dát o zdraví ani ich do nich zapisovať. Týka sa to aj dát na pozadí a minulých údajov.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako je poloha, kamera alebo mikrofón."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Odstrániť z Dát o zdraví aj údaje aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Chcete odstrániť všetky povolenia?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Odstrániť všetky povolenia týkajúce sa zdravotných záznamov?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Odstrániť všetky povolenia týkajúce sa kondície a zdravia?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Odstrániť z Dát o zdraví aj údaje o kondícii z aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Odstrániť všetky povolenia týkajúce sa zdravotných záznamov?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Odstrániť z Dát o zdraví aj zdravotné záznamy z aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať tieto údaje z Dát o zdraví ani do nich zapisovať.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón či poloha."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať tieto údaje z Dát o zdraví ani do nich zapisovať. Týka sa to aj dát na pozadí.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón či poloha."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať tieto údaje z Dát o zdraví ani do nich zapisovať. Týka sa to aj minulých údajov.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón či poloha."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať tieto údaje z Dát o zdraví ani do nich zapisovať. Týka sa to aj dát na pozadí a minulých údajov.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón či poloha."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Chcete odstrániť všetky povolenia?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať údaje z Dát o zdraví ani do nich zapisovať.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón či poloha."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať údaje z Dát o zdraví ani do nich zapisovať. Týka sa to aj dát na pozadí.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón či poloha."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať údaje z Dát o zdraví ani do nich zapisovať. Týka sa to aj minulých údajov.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón či poloha."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> už nebude môcť čítať údaje z Dát o zdraví ani do nich zapisovať. Týka sa to aj dát na pozadí a minulých údajov.\n\nNeovplyvní to ďalšie povolenia, ktoré táto aplikácia môže mať, ako sú kamera, mikrofón či poloha."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Odstrániť z Dát o zdraví aj údaje o kondícii a zdravotné záznamy pochádzajúce z aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Povolenia pre túto aplikáciu boli odstránené"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Odstrániť aj všetky údaje Dát o zdraví"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Nasledujúci deň"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Vybraný deň"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Predchádzajúci deň"</string>
     <string name="default_error" msgid="7966868260616403475">"Niečo sa pokazilo. Skúste to znova."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Neznámy zdroj"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Zdrojové údaje"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Ľavá zátvorka."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Pravá zátvorka."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Hodnota poľa <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Tieto aplikácie už nemajú prístup, ale stále majú údaje uložené v Dátach o zdraví"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> môže čítať údaje pridané po <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Ak chcete spravovať ďalšie povolenia pre Android pre túto aplikáciu, prejdite do sekcie Nastavenia &gt; Aplikácie"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Údaje, ktoré zdieľate s aplikáciou <xliff:g id="APP_NAME">%1$s</xliff:g>, sa riadia vlastnými pravidlami ochrany súkromia"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"V pravidlách ochrany súkromia príslušného vývojára zistíte, ako aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> narába s vašimi údajmi"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Ak chcete spravovať ďalšie povolenia pre Android, ku ktorým má táto aplikácia prístup, prejdite do sekcie Nastavenia a potom Aplikácie"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Zobraziť pravidlá ochrany súkromia"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Použité v posledných 24 hodinách"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Prístup aplikácie"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Momentálne nemáte nainštalované žiadne kompatibilné aplikácie"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Dodatočný prístup"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Minulé dáta, dáta na pozadí"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Tejto aplikácii boli odstránené ďalšie povolenia"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Povolenia"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Kondícia a kvalita života"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Cvičenie, spánok, výživa a podobne"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Zdravotné záznamy"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"zdravotné záznamy"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab. výsledky, lieky, imunizácie a pod."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Labor. výsledky, lieky, očkovania atď."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Odstránené povolenia aplikácií"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Dáta o zdraví odstránili povolenia pre aplikáciu <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Dáta o zdraví odstránili povolenia pre aplikácie <xliff:g id="APP_DATA_0">%1$s</xliff:g> a <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Prejsť do Obchodu Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Začíname s Dátami o zdraví"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Dáta o zdraví uchovávajú vaše údaje o zdraví a kondícii a umožňujú vám jednoducho synchronizovať rôzne aplikácie v zariadení"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Dáta o zdraví uchovávajú vaše údaje o zdraví a kondícii z rôznych aplikácií a synchronizujú ich v týchto aplikáciách.\n\n"<b>"Údaje o kondícii a celkovej pohode"</b>" vrátane relácií cvičení, krokov, výživy, spánku a ďalších.\n\n"<b>"Zdravotné záznamy"</b>" vrátane údajov o očkovaniach, laboratórnych výsledkov a ďalších."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Pomocou Dát o zdraví môžete"</string>
     <string name="share_data" msgid="3481932156368883946">"Zdieľanie údajov s aplikáciami"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Vyberte, ktoré údaje budú môcť jednotlivé aplikácie v Dátach o zdraví čítať alebo zapisovať"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Správa nastavení a ochrany súkromia"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Slabá menštruácia"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Stredne silná menštruácia"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Silná menštruácia"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Neznáme krvácanie"</string>
     <string name="period_day" msgid="3821944462093965882">"Deň menštruácie: <xliff:g id="DAY">%1$d</xliff:g> z <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menštruácia (1 deň)}few{Menštruácia (# dni)}many{Menštruácia (# dňa)}other{Menštruácia (# dní)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitívny"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatívny"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Vysoká"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Hudba"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Iné"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Bez sprievodcu"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Stredná"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intenzívna"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integruje sa"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Dáta o zdraví sa integrujú so systémom Android.\n\nPrenos vašich údajov a povolení môže chvíľu trvať."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Nezatvárajte aplikáciu, kým nedostanete upozornenie, že proces je dokončený."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Dáta o zdraví sa integrujú"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Vyžaduje sa aktualizácia"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Dáta o zdraví sa integrujú so systémom Android, aby ste k nim mali prístup priamo z nastavení."</string>
     <string name="update_button" msgid="4544529019832009496">"Aktualizovať"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Spustite túto aktualizáciu, aby mohla pokračovať integrácia Dát o zdraví s nastaveniami systému"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Aktualizovať"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Vyžaduje sa aktualizácia systému"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Než budete pokračovať, aktualizujte systém telefónu."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ak ste systém telefónu už aktualizovali, skúste telefón reštartovať a pokračujte v integrácii"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Vyžaduje sa aktualizácia Dát o zdraví"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Než budete pokračovať, aktualizujte aplikáciu Dáta o zdraví na najnovšiu verziu."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Vyžaduje sa viac priestoru"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Dáta o zdraví vyžadujú, aby bolo v telefóne <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> priestoru, inak nebude možné v integrácii pokračovať.\n\nUvoľnite v telefóne priestor a skúste to znova."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Skúsiť znova"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Uvoľniť priestor"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Vyžaduje sa viac priestoru"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Dáta o zdraví vyžadujú, aby bolo v telefóne <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> priestoru, inak nebude možné v integrácii pokračovať."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrácia bola pozastavená"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikácia Dáta o zdraví sa počas integrácie so systémom Android zavrela.\n\nKliknutím na Obnoviť ju znova otvorte a pokračujte v prenose svojich údajov a povolení."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Ak si chcete svoje údaje Dát o zdraví ponechať, vykonajte tento krok do <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Klepnutím pokračujte v integrácii Dát o zdraví so systémom Android. Ak si chcete svoje údaje ponechať, vykonajte tento krok do <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Klepnutím pokračujte v integrácii Dát o zdraví so systémom Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Pokračovať"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Obnovte integráciu Dát o zdraví"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Ak si chcete svoje údaje ponechať, vykonajte tento krok do <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Vyžaduje sa aktualizácia aplikácie"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Ak chcete, aby sa údaje s Dátami o zdraví naďalej synchronizovali, musíte aktualizovať aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Ak chcete, aby sa údaje s Dátami o zdraví naďalej synchronizovali, musíte niektoré aplikácie aktualizovať"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Ak chcete, aby sa údaje s Dátami o zdraví naďalej synchronizovali, musíte aktualizovať aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>. Aktualizácie nemusia byť k dispozícii pre všetky aplikácie."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Ak chcete, aby sa údaje s Dátami o zdraví naďalej synchronizovali, musíte niektoré aplikácie aktualizovať. Aktualizácie nemusia byť k dispozícii pre všetky aplikácie."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Skontrolovať dostupnosť aktualizácií"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Ďalšie informácie"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integrácia Dát o zdraví"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integrácia Dát o zdraví nebola dokončená"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Keď bude znova k dispozícii, dostanete upozornenie."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Dobre"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integrácia Dát o zdraví nebola dokončená"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Ďalšie informácie"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integrácia Dát o zdraví je dokončená"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Otvoriť"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novinky"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Teraz máte prístup k Dátam o zdraví priamo v nastaveniach. Aplikáciu Dáta o zdraví môžete kedykoľvek aktualizovať a uvoľniť tak priestor."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Dobre"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Upraviť zdroje aplikácií"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Predvolená aplikácia zariadenia"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Dáta aplikácie"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Údaje z aplikácií s prístupom k Dátam o zdraví sa budú zobrazovať tu"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Tu sa budú zobrazovať údaje z aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Tu sa budú zobrazovať údaje z aplikácií s prístupom k Dátam o zdraví"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Deň"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Týždeň"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mesiac"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Minulý mesiac"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Vstupy"</string>
     <string name="tab_access" msgid="7818197975407243701">"Prístup"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť ďalší prístup?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje aj prístup k týmto nastaveniam Dát o zdraví"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Zadajte aspoň jedno povolenie na čítanie, aby mohol byť zapnutý prístup na pozadí alebo prístup k minulým údajom pre túto aplikáciu"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Zadajte aspoň jedno povolenie na čítanie, aby mohol byť zapnutý prístup na pozadí pre túto aplikáciu"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Zadajte aspoň jedno povolenie na čítanie, aby mohol byť zapnutý prístup k minulým údajom pre túto aplikáciu"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Začnite používať Dáta o zdraví"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synchronizujte svoje prvé aplikácie a zdieľajte medzi nimi údaje o zdraví a kondícii"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Nastaviť"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Zobrazenie kompatibilných aplikácií"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Nájdite ďalšie aplikácie na synchronizáciu s aplikáciou <xliff:g id="APP_NAME">%s</xliff:g> prostredníctvom Dát o zdraví"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Zobraziť v obchode s aplikáciami"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Nastavte zámku obrazovky"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Zvýšte zabezpečenie svojich zdravotných dát nastavením kódu PIN, vzoru alebo hesla pre toto zariadenie"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Nastaviť zámku obrazovky"</string>
     <string name="select_all" msgid="837499881590001166">"Vybrať všetko"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Pripojené aplikácie už nebudú môcť čítať tieto údaje z Dát o zdraví"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Začiarknuté"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nezačiarknuté"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Mapa trasy cvičenia je k dispozícii"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Ďalší deň"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Ďalší týždeň"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Ďalší mesiac"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Predchádzajúci deň"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Predchádzajúci týždeň"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Predchádzajúci mesiac"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Chcete natrvalo odstrániť všetky údaje?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Chcete natrvalo odstrániť vybrané údaje?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Chcete natrvalo odstrániť všetky údaje aplikácie <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Chcete natrvalo odstrániť vybrané záznamy aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g> z týždňa <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Chcete natrvalo odstrániť vybrané záznamy aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g> z mesiaca <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Chcete tento záznam aplikácie <xliff:g id="APP_NAME">%s</xliff:g> natrvalo odstrániť?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Chcete natrvalo odstrániť údaje (<xliff:g id="DATA_TYPE">%1$s</xliff:g>) aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Zapnuté"</string>
+    <string name="off" msgid="6996623844428550649">"Vypnuté"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Posledný prístup: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Otvorené včera <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Otvorené <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Povoliť vždy"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Povoliť vybrané"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Počas používania aplikácie"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Odmietnuť všetko"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť prístup k údajom o kondícii a zdraví?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> žiada o prístup k údajom typu <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nUdeľte všetky povolenia alebo ich ovládajte individuálne."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Chcete povoliť aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> prístup k údajom typu <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Kondícia a kvalita života"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"po celý čas"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"počas používania"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Po celý čas"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Počas používania"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> má prístup k všetkým vašim údajom o kondícii a kvalite života <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Má povolený prístup"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Má povolené čítať"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Tieto povolenia poskytujú aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> prístup k údajom zo senzorov vášho zariadenia."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Povolené aplikácie: <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Žiadne žiadajúce aplikácie"</string>
+    <string name="allowed" msgid="4158456017482263737">"Povolené"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nepovolené"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikácie s týmto povolením majú prístup k údajom typu <xliff:g id="DATA_TYPE">%s</xliff:g> zo senzorov vášho zariadenia."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Chcete odstrániť prístup k údajom typu <xliff:g id="DATA_TYPE">%s</xliff:g> všetkým aplikáciám v hodinkách?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Značka začiarknutia"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Krížik"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Momentálne má aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> prístup k údajom o kondícii a zdraví <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Chcete aplikácii <xliff:g id="APP_NAME">%1$s</xliff:g> povoliť nepretržitý prístup k údajom o kondícii a zdraví?"</string>
+    <string name="current_access" msgid="1457167070428176139">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> má prístup k údajom typu <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Spravovať povolenia týkajúce sa kondície a zdravia"</string>
 </resources>
diff --git a/apk/res/values-sl/strings.xml b/apk/res/values-sl/strings.xml
index 2d7e9b5..35d601c 100644
--- a/apk/res/values-sl/strings.xml
+++ b/apk/res/values-sl/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Upravljajte podatke o zdravju in telesni pripravljenosti v napravi ter nadzirajte, katere aplikacije lahko dostopajo do njih"</string>
     <string name="data_title" msgid="4456619761533380816">"Podatki in dostop"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Prebrskajte zdravstvene evidence"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Ogled zdravstvenih evidenc in seznama aplikacij, ki lahko dostopajo do njih"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Vse kategorije"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Pokaži vse kategorije"</string>
     <string name="no_data" msgid="1906986019249068659">"Ni podatkov"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Včeraj"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Branje: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Pisanje: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Upravljanje dovoljenj"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Čas: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Dejavnost"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"dostop do podatkov o zdravju"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Branje porabljenih kalorij"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Aplikaciji omogoča branje porabljenih kalorij"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Dostop do podatkov v ozadju"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti dostop do podatkov v ozadju?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti dostop do podatkov v ozadju?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Če to dovolite, lahko ta aplikacija dostopa do podatkov o telesni pripravljenosti in počutju ter do zdravstvenih evidenc, ko ne uporabljate te aplikacije."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Če to dovolite, lahko ta aplikacija dostopa do zdravstvenih evidenc, ko ne uporabljate te aplikacije."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Če to dovolite, lahko ta aplikacija dostopa do podatkov o telesni pripravljenosti in počutju, ko ne uporabljate te aplikacije."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Če to dovolite, lahko ta aplikacija dostopa do podatkov storitve Health Connect, ko ne uporabljate te aplikacije."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti dostop do preteklih podatkov?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Če to dovolite, lahko ta aplikacija dostopa do podatkov o telesni pripravljenosti in počutju, ki so bili dodani pred dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Če to dovolite, lahko ta aplikacija dostopa do vseh preteklih podatkov o telesni pripravljenosti in počutju."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Če to dovolite, lahko ta aplikacija dostopa do podatkov storitve Health Connect, ki so bili dodani pred dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Če to dovolite, lahko ta aplikacija dostopa do vseh preteklih podatkov storitve Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Želite dovoliti dodaten dostop za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> želi dostopati tudi do teh nastavitev za Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Dostop do vseh podatkov v ozadju"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Dostop do zdravstvenih evidenc v ozadju"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Dostop do podatkov o telesni pripravljenosti in počutju v ozadju"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Tej aplikaciji dovolite dostop do podatkov o telesni pripravljenosti in počutju ter do zdravstvenih evidenc, ko ne uporabljate te aplikacije"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Tej aplikaciji dovolite dostop do teh podatkov, ko ne uporabljate te aplikacije"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Tej aplikaciji dovolite dostop do teh podatkov, ko ne uporabljate te aplikacije"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Dostop do podatkov v ozadju"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Tej aplikaciji dovolite dostop do podatkov storitve Health Connect, ko ne uporabljate te aplikacije"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Dostop do preteklih podatkov o telesni pripravljenosti in počutju"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Tej aplikaciji dovolite dostop do podatkov, dodanih pred dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Tej aplikaciji dovolite dostop do vseh preteklih podatkov"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Dostop do preteklih podatkov"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Tej aplikaciji dovolite dostop do podatkov storitve Health Connect, ki so bili dodani pred dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Tej aplikaciji dovolite dostop do vseh preteklih podatkov storitve Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> že lahko dostopa do preteklih podatkov zdravstvenih evidenc"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Preberite več o dovoljenjih"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Dostop do vseh podatkov v ozadju"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Dostop do zdravstvenih evidenc v ozadju"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Dostop do podatkov o telesni pripravljenosti in počutju v ozadju"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Tej aplikaciji dovolite dostop do podatkov o telesni pripravljenosti in počutju ter do zdravstvenih evidenc, ko ne uporabljate te aplikacije"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Tej aplikaciji dovolite dostop do teh podatkov, ko ne uporabljate te aplikacije"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Tej aplikaciji dovolite dostop do teh podatkov, ko ne uporabljate te aplikacije"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Dostop do podatkov v ozadju"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Tej aplikaciji dovolite dostop do podatkov storitve Health Connect, ko ne uporabljate te aplikacije"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Dostop do preteklih podatkov o telesni pripravljenosti in počutju"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Tej aplikaciji dovolite dostop do podatkov, dodanih pred dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Tej aplikaciji dovolite dostop do vseh preteklih podatkov"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Dostop do preteklih podatkov"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Tej aplikaciji dovolite dostop do podatkov storitve Health Connect, ki so bili dodani pred dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Tej aplikaciji dovolite dostop do vseh preteklih podatkov storitve Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Trenutno se ne berejo nobeni podatki o telesni pripravljenosti, ker aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> nima vklopljenih dovoljenj za branje"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> že lahko dostopa do preteklih podatkov zdravstvenih evidenc. Če želite to spremeniti, izklopite dovoljenja za zdravstveno evidenco za to aplikacijo."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Upravljanje dovoljenj za zdravstveno evidenco"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Omogočite vsaj eno dovoljenje za branje, če želite za to aplikacijo vklopiti dostop iz ozadja ali dostop do preteklih podatkov"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Omogočite vsaj eno dovoljenje za branje, če želite za to aplikacijo vklopiti dostop iz ozadja"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Omogočite vsaj eno dovoljenje za branje, če želite za to aplikacijo vklopiti dostop do preteklih podatkov"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Tej aplikaciji dovolite dostop do vseh preteklih podatkov storitve Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Tej aplikaciji dovolite dostop do podatkov storitve Health Connect, ko ne uporabljate te aplikacije"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Če to dovolite, lahko ta aplikacija dostopa do podatkov storitve Health Connect, ko ne uporabljate te aplikacije."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Dostop do preteklih podatkov"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti dostop do preteklih podatkov?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Tej aplikaciji dovolite dostop do podatkov storitve Health Connect, ki so bili dodani pred dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Tej aplikaciji dovolite dostop do vseh preteklih podatkov storitve Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Če to dovolite, lahko ta aplikacija dostopa do podatkov storitve Health Connect, ki so bili dodani pred dnem <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Če to dovolite, lahko ta aplikacija dostopa do vseh preteklih podatkov storitve Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Porabljene kalorije med dejavnostjo"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"porabljene kalorije med dejavnostjo"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Branje porabljenih kalorij med dejavnostjo"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"število potiskov invalidskega vozička"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Branje števila potiskov invalidskega vozička"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Zapisovanje števila potiskov invalidskega vozička"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intenzivnost dejavnosti"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intenzivnost dejavnosti"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Branje intenzivnosti dejavnosti"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Zapisovanje intenzivnosti dejavnosti"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Stopnja bazalnega metabolizma"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"stopnja bazalnega metabolizma"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Branje stopnje bazalnega metabolizma"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura kože"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Branje temperature kože"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Zapisovanje temperature kože"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"To vključuje vse zdravstvene evidence, sinhronizirane s storitvijo Health Connect in dodane vanjo. To morda ne obsega vaše celotne zdravstvene kartoteke in to ne vključuje medicinskega opisa vaših zdravstvenih evidenc."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Vse zdravstvene evidence"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"vse zdravstvene evidence"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Zapisovanje vseh zdravstvenih evidenc"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergije"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergije"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Branje podatkov o alergijah"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Cepljenje"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"cepljenje"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Branje podatkov o cepljenju"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorijski izvidi"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorijski izvidi"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Branje laboratorijskih izvidov"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergije"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergije"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Branje podatkov o alergijah"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Zdravstvena stanja"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"zdravstvena stanja"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Branje zdravstvenih stanj"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Cepiva"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"cepiva"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Branje podatkov o cepivih"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratorijski izvidi"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratorijski izvidi"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Branje laboratorijskih izvidov"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Zdravila"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"zdravila"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Branje podatkov o zdravilih"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Osebni podatki"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"osebni podatki"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Branje osebnih podatkov"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Podrobnosti o izvajalcu"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"podrobnosti o izvajalcu"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Branje podrobnosti o izvajalcu"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Nosečnost"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"nosečnost"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Branje podatkov o nosečnosti"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Težave"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"težave"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Branje podatkov o težavah"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Posegi"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"posegi"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Branje podatkov o posegih"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Zgodovina družabnih stikov"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Zgodovina o družabnem življenju"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"zgodovina družabnih stikov"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Branje zgodovine družabnih stikov"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitalni znaki"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Obiski"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"obiski"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Branje podatkov o obiskih"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Življenjski znaki"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitalni znaki"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Branje vitalnih znakov"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Čuječnost"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Zapisovanje podatkov o čuječnosti"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Dovoljevanje branja aplikaciji »<xliff:g id="APP_NAME">%1$s</xliff:g>«"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Dovoljevanje pisanja aplikaciji »<xliff:g id="APP_NAME">%1$s</xliff:g>«"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Prekliči"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Dovoli"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Dovoli vse"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ne dovoli"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Izberite, katere podatke lahko ta aplikacija bere ali zapisuje v storitvi Health Connect."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Izberite, katere podatke lahko ta aplikacija bere ali zapisuje v storitvi Health Connect."</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Izberite, katere podatke lahko ta aplikacija bere v storitvi Health Connect."</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Izberite, katere podatke lahko ta aplikacija zapisuje v storitvi Health Connect."</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Če odobrite dostop za branje, lahko aplikacija bere nove podatke in podatke za zadnjih 30 dni"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Če odobrite dostop za branje, lahko aplikacija bere nove in pretekle podatke"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti, da dostopa do storitve Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Preberete lahko <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> razvijalca, da ugotovite, kako <xliff:g id="APP_NAME">%1$s</xliff:g> ravna z vašimi podatki."</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti dostop do podatkov o telesni pripravljenosti in počutju?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Preberete lahko <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>, da ugotovite, kako ravna z vašimi podatki"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"pravilnik o zasebnosti"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti dostop do zdravstvenih evidenc?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Če odobrite dostop, lahko aplikacija bere in zapisuje podatke, kot so alergije, laboratorijski izvidi, cepiva in drugo\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Če odobrite dostop, lahko aplikacija bere podatke, kot so alergije, laboratorijski izvidi, cepiva in drugo\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"O zdravstvenih evidencah"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Podatki za deljenje vključujejo naslednje"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Če to dovolite, lahko aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> deli vaše zdravstvene evidence s storitvijo Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sinhronizirajte zdravstvene podatke iz različnih aplikacij in virov, da bodo na enem mestu"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Želite odstraniti vsa dovoljenja?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Odstrani vse"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati podatkov storitve Health Connect.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati podatkov storitve Health Connect, vključno s preteklimi podatki.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za lokacijo, fotoaparat ali mikrofon."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati podatkov storitve Health Connect, vključno s prenosom podatkov v ozadju in preteklimi podatki.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za lokacijo, fotoaparat ali mikrofon."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Iz storitve Health Connect izbriši tudi podatke aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Želite odstraniti vsa dovoljenja?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Želite odstraniti vsa dovoljenja za zdravstveno evidenco?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Želite odstraniti vsa dovoljenja za telesno pripravljenost in dobro počutje?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Iz storitve Health Connect izbriši tudi podatke o telesni pripravljenosti v aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Želite odstraniti vsa dovoljenja za zdravstveno evidenco?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Iz storitve Health Connect izbriši tudi zdravstvene evidence v aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati teh podatkov storitve Health Connect.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati teh podatkov storitve Health Connect, vključno s prenosom podatkov v ozadju.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati teh podatkov storitve Health Connect, vključno s preteklimi podatki.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati teh podatkov storitve Health Connect, vključno s prenosom podatkov v ozadju in preteklimi podatki.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Želite odstraniti vsa dovoljenja?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati podatkov storitve Health Connect.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati podatkov storitve Health Connect, vključno s prenosom podatkov v ozadju.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati podatkov storitve Health Connect, vključno s preteklimi podatki.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne bo več mogla brati ali zapisovati podatkov storitve Health Connect, vključno s prenosom podatkov v ozadju in preteklimi podatki.\n\nTo ne vpliva na druga dovoljenja, ki jih morda ima ta aplikacija, na primer za fotoaparat, mikrofon ali lokacijo."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Iz storitve Health Connect izbriši tudi podatke o telesni pripravljenosti in zdravstvene evidence v aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Dovoljenja za to aplikacijo so bila odstranjena"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Izbriši tudi vse podatke storitve Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Naslednji dan"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Izbrani dan"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Prejšnji dan"</string>
     <string name="default_error" msgid="7966868260616403475">"Prišlo je do napake. Poskusite znova."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Neznano sredstvo"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Izvorni podatki"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Zaviti uklepaj."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Zaviti zaklepaj."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Vrednost polja <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Te aplikacije nimajo več dostopa, njihovi podatki pa so še vedno shranjeni v storitvi Health Connect."</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> lahko bere podatke, dodane po dnevu <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>."</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Za upravljanje drugih dovoljenj za Android, do katerih ima ta aplikacija dostop, odprite »Nastavitve« &gt; »Aplikacije«."</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Za podatke, ki jih delite z aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>, velja pravilnik o zasebnosti za to aplikacijo."</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"V pravilniku o zasebnosti razvijalca lahko preberete, kako aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ravna z vašimi podatki."</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Če želite upravljati druga dovoljenja za Android, do katerih lahko dostopa ta aplikacija, odprite nastavitve in se dotaknite možnosti »Aplikacije«."</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Preberite pravilnik o zasebnosti"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Dostop v zadnjih 24 urah"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Dostop aplikacije"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Trenutno nimate nameščene nobene združljive aplikacije."</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Dodatni dostop"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Pretekli podatki, podatki v ozadju"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Dodatna dovoljenja za to aplikacijo so odstranjena"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Dovoljenja"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Telesna pripravljenost in dobro počutje"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Vadba, spanje, prehrana in drugo"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Zdravstvene evidence"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"zdravstvene evidence"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Izvidi, zdravila, cepljenja in drugo"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Laboratorijski Izvidi, zdravila, cepiva in drugo"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Odstranjena dovoljenja za aplikacije"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Storitev Health Connect je odstranila dovoljenja za aplikacijo <xliff:g id="APP_DATA">%s</xliff:g>."</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Storitev Health Connect je odstranila dovoljenja za aplikaciji <xliff:g id="APP_DATA_0">%1$s</xliff:g> in <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>."</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Odpri Trgovino Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Začetek uporabe storitve Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect shranjuje vaše podatke o zdravju in telesni pripravljenosti ter vam omogoča, da na preprost način sinhronizirate različne aplikacije v napravi."</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect shranjuje in sinhronizira podatke o zdravju in telesni pripravljenosti iz različnih aplikacij.\n\n"<b>"Podatke o telesni pripravljenosti in počutju,"</b>" vključno s treningi, koraki, prehrano, spanjem in drugimi podatki.\n\n"<b>"Zdravstvene evidence,"</b>" vključno s cepivi, laboratorijskimi izvidi in drugimi podatki."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect vam omogoča naslednje:"</string>
     <string name="share_data" msgid="3481932156368883946">"Deljenje podatkov z aplikacijami"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Izberite, katere podatke lahko aplikacije berejo ali zapisujejo v storitvi Health Connect."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Upravljanje nastavitev in zasebnosti"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Šibka krvavitev"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Srednja krvavitev"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Močna krvavitev"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Neznan tok"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="DAY">%1$d</xliff:g>. dan menstruacije od <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Menstruacija (1 dan)}one{Menstruacija (# dan)}two{Menstruacija (# dneva)}few{Menstruacija (# dni)}other{Menstruacija (# dni)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitivno"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativno"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Visoko"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Glasba"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Drugo"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Nevodeno"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Zmerno"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Intenzivno"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> min"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integracija je v teku"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Aplikacijo Health Connect bomo integrirali s sistemom Android.\n\nPrenos podatkov in dovoljenj lahko traja nekaj časa."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ne zaprite aplikacije, dokler ne prejmete obvestila o končanem postopku."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integracija aplikacije Health Connect je v teku"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Potrebna je posodobitev"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Aplikacijo Health Connect integriramo s sistemom Android, da boste do nje lahko dostopali neposredno v nastavitvah."</string>
     <string name="update_button" msgid="4544529019832009496">"Posodobi"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Začnite to posodobitev, da bo aplikacija Health Connect lahko nadaljevala integracijo s sistemskimi nastavitvami."</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Posodobite zdaj"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Potrebna je posodobitev sistema"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Pred nadaljevanjem posodobite sistem telefona."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Če ste že posodobili sistem telefona, poskusite znova zagnati telefon, da boste nadaljevali integracijo."</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Posodobiti morate Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Pred nadaljevanjem posodobite aplikacijo Health Connect na najnovejšo različico."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Potrebnega je več prostora"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect za nadaljevanje integracije potrebuje <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> prostora za shranjevanje v telefonu.\n\nSprostite nekaj prostora v telefonu in poskusite znova."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Poskusi znova"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Sprostite prostor"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Potrebnega je več prostora"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect za nadaljevanje integracije potrebuje <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> prostora za shranjevanje v telefonu."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integracija je začasno zaustavljena"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikacija Health Connect se je zaprla med integracijo s sistemom Android.\n\nKliknite »Nadaljuj«, da znova odprete aplikacijo ter nadaljujete s prenosom podatkov in dovoljenj."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Če želite obdržati podatke aplikacije Health Connect, to dokončajte v tem času: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Dotaknite se za nadaljevanje integracije aplikacije Health Connect s sistemom Android. Če želite obdržati podatke, to dokončajte v tem času: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Dotaknite se za nadaljevanje integracije aplikacije Health Connect s sistemom Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Nadaljuj"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Nadaljujte integracijo aplikacije Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Če želite obdržati podatke, to dokončajte v tem času: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Posodobiti morate aplikacijo"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g> je treba posodobiti, da se bo še naprej sinhronizirala z aplikacijo Health Connect."</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Nekatere aplikacije je treba posodobiti, da se bodo še naprej sinhronizirale z aplikacijo Health Connect."</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g> je treba posodobiti, da se bo še naprej sinhronizirala s storitvijo Health Connect. Posodobitve morda niso na voljo za vse aplikacije."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Nekatere aplikacije je treba posodobiti, da se bodo še naprej sinhronizirale s storitvijo Health Connect. Posodobitve morda niso na voljo za vse aplikacije."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Preverite, ali so na voljo posodobitve"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Več o tem"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integracija aplikacije Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integracija aplikacije Health Connect se ni dokončala"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Ko bo znova na voljo, boste prejeli obvestilo."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Razumem"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integracija aplikacije Health Connect se ni dokončala"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Več o tem"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integracija aplikacije Health Connect je dokončana"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Odpri"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Novosti"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Do aplikacije Health Connect lahko zdaj dostopate neposredno v nastavitvah. Aplikacijo Health Connect lahko kadar koli odmestite, da sprostite prostor za shranjevanje."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Razumem"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Urejanje virov aplikacij"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Privzeta aplikacija v napravi"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Podatki aplikacije"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Podatki iz aplikacij z dostopom do aplikacije Health Connect bodo prikazani tukaj"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Podatki iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> bodo prikazani tukaj"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Podatki iz aplikacij z dostopom do storitve Health Connect bodo prikazani tukaj"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dan"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Teden"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mesec"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Prejšnji mesec"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Vnosi"</string>
     <string name="tab_access" msgid="7818197975407243701">"Dostop"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Želite dovoliti dodaten dostop za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> želi dostopati tudi do teh nastavitev za Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Omogočite vsaj eno dovoljenje za branje, če želite za to aplikacijo vklopiti dostop iz ozadja ali dostop do preteklih podatkov"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Omogočite vsaj eno dovoljenje za branje, če želite za to aplikacijo vklopiti dostop iz ozadja"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Omogočite vsaj eno dovoljenje za branje, če želite za to aplikacijo vklopiti dostop do preteklih podatkov"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Začnite uporabljati storitev Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinhronizirajte prve aplikacije, da boste med njimi delili podatke o zdravju in telesni pripravljenosti"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Nastavi"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Oglejte si združljive aplikacije"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Poiščite več aplikacij za sinhronizacijo z aplikacijo <xliff:g id="APP_NAME">%s</xliff:g> prek storitve Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Prikaži v trgovini z aplikacijami"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Nastavitev zaklepanja zaslona"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Za večjo varnost zdravstvenih podatkov nastavite kodo PIN, vzorec ali geslo za to napravo"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Nastavite zaklepanje zaslona"</string>
     <string name="select_all" msgid="837499881590001166">"Izberi vse"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Povezane aplikacije ne bodo več mogle brati teh podatkov v storitvi Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Potrjeno"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nepotrjeno"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Na voljo je vadbena pot na zemljevidu"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Naslednji dan"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Naslednji teden"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Naslednji mesec"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Prejšnji dan"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Prejšnji teden"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Prejšnji mesec"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Ali želite trajno izbrisati vse podatke?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Ali želite trajno izbrisati izbrane podatke?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Ali želite trajno izbrisati vse podatke aplikacije <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Ali želite trajno izbrisati izbrane vnose aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> za teden od dne <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Ali želite trajno izbrisati izbrane vnose aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> za mesec <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Ali želite trajno izbrisati ta vnos aplikacije <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Ali želite trajno izbrisati podatke vrste »<xliff:g id="DATA_TYPE">%1$s</xliff:g>« za aplikacijo <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Vklopljeno"</string>
+    <string name="off" msgid="6996623844428550649">"Izklopljeno"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Zadnji dostop: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Zadnji dostop včeraj: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Zadnji dostop: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Vedno dovoli"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Dovoli izbrano"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Med uporabo aplikacije"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Zavrni vse"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti dostop do podatkov o telesni pripravljenosti in počutju?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dostop do teh vrst podatkov: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nDovolite vse ali jih upravljajte posamezno."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Ali aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovolite dostop do dovoljenja »<xliff:g id="DATA_TYPE">%2$s</xliff:g>«?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Telesna pripravljenost in dobro počutje"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ves čas"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"med uporabo"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Ves čas"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Med uporabo"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> lahko do vseh vaših podatkov o telesni pripravljenosti in počutju dostopa <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Dovoljen dostop"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Dovoljeno branje"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ta dovoljenja aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> omogočajo dostop do podatkov iz tipal naprave."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Dovoljene aplikacije: <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Nobena aplikacija ne zahteva"</string>
+    <string name="allowed" msgid="4158456017482263737">"Dovoljeno"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Ni dovoljeno"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikacije s tem dovoljenjem lahko dostopajo do podatkov iz tipal naprave za: <xliff:g id="DATA_TYPE">%s</xliff:g>."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Želite odstraniti dostop do dovoljenja »<xliff:g id="DATA_TYPE">%s</xliff:g>« za vse aplikacije v uri?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Kljukica"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Križec"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Trenutno lahko aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="ALLOW_MODE">%2$s</xliff:g> dostopa do podatkov o telesni pripravljenosti in počutju"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Želite aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> dovoliti stalen dostop do podatkov o telesni pripravljenosti in počutju?"</string>
+    <string name="current_access" msgid="1457167070428176139">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ima dostop do teh vrst podatkov: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Upravljanje dovoljenj za podatke o telesni pripravljenosti in počutju"</string>
 </resources>
diff --git a/apk/res/values-sq/strings.xml b/apk/res/values-sq/strings.xml
index 37fdc2e..1d9bf39 100644
--- a/apk/res/values-sq/strings.xml
+++ b/apk/res/values-sq/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Menaxho të dhënat e shëndetit dhe të fitnesit në pajisjen tënde dhe kontrollo se cilat aplikacione mund të kenë qasje në to"</string>
     <string name="data_title" msgid="4456619761533380816">"Të dhënat dhe qasja"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Shfleto të dhënat shëndetësore"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Shiko të dhënat e tua shëndetësore dhe se cilat aplikacione mund të qasen në to"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Të gjitha kategoritë"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Shiko të gjitha kategoritë"</string>
     <string name="no_data" msgid="1906986019249068659">"Nuk ka të dhëna"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Dje"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Lexon: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Shkruan te: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Menaxho lejet"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Koha: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktiviteti"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"të ketë qasje te të dhënat e tua të shëndetit"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Të lexojë kaloritë e djegura"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Lejon aplikacionin që të lexojë kaloritë e djegura"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Të ketë qasje te të dhënat në sfond"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Të lejohet që <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te të dhënat në sfond?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Të lejohet që <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te të dhënat në sfond?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Nëse e lejon, ky aplikacion mund të ketë qasje te të dhënat e fitnesit dhe të mirëqenies dhe te të dhënat shëndetësore kur ti nuk e përdor aplikacionin."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Nëse e lejon, ky aplikacion mund të ketë qasje te të dhënat shëndetësore kur ti nuk e përdor aplikacionin."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Nëse e lejon, ky aplikacion mund të ketë qasje te të dhënat e fitnesit dhe mirëqenies kur ti nuk e përdor aplikacionin."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Nëse e lejon, ky aplikacion mund të ketë qasje te të dhënat e Health Connect kur ti nuk e përdor aplikacionin"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Të lejohet që <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te të dhënat e kaluara?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Nëse e lejon, ky aplikacion mund të ketë qasje te të dhënat e fitnesit dhe mirëqenies që janë shtuar para datës <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Nëse e lejon, ky aplikacion mund të ketë qasje te të gjitha të dhënat e kaluara të fitnesit dhe mirëqenies."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Nëse e lejon, ky aplikacion mund të ketë qasje te të dhënat e Health Connect që janë shtuar para datës <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Nëse e lejon, ky aplikacion mund të ketë qasje te të gjitha të dhënat e kaluara të Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Të lejohet qasja shtesë për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> dëshiron gjithashtu që të ketë qasje te këto cilësime të Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Të qaset te të gjitha të dhënat në sfond"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Të qaset te të dhënat shëndetësore në sfond"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Të qaset te të dhënat e fitnesit dhe mirëqenies në sfond"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Lejo që ky aplikacion të ketë qasje te të dhënat e fitnesit dhe mirëqenies dhe te të dhënat shëndetësore kur ti nuk e përdor aplikacionin"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Lejo që ky aplikacion të ketë qasje te këto të dhëna kur ti nuk e përdor aplikacionin"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Lejo që ky aplikacion të ketë qasje te këto të dhëna kur ti nuk e përdor aplikacionin"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Të ketë qasje te të dhënat në sfond"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Lejo që ky aplikacion të ketë qasje te të dhënat e Health Connect kur ti nuk e përdor aplikacionin"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Të qaset te të dhënat e kaluara të fitnesit dhe të mirëqenies"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Lejo që ky aplikacion të ketë qasje te të dhënat që janë shtuar para datës <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Lejo që ky aplikacion të ketë qasje te të gjitha të dhënat e kaluara"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Të qaset te të dhënat e kaluara"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Lejo që ky aplikacion të ketë qasje te të dhënat e Health Connect që janë shtuar para datës <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Lejo që ky aplikacion të ketë qasje te të gjitha të dhënat e kaluara të Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> mund të qaset tashmë te të dhënat e kaluara për të dhënat e tua shëndetësore"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Lexo më shumë rreth lejeve"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Të qaset te të gjitha të dhënat në sfond"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Të qaset te të dhënat shëndetësore në sfond"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Të qaset te të dhënat e fitnesit dhe mirëqenies në sfond"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Lejo që ky aplikacion të ketë qasje te të dhënat e fitnesit dhe mirëqenies dhe te të dhënat shëndetësore kur ti nuk e përdor aplikacionin"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Lejo që ky aplikacion të ketë qasje te këto të dhëna kur ti nuk e përdor aplikacionin"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Lejo që ky aplikacion të ketë qasje te këto të dhëna kur ti nuk e përdor aplikacionin"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Të ketë qasje te të dhënat në sfond"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Lejo që ky aplikacion të ketë qasje te të dhënat e Health Connect kur ti nuk e përdor aplikacionin"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Të qaset te të dhënat e kaluara të fitnesit dhe të mirëqenies"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Lejo që ky aplikacion të ketë qasje te të dhënat që janë shtuar para datës <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Lejo që ky aplikacion të ketë qasje te të gjitha të dhënat e kaluara"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Të qaset te të dhënat e kaluara"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Lejo që ky aplikacion të ketë qasje te të dhënat e Health Connect që janë shtuar para datës <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Lejo që ky aplikacion të ketë qasje te të gjitha të dhënat e kaluara të Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Nuk po lexohen aktualisht të dhënat e fitnesit pasi <xliff:g id="APP_NAME">%1$s</xliff:g> nuk ka të aktivizuara lejet për lexim"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g>mund të qaset tashmë te të dhënat e kaluara për të dhënat e tua shëndetësore. Për ta ndryshuar këtë, çaktivizo lejet për të dhënat shëndetësore për këtë aplikacion"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Menaxho lejet për të dhënat shëndetësore"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aktivizo të paktën një leje për lexim për të aktivizuar qasjen në sfond ose qasjen te të dhënat e kaluara për këtë aplikacion"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aktivizo të paktën një leje për lexim për të aktivizuar qasjen në sfond për këtë aplikacion"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aktivizo të paktën një leje për lexim për të aktivizuar qasjen te të dhënat e kaluara për këtë aplikacion"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Lejo që ky aplikacion të ketë qasje te të gjitha të dhënat e kaluara të Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Lejo që ky aplikacion të ketë qasje te të dhënat e Health Connect kur ti nuk e përdor aplikacionin"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Nëse e lejon, ky aplikacion mund të ketë qasje te të dhënat e Health Connect kur ti nuk e përdor aplikacionin."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Të qaset te të dhënat e kaluara"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Të lejohet që <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te të dhënat e kaluara?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Lejo që ky aplikacion të ketë qasje te të dhënat e Health Connect që janë shtuar para datës <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Lejo që ky aplikacion të ketë qasje te të gjitha të dhënat e kaluara të Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Nëse e lejon, ky aplikacion mund të ketë qasje te të dhënat e Health Connect që janë shtuar para datës <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Nëse e lejon, ky aplikacion mund të ketë qasje te të gjitha të dhënat e kaluara të Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Kalori aktive të djegura"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"kalori aktive të djegura"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Të lexojë të dhënat për kaloritë aktive të djegura"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"shtyrje të karriges me rrota"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Të lexojë të dhënat për shtyrjet e karriges me rrota"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Të shkruajë të dhënat për shtyrjet e karriges me rrota"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Intensiteti i aktivitetit"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"intensiteti i aktivitetit"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Të lexojë të dhënat për intensitetin e aktivitetit"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Të shkruajë të dhënat për intensitetin e aktivitetit"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Norma metabolike bazë"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"norma metabolike bazë"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Të lexojë të dhënat për normën metabolike bazë"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura e lëkurës"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Lexo temperaturën e lëkurës"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Shkruaj temperaturën e lëkurës"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Kjo përfshin të gjitha të dhënat shëndetësore që janë sinkronizuar dhe shtuar te Health Connect. Kjo mund të mos jetë kartela jote e plotë mjekësore dhe nuk përfshin një përshkrim mjekësor për të dhënat e tua mjekësore."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Të gjitha të dhënat shëndetësore"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"të gjitha të dhënat shëndetësore"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Të shkruajë të gjitha të dhënat shëndetësore"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alergjitë"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alergjitë"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Lexo alergjitë"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Imunizimi"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"imunizimi"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Të lexojë të dhënat për imunizimin"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Rezultatet laboratorike"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"rezultatet laboratorike"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Të lexojë rezultatet laboratorike"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alergjitë"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alergjitë"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Të lexojë për alergjitë"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Kushtet"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"kushtet"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Të lexojë kushtet"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaksinat"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaksinat"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Të lexojë të dhënat për vaksinat"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Rezultatet laboratorike"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"rezultatet laboratorike"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Të lexojë rezultatet laboratorike"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Mjekimet"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"mjekimet"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Të lexojë informacionet për mjekimet"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Detajet personale"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"detajet personale"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Të lexosh detajet personale"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Detajet e specialistit"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"detajet e specialistit"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Të lexosh detajet e specialistit"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Shtatzëni"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"shtatzëni"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Të lexojë informacionet për shtatzëninë"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problemet"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problemet"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Të lexojë problemet"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Procedurat"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"procedurat"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Të lexojë procedurat"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historiku social"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historiku social"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historiku social"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Të lexojë historikun social"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Shenjat jetësore"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Vizitat"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"vizitat"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Të lexojë vizitat"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Shenjat jetësore"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"shenjat jetësore"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Të lexojë shenjat jetësore"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Ndërgjegjësimi i plotë"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Të shkruajë të dhënat e ndërgjegjësimit të plotë"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Lejo \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" të lexojë"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Lejo \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" të shkruajë"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Anulo"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Lejo"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Lejoji të gjitha"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Mos lejo"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Zgjidh të dhënat që dëshiron që ky aplikacion të lexojë ose të shkruajë te Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Zgjidh të dhënat që dëshiron që ky aplikacion të lexojë ose të shkruajë te Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Zgjidh të dhënat që dëshiron që ky aplikacion të lexojë te Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Zgjidh të dhënat që dëshiron që ky aplikacion të shkruajë te Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Nëse i jep qasje për të lexuar, aplikacioni mund të lexojë të dhëna të reja dhe të dhëna nga 30 ditët e fundit"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Nëse i jep qasje për të lexuar, aplikacioni mund të lexojë të dhënat e reja dhe të kaluara"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Të lejohet <xliff:g id="APP_NAME">%1$s</xliff:g> që të ketë qasje në Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Mund të mësosh se si <xliff:g id="APP_NAME">%1$s</xliff:g> i përdor të dhënat e tua te <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> e zhvilluesit"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Të lejohet që <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te të dhënat e fitnesit dhe të mirëqenies?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Mund të mësosh se si <xliff:g id="APP_NAME">%1$s</xliff:g> i administron të dhënat e tua te <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>."</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"politika e privatësisë"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Të lejohet që <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te të dhënat të dhënat e tua shëndetësore?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Nëse jep qasje, aplikacioni mund të lexojë dhe të shkruajë të dhënat si p.sh. alergjitë, rezultatet laboratorike, vaksinat etj.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Nëse jep qasje, aplikacioni mund të lexojë të dhënat si p.sh. alergjitë, rezultatet laboratorike, vaksinat etj.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Rreth të dhënave shëndetësore"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Të dhënat për t\'i ndarë përfshijnë"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Nëse e lejon, <xliff:g id="APP_NAME">%1$s</xliff:g> mund të ndajë të dhënat e tua shëndetësore me Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Të sinkronizojë të dhënat e tua shëndetësore nga aplikacionet dhe burime të ndryshme për t\'i mbajtur në një vend të vetëm"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Të hiqen të gjitha lejet?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Hiqi të gjitha"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më asnjë të dhënë nga Health Connect.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më asnjë të dhënë nga Health Connect, duke përfshirë të dhënat në sfond.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te vendndodhja, kamera ose mikrofoni."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më asnjë të dhënë nga Health Connect, duke përfshirë të dhënat në sfond dhe të dhënat e kaluara.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te vendndodhja, kamera ose mikrofoni."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Gjithashtu, fshi të dhënat e <xliff:g id="APP_NAME">%1$s</xliff:g> nga Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Të hiqen të gjitha lejet?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Të hiqen të gjitha lejet për të dhënat shëndetësore?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Të hiqen të gjitha lejet për fitnesin dhe mirëqenien?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Fshi gjithashtu të dhënat e fitnesit nga <xliff:g id="APP_NAME">%1$s</xliff:g> nga Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Të hiqen të gjitha lejet për të dhënat shëndetësore?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Fshi gjithashtu të dhënat shëndetësore nga <xliff:g id="APP_NAME">%1$s</xliff:g> nga Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më këto të dhëna nga Health Connect.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më këto të dhëna nga Health Connect, duke përfshirë të dhënat në sfond.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më këto të dhëna nga Health Connect, duke përfshirë të dhënat e kaluara.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më këto të dhëna nga Health Connect, duke përfshirë të dhënat në sfond dhe të dhënat e kaluara.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Të hiqen të gjitha lejet?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më të dhëna nga Health Connect.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më të dhëna nga Health Connect, duke përfshirë të dhënat në sfond.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më të dhëna nga Health Connect, duke përfshirë të dhënat e kaluara.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk do të mund të lexojë apo të shkruajë më të dhëna nga Health Connect, duke përfshirë të dhënat në sfond dhe të dhënat e kaluara.\n\nKjo nuk ndikon te lejet e tjera që ky aplikacion mund të ketë, si p.sh. te kamera, mikrofoni ose vendndodhja."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Fshi gjithashtu të dhënat e fitnesit dhe të dhënat shëndetësore nga <xliff:g id="APP_NAME">%1$s</xliff:g> nga Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"U hoqën lejet për këtë aplikacion"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Fshi gjithashtu të gjitha të dhënat e Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Dita tjetër"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Dita e zgjedhur"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Dita e mëparshme"</string>
     <string name="default_error" msgid="7966868260616403475">"Ndodhi një gabim. Provo përsëri."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Burim i panjohur"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Të dhënat burimore"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Kllapa hapëse."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Kllapa mbyllëse."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Vlera e fushës \"<xliff:g id="FIELD">%2$s</xliff:g>\""</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Këto aplikacione nuk kanë më qasje, por kanë ende të dhëna të ruajtura në Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> mund të lexojë të dhënat e shtuara pas datës <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Për të menaxhuar lejet e tjera të Android te të cilat ky aplikacion mund të ketë qasje, shko te Cilësimet &gt; Aplikacionet"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Të dhënat që ndan me <xliff:g id="APP_NAME">%1$s</xliff:g> mbulohen nga politika e privatësisë së tij"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Mund të mësosh se si <xliff:g id="APP_NAME">%1$s</xliff:g> i përdor të dhënat e tua te politika e privatësisë e zhvilluesit"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Për të menaxhuar lejet e tjera të Android te të cilat ky aplikacion mund të ketë qasje, shko te \"Cilësimet\" dhe më pas trokit tek \"Aplikacionet\""</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Lexo politikën e privatësisë"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Qasja gjatë 24 orëve të fundit"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Qasja e aplikacionit"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Aktualisht nuk ke asnjë aplikacion të përputhshëm të instaluar"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Qasja shtesë"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Të dhënat e kaluara, të dhënat në sfond"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"U hoqën lejet shtesë për këtë aplikacion"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Lejet"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitnesi dhe mirëqenia"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Ushtrimet, gjumi, të ushqyerit etj."</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Të dhënat shëndetësore"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"të dhënat shëndetësore"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Rezultate lab., mjekime, imunizime etj."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Rezultatet laboratorike, mjekimet, vaksinat etj."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Lejet e hequra të aplikacioneve"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect ka hequr lejet për <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect ka hequr lejet për <xliff:g id="APP_DATA_0">%1$s</xliff:g> dhe <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Shko te \"Dyqani i Play\""</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Fillo me Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ruan të dhënat e tua të shëndetit dhe të fitnesit, duke të ofruar një mënyrë të thjeshtë për të sinkronizuar aplikacione të ndryshme në pajisjen tënde"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect ruan dhe sinkronizon të dhënat e tua të shëndetit dhe fitnesit nga aplikacione të ndryshme.\n\n"<b>"Të dhënat e fitnesit dhe mirëqenies,"</b>" duke përfshirë seancat e stërvitjes, hapat, të ushqyerit, gjumin etj.\n\n"<b>"Të dhënat shëndetësore,"</b>" duke përfshirë vaksinat, rezultatet laboratorike etj."</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Me Health Connect mund"</string>
     <string name="share_data" msgid="3481932156368883946">"Ndaj të dhënat me aplikacionet e tua"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Zgjidh të dhënat që çdo aplikacion mund të lexojë ose të shkruajë në Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Menaxho cilësimet dhe privatësinë tënde"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Fluks i lehtë"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Fluks mesatar"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Fluks i lartë"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Fluks i panjohur"</string>
     <string name="period_day" msgid="3821944462093965882">"Menstruacionet: Dita <xliff:g id="DAY">%1$d</xliff:g> nga <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Periodat (1 ditë)}other{Periodat (# ditë)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Pozitiv"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"I lartë"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muzikë"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Tjetër"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Pa udhëzime"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Mesatar"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"I vrullshëm"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> min."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> orë e <xliff:g id="MIN">%2$s</xliff:g> min."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> orë"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrimi në proces"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect po integrohet me sistemin Android.\n\nMund të duhet pak kohë derisa të transferohen të dhënat dhe lejet."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Mos e mbyll aplikacionin derisa të marrësh një njoftim se procesi ka përfunduar."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Integrimi i Health Connect është në proces"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Nevojitet përditësimi"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect po integrohet me sistemin Android, në mënyrë që të mund të qasesh drejtpërdrejt nga cilësimet e tua."</string>
     <string name="update_button" msgid="4544529019832009496">"Përditëso"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Nise këtë përditësim në mënyrë që Health Connect të vazhdojë të integrohet me cilësimet e sistemit"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Përditëso tani"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Nevojitet përditësimi i sistemit"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Përpara se të vazhdosh, përditëso sistemin e telefonit."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Nëse e ke përditësuar tashmë sistemin e telefonit, provo ta rindezësh për të vazhduar integrimin"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Nevojitet përditësimi i Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Përpara se të vazhdosh, përditëso aplikacionin Health Connect në versionin më të fundit."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Nevojitet më shumë hapësirë"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect ka nevojë për <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> hapësirë ruajtëse në telefon për të vazhduar integrimin.\n\nLiro hapësirë telefon dhe provo sërish."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Provo përsëri"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Liro hapësirën"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Nevojitet më shumë hapësirë"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect ka nevojë për <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> hapësirë ruajtëse në telefon për të vazhduar integrimin."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integrimi u ndërpre"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Aplikacioni Health Connect u mbyll ndërsa po integrohej me sistemin Android.\n\nKliko \"rifillo\" për ta rihapur aplikacionin dhe për të vazhduar transferimin e të dhënave dhe të lejeve."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Për të ruajtur të dhënat e Health Connect, kryeje këtë brenda <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Trokit për të vazhduar integrimin e Health Connect me sistemin Android. Për të ruajtur të dhënat e tua, kryeje këtë brenda kësaj kohe: <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Trokit për të vazhduar integrimin e Health Connect me sistemin Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Vazhdo"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Rifillo integrimin e Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Për të ruajtur të dhënat e tua, kryeje këtë brenda <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Nevojitet përditësimi i aplikacioneve"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> duhet të përditësohet për të vazhduar sinkronizimin me Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Disa aplikacione duhet të përditësohen për të vazhduar sinkronizimin me Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> duhet të përditësohet për të vazhduar sinkronizimin me Health Connect. Përditësimet mund të mos ofrohen për të gjitha aplikacionet."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Disa aplikacione duhet të përditësohen për të vazhduar sinkronizimin me Health Connect. Përditësimet mund të mos ofrohen për të gjitha aplikacionet."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Kontrollo për përditësime"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Mëso më shumë"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Integrimi i Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Integrimi i Health Connect nuk u krye"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Do të marrësh një njoftim kur të bëhet sërish i disponueshëm."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"E kuptova"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Integrimi i Health Connect nuk u krye"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Lexo më shumë"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Integrimi i Health Connect përfundoi"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Hap"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Ç\'të reja ka"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Tani mund të qasesh te Health Connect drejtpërdrejt nga cilësimet e tua. Çinstalo aplikacionin Health Connect në çdo kohë për të liruar hapësirë ruajtëse."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"E kuptova"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Modifiko burimet e aplikacioneve"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Parazgjedhja e pajisjes"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Të dhënat e aplikacionit"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Të dhënat nga aplikacionet që kanë qasje te Health Connect do të shfaqen këtu"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Të dhënat nga <xliff:g id="APP_NAME">%1$s</xliff:g> do të shfaqen këtu"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Të dhënat nga aplikacionet që kanë qasje te Health Connect do të shfaqen këtu"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dita"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Java"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Muaji"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Muaji i fundit"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Hyrjet"</string>
     <string name="tab_access" msgid="7818197975407243701">"Qasja"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Të lejohet qasja shtesë për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> dëshiron gjithashtu që të ketë qasje te këto cilësime të Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aktivizo të paktën një leje për lexim për të aktivizuar qasjen në sfond ose qasjen te të dhënat e kaluara për këtë aplikacion"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aktivizo të paktën një leje për lexim për të aktivizuar qasjen në sfond për këtë aplikacion"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aktivizo të paktën një leje për lexim për të aktivizuar qasjen te të dhënat e kaluara për këtë aplikacion"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Fillo të përdorësh Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sinkronizo aplikacionet e tua të para për të ndarë të dhënat e shëndetit dhe fitnesit mes tyre"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Konfiguro"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Shiko aplikacionet e përputhshme"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Gjej më shumë aplikacione për t\'i sinkronizuar me <xliff:g id="APP_NAME">%s</xliff:g> nëpërmjet Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Shiko në dyqanin e aplikacioneve"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Cakto një kyçje ekrani"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Për më shumë siguri për të dhënat e shëndetit, cakto një kod PIN, motiv ose fjalëkalim për këtë pajisje"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Cakto kyçjen e ekranit"</string>
     <string name="select_all" msgid="837499881590001166">"Zgjidh të gjitha"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Aplikacionet e lidhura nuk do të mund të lexojnë më këto të dhëna nga Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Zgjedhur"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Nuk është zgjedhur"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Ofrohet itinerari i kartës së stërvitjes"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Dita tjetër"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Java tjetër"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Muaji tjetër"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Dita e mëparshme"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Java e mëparshme"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Muaji i mëparshëm"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Të fshihen përgjithmonë të gjitha të dhënat?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Të fshihen përgjithmonë të dhënat e zgjedhura?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Të fshihen përgjithmonë të gjitha të dhënat e <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Të fshihen përgjithmonë hyrjet e zgjedhura të <xliff:g id="APP_NAME">%1$s</xliff:g> për javën <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Të fshihen përgjithmonë hyrjet e zgjedhura të <xliff:g id="APP_NAME">%1$s</xliff:g> për <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Të fshihet përgjithmonë kjo hyrje e <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Të fshihen përgjithmonë të dhënat për <xliff:g id="DATA_TYPE">%1$s</xliff:g> për <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Aktiv"</string>
+    <string name="off" msgid="6996623844428550649">"Joaktiv"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Qasja e fundit në <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Qasja e fundit dje në <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Qasja e fundit më <xliff:g id="TIME_DATE_0">%1$s</xliff:g> në <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Lejo gjithmonë"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Lejo të zgjedhurat"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Gjatë përdorimit të aplikacionit"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Refuzo të gjitha"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Të lejohet që <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te të dhënat e fitnesit dhe të mirëqenies?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon qasje te <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nZgjidh që t\'i lejosh të gjitha ose kontrolloji në mënyrë individuale."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Të lejohet <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitnesi dhe mirëqenia"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"gjatë gjithë kohës"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"kur është në përdorim"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Gjatë gjithë kohës"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Kur është në përdorim"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> mund të qaset te të gjitha të dhënat për fitnesin dhe mirëqenien <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Lejohet të qaset"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Lejohet të lexojë"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Këto leje i japin qasje <xliff:g id="APP_NAME">%1$s</xliff:g> te të dhënat nga sensorët e pajisjes sate."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Lejohen <xliff:g id="NUMBER_0">%1$d</xliff:g> nga <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> aplikacione"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Asnjë aplikacion nuk po kërkon"</string>
+    <string name="allowed" msgid="4158456017482263737">"Lejohet"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Nuk lejohet"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Aplikacionet që kanë këtë leje mund të qasen te të dhënat për <xliff:g id="DATA_TYPE">%s</xliff:g> nga sensorët e pajisjes"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Të hiqet qasja për <xliff:g id="DATA_TYPE">%s</xliff:g> për të gjitha aplikacionet në orën tënde?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Shenja e zgjedhjes"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Shenja e kryqëzimit"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Aktualisht, <xliff:g id="APP_NAME">%1$s</xliff:g> mund të ketë qasje te të dhënat për fitnesin dhe mirëqenien <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Të lejohet që <xliff:g id="APP_NAME">%1$s</xliff:g> të ketë qasje te të dhënat për fitnesin dhe mirëqenien gjatë gjithë kohës?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ka qasje te <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Menaxho lejet për fitnesin dhe mirëqenien"</string>
 </resources>
diff --git a/apk/res/values-sr/strings.xml b/apk/res/values-sr/strings.xml
index 5bfb363..0c09009 100644
--- a/apk/res/values-sr/strings.xml
+++ b/apk/res/values-sr/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Управљајте подацима о здрављу и фитнесу на уређају и контролишите које апликације могу да им приступају"</string>
     <string name="data_title" msgid="4456619761533380816">"Подаци и приступ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Прегледај здравствену евиденцију"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Погледајте здравствену евиденцију и које апликације могу да јој приступају"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Све категорије"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Прикажи све категорије"</string>
     <string name="no_data" msgid="1906986019249068659">"Нема података"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Јуче"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Прочитано је: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Уписано је: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Управљај дозволама"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Време: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Активности"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"приступ подацима о здрављу"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Читање потрошених калорија"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Дозвољава апликацији да чита потрошене калорије"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Приступ подацима у позадини"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Желите да дозволите апликацији <xliff:g id="APP_NAME">%1$s</xliff:g> да приступа подацима у позадини?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Желите да дозволите апликацији <xliff:g id="APP_NAME">%1$s</xliff:g> да приступа подацима у позадини?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ако дозволите, ова апликација може да приступа подацима о фитнесу, велнесу и здравственој евиденцији када је не користите."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ако дозволите, ова апликација може да приступа здравственој евиденцији када је не користите."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ако дозволите, ова апликација може да приступа подацима о фитнесу и велнесу када је не користите."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ако дозволите, ова апликација може да приступа подацима Повезивања здравља када је не користите."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Желите да дозволите апликацији <xliff:g id="APP_NAME">%1$s</xliff:g> да приступа ранијим подацима?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ако дозволите, ова апликација може да приступа подацима о фитнесу и велнесу који су додати пре: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ако дозволите, ова апликација може да приступа свим ранијим подацима о фитнесу и велнесу."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ако дозволите, ова апликација може да приступа подацима Повезивања здравља који су додати пре: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ако дозволите, ова апликација може да приступа свим ранијим подацима Повезивања здравља."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Желите да дозволите додатни приступ за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> такође тражи приступ овим подешавањима Повезивања здравља"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Приступ свим подацима у позадини"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Приступ здравственој евиденцији у позадини"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Приступ подацима о фитнесу и велнесу у позадини"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Дозволите овој апликацији да приступа подацима о фитнесу, велнесу и здравственој евиденцији када је не користите"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Дозволите овој апликацији да приступа овим подацима када је не користите"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Дозволите овој апликацији да приступа овим подацима када је не користите"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Приступ подацима у позадини"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Дозволите овој апликацији да приступа подацима Повезивања здравља када је не користите"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Приступ ранијим подацима о фитнесу и велнесу"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Дозволите овој апликацији да приступа подацима који су додати пре: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Дозволите овој апликацији да приступа свим ранијим подацима"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Приступ ранијим подацима"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Дозволите овој апликацији да приступа подацима Повезивања здравља који су додати пре: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Дозволите овој апликацији да приступа свим ранијим подацима Повезивања здравља"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> већ може да приступа ранијим подацима здравствене евиденције"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Прочитајте више о дозволама"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Приступ свим подацима у позадини"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Приступ здравственој евиденцији у позадини"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Приступ подацима о фитнесу и велнесу у позадини"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Дозволите овој апликацији да приступа подацима о фитнесу, велнесу и здравственој евиденцији када је не користите"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Дозволите овој апликацији да приступа овим подацима када је не користите"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Дозволите овој апликацији да приступа овим подацима када је не користите"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Приступ подацима у позадини"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Дозволите овој апликацији да приступа подацима Повезивања здравља када је не користите"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Приступ ранијим подацима о фитнесу и велнесу"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Дозволите овој апликацији да приступа подацима који су додати пре: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Дозволите овој апликацији да приступа свим ранијим подацима"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Приступ ранијим подацима"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Дозволите овој апликацији да приступа подацима Повезивања здравља који су додати пре: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Дозволите овој апликацији да приступа свим ранијим подацима Повезивања здравља"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Тренутно се не читају подаци о фитнесу јер <xliff:g id="APP_NAME">%1$s</xliff:g> нема дозволе за читање"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> већ може да приступа ранијим подацима здравствене евиденције Да бисте то променили, искључите дозволе за здравствену евиденцију за ову апликацију"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Управљај дозволама за здравствену евиденцију"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Омогућите бар једну дозволу за читање да бисте за ову апликацију укључили приступ позадинским или ранијим подацима"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Омогућите бар једну дозволу за читање да бисте за ову апликацију укључили приступ у позадини"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Омогућите бар једну дозволу за читање да бисте за ову апликацију укључили приступ ранијим подацима"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Дозволите овој апликацији да приступа свим ранијим подацима Повезивања здравља"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Дозволите овој апликацији да приступа подацима Повезивања здравља када је не користите"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ако дозволите, ова апликација може да приступа подацима Повезивања здравља када је не користите."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Приступ ранијим подацима"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Желите да дозволите апликацији <xliff:g id="APP_NAME">%1$s</xliff:g> да приступа ранијим подацима?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Дозволите овој апликацији да приступа подацима Повезивања здравља који су додати пре: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Дозволите овој апликацији да приступа свим ранијим подацима Повезивања здравља"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ако дозволите, ова апликација може да приступа подацима Повезивања здравља који су додати пре: <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ако дозволите, ова апликација може да приступа свим ранијим подацима Повезивања здравља."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Утрошене активне калорије"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"утрошене активне калорије"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Читање утрошених активних калорија"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"гурање инвалидских колица"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Читање података о гурању инвалидских колица"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Уписивање података о гурању инвалидских колица"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Интензитет активности"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"интензитет активности"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Читање података о интензитету активности"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Писање података о интензитету активности"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Базални метаболизам"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"базални метаболизам"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Читање података о базалном метаболизму"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"температура коже"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Читај податке о температури коже"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Уписуј податке о температури коже"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"То обухвата сву здравствену евиденцију која је синхронизована са Повезивањем здравља и додата у њега. Ово можда није комплетна медицинска евиденција и не садржи медицински опис здравствене евиденције."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Сва здравствена евиденција"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"сва здравствена евиденција"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Уписивање све здравствене евиденције"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Алергије"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"алергије"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Читање података о алергијама"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Имунизација"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"имунизација"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Читање података о имунизацији"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Лабораторијски резултати"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"лабораторијски резултати"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Читање података о лабораторијским резултатима"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Алергије"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"алергије"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Читање података о алергијама"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Здравствено стање"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"здравствено стање"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Читање података о здравственом стању"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Вакцине"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"вакцине"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Читање података о вакцинама"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Лабораторијски резултати"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"лабораторијски резултати"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Читање података о лабораторијским резултатима"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Лекови"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"лекови"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Читање података о лековима"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Лични подаци"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"лични подаци"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"да читате личне податке"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Детаљи о лекарима и стручњацима"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"детаљи о лекарима и стручњацима"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"да читате детаље о лекарима и стручњацима"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Трудноћа"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"трудноћа"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Читање података о трудноћи"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Проблеми"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"проблеми"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Читање података о проблемима"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Процедуре"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"процедуре"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Читање података о процедурама"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Друштвене одреднице здравља"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Друштвене одреднице здравља"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"друштвене одреднице здравља"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Читање података о друштвеним одредницама здравља"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Витални знаци"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Посете"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"посете"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"да читате податке о посетама"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Витални знаци"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"витални знаци"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Читање виталних знака"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Освешћеност"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Уписивање података о освешћености"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Дозвола да <xliff:g id="APP_NAME">%1$s</xliff:g> очитава податке"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Дозвола да <xliff:g id="APP_NAME">%1$s</xliff:g> уписује податке"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Откажи"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Дозволи"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Дозволи све"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Не дозволи"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Одаберите податке које желите да ова апликација чита или уписује у Повезивање здравља"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Одаберите податке које желите да ова апликација чита или уписује у Повезивање здравља"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Одаберите податке које желите да ова апликација чита из Повезивања здравља"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Одаберите податке које желите да ова апликација уписује у Повезивање здравља"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ако дате приступ за читање, апликација може да чита нове податке и податке из претходних 30 дана"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ако дате приступ за читање, ова апликација може да чита нове и раније податке"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Желите да дозволите апликацији <xliff:g id="APP_NAME">%1$s</xliff:g> да приступа Повезивању здравља?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"У <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> програмера можете да сазнате како <xliff:g id="APP_NAME">%1$s</xliff:g> управља вашим подацима"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Желите да дозволите да <xliff:g id="APP_NAME">%1$s</xliff:g> приступа подацима о фитнесу и велнесу?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Можете да сазнате како <xliff:g id="APP_NAME">%1$s</xliff:g> управља вашим подацима у: <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"политика приватности"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Желите да дозволите да <xliff:g id="APP_NAME">%1$s</xliff:g> приступа вашој здравственој евиденцији?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ако дате приступ, апликација може да чита и уписује податке, на пример, алергије, лабораторијске резултате, вакцине и друго\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ако дате приступ, апликација може да чита податке, на пример, алергије, лабораторијске резултате, вакцине и друго\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"О здравственој евиденцији"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Подаци за дељење обухватају"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ако дозволите, <xliff:g id="APP_NAME">%1$s</xliff:g> може да дели вашу здравствену евиденцију са Повезивањем здравља."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Синхронизујте здравствену евиденцију из различитих апликација и извора да бисте је држали на једном месту"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Желите да уклоните све дозволе?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Уклони све"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује било које податке из Повезивања здравља.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује било које податке из Повезивања здравља, укључујући раније податке.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут локације, камере или микрофона."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује било које податке из Повезивања здравља, укључујући позадинске и раније податке.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут локације, камере или микрофона."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Избриши и податке апликације <xliff:g id="APP_NAME">%1$s</xliff:g> из Повезивања здравља"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Желите да уклоните све дозволе?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Желите да уклоните све дозволе за здравствену евиденцију?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Желите да уклоните све дозволе за фитнес и велнес?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Избриши и податке о фитнесу из апликације <xliff:g id="APP_NAME">%1$s</xliff:g> из Повезивања здравља"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Желите да уклоните све дозволе за здравствену евиденцију?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Избриши и здравствену евиденцију из апликације <xliff:g id="APP_NAME">%1$s</xliff:g> из Повезивања здравља"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује ове податке из Повезивања здравља.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује ове податке из Повезивања здравља, укључујући позадинске податке.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује ове податке из Повезивања здравља, укључујући раније податке.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује ове податке из Повезивања здравља, укључујући позадинске и раније податке.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Желите да уклоните све дозволе?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује податке из Повезивања здравља.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује податке из Повезивања здравља, укључујући позадинске податке.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује податке из Повезивања здравља, укључујући раније податке.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> више неће моћи да чита ни уписује податке из Повезивања здравља, укључујући позадинске и раније податке.\n\nТо не утиче на друге дозволе које ова апликација може да има, попут камере, микрофона или локације."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Избриши и податке о фитнесу и здравствену евиденцију из апликације <xliff:g id="APP_NAME">%1$s</xliff:g> из Повезивања здравља"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Дозволе за ову апликацију су уклоњене"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Избриши и све податке Повезивања здравља"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Следећи дан"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Изабрани дан"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Претходни дан"</string>
     <string name="default_error" msgid="7966868260616403475">"Дошло је до грешке. Пробајте поново."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Непознат ресурс"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Изворни подаци"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Отворена велика заграда."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Затворена велика заграда."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> вредност за поље <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Ове апликације више немају приступ, али и даље имају сачуване податке у Повезивању здравља"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> може да чита податке додате после <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Да бисте управљали другим дозволама за Android којима ова апликација може да приступа, идите у Подешавања &gt; Апликације"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Податке које делите са апликацијом <xliff:g id="APP_NAME">%1$s</xliff:g> регулише њена политика приватности"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"У политици приватности програмера можете да сазнате како <xliff:g id="APP_NAME">%1$s</xliff:g> управља вашим подацима"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Да бисте управљали другим дозволама за Android којима ова апликација може да приступа, идите у Подешавања, па додирните Апликације"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Прочитајте политику приватности"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Приступљено у последња 24 сата"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Приступ апликацијама"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Тренутно немате инсталирану ниједну компатибилну апликацију"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Додатни приступ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Ранији подаци, позадински подаци"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Уклоњене су додатне дозволе за ову апликацију"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Дозволе"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Фитнес и велнес"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Вежбање, сан, исхрана и друго"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Здравствена евиденција"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"здравствена евиденција"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Лаб. резултати, лекови, вакцине и друго"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Лаб. резултати, лекови, вакцине и друго"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Уклоњене дозволе за апликације"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Повезивање здравља је уклонило дозволе за апликацију <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Повезивање здравља је уклонило дозволе за апликације <xliff:g id="APP_DATA_0">%1$s</xliff:g> и <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Иди у Play продавницу"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Започните са Повезивањем здравља"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Повезивање здравља чува ваше податке о здрављу и фитнесу и пружа вам једноставан начин да синхронизујете различите апликације на уређају"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Повезивање здравља чува и синхронизује податке о здрављу и фитнесу из различитих апликација.\n\n"<b>"Подаци о фитнесу и здрављу,"</b>" укључујући сесије вежбања, број корака, исхрану, спавање и друго\n\n"<b>"Здравствена евиденција,"</b>" укључујући вакцинације, лабораторијске резултате и друго"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Помоћу Повезивања здравља можете:"</string>
     <string name="share_data" msgid="3481932156368883946">"Делите податке са апликацијама"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Одаберите податке које свака апликације може да чита и уписује у Повезивање здравља"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Управљајте подешавањима и приватношћу"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Благо крварење"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Средње крварење"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Обилно крварење"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Непозната количина крварења"</string>
     <string name="period_day" msgid="3821944462093965882">"Дан циклуса: <xliff:g id="DAY">%1$d</xliff:g>. од <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Менструација (1 дан)}one{Менструација (# дан)}few{Менструација (# дана)}other{Менструација (# дана)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Позитиван"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Негативан"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Висока плодност"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Музика"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Друго"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Без вођења"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Умерено"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Интензивно"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> мин"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> с <xliff:g id="MIN">%2$s</xliff:g> мин"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> с"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Интеграција је у току"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Повезивање здравља се интегрише са Android системом.\n\nМоже да прође извесно време док се подаци и дозволе пренесу."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Не затварајте апликацију док не добијете обавештење да је процес довршен."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Интеграција Повезивања здравља је у току"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Потребно је ажурирање"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Повезивање здравља се интегрише са Android системом да бисте могли директно да му приступате из подешавања."</string>
     <string name="update_button" msgid="4544529019832009496">"Ажурирај"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Започните ово ажурирање да би Повезивање здравља могло да настави интеграцију са подешавањима система"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Ажурирај"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Потребно је ажурирање система"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Пре него што наставите, ажурирајте систем телефона."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ако сте већ ажурирали систем телефона, пробајте да рестартујете телефон како бисте наставили интеграцију"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Потребно је ажурирање Повезивања здравља"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Пре него што наставите, ажурирајте апликацију Повезивање здравља на најновију верзију."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Потребно је још простора"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Повезивању здравља треба <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> меморијског простора на телефону да би се интеграција наставила.\n\nОслободите нешто простора на телефону и пробајте поново."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Пробај поново"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Ослободи простор"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Потребно је још простора"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Повезивању здравља треба <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> меморијског простора на телефону да би наставило интегрисање."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Интеграција је паузирана"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Апликација Повезивање здравља се затворила док је трајала њена интеграција са Android системом.\n\nКликните на Настави да бисте поново отворили апликацију и наставили да преносите податке и дозволе."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Да бисте задржали податке Повезивања здравља, довршите ово у року од <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Додирните да бисте наставили интеграцију Повезивања здравља са Android системом. Да бисте задржали податке, довршите ово у року од <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Додирните да бисте наставили интеграцију Повезивања здравља са Android системом."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Настави"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Наставите интеграцију Повезивања здравља"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Да бисте задржали податке, довршите ово у року од <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Треба да ажурирате апликацију"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> треба да се ажурира како бисте наставили синхронизацију са Повезивањем здравља"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Треба да ажурирате неке апликације како бисте наставили синхронизацију са Повезивањем здравља"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> треба да се ажурира како бисте наставили синхронизацију са Повезивањем здравља. Ажурирања можда нису доступна за све апликације."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Треба да ажурирате неке апликације како бисте наставили синхронизацију са Повезивањем здравља. Ажурирања можда нису доступна за све апликације."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Проверите да ли има ажурирања"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Сазнајте више"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Интеграција Повезивања здравља"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Интеграција Повезивања здравља није довршена"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Добићете обавештење када поново постане доступна."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Важи"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Интеграција Повезивања здравља није довршена"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Прочитајте више"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Интеграција Повезивања здравља је довршена"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Отвори"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Шта је ново"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Сада можете да приступате Повезивању здравља директно из подешавања. Деинсталирајте апликацију Повезивање здравља у било ком тренутку да бисте ослободили меморијски простор."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Важи"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Измени изворе апликација"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Подразумевано за уређај"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Подаци апликација"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Подаци из апликација са приступом Повезивању здравља приказаће се овде"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Подаци из апликације <xliff:g id="APP_NAME">%1$s</xliff:g> ће бити овде"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Подаци из апликација са приступом Повезивању здравља ће бити овде"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Дан"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Недеља"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Месец"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Прошли месец"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Уноси"</string>
     <string name="tab_access" msgid="7818197975407243701">"Приступ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Желите да дозволите додатни приступ за апликацију <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> такође тражи приступ овим подешавањима Повезивања здравља"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Омогућите бар једну дозволу за читање да бисте за ову апликацију укључили приступ позадинским или ранијим подацима"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Омогућите бар једну дозволу за читање да бисте за ову апликацију укључили приступ у позадини"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Омогућите бар једну дозволу за читање да бисте за ову апликацију укључили приступ ранијим подацима"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Почните да користите Повезивање здравља"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Синхронизујте апликације да бисте делили податке о здрављу и фитнесу међу њима"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Подеси"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Погледајте компатибилне апликације"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Пронађите још апликација које ћете синхронизовати са апликацијом <xliff:g id="APP_NAME">%s</xliff:g> преко Повезивања здравља"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Прикажи у продавници апликација"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Подесите откључавање екрана"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Подесите PIN, шаблон или лозинку за овај уређај да бисте побољшали безбедност података о здрављу"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Подеси откључавање екрана"</string>
     <string name="select_all" msgid="837499881590001166">"Изабери све"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Повезане апликације више неће моћи да читају ове податке из Повезивања здравља"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Означено"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Није означено"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Доступна је мапа руте вежбања"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Следећи дан"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Следећа недеља"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Следећи месец"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Претходни дан"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Претходна недеља"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Претходни месец"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Желите трајно да избришете све податке?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Желите трајно да избришете изабране податке?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Желите трајно да избришете све податке за: <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Желите трајно да избришете изабране уносе у: <xliff:g id="APP_NAME">%1$s</xliff:g> за недељу <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Желите трајно да избришете изабране уносе у: <xliff:g id="APP_NAME">%1$s</xliff:g> за <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Желите трајно да избришете овај унос у: <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Желите трајно да избришете податке типа <xliff:g id="DATA_TYPE">%1$s</xliff:g> за <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Укључено"</string>
+    <string name="off" msgid="6996623844428550649">"Искључено"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Приступљено: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Приступано јуче: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Приступано: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Дозволи увек"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Дозволи изабрано"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Док користим апликацију"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Одбиј све"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Желите да дозволите да <xliff:g id="APP_NAME">%1$s</xliff:g> приступа подацима о фитнесу и велнесу?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> тражи приступ за: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nИзаберите да ли желите да дозволите све или да их контролишете појединачно."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Дозвољавате да <xliff:g id="APP_NAME">%1$s</xliff:g> приступа уређају <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Фитнес и велнес"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"све време"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"док се користи"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Све време"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Док се користи"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> може да приступа свим подацима о фитнесу и велнесу у режиму <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Дозвољен приступ"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Дозвољено читање"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ове дозволе дају апликацији <xliff:g id="APP_NAME">%1$s</xliff:g> приступ подацима са сензора уређаја."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Апликације са дозволом: <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ниједна апликација не захтева дозволу"</string>
+    <string name="allowed" msgid="4158456017482263737">"Дозвољено"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Није дозвољено"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Апликације са овом дозволом могу да приступају подацима (<xliff:g id="DATA_TYPE">%s</xliff:g>) са сензора уређаја."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Желите да уклоните приступ подацима (<xliff:g id="DATA_TYPE">%s</xliff:g>) свим апликацијама на сату?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Знак потврде"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Знак x"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Тренутно, <xliff:g id="APP_NAME">%1$s</xliff:g> може да приступа подацима о фитнесу и велнесу <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Желите да дозволите да <xliff:g id="APP_NAME">%1$s</xliff:g> стално приступа подацима о фитнесу и велнесу?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> има приступ за: <xliff:g id="DATA_TYPES">%2$s</xliff:g>"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Управљај дозволама за фитнес и велнес"</string>
 </resources>
diff --git a/apk/res/values-sv/strings.xml b/apk/res/values-sv/strings.xml
index 9e89b4c..bcefed6 100644
--- a/apk/res/values-sv/strings.xml
+++ b/apk/res/values-sv/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Hantera hälso- och träningsdata på enheten och styr vilka appar som har åtkomst till den"</string>
     <string name="data_title" msgid="4456619761533380816">"Data och åtkomst"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Bläddra bland hälsojournaler"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Visa dina hälsojournaler och vilka appar som har åtkomst till dem"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Alla kategorier"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Visa alla kategorier"</string>
     <string name="no_data" msgid="1906986019249068659">"Ingen data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"I går"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Läs: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Skriv: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Hantera behörigheter"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Tid: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktivitet"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"åtkomst till hälsodata"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Läsbehörighet för brända kal."</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Tillåter att appen läser antalet brända kalorier"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Åtkomst till data i bakgrunden"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till data i bakgrunden?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till data i bakgrunden?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Om du tillåter detta kan appen få åtkomst till tränings- och hälsodata och hälsojournaler när du inte använder appen."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Om du tillåter detta kan appen få åtkomst till hälsojournaler när du inte använder appen."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Om du tillåter detta kan appen få åtkomst till tränings- och hälsodata när du inte använder appen."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Om du tillåter detta kan appen få åtkomst till Health Connect-data när du inte använder appen."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till tidigare data?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Om du tillåter detta kan appen få åtkomst till tränings- och hälsodata som lagts till före <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Om du tillåter detta kan appen få åtkomst till all tidigare tränings- och hälsodata."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Om du tillåter detta kan appen få åtkomst till Health Connect-data som lagts till före <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Om du tillåter detta kan appen få åtkomst till all tidigare Health Connect-data."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Vill du tillåta ytterligare åtkomst för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> vill också få åtkomst till dessa Health Connect-inställningar"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Få åtkomst till all data i bakgrunden"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Få åtkomst till hälsojournaler i bakgrunden"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Få åtkomst till tränings- och hälsodata i bakgrunden"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Tillåt att appen får åtkomst till tränings- och hälsodata och hälsojournaler när du inte använder appen"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Tillåt att appen får åtkomst till denna data när du inte använder appen"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Tillåt att appen får åtkomst till denna data när du inte använder appen"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Åtkomst till data i bakgrunden"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Tillåt att appen får åtkomst till Health Connect-data när du inte använder appen"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Få åtkomst till tidigare tränings- och hälsodata"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Tillåt att appen får åtkomst till data som lagts till före <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Tillåt att appen får åtkomst till all tidigare data"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Åtkomst till tidigare data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Tillåt att appen får åtkomst till Health Connect-data som lagts till före <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Tillåt att appen får åtkomst till all tidigare Health Connect-data"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> har redan åtkomst till tidigare data i dina hälsojournaler"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Läs mer om behörigheter"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Få åtkomst till all data i bakgrunden"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Få åtkomst till hälsojournaler i bakgrunden"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Få åtkomst till tränings- och hälsodata i bakgrunden"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Tillåt att appen får åtkomst till tränings- och hälsodata och hälsojournaler när du inte använder appen"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Tillåt att appen får åtkomst till denna data när du inte använder appen"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Tillåt att appen får åtkomst till denna data när du inte använder appen"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Åtkomst till data i bakgrunden"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Tillåt att appen får åtkomst till Health Connect-data när du inte använder appen"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Få åtkomst till tidigare tränings- och hälsodata"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Tillåt att appen får åtkomst till data som lagts till före <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Tillåt att appen får åtkomst till all tidigare data"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Åtkomst till tidigare data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Tillåt att appen får åtkomst till Health Connect-data som lagts till före <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Tillåt att appen får åtkomst till all tidigare Health Connect-data"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Ingen träningsdata läses upp för närvarande eftersom <xliff:g id="APP_NAME">%1$s</xliff:g> inte har läsbehörighet för"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> har redan åtkomst till tidigare data i dina hälsojournaler. Om du vill ändra detta inaktiverar du behörigheter för hälsodata för den här appen"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Hantera behörigheter för hälsojournaler"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aktivera minst en läsbehörighet för att aktivera åtkomst i bakgrunden eller till tidigare data för den här appen"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aktivera minst en läsbehörighet för att aktivera åtkomst i bakgrunden för den här appen"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aktivera minst en läsbehörighet för att aktivera åtkomst till tidigare data för den här appen"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Tillåt att appen får åtkomst till all tidigare Health Connect-data"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Tillåt att appen får åtkomst till Health Connect-data när du inte använder appen"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Om du tillåter detta kan appen få åtkomst till Health Connect-data när du inte använder appen."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Åtkomst till tidigare data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till tidigare data?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Tillåt att appen får åtkomst till Health Connect-data som lagts till före <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Tillåt att appen får åtkomst till all tidigare Health Connect-data"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Om du tillåter detta kan appen få åtkomst till Health Connect-data som lagts till före <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Om du tillåter detta kan appen få åtkomst all till tidigare Health Connect-data."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Förbrända kalorier vid aktivitet"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"förbrända kalorier vid aktivitet"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Läsbehörighet för antalet förbrända kalorier vid aktivitet"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"armtag på rullstol"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Läsbehörighet för armtag på rullstol"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Skrivbehörighet för armtag på rullstol"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Aktivitetsintensitet"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"aktivitetsintensitet"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Läsbehörighet för aktivitetsintensitet"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Skrivbehörighet för aktivitetsintensitet"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basalomsättning"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basalomsättning"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Läsbehörighet för basalomsättning"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"hudtemperatur"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Läsa hudtemperatur"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Registrera hudtemperatur"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Detta inkluderar alla hälsojournaler som har synkroniserats med och lagts till i Health Connect. Detta är kanske inte din fullständiga journal och innehåller inte en medicinsk beskrivning av dina hälsojournaler."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Alla hälsojournaler"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"alla hälsojournaler"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Skriva alla hälsojournaler"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergier"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergier"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Läsa allergier"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunisering"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunisering"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Läsa immuniseringsdata"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratorieresultat"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratorieresultat"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Läsbehörighet för laboratorieresultat"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergier"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergier"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Läsa allergier"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Villkor"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"villkor"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Villkor för läsbehörighet"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vacciner"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vacciner"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Läsa vacciner"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratorieresultat"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratorieresultat"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Läsa laboratorieresultat"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Läkemedel"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"läkemedel"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Läsbehörighet för läkemedel"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Personliga uppgifter"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"personliga uppgifter"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"läsa personliga uppgifter"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Information om vårdgivare"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"information om vårdgivare"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Läsa information om vårdgivare"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Graviditet"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"graviditet"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Läsbehörighet för graviditet"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Problem"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"problem"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Läsbehörighet för problem"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Behandlingar"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"behandlingar"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Läsbehörighet för behandlingar"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Social historik"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Social historik"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"social historik"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Läsbehörighet för social historik"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vitalparametrar"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Besök"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"besök"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Läsa besök"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vitalparametrar"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vitalparametrar"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Läsbehörighet för vitalparametrar"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Mindfulness"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Skriva mindfulness"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Ge <xliff:g id="APP_NAME">%1$s</xliff:g> läsbehörighet"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Ge <xliff:g id="APP_NAME">%1$s</xliff:g> skrivbehörighet"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Avbryt"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Tillåt"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Tillåt alla"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Tillåt inte"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Välj data du vill att den här appen ska kunna läsa och skriva över till Health Connect."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Välj data du vill att den här appen ska kunna läsa och skriva till Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Välj data som du vill att den här appen ska kunna läsa från Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Välj data som den här appen ska kunna skriva till Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Om du tillåter läsåtkomst kan appen läsa ny data och data från de senaste 30 dagarna"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Om du tillåter läsåtkomst kan appen läsa ny och tidigare data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Du kan läsa mer om hur <xliff:g id="APP_NAME">%1$s</xliff:g> hanterar din data i utvecklarens <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till tränings- och hälsodata?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Du kan läsa mer om hur <xliff:g id="APP_NAME">%1$s</xliff:g> hanterar din data i deras <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"integritetspolicy"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till dina hälsojournaler?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Om du ger åtkomst kan appen läsa och skriva data som allergier, labbresultat, vacciner med mera\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Om du ger åtkomst kan appen läsa data som allergier, labbresultat, vacciner med mera\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Om hälsojournaler"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data som delas omfattar"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Om du tillåter detta kan <xliff:g id="APP_NAME">%1$s</xliff:g> dela dina hälsojournaler med Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Synkronisera dina hälsojournaler från olika appar och källor så att de finns på ett och samma ställe"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Vill du ta bort alla behörigheter?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Ta bort alla"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva data i Health Connect.\n\nDetta påverkar inte andra behörigheter som appen kanske har, t.ex. kamera-, mikrofon- eller platsbehörighet."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva data i Health Connect, inklusive tidigare data.\n\nDetta påverkar inte andra behörigheter som appen kanske har, t.ex. plats-, kamera- eller mikrofonbehörighet."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva data i Health Connect, inklusive bakgrundsdata och tidigare data.\n\nDetta påverkar inte andra behörigheter som appen kanske har, t.ex. plats-, kamera- eller mikrofonbehörighet."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Radera även <xliff:g id="APP_NAME">%1$s</xliff:g>-data från Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vill du ta bort alla behörigheter?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vill du ta bort alla behörigheter för hälsojournaler?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Vill du ta bort alla behörigheter för träning och hälsa?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Radera även träningsdata från <xliff:g id="APP_NAME">%1$s</xliff:g> från Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Vill du ta bort alla behörigheter för hälsojournaler?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Radera även hälsojournaler från <xliff:g id="APP_NAME">%1$s</xliff:g> från Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva denna data i Health Connect.\n\nDetta påverkar inte andra behörigheter som appen kanske har, som kamera-, mikrofon- eller platsbehörighet."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva denna data i Health Connect, inklusive bakgrundsdata.\n\nDetta påverkar inte andra behörigheter som appen kanske har, som kamera-, mikrofon- eller platsbehörighet."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva denna data i Health Connect, inklusive tidigare data.\n\nDetta påverkar inte andra behörigheter som appen kanske har, som kamera-, mikrofon- eller platsbehörighet."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva denna data i Health Connect, inklusive bakgrundsdata och tidigare data.\n\nDetta påverkar inte andra behörigheter som appen kanske har, som kamera-, mikrofon- eller platsbehörighet."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Vill du ta bort alla behörigheter?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva data i Health Connect.\n\nDetta påverkar inte andra behörigheter som appen kanske har, som kamera-, mikrofon- eller platsbehörighet."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva data i Health Connect, inklusive bakgrundsdata.\n\nDetta påverkar inte andra behörigheter som appen kanske har, som kamera-, mikrofon- eller platsbehörighet."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva data i Health Connect, inklusive tidigare data.\n\nDetta påverkar inte andra behörigheter som appen kanske har, som kamera-, mikrofon- eller platsbehörighet."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan inte längre läsa eller skriva data i Health Connect, inklusive bakgrundsdata och tidigare data.\n\nDetta påverkar inte andra behörigheter som appen kanske har, som kamera-, mikrofon- eller platsbehörighet."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Radera även träningsdata och hälsojournaler från <xliff:g id="APP_NAME">%1$s</xliff:g> från Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Behörigheter för den här appen har tagits bort"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Radera även all Health Connect-data"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Nästa dag"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Välj dag"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Föregående dag"</string>
     <string name="default_error" msgid="7966868260616403475">"Något gick fel. Försök igen."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Okänd resurs"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Källdata"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Vänster hakparentes."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Höger hakparentes."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Fältvärde <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"De här apparna har inte längre åtkomst till Health Connect, men har fortfarande data lagrad där"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan läsa data som lagts till efter <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Om du vill hantera andra Android-behörigheter som appen kan få åtkomst till öppnar du Inställningar &gt; Appar"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data som du delar med <xliff:g id="APP_NAME">%1$s</xliff:g> omfattas av den appens integritetspolicy"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Du kan läsa mer om hur <xliff:g id="APP_NAME">%1$s</xliff:g> hanterar din data i utvecklarens integritetspolicy"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Om du vill hantera andra Android-behörigheter som appen kan få åtkomst till öppnar du Inställningar och trycker på Appar"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Läs integritetspolicyn"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Användes under de senaste 24 timmarna"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Appåtkomst"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Du har för närvarande inga kompatibla appar installerade"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Ytterligare åtkomst"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Tidigare data, bakgrundsdata"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Ytterligare behörigheter för den här appen har tagits bort"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Behörigheter"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Träning och hälsa"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Träning, sömn, näring med flera"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Hälsojournaler"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"hälsojournaler"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Resultat, läkemedel, vaccinationer osv."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Labbresultat, läkemedel, vacciner osv."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Tog bort appbehörigheter"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect tog bort behörigheter för <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect tog bort behörigheter för <xliff:g id="APP_DATA_0">%1$s</xliff:g> och <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Öppna Play Butik"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Kom igång med Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect lagrar din hälso- och träningsdata, så att du enkelt kan synkronisera olika appar på enheten"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect lagrar och synkroniserar din hälso- och träningsdata från olika appar.\n\n"<b>"Tränings- och hälsodata,"</b>" inklusive träningspass, steg, kost, sömn med mera\n\n"<b>"Hälsojournaler,"</b>" inklusive vaccinationer, labbresultat med mera"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Med Health Connect kan du"</string>
     <string name="share_data" msgid="3481932156368883946">"Dela data med dina appar"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Välj vilken data varje app får läs- eller skrivbehörighet till för Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Hantera inställningar och integritet"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Lätt blödning"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Normal blödning"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Riklig blödning"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Okänt flöde"</string>
     <string name="period_day" msgid="3821944462093965882">"Dag <xliff:g id="DAY">%1$d</xliff:g> av <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> av mensen"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Mens (1 dag)}other{Mens (# dagar)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positiv"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negativ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Hög"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musik"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Annat"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Icke-guidad"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Måttlig"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Ansträngande"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> h <xliff:g id="MIN">%2$s</xliff:g> m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integrering pågår"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect integreras med Android-systemet.\n\nDet kan ta en stund för din data och dina behörigheter att överföras."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Stäng inte appen förrän du får en avisering om att processen är klar."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect-integreringen pågår"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Uppdatering krävs"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect integreras med Android-systemet så att du kan komma åt det direkt från inställningarna."</string>
     <string name="update_button" msgid="4544529019832009496">"Uppdatera"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Starta den här uppdateringen så att Health Connect kan fortsätta att integreras med dina systeminställningar"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Uppdatera nu"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"En systemuppdatering krävs"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Uppdatera telefonens system innan du fortsätter"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Om du redan har uppdaterat telefonens system kan du testa att starta om telefonen för att fortsätta med integreringen"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Uppdatering av Health Connect krävs"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Uppdatera Health Connect-appen till den senaste versionen innan du fortsätter."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Mer utrymme krävs"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"För att fortsätta med integreringen behöver Health Connect <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> lagringsutrymme på telefonen.\n\nFrigör utrymme på telefonen och försök sedan igen."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Försök igen"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Frigör utrymme"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Mer utrymme krävs"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"För att fortsätta med integreringen behöver Health Connect <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> lagringsutrymme på telefonen."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integreringen har pausats"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect-appen stängdes medan den integrerades med Android-systemet.\n\nKlicka på Fortsätt för att öppna appen igen och fortsätta att överföra data och behörigheter."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Slutför detta inom <xliff:g id="TIME_NEEDED">%1$s</xliff:g> för att behålla din Health Connect-data"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Tryck för att fortsätta att integrera Health Connect med Android-systemet. Slutför detta inom <xliff:g id="TIME_NEEDED">%1$s</xliff:g> för att behålla din data."</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Tryck för att fortsätta att integrera Health Connect med Android-systemet."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Fortsätt"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Återuppta Health Connect-integreringen"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Slutför detta inom <xliff:g id="TIME_NEEDED">%1$s</xliff:g> för att behålla din data."</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Appuppdatering krävs"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> behöver uppdateras för att fortsätta synkroniseras med Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Vissa appar behöver uppdateras för att fortsätta synkroniseras med Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> behöver uppdateras för att fortsätta synkroniseras med Health Connect. Uppdateringar kanske inte är tillgängliga för alla appar."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Vissa appar behöver uppdateras för att fortsätta synkroniseras med Health Connect. Uppdateringar kanske inte är tillgängliga för alla appar."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Sök efter uppdateringar"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Läs mer"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect-integrering"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect- integreringen slutfördes inte"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Du får en avisering när den är tillgänglig igen."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect-integreringen slutfördes inte"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Läs mer"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect-integreringen är slutförd"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Öppna"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Nyheter"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Du kan du komma åt Health Connect direkt från inställningarna. Avinstallera Health Connect-appen när som helst för att frigöra lagringsutrymme."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Redigera appkällor"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Enhetens standardinställning"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Appdata"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data från appar med åtkomst till Health Connect visas här"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data från <xliff:g id="APP_NAME">%1$s</xliff:g> visas här"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data från appar med åtkomst till Health Connect visas här"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Dag"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Vecka"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Månad"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Förra månaden"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Poster"</string>
     <string name="tab_access" msgid="7818197975407243701">"Åtkomst"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Vill du tillåta ytterligare åtkomst för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> vill också få åtkomst till dessa Health Connect-inställningar"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Aktivera minst en läsbehörighet för att aktivera åtkomst i bakgrunden eller till tidigare data för den här appen"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Aktivera minst en läsbehörighet för att aktivera åtkomst i bakgrunden för den här appen"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Aktivera minst en läsbehörighet för att aktivera åtkomst till tidigare data för den här appen"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Börja använda Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Synkronisera dina första appar om du vill dela hälso- och träningsdata mellan dem"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Konfigurera"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Se kompatibla appar"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Hitta fler appar att synkronisera med <xliff:g id="APP_NAME">%s</xliff:g> via Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Se på appbutiken"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ställ in ett skärmlås"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Öka säkerheten för din hälsodata genom att ställa in en pinkod, ett mönster eller ett lösenord för enheten"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Ställ in skärmlås"</string>
     <string name="select_all" msgid="837499881590001166">"Markera allt"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Anslutna appar kan inte längre läsa denna data från Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Markerad"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Inte markerad"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Det finns en träningskartrutt"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Nästa dag"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Nästa vecka"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Nästa månad"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Föregående dag"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Föregående vecka"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Föregående månad"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Vill du radera all data permanent?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Vill du radera den markerade datan permanent?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Vill du radera all <xliff:g id="APP_NAME">%s</xliff:g>-data permanent?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Vill du radera de markerade <xliff:g id="APP_NAME">%1$s</xliff:g>-posterna från veckan <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> permanent?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Vill du radera de markerade <xliff:g id="APP_NAME">%1$s</xliff:g>-posterna från <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> permanent?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Vill du radera <xliff:g id="APP_NAME">%s</xliff:g>-posten permanent?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Vill du radera <xliff:g id="DATA_TYPE">%1$s</xliff:g>-data för <xliff:g id="APP_NAME">%2$s</xliff:g> permanent?"</string>
+    <string name="on" msgid="8266542510798355807">"På"</string>
+    <string name="off" msgid="6996623844428550649">"Av"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Öppnades <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Öppnades i går <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Öppnades <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Tillåt alltid"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Tillåt markerade"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"När du använder appen"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Neka alla"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till tränings- och hälsodata?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär åtkomst till <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nTillåt alla eller bestäm för varje enskild behörighet."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Träning och hälsa"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"hela tiden"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"vid användning"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Hela tiden"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Vid användning"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan få åtkomst till all din tränings- och hälsodata <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Tillåts åtkomst"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Tillåts att läsa"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Med dessa behörigheter får <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till data från enhetens sensorer."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> appar tillåts"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Inga appar begär"</string>
+    <string name="allowed" msgid="4158456017482263737">"Tillåts"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Tillåts inte"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Appar med den här behörigheten får åtkomst till <xliff:g id="DATA_TYPE">%s</xliff:g>data från enhetens sensorer."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Vill du ta bort åtkomst till <xliff:g id="DATA_TYPE">%s</xliff:g> för alla appar på klockan?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Bockmarkering"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Kryssmarkering"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"För närvarande kan <xliff:g id="APP_NAME">%1$s</xliff:g> få åtkomst till tränings- och hälsodata <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Vill du ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till tränings- och hälsodata hela tiden?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> har åtkomst till <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Hantera behörigheter för träning och hälsa"</string>
 </resources>
diff --git a/apk/res/values-sw/strings.xml b/apk/res/values-sw/strings.xml
index 347d026..84311aa 100644
--- a/apk/res/values-sw/strings.xml
+++ b/apk/res/values-sw/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Dhibiti data ya afya na siha kwenye kifaa chako na udhibiti programu zinazoweza kuifikia"</string>
     <string name="data_title" msgid="4456619761533380816">"Data na ufikiaji"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Vinjari rekodi za afya"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Angalia rekodi zako za afya na programu zinazoweza kuzifikia"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Aina zote"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Angalia aina zote"</string>
     <string name="no_data" msgid="1906986019249068659">"Hakuna data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Jana"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Data iliyosoma: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Data iliyoandika: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Dhibiti ruhusa"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Saa: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Shughuli"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"Ifikie data yako ya afya"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Isome data ya kalori ulizotumia"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Huruhusu programu kusoma data ya kalori ulizotumia"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Fikia data chinichini"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie data chinichini?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie data chinichini?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ukiruhusu, programu hii inaweza kufikia data ya mazoezi na siha pamoja na rekodi za afya wakati hutumii programu."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ukiruhusu, programu hii inaweza kufikia data ya rekodi za afya wakati hutumii programu."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ukiruhusu, programu hii inaweza kufikia data ya mazoezi na siha wakati hutumii programu."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ukiruhusu, programu hii inaweza kufikia data ya Health Connect wakati hutumii programu."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie data ya awali?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ukiruhusu, programu hii inaweza kufikia data ya mazoezi na siha iliyowekwa kabla ya tarehe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ukiruhusu, programu hii inaweza kufikia data yote ya awali ya mazoezi na siha."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ukiruhusu, programu hii inaweza kufikia data ya Health Connect iliyowekwa kabla ya tarehe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ukiruhusu, programu hii inaweza kufikia data yote ya awali ya Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie data zaidi?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> inataka pia kufikia mipangilio hii ya Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Kufikia data yote chinichini"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Kufikia rekodi za afya chinichini"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Kufikia data ya mazoezi na siha chinichini"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Ruhusu programu hii ifikie data ya mazoezi na siha pamoja na rekodi za afya wakati hutumii programu"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Ruhusu programu hii ifikie data hii wakati hutumii programu"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Ruhusu programu hii ifikie data hii wakati hutumii programu"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Kufikia data chinichini"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Ruhusu programu hii ifikie data ya Health Connect wakati hutumii programu"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Kufikia data ya awali ya mazoezi na siha"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Ruhusu programu hii ifikie data iliyowekwa kabla ya tarehe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Ruhusu programu hii ifikie data yote ya awali"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Kufikia data ya awali"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Ruhusu programu hii ifikie data ya Health Connect iliyowekwa kabla ya tarehe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Ruhusu programu hii ifikie data yote ya awali ya Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Tayari <xliff:g id="APP_NAME">%1$s</xliff:g> inaweza kufikia data ya awali ya rekodi zako za afya"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Pata maelezo zaidi kuhusu ruhusa"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Kufikia data yote chinichini"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Kufikia rekodi za afya chinichini"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Kufikia data ya mazoezi na siha chinichini"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Ruhusu programu hii ifikie data ya mazoezi na siha pamoja na rekodi za afya wakati hutumii programu"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Ruhusu programu hii ifikie data hii wakati hutumii programu"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Ruhusu programu hii ifikie data hii wakati hutumii programu"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Kufikia data chinichini"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Ruhusu programu hii ifikie data ya Health Connect wakati hutumii programu"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Kufikia data ya awali ya mazoezi na siha"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Ruhusu programu hii ifikie data iliyowekwa kabla ya tarehe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Ruhusu programu hii ifikie data yote ya awali"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Kufikia data ya awali"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Ruhusu programu hii ifikie data ya Health Connect iliyowekwa kabla ya tarehe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Ruhusu programu hii ifikie data yote ya awali ya Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Kwa sasa <xliff:g id="APP_NAME">%1$s</xliff:g> haisomi data yoyote ya siha kwa sababu haina ruhusa za kusoma"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"Tayari <xliff:g id="APP_NAME">%1$s</xliff:g> inaweza kufikia data ya awali ya rekodi zako za afya. Zima ruhusa za rekodi za afya za programu hii ili ubadilishe hali hii"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Dhibiti ruhusa za rekodi za afya"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Kubali angalau ruhusa moja ya kusoma ili uwashe kipengele cha ufikiaji wa chinichini au wa data ya awali katika programu hii"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Kubali angalau ruhusa moja ya kusoma ili uwashe kipengele cha ufikiaji wa chinichini katika programu hii"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Kubali angalau ruhusa moja ya kusoma ili uwashe kipengele cha ufikiaji wa data ya awali katika programu hii"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Ruhusu programu hii ifikie data yote ya awali ya Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Ruhusu programu hii ifikie data ya Health Connect wakati hutumii programu"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ukiruhusu, programu hii inaweza kufikia data ya Health Connect wakati hutumii programu."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Kufikia data ya awali"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie data ya awali?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Ruhusu programu hii ifikie data ya Health Connect iliyowekwa kabla ya tarehe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Ruhusu programu hii ifikie data yote ya awali kwenye Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ukiruhusu, programu hii inaweza kufikia data ya Health Connect iliyowekwa kabla ya tarehe <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ukiruhusu, programu hii inaweza kufikia data yote ya awali kwenye Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Kalori ulizotumia"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"kalori ulizotumia"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Isome data ya kalori ulizotumia"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"misukumo ya kiti cha magurudumu"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Isome data ya misukumo ya kiti cha magurudumu"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Iandike data ya misukumo ya kiti cha magurudumu"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Data ya kiwango cha shughuli"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"data ya kiwango cha shughuli"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Kusoma data ya kiwango cha shughuli"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Kuandika data ya kiwango cha shughuli"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Kiwango cha kawaida cha shughuli za ndani ya mwili"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"kiwango cha kawaida cha shughuli za ndani ya mwili"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Isome data ya kiwango cha kawaida cha shughuli za ndani ya mwili"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"kiwango cha joto kwenye ngozi"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Soma kiwango cha joto kwenye ngozi"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Andika kiwango cha joto kwenye ngozi"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Hii inajumuisha rekodi zote za afya zilizosawazishwa na kuwekwa kwenye Health Connect. Huenda hii isiwe rekodi yako kamili ya matibabu na haijumuishi maelezo ya kimatibabu ya rekodi zako za afya."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Rekodi zote za afya"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"rekodi zote za afya"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Andika rekodi zote za afya"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Mizio"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"mizio"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Soma data ya mizio"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Chanjo"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"chanjo"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Soma data ya chanjo"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Matokeo ya Maabara"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"matokeo ya maabara"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Kusoma matokeo ya maabara"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Mizio"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"mizio"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Soma data ya mizio"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Hali"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"hali"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Soma hali"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Chanjo"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"chanjo"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Soma data ya chanjo"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Matokeo ya maabara"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"matokeo ya maabara"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Soma matokeo ya maabara"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Data ya dawa"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"data ya dawa"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Kusoma data ya dawa"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Taarifa binafsi"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"taarifa binafsi"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Kusoma taarifa binafsi"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Maelezo ya wataalamu"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"maelezo ya wataalamu"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Kusoma maelezo ya wataalamu"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Mimba"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"mimba"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Kusoma data ya mimba"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Matatizo"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"matatizo"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Kusoma data ya matatizo"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Taratibu za Matibabu"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"taratibu za matibabu"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Kusoma data ya taratibu za matibabu"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Historia ya Kijamii"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Historia ya kijamii"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"historia ya kijamii"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Kusoma historia ya kijamii"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vipimo Muhimu vya Afya"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Data ya mara ambazo umeenda kumwona daktari"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"data ya mara ambazo umeenda kumwona daktari"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Kusoma data ya mara ambazo umeenda kumwona daktari"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vipimo muhimu vya afya"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vipimo muhimu vya afya"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Kusoma vipimo muhimu vya afya"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Umakinifu"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Kuandika data ya umakinifu"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Ruhusu “<xliff:g id="APP_NAME">%1$s</xliff:g>” isome"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Ruhusu “<xliff:g id="APP_NAME">%1$s</xliff:g>” ili uandike"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Ghairi"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Ruhusu"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Ruhusu zote"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Usiruhusu"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Chagua data unayotaka programu hii isome au iandike kwenye Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Chagua data unayotaka programu hii isome au iandike kwenye Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Chagua data unayotaka programu hii isome kwenye Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Chagua data unayotaka programu hii iandike kwenye Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Ukitoa idhini ya kusoma, programu hii inaweza kusoma data mpya na ya siku 30 zilizopita"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Ukitoa idhini ya kusoma, programu hii inaweza kusoma data mpya na ya awali"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Ungependa kuruhusu programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> kufikia Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Unaweza kupata maelezo ya jinsi <xliff:g id="APP_NAME">%1$s</xliff:g> inavyoshughulikia data katika <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ya msanidi programu"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie data ya mazoezi na siha?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Unaweza kujifunza jinsi <xliff:g id="APP_NAME">%1$s</xliff:g> inavyoshughulikia data yako kwenye <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"sera ya faragha"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie rekodi zako za afya?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Ukiipa ruhusa, programu inaweza kusoma na kuandika data kama vile ya mizio, matokeo ya maabara, chanjo na nyingineyo\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Ukiipa ruhusa, programu inaweza kusoma data kama vile ya mizio, matokeo ya maabara, chanjo na nyingineyo\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Kuhusu rekodi za afya"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data ya kutuma inajumuisha"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Ukiruhusu, <xliff:g id="APP_NAME">%1$s</xliff:g> inaweza kutuma rekodi zako za afya kwenye Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Sawazisha rekodi zako za afya kwenye programu na vyanzo vyako mbalimbali ili uziweke katika sehemu moja"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Ungependa kuondoa ruhusa zote?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Ondoa zote"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data yoyote kutoka Health Connect.\n\nHali hii haitaathiri ruhusa zingine ambazo huenda programu hii inazo, kama vile kamera, maikrofoni, au mahali."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data yoyote kutoka Health Connect, ikiwemo data ya awali.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera na maikrofoni."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data yoyote kutoka kwenye Health Connect, ikiwemo data ya chinichini na ya awali.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera na maikrofoni."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Futa pia data za <xliff:g id="APP_NAME">%1$s</xliff:g> kwenye Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Ungependa kuondoa ruhusa zote?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Ungependa kuondoa ruhusa zote za rekodi za afya?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Ungependa kuondoa ruhusa zote za siha na afya?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Futa pia data ya siha kwenye <xliff:g id="APP_NAME">%1$s</xliff:g> kutoka Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Ungependa kuondoa ruhusa zote za rekodi za afya?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Futa pia rekodi ya afya kwenye <xliff:g id="APP_NAME">%1$s</xliff:g> kutoka Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data hii kutoka Health Connect.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera au maikrofoni."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data hii kutoka Health Connect, ikiwemo data ya chinichini.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera na maikrofoni."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data hii kutoka Health Connect, ikiwemo data ya awali.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera au maikrofoni."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data hii kutoka Health Connect, ikiwemo data ya chinichini na ya awali.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera au maikrofoni."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Ungependa kuondoa ruhusa zote?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data kutoka Health Connect.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera au maikrofoni."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data kutoka Health Connect, ikiwemo data ya chinichini.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera na maikrofoni."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data kutoka Health Connect, ikiwemo data ya awali.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera au maikrofoni."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitaweza tena kusoma au kuandika data kutoka Health Connect, ikiwemo data ya chinichini na ya awali.\n\nHali hii haiathiri ruhusa nyingine ambazo huenda zinatumika kwenye programu hii, kama vile ruhusa za mahali, kamera au maikrofoni."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Futa pia data ya siha na rekodi za afya zilizo kwenye <xliff:g id="APP_NAME">%1$s</xliff:g> kutoka Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Umeondoa ruhusa za programu hii"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Futa pia data yote katika Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Siku inayofuata"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Siku iliyochaguliwa"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Siku iliyotangulia"</string>
     <string name="default_error" msgid="7966868260616403475">"Hitilafu fulani imetokea. Tafadhali jaribu tena."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Nyenzo Isiyojulikana"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Data ya chanzo"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Bano lililofunguliwa."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Bano lililofungwa."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Thamani ya Sehemu ya <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Programu hizi hazina tena ufikiaji, lakini bado zina data iliyohifadhiwa kwenye Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> inaweza kusoma data iliyowekwa baada ya <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Ili udhibiti ruhusa zingine za Android ambazo programu hii inaweza kufikia, nenda kwenye Mipangilio &gt; Programu"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Data unayoruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie inasimamiwa na sera yake ya faragha"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Unaweza kupata maelezo kuhusu jinsi <xliff:g id="APP_NAME">%1$s</xliff:g> inavyoshughulikia data yako katika sera ya faragha ya msanidi programu"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Ili udhibiti ruhusa zingine za Android ambazo programu hii inaweza kufikia, nenda kwenye Mipangilio kisha uguse Programu"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Soma sera ya faragha"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Ilifikiwa katika saa 24 zilizopita"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Ufikiaji wa programu"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Kwa sasa hujasakinisha programu zozote zinazooana"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Ufikiaji wa ziada"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Data ya zamani, data ya chinichini"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Ruhusa za ziada za programu hii zimeondolewa"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Ruhusa"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Siha na afya"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Mazoezi, kulala, lishe na mengineyo"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Rekodi za afya"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"rekodi za afya"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Matokeo ya maabara, dawa, chanjo na zaidi"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Matokeo ya maabara, dawa, chanjo na zaidi"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Imeondoa ruhusa za programu"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect imeondoa ruhusa za <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect imeondoa ruhusa za <xliff:g id="APP_DATA_0">%1$s</xliff:g> na <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Nenda kwenye Duka la Google Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Anza kutumia Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect huhifadhi data yako ya afya na siha, hali inayorahisisha mchakato wa kusawazisha programu tofauti kwenye kifaa chako"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect huhifadhi na kusawazisha data yako ya afya na siha kutoka kwenye programu tofauti.\n\n"<b>"Data ya siha,"</b>" ikiwa ni pamoja na vipindi vya mazoezi ya mwili, hatua, lishe, kulala na mengine mengi\n\n"<b>"Rekodi za afya,"</b>" ikiwa ni pamoja na chanjo, matokeo ya maabara na mengine mengi"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Ukiwa na Health Connect unaweza"</string>
     <string name="share_data" msgid="3481932156368883946">"Shiriki data na programu zako"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Chagua data ambayo kila programu inaweza kusoma na kuandika kwenye Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Dhibiti mipangilio na faragha yako"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Mtiririko mdogo wa damu"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Mtiririko kiasi wa damu"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Mtiririko mkubwa wa damu"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Mtiririko wa kiwango kisichojulikana cha hedhi"</string>
     <string name="period_day" msgid="3821944462093965882">"Siku ya <xliff:g id="DAY">%1$d</xliff:g> kati ya siku <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> za hedhi"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Hedhi (siku 1)}other{Hedhi (siku #)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Yai limepevuka"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Yai halijapevuka"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Juu"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Muziki"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Mengineyo"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Bila mwongozo"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Wastani"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Kwa nguvu"</string>
     <string name="minute_duration" msgid="9035288227090160206">"Dak <xliff:g id="MINUTE">%1$s</xliff:g>"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"Saa <xliff:g id="HOUR">%1$s</xliff:g> dak <xliff:g id="MIN">%2$s</xliff:g>"</string>
     <string name="hour_duration" msgid="3472489613837138711">"Saa <xliff:g id="HOUR">%1$s</xliff:g>"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Shughuli ya ujumuishaji inaendelea"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Programu ya Health Connect inajumuishwa na mfumo wa Android.\n\nInaweza kuchukua muda wakati data na ruhusa zako zinahamishwa."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Usifunge programu hadi upate arifa kwamba shughuli imekamilika."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Programu ya Health Connect inaendelea kujumuishwa"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Unahitaji kusasisha"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Programu ya Health Connect inajumuishwa na mfumo wa Android ili uweze kuifikia moja kwa moja kupitia mipangilio yako."</string>
     <string name="update_button" msgid="4544529019832009496">"Sasisha"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Anzisha sasisho hili ili programu ya Health Connect iweze kuendelee kujumuishwa na mipangilio ya mfumo wako"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Sasisha sasa"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Inahitaji sasisho la mfumo"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Kabla ya kuendelea, sasisha mfumo wa simu yako."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Ikiwa tayari umesasisha mfumo wa simu yako, jaribu kuzima kisha uwashe simu yako ili uendelee na shughuli ya ujumuishaji"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Programu ya Health Connect inahitaji kusasishwa"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Kabla ya kuendelea, sasisha programu ya Health Connect ili utumie toleo jipya zaidi."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Nafasi zaidi inahitajika"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Programu ya Health Connect inahitaji nafasi ya kuhifadhi ya <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> kwenye simu yako ili shughuli ya ujumuishaji iendelee.\n\nFuta baadhi ya vipengee ili upate nafasi kwenye simu yako kisha ujaribu tena."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Jaribu tena"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Futa ili upate nafasi"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Nafasi zaidi inahitajika"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Programu ya Health Connect inahitaji nafasi ya kuhifadhi ya <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> kwenye simu yako ili iendelee na shughuli ya ujumuishaji."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Shughuli ya ujumuishaji imesitishwa"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Programu ya Health Connect ilifungwa wakati ilikuwa inajumuishwa na mfumo wa Android.\n\nBofya endelea ili ufungue upya programu na uendelee kuhamisha data na ruhusa zako."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Ili kuhifadhi data ya programu yako ya Health Connect, kamilisha shughuli hii ndani ya <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Gusa ili uendelee kujumuisha programu ya Health Connect na mfumo wa Android. Ili kuhifadhi data yako, kamilisha shughuli hii ndani ya <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Gusa ili uendelee kujumuisha programu ya Health Connect na mfumo wa Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Endelea"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Endelea na shughuli ya ujumuishaji wa programu ya Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Ili kuhifadhi data yako, kamilisha shughuli hii ndani ya <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Unahitaji kusasisha programu"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> inahitaji kusasishwa ili iendelee kusawazishwa na Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Baadhi ya programu zinahitaji kusasishwa ili ziendelee kusawazishwa na Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> inahitaji kusasishwa ili iendelee kusawazishwa na Health Connect. Huenda masasisho yasipatikane kwa programu zote."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Baadhi ya programu zinahitaji kusasishwa ili ziendelee kusawazishwa na Health Connect. Huenda masasisho yasipatikane kwa programu zote."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Angalia masasisho"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Pata maelezo zaidi"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Ujumuishaji wa programu ya Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Shughuli ya ujumuishaji wa programu ya Health Connect haijakamilika"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Utapata arifa itakapopatikana tena."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Nimeelewa"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Shughuli ya ujumuishaji wa programu ya Health Connect haijakamilika"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Endelea kusoma"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Programu ya Health Connect imemaliza kujumuishwa"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Fungua"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Mambo mapya"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Sasa unaweza kufikia programu ya Health Connect moja kwa moja kupitia mipangilio yako. Ondoa programu ya Health Connect wakati wowote ili upate nafasi ya kuhifadhi."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Nimeelewa"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Badilisha vyanzo vya programu"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Hali chaguomsingi ya kifaa"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Data ya programu"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Data kutoka kwa programu zinazofikia Health Connect itaonekana hapa"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Data kutoka kwenye <xliff:g id="APP_NAME">%1$s</xliff:g> itaonyeshwa hapa"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Data kutoka kwenye programu zinazofikia Health Connect itaonyeshwa hapa"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Siku"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Wiki"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Mwezi"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Mwezi uliopita"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Vipengee"</string>
     <string name="tab_access" msgid="7818197975407243701">"Idhini"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Ungependa kukubali ufikiaji wa ruhusa za ziada za <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> inataka pia kufikia mipangilio hii ya Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Kubali angalau ruhusa moja ya kusoma ili uwashe kipengele cha ufikiaji wa chinichini au wa data ya awali katika programu hii"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Kubali angalau ruhusa moja ya kusoma ili uwashe kipengele cha ufikiaji wa chinichini katika programu hii"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Kubali angalau ruhusa moja ya kusoma ili uwashe kipengele cha ufikiaji wa data ya awali katika programu hii"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Anza kutumia Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sawazisha programu zako za kwanza ili ziweze kufikia data sawa ya afya na siha"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Weka mipangilio"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Angalia programu zinazooana"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Pata programu zaidi za kusawazisha na <xliff:g id="APP_NAME">%s</xliff:g> kupitia Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Angalia kwenye duka la programu"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Weka mbinu ya kufunga skrini"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Weka PIN, mchoro au nenosiri kwenye kifaa hiki ili uimarishe usalama wa data yako ya afya"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Weka mbinu ya kufunga skrini"</string>
     <string name="select_all" msgid="837499881590001166">"Chagua zote"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Programu zilizounganishwa hazitaweza tena kusoma data hii kutoka Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Imechaguliwa"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Haijachaguliwa"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Ramani inayoonyesha njia ya kufanyia mazoezi inapatikana"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Siku inayofuata"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Wiki ijayo"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Mwezi ujao"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Siku iliyotangulia"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Wiki iliyopita"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Mwezi uliopita"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Ungependa kufuta kabisa data yote?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Ungependa kufuta kabisa data uliyochagua?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Ungependa kufuta kabisa data yote ya <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Ungependa kufuta kabisa data uliyochagua ya <xliff:g id="APP_NAME">%1$s</xliff:g> ya wiki ya <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Ungependa kufuta kabisa data uliyochagua ya <xliff:g id="APP_NAME">%1$s</xliff:g> ya <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Ungependa kufuta kabisa data hii ya <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Ungependa kufuta kabisa data ya <xliff:g id="DATA_TYPE">%1$s</xliff:g> kwenye <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Kimewashwa"</string>
+    <string name="off" msgid="6996623844428550649">"Kimezimwa"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Kilifunguliwa <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Kilifunguliwa jana <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Kilifunguliwa <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Ruhusu kila wakati"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Ruhusu ulizochagua"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Unapotumia programu"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Kataa zote"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie data ya mazoezi na siha?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa ya kufikia data ya <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nChagua kuruhusu zote au udhibiti kila ruhusa kivyake."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Siha na afya"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"kila wakati"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"inapotumika"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Kila wakati"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Inapotumika"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> ina idhini ya kufikia data yako yote ya siha na afya <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Inaruhusiwa kufikia"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Inaruhusiwa kusoma"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ruhusa hizi huipa <xliff:g id="APP_NAME">%1$s</xliff:g> idhini ya kufikia data kwenye vitambuzi vya kifaa chako."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Programu <xliff:g id="NUMBER_0">%1$d</xliff:g> kati ya <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> zinaruhusiwa"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Hakuna programu zinazoomba"</string>
+    <string name="allowed" msgid="4158456017482263737">"Inaruhusiwa"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Hairuhusiwi"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Programu zilizo na ruhusa hii zinaweza kufikia data ya <xliff:g id="DATA_TYPE">%s</xliff:g> kwenye vitambuzi vya kifaa chako."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Ungependa kuondoa ruhusa ya programu zote kufikia <xliff:g id="DATA_TYPE">%s</xliff:g> kwenye saa yako?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Alama ya kuteua"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Alama ya kuondoa"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Kwa sasa, <xliff:g id="APP_NAME">%1$s</xliff:g> inaweza kufikia data ya siha na afya <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Ungependa kuruhusu <xliff:g id="APP_NAME">%1$s</xliff:g> ifikie data ya siha na afya kila wakati?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> inaweza kufikia <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Dhibiti ruhusa za siha na afya"</string>
 </resources>
diff --git a/apk/res/values-ta/strings.xml b/apk/res/values-ta/strings.xml
index f26b5de..53aaced 100644
--- a/apk/res/values-ta/strings.xml
+++ b/apk/res/values-ta/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"ஆரோக்கியம் மற்றும் உடற்பயிற்சி குறித்த தரவை உங்கள் சாதனத்தில் நிர்வகிக்கலாம், அதை எந்தெந்த ஆப்ஸ் அணுகலாம் என்பதைக் கட்டுப்படுத்தலாம்"</string>
     <string name="data_title" msgid="4456619761533380816">"தரவு மற்றும் அணுகல்"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"உடல்நலம் குறித்த சுருக்கமான தகவல்களைக் காட்டு"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"உங்கள் உடல்நலம் குறித்த சுருக்கமான தகவல்களையும் அவற்றை எந்த ஆப்ஸ் அணுகலாம் என்பதையும் பார்க்கலாம்"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"அனைத்து வகைகளும்"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"அனைத்து வகைகளையும் காட்டு"</string>
     <string name="no_data" msgid="1906986019249068659">"தரவு எதுவும் இல்லை"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"நேற்று"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"படிக்கப்பட்டவை: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"எழுதப்பட்டவை: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"அனுமதிகளை நிர்வகியுங்கள்"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"நேரம்: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"செயல்பாடு"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"உங்கள் உடல் ஆரோக்கியம் தொடர்பான தரவை அணுகும்"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"எரித்த கலோரிகளை வாசிக்கும்"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"எரிக்கப்பட்ட கலோரிகள் குறித்த தரவை வாசிக்க ஆப்ஸை அனுமதிக்கும்"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"பின்னணியில் தரவை அணுகுதல்"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"பின்னணியில் தரவை அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"பின்னணியில் தரவை அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"நீங்கள் அனுமதித்தால், ஆப்ஸைப் பயன்படுத்தாதபோது உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவையும் உடல்நலம் குறித்த சுருக்கமான தகவல்களையும் இந்த ஆப்ஸ் அணுகலாம்."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"நீங்கள் அனுமதித்தால், ஆப்ஸைப் பயன்படுத்தாதபோது உடல்நலம் குறித்த சுருக்கமான தகவல்களை இந்த ஆப்ஸ் அணுகலாம்."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"நீங்கள் அனுமதித்தால், ஆப்ஸைப் பயன்படுத்தாதபோது உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவை இந்த ஆப்ஸ் அணுகலாம்."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"நீங்கள் அனுமதித்தால், ஆப்ஸைப் பயன்படுத்தாதபோது Health Connect தரவை இந்த ஆப்ஸ் அணுகலாம்."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"முந்தைய தரவை அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"நீங்கள் அனுமதித்தால், <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>க்கு முன்பு சேர்க்கப்பட்ட உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவை இந்த ஆப்ஸ் அணுகலாம்."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"நீங்கள் அனுமதித்தால், முந்தைய உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவு அனைத்தையும் இந்த ஆப்ஸ் அணுகலாம்."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"நீங்கள் அனுமதித்தால், <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>க்கு முன்பு சேர்க்கப்பட்ட Health Connect தரவை இந்த ஆப்ஸ் அணுகலாம்."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"நீங்கள் அனுமதித்தால், முந்தைய Health Connect தரவு அனைத்தையும் இந்த ஆப்ஸ் அணுகலாம்."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கான கூடுதல் அணுகலை வழங்கவா?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> இந்த Health Connect அமைப்புகளையும் அணுகக் கேட்கிறது"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"பின்னணியில் அனைத்துத் தரவையும் அணுகுதல்"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"பின்னணியில் உடல்நலம் குறித்த சுருக்கமான தகவல்களை அணுகுதல்"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"பின்னணியில் உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவை அணுகுதல்"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ஆப்ஸை நீங்கள் பயன்படுத்தாதபோது, ஆரோக்கியம் மற்றும் உடற்பயிற்சி குறித்த தரவையும் உடல்நலம் குறித்த சுருக்கமான தகவல்களையும் அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ஆப்ஸை நீங்கள் பயன்படுத்தாதபோது, இந்தத் தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ஆப்ஸை நீங்கள் பயன்படுத்தாதபோது, இந்தத் தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"பின்னணியில் தரவை அணுகுதல்"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"ஆப்ஸை நீங்கள் பயன்படுத்தாதபோது, Health Connect தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த முந்தைய தரவை அணுகுதல்"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>க்கு முன்பு சேர்க்கப்பட்ட தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"முந்தைய தரவு அனைத்தையும் அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"முந்தைய தரவை அணுகுதல்"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>க்கு முன்பு சேர்க்கப்பட்ட Health Connect தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"முந்தைய Health Connect தரவு அனைத்தையும் அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"உங்கள் உடல்நலம் குறித்த சுருக்கமான தகவல்கள் தொடர்பான முந்தைய தரவை ஏற்கெனவே <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் அணுக முடியும்"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"அனுமதிகள் குறித்து மேலும் அறிக"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"பின்னணியில் அனைத்துத் தரவையும் அணுகுதல்"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"பின்னணியில் உடல்நலம் குறித்த சுருக்கமான தகவல்களை அணுகுதல்"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"பின்னணியில் உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவை அணுகுதல்"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ஆப்ஸை நீங்கள் பயன்படுத்தாதபோது, ஆரோக்கியம் மற்றும் உடற்பயிற்சி குறித்த தரவையும் உடல்நலம் குறித்த சுருக்கமான தகவல்களையும் அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ஆப்ஸை நீங்கள் பயன்படுத்தாதபோது, இந்தத் தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ஆப்ஸை நீங்கள் பயன்படுத்தாதபோது, இந்தத் தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"பின்னணியில் தரவை அணுகுதல்"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"ஆப்ஸை நீங்கள் பயன்படுத்தாதபோது, Health Connect தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த முந்தைய தரவை அணுகுதல்"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>க்கு முன்பு சேர்க்கப்பட்ட தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"முந்தைய தரவு அனைத்தையும் அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"முந்தைய தரவை அணுகுதல்"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>க்கு முன்பு சேர்க்கப்பட்ட Health Connect தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"முந்தைய Health Connect தரவு அனைத்தையும் அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"படிப்பதற்கான அனுமதிகள் <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கு வழங்கப்படாததால் உடற்பயிற்சித் தரவு எதுவும் தற்போது படிக்கப்படவில்லை"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"உங்கள் உடல்நலப் பதிவுகள் தொடர்பான முந்தைய தரவை ஏற்கெனவே <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் அணுக முடியும். இதை மாற்ற, இந்த ஆப்ஸுக்கான உடல்நலப் பதிவு அனுமதிகளை முடக்குங்கள்."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"உடல்நலப் பதிவு அனுமதிகளை நிர்வகியுங்கள்"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"இந்த ஆப்ஸுக்கான பின்புல அல்லது கடந்தகாலத் தரவு அணுகலை இயக்க, குறைந்தபட்சம் \'படிப்பதற்கான அனுமதி\' ஒன்றை இயக்கவும்"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"இந்த ஆப்ஸுக்கான பின்புல அணுகலை இயக்க, குறைந்தபட்சம் \'படிப்பதற்கான அனுமதி\' ஒன்றை இயக்கவும்"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"இந்த ஆப்ஸுக்கான கடந்தகாலத் தரவு அணுகலை இயக்க, குறைந்தபட்சம் \'படிப்பதற்கான அனுமதி\' ஒன்றை இயக்கவும்"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"முந்தைய Health Connect தரவு அனைத்தையும் அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
     <string name="background_read_description" msgid="3203594555849969283">"நீங்கள் ஆப்ஸைப் பயன்படுத்தாதபோது, Health Connect தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கும்"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"அனுமதித்தால், நீங்கள் ஆப்ஸைப் பயன்படுத்தாதபோது, Health Connect தரவை இந்த ஆப்ஸ் அணுகும்."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"முந்தைய தரவை அணுகுதல்"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"முந்தைய தரவை அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>க்கு முன்பு சேர்க்கப்பட்ட Health Connect தரவை அணுக இந்த ஆப்ஸை அனுமதிக்கவும்"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"முந்தைய Health Connect தரவு அனைத்தையும் அணுக இந்த ஆப்ஸை அனுமதிக்கலாம்"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"அனுமதித்தால், <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>க்கு முன்பு சேர்க்கப்பட்ட Health Connect தரவை இந்த ஆப்ஸ் பயன்படுத்தும்."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"நீங்கள் அனுமதித்தால், முந்தைய Health Connect தரவு அனைத்தையும் இந்த ஆப்ஸால் அணுக முடியும்."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"செயல்பாட்டின்போது எரிக்கப்பட்ட கலோரிகள்"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"செயல்பாட்டின் மூலம் எரிக்கப்பட்ட கலோரிகள்"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"செயல்பாட்டின்போது எரிக்கப்பட்ட கலோரிகள் தொடர்பான தரவை வாசிக்கும்"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"வீல்ச்சேர் புஷ்கள்"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"வீல்ச்சேர் புஷ்கள் தொடர்பான தரவை வாசிக்கும்"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"வீல்ச்சேர் புஷ்கள் தொடர்பான தரவை எழுதும்"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"செயல்பாட்டின் தீவிரத்தன்மை"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"செயல்பாட்டின் தீவிரத்தன்மை"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"செயல்பாட்டின் தீவிரத்தன்மையைப் பார்க்கலாம்"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"செயல்பாட்டின் தீவிரத்தன்மையை எழுதலாம்"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"இயல்பான வளர்சிதைமாற்ற வீதம்"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"இயல்பான வளர்சிதைமாற்ற வீதம்"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"இயல்பான வளர்சிதைமாற்ற வீதம் தொடர்பான தரவை வாசிக்கும்"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"தோல் வெப்பநிலை"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"தோல் வெப்பநிலையைப் படி"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"தோல் வெப்பநிலையை எழுது"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Health Connect உடன் ஒத்திசைக்கப்பட்ட மற்றும் அதில் சேர்க்கப்பட்ட உடல்நலம் குறித்த சுருக்கமான தகவல்கள் இதில் அடங்கும். இது உங்களின் முழுமையான மருத்துப் பதிவாக இல்லாமல் இருக்கலாம் மற்றும் உங்கள் உடல்நலம் குறித்த சுருக்கமான தகவல்களின் மருத்துவ விளக்கமும் இதில் இருக்காது."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"உடல்நலம் குறித்த சுருக்கமான தகவல்கள் அனைத்தும்"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"உடல்நலம் குறித்த சுருக்கமான தகவல்கள் அனைத்தும்"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"உடல்நலம் குறித்த சுருக்கமான தகவல்கள் அனைத்தையும் எழுதும்"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"ஒவ்வாமைகள்"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"ஒவ்வாமைகள்"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"ஒவ்வாமைகள் தொடர்பான தரவை வாசிக்கும்"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"நோய்த்தடுப்பூசி"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"நோய்த்தடுப்பூசி"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"நோய்த்தடுப்பூசி தொடர்பான தரவைப் படிக்க அனுமதிக்கும்"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ஆய்வக முடிவுகள்"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ஆய்வக முடிவுகள்"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ஆய்வக முடிவுகளைக் காட்டும்"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"ஒவ்வாமைகள்"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"ஒவ்வாமைகள்"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"ஒவ்வாமைகள் தொடர்பான தரவைப் படிக்கும்"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"நிபந்தனைகள்"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"நிபந்தனைகள்"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"நிபந்தனைகளை வாசிக்கும்"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"தடுப்பூசிகள்"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"தடுப்பூசிகள்"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"தடுப்பூசிகள் தொடர்பான தரவைப் படிக்கும்"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ஆய்வக முடிவுகள்"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ஆய்வக முடிவுகள்"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ஆய்வக முடிவுகள் தொடர்பான தரவைப் படிக்கும்"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"மருந்துகள்"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"மருந்துகள்"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"மருந்துகள் தரவை காட்டும்"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"தனிப்பட்ட விவரங்கள்"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"தனிப்பட்ட விவரங்கள்"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"தனிப்பட்ட விவரங்களை வாசிக்கும்"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"மருத்துவ நிபுணரின் விவரங்கள்"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"மருத்துவ நிபுணரின் விவரங்கள்"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"மருத்துவ நிபுணரின் விவரங்களை வாசிக்கும்"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"கர்ப்பம்"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"கர்ப்பம்"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"கர்ப்பம் தொடர்பான தரவைக் காட்டும்"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"உடல்நலச் சிக்கல்கள்"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"உடல்நலச் சிக்கல்கள்"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"பயனரின் உடல்நலச் சிக்கல்களைக் காட்டும்"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"மருத்துவச் சிகிச்சைகள்"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"மருத்துவச் சிகிச்சைகள்"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"மருத்துவச் சிகிச்சைகளைக் காட்டும்"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"வாழ்க்கைப் பதிவு"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"உடல்நலம் குறித்த பதிவு"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"வாழ்க்கைப் பதிவு"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"வாழ்க்கைப் பதிவைக் காட்டும்"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"உடல் இயக்க அளவீடுகள்"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"வருகைகள்"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"வருகைகள்"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"வருகைகளை வாசிக்கும்"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"உடல் இயக்க அளவீடுகள்"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"உடல் இயக்க அளவீடுகள்"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"உடல் இயக்க அளவீடுகளைக் காட்டும்"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"மனம்தெளிந்த நிலை"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"மனம்தெளிந்த நிலை தொடர்பான தரவை எழுதுங்கள்"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"படிக்க “<xliff:g id="APP_NAME">%1$s</xliff:g>” ஆப்ஸை அனுமதிக்கவும்"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"எழுத “<xliff:g id="APP_NAME">%1$s</xliff:g>” ஆப்ஸை அனுமதிக்கவும்"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"ரத்துசெய்"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"அனுமதி"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"அனைத்தையும் அனுமதி"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"அனுமதிக்க வேண்டாம்"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Health Connectடில் இந்த ஆப்ஸ் எந்தத் தரவை வாசிக்க/எழுத வேண்டும் என்பதை நீங்கள் தேர்வுசெய்யவும்"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Health Connectடில் இந்த ஆப்ஸ் எந்தத் தரவைப் படிக்க/எழுத வேண்டும் என்பதைத் தேர்வுசெய்யவும்"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connectடில் இந்த ஆப்ஸ் எந்தத் தரவைப் படிக்க வேண்டும் என்பதைத் தேர்வுசெய்யவும்"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Health Connectடில் இந்த ஆப்ஸ் எந்தத் தரவை எழுத வேண்டும் என்பதைத் தேர்வுசெய்யவும்"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"வாசிப்பதற்கான அணுகலை வழங்கினால், புதிய தரவையும் கடந்த 30 நாட்களில் பெறப்பட்ட தரவையும் ஆப்ஸ் வாசிக்க முடியும்"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"வாசிப்பதற்கான அணுகலை வழங்கினால், புதிய தரவையும் முந்தைய தரவையும் ஆப்ஸ் வாசிக்க முடியும்"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Health Connectடை அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்க வேண்டுமா?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் உங்கள் தரவை எப்படிக் கையாளுகிறது என்பதை டெவெலப்பரின் <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> பக்கத்தில் நீங்கள் அறிந்துகொள்ளலாம்"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவை அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் உங்கள் தரவை எப்படிக் கையாளுகிறது என்பதை <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> பக்கத்தில் நீங்கள் தெரிந்துகொள்ளலாம்"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"தனியுரிமைக் கொள்கை"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"உங்கள் உடல்நலம் குறித்த சுருக்கமான தகவல்களை அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"நீங்கள் அனுமதி வழங்கினால் ஒவ்வாமைகள், ஆய்வக முடிவுகள், தடுப்பூசிகள் போன்ற தரவை ஆப்ஸ் படிக்கலாம் எழுதலாம்\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"நீங்கள் அனுமதி வழங்கினால் ஒவ்வாமைகள், ஆய்வக முடிவுகள், தடுப்பூசிகள் போன்ற தரவை ஆப்ஸ் படிக்கலாம்\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"உடல்நலம் குறித்த சுருக்கமான தகவல்கள் பற்றிய அறிமுகம்"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"பகிர்வதற்கான தரவும் அடங்கும்"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"நீங்கள் அனுமதித்தால் உங்கள் உடல்நலம் குறித்த சுருக்கமான தகவல்களை Health Connect உடன் <xliff:g id="APP_NAME">%1$s</xliff:g> பகிரலாம்."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"வெவ்வேறு ஆப்ஸ் மற்றும் மூலங்களில் இருந்து உங்கள் உடல்நலம் குறித்த சுருக்கமான தகவல்களை ஒரே இடத்தில் வைத்திருக்க அவற்றை ஒத்திசைக்கவும்"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"எல்லா அனுமதிகளையும் அகற்றவா?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"அனைத்தையும் அகற்று"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Health Connect ஆப்ஸிலுள்ள எந்தவொரு தரவையும் <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"கடந்தகாலத் தரவு உட்பட Health Connect ஆப்ஸிலுள்ள எந்தவொரு தரவையும் <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (இருப்பிடம், கேமரா, மைக்ரோஃபோன் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"பின்புலத் தரவு, கடந்தகாலத் தரவு உட்பட Health Connect ஆப்ஸிலுள்ள எந்தவொரு தரவையும் <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (இருப்பிடம், கேமரா, மைக்ரோஃபோன் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connectடில் இருந்து <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸின் தரவையும் நீக்கு"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"எல்லா அனுமதிகளையும் அகற்றவா?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"உடல்நலப் பதிவுக்கான எல்லா அனுமதிகளையும் அகற்றவா?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"உடற்பயிற்சி &amp; ஆரோக்கியத்திற்கான எல்லா அனுமதிகளையும் அகற்றவா?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connect ஆப்ஸில் இருந்து <xliff:g id="APP_NAME">%1$s</xliff:g> பெற்ற உடற்பயிற்சித் தரவையும் நீக்கு"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"உடல்நலப் பதிவுக்கான எல்லா அனுமதிகளையும் அகற்றவா?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connect ஆப்ஸில் இருந்து <xliff:g id="APP_NAME">%1$s</xliff:g> பெற்ற உடல்நலம் குறித்த சுருக்கமான தகவல்களையும் நீக்கு"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Health Connect ஆப்ஸிலுள்ள இந்தத் தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"பின்புலத் தரவு உட்பட Health Connect ஆப்ஸிலுள்ள இந்தத் தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"கடந்தகாலத் தரவு உட்பட Health Connect ஆப்ஸிலுள்ள இந்தத் தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"பின்புலத் தரவு, கடந்தகாலத் தரவு உட்பட Health Connect ஆப்ஸிலுள்ள இந்தத் தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"எல்லா அனுமதிகளையும் அகற்றவா?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Health Connect ஆப்ஸிலுள்ள தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"பின்புலத் தரவு உட்பட Health Connect ஆப்ஸிலுள்ள தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"கடந்தகாலத் தரவு உட்பட Health Connect ஆப்ஸிலுள்ள தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"பின்புலத் தரவு, கடந்தகாலத் தரவு உட்பட Health Connect ஆப்ஸிலுள்ள தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் இனி திருத்தவோ பார்க்கவோ முடியாது.\n\nஇது இந்த ஆப்ஸுக்கு வழங்கப்பட்டுள்ள பிற அனுமதிகளில் (கேமரா, மைக்ரோஃபோன், இருப்பிடம் போன்றவை) எந்த மாற்றத்தையும் ஏற்படுத்தாது."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Health Connect ஆப்ஸில் இருந்து <xliff:g id="APP_NAME">%1$s</xliff:g> பெற்ற உடற்பயிற்சித் தரவையும் உடல்நலம் குறித்த சுருக்கமான தகவல்களையும் நீக்கு"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"இந்த ஆப்ஸுக்கான அனுமதிகள் அகற்றப்பட்டன"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"அனைத்து Health Connect தரவையும் நீக்கு"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"அடுத்த நாள்"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"தேர்ந்தெடுத்துள்ள நாள்"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"முந்தைய நாள்"</string>
     <string name="default_error" msgid="7966868260616403475">"ஏதோ தவறாகிவிட்டது. மீண்டும் முயலவும்."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"அறியப்படாத ஆதாரம்"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"மூலத் தரவு"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>திறந்த சுருள் அடைப்புக்குறி."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>மூடிய சுருள் அடைப்புக்குறி."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> <xliff:g id="FIELD">%2$s</xliff:g> புலத்தின் மதிப்பு"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"இந்த ஆப்ஸுக்கு இனி அணுகல் இருக்காது என்றாலும் அவை சேமித்த தரவு Health Connectடில் அப்படியே இருக்கும்"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>க்குப் பிறகு சேர்க்கப்பட்ட தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் படிக்க முடியும்"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"இந்த ஆப்ஸ் அணுகக்கூடிய பிற Android அனுமதிகளை நிர்வகிக்க, அமைப்புகள் &gt; ஆப்ஸ் என்பதற்குச் செல்லுங்கள்"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுடன் நீங்கள் பகிரும் தரவு அதன் தனியுரிமைக் கொள்கையின்படி நிர்வகிக்கப்படும்"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் உங்கள் தரவை எப்படிக் கையாளுகிறது என்பதை டெவெலப்பரின் தனியுரிமைக் கொள்கையில் நீங்கள் தெரிந்துகொள்ளலாம்"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"இந்த ஆப்ஸ் அணுகக்கூடிய பிற Android அனுமதிகளை நிர்வகிக்க, அமைப்புகளுக்குச் சென்று ஆப்ஸ் என்பதைத் தட்டவும்"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"தனியுரிமைக் கொள்கையைக் காண்க"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"கடந்த 24 மணிநேரத்தில் அணுகியது"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ஆப்ஸ் அணுகல்"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"தற்போது இணக்கமான ஆப்ஸ் எதுவும் நிறுவப்பட்டிருக்கவில்லை"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"கூடுதல் அணுகல்"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"முந்தைய தரவு, பின்புலத் தரவு"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"இந்த ஆப்ஸுக்கான கூடுதல் அனுமதிகள் அகற்றப்பட்டன"</string>
     <string name="permissions_header" msgid="6519976063360071569">"அனுமதிகள்"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"உடற்பயிற்சியும் ஆரோக்கியமும்"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"உடற்பயிற்சி, உறக்கம், ஊட்டச்சத்து &amp; பிற"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"உடல்நலம் குறித்த சுருக்கமான தகவல்கள்"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"உடல்நலம் குறித்த சுருக்கமான தகவல்கள்"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ஆய்வக முடிவு, மருந்து, நோய்த்தடுப்பூசி &amp; பிற"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ஆய்வக முடிவு, மருந்து, தடுப்பூசி &amp; பிற"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"அகற்றப்பட்ட ஆப்ஸ் அனுமதிகள்"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"<xliff:g id="APP_DATA">%s</xliff:g> ஆப்ஸுக்கான அனுமதிகளை Health Connect அகற்றியுள்ளது"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"<xliff:g id="APP_DATA_0">%1$s</xliff:g>, <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> ஆகிய ஆப்ஸுக்கான அனுமதிகளை Health Connect அகற்றியுள்ளது"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Storeருக்குச் செல்லுங்கள்"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect ஆப்ஸைப் பயன்படுத்தத் தொடங்குங்கள்"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect ஆப்ஸ் உங்கள் ஆரோக்கியம் மற்றும் உடற்பயிற்சி குறித்த தரவைச் சேமிக்கிறது. இந்த ஆப்ஸ் மூலம் சாதனத்திலுள்ள வெவ்வேறு ஆப்ஸை நீங்கள் எளிதாக ஒத்திசைக்கலாம்."</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect வெவ்வேறு ஆப்ஸிலிருந்து ஆரோக்கியம் மற்றும் உடற்பயிற்சி குறித்த தரவைச் சேமித்து ஒத்திசைக்கிறது.\n\n"<b>"உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவு,"</b>" இதில் உடற்பயிற்சி அமர்வுகள், காலடிகள், ஊட்டச்சத்து, உறக்கம் மற்றும் பல அடங்கும்\n\n"<b>"உடல்நலம் குறித்த சுருக்கமான தகவல்கள்,"</b>" இதில் தடுப்பூசிகள், ஆய்வக முடிவுகள் மற்றும் பல அடங்கும்"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect மூலம் இவற்றைச் செய்யலாம்:"</string>
     <string name="share_data" msgid="3481932156368883946">"ஆப்ஸுடன் தரவைப் பகிர்தல்"</string>
     <string name="share_data_description" msgid="2919871301634375092">"ஒவ்வொரு ஆப்ஸும் Health Connectடில் வாசிக்க/எழுத வேண்டிய தரவை நீங்கள் தேர்வுசெய்யலாம்."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"உங்கள் அமைப்புகளையும் தனியுரிமையையும் நிர்வகித்தல்"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"குறைந்த ரத்தப்போக்கு"</string>
     <string name="flow_medium" msgid="3783688724668943154">"மிதமான ரத்தப்போக்கு"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"அதிக ரத்தப்போக்கு"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"எதிர்பார்க்காத மாதவிடாய்"</string>
     <string name="period_day" msgid="3821944462093965882">"மாதவிடாய் காலத்தின் <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> நாட்களில் <xliff:g id="DAY">%1$d</xliff:g>வது நாள்"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{மாதவிடாய் (1 நாள்)}other{மாதவிடாய் (# நாட்கள்)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"பாசிட்டிவ்"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"நெகட்டிவ்"</string>
     <string name="ovulation_high" msgid="205362931427158291">"அதிகம்"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"இசை"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"மற்றவை"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"வழிகாட்டல் இல்லை"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"நடுத்தரம்"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"தீவிரம்"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>நி"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>ம.நே <xliff:g id="MIN">%2$s</xliff:g>நி"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>ம.நே"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ஒருங்கிணைப்பு செயலிலுள்ளது"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Android சிஸ்டத்துடன் Health Connect ஆப்ஸ் ஒருங்கிணைக்கப்படுகிறது.\n\nஉங்கள் தரவும் அனுமதிகளும் மாற்றப்படுவதால் இதற்குச் சிறிது நேரம் ஆகலாம்."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"செயலாக்கம் நிறைவடைந்துவிட்டது எனும் அறிவிப்பைப் பெறும் வரை ஆப்ஸை மூட வேண்டாம்."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect ஒருங்கிணைப்பு செயலிலுள்ளது"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"புதுப்பிப்பு தேவை"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Android சிஸ்டத்துடன் Health Connect ஒருங்கிணைக்கப்படுவதால், உங்கள் அமைப்புகளில் இருந்து அதை நேரடியாக அணுகலாம்."</string>
     <string name="update_button" msgid="4544529019832009496">"புதுப்பி"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"இந்தப் புதுப்பிப்பைத் தொடங்குங்கள். இதனால், உங்கள் சிஸ்டம் அமைப்புகளுடன் Health Connect ஆப்ஸால் தொடர்ந்து ஒருங்கிணைக்க முடியும்"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"இப்போது புதுப்பி"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"சிஸ்டம் புதுப்பிப்பு தேவை"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"தொடர்வதற்கு முன்பு, உங்கள் மொபைல் சிஸ்டத்தைப் புதுப்பியுங்கள்."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"உங்கள் மொபைல் சிஸ்டத்தை ஏற்கெனவே புதுப்பித்திருந்தால், ஒருங்கிணைப்பைத் தொடர உங்கள் மொபைலை மீண்டும் தொடங்கிப் பாருங்கள்"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect புதுப்பிப்பு தேவை"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"தொடர்வதற்கு முன்பு, Health Connect ஆப்ஸைச் சமீபத்திய பதிப்பிற்குப் புதுப்பியுங்கள்."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"கூடுதல் சேமிப்பிடம் தேவை"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"ஒருங்கிணைப்பைத் தொடர, Health Connect ஆப்ஸுக்கு உங்கள் மொபைலில் <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> சேமிப்பிடம் தேவை.\n\nஉங்கள் மொபைலில் சிறிது சேமிப்பிடத்தைக் காலியாக்கிவிட்டு மீண்டும் முயலுங்கள்."</string>
     <string name="try_again_button" msgid="8745496819992160789">"மீண்டும் முயலுங்கள்"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"சேமிப்பிடத்தைக் காலியாக்கு"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"கூடுதல் சேமிப்பிடம் தேவை"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"ஒருங்கிணைப்பைத் தொடர, Health Connect ஆப்ஸுக்கு உங்கள் மொபைலில் <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> சேமிப்பிடம் தேவை."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ஒருங்கிணைப்பு இடைநிறுத்தப்பட்டுள்ளது"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Android சிஸ்டத்துடன் ஒருங்கிணைக்கப்படும்போது Health Connect ஆப்ஸ் மூடப்பட்டது.\n\nஆப்ஸை மீண்டும் திறந்து உங்கள் தரவையும் அனுமதிகளையும் தொடர்ந்து மாற்ற \'மீண்டும் தொடங்கு\' என்பதைக் கிளிக் செய்யுங்கள்."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"உங்கள் Health Connect தரவை வைத்திருக்க, இதை <xliff:g id="TIME_NEEDED">%1$s</xliff:g>க்குள் நிறைவுசெய்யுங்கள்"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Android சிஸ்டத்துடன் Health Connect ஆப்ஸைத் தொடர்ந்து ஒருங்கிணைக்க தட்டுங்கள். உங்கள் தரவை வைத்திருக்க, இதை <xliff:g id="TIME_NEEDED">%1$s</xliff:g>க்குள் நிறைவுசெய்யுங்கள்"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Android சிஸ்டத்துடன் Health Connect ஆப்ஸைத் தொடர்ந்து ஒருங்கிணைக்க தட்டுங்கள்."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"தொடருங்கள்"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect ஒருங்கிணைப்பை மீண்டும் தொடங்குங்கள்"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"உங்கள் தரவை வைத்திருக்க, இதை <xliff:g id="TIME_NEEDED">%1$s</xliff:g>க்குள் நிறைவுசெய்யுங்கள்"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ஆப்ஸ் புதுப்பிப்பு தேவை"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect உடன் ஒத்திசைப்பதைத் தொடர்வதற்கு முன் <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸைப் புதுப்பிக்க வேண்டும்"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect உடன் ஒத்திசைப்பதைத் தொடர்வதற்கு முன் சில ஆப்ஸைப் புதுப்பிக்க வேண்டும்"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect உடன் தொடர்ந்து ஒத்திசைக்க <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸைப் புதுப்பிக்க வேண்டும். புதுப்பிப்புகள் சில ஆப்ஸுக்குக் கிடைக்காமல் போகலாம்."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect உடன் தொடர்ந்து ஒத்திசைக்க சில ஆப்ஸைப் புதுப்பிக்க வேண்டும். புதுப்பிப்புகள் சில ஆப்ஸுக்குக் கிடைக்காமல் போகலாம்."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"புதுப்பிப்புகளைக் காட்டு"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"மேலும் அறிக"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect ஒருங்கிணைப்பு"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect ஒருங்கிணைப்பு நிறைவடையவில்லை"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"மீண்டும் ஒருங்கிணைப்பு கிடைக்கும்போது அறிவிப்பைப் பெறுவீர்கள்."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"சரி"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect ஒருங்கிணைப்பு நிறைவடையவில்லை"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"மேலும் காட்டு"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect ஒருங்கிணைப்பு நிறைவடைந்தது"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"திற"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"புதிதாக உள்ளவை"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"இப்போது உங்கள் அமைப்புகளில் இருந்து நேரடியாக Health Connect ஆப்ஸை அணுகலாம். சேமிப்பிடத்தைக் காலியாக்க எப்போது வேண்டுமானாலும் Health Connect ஆப்ஸை நிறுவல் நீக்கலாம்."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"சரி"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ஆப்ஸ் ஆதாரங்களை மாற்றுதல்"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"சாதனத்தின் இயல்புநிலை"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ஆப்ஸ் தரவு"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connectடுக்கான அணுகல் உள்ள ஆப்ஸின் தரவு இங்கே காட்டப்படும்"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் தரவு இங்கே காட்டப்படும்"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connectடுக்கான அணுகல் உள்ள ஆப்ஸின் தரவு இங்கே காட்டப்படும்"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"நாள்"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"வாரம்"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"மாதம்"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"கடந்த மாதம்"</string>
     <string name="tab_entries" msgid="3402700951602029493">"உள்ளீடுகள்"</string>
     <string name="tab_access" msgid="7818197975407243701">"அணுகல்"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g>க்கான கூடுதல் அணுகலை அனுமதிக்கவா?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் இந்த Health Connect அமைப்புகளையும் அணுகக் கேட்கிறது"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"இந்த ஆப்ஸுக்கான பின்புல அல்லது கடந்தகாலத் தரவு அணுகலை இயக்க, குறைந்தபட்சம் \'படிப்பதற்கான அனுமதி\' ஒன்றை இயக்கவும்"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"இந்த ஆப்ஸுக்கான பின்புல அணுகலை இயக்க, குறைந்தபட்சம் \'படிப்பதற்கான அனுமதி\' ஒன்றை இயக்கவும்"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"இந்த ஆப்ஸுக்கான கடந்தகாலத் தரவு அணுகலை இயக்க, குறைந்தபட்சம் \'படிப்பதற்கான அனுமதி\' ஒன்றை இயக்கவும்"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect ஆப்ஸைப் பயன்படுத்தத் தொடங்குங்கள்"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ஆரோக்கியம் மற்றும் உடற்பயிற்சி தொடர்பான தரவை ஆப்ஸுக்கிடையில் பகிர முதலில் அந்த ஆப்ஸை ஒத்திசையுங்கள்"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"அமை"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"இணைக்கமான ஆப்ஸைப் பாருங்கள்"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect மூலம் <xliff:g id="APP_NAME">%s</xliff:g> உடன் ஒத்திசைக்க கூடுதல் ஆப்ஸைக் கண்டறியுங்கள்"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ஆப்ஸ்டோரில் பாருங்கள்"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"திரைப் பூட்டை அமையுங்கள்"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"உங்கள் ஆரோக்கியம் குறித்த தரவுக்கான கூடுதல் பாதுகாப்பிற்காக, இந்தச் சாதனத்திற்கு பின் (PIN), பேட்டர்ன்/கடவுச்சொல்லை அமையுங்கள்"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"திரைப் பூட்டை அமை"</string>
     <string name="select_all" msgid="837499881590001166">"அனைத்தையும் தேர்ந்தெடு"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Health Connectடில் உள்ள இந்தத் தரவை இணைக்கப்பட்ட ஆப்ஸால் இனி படிக்க முடியாது"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"தேர்வுசெய்யப்பட்டது"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"தேர்வுசெய்யப்படவில்லை"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"உடற்பயிற்சிக்கான வரைப்படப் பாதை கிடைக்கிறது"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"அடுத்த நாள்"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"அடுத்த வாரம்"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"அடுத்த மாதம்"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"முந்தைய நாள்"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"முந்தைய வாரம்"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"முந்தைய மாதம்"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"அனைத்துத் தரவையும் நிரந்தரமாக நீக்கவா?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"தேர்ந்தெடுக்கப்பட்ட தரவை நிரந்தரமாக நீக்கவா?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"அனைத்து <xliff:g id="APP_NAME">%s</xliff:g> தரவையும் நிரந்தரமாக நீக்கவா?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"தேர்ந்தெடுக்கப்பட்ட <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸின் <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> வாரத்திற்கான பதிவுகளை நிரந்தரமாக நீக்கவா?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"தேர்ந்தெடுக்கப்பட்ட <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸின் <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>க்கான பதிவுகளை நிரந்தரமாக நீக்கவா?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"இந்த <xliff:g id="APP_NAME">%s</xliff:g> ஆப்ஸின் பதிவை நிரந்தரமாக நீக்கவா?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> ஆப்ஸுக்கான <xliff:g id="DATA_TYPE">%1$s</xliff:g> தரவை நிரந்தரமாக நீக்கவா?"</string>
+    <string name="on" msgid="8266542510798355807">"ஆன்"</string>
+    <string name="off" msgid="6996623844428550649">"ஆஃப்"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"அணுகிய நேரம்: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"நேற்று அணுகிய நேரம்: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"அணுகிய நேரம்: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"எப்போதும் அனுமதி"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"தேர்வான ஆப்ஸை அனுமதி"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ஆப்ஸைப் பயன்படுத்தும்போது"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"அனைத்தையும் நிராகரி"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவை அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="DATA_TYPES">%2$s</xliff:g>க்கான அணுகல் <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்குத் தேவை.\n\nஅனைத்தையும் அனுமதிக்கவோ அவற்றைத் தனித்தனியே கட்டுப்படுத்தவோ தேர்வுசெய்யுங்கள்."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="DATA_TYPE">%2$s</xliff:g>ஐ அணுக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"உடற்பயிற்சியும் ஆரோக்கியமும்"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"எப்போதும்"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ஆப்ஸைப் பயன்படுத்தும்போது"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"எப்போதும்"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ஆப்ஸைப் பயன்படுத்தும்போது"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த அனைத்துத் தரவையும் <xliff:g id="ALLOW_MODE">%2$s</xliff:g> அணுக முடியும்"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"அணுக அனுமதிக்கப்பட்டது"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"வாசிக்க அனுமதிக்கப்பட்டவை"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"இந்த அனுமதிகள் உங்கள் சாதன சென்சார்களில் இருந்து தரவுக்கான அணுகலை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கு வழங்கும்."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"அனுமதிக்கப்பட்ட ஆப்ஸ்: <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"எந்த ஆப்ஸும் அனுமதி கேட்கவில்லை"</string>
+    <string name="allowed" msgid="4158456017482263737">"அனுமதிக்கப்பட்டது"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"அனுமதிக்கப்படவில்லை"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"இந்த அனுமதியுள்ள ஆப்ஸால் உங்கள் சாதன சென்சார்களில் இருந்து <xliff:g id="DATA_TYPE">%s</xliff:g> தரவை அணுக முடியும்."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"உங்கள் வாட்ச்சில் உள்ள அனைத்து ஆப்ஸுக்கும் <xliff:g id="DATA_TYPE">%s</xliff:g> அணுகலை அகற்றவா?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"தேர்வுக்குறி"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"இல்லை குறி"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"தற்போது, <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவை <xliff:g id="ALLOW_MODE">%2$s</xliff:g> அணுக முடியும்"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"உடற்பயிற்சி மற்றும் ஆரோக்கியம் குறித்த தரவை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் எப்போதும் அணுக அனுமதிக்கவா?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் <xliff:g id="DATA_TYPES">%2$s</xliff:g>க்கான அணுகலைக் கொண்டுள்ளது."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"உடற்பயிற்சி மற்றும் ஆரோக்கியத்திற்கான அனுமதிகளை நிர்வகியுங்கள்"</string>
 </resources>
diff --git a/apk/res/values-te/strings.xml b/apk/res/values-te/strings.xml
index 663f0b5..5d8ef90 100644
--- a/apk/res/values-te/strings.xml
+++ b/apk/res/values-te/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"మీ పరికరంలో ఆరోగ్యం, ఫిట్‌నెస్ డేటాను మేనేజ్ చేయండి, అలాగే ఏ యాప్‌లు దీన్ని యాక్సెస్ చేయవచ్చో కంట్రోల్ చేయండి"</string>
     <string name="data_title" msgid="4456619761533380816">"డేటా, యాక్సెస్"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"ఆరోగ్య సమాచారాలను బ్రౌజ్ చేయండి"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"మీ హెల్త్ రికార్డ్‌లను చూడండి, అలాగే వాటిని ఏ యాప్‌లు యాక్సెస్ చేయగలవో చూడండి"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"అన్ని కేటగిరీలు"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"అన్ని కేటగిరీలను చూడండి"</string>
     <string name="no_data" msgid="1906986019249068659">"డేటా లేదు"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"నిన్న"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"చదివింది: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"రాసింది: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"అనుమతులను మేనేజ్ చేయండి"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"సమయం: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"యాక్టివిటీ"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"మీ ఆరోగ్య డేటాను యాక్సెస్ చేయండి"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"ఖర్చు అయిన కేలరీలను చదువుతుంది"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"ఖర్చు అయిన కేలరీలను చదవడానికి యాప్‌ను అనుమతిస్తుంది"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"బ్యాక్‌గ్రౌండ్‌లో డేటాను యాక్సెస్ చేయండి"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"బ్యాక్‌గ్రౌండ్‌లో డేటాను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అనుమతించాలా?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"బ్యాక్‌గ్రౌండ్‌లో డేటాను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అనుమతించాలా?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"మీరు అనుమతిస్తే, మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ యాప్ ఫిట్‌నెస్, వెల్‌నెస్ డేటాను, ఆరోగ్య సమాచారాన్ని యాక్సెస్ చేయగలదు."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"మీరు అనుమతిస్తే, మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ యాప్ ఆరోగ్య సమాచారాన్ని యాక్సెస్ చేయగలదు."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"మీరు అనుమతిస్తే, మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ యాప్ ఫిట్‌నెస్, వెల్‌నెస్ డేటాను యాక్సెస్ చేయగలదు."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"మీరు అనుమతిస్తే, మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ యాప్ Health Connect డేటాను యాక్సెస్ చేయగలదు."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"మునుపటి డేటాను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అనుమతించాలా?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"మీరు అనుమతిస్తే, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> తేదీ కంటే ముందు జోడించిన ఫిట్‌నెస్, వెల్‌నెస్ డేటాను ఈ యాక్సెస్ చేయగలదు."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"మీరు అనుమతిస్తే, మునుపటి మొత్తం ఫిట్‌నెస్, వెల్‌నెస్ డేటాను ఈ యాక్సెస్ చేయగలదు."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"మీరు అనుమతిస్తే, ఈ యాప్ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> తేదీలోపు జోడించిన Health Connect డేటాను యాక్సెస్ చేయగలదు."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"మీరు అనుమతిస్తే, ఈ యాప్ గతంలోని Health Connect డేటా మొత్తాన్ని యాక్సెస్ చేయగలదు."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం అదనపు యాక్సెస్‌ను అనుమతించాలా?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> కూడా ఈ Health Connect సెట్టింగ్‌లను యాక్సెస్ చేయాలనుకుంటోంది"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"బ్యాక్‌గ్రౌండ్‌లో మొత్తం డేటాను యాక్సెస్ చేయండి"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"ఆరోగ్య సమాచారాన్ని బ్యాక్‌గ్రౌండ్‌లో యాక్సెస్ చేయండి"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"ఫిట్‌నెస్, వెల్‌నెస్ డేటాను బ్యాక్‌గ్రౌండ్‌లో యాక్సెస్ చేయండి"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"మీరు యాప్‌ను ఉపయోగించనప్పుడు ఫిట్‌నెస్, వెల్‌నెస్ డేటాను, ఆరోగ్య సమాచారాన్ని యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"బ్యాక్‌గ్రౌండ్‌లో డేటాను యాక్సెస్ చేయండి"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"మీరు యాప్‌ను ఉపయోగించనప్పుడు Health Connect డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"గతంలోని ఫిట్‌నెస్, వెల్‌నెస్ డేటాను యాక్సెస్ చేయండి"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> తేదీ కంటే ముందు జోడించిన డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"గతంలోని డేటా మొత్తాన్ని యాక్సెస్ చేయడానికి ఈ యాప్‌నకు అనుమతినివ్వండి"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"మునుపటి డేటాను యాక్సెస్ చేయడానికి అనుమతి"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> తేదీలోపు జోడించిన Health Connect డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"గతంలోని Health Connect డేటా మొత్తాన్ని యాక్సెస్ చేయడానికి ఈ యాప్‌నకు అనుమతినివ్వండి"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"మీ ఆరోగ్య సమాచారానికి సంబంధించి మునుపటి డేటాను <xliff:g id="APP_NAME">%1$s</xliff:g> ఇప్పటికే యాక్సెస్ చేసింది"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"అనుమతుల గురించి మరింత చదవండి"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"బ్యాక్‌గ్రౌండ్‌లో మొత్తం డేటాను యాక్సెస్ చేయండి"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"ఆరోగ్య సమాచారాన్ని బ్యాక్‌గ్రౌండ్‌లో యాక్సెస్ చేయండి"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"ఫిట్‌నెస్, వెల్‌నెస్ డేటాను బ్యాక్‌గ్రౌండ్‌లో యాక్సెస్ చేయండి"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"మీరు యాప్‌ను ఉపయోగించనప్పుడు ఫిట్‌నెస్, వెల్‌నెస్ డేటాను, ఆరోగ్య సమాచారాన్ని యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"బ్యాక్‌గ్రౌండ్‌లో డేటాను యాక్సెస్ చేయడానికి అనుమతి"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"మీరు యాప్‌ను ఉపయోగించనప్పుడు Health Connect డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"గతంలోని ఫిట్‌నెస్, వెల్‌నెస్ డేటాను యాక్సెస్ చేయండి"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> తేదీ కంటే ముందు జోడించిన డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"గతంలోని డేటా మొత్తాన్ని యాక్సెస్ చేయడానికి ఈ యాప్‌నకు అనుమతినివ్వండి"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"మునుపటి డేటాను యాక్సెస్ చేయండి"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> తేదీలోపు జోడించిన Health Connect డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"మొత్తం Health Connect మునుపటి డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g>‌కు రీడ్ అనుమతులు ఆన్ చేసి లేనందున ప్రస్తుతం ఎటువంటి ఫిట్‌నెస్ డేటాను రీడ్ చేయడం లేదు"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> మీ ఆరోగ్య సమాచారాలకు సంబంధించి మునుపటి డేటాను ఇప్పటికే యాక్సెస్ చేసింది. దీన్ని మార్చడానికి, ఈ యాప్‌నకు సంబంధించి ఆరోగ్య సమాచార అనుమతులను ఆఫ్ చేయండి"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"ఆరోగ్య సమాచారం అనుమతులను మేనేజ్ చేయండి"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ఈ యాప్‌నకు సంబంధించిన బ్యాక్‌గ్రౌండ్ లేదా గతంలోని డేటాకు యాక్సెస్‌ను ఆన్ చేయడానికి కనీసం ఒక రీడ్ అనుమతిని ఎనేబుల్ చేయండి"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"ఈ యాప్‌నకు సంబంధించిన బ్యాక్‌గ్రౌండ్ యాక్సెస్‌ను ఆన్ చేయడానికి కనీసం ఒక రీడ్ అనుమతిని ఎనేబుల్ చేయండి"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"ఈ యాప్‌నకు సంబంధించిన గతంలోని డేటాకు యాక్సెస్‌ను ఆన్ చేయడానికి కనీసం ఒక రీడ్ అనుమతిని ఎనేబుల్ చేయండి"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"గతంలోని Health Connect డేటా మొత్తాన్ని యాక్సెస్ చేయడానికి ఈ యాప్‌నకు అనుమతినివ్వండి"</string>
     <string name="background_read_description" msgid="3203594555849969283">"మీరు యాప్‌ను ఉపయోగించనప్పుడు Health Connect డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"మీరు అనుమతిస్తే, మీరు యాప్‌ను ఉపయోగించనప్పుడు ఈ యాప్ Health Connect డేటాను యాక్సెస్ చేయగలదు."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"మునుపటి డేటాను యాక్సెస్ చేయండి"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"మునుపటి డేటాను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అనుమతించాలా?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> తేదీలోపు జోడించిన Health Connect డేటాను యాక్సెస్ చేయడానికి ఈ యాప్‌ను అనుమతించండి"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"గతంలోని Health Connect డేటా మొత్తాన్ని యాక్సెస్ చేయడానికి ఈ యాప్‌నకు అనుమతినివ్వండి"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"మీరు అనుమతిస్తే, ఈ యాప్ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> తేదీలోపు జోడించబడిన Health Connect డేటాను యాక్సెస్ చేయగలదు."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"మీరు అనుమతినిస్తే, ఈ యాప్ గతంలోని Health Connect డేటా మొత్తాన్ని యాక్సెస్ చేయగలదు."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"ఖర్చు అయిన యాక్టివ్ కేలరీల డేటా"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"ఖర్చు అయిన యాక్టివ్ కేలరీల డేటా"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"ఖర్చు అయిన యాక్టివ్ కేలరీల డేటాను చదువుతుంది"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"వీల్‌చెయిర్ పుష్‌ల డేటా"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"వీల్‌చెయిర్ పుష్‌ల డేటాను చదువుతుంది"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"వీల్‌చెయిర్ పుష్‌ల డేటాను రాస్తుంది"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"యాక్టివిటీ తీవ్రత"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"యాక్టివిటీ తీవ్రత"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"యాక్టివిటీ తీవ్రత గురించి చదవండి"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"యాక్టివిటీ తీవ్రత గురించి రాయండి"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"మౌలిక జీవక్రియ రేటు డేటా"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"మౌలిక జీవక్రియ రేటు డేటా"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"మౌలిక జీవక్రియ రేటు డేటాను చదువుతుంది"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"చర్మం ఉష్ణోగ్రత"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"చర్మం ఉష్ణోగ్రతను చదవండి"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"చర్మం ఉష్ణోగ్రత గురించి రాయండి"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Health Connectకు సింక్ చేసిన, జోడించిన ఆరోగ్య సమాచారాలన్నీ ఇందులో ఉంటాయి. ఇది మీ పూర్తి వైద్యపరమైన రికార్డ్ అయ్యుండకపోవచ్చు, ఇంకా మీ ఆరోగ్య సమాచారాల వైద్యపరమైన వివరణను కలిగి ఉండకపోవచ్చు."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"హెల్త్ రికార్డ్‌లన్నీ"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"హెల్త్ రికార్డ్‌లన్నీ"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"హెల్త్ రికార్డ్‌లన్నింటినీ రాయండి"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"అలర్జీలు"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"అలర్జీలు"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"అలర్జీల డేటాను చదువుతుంది"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"రోగ నిరోధకత సమాచారం"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"రోగ నిరోధకత సమాచారం"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"రోగ నిరోధకత సమాచారాన్ని చదవండి"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ల్యాబొరేటరీ ఫలితాలు"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ల్యాబొరేటరీ ఫలితాలు"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"ల్యాబొరేటరీ ఫలితాలను చూసేందుకు అనుమతించండి"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"అలర్జీలు"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"అలర్జీలు"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"అలర్జీల డేటాను చదువుతుంది"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"షరతులు"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"షరతులు"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"షరతులను చదవండి"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"వ్యాక్సిన్‌లు"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"వ్యాక్సిన్‌లు"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"వ్యాక్సిన్‌లను చదవండి"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ల్యాబ్ ఫలితాలు"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ల్యాబ్ ఫలితాలు"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"ల్యాబ్ ఫలితాలను చదవండి"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"మందులు"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"మందులు"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"మందుల డేటాను చూసేందుకు అనుమతించండి"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"వ్యక్తిగత వివరాలు"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"వ్యక్తిగత వివరాలు"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"వ్యక్తిగత వివరాలను చదవండి"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"ప్రాక్టీషనర్ వివరాలు"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"ప్రాక్టీషనర్ వివరాలు"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"ప్రాక్టీషనర్ వివరాలను చదవండి"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"గర్భధారణ"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"గర్భధారణ"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"గర్భధారణకు సంబంధించిన డేటాను చూసేందుకు అనుమతించండి"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"సమస్యలు"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"సమస్యలు"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"సమస్యలకు సంబంధించిన డేటాను చూసేందుకు అనుమతించండి"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"విధానాలు"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"విధానాలు"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"చికిత్స విధానాలకు సంబంధించిన డేటాను చూసేందుకు అనుమతించండి"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"సోషల్ హిస్టరీ"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"సోషల్ హిస్టరీ"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"సోషల్ హిస్టరీ"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"సోషల్ మీడియా డేటాను చూడటానికి అనుమతించండి"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"కీలక ఆరోగ్య కొలమానాల సంకేతాలు"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"సందర్శనలు"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"సందర్శనలు"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"సందర్శనలను చదవండి"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"కీలక ఆరోగ్య కొలమానాల సంకేతాలు"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"కీలక ఆరోగ్య కొలమానాల సంకేతాలు"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"కీలక ఆరోగ్య కొలమానాల సంకేతాలను చూడటానికి అనుమతించండి"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"బుద్ధికుశలత"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"బుద్ధికుశలత సంబంధిత సమాచారాన్ని రాయడానికి వీలు కల్పిస్తుంది"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"చదవడానికి \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" యాప్‌ను అనుమతించండి"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"రాయడానికి \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" యాప్‌ను అనుమతించండి"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"రద్దు చేయండి"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"అనుమతించండి"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"అన్నీ అనుమతించండి"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"అనుమతించవద్దు"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Health Connect కోసం ఈ యాప్, ఏ డేటాను చదవాలో లేదా రాయాలో ఎంచుకోండి"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Health Connect కోసం ఈ యాప్, ఏ డేటాను చదవాలో లేదా రాయాలో ఎంచుకోండి"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Health Connect నుండి ఈ యాప్, ఏ డేటాను చదవాలో లేదా రాయాలో ఎంచుకోండి"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Health Connect కోసం ఈ యాప్, ఏ డేటాను రాయాలో ఎంచుకోండి"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"మీరు చదవగల యాక్సెస్‌ను ఇచ్చినట్లయితే, యాప్ కొత్త డేటాను, అలాగే గత 30 రోజులకు చెందిన డేటాను చదవగలదు"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"మీరు చదవడానికి యాక్సెస్ ఇస్తే, యాప్ కొత్త, పాత డేటాను చదవగలదు"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Health Connectను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అనుమతించాలా?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"డెవలపర్ తాలూకు <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>‌లో మీ డేటాను <xliff:g id="APP_NAME">%1$s</xliff:g> ఎలా హ్యాండిల్ చేస్తుందో మీరు తెలుసుకోవచ్చు"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"ఫిట్‌నెస్, వెల్‌నెస్ డేటాను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అనుమతించాలా?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>‌లో మీ డేటాను <xliff:g id="APP_NAME">%1$s</xliff:g> ఎలా హ్యాండిల్ చేస్తుందో మీరు తెలుసుకోవచ్చు"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"గోప్యతా పాలసీ"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"మీ ఆరోగ్య సమాచారాలను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అనుమతించాలా?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"మీరు యాక్సెస్ ఇస్తే, యాప్ అనేది అలర్జీలు, ల్యాబ్ ఫలితాలు, వ్యాక్సిన్‌లు, మరిన్ని \n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g> వంటి డేటాను ఈ యాప్ చదవగలదు, రాయగలదు"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"మీరు యాక్సెస్ ఇస్తే, అలర్జీలు, ల్యాబ్ ఫలితాలు, వ్యాక్సిన్‌లు, మరిన్ని \n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g> వంటి డేటాను ఈ యాప్ చదవగలదు"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"ఆరోగ్య సమాచారాల గురించి"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"షేర్ చేసే డేటాలో ఇవి ఉంటాయి"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"మీరు అనుమతిస్తే, <xliff:g id="APP_NAME">%1$s</xliff:g> Health Connectతో మీ ఆరోగ్య సమాచారాన్ని షేర్ చేయగలదు."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"మీ ఆరోగ్య సమాచారాలన్నింటిని ఒకేచోట ఉంచడానికి, మీ విభిన్న యాప్‌లు, సోర్స్‌ల నుండి మీ ఆరోగ్య సమాచారాలను సింక్ చేయండి"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"అన్ని అనుమతులను తీసివేయాలా?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"అన్నీ తీసివేయండి"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై Health Connect నుండి ఎలాంటి డేటాను చదవలేరు లేదా రాయలేరు.\n\nఇది ఈ యాప్ కలిగి ఉండే కెమెరా, మైక్రోఫోన్, లేదా లొకేషన్ వంటి ఇతర అనుమతులపై ప్రభావం చూపదు."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై గతంలోని డేటాతో సహా Health Connect నుండి ఏ డేటాను చదవలేదు లేదా రాయలేదు.\n\nఈ యాప్‌నకు ఉన్న లొకేషన్, కెమెరా, లేదా మైక్రోఫోన్ వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై బ్యాక్‌గ్రౌండ్, గతంలోని డేటతో సహా Health Connect నుండి ఏ డేటాను చదవలేదు లేదా రాయలేదు.\n\nఈ యాప్‌నకు ఉన్న లొకేషన్, కెమెరా, లేదా మైక్రోఫోన్ వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect నుండి <xliff:g id="APP_NAME">%1$s</xliff:g> డేటాను కూడా తొలగించండి"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"అన్ని అనుమతులను తీసివేయాలా?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ఆరోగ్య సమాచారం అనుమతులన్నింటినీ తీసివేయాలా?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"ఫిట్‌నెస్, వెల్‌నెస్ అనుమతులు అన్నిటినీ తీసివేయాలా?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"<xliff:g id="APP_NAME">%1$s</xliff:g>‌లోని Health Connect నుండి ఫిట్‌నెస్ డేటాను కూడా తొలగించండి"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"ఆరోగ్య సమాచారం అనుమతులన్నింటినీ తీసివేయాలా?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"<xliff:g id="APP_NAME">%1$s</xliff:g>‌లోని Health Connect నుండి ఆరోగ్య సమాచారాలను కూడా తొలగించండి"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై Health Connect నుండి ఈ డేటాను చదవలేదు లేదా రాయలేదు.\n\nఈ యాప్‌నకు ఉన్న లొకేషన్, కెమెరా, లేదా మైక్రోఫోన్ వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై బ్యాక్‌గ్రౌండ్ డేటతో సహా Health Connect నుండి ఈ డేటాను చదవలేదు లేదా రాయలేదు.\n\nఈ యాప్‌నకు ఉన్న లొకేషన్, కెమెరా, లేదా మైక్రోఫోన్ వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై, గతంలోని డేటతో సహా Health Connect నుండి ఈ డేటాను చదవలేదు లేదా రాయలేదు.\n\nఈ యాప్‌నకు ఉన్న కెమెరా, మైక్రోఫోన్ లేదా లొకేషన్ వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై బ్యాక్‌గ్రౌండ్, గతంలోని డేటాతో సహా Health Connect నుండి ఈ డేటాను చదవలేదు లేదా రాయలేదు.\n\nఈ యాప్‌నకు ఉన్న కెమెరా, మైక్రోఫోన్ లేదా లొకేషన్ వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"అన్ని అనుమతులను తీసివేయాలా?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై Health Connect నుండి డేటాను చదవలేరు లేదా రాయలేదు.\n\nఇది ఈ యాప్‌కి ఉండే కెమెరా, మైక్రోఫోన్, లేదా లొకేషన్ వంటి ఇతర అనుమతులపై ప్రభావం చూపదు."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై బ్యాక్‌గ్రౌండ్ డేటతో సహా Health Connect నుండి డేటాను చదవలేదు లేదా రాయలేదు.\n\nఈ యాప్‌నకు ఉన్న లొకేషన్, కెమెరా, లేదా మైక్రోఫోన్ వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై, గతంలోని డేటతో సహా Health Connect నుండి ఏ డేటాను చదవలేదు లేదా రాయలేదు.\n\nయాప్‌నకు ఉన్న కెమెరా, మైక్రోఫోన్ లేదా లొకేషన్, వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఇకపై బ్యాక్‌గ్రౌండ్, గతంలోని డేటాతో సహా Health Connect నుండి ఏ డేటాను చదవలేదు లేదా రాయలేదు.\n\nయాప్‌నకు ఉన్న కెమెరా, మైక్రోఫోన్ లేదా లొకేషన్, వంటి ఇతర అనుమతులను ఇది ప్రభావితం చేయదు."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"<xliff:g id="APP_NAME">%1$s</xliff:g>లోని Health Connect నుండి ఫిట్‌నెస్ డేటాను, హెల్త్ రికార్డ్‌లను కూడా తొలగించండి"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"ఈ యాప్‌కి అనుమతులు తీసివేయబడ్డాయి"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Health Connect డేటా మొత్తాన్ని కూడా తొలగించండి"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"తర్వాతి రోజు"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"ఎంచుకున్న రోజు"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"మునుపటి రోజు"</string>
     <string name="default_error" msgid="7966868260616403475">"ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ట్రై చేయండి."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"తెలియని రిసోర్స్"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"సోర్స్ డేటా"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>తెరిచిన బ్రాకెట్."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>మూసిన బ్రాకెట్."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ఫీల్డ్ <xliff:g id="FIELD">%2$s</xliff:g> విలువ"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ఈ యాప్‌లకు ఇకపై యాక్సెస్ లేదు, కానీ Health Connect‌లో ఇప్పటికీ డేటా స్టోర్ అయ్యి ఉంటుంది"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> తర్వాత జోడించిన డేటా‌ను <xliff:g id="APP_NAME">%1$s</xliff:g> చదవగలదు"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"ఈ యాప్ యాక్సెస్ చేయగల ఇతర Android అనుమతులను మేనేజ్ చేయడానికి, సెట్టింగ్‌లు &gt; యాప్‌లకు వెళ్లండి"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"మీరు <xliff:g id="APP_NAME">%1$s</xliff:g>తో షేర్ చేసే డేటా వారి గోప్యతా పాలసీ పరిధిలోకి వస్తుంది"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> మీ డేటాను ఎలా హ్యాండిల్ చేస్తుంది అనే దాని గురించి మీరు డెవలపర్ గోప్యతా పాలసీలో తెలుసుకోవచ్చు"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"ఈ యాప్ యాక్సెస్ చేయగల ఇతర Android అనుమతులను మేనేజ్ చేయడానికి, సెట్టింగ్‌లకు వెళ్లి, తర్వాత యాప్‌లు ఆప్షన్‌ను ట్యాప్ చేయండి"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"గోప్యతా పాలసీని చదవండి"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"గత 24 గంటల్లో యాక్సెస్ చేయబడింది"</string>
     <string name="app_access_title" msgid="7137018424885371763">"యాప్ యాక్సెస్"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"మీ వద్ద ప్రస్తుతం అనుకూలమైన యాప్‌లు ఏవీ ఇన్‌స్టాల్ అయి లేవు"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"అదనపు యాక్సెస్‌"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"గతంలోని డేటా, బ్యాక్‌గ్రౌండ్ డేటా"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"ఈ యాప్‌నకు సంబంధించిన అదనపు అనుమతులు తీసివేయబడ్డాయి"</string>
     <string name="permissions_header" msgid="6519976063360071569">"అనుమతులు"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"ఫిట్‌నెస్, వెల్‌నెస్"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"వ్యాయామం, నిద్ర, న్యూట్రిషన్, ఇంకా ఇతరం"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"ఆరోగ్య సమాచారాలు"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"ఆరోగ్య సమాచారాలు"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ల్యాబ్ ఫలితాలు, మందులు, రోగ నిరోధకత,ఇతరం"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ల్యాబ్ ఫలితాలు,మందులు, వ్యాక్సిన్స్,ఇతరం"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"యాప్ అనుమతులు తీసివేయబడ్డాయి"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect <xliff:g id="APP_DATA">%s</xliff:g>‌కు అనుమతులను తీసివేసింది"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect <xliff:g id="APP_DATA_0">%1$s</xliff:g>, <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>‌కు అనుమతులను తీసివేసింది"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Storeకు వెళ్లండి"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connectను ప్రారంభించండి"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect మీ ఆరోగ్యం, ఫిట్‌నెస్ డేటాను స్టోర్ చేస్తుంది, మీ ఫోన్‌లోని విభిన్న యాప్‌లను సింక్ చేయడానికి మీకు సులభమైన మార్గాన్ని ఇది అందిస్తుంది"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect వేర్వేరు యాప్‌ల నుండి మీ ఆరోగ్యం, ఫిట్‌నెస్ డేటాను స్టోర్ చేస్తుంది, సింక్ చేస్తుంది.\n\nవ్యాయామ సెషన్‌లు, అడుగులు, నిద్ర, ఇంకా మరిన్నింటితో కూడిన"<b>"ఫిట్‌నెస్, సంరక్షణకు సంబంధించిన డేటా"</b>\n\n"వ్యాక్సిన్‌లు, ల్యాబ్ ఫలితాలు, ఇంకా మరిన్నింటితో కూడిన"<b>"ఆరోగ్య సమాచారాలు"</b></string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connectతో మీరు వీటిని చేయవచ్చు"</string>
     <string name="share_data" msgid="3481932156368883946">"మీ యాప్‌లతో డేటాను షేర్ చేయండి"</string>
     <string name="share_data_description" msgid="2919871301634375092">"ప్రతి ఒక్క యాప్ Health Connectలో ఏ డేటాను రీడ్‌ చేయాలి లేదా రైట్ చేయాలి అన్నది ఎంచుకోండి"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"మీ సెట్టింగ్స్‌ను, గోప్యతను మేనేజ్ చేయండి"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"తక్కువ రక్తస్రావం"</string>
     <string name="flow_medium" msgid="3783688724668943154">"మధ్యస్థ రక్తస్రావం"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"అధిక రక్తస్రావం"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"ఫ్లో తెలియదు"</string>
     <string name="period_day" msgid="3821944462093965882">"రుతుస్రావానికి సంబంధించి <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>‌లో <xliff:g id="DAY">%1$d</xliff:g>‌వ రోజు"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{రుతుక్రమం (1 రోజు)}other{రుతుక్రమం(# రోజులు)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"సానుకూలం"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"ప్రతికూలం"</string>
     <string name="ovulation_high" msgid="205362931427158291">"అధికం"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"మ్యూజిక్"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"వేరేవి"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"మీరే చేసుకొనేవి"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"మధ్యస్థం"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"మధ్యస్థ స్థాయి"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>ని"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>గం <xliff:g id="MIN">%2$s</xliff:g>ని"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>గం"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"ఇంటిగ్రేషన్ ప్రోగ్రెస్‌లో ఉంది"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect యాప్ Android సిస్టమ్‌తో ఇంటిగ్రేట్ అవుతోంది.\n\nమీ డేటా, అలాగే అనుమతులు బదిలీ అవుతున్నప్పుడు కొంత టైమ్ పట్టవచ్చు."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"ప్రాసెస్ పూర్తయినట్లు మీకు నోటిఫికేషన్ వచ్చే వరకు యాప్‌ను మూసివేయవద్దు."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect ఇంటిగ్రేషన్ ప్రోగ్రెస్‌లో ఉంది"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"అప్‌డేట్ చేయాలి"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect యాప్ Android సిస్టమ్‌తో ఇంటిగ్రేట్ అవుతోంది, తద్వారా మీరు దీన్ని నేరుగా మీ సెట్టింగ్‌ల నుండి యాక్సెస్ చేయవచ్చు."</string>
     <string name="update_button" msgid="4544529019832009496">"అప్‌డేట్ చేయండి"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"ఈ ‌అప్‌డేట్‌ను ప్రారంభించండి, తద్వారా Health Connect మీ సిస్టమ్ సెట్టింగ్‌లతో ఇంటిగ్రేట్ అవ్వడం కొనసాగించగలదు"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ఇప్పుడే అప్‌డేట్ చేయండి"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"సిస్టమ్ అప్‌డేట్ అవసరం"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"కొనసాగించడానికి ముందు, మీ ఫోన్ సిస్టమ్‌ను అప్‌డేట్ చేయండి."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"మీరు ఇప్పటికే మీ ఫోన్ సిస్టమ్‌ను అప్‌డేట్ చేసి ఉంటే, ఇంటిగ్రేషన్‌ను కొనసాగించడానికి మీ ఫోన్‌ను రీస్టార్ట్ చేసి, ట్రై చేయండి"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect యాప్ అప్‌డేట్ అవసరం"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"కొనసాగించడానికి ముందు, Health Connect యాప్‌ను తాజా వెర్షన్‌కు అప్‌డేట్ చేయండి."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"మరింత స్పేస్ అవసరం"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"ఇంటిగ్రేషన్‌ను కొనసాగించడానికి మీ ఫోన్‌లో Health Connect కోసం <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> స్టోరేజ్ స్పేస్ అవసరం.\n\nమీ ఫోన్‌లో కొంత స్పేస్‌ను క్లియర్ చేసి, ఆపై మళ్లీ ట్రై చేయండి."</string>
     <string name="try_again_button" msgid="8745496819992160789">"మళ్లీ ట్రై చేయండి"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"స్పేస్‌ను ఖాళీ చేయండి"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"మరింత స్పేస్ అవసరం"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"ఇంటిగ్రేట్ చేయడం కొనసాగించడానికి మీ ఫోన్‌లో Health Connect కోసం <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> స్టోరేజ్ స్పేస్ అవసరం."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"ఇంటిగ్రేషన్ పాజ్ చేయబడింది"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Android సిస్టమ్‌తో ఇంటిగ్రేట్ అవుతున్నప్పుడు Health Connect యాప్ మూసివేయబడింది.\n\nయాప్‌ను మళ్లీ తెరవడానికి \'కొనసాగించండి\' పై క్లిక్ చేయండి, అలాగే మీ డేటా, అనుమతులను బదిలీ చేయడం కొనసాగించండి."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"మీ Health Connect డేటా‌ను అలాగే ఉంచడానికి, దీన్ని <xliff:g id="TIME_NEEDED">%1$s</xliff:g>‌లో పూర్తి చేయండి"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Android సిస్టమ్‌తో Health Connect‌ను ఇంటిగ్రేట్ చేయడాన్ని కొనసాగించడానికి ట్యాప్ చేయండి. మీ డేటా‌ను అలాగే ఉంచడానికి, దీన్ని <xliff:g id="TIME_NEEDED">%1$s</xliff:g>‌‌‌లో పూర్తి చేయండి"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Android సిస్టమ్‌తో Health Connect‌ను ఇంటిగ్రేట్ చేయడాన్ని కొనసాగించడానికి ట్యాప్ చేయండి."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"కొనసాగించండి"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect ఇంటిగ్రేషన్‌ను కొనసాగించండి"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"మీ డేటా‌ను అలాగే ఉంచడానికి, దీన్ని <xliff:g id="TIME_NEEDED">%1$s</xliff:g>‌‌‌లో పూర్తి చేయండి"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"యాప్ అప్‌డేట్ అవసరం"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connectతో సింక్ చేయడం కొనసాగించడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అప్‌డేట్ చేయాలి"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connectతో సింక్ చేయడం కొనసాగించడానికి కొన్ని యాప్‌లను అప్‌డేట్ చేయాలి"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connectతో సింక్ చేయడం కొనసాగించడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అప్‌డేట్ చేయాలి. అప్‌డేట్‌లు అన్ని యాప్‌లకు అందుబాటులో ఉండకపోవచ్చు."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connectతో సింక్ చేయడం కొనసాగించడానికి కొన్ని యాప్‌లను అప్‌డేట్ చేయాలి. అప్‌డేట్‌లు అన్ని యాప్‌లకు అందుబాటులో ఉండకపోవచ్చు."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"అప్‌డేట్‌ల కోసం చెక్ చేయండి"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"మరింత తెలుసుకోండి"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect ఇంటిగ్రేషన్"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect ఇంటిగ్రేషన్ పూర్తి కాలేదు"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"అది మళ్లీ అందుబాటులోకి వచ్చినప్పుడు మీకు నోటిఫికేషన్ వస్తుంది."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"సరే"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect ఇంటిగ్రేషన్ పూర్తి కాలేదు"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"మరింత చదవండి"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect ఇంటిగ్రేషన్ పూర్తయింది"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"తెరవండి"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"కొత్తగా ఏమి ఉన్నాయి"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"మీరు ఇప్పుడు మీ సెట్టింగ్‌ల నుండి నేరుగా Health Connect యాప్‌ను యాక్సెస్ చేయవచ్చు. స్టోరేజ్ స్పేస్‌ను ఖాళీ చేయడానికి ఏ సమయంలో అయినా Health Connect యాప్‌ను అన్‌ఇన్‌స్టాల్ చేయండి."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"సరే"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"యాప్ సోర్స్‌లను ఎడిట్ చేయండి"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"పరికరంలో ఆటోమేటిక్‌గా సెట్ చేయబడి ఉన్న యాప్"</string>
     <string name="app_data_title" msgid="6499967982291000837">"యాప్ డేటా"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connectకు యాక్సెస్ ఉన్న యాప్‌ల డేటా ఇక్కడ చూపబడుతుంది"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> నుండి డేటా ఇక్కడ చూపబడుతుంది"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connectకు యాక్సెస్ ఉన్న యాప్‌ల డేటా ఇక్కడ చూపబడుతుంది"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"రోజు"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"వారం"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"నెల"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"గత నెల"</string>
     <string name="tab_entries" msgid="3402700951602029493">"ఎంట్రీలు"</string>
     <string name="tab_access" msgid="7818197975407243701">"యాక్సెస్"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం అదనపు యాక్సెస్‌ను అనుమతించాలా?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> కూడా ఈ Health Connect సెట్టింగ్‌లను యాక్సెస్ చేయాలనుకుంటోంది"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"ఈ యాప్‌నకు సంబంధించిన బ్యాక్‌గ్రౌండ్ లేదా గతంలోని డేటాకు యాక్సెస్‌ను ఆన్ చేయడానికి కనీసం ఒక రీడ్ అనుమతిని ఎనేబుల్ చేయండి"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"ఈ యాప్‌నకు సంబంధించిన బ్యాక్‌గ్రౌండ్ యాక్సెస్‌ను ఆన్ చేయడానికి కనీసం ఒక రీడ్ అనుమతిని ఎనేబుల్ చేయండి"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"ఈ యాప్‌నకు సంబంధించిన గతంలోని డేటాకు యాక్సెస్‌ను ఆన్ చేయడానికి కనీసం ఒక రీడ్ అనుమతిని ఎనేబుల్ చేయండి"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connectను ఉపయోగించడాన్ని ప్రారంభించండి"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"మీ మొదటి యాప్స్ మధ్య ఆరోగ్యం, ఫిట్‌నెస్ డేటాను షేర్ చేయడానికి వాటిని సింక్ చేయండి"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"సెటప్ చేయండి"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"అనుకూల యాప్స్‌ను చూడండి"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect ద్వారా <xliff:g id="APP_NAME">%s</xliff:g>‌తో సింక్ చేయడానికి మరిన్ని యాప్స్‌ను కనుగొనండి"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"యాప్ స్టోర్‌లో చూడండి"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"స్క్రీన్ లాక్‌ను సెట్ చేయండి"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"మీ ఆరోగ్య డేటాకు అదనపు సెక్యూరిటీని అందించడానికి, ఈ పరికరానికి PINను, ఆకృతిని, లేదా పాస్‌వర్డ్‌ను సెట్ చేయండి"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"స్క్రీన్ లాక్‌ను సెట్ చేయండి"</string>
     <string name="select_all" msgid="837499881590001166">"అన్నింటినీ ఎంచుకోండి"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"కనెక్ట్ అయి ఉన్న యాప్‌లు ఇకపై Health Connect నుండి ఈ డేటాను చదవలేవు"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"ఎంచుకోబడింది"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ఎంచుకోలేదు"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"వ్యాయామం మ్యాప్ మార్గం అందుబాటులో ఉంది"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"తర్వాతి రోజు"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"తర్వాతి వారం"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"తర్వాతి నెల"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"మునుపటి రోజు"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"మునుపటి వారం"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"మునుపటి నెల"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"మొత్తం డేటాను శాశ్వతంగా తొలగించాలా?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"ఎంపిక చేసిన డేటాను శాశ్వతంగా తొలగించాలా?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"మొత్తం <xliff:g id="APP_NAME">%s</xliff:g> డేటాను శాశ్వతంగా తొలగించాలా?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> మధ్య పొందిన ఎంపిక చేసిన <xliff:g id="APP_NAME">%1$s</xliff:g> ఎంట్రీలను శాశ్వతంగా తొలగించాలా?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>లో పొందిన ఎంపిక చేసిన <xliff:g id="APP_NAME">%1$s</xliff:g> ఎంట్రీలను శాశ్వతంగా తొలగించాలా?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ఈ <xliff:g id="APP_NAME">%s</xliff:g> ఎంట్రీని శాశ్వతంగా తొలగించాలా?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g>‌కు సంబంధించిన <xliff:g id="DATA_TYPE">%1$s</xliff:g> డేటాను శాశ్వతంగా తొలగించాలా?"</string>
+    <string name="on" msgid="8266542510798355807">"ఆన్‌లో ఉంది"</string>
+    <string name="off" msgid="6996623844428550649">"ఆఫ్‌లో ఉంది"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g>‌కు యాక్సెస్ చేశారు"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"నిన్న <xliff:g id="TIME_DATE">%1$s</xliff:g>‌కు యాక్సెస్‌ చేశారు"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g>‌న<xliff:g id="TIME_DATE_1">%2$s</xliff:g>‌కు యాక్సెస్‌ చేశారు"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"ఎల్లప్పుడూ అనుమతించండి"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"ఎంపికైనవి అనుమతించు"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"యాప్‌ను ఉపయోగిస్తున్నప్పుడు"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"అన్నీ నిరాకరించండి"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"ఫిట్‌నెస్, వెల్‌నెస్ డేటాను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌ను అనుమతించాలా?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="DATA_TYPES">%2$s</xliff:g>‌ను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> రిక్వెస్ట్ చేస్తోంది.\n\nఅన్నిటినీ అనుమతించడానికి ఎంచుకోండి లేదా వాటిని ఒక్కొక్కటిగా కంట్రోల్ చేయండి."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="DATA_TYPE">%2$s</xliff:g>‌ను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g>‌కు అనుమతినివ్వాలా?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"ఫిట్‌నెస్, వెల్‌నెస్"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"అన్ని సమయాలలో అనుమతించండి"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ఉపయోగంలో ఉన్నప్పుడు"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"అన్ని సమయాలలో అనుమతించండి"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ఉపయోగంలో ఉన్నప్పుడు"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> మీ ఫిట్‌నెస్, వెల్‌నెస్ డేటా మొత్తాన్ని యాక్సెస్ చేయగలదు <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"యాక్సెస్ చేయడానికి అనుమతించబడ్డాయి"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"చదవడానికి అనుమతించబడింది"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"ఈ అనుమతులు మీ పరికర సెన్సార్‌ల నుండి డేటాకు, <xliff:g id="APP_NAME">%1$s</xliff:g> యాక్సెస్‌ను అందిస్తాయి."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="OTHER_NUMBER">%2$d</xliff:g>‌లో <xliff:g id="NUMBER_0">%1$d</xliff:g> యాప్‌లు అనుమతించబడ్డాయి"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"యాప్‌లు ఏవీ రిక్వెస్ట్ చేయట్లేదు"</string>
+    <string name="allowed" msgid="4158456017482263737">"అనుమతించబడింది"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"అనుమతించబడలేదు"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"ఈ అనుమతి ఉన్న యాప్‌లు మీ పరికర సెన్సార్‌ల నుండి <xliff:g id="DATA_TYPE">%s</xliff:g> డేటాను యాక్సెస్ చేయగలవు."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"మీ వాచ్‌లో ఉన్న అన్ని యాప్‌లకు <xliff:g id="DATA_TYPE">%s</xliff:g> యాక్సెస్‌ను తీసివేయాలా?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"ఎంపిక గుర్తు"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"క్రాస్ గుర్తు"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"ప్రస్తుతం, <xliff:g id="APP_NAME">%1$s</xliff:g> ఫిట్‌నెస్, వెల్‌నెస్ డేటాను <xliff:g id="ALLOW_MODE">%2$s</xliff:g> యాక్సెస్ చేయగలదు"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"ఫిట్‌నెస్, వెల్‌నెస్ డేటాకు <xliff:g id="APP_NAME">%1$s</xliff:g>‌కు యాక్సెస్‌ను అన్ని సమయాల్లో అనుమతించాలా?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g>‌కు యాక్సెస్‌ను కలిగి ఉంది."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"ఫిట్‌నెస్, వెల్‌నెస్ అనుమతులను మేనేజ్ చేయండి"</string>
 </resources>
diff --git a/apk/res/values-th/strings.xml b/apk/res/values-th/strings.xml
index afe7b80..c58121f 100644
--- a/apk/res/values-th/strings.xml
+++ b/apk/res/values-th/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"จัดการข้อมูลสุขภาพและการออกกำลังกายในอุปกรณ์ และควบคุมว่าแอปใดบ้างที่เข้าถึงข้อมูลได้"</string>
     <string name="data_title" msgid="4456619761533380816">"ข้อมูลและการเข้าถึง"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"เรียกดูบันทึกข้อมูลสุขภาพ"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"ดูบันทึกข้อมูลสุขภาพและแอปที่เข้าถึงได้"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"หมวดหมู่ทั้งหมด"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"ดูหมวดหมู่ทั้งหมด"</string>
     <string name="no_data" msgid="1906986019249068659">"ไม่มีข้อมูล"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"เมื่อวาน"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"อ่าน: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"เขียน: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"จัดการสิทธิ์"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"เวลา: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"กิจกรรม"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"เข้าถึงข้อมูลสุขภาพของคุณ"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"อ่านข้อมูลแคลอรี่ที่ใช้ไป"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"อนุญาตให้แอปอ่านข้อมูลแคลอรี่ที่ใช้ไป"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"เข้าถึงข้อมูลในเบื้องหลัง"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงข้อมูลในเบื้องหลังใช่ไหม"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงข้อมูลในเบื้องหลังใช่ไหม"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูลการออกกำลังกายและสุขภาวะ รวมถึงบันทึกข้อมูลสุขภาพเมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"หากอนุญาต แอปนี้จะสามารถเข้าถึงบันทึกข้อมูลสุขภาพเมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูลการออกกำลังกายและสุขภาวะเมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูล Health Connect เมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงข้อมูลที่ผ่านมาใช่ไหม"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูลการออกกำลังกายและสุขภาวะที่เพิ่มไว้ก่อนวันที่ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูลการออกกำลังกายและสุขภาวะที่ผ่านมาทั้งหมด"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูล Health Connect ที่เพิ่มไว้ก่อนวันที่ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูล Health Connect ที่ผ่านมาทั้งหมด"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงการตั้งค่าเพิ่มเติมใช่ไหม"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> ต้องการเข้าถึงการตั้งค่า Health Connect เหล่านี้ด้วย"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"เข้าถึงข้อมูลทั้งหมดในเบื้องหลัง"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"เข้าถึงบันทึกข้อมูลสุขภาพในเบื้องหลัง"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะในเบื้องหลัง"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"อนุญาตให้แอปนี้เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะ รวมถึงบันทึกข้อมูลสุขภาพเมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"อนุญาตให้แอปนี้เข้าถึงข้อมูลนี้เมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"อนุญาตให้แอปนี้เข้าถึงข้อมูลนี้เมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"เข้าถึงข้อมูลในเบื้องหลัง"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect เมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะที่ผ่านมา"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"อนุญาตให้แอปนี้เข้าถึงข้อมูลที่เพิ่มไว้ก่อนวันที่ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"อนุญาตให้แอปนี้เข้าถึงข้อมูลที่ผ่านมาทั้งหมด"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"เข้าถึงข้อมูลในอดีต"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect ที่เพิ่มไว้ก่อนวันที่ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect ที่ผ่านมาทั้งหมด"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> สามารถเข้าถึงข้อมูลที่ผ่านมาในบันทึกข้อมูลสุขภาพของคุณได้อยู่แล้ว"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"อ่านเพิ่มเติมเกี่ยวกับสิทธิ์"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"เข้าถึงข้อมูลทั้งหมดในเบื้องหลัง"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"เข้าถึงบันทึกข้อมูลสุขภาพในเบื้องหลัง"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะในเบื้องหลัง"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"อนุญาตให้แอปนี้เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะ รวมถึงบันทึกข้อมูลสุขภาพเมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"อนุญาตให้แอปนี้เข้าถึงข้อมูลนี้เมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"อนุญาตให้แอปนี้เข้าถึงข้อมูลนี้เมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"เข้าถึงข้อมูลในเบื้องหลัง"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect เมื่อคุณไม่ได้ใช้แอป"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะที่ผ่านมา"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"อนุญาตให้แอปนี้เข้าถึงข้อมูลที่เพิ่มไว้ก่อนวันที่ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"อนุญาตให้แอปนี้เข้าถึงข้อมูลที่ผ่านมาทั้งหมด"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"เข้าถึงข้อมูลในอดีต"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect ที่เพิ่มไว้ก่อนวันที่ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect ที่ผ่านมาทั้งหมด"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"ขณะนี้ไม่มีการอ่านข้อมูลการออกกำลังกายเนื่องจาก <xliff:g id="APP_NAME">%1$s</xliff:g> ไม่มีสิทธิ์อ่าน"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> สามารถเข้าถึงข้อมูลที่ผ่านมาในบันทึกข้อมูลสุขภาพของคุณได้อยู่แล้ว หากต้องการเปลี่ยนการตั้งค่านี้ ให้ปิดสิทธิ์ด้านบันทึกข้อมูลสุขภาพสําหรับแอปนี้"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"จัดการสิทธิ์ด้านบันทึกข้อมูลสุขภาพ"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"เปิดใช้สิทธิ์อ่านอย่างน้อย 1 รายการเพื่อเปิดใช้การเข้าถึงข้อมูลในอดีตหรือในเบื้องหลังสำหรับแอปนี้"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"เปิดใช้สิทธิ์อ่านอย่างน้อย 1 รายการเพื่อเปิดใช้การเข้าถึงเมื่ออยู่เบื้องหลังสำหรับแอปนี้"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"เปิดใช้สิทธิ์อ่านอย่างน้อย 1 รายการเพื่อเปิดใช้การเข้าถึงข้อมูลในอดีตสำหรับแอปนี้"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect ที่ผ่านมาทั้งหมด"</string>
     <string name="background_read_description" msgid="3203594555849969283">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect เมื่อคุณไม่ได้ใช้แอป"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูล Health Connect เมื่อคุณไม่ได้ใช้แอป"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"เข้าถึงข้อมูลในอดีต"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงข้อมูลในอดีตใช่ไหม"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect ที่เพิ่มไว้ก่อนวันที่ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"อนุญาตให้แอปนี้เข้าถึงข้อมูล Health Connect ทั้งหมดในอดีต"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูล Health Connect ที่เพิ่มไว้ก่อนวันที่ <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"หากอนุญาต แอปนี้จะสามารถเข้าถึงข้อมูล Health Connect ทั้งหมดในอดีต"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"แคลอรี่ที่ใช้ไปในการเคลื่อนไหวร่างกาย"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"แคลอรี่ที่ใช้ไปในการเคลื่อนไหวร่างกาย"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"อ่านข้อมูลแคลอรี่ที่ใช้ไปในการเคลื่อนไหวร่างกาย"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"การทำวีลแชร์พุช"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"อ่านข้อมูลการทำวีลแชร์พุช"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"เขียนข้อมูลการทำวีลแชร์พุช"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"ความหนักของกิจกรรม"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ความหนักของกิจกรรม"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"อ่านข้อมูลความหนักของกิจกรรม"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"เขียนข้อมูลความหนักของกิจกรรม"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"อัตราการเผาผลาญขณะพัก"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"อัตราการเผาผลาญขณะพัก"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"อ่านข้อมูลอัตราการเผาผลาญขณะพัก"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"อุณหภูมิผิวหนัง"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"อ่านข้อมูลอุณหภูมิผิวหนัง"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"เขียนข้อมูลอุณหภูมิผิวหนัง"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"รวมถึงบันทึกข้อมูลสุขภาพทั้งหมดที่ซิงค์และเพิ่มลงใน Health Connect ข้อมูลนี้อาจไม่ใช่เวชระเบียนทั้งหมดและไม่รวมถึงคำอธิบายทางการแพทย์เกี่ยวกับบันทึกข้อมูลสุขภาพของคุณ"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"บันทึกข้อมูลสุขภาพทั้งหมด"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"บันทึกข้อมูลสุขภาพทั้งหมด"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"เขียนบันทึกข้อมูลสุขภาพทั้งหมด"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"อาการแพ้"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"อาการแพ้"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"อ่านข้อมูลอาการแพ้"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"การฉีดวัคซีนสร้างภูมิคุ้มกัน"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"การฉีดวัคซีนสร้างภูมิคุ้มกัน"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"อ่านข้อมูลการฉีดวัคซีนสร้างภูมิคุ้มกัน"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"ผลการตรวจ"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"ผลการตรวจ"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"อ่านผลการตรวจ"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"อาการแพ้"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"อาการแพ้"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"อ่านข้อมูลอาการแพ้"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"ภาวะทางการแพทย์"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"ภาวะทางการแพทย์"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"อ่านข้อมูลเกี่ยวกับภาวะทางการแพทย์"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"วัคซีน"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"วัคซีน"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"อ่านข้อมูลวัคซีน"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"ผลตรวจ"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"ผลตรวจ"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"อ่านผลตรวจ"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ข้อมูลยา"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ข้อมูลยา"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"อ่านข้อมูลยา"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"รายละเอียดส่วนตัว"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"รายละเอียดส่วนตัว"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"อ่านรายละเอียดส่วนตัว"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"รายละเอียดผู้ประกอบวิชาชีพทางการแพทย์"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"รายละเอียดผู้ประกอบวิชาชีพทางการแพทย์"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"อ่านรายละเอียดผู้ประกอบวิชาชีพทางการแพทย์"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"การตั้งครรภ์"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"การตั้งครรภ์"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"อ่านข้อมูลการตั้งครรภ์"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"ปัญหา"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"ปัญหา"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"อ่านข้อมูลปัญหา"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"การทำหัตถการ"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"การทำหัตถการ"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"อ่านข้อมูลการทำหัตถการ"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"ภาวะสังคม"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"ภาวะสังคม"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ภาวะสังคม"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"อ่านข้อมูลภาวะสังคม"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"สัญญาณชีพ"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ไปพบแพทย์"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ไปพบแพทย์"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"อ่านข้อมูลเกี่ยวกับการไปพบแพทย์"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"สัญญาณชีพ"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"สัญญาณชีพ"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"อ่านข้อมูลสัญญาณชีพ"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"การเจริญสติ"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"เขียนข้อมูลการเจริญสติ"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"อนุญาตให้ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" อ่าน"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"อนุญาตให้ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" เขียน"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"ยกเลิก"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"อนุญาต"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"อนุญาตทั้งหมด"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"ไม่อนุญาต"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"เลือกข้อมูลที่คุณต้องการให้แอปนี้อ่านหรือเขียนลงใน Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"เลือกข้อมูลที่คุณต้องการให้แอปนี้อ่านหรือเขียนลงใน Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"เลือกข้อมูลที่คุณต้องการให้แอปนี้อ่านจาก Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"เลือกข้อมูลที่คุณต้องการให้แอปนี้เขียนลงใน Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"หากคุณให้สิทธิ์อ่าน แอปนี้จะอ่านข้อมูลใหม่และข้อมูลในช่วง 30 วันที่ผ่านมาได้"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"หากคุณให้สิทธิ์อ่าน แอปนี้จะอ่านข้อมูลใหม่และข้อมูลในอดีตได้"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึง Health Connect ไหม"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"ดูวิธีที่ <xliff:g id="APP_NAME">%1$s</xliff:g> จัดการข้อมูลของคุณใน<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>ของนักพัฒนาแอป"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะไหม"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"ดูวิธีที่ <xliff:g id="APP_NAME">%1$s</xliff:g> จัดการข้อมูลของคุณใน<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"นโยบายความเป็นส่วนตัว"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงบันทึกข้อมูลสุขภาพไหม"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"หากคุณให้สิทธิ์เข้าถึง แอปนี้จะสามารถอ่านและเขียนข้อมูล เช่น อาการแพ้ ผลตรวจ วัคซีน และอื่นๆ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"หากคุณให้สิทธิ์เข้าถึง แอปนี้จะสามารถอ่านข้อมูล เช่น อาการแพ้ ผลตรวจ วัคซีน และอื่นๆ\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"เกี่ยวกับบันทึกข้อมูลสุขภาพ"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"ข้อมูลที่จะแชร์ ได้แก่"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"หากอนุญาต <xliff:g id="APP_NAME">%1$s</xliff:g> จะแชร์บันทึกข้อมูลสุขภาพของคุณกับ Health Connect ได้"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"ซิงค์บันทึกข้อมูลสุขภาพจากแอปและแหล่งที่มาต่างๆ เพื่อเก็บไว้ในที่เดียว"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"นำสิทธิ์ทั้งหมดออกใช่ไหม"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"นำออกทั้งหมด"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลจาก Health Connect ได้อีกต่อไป\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลจาก Health Connect ได้อีกต่อไป รวมถึงข้อมูลในอดีต\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงตำแหน่ง กล้อง หรือไมโครโฟน"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลจาก Health Connect ได้อีกต่อไป รวมถึงข้อมูลในเบื้องหลังและข้อมูลในอดีต\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงตำแหน่ง กล้อง หรือไมโครโฟน"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"ลบข้อมูล <xliff:g id="APP_NAME">%1$s</xliff:g> ออกจาก Health Connect ด้วย"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"นำสิทธิ์ทั้งหมดออกใช่ไหม"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"นำสิทธิ์ด้านบันทึกข้อมูลสุขภาพทั้งหมดออกใช่ไหม"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"นำสิทธิ์ทั้งหมดเกี่ยวกับการออกกำลังกายและสุขภาวะออกไหม"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"ลบข้อมูลการออกกำลังกายจาก <xliff:g id="APP_NAME">%1$s</xliff:g> ออกจาก Health Connect ด้วย"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"นำสิทธิ์ด้านบันทึกข้อมูลสุขภาพทั้งหมดออกใช่ไหม"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"ลบบันทึกข้อมูลสุขภาพจาก <xliff:g id="APP_NAME">%1$s</xliff:g> ออกจาก Health Connect ด้วย"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลนี้จาก Health Connect ได้อีกต่อไป\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลนี้จาก Health Connect ได้อีกต่อไป รวมถึงข้อมูลในเบื้องหลัง\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลนี้จาก Health Connect ได้อีกต่อไป รวมถึงข้อมูลในอดีต\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลนี้จาก Health Connect ได้อีกต่อไป รวมถึงข้อมูลในเบื้องหลังและในอดีต\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"นำสิทธิ์ทั้งหมดออกใช่ไหม"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลจาก Health Connect ได้อีกต่อไป\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลจาก Health Connect ได้อีกต่อไป รวมถึงข้อมูลในเบื้องหลัง\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลจาก Health Connect ได้อีกต่อไป รวมถึงข้อมูลในอดีต\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> จะไม่สามารถอ่านหรือเขียนข้อมูลจาก Health Connect ได้อีกต่อไป รวมถึงข้อมูลในเบื้องหลังและในอดีต\n\nการดำเนินการนี้ไม่ส่งผลต่อสิทธิ์อื่นๆ ที่แอปนี้อาจมี เช่น สิทธิ์เข้าถึงกล้อง ไมโครโฟน หรือตำแหน่ง"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"ลบข้อมูลการออกกำลังกายและบันทึกข้อมูลสุขภาพจาก <xliff:g id="APP_NAME">%1$s</xliff:g> ออกจาก Health Connect ด้วย"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"นำสิทธิ์สำหรับแอปนี้ออกแล้ว"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"ลบข้อมูล Health Connect ทั้งหมดด้วย"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"วันถัดไป"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"วันที่เลือก"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"วันก่อน"</string>
     <string name="default_error" msgid="7966868260616403475">"เกิดข้อผิดพลาด โปรดลองอีกครั้ง"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"ทรัพยากรที่ไม่รู้จัก"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ข้อมูลแหล่งที่มา"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>วงเล็บปีกกาเปิด"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>วงเล็บปีกกาปิด"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> ค่าในฟิลด์ <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"แอปเหล่านี้ไม่มีสิทธิ์เข้าถึงอีกต่อไป แต่จะยังคงมีข้อมูลจัดเก็บอยู่ใน Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> สามารถอ่านข้อมูลที่เพิ่มหลังวันที่ <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"หากต้องการจัดการสิทธิ์อื่นๆ ใน Android ที่แอปนี้เข้าถึงได้ ให้ไปที่การตั้งค่า &gt; แอป"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"ข้อมูลที่แชร์กับ <xliff:g id="APP_NAME">%1$s</xliff:g> จะอยู่ภายใต้นโยบายความเป็นส่วนตัวของแอปดังกล่าว"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"ดูวิธีที่ <xliff:g id="APP_NAME">%1$s</xliff:g> จัดการข้อมูลของคุณได้ในนโยบายความเป็นส่วนตัวของนักพัฒนาแอปดังกล่าว"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"หากต้องการจัดการสิทธิ์ของ Android อื่นๆ ที่แอปนี้เข้าถึงได้ ให้ไปที่การตั้งค่าแล้วแตะที่แอป"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"อ่านนโยบายความเป็นส่วนตัว"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"เข้าถึงในช่วง 24 ชั่วโมงที่ผ่านมา"</string>
     <string name="app_access_title" msgid="7137018424885371763">"สิทธิ์การเข้าถึงของแอป"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"ตอนนี้คุณยังไม่ได้ติดตั้งแอปที่เข้ากันได้"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"การเข้าถึงเพิ่มเติม"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ข้อมูลที่ผ่านมา ข้อมูลในเบื้องหลัง"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"นำสิทธิ์เพิ่มเติมสำหรับแอปนี้ออกแล้ว"</string>
     <string name="permissions_header" msgid="6519976063360071569">"สิทธิ์"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"การออกกำลังกายและสุขภาวะ"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"การออกกำลัง การนอนหลับ โภชนาการ และอื่นๆ"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"บันทึกข้อมูลสุขภาพ"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"บันทึกข้อมูลสุขภาพ"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"ผลตรวจ ยา การสร้างภูมิคุ้มกัน และอื่นๆ"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"ผลตรวจ ยา วัคซีน และอื่นๆ"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"สิทธิ์ของแอปที่ถูกนำออก"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect นำสิทธิ์สำหรับ <xliff:g id="APP_DATA">%s</xliff:g> ออกแล้ว"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect นำสิทธิ์สำหรับ <xliff:g id="APP_DATA_0">%1$s</xliff:g> และ <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> ออกแล้ว"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"ไปที่ Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"เริ่มต้นใช้งาน Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect จะจัดเก็บข้อมูลสุขภาพและการออกกำลังกาย พร้อมให้คุณซิงค์แอปต่างๆ ในอุปกรณ์ได้โดยง่าย"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect จะจัดเก็บและซิงค์ข้อมูลสุขภาพและการออกกำลังกายจากแอปต่างๆ\n\n"<b>"ข้อมูลการออกกำลังกายและสุขภาวะ"</b>" รวมถึงเซสชันการออกกำลังกาย จำนวนก้าว โภชนาการ การนอนหลับ และอื่นๆ\n\n"<b>"บันทึกข้อมูลสุขภาพ"</b>" รวมถึงวัคซีน ผลตรวจ และอื่นๆ"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ช่วยให้คุณทำสิ่งต่อไปนี้ได้"</string>
     <string name="share_data" msgid="3481932156368883946">"แชร์ข้อมูลกับแอปต่างๆ"</string>
     <string name="share_data_description" msgid="2919871301634375092">"เลือกข้อมูลที่แต่ละแอปจะอ่านหรือเขียนลงใน Health Connect ได้"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"จัดการการตั้งค่าและความเป็นส่วนตัว"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"มาน้อย"</string>
     <string name="flow_medium" msgid="3783688724668943154">"มาปานกลาง"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"มามาก"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"รอบที่ไม่รู้จัก"</string>
     <string name="period_day" msgid="3821944462093965882">"รอบเดือนวันที่ <xliff:g id="DAY">%1$d</xliff:g> จาก <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> วัน"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ระยะเวลา (1 วัน)}other{ระยะเวลา (# วัน)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"บวก"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"ลบ"</string>
     <string name="ovulation_high" msgid="205362931427158291">"สูง"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"เพลง"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"อื่นๆ"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"ไม่มีคำแนะนำ"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"ปานกลาง"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"หนัก"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> นาที"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> ชม. <xliff:g id="MIN">%2$s</xliff:g> นาที"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> ชม."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"การผสานรวมอยู่ระหว่างดำเนินการ"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect กำลังผสานรวมกับระบบ Android\n\nทั้งนี้ การโอนข้อมูลและสิทธิ์ต่างๆ ของคุณอาจใช้เวลาสักระยะหนึ่ง"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"อย่าปิดแอปจนกว่าจะได้รับการแจ้งเตือนว่าขั้นตอนนี้เสร็จสมบูรณ์แล้ว"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"การผสานรวม Health Connect อยู่ระหว่างดำเนินการ"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"ต้องอัปเดต"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect กำลังผสานรวมกับระบบ Android เพื่อให้คุณเข้าถึงได้โดยตรงจากการตั้งค่า"</string>
     <string name="update_button" msgid="4544529019832009496">"อัปเดต"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"เริ่มการอัปเดตนี้เพื่อให้ Health Connect ผสานรวมกับการตั้งค่าระบบต่อได้"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"อัปเดตเลย"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"ต้องอัปเดตระบบ"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"อัปเดตระบบโทรศัพท์ก่อนที่จะดำเนินการต่อ"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"หากอัปเดตระบบโทรศัพท์เรียบร้อยแล้ว ให้ลองรีสตาร์ทโทรศัพท์เพื่อผสานรวมต่อ"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"ต้องอัปเดต Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"อัปเดตแอป Health Connect เป็นเวอร์ชันล่าสุดก่อนที่จะดำเนินการต่อ"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"ต้องมีพื้นที่มากขึ้น"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect ต้องใช้พื้นที่เก็บข้อมูลในโทรศัพท์ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> เพื่อผสานรวมต่อ\n\nโปรดเพิ่มพื้นที่ว่างในโทรศัพท์แล้วลองอีกครั้ง"</string>
     <string name="try_again_button" msgid="8745496819992160789">"ลองอีกครั้ง"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"เพิ่มพื้นที่ว่าง"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"ต้องมีพื้นที่มากขึ้น"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect ต้องใช้พื้นที่เก็บข้อมูลในโทรศัพท์ <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> เพื่อผสานรวมต่อ"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"หยุดการผสานรวมชั่วคราว"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"แอป Health Connect ปิดลงขณะกำลังผสานรวมกับระบบ Android\n\nคลิก \"ทำต่อ\" เพื่อเปิดแอปอีกครั้ง แล้วดำเนินการโอนข้อมูลและสิทธิ์ต่างๆ ต่อ"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"โปรดดำเนินการให้เสร็จสมบูรณ์ภายใน <xliff:g id="TIME_NEEDED">%1$s</xliff:g> เพื่อเก็บข้อมูล Health Connect ของคุณไว้"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"แตะเพื่อผสานรวม Health Connect กับระบบ Android ต่อ โปรดดำเนินการให้เสร็จสมบูรณ์ภายใน <xliff:g id="TIME_NEEDED">%1$s</xliff:g> เพื่อเก็บข้อมูลของคุณไว้"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"แตะเพื่อผสานรวม Health Connect กับระบบ Android ต่อ"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"ต่อไป"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"ผสานรวม Health Connect ต่อ"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"โปรดดำเนินการให้เสร็จสมบูรณ์ภายใน <xliff:g id="TIME_NEEDED">%1$s</xliff:g> เพื่อเก็บข้อมูลของคุณไว้"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ต้องอัปเดตแอป"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"ต้องอัปเดต <xliff:g id="APP_NAME">%1$s</xliff:g> ก่อนจึงจะซิงค์กับ Health Connect ต่อได้"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"บางแอปต้องอัปเดตก่อนจึงจะซิงค์กับ Health Connect ต่อได้"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"ต้องอัปเดต <xliff:g id="APP_NAME">%1$s</xliff:g> ก่อนจึงจะซิงค์กับ Health Connect ต่อได้ การอัปเดตอาจไม่พร้อมใช้งานสำหรับบางแอป"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"บางแอปต้องอัปเดตก่อนจึงจะซิงค์กับ Health Connect ต่อได้ การอัปเดตอาจไม่พร้อมใช้งานสำหรับบางแอป"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"ตรวจหาการอัปเดต"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"ดูข้อมูลเพิ่มเติม"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"การผสานรวม Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"การผสานรวม Health Connect ไม่เสร็จสมบูรณ์"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"คุณจะได้รับการแจ้งเตือนเมื่อพร้อมดำเนินการอีกครั้ง"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"รับทราบ"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"การผสานรวม Health Connect ไม่เสร็จสมบูรณ์"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"อ่านเพิ่มเติม"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"การผสานรวม Health Connect เสร็จสมบูรณ์"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"เปิด"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"มีอะไรใหม่"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"ตอนนี้คุณสามารถเข้าถึง Health Connect โดยตรงจากการตั้งค่า ถอนการติดตั้งแอป Health Connect ได้ทุกเมื่อเพื่อเพิ่มพื้นที่เก็บข้อมูล"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"รับทราบ"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"แก้ไขแหล่งที่มาของแอป"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"ค่าเริ่มต้นของอุปกรณ์"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ข้อมูลแอป"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"ข้อมูลจากแอปที่มีสิทธิ์เข้าถึง Health Connect จะแสดงที่นี่"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"ข้อมูลจาก <xliff:g id="APP_NAME">%1$s</xliff:g> จะแสดงที่นี่"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"ข้อมูลจากแอปที่มีสิทธิ์เข้าถึง Health Connect จะแสดงที่นี่"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"วัน"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"สัปดาห์"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"เดือน"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"เดือนที่แล้ว"</string>
     <string name="tab_entries" msgid="3402700951602029493">"รายการ"</string>
     <string name="tab_access" msgid="7818197975407243701">"การเข้าถึง"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"อนุญาตการเข้าถึงเพิ่มเติมสำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ต้องการเข้าถึงการตั้งค่า Health Connect เหล่านี้ด้วย"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"เปิดใช้สิทธิ์อ่านอย่างน้อย 1 รายการเพื่อเปิดใช้การเข้าถึงข้อมูลในอดีตหรือในเบื้องหลังสำหรับแอปนี้"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"เปิดใช้สิทธิ์อ่านอย่างน้อย 1 รายการเพื่อเปิดใช้การเข้าถึงเมื่ออยู่เบื้องหลังสำหรับแอปนี้"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"เปิดใช้สิทธิ์อ่านอย่างน้อย 1 รายการเพื่อเปิดใช้การเข้าถึงข้อมูลในอดีตสำหรับแอปนี้"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"เริ่มใช้ Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"ซิงค์แอปแรกเพื่อแชร์ข้อมูลสุขภาพและการออกกำลังกายระหว่างกัน"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"ตั้งค่า"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"ดูแอปที่เข้ากันได้"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"ค้นหาแอปเพิ่มเติมเพื่อซิงค์กับ <xliff:g id="APP_NAME">%s</xliff:g> ผ่าน Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"ดูใน App Store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"ตั้งค่าการล็อกหน้าจอ"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"ตั้งค่า PIN, รูปแบบ หรือรหัสผ่านสำหรับอุปกรณ์นี้เพื่อเพิ่มความปลอดภัยให้กับข้อมูลสุขภาพ"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"ตั้งค่าการล็อกหน้าจอ"</string>
     <string name="select_all" msgid="837499881590001166">"เลือกทั้งหมด"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"แอปที่เชื่อมต่อจะอ่านข้อมูลนี้จาก Health Connect ไม่ได้อีก"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"เลือกไว้"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"ไม่ได้เลือก"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"มีเส้นทางออกกำลังกายบนแผนที่"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"วันถัดไป"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"สัปดาห์หน้า"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"เดือนถัดไป"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"วันก่อน"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"สัปดาห์ก่อน"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"เดือนก่อน"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"ลบข้อมูลทั้งหมดอย่างถาวรใช่ไหม"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"ลบข้อมูลที่เลือกอย่างถาวรใช่ไหม"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"ลบข้อมูล <xliff:g id="APP_NAME">%s</xliff:g> ทั้งหมดอย่างถาวรใช่ไหม"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"ลบรายการ <xliff:g id="APP_NAME">%1$s</xliff:g> ที่เลือกสำหรับสัปดาห์วันที่ <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> อย่างถาวรใช่ไหม"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"ลบรายการ <xliff:g id="APP_NAME">%1$s</xliff:g> ที่เลือกสำหรับเดือน<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> อย่างถาวรใช่ไหม"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"ลบรายการ <xliff:g id="APP_NAME">%s</xliff:g> นี้อย่างถาวรใช่ไหม"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"ลบข้อมูล<xliff:g id="DATA_TYPE">%1$s</xliff:g>ของ <xliff:g id="APP_NAME">%2$s</xliff:g> อย่างถาวรใช่ไหม"</string>
+    <string name="on" msgid="8266542510798355807">"เปิด"</string>
+    <string name="off" msgid="6996623844428550649">"ปิด"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"เข้าถึงเมื่อ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"เข้าถึงเมื่อวานตอน <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"เข้าถึงเมื่อวันที่ <xliff:g id="TIME_DATE_0">%1$s</xliff:g> ตอน <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"อนุญาตตลอด"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"อนุญาตรายการที่เลือก"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ขณะใช้แอป"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"ปฏิเสธทั้งหมด"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะไหม"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ขอสิทธิ์เข้าถึง <xliff:g id="DATA_TYPES">%2$s</xliff:g>\n\nเลือกว่าจะอนุญาตทั้งหมดหรือควบคุมทีละรายการ"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึง<xliff:g id="DATA_TYPE">%2$s</xliff:g>ไหม"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"การออกกำลังกายและสุขภาวะ"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ตลอดเวลา"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ขณะใช้งานอยู่"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"ตลอดเวลา"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"ขณะใช้งานอยู่"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> สามารถเข้าถึงข้อมูลการออกกำลังกายและสุขภาวะทั้งหมดของคุณได้<xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"อนุญาตให้เข้าถึง"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"อนุญาตให้อ่าน"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"สิทธิ์เหล่านี้จะให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงข้อมูลจากเซ็นเซอร์ของอุปกรณ์ได้"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"อนุญาตแล้ว <xliff:g id="NUMBER_0">%1$d</xliff:g> จาก <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> แอป"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"ไม่มีแอปที่ขอ"</string>
+    <string name="allowed" msgid="4158456017482263737">"อนุญาต"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"ไม่อนุญาต"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"แอปที่มีสิทธิ์นี้จะเข้าถึงข้อมูล<xliff:g id="DATA_TYPE">%s</xliff:g>จากเซ็นเซอร์ของอุปกรณ์ได้"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"นําสิทธิ์เข้าถึง<xliff:g id="DATA_TYPE">%s</xliff:g>ออกจากแอปทั้งหมดในนาฬิกาไหม"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"เครื่องหมายถูก"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"เครื่องหมายกากบาท"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"ขณะนี้ <xliff:g id="APP_NAME">%1$s</xliff:g> สามารถเข้าถึงข้อมูลการออกกำลังกายและสุขภาวะ<xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"อนุญาตให้ <xliff:g id="APP_NAME">%1$s</xliff:g> เข้าถึงข้อมูลการออกกำลังกายและสุขภาวะตลอดเวลาไหม"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> มีสิทธิ์เข้าถึงข้อมูล<xliff:g id="DATA_TYPES">%2$s</xliff:g>"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"จัดการสิทธิ์ด้านการออกกำลังกายและสุขภาวะ"</string>
 </resources>
diff --git a/apk/res/values-tl/strings.xml b/apk/res/values-tl/strings.xml
index 72040e7..502e6be 100644
--- a/apk/res/values-tl/strings.xml
+++ b/apk/res/values-tl/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Pamahalaan ang data ng kalusugan at fitness sa iyong device, at kontrolin kung aling mga app ang makaka-access nito"</string>
     <string name="data_title" msgid="4456619761533380816">"Data at access"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Mag-browse sa mga health record"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Tingnan ang iyong mga health record at kung aling mga app ang puwedeng maka-access sa mga ito"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Lahat ng kategorya"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Tingnan ang lahat ng kategorya"</string>
     <string name="no_data" msgid="1906986019249068659">"Walang data"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Kahapon"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Na-read: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Na-write: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Pamahalaan ang mga pahintulot"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Oras: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Aktibidad"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"i-access ang iyong data ng kalusugan"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"I-read ang na-burn na calorie"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Pinapayagan ang app na i-read ang mga na-burn na calorie"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"I-access ang data sa background"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na i-access ang data sa background?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na i-access ang data sa background?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Kung papayagan mo, maa-access ng app na ito ang data ng fitness at wellness at mga health record kapag hindi mo ginagamit ang app."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Kung papayagan mo, maa-access ng app na ito ang mga health record kapag hindi mo ginagamit ang app."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Kung papayagan mo, maa-access ng app na ito ang data sa fitness at wellness kapag hindi mo ginagamit ang app."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Kung papayagan mo, maa-access ng app na ito ang data ng Health Connect kapag hindi mo ginagamit ang app."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na i-access ang nakaraang data?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Kung papayagan mo, maa-access ng app na ito ang data sa fitness at wellness na idinagdag bago ang <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Kung papayagan mo, maa-access ng app na ito ang lahat ng dating data sa fitness at wellness."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Kung papayagan mo, maa-access ng app na ito ang data ng Health Connect na idinagdag bago ang <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Kung papayagan mo, maa-access ng app na ito ang lahat ng nakaraang data ng Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Payagan ang karagdagang access para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Gusto ring i-access ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang mga setting ng Health Connect na ito"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"I-access ang lahat ng data sa background"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"I-access ang mga health record sa background"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"I-access ang data sa fitness at wellness sa background"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Payagan ang app na ito na i-access ang data ng fitness at wellness at mga health record kapag hindi mo ginagamit ang app."</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Payagan ang app na ito na i-access ang data na ito kapag hindi mo ginagamit ang app"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Payagan ang app na ito na i-access ang data na ito kapag hindi mo ginagamit ang app"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"I-access ang data sa background"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Payagan ang app na ito na i-access ang data ng Health Connect kapag hindi mo ginagamit ang app"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"I-access ang nakaraang data ng fitness at wellness"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Payagan ang app na ito na i-access ang data na idinagdag bago ang <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Payagan ang app na ito na i-access ang lahat ng nakaraang data"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"I-access ang dating data"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Payagan ang app na ito na i-access ang data ng Health Connect na idinagdag bago ang <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Payagan ang app na ito na i-access ang lahat ng nakaraang data ng Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Maa-access na ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang nakaraang data mula sa iyong mga health record"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Magbasa pa tungkol sa mga pahintulot"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"I-access ang lahat ng data sa background"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"I-access ang mga health record sa background"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"I-access ang data sa fitness at wellness sa background"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Payagan ang app na ito na i-access ang data ng fitness at wellness at mga health record kapag hindi mo ginagamit ang app."</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Payagan ang app na ito na i-access ang data na ito kapag hindi mo ginagamit ang app"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Payagan ang app na ito na i-access ang data na ito kapag hindi mo ginagamit ang app"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"I-access ang data sa background"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Payagan ang app na ito na i-access ang data ng Health Connect kapag hindi mo ginagamit ang app"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"I-access ang nakaraang data ng fitness at wellness"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Payagan ang app na ito na i-access ang data na idinagdag bago ang <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Payagan ang app na ito na i-access ang lahat ng nakaraang data"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"I-access ang dating data"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Payagan ang app na ito na i-access ang data ng Health Connect na idinagdag bago ang <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Payagan ang app na ito na i-access ang lahat ng dating data sa Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Walang data ng fitness ang kasalukuyang binabasa dahil walang naka-on na read permission ang <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"Maa-access na ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang nakaraang data mula sa iyong mga health record. Para baguhin ito, i-off ang mga pahintulot sa health record para sa app na ito"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Pamahalaan ang mga pahintulot sa health record"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Mag-enable ng kahit man lang isang read permission para ma-on ang access habang nasa background o access sa dating data para sa app na ito"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Mag-enable ng kahit man lang isang read permission para ma-on ang access habang nasa background para sa app na ito"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Mag-enable ng kahit man lang isang read permission para ma-on ang access sa dating data para sa app na ito"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Payagan ang app na ito na i-access ang lahat ng nakaraang data ng Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Payagan ang app na ito na i-access ang data ng Health Connect kapag hindi mo ginagamit ang app"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Kung papayagan mo, maa-access ng app na ito ang data ng Health Connect kapag hindi mo ginagamit ang app."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"I-access ang nakaraang data"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na i-access ang nakaraang data?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Payagan ang app na ito na i-access ang data ng Health Connect na idinagdag bago ang <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Payagan ang app na ito na i-access ang lahat ng nakaraang data ng Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Kung papayagan mo, maa-access ng app na ito ang data ng Health Connect na idinagdag bago ang <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Kung papayagan mo, maa-access ng app na ito ang lahat ng nakaraang data ng Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Mga calorie na na-burn habang aktibo"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"mga calorie na na-burn habang aktibo"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"I-read ang mga calorie na na-burn habang aktibo"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"mga pagtulak ng wheelchair"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"I-read ang mga pagtulak ng wheelchair"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"I-write ang mga pagtulak ng wheelchair"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Tindi ng aktibidad"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"tindi ng aktibidad"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"I-read ang tindi ng aktibidad"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"I-write ang tindi ng aktibidad"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Basal metabolic rate"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"basal metabolic rate"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"I-read ang basal metabolic rate"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"temperatura ng balat"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Basahin ang temperatura ng balat"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"I-write ang temperatura ng balat"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Kabilang dito ang lahat ng health record na naka-sync at idinagdag sa Health Connect. Posibleng hindi ito ang buo mong medical record at wala itong medikal na paglalarawan ng iyong mga health record."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Lahat ng health record"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"lahat ng health record"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"I-write ang lahat ng health record"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Mga Allergy"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"mga allergy"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Basahin ang mga allergy"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Immunization"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"immunization"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"I-read ang immunization"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Mga Resulta ng Laboratoryo"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"mga resulta ng laboratoryo"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"I-read ang mga resulta ng laboratoryo"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Mga Allergy"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"mga allergy"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"I-read ang mga allergy"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Mga Kundisyon"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"mga kundisyon"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"I-read ang mga kundisyon"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Mga Bakuna"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"mga bakuna"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"I-read ang mga bakuna"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Mga lab result"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"mga lab result"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"I-read ang mga lab result"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Mga Gamot"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"mga gamot"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"I-read ang mga gamot"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Mga personal na detalye"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"mga personal na detalye"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"I-read ang mga personal na detalye"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Mga detalye ng practitioner"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"mga detalye ng practitioner"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"I-read ang mga detalye ng practitioner"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Pagbubuntis"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"pagbubuntis"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"I-read ang pagbubuntis"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Mga Problema"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"mga problema"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"I-read ang mga problema"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Mga Procedure"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"mga procedure"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"I-read ang mga procedure"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Panlipunang History"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Kasaysayang panlipunan"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"panlipunang history"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Basahin ang panlipunang history"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Vital Signs"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Mga Pagpapatingin"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"mga pagpapatingin"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"I-read ang mga pagpapatingin"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Vital signs"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"vital signs"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"I-read ang vital signs"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Pagiging Maintindihin"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Mag-write sa pagiging maintindihin"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Payagang mag-read ang “<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Payagang mag-write ang “<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Kanselahin"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Payagan"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Payagan ang lahat"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Huwag payagan"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Piliin ang data na gusto mong i-read o i-write ng app na ito sa Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Piliin ang data na gusto mong i-read o i-write ng app na ito sa Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Piliin ang data na gusto mong i-read ng app na ito sa Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Piliin ang data na gusto mong i-write ng app na ito sa Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Kung magbibigay ka ng access sa pag-read, mari-read ng app ang bagong data at data mula sa nakalipas na 30 araw"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Kung magbibigay ka ng access sa pag-read, mari-read ng app ang bago at nakaraang data"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na i-access ang Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Puwede mong alamin kung paano pinapangasiwaan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang iyong data sa <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> ng developer"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na i-access ang data ng fitness at wellness?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Puwede mong alamin kung paano pinapangasiwaan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang iyong data sa <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> nila"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"patakaran sa privacy"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Bigyan ang <xliff:g id="APP_NAME">%1$s</xliff:g> ng access sa iyong mga health record?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Kung magbibigay ka ng access, puwedeng mag-read at mag-write ng data ang app gaya ng mga allergy, resulta ng lab, vaccine, at higit pa\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Kung magbibigay ka ng access, puwedeng mag-read ng data ang app gaya ng mga allergy, resulta ng lab, vaccine, at higit pa\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Tungkol sa mga health record"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Kasama sa data na ibabahagi ang"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Kung papayagan mo, puwedeng ibahagi ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang iyong mga health record sa Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"I-sync ang iyong mga health record mula sa iba\'t ibang app at source para mapanatili ang mga ito sa iisang lugar"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Alisin ang lahat ng pahintulot?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Alisin lahat"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang anumang data mula sa Health Connect.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang anumang data mula sa Health Connect, kabilang ang dating data.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng lokasyon, camera, o mikropono."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang anumang data mula sa Health Connect, kabilang ang data sa background at dating data.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng lokasyon, camera, o mikropono."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"I-delete din ang data ng <xliff:g id="APP_NAME">%1$s</xliff:g> mula sa Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Alisin ang lahat ng pahintulot?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Alisin ang lahat ng pahintulot sa health record?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Alisin ang lahat ng pahintulot sa fitness at wellness?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"I-delete din sa Health Connect ang data ng fitness mula sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Alisin ang lahat ng pahintulot sa health record?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"I-delete din sa Health Connect ang mga health record mula sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data na ito mula sa Health Connect.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data na ito mula sa Health Connect, kabilang ang data sa background.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data na ito mula sa Health Connect, kabilang ang dating data.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data na ito mula sa Health Connect, kabilang ang data sa background at dating data.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Alisin ang lahat ng pahintulot?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data mula sa Health Connect.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data mula sa Health Connect, kabilang ang data sa background.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data mula sa Health Connect, kabilang ang dating data.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Hindi na mari-read o mara-write ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data mula sa Health Connect, kabilang ang data sa background at dating data.\n\nHindi nito maaapektuhan ang iba pang pahintulot na posibleng mayroon ang app na ito, gaya ng camera, mikropono, o lokasyon."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"I-delete din sa Health Connect ang data ng fitness at mga health record mula sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Inalis ang mga pahintulot para sa app na ito"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"I-delete din ang lahat ng data ng Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Kinabukasan"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Piniling araw"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Nakaraang araw"</string>
     <string name="default_error" msgid="7966868260616403475">"Nagkaproblema. Subukan ulit."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Hindi Alam na Resource"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Pinagmumulang data"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Pambukas na bracket."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Pansarang bracket."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Field <xliff:g id="FIELD">%2$s</xliff:g> Value"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Wala nang access ang mga app na ito, pero mayroon pa ring data ang mga ito na naka-store sa Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Makakapag-read ang <xliff:g id="APP_NAME">%1$s</xliff:g> ng data na idinagdag pagkalipas ng <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Para pamahalaan ang iba pang pahintulot sa Android na maa-access ng app na ito, pumunta sa Mga Setting &gt; Mga App"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Sinasaklaw ang data na ibinabahagi mo sa <xliff:g id="APP_NAME">%1$s</xliff:g> ng patakaran sa privacy ng mga ito"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Puwede mong alamin kung paano pinapangasiwaan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang iyong data sa patakaran sa privacy ng developer"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Para pamahalaan ang iba pang pahintulot sa Android na maa-access ng app na ito, pumunta sa Mga Setting, pagkatapos ay i-tap ang Mga App"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Basahin ang patakaran sa privacy"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Na-access sa nakalipas na 24 na oras"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Access ng app"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Wala kang anumang compatible na naka-install na app sa kasalukuyan"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Karagdagang access"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Dating data, data sa background"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Inalis ang mga karagdagang pahintulot para sa app na ito"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Mga Pahintulot"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness at wellness"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Ehersisyo, tulog, nutrisyon, at iba pa"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Mga health record"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"mga health record"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Lab results, gamot, immunizations, atbp"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Mga lab result, gamot, bakuna, at iba pa"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Inalis ang mga pahintulot sa app"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Inalis ng Health Connect ang mga pahintulot para sa <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Inalis ng Health Connect ang mga pahintulot para sa <xliff:g id="APP_DATA_0">%1$s</xliff:g> at <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Pumunta sa Play Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Magsimula sa Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Sino-store ng Health Connect ang iyong data ng kalusugan at fitness, na nagbibigay sa iyo ng simpleng paraan para i-sync ang iba\'t ibang app sa device mo"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Sino-store at sini-sync ng Health Connect ang iyong data ng kalusugan at fitness mula sa iba\'t ibang app.\n\n"<b>"Data ng fitness at wellness,"</b>" kabilang ang mga session ng pag-eehersisyo, pagtulog, at higit pa\n\n"<b>"Mga health record,"</b>" kabilang ang mga bakuna, lab result, at higit pa"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Gamit ang Health Connect, magagawa mong"</string>
     <string name="share_data" msgid="3481932156368883946">"Magbahagi ng data sa iyong mga app"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Piliin ang data na puwedeng i-read o i-write ng bawat app sa Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Pamahalaan ang iyong mga setting at privacy"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Mahina"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Katamtaman"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Malakas"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Hindi alam na flow"</string>
     <string name="period_day" msgid="3821944462093965882">"Araw <xliff:g id="DAY">%1$d</xliff:g> ng <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> ng buwanang-dalaw"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Period (1 araw)}one{Period (# araw)}other{Period (# na araw)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Positibo"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Negatibo"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Mataas"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musika"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Iba pa"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Walang gabay"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Katamtaman"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Puspusan"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g>m"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>h <xliff:g id="MIN">%2$s</xliff:g>m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g>h"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Isinasagawa ang pag-integrate"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Ini-integrate sa Android system ang Health Connect.\n\nPuwede itong abutin nang ilang sandali habang inililipat ang iyong data at mga pahintulot."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Huwag isara ang app hanggang sa makatanggap ka ng notification na tapos na ang proseso."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Isinasagawa ang pag-integrate ng Health Connect"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Kailangang i-update"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Ini-integrate ang Health Connect sa Android system para direkta mong ma-access ito mula sa iyong mga setting."</string>
     <string name="update_button" msgid="4544529019832009496">"I-update"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Simulan ang update na ito para makapagpatuloy ang Health Connect sa pag-integrate sa mga setting ng iyong system"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"I-update ngayon"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Kailangan ng pag-update ng system"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Bago magpatuloy, i-update ang system ng iyong telepono."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Kung na-update mo na ang system ng iyong telepono, subukang i-restart ang telepono mo para magpatuloy sa pag-integrate"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Kailangan ng pag-update ng Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Bago magpatuloy, i-update ang Health Connect app sa pinakabagong bersyon."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Kailangan ng higit pang space"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Kailangan ng Health Connect ng <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> na storage space sa iyong telepono para makapagpatuloy ang pag-integrate.\n\nMag-clear ng kaunting space sa telepono mo at pagkatapos ay subukan ulit."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Subukan ulit"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Magbakante ng space"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Kailangan ng higit pang space"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Kailangan ng Health Connect ng <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> na storage space sa iyong telepono para makapagpatuloy sa pag-integrate."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Na-pause ang pag-integrate"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Nagsara ang Health Connect app habang ini-integrate ito sa Android system.\n\nI-click ang ituloy para buksan ulit ang app at ipagpatuloy ang paglilipat ng iyong data at mga pahintulot."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Para mapanatili ang iyong data ng Health Connect, tapusin ito sa loob ng <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"I-tap para magpatuloy sa pag-integrate ng Health Connect sa Android system. Para mapanatili ang iyong data, tapusin ito sa loob ng <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"I-tap para magpatuloy sa pag-integrate ng Health Connect sa Android system."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Magpatuloy"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Ituloy ang pag-integrate ng Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Para mapanatili ang iyong data, tapusin ito sa loob ng <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Kailangan ang update ng app"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Kailangang i-update ang <xliff:g id="APP_NAME">%1$s</xliff:g> para magpatuloy sa pag-sync sa Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Kailangang i-update ang ilang app para magpatuloy sa pag-sync sa Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Kailangang i-update ang <xliff:g id="APP_NAME">%1$s</xliff:g> para magpatuloy sa pag-sync sa Health Connect. Posibleng hindi available sa lahat ng app ang mga update."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Kailangang i-update ang ilang app para magpatuloy sa pag-sync sa Health Connect. Posibleng hindi available sa lahat ng app ang mga update."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Tumingin ng mga update"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Matuto pa"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Pag-integrate ng Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Hindi natapos ang pag-integrate ng Health Connect"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Makakatanggap ka ng notification kapag naging available na ito ulit."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Hindi natapos ang pag-integrate ng Health Connect"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Magbasa pa"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Tapos na ang pag-integrate ng Health Connect"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Buksan"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Ano\'ng bago"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Puwede mo nang direktang i-access ang Health Connect mula sa iyong mga setting. I-uninstall ang Health Connect app anumang oras para magbakante ng storage space."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"I-edit ang mga source ng app"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Default ng device"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Data ng app"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Lalabas ang data mula sa mga app na may access sa Health Connect dito"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Lalabas dito ang data mula sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Lalabas dito ang data mula sa mga app na may access sa Health Connect"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Araw"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Linggo"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Buwan"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Nakaraang buwan"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Mga Entry"</string>
     <string name="tab_access" msgid="7818197975407243701">"Access"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Payagan ang karagdagang access para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Gusto ring i-access ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang mga settng ng Health Connect na ito"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Mag-enable ng kahit man lang isang read permission para ma-on ang access habang nasa background o access sa dating data para sa app na ito"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Mag-enable ng kahit man lang isang read permission para ma-on ang access habang nasa background para sa app na ito"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Mag-enable ng kahit man lang isang read permission para ma-on ang access sa dating data para sa app na ito"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Simulan ang paggamit ng Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"I-sync ang iyong mga unang app para magbahagi ng data ng kalusugan at fitness sa pagitan ng mga ito"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"I-set up"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Tingnan ang mga compatible na app"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Maghanap ng higit pang app na isi-sync sa <xliff:g id="APP_NAME">%s</xliff:g> sa pamamagitan ng Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Tingnan sa app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Magtakda ng lock ng screen"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Para sa karagdagang seguridad ng data ng kalusugan mo, magtakda ng PIN, pattern, o password para sa device na ito"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Magtakda ng lock ng screen"</string>
     <string name="select_all" msgid="837499881590001166">"Piliin lahat"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Hindi na mare-read ng mga nakakonektang app ang data na ito mula sa Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"May check"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Walang check"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Available ang ruta ng mapa ng pag-ehersisyo"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Kinabukasan"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Susunod na linggo"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Susunod na buwan"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Nakaraang araw"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Nakaraang linggo"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Nakaraang buwan"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Permanenteng i-delete ang lahat ng data?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Permanenteng i-delete ang napiling data?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Permanenteng i-delete ang lahat ng data ng <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Permanenteng i-delete ang mga napiling entry ng <xliff:g id="APP_NAME">%1$s</xliff:g> para sa linggo ng <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Permanenteng i-delete ang mga napiling entry ng <xliff:g id="APP_NAME">%1$s</xliff:g> para sa <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Permanenteng i-delete ang entry ng <xliff:g id="APP_NAME">%s</xliff:g> na ito?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Permanenteng i-delete ang data ng <xliff:g id="DATA_TYPE">%1$s</xliff:g> para sa <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Naka-on"</string>
+    <string name="off" msgid="6996623844428550649">"Naka-off"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Na-access noong <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Na-access kahapon nang <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Na-access noong <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Palaging payagan"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Payagan ang napili"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Habang ginagamit ang app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Tanggihan lahat"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na i-access ang data ng fitness at wellness?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Nagre-request ang <xliff:g id="APP_NAME">%1$s</xliff:g> ng access sa <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nPiliin kung payagan ang lahat o kontrolin ang mga ito nang paisa-isa."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na i-access ang <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness at wellness"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"sa lahat ng oras"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"habang ginagamit"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Sa lahat ng oras"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Habang ginagamit"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Maa-access ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang lahat ng iyong data ng fitness at wellness <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Pinapayagang i-access"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Pinapayagang i-read"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Binibigyan ng mga pahintulot na ito ang <xliff:g id="APP_NAME">%1$s</xliff:g> ng access sa data mula sa mga sensor ng device mo."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Pinapayagan ang <xliff:g id="NUMBER_0">%1$d</xliff:g> sa <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> (na) app"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Walang nagre-request na app"</string>
+    <string name="allowed" msgid="4158456017482263737">"Pinapayagan"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Hindi pinapahintulutan"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Maa-access ng mga app na may ganitong pahintulot ang data ng <xliff:g id="DATA_TYPE">%s</xliff:g> mula sa mga sensor ng device mo."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Alisin ang access sa <xliff:g id="DATA_TYPE">%s</xliff:g> para sa lahat ng app sa iyong relo?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Check mark"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Cross mark"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Sa ngayon, posibleng ma-access ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang data ng fitness at wellness <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Payagan ang <xliff:g id="APP_NAME">%1$s</xliff:g> na ma-access ang data ng fitness at wellness sa lahat ng oras?"</string>
+    <string name="current_access" msgid="1457167070428176139">"May access sa <xliff:g id="DATA_TYPES">%2$s</xliff:g> ang <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Pamahalaan ang mga pahintulot sa fitness at wellness"</string>
 </resources>
diff --git a/apk/res/values-tr/strings.xml b/apk/res/values-tr/strings.xml
index 7f870be..87c20da 100644
--- a/apk/res/values-tr/strings.xml
+++ b/apk/res/values-tr/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Cihazınızdaki sağlık ve fitness verilerini yönetin ve hangi uygulamaların bu verilere erişebileceğini kontrol edin"</string>
     <string name="data_title" msgid="4456619761533380816">"Veriler ve erişim"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Sağlık kayıtlarına göz at"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Sağlık kayıtlarınızı ve bu kayıtlara erişebilen uygulamaları görüntüleyin"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Tüm kategoriler"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Tüm kategorileri göster"</string>
     <string name="no_data" msgid="1906986019249068659">"Veri yok"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Dün"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Okuma: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Yazma: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"İzinleri yönetin"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Zaman: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Etkinlik"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"sağlık verinize erişme"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Yakılan kaloriyi okuma"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Uygulamanın yakılan kaloriyi okumasına izin verir"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Verilere arka planda erişim"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının verilere arka planda erişmesine izin verilsin mi?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının verilere arka planda erişmesine izin verilsin mi?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"İzin verdiğiniz takdirde bu uygulama, uygulamayı kullanmadığınız zamanlarda fitness ve sağlıklı yaşam verilerinin yanı sıra sağlık kayıtlarına erişebilir."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"İzin verdiğiniz takdirde bu uygulama, uygulamayı kullanmadığınız zamanlarda sağlık kayıtlarına erişebilir."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"İzin verdiğiniz takdirde bu uygulama, uygulamayı kullanmadığınız zamanlarda fitness ve sağlıklı yaşam verilerine erişebilir."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"İzin verdiğiniz takdirde bu uygulama, uygulamayı kullanmadığınız zamanlarda Health Connect verilerine erişebilir."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının geçmiş verilere erişmesine izin verilsin mi?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"İzin verdiğiniz takdirde bu uygulama, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarihinden önce eklenen fitness ve sağlıklı yaşam verilerine erişebilir."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"İzin verdiğiniz takdirde bu uygulama, geçmiş tüm fitness ve sağlıklı yaşam verilerine erişebilir."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"İzin verdiğiniz takdirde bu uygulama, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarihinden önce eklenen Health Connect verilerine erişebilir."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"İzin verdiğiniz takdirde bu uygulama, geçmiş tüm Health Connect verilerine erişebilir."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasına ek erişim verilsin mi?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g>, şu Health Connect ayarlarına da erişmek istiyor"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Tüm verilere arka planda erişme"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Arka planda sağlık kayıtlarına erişme"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Arka planda fitness ve sağlıklı yaşam verilerine erişme"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Uygulamayı kullanmadığınız zamanlarda bu uygulamanın fitness, sağlıklı yaşam ve sağlık kayıtları verilerine erişmesine izin verir"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Bu uygulamanın, uygulamayı kullanmadığınız zamanlarda bu verilere erişmesine izin verir"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Bu uygulamanın, uygulamayı kullanmadığınız zamanlarda bu verilere erişmesine izin verir"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Verilere arka planda erişim"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Bu uygulamanın, uygulamayı kullanmadığınız zamanlarda Health Connect verilerine erişmesine izin verir"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Geçmiş fitness ve sağlıklı yaşam verilerine erişme"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Bu uygulamanın, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarihinden önce eklenen verilere erişmesine izin verir"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Bu uygulamanın geçmiş tüm verilere erişmesine izin verir"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Geçmiş verilere erişim"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Bu uygulamanın, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarihinden önce eklenen Health Connect verilerine erişmesine izin verir"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Bu uygulamanın geçmiş tüm Health Connect verilerine erişmesine izin verir"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sağlık kayıtlarınızla ilgili geçmiş verilere halihazırda erişebilir"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"İzinler hakkında daha fazla bilgi"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Tüm verilere arka planda erişme"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Arka planda sağlık kayıtlarına erişme"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Arka planda fitness ve sağlıklı yaşam verilerine erişme"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Uygulamayı kullanmadığınız zamanlarda bu uygulamanın fitness, sağlıklı yaşam ve sağlık kayıtları verilerine erişmesine izin verir"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Bu uygulamanın, uygulamayı kullanmadığınız zamanlarda bu verilere erişmesine izin verir"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Bu uygulamanın, uygulamayı kullanmadığınız zamanlarda bu verilere erişmesine izin verir"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Verilere arka planda erişim"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Bu uygulamanın, uygulamayı kullanmadığınız zamanlarda Health Connect verilerine erişmesine izin verir"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Geçmiş fitness ve sağlıklı yaşam verilerine erişme"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Bu uygulamanın, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarihinden önce eklenen verilere erişmesine izin verir"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Bu uygulamanın geçmiş tüm verilere erişmesine izin verir"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Geçmiş verilere erişim"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Bu uygulamanın, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarihinden önce eklenen Health Connect verilerine erişmesine izin verir"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Bu uygulamanın, geçmiş tüm Health Connect verilerine erişmesine izin verir"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının okuma izni olmadığı için şu anda hiçbir fitness verisi okunmuyor"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sağlık kayıtlarınız için geçmiş verilere halihazırda erişebilir. Bunu değiştirmek için bu uygulamanın sağlık kaydı izinlerini iptal edin."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Sağlık kaydı izinlerini yönetin"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Bu uygulamanın arka planda veya geçmiş verilere erişimini açmak için en az bir okuma iznini etkinleştirin"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Bu uygulamanın arka planda erişimini açmak için en az bir okuma iznini etkinleştirin"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Bu uygulamanın geçmiş verilere erişimini açmak için en az bir okuma iznini etkinleştirin"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Bu uygulamanın geçmiş tüm Health Connect verilerine erişmesine izin verir"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Bu uygulamanın, uygulamayı kullanmadığınız zamanlarda Health Connect verilerine erişmesine izin verir"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"İzin verdiğiniz takdirde bu uygulama, uygulamayı kullanmadığınız zamanlarda Health Connect verilerine erişebilir."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Geçmiş verilere erişim"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının geçmiş verilere erişmesine izin verilsin mi?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Bu uygulamanın, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarihinden önce eklenen Health Connect verilerine erişmesine izin verir"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Bu uygulamanın geçmiş tüm Health Connect verilerine erişmesine izin verir"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"İzin verdiğiniz takdirde bu uygulama, <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> tarihinden önce eklenen Health Connect verilerine erişebilir."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"İzin verdiğiniz takdirde bu uygulama, geçmiş tüm Health Connect verilerine erişebilir."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Yakılan aktif kalori"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"yakılan aktif kalori"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Yakılan aktif kaloriyi oku"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"tekerlekli sandalye şınavları"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Tekerlekli sandalye şınavlarını oku"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Tekerlekli sandalye şınavlarını yaz"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Aktivite yoğunluğu"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"aktivite yoğunluğu"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Aktivite yoğunluğunu okur"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Aktivite yoğunluğunu yazar"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Bazal metabolizma hızı"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"bazal metabolizma hızı"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Bazal metabolizma hızını oku"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"deri sıcaklığı"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Deri sıcaklığını oku"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Deri sıcaklığını yaz"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Bu işlem, Health Connect ile senkronize edilen ve Health Connect\'e eklenen tüm sağlık kayıtlarını kapsar. Bu, tıbbi kayıtlarınızın tamamı olmayabilir ve sağlık kayıtlarınızla ilgili tıbbi bir açıklama içermez."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Tüm sağlık kayıtları"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"tüm sağlık kayıtları"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Tüm sağlık kayıtlarını yaz"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Alerjiler"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"alerjiler"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Alerjileri oku"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Aşı"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"aşı"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Aşı verilerini okuma"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratuvar Sonuçları"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratuvar sonuçları"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Laboratuvar sonuçlarını oku"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Alerjiler"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"alerjiler"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Alerjileri oku"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Koşullar"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"koşullar"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Koşulları okuyun"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Aşılar"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"aşılar"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Aşıları oku"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Tahlil sonuçları"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"tahlil sonuçları"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Tahlil sonuçlarını oku"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"İlaçlar"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ilaçlar"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"İlaçları oku"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Kişisel bilgiler"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"kişisel bilgiler"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Kişisel bilgileri oku"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Uzman bilgileri"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"uzman bilgileri"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Uzman bilgilerini oku"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Hamilelik"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"hamilelik"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Hamilelik verilerini oku"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Sorunlar"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"sorunlar"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Sorunları oku"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Müdahaleler"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"müdahaleler"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Müdahale verilerini oku"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Sosyal Tarih"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Sosyal tarih"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"sosyal tarih"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Sosyal medya geçmişini oku"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Hayati Bulgular"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Ziyaretler"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ziyaretler"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Ziyaretleri oku"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Hayati bulgular"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"hayati bulgular"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Hayati bulgu verilerini oku"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Farkındalık"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Farkındalık oturumuna ait veriler yazılır"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” uygulamasına okuma izni ver"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" uygulamasına yazma izni ver"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"İptal"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"İzin ver"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Tümüne izin ver"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"İzin verme"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Bu uygulamanın okumasını veya Health Connect\'e yazmasını istediğiniz verileri seçin"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Bu uygulamanın okumasını veya Health Connect\'e yazmasını istediğiniz verileri seçin"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Bu uygulamanın Health Connect\'ten okumasını istediğiniz verileri seçin"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Bu uygulamanın Health Connect\'e yazmasını istediğiniz verileri seçin"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Veri okuma izni verirseniz uygulama yeni verileri ve son 30 gün içindeki verileri okuyabilir"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Veri okuma izni verirseniz uygulama yeni ve geçmiş verileri okuyabilir"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının Health Connect\'e erişmesine izin verilsin mi?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının verilerinizi nasıl işlediğini geliştiricinin <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> bölümünden öğrenebilirsiniz"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının fitness ve sağlıklı yaşam verilerine erişmesine izin verilsin mi?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının verilerinizi nasıl işlediğini <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> bağlantısından öğrenebilirsiniz"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"gizlilik politikası"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının sağlık kayıtlarınıza erişmesine izin verilsin mi?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Erişim izni verirseniz uygulama; alerjiler, tahlil sonuçları, aşılar gibi verileri ve daha fazlasını okuyup yazabilir\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Erişim izni verirseniz uygulama; alerjiler, tahlil sonuçları, aşılar gibi verileri ve daha fazlasını okuyabilir\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Sağlık kayıtları hakkında"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Paylaşılacak veriler şunları içerir:"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"İzin verirseniz <xliff:g id="APP_NAME">%1$s</xliff:g>, sağlık kayıtlarınızı Health Connect ile paylaşabilir."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Farklı uygulamalarınızdan ve kaynaklarınızdan sağlık kayıtlarınızı senkronize ederek hepsini tek bir yerde tutun"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Tüm izinler kaldırılsın mı?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Tümünü kaldır"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık Health Connect\'teki verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinler etkilenmez."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık geçmiş veriler de dahil olmak üzere Health Connect\'teki verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği konum, kamera veya mikrofon gibi diğer izinleri etkilemez."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık arka plan verileri ve geçmiş veriler de dahil olmak üzere Health Connect\'teki verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği konum, kamera veya mikrofon gibi diğer izinleri etkilemez."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"<xliff:g id="APP_NAME">%1$s</xliff:g> verilerini de Health Connect\'ten sil"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Tüm izinler kaldırılsın mı?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Tüm sağlık kaydı izinleri kaldırılsın mı?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Tüm fitness ve sağlıklı yaşam izinleri kaldırılsın mı?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasındaki fitness verilerini de Health Connect\'ten sil"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Tüm sağlık kaydı izinleri kaldırılsın mı?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasındaki sağlık kayıtlarını da Health Connect\'ten sil"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık Health Connect\'teki bu verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinler etkilenmez."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık arka plan verileri de dahil olmak üzere Health Connect\'teki bu verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinleri etkilemez."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık geçmiş veriler de dahil olmak üzere Health Connect\'teki bu verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinleri etkilemez."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık arka plan verileri ve geçmiş veriler de dahil olmak üzere Health Connect\'teki verileri okuyamayacak veya yazamayacak.\n\nBu durum, bu uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinleri etkilemez."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Tüm izinler kaldırılsın mı?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık Health Connect\'teki verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinler etkilenmez."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık arka plan verileri de dahil olmak üzere Health Connect\'teki verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinleri etkilemez."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık geçmiş veriler de dahil olmak üzere Health Connect\'teki verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinleri etkilemez."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> artık arka plan verileri ve geçmiş veriler de dahil olmak üzere Health Connect\'teki verileri okuyamayacak veya yazamayacak.\n\nBu durum, uygulamanın sahip olabileceği kamera, mikrofon veya konum gibi diğer izinleri etkilemez."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasındaki fitness verilerini ve sağlık kayıtlarını da Health Connect\'ten sil"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Bu uygulamanın izinleri kaldırıldı"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Ayrıca Health Connect verilerinin tamamını sil"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Sonraki gün"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Seçili gün"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Önceki gün"</string>
     <string name="default_error" msgid="7966868260616403475">"Bir hata oluştu. Lütfen tekrar deneyin."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Bilinmeyen Kaynak"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Kaynak veriler"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Sol köşeli parantez."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Köşeli parantez."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Alan <xliff:g id="FIELD">%2$s</xliff:g> Değeri"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Artık erişimi olmayan ancak verileri Health Connect\'te saklanmaya devam eden uygulamalar"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> tarihinden sonra eklenen verileri okuyabilir"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Bu uygulamanın erişebileceği diğer Android izinlerini yönetmek için Ayarlar &gt; Uygulamalar bölümüne gidin"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"<xliff:g id="APP_NAME">%1$s</xliff:g> ile paylaştığınız veriler bu uygulamanın gizlilik politikası kapsamındadır"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının verilerinizi nasıl işlediğini geliştiricinin gizlilik politikasından öğrenebilirsiniz"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Bu uygulamanın erişebileceği diğer Android izinlerini yönetmek için Ayarlar bölümüne gidip Uygulamalar seçeneğine dokunun"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Gizlilik politikasına göz atın"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Son 24 saat içinde erişildi"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Uygulama erişimi"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Şu anda yüklü olan uyumlu uygulamanız yok"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Ek erişim"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Geçmiş veriler, arka plan verileri"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Bu uygulamanın ek izinleri kaldırıldı"</string>
     <string name="permissions_header" msgid="6519976063360071569">"İzinler"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitness ve sağlıklı yaşam"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Egzersiz, uyku, beslenme ve diğerleri"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Sağlık kayıtları"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"sağlık kayıtları"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Tahlil sonuçları, ilaçlar, aşılar ve diğerleri"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Tahlil sonucu, ilaç, aşı ve diğerleri"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Uygulama izinleri kaldırıldı"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect, <xliff:g id="APP_DATA">%s</xliff:g> için izinleri kaldırdı"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect, <xliff:g id="APP_DATA_0">%1$s</xliff:g> ve <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> için izinleri kaldırdı"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Play Store\'a git"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect\'i kullanmaya başlama"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect, sağlık ve fitness verilerinizi depolayarak cihazınızdaki farklı uygulamaları senkronize etmek için basit bir yol sunar"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect, farklı uygulamalardan sağlık ve fitness verilerinizi saklayıp senkronize eder.\n\nEgzersiz oturumu, adım sayıları, beslenme, uyku ve diğer veriler de dahil olmak üzere "<b>"fitness ve sağlıklı yaşam verileri"</b>";\n\nAşılar, tahlil sonuçları ve diğer veriler de dahil olmak üzere "<b>"sağlık kayıtları"</b></string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect ile şunları yapabilirsiniz:"</string>
     <string name="share_data" msgid="3481932156368883946">"Uygulamalarınızla veri paylaşın"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Her uygulamanın okuyabileceği veya Health Connect\'e yazabileceği verileri seçin"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Ayarlarınızı ve gizliliğinizi yönetin"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Hafif kanama"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Orta düzeyde kanama"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Yoğun kanama"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Bilinmeyen akış"</string>
     <string name="period_day" msgid="3821944462093965882">"Âdet günü: <xliff:g id="DAY">%1$d</xliff:g>/<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Âdetin (1 gün sürdü)}other{Âdet (# gün sürdü)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Olumlu"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Olumsuz"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Yüksek"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Müzik"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Diğer"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Rehberli değil"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Orta seviye"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Yoğun"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> dk."</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> sa. <xliff:g id="MIN">%2$s</xliff:g> dk."</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> sa."</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Entegrasyon devam ediyor"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect, Android sistemiyle entegre ediliyor.\n\nVerilerinizin ve izinlerinizin aktarılması biraz zaman alabilir."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"İşlemin tamamlandığına dair bildirim alana kadar uygulamayı kapatmayın."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect entegrasyonu devam ediyor"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Güncelleme gerekiyor"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect, Android sistemiyle entegre edildiği için bu uygulamaya doğrudan ayarlarınızdan erişebilirsiniz."</string>
     <string name="update_button" msgid="4544529019832009496">"Güncelle"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Health Connect\'in sistem ayarlarınızla entegre edilmeye devam etmesi için bu güncellemeyi başlatın"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Hemen güncelle"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Sistem güncellemesi gerekli"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Devam etmeden önce telefon sisteminizi güncelleyin."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Telefon sisteminizi daha önce güncellediyseniz entegrasyona devam etmek için telefonunuzu yeniden başlatmayı deneyin"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect\'in güncellenmesi gerekiyor"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Devam etmeden önce Health Connect uygulamasını en son sürüme güncelleyin."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Daha fazla alana ihtiyaç var"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Entegrasyonun devam etmesi için Health Connect\'in telefonunuzda <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> depolama alanına ihtiyacı var.\n\nTelefonunuzda yer açıp tekrar deneyin."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Tekrar dene"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Yer aç"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Daha fazla alana ihtiyaç var"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect\'in entegrasyona devam etmesi için telefonunuzda <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> depolama alanı olması gerekiyor."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Entegrasyon duraklatıldı"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect uygulaması, Android sistemiyle entegre edilirken kapandı.\n\nUygulamayı yeniden açıp verilerinizi ve izinlerinizi aktarmaya devam etmek için \"Devam ettir\"i tıklayın."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect verilerinizi kaybetmemek için bu işlemi <xliff:g id="TIME_NEEDED">%1$s</xliff:g> içinde tamamlayın"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect\'i Android sistemiyle entegre etmeye devam etmek için dokunun. Verilerinizi kaybetmemek için bu işlemi <xliff:g id="TIME_NEEDED">%1$s</xliff:g> içinde tamamlayın"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect\'i Android sistemiyle entegre etmeye devam etmek için dokunun."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Devam"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect entegrasyonunu devam ettirin"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Verilerinizi kaybetmemek için bu işlemi <xliff:g id="TIME_NEEDED">%1$s</xliff:g> içinde tamamlayın"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Uygulamanın güncellenmesi gerekiyor"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının, Health Connect ile senkronizasyona devam edebilmesi için güncellenmesi gerekiyor"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Bazı uygulamaların, Health Connect ile senkronizasyona devam edebilmesi için güncellenmesi gerekiyor"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının, Health Connect ile senkronizasyona devam edebilmesi için güncellenmesi gerekiyor. Güncellemeler tüm uygulamalarda kullanılamayabilir."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Bazı uygulamaların, Health Connect ile senkronizasyona devam edebilmesi için güncellenmesi gerekiyor. Güncellemeler tüm uygulamalarda kullanılamayabilir."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Güncellemeleri denetle"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Daha fazla bilgi"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect entegrasyonu"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect entegrasyonu tamamlanmadı"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Tekrar kullanılabilir olduğunda bildirim alacaksınız."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Anladım"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect entegrasyonu tamamlanmadı"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Devamı"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect entegrasyonu tamamlandı"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Aç"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Yenilikler"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Artık Health Connect\'e doğrudan ayarlarınızdan erişebilirsiniz. Depolama alanında yer açmak için Health Connect uygulamasını dilediğiniz zaman kaldırabilirsiniz."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Anladım"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Uygulama kaynaklarını düzenleyin"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Cihaz varsayılanı"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Uygulama verileri"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect\'e erişimi olan uygulamaların verileri burada görünecek"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> verileri burada gösterilir"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect\'e erişimi olan uygulamaların verileri burada gösterilir"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Gün"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Hafta"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Ay"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Geçen ay"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Girişler"</string>
     <string name="tab_access" msgid="7818197975407243701">"Erişim"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasına ek erişim verilsin mi?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g>, şu Health Connect ayarlarına da erişmek istiyor"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Bu uygulamanın arka planda veya geçmiş verilere erişimini açmak için en az bir okuma iznini etkinleştirin"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Bu uygulamanın arka planda erişimini açmak için en az bir okuma iznini etkinleştirin"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Bu uygulamanın geçmiş verilere erişimini açmak için en az bir okuma iznini etkinleştirin"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect\'i kullanmaya başlayın"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Sağlık ve fitness verilerini birbiriyle paylaşacak ilk uygulamalarınızı senkronize edin"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Ayarla"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Uyumlu uygulamaları görüntüleyin"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect aracılığıyla <xliff:g id="APP_NAME">%s</xliff:g> ile senkronize edilebilecek diğer uygulamaları bulun"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Uygulama mağazasında göster"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ekran kilidi ayarlayın"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Sağlık verilerinizin güvenliğini artırmak için bu cihazda PIN, desen veya şifre belirleyin"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Ekran kilidi ayarla"</string>
     <string name="select_all" msgid="837499881590001166">"Tümünü seç"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Bağlı uygulamalar Health Connect\'teki bu verileri artık okuyamayacak"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"İşaretli"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"İşaretlenmedi"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Egzersiz rota haritası mevcut"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Sonraki gün"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Sonraki hafta"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Sonraki ay"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Önceki gün"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Önceki hafta"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Önceki ay"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Tüm verilerini kalıcı olarak silin"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Seçili veriler kalıcı olarak silinsin mi?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Tüm <xliff:g id="APP_NAME">%s</xliff:g> verileri kalıcı olarak silinsin mi?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> haftasına ait seçili <xliff:g id="APP_NAME">%1$s</xliff:g> girişleri kalıcı olarak silinsin mi?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> ayına ait seçili <xliff:g id="APP_NAME">%1$s</xliff:g> girişleri kalıcı olarak silinsin mi?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"<xliff:g id="APP_NAME">%s</xliff:g> girişi kalıcı olarak silinsin mi?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> için <xliff:g id="DATA_TYPE">%1$s</xliff:g> verileri kalıcı olarak silinsin mi?"</string>
+    <string name="on" msgid="8266542510798355807">"Açık"</string>
+    <string name="off" msgid="6996623844428550649">"Kapalı"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Erişim zamanı: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Dün saat <xliff:g id="TIME_DATE">%1$s</xliff:g> itibarıyla erişildi"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Erişim tarihi: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Her zaman izin ver"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Seçilenlere izin ver"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Uygulamayı kullanırken"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Tümünü reddet"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının fitness ve sağlıklı yaşam verilerine erişmesine izin verilsin mi?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DATA_TYPES">%2$s</xliff:g> verilerine erişmek istiyor.\n\nTümüne izin vermeyi veya ayrı ayrı kontrol etmeyi seçebilirsiniz."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının <xliff:g id="DATA_TYPE">%2$s</xliff:g> cihazına erişmesine izin verilsin mi?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitness ve sağlıklı yaşam"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"her zaman"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"kullanılırken"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Her zaman"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Kullanılırken"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g>, fitness ve sağlıklı yaşam verilerinizin tümüne erişebilir <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Erişim izni verildi"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Okumasına izin verilir"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Bu izinler <xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasına cihaz sensörlerinizden gelen verilere erişim izni verir."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> uygulamaya izin veriliyor"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"İstekte bulunan uygulama yok"</string>
+    <string name="allowed" msgid="4158456017482263737">"İzin Verilir"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"İzin verilmiyor"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Bu izne sahip uygulamalar cihaz sensörlerinizden gelen <xliff:g id="DATA_TYPE">%s</xliff:g> verilerine erişebilir."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Kol saatinizdeki tüm uygulamalar için <xliff:g id="DATA_TYPE">%s</xliff:g> erişimi kaldırılsın mı?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Onay işareti"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Çarpı işareti düğmesi"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması şu anda fitness ve sağlıklı yaşam verilerine <xliff:g id="ALLOW_MODE">%2$s</xliff:g> erişebilir"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının fitness ve sağlıklı yaşam verilerine her zaman erişmesine izin verilsin mi?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g> verilerine erişebilir."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Fitness ve sağlıklı yaşam izinlerini yönet"</string>
 </resources>
diff --git a/apk/res/values-uk/strings.xml b/apk/res/values-uk/strings.xml
index 64b5872..f31454f 100644
--- a/apk/res/values-uk/strings.xml
+++ b/apk/res/values-uk/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Керуйте даними про здоров’я і фізичну активність на пристрої, а також визначайте додатки, які матимуть доступ до цих даних"</string>
     <string name="data_title" msgid="4456619761533380816">"Дані й доступ"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Переглянути медичні дані"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Переглядайте свої медичні дані й додатки, які мають до них доступ"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Усі категорії"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Переглянути всі категорії"</string>
     <string name="no_data" msgid="1906986019249068659">"Немає даних"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Учора"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Переглянуто такі дані: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Записано такі дані: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Керувати дозволами"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Час: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Активність"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"доступ до даних про здоров’я"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Зчитувати спалені калорії"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Дозволяє додатку зчитувати дані про спалені калорії"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Доступ до даних у фоновому режимі"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до даних у фоновому режимі?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до даних у фоновому режимі?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Якщо надати цей дозвіл, додаток матиме доступ до даних про фізичну активність і здоров’я, а також до медичних даних, коли ви не користуєтеся ним."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Якщо надати цей дозвіл, додаток матиме доступ до медичних даних, коли ви не користуєтеся ним."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Якщо надати цей дозвіл, додаток матиме доступ до даних про фізичну активність і здоров’я, коли ви не користуєтеся ним."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Якщо надати дозвіл, цей додаток матиме доступ до даних Health Connect, коли ви не користуєтеся ним."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до минулих даних?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Якщо надати цей дозвіл, додаток матиме доступ до даних про фізичну активність і здоров’я, збережених до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Якщо надати цей дозвіл, додаток матиме доступ до всіх минулих даних про фізичну активність і здоров’я."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Якщо надати цей дозвіл, додаток матиме доступ до даних Health Connect, збережених до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Якщо надати цей дозвіл, додаток матиме доступ до всіх минулих даних Health Connect"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> розширений доступ?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> також запитує доступ до налаштувань Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Доступ до всіх даних у фоновому режимі"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Доступ до медичних даних у фоновому режимі"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Доступ до даних про фізичну активність і здоров’я у фоновому режимі"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Дозволити цьому додатку доступ до даних про фізичну активність і здоров’я, а також до медичних даних, коли ви не користуєтеся ним"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Дозволити цьому додатку доступ до цих даних, коли ви не користуєтеся ним"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Дозволити цьому додатку доступ до цих даних, коли ви не користуєтеся ним"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Доступ до даних у фоновому режимі"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Дозволити цьому додатку доступ до даних Health Connect, коли ви не користуєтеся ним"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Доступ до минулих даних про фізичну активність і здоров’я"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Дозволити цьому додатку доступ до даних, збережених до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Дозволити цьому додатку доступ до всіх минулих даних"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Доступ до минулих даних"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Дозволити цьому додатку доступ до даних Health Connect, збережених до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Дозволити цьому додатку доступ до всіх минулих даних Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> уже має доступ до ваших минулих медичних даних"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Докладніше про дозволи"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Доступ до всіх даних у фоновому режимі"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Доступ до медичних даних у фоновому режимі"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Доступ до даних про фізичну активність і здоров’я у фоновому режимі"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Дозволити цьому додатку доступ до даних про фізичну активність і здоров’я, а також до медичних даних, коли ви не користуєтеся ним"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Дозволити цьому додатку доступ до цих даних, коли ви не користуєтеся ним"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Дозволити цьому додатку доступ до цих даних, коли ви не користуєтеся ним"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Доступ до даних у фоновому режимі"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Дозволити цьому додатку доступ до даних Health Connect, коли ви не користуєтеся ним"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Доступ до минулих даних про фізичну активність і здоров’я"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Дозволити цьому додатку доступ до даних, збережених до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Дозволити цьому додатку доступ до всіх минулих даних"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Доступ до минулих даних"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Дозволити цьому додатку доступ до даних Health Connect, збережених до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Дозволити цьому додатку доступ до всіх минулих даних Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Зараз дані про фізичну активність не переглядаються, оскільки для додатка <xliff:g id="APP_NAME">%1$s</xliff:g> не ввімкнено дозвіл на перегляд"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> уже має доступ до ваших минулих медичних даних. Щоб це змінити, вимкніть для цього додатка дозволи для медичних даних."</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Керувати дозволами для медичних даних"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Надайте принаймні один дозвіл на перегляд, щоб увімкнути для цього додатка доступ у фоновому режимі або до минулих даних"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Надайте принаймні один дозвіл на перегляд, щоб увімкнути для цього додатка доступ у фоновому режимі"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Надайте принаймні один дозвіл на перегляд, щоб увімкнути для цього додатка доступ до минулих даних"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Дозволити цьому додатку доступ до всіх минулих даних Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Дозволити цьому додатку доступ до даних Health Connect, коли ви не користуєтеся ним"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Якщо надати дозвіл, цей додаток матиме доступ до даних Health Connect, коли ви не користуєтеся ним."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Доступ до минулих даних"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до минулих даних?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Дозвольте цьому додатку доступ до даних Health Connect, збережених до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Дозвольте цьому додатку доступ до всіх минулих даних Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Якщо надати цей дозвіл, додаток матиме доступ до даних Health Connect, збережених до <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Якщо надати цей дозвіл, додаток матиме доступ до всіх минулих даних Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Спалені калорії під час активності"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"кількість спалених активних калорій"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Зчитувати кількість спалених активних калорій"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"поштовхи інвалідного візка"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Зчитувати кількість поштовхів інвалідного візка"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Записувати кількість поштовхів інвалідного візка"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Інтенсивність дій"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"інтенсивність дій"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Переглядати дані про інтенсивність дій"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Записувати дані про інтенсивність дій"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Швидкість основного обміну речовин"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"швидкість основного обміну речовин"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Зчитувати швидкість основного обміну речовин"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"температура шкіри"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Переглядати температуру шкіри"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Записувати температуру шкіри"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Це стосується всієї інформації про здоров’я, синхронізованої з Health Connect і доданої в цей сервіс. Це не обов’язково має бути ваша повна медична карта й медичний опис інформації про здоров’я."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Усі медичні дані"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"усі медичні дані"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Записувати всі медичні дані"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Алергії"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"алергії"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Переглядати дані про алергії"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Дані про імунізацію"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"дані про імунізацію"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Переглядати дані про імунізацію"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Результати аналізів"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"результати аналізів"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Переглядати дані про результати аналізів"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Алергії"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"алергії"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Переглядати дані про алергії"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Стан здоров’я"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"стан здоров’я"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Переглядати дані про стан здоров’я"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Вакцини"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"вакцини"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Переглядати дані про вакцини"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Результати аналізів"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"результати аналізів"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Переглядати результати аналізів"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Ліки"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ліки"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Переглядати дані про ліки"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Особисті дані"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"особисті дані"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Переглядати особисті дані"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Відомості про медичних працівників"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"відомості про медичних працівників"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Переглядати відомості про медичних працівників"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Вагітність"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"вагітність"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Переглядати дані про вагітність"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Проблеми"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"проблеми"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Переглядати дані про проблеми"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Медичні процедури"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"медичні процедури"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Переглядати дані про медичні процедури"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Соціальна історія"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Соціальна історія"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"соціальна історія"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Переглядати дані про соціальну історію"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Життєві показники"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Прийоми в лікаря"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"прийоми в лікаря"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Переглядати дані про прийоми в лікаря"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Життєві показники"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"життєві показники"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Переглядати дані про життєві показники"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Усвідомленість"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Записувати дані сеансів практики усвідомленості"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> зчитувати дані"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> записувати дані"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Скасувати"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Дозволити"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Дозволити все"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Не дозволяти"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Виберіть дані, які цей додаток зможе читати або записувати в Health Connect."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Виберіть дані, які цей додаток зможе читати або записувати в Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Виберіть дані, які цей додаток зможе читати в Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Виберіть дані, які цей додаток зможе записувати в Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Якщо ви дозволите доступ для перегляду, додаток зможе переглядати нові дані, а також дані за останні 30 днів"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Якщо ви дозволите доступ для перегляду, додаток зможе переглядати нові й минулі дані"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Надати додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Інформацію про те, як додаток <xliff:g id="APP_NAME">%1$s</xliff:g> обробляє ваші дані, можна знайти в <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> розробника"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до даних про фізичну активність і здоров’я?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Щоб дізнатися, як додаток <xliff:g id="APP_NAME">%1$s</xliff:g> обробляє ваші дані, перегляньте його <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"політиці конфіденційності"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до ваших медичних даних?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Якщо ви надасте доступ, додаток зможе переглядати й записувати такі дані, як відомості про алергії, результати аналізів, щеплення тощо\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Якщо ви надасте доступ, додаток зможе переглядати такі дані, як відомості про алергії, результати аналізів, щеплення тощо\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Про медичні дані"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Приклади даних, що передаватимуться"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Якщо ви надасте дозвіл, додаток <xliff:g id="APP_NAME">%1$s</xliff:g> зможе надсилати медичні дані в Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Синхронізуйте медичні дані з різних додатків і джерел, щоб централізовано зберігати їх"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Вилучити всі дозволи?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Вилучити всі"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати будь-які дані з Health Connect.\n\nЦе не вплине на інші дозволи, надані цьому додатку (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати будь-які дані з Health Connect, зокрема минулі дані.\n\nЦе не вплине на інші дозволи, надані цьому додатку, наприклад на доступ до геоданих, камери чи мікрофона."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати будь-які дані з Health Connect, зокрема минулі дані чи дані у фоновому режимі.\n\nЦе не вплине на інші дозволи, надані цьому додатку, наприклад на доступ до геоданих, камери чи мікрофона."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Також видалити дані додатка <xliff:g id="APP_NAME">%1$s</xliff:g> з Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Вилучити всі дозволи?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Вилучити всі дозволи для медичних даних?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Вилучити всі дозволи для даних про активність і здоров’я?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Також видалити дані про фізичну активність із додатка <xliff:g id="APP_NAME">%1$s</xliff:g> із Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Вилучити всі дозволи для медичних даних?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Також видалити медичні дані з додатка <xliff:g id="APP_NAME">%1$s</xliff:g> із Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати ці дані з Health Connect.\n\nЦе не вплине на інші дозволи цього додатка (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати ці дані з Health Connect, зокрема у фоновому режимі.\n\nЦе не вплине на інші дозволи цього додатка (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати ці дані з Health Connect, зокрема минулі дані.\n\nЦе не вплине на інші дозволи цього додатка (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати ці дані з Health Connect, зокрема минулі дані чи дані у фоновому режимі.\n\nЦе не вплине на інші дозволи цього додатка (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Вилучити всі дозволи?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати дані з Health Connect.\n\nЦе не вплине на інші дозволи цього додатка (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати дані з Health Connect, зокрема у фоновому режимі.\n\nЦе не вплине на інші дозволи цього додатка (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати дані з Health Connect, зокрема минулі дані.\n\nЦе не вплине на інші дозволи цього додатка (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> більше не зможе переглядати або записувати дані з Health Connect, зокрема минулі дані чи дані у фоновому режимі.\n\nЦе не вплине на інші дозволи цього додатка (наприклад, на доступ до камери, мікрофона чи геоданих)."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Також видалити дані про фізичну активність і медичні дані з додатка <xliff:g id="APP_NAME">%1$s</xliff:g> із Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Дозволи для цього додатка вилучено"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Також видалити всі дані Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Наступний день"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Вибраний день"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Попередній день"</string>
     <string name="default_error" msgid="7966868260616403475">"Сталася помилка. Повторіть спробу."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Невідомий ресурс"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Вихідні дані"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Ліва фігурна дужка."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Права фігурна дужка."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g>Поле <xliff:g id="FIELD">%2$s</xliff:g> Значення"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Ці додатки більше не мають доступу, однак їх дані досі зберігаються в Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> може переглядати дані, додані після <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Щоб керувати іншими дозволами Android для цього додатка, виберіть \"Налаштування\" &gt; \"Додатки\""</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"На дані, які ви надсилаєте в додаток <xliff:g id="APP_NAME">%1$s</xliff:g>, поширюється його політика конфіденційності"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Інформацію про те, як додаток <xliff:g id="APP_NAME">%1$s</xliff:g> обробляє ваші дані, можна знайти в політиці конфіденційності розробника"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Щоб керувати іншими дозволами Android для цього додатка, виберіть \"Налаштування &gt; Додатки\""</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Переглянути політику конфіденційності"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Доступ отримано протягом останніх 24 годин"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Доступ додатка"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Наразі у вас не встановлено сумісних додатків"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Додатковий доступ"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Минулі дані, фоновий режим"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Для цього додатка видалено й інші дозволи"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Дозволи"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Фізична активність і здоров’я"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Тренування, сон, харчування тощо"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Медичні дані"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"медичні дані"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Результати аналізів, ліки, щеплення тощо"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Результати аналізів, ліки, вакцини тощо"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Вилучені дозволи для додатків"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Сервіс Health Connect вилучив дозволи для додатка <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Сервіс Health Connect вилучив дозволи для додатків <xliff:g id="APP_DATA_0">%1$s</xliff:g> і <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Перейти в Google Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Початок роботи з Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Сервіс Health Connect зберігає ваші дані про здоров’я і фізичну активність, а також дає змогу легко синхронізувати їх із різними додатками на вашому пристрої"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect зберігає і синхронізує дані про здоров’я та фізичну активність із різних додатків.\n\n"<b>"Дані про здоров’я і фізичну активність,"</b>" зокрема про тренування, кількість кроків, харчування, сон тощо\n\n"<b>"Медичні дані,"</b>" зокрема відомості про вакцини, результати аналізів тощо"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Сервіс Health Connect надає вам перелічені нижче можливості"</string>
     <string name="share_data" msgid="3481932156368883946">"Діліться даними з додатками"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Виберіть дані, які кожен додаток зможе читати або записувати в Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Керуйте налаштуваннями та конфіденційністю"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Незначні виділення"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Помірні виділення"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Рясні виділення"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Невідомо"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="DAY">%1$d</xliff:g>-й день менструації з <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Менструація (1 день)}one{Менструація (# день)}few{Менструація (# дні)}many{Менструація (# днів)}other{Менструація (# дня)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Позитивний"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Негативний"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Високий результат"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Музика"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Інше"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Самостійна медитація"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Помірна"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Енергійна"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> хв"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> год <xliff:g id="MIN">%2$s</xliff:g> хв"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> год"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Триває інтеграція"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect інтегрується із системою Android.\n\nПеренесення ваших даних і дозволів може зайняти деякий час."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Не закривайте додаток, доки не отримаєте сповіщення про завершення."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Триває інтеграція Health Connect"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Потрібне оновлення"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Сервіс Health Connect інтегрується із системою Android, щоб ви могли отримувати доступ до нього просто з налаштувань."</string>
     <string name="update_button" msgid="4544529019832009496">"Оновити"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Установіть це оновлення, щоб продовжити інтеграцію Health Connect із налаштуваннями вашої системи"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Оновити"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Потрібно оновити систему"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Перш ніж продовжити, оновіть операційну систему телефона."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Якщо на вашому телефоні встановлено найновішу версію ОС, спробуйте перезавантажити його, щоб продовжити інтеграцію"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Потрібно оновити Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Перш ніж продовжити, оновіть додаток Health Connect до останньої версії."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Потрібно більше пам’яті"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Щоб продовжити інтеграцію, Health Connect потрібно <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> вільної пам’яті на вашому телефоні.\n\nЗвільніть місце на телефоні й повторіть спробу."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Повторити спробу"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Звільнити місце"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Потрібно більше пам’яті"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Щоб продовжити інтеграцію, Health Connect потрібно <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> вільної пам’яті на вашому телефоні"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Інтеграцію призупинено"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Додаток Health Connect закрито під час інтеграції із системою Android.\n\nНатисніть \"Відновити\", щоб повторно відкрити додаток і продовжити перенесення даних та дозволів."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Щоб зберегти дані Health Connect, завершіть перенесення протягом періоду в <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Торкніться, щоб продовжити інтеграцію Health Connect із системою Android. Щоб зберегти свої дані, у вас є <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Торкніться, щоб продовжити інтеграцію Health Connect із системою Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Продовжити"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Відновіть інтеграцію Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Щоб зберегти свої дані, завершіть перенесення протягом періоду в <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Оновіть додаток"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> потрібно оновити, щоб він і надалі синхронізувався з Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Деякі додатки потрібно оновити, щоб вони й надалі синхронізувалися з Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> потрібно оновити, щоб він і надалі синхронізувався з Health Connect. Оновлення можуть бути доступні не для всіх додатків."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Деякі додатки потрібно оновити, щоб вони й надалі синхронізувалися з Health Connect. Оновлення можуть бути доступні не для всіх додатків."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Перевірити наявність оновлень"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Докладніше"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Інтеграція Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Інтеграцію Health Connect не завершено"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Ви отримаєте сповіщення, коли інтеграція знову стане доступною."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Інтеграцію Health Connect не завершено"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Читати повністю"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Інтеграцію Health Connect завершено"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Відкрити"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Що нового"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Тепер ви можете відкривати Health Connect просто в налаштуваннях. Додаток Health Connect можна будь-коли видалити, щоб звільнити місце в пам’яті."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Змінити додатки-джерела"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"За умовчанням для пристрою"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Дані додатка"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Тут відображатимуться дані з додатків, які мають доступ до Health Connect"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Тут відображатимуться дані з додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Тут відображатимуться дані з додатків, які мають доступ до Health Connect"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"День"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Тиждень"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Місяць"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Минулий місяць"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Записи"</string>
     <string name="tab_access" msgid="7818197975407243701">"Доступ"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> розширений доступ?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> також запитує доступ до налаштувань Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Надайте принаймні один дозвіл на перегляд, щоб увімкнути для цього додатка доступ у фоновому режимі або до минулих даних"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Надайте принаймні один дозвіл на перегляд, щоб увімкнути для цього додатка доступ у фоновому режимі"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Надайте принаймні один дозвіл на перегляд, щоб увімкнути для цього додатка доступ до минулих даних"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Почніть використовувати Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Синхронізуйте свої перші додатки, щоб обмінюватися між ними даними про здоров’я і фітнес"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Налаштувати"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Перегляньте сумісні додатки"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Знайдіть більше додатків для синхронізації з додатком <xliff:g id="APP_NAME">%s</xliff:g> через Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Переглянути в магазині додатків"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Налаштуйте блокування екрана"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Для додаткового захисту даних про здоров’я установіть PIN-код, ключ або пароль на цьому пристрої"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Налаштувати блокування екрана"</string>
     <string name="select_all" msgid="837499881590001166">"Вибрати всі"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Підключені додатки більше не зможуть переглядати ці дані з Health Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Вибрано"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Не вибрано"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Доступний маршрут тренування на карті"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Наступний день"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Наступний тиждень"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Наступний місяць"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Попередній день"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Попередній тиждень"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Попередній місяць"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Видалити всі дані назавжди?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Видалити вибрані дані назавжди?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Видалити назавжди всі дані додатка <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Видалити назавжди вибрані записи додатка <xliff:g id="APP_NAME">%1$s</xliff:g> за тиждень (<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>)?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Видалити назавжди вибрані записи додатка <xliff:g id="APP_NAME">%1$s</xliff:g> за <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Видалити назавжди цей запис додатка <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Назавжди видалити дані (<xliff:g id="DATA_TYPE">%1$s</xliff:g>) для додатка <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Увімкнено"</string>
+    <string name="off" msgid="6996623844428550649">"Вимкнено"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Останній доступ:: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Доступ отримано вчора: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Доступ отримано: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Завжди дозволяти"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Дозволити вибрані"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Під час використання додатка"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Відхилити всі"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до даних про фізичну активність і здоров’я?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> запитує доступ до таких даних: <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nНадайте доступ до всіх типів даних або керуйте кожним із них окремо."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Дозволити додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до даних (<xliff:g id="DATA_TYPE">%2$s</xliff:g>)?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Фізична активність і здоров’я"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"завжди"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"під час використання"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Завжди"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Під час використання"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> може <xliff:g id="ALLOW_MODE">%2$s</xliff:g> отримувати доступ до всіх ваших даних про фізичну активність і здоров’я"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Доступ дозволено"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Дозволено доступ із правом читання"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Ці дозволи надають додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до даних від датчиків пристрою."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Додатки з дозволом: <xliff:g id="NUMBER_0">%1$d</xliff:g> з <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Жоден додаток не запитує дозвіл"</string>
+    <string name="allowed" msgid="4158456017482263737">"Дозволено"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Немає дозволу"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Додатки із цим дозволом можуть отримувати доступ до даних \"<xliff:g id="DATA_TYPE">%s</xliff:g>\" від датчиків пристрою."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Скасувати доступ до даних \"<xliff:g id="DATA_TYPE">%s</xliff:g>\" для всіх додатків на годиннику?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Прапорець"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Хрестик"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Наразі додаток <xliff:g id="APP_NAME">%1$s</xliff:g> може отримувати доступ до даних про фізичну активність і здоров’я <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Завжди дозволяти додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до даних про фізичну активність і здоров’я?"</string>
+    <string name="current_access" msgid="1457167070428176139">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> має доступ до таких даних: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Керувати дозволами на доступ до даних про активність і здоров’я"</string>
 </resources>
diff --git a/apk/res/values-ur/strings.xml b/apk/res/values-ur/strings.xml
index 4d8480c..b080cdd 100644
--- a/apk/res/values-ur/strings.xml
+++ b/apk/res/values-ur/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"اپنے آلہ پر صحت اور تندرستی کے ڈیٹا کا نظم کریں اور کنٹرول کریں کہ کون سی ایپس اس تک رسائی حاصل کر سکتی ہیں"</string>
     <string name="data_title" msgid="4456619761533380816">"ڈیٹا اور رسائی"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"صحت کے ریکارڈز کو براؤز کریں"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"اپنے صحت کے ریکارڈز دیکھیں اور جانیں کہ کون سی ایپس ان تک رسائی حاصل کر سکتی ہیں"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"سبھی زمرے"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"سبھی زمروں کو دیکھیں"</string>
     <string name="no_data" msgid="1906986019249068659">"کوئی ڈیٹا نہیں ہے"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"گزشتہ کل"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"پڑھیں: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"لکھیں: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"، "</string>
+    <string name="separator" msgid="5521285473288943819">"، "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"اجازتوں کا نظم کریں"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"وقت: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"سرگرمی"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"اپنی صحت سے متعلق ڈیٹا تک رسائی حاصل کریں"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"برن کی گئی کیلوریز پڑھیں"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"برن کی گئی کیلوریز کا ڈیٹا پڑھنے کے لیے ایپس کو اجازت دیتی ہے"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"پس منظر میں ڈیٹا تک رسائی حاصل کریں"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"ایپ <xliff:g id="APP_NAME">%1$s</xliff:g> کو پس منظر میں ڈیٹا تک رسائی کی اجازت دیں؟"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"ایپ <xliff:g id="APP_NAME">%1$s</xliff:g> کو پس منظر میں ڈیٹا تک رسائی کی اجازت دیں؟"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"اگر آپ اجازت دیتے ہیں تو یہ ایپ تندرستی اور فلاح و بہبود کے ڈیٹا اور صحت کے ریکارڈز تک رسائی حاصل کر سکتی ہے جب آپ ایپ استعمال نہیں کر رہے ہوں۔"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"اگر آپ اجازت دیتے ہیں تو یہ ایپ صحت کے ریکارڈز تک رسائی حاصل کر سکتی ہے جب آپ ایپ استعمال نہیں کر رہے ہوں۔"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"اگر آپ اجازت دیتے ہیں تو یہ ایپ تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی حاصل کر سکتی ہے جب آپ ایپ استعمال نہیں کر رہے ہوں۔"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"اگر آپ اجازت دیتے ہیں تو یہ ایپ Health Connect ڈیٹا تک رسائی حاصل کر سکتی ہے جب آپ ایپ استعمال نہیں کر رہے ہوں۔"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> کو گزشتہ ڈیٹا تک رسائی کی اجازت دیں؟"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"اگر آپ اجازت دیتے ہیں تو یہ ایپ تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی حاصل کر سکتی ہے جو <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> سے پہلے شامل کیے گئے تھے۔"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"اگر آپ اجازت دیتے ہیں تو یہ ایپ تمام گزشتہ تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی حاصل کر سکتی ہے۔"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"اگر آپ اجازت دیتے ہیں تو یہ ایپ Health Connect ڈیٹا تک رسائی حاصل کر سکتی ہے جو <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> سے پہلے شامل کیے گئے تھے۔"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"اگر آپ اجازت دیتے ہیں تو یہ ایپ تمام گزشتہ Health Connect ڈیٹا تک رسائی حاصل کر سکتی ہے۔"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"کیا آپ <xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اضافی رسائی دینا چاہتے ہیں؟"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"ایپ <xliff:g id="APP_NAME">%1$s</xliff:g> بھی Health Connect کی ان ترتیبات تک رسائی حاصل کرنا چاہتی ہے"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"پس منظر میں تمام ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"پس منظر میں صحت کے ریکارڈز تک رسائی حاصل کریں"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"پس منظر میں تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"ایپ استعمال نہ کرنے پر، اس ایپ کو تندرستی اور فلاح و بہبود کے ڈیٹا اور صحت کے ریکارڈز تک رسائی حاصل کرنے کی اجازت دیں"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"ایپ استعمال نہ کرنے پر، اس ایپ کو اس ڈیٹا تک رسائی حاصل کرنے کی اجازت دیں"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"ایپ استعمال نہ کرنے پر، اس ایپ کو اس ڈیٹا تک رسائی حاصل کرنے کی اجازت دیں"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"پس منظر میں ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"اس ایپ کو Health Connect ڈیٹا تک رسائی کی اجازت دیں جب آپ ایپ استعمال نہیں کر رہے ہوں"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"ماضی کی تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"اس ایپ کو <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> سے پہلے شامل کردہ ڈیٹا تک رسائی کی اجازت دیں"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"اس ایپ کو ماضی کے تمام ڈیٹا تک رسائی کی اجازت دیں"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"گزشتہ ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"اس ایپ کو <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> سے پہلے شامل کردہ Health Connect ڈیٹا تک رسائی کی اجازت دیں"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"اس ایپ کو تمام گزشتہ Health Connect ڈیٹا تک رسائی کی اجازت دیں"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> پہلے سے ہی آپ کے صحت کے ریکارڈز کے لیے ماضی کے ڈیٹا تک رسائی حاصل کر سکتی ہے"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"اجازتوں کے بارے میں مزید پڑھیں"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"پس منظر میں تمام ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"پس منظر میں صحت کے ریکارڈز تک رسائی حاصل کریں"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"پس منظر میں تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"ایپ استعمال نہ کرنے پر، اس ایپ کو تندرستی اور فلاح و بہبود کے ڈیٹا اور صحت کے ریکارڈز تک رسائی حاصل کرنے کی اجازت دیں"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"ایپ استعمال نہ کرنے پر، اس ایپ کو اس ڈیٹا تک رسائی حاصل کرنے کی اجازت دیں"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"ایپ استعمال نہ کرنے پر، اس ایپ کو اس ڈیٹا تک رسائی حاصل کرنے کی اجازت دیں"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"پس منظر میں ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"اس ایپ کو Health Connect ڈیٹا تک رسائی کی اجازت دیں جب آپ ایپ استعمال نہیں کر رہے ہوں"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"ماضی کی تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"اس ایپ کو <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> سے پہلے شامل کردہ ڈیٹا تک رسائی کی اجازت دیں"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"اس ایپ کو ماضی کے تمام ڈیٹا تک رسائی کی اجازت دیں"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"گزشتہ ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"اس ایپ کو <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> سے پہلے شامل کردہ Health Connect ڈیٹا تک رسائی کی اجازت دیں"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"اس ایپ کو ماضی کے تمام Health Connect ڈیٹا تک رسائی کی اجازت دیں"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"فی الحال کوئی تندرستی کا ڈیٹا نہیں پڑھا جا رہا ہے کیونکہ <xliff:g id="APP_NAME">%1$s</xliff:g> میں پڑھنے کی اجازتیں آن نہیں ہیں"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> پہلے سے ہی آپ کے صحت کے ریکارڈز کے ماضی کے ڈیٹا تک رسائی حاصل کر سکتی ہے۔ اسے تبدیل کرنے کے لیے، اس ایپ کے لیے صحت کے ریکارڈ کی اجازتیں بند کریں"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"صحت کے ریکارڈ کی اجازتوں کا نظم کریں"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"اس ایپ کے لیے پس منظر یا ماضی کے ڈیٹا تک رسائی کو آن کرنے کے لیے کم از کم ایک پڑھنے کی اجازت کو فعال کریں"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"اس ایپ کے لیے پس منظر میں ہونے پر رسائی کو آن کرنے کی خاطر کم از کم ایک پڑھنے کی اجازت کو فعال کریں"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"اس ایپ کے لیے ماضی کے ڈیٹا تک رسائی کو آن کرنے کے لیے کم از کم ایک پڑھنے کی اجازت کو فعال کریں"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"اس ایپ کو تمام گزشتہ Health Connect ڈیٹا تک رسائی کی اجازت دیں"</string>
     <string name="background_read_description" msgid="3203594555849969283">"اس ایپ کو Health Connect ڈیٹا تک رسائی کی اجازت دیں جب آپ ایپ استعمال نہیں کر رہے ہوں"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"اگر آپ اجازت دیتے ہیں تو یہ ایپ Health Connect ڈیٹا تک رسائی حاصل کر سکتی ہے جب آپ ایپ استعمال نہیں کر رہے ہوں۔"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"گزشتہ ڈیٹا تک رسائی حاصل کریں"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> کو گزشتہ ڈیٹا تک رسائی کی اجازت دیں؟"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"اس ایپ کو <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> سے پہلے شامل کردہ Health Connect ڈیٹا تک رسائی کی اجازت دیں"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"اس ایپ کو تمام گزشتہ Health Connect ڈیٹا تک رسائی کی اجازت دیں"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"اگر آپ اجازت دیتے ہیں تو یہ ایپ Health Connect ڈیٹا رسائی حاصل کر سکتی ہے جو <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> سے پہلے شامل کیے گئے تھے۔"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"اگر آپ اجازت دیتے ہیں تو یہ ایپ تمام گزشتہ Health Connect ڈیٹا تک رسائی حاصل کر سکتی ہے۔"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"برن کی گئی فعال کیلوریز کا ڈیٹا"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"برن کی گئی فعال کیلوریز کا ڈیٹا"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"برن کی گئی فعال کیلوریز کا ڈیٹا پڑھیں"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"وہیل چیئر پش سے متعلق ڈیٹا"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"وہیل چیئر پش سے متعلق ڈیٹا پڑھیں"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"وہیل چیئر پش سے متعلق ڈیٹا لکھیں"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"سرگرمی کی شدت"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"سرگرمی کی شدت"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"سرگرمی کی شدت پڑھیں"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"سرگرمی کی شدت لکھیں"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"بنیادی میٹابولک شرح سے متعلق ڈیٹا"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"بنیادی میٹابولک شرح سے متعلق ڈیٹا"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"بنیادی میٹابولک شرح سے متعلق ڈیٹا پڑھیں"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"جلد کا درجہ حرارت"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"جلد کا درجہ حرارت پڑھیں"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"جلد کا درجہ حرارت لکھیں"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"اس میں Health Connect کے ساتھ مطابقت پذیر اور اس میں شامل کردہ صحت کے سبھی ریکارڈز شامل ہیں۔ ہو سکتا ہے یہ آپ کا مکمل میڈیکل ریکارڈ نہ ہو اور اس میں آپ کے صحت کے ریکارڈز کی طبی تفصیل شامل نہ ہو۔"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"صحت کے تمام ریکارڈز"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"صحت کے تمام ریکارڈز"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"صحت کے تمام ریکارڈز لکھیں"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"الرجیز"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"الرجیز"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"الرجیز پڑھیں"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"امیونائزیشن"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"امیونائزیشن"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"امیونائزیشن کو پڑھیں"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"لیبارٹری کے نتائج"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"لیبارٹری کے نتائج"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"لیبارٹری کے نتائج کے ڈیٹا کے بارے میں پڑھیں"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"الرجیز"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"الرجیز"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"الرجیز پڑھیں"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"حالات"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"حالات"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"حالات پڑھیں"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"ویکسینز"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"ویکسینز"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"ویکسینز پڑھیں"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"لیب کے نتائج"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"لیب کے نتائج"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"لیب کے نتائج پڑھیں"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"ادویات"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"ادویات"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"ادویات کے ڈیٹا کو پڑھیں"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"ذاتی تفصیلات"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"ذاتی تفصیلات"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"ذاتی تفصیلات پڑھ سکتے ہیں"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"پریکٹیشنر کی تفصیلات"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"پریکٹیشنر کی تفصیلات"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"پریکٹیشنر کی تفصیلات پڑھ سکتے ہیں"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"حمل"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"حمل"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"حمل ڈیٹا کے بارے میں پڑھیں"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"مسائل"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"مسائل"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"مسائل پڑھیں"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"پروسیجرز"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"پروسیجرز"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"پروسیجرز پڑھیں"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"سوشل سرگزشت کا ڈیٹا"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"سوشل سرگزشت کا ڈیٹا"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"سوشل سرگزشت کا ڈیٹا"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"سوشل سرگزشت کا ڈیٹا پڑھیں"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"اہم علامتیں"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"ملاقاتیں"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ملاقاتیں"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"ملاقاتوں کو پڑھ سکتے ہیں"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"اہم علامتیں"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"اہم علامتیں"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"اہم علامتوں کے ڈیٹا کے بارے میں پڑھیں"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"ارتکازِ توجہ"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"ارتکاز توجہ کے ڈیٹا کو لکھیں"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" کو پڑھنے کی اجازت دیں"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" کو لکھنے کی اجازت دیں"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"منسوخ کریں"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"اجازت دیں"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"سبھی کو اجازت دیں"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"اجازت نہ دیں"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"وہ ڈیٹا منتخب کریں جسے آپ چاہتے ہیں کہ یہ ایپ Health Connect پر پڑھے یا لکھے"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"وہ ڈیٹا منتخب کریں جسے آپ چاہتے ہیں کہ یہ ایپ Health Connect پر پڑھے یا لکھے"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"وہ ڈیٹا منتخب کریں جسے آپ چاہتے ہیں کہ یہ ایپ Health Connect سے پڑھے"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"وہ ڈیٹا منتخب کریں جسے آپ چاہتے ہیں کہ یہ ایپ Health Connect پر پڑھے"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"اگر آپ پڑھنے کی رسائی دیتے ہیں تو ایپ نیا ڈیٹا اور گزشتہ 30 دن کا ڈیٹا پڑھ سکتی ہے"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"اگر آپ پڑھنے کی رسائی دیتے ہیں تو ایپ نئے اور گزشتہ ڈیٹا کو پڑھ سکتی ہے"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو Health Connect تک رسائی کی اجازت دیں؟"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"آپ ڈویلپر کی <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> میں یہ جان سکتے ہیں کہ <xliff:g id="APP_NAME">%1$s</xliff:g> آپ کے ڈیٹا کو کیسے ہینڈل کرتی ہے"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> کو تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی کی اجازت دیں؟"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"آپ اپنے <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> میں یہ جان سکتے ہیں کہ <xliff:g id="APP_NAME">%1$s</xliff:g> آپ کے ڈیٹا کو کیسے ہینڈل کرتی ہے"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"رازداری کی پالیسی"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ کو اپنے صحت کے ریکارڈز تک رسائی کی اجازت دیں؟"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"آپ کے رسائی دینے پر، ایپ الرجیز، لیب کے نتائج، ویکسینز اور مزید جیسے ڈیٹا کو پڑھ اور لکھ سکتی ہے\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"آپ کے رسائی دینے پر، ایپ الرجیز، لیب کے نتائج، ویکسینز اور مزید جیسے ڈیٹا کو پڑھ سکتی ہے\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"صحت کے ریکارڈز کے بارے میں"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"اشتراک کرنے کا ڈیٹا شامل ہے"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"آپ کے اجازت دینے پر، <xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے صحت کے ریکارڈز کا Health Connect کے ساتھ اشتراک کر سکتی ہے۔"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"اپنے صحت کے ریکارڈز کو اپنی مختلف ایپس اور وسائل سے مطابقت پذیر بنائیں تاکہ انہیں ایک مقام پر رکھا جا سکے"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"تمام اجازتیں ہٹائیں؟"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"سبھی ہٹائیں"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect سے مزید کوئی ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ماضی کے ڈیٹا سمیت Health Connect سے مزید کوئی ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nاس سے اس ایپ کی دوسری اجازتیں متاثر نہیں ہوتی ہیں جیسے مقام، کیمرا یا مائیکروفون۔"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> پس منظر اور ماضی کے ڈیٹا سمیت Health Connect سے مزید کوئی ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nاس سے اس ایپ کی دوسری اجازتیں متاثر نہیں ہوتی ہیں جیسے مقام، کیمرا یا مائیکروفون۔"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"نیز Health Connect سے <xliff:g id="APP_NAME">%1$s</xliff:g> کا ڈیٹا حذف کریں"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"تمام اجازتیں ہٹائیں؟"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"صحت کے ریکارڈ کی سبھی اجازتیں ہٹائیں؟"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"تندرستی اور فلاح و بہبود کی تمام اجازتیں ہٹائیں؟"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> پر موجود تندرستی کا ڈیٹا بھی Health Connect سے حذف کریں"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"صحت کے ریکارڈ کی سبھی اجازتیں ہٹائیں؟"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> پر موجود صحت کے ریکارڈز کو بھی Health Connect سے حذف کریں"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect کا یہ ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> پس منظر کا ڈیٹا سمیت، Health Connect کا یہ ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect کا یہ ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> پس منظر اور ماضی کے ڈیٹا سمیت، Health Connect کا یہ ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"تمام اجازتیں ہٹائیں؟"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect سے مزید ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> پس منظر کا ڈیٹا سمیت، Health Connect سے مزید ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connect سے مزید ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> پس منظر اور ماضی کے ڈیٹا سمیت، Health Connect سے مزید ڈیٹا پڑھ یا لکھ نہیں سکے گی۔\n\nیہ دوسری اجازتیں جو اس ایپ کی ہو سکتی ہیں، جیسے کیمرا، مائیکروفون یا مقام کو متاثر نہیں کرتی ہے۔"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> پر موجود تندرستی کا ڈیٹا اور صحت کے ریکارڈز کو بھی Health Connect سے حذف کریں"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"اس ایپ کی اجازتیں ہٹائی گئیں"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"تمام Health Connect ڈیٹا کو بھی حذف کریں"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"اگلا دن"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"منتخب کردہ یوم"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"پچھلا دن"</string>
     <string name="default_error" msgid="7966868260616403475">"کچھ غلط ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"نامعلوم وسیلہ"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"ماخذ ڈیٹا"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>کھلی بریکٹ۔"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>بند بریکٹ۔"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> فیلڈ <xliff:g id="FIELD">%2$s</xliff:g> قدر"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"ان ایپس کو اب مزید رسائی حاصل نہیں ہے لیکن ان کے پاس اب بھی Health Connect میں ڈیٹا اسٹور ہے"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> کے بعد شامل کردہ ڈیٹا کو <xliff:g id="APP_NAME">%1$s</xliff:g> ایپ پڑھ سکتی ہے"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"دیگر Android اجازتوں کا نظم کرنے کے لیے جن تک یہ ایپ رسائی حاصل کر سکتی ہے، ترتیبات &gt; ایپس پر جائیں"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"آپ جس ڈیٹا کا <xliff:g id="APP_NAME">%1$s</xliff:g> کے ساتھ اشتراک کرتے ہیں اسے اس کی رازداری کی پالیسیوں کے ذریعے کوَر کیا جاتا ہے"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"آپ ڈویلپر کی رازداری کی پالیسی میں یہ جان سکتے ہیں کہ <xliff:g id="APP_NAME">%1$s</xliff:g> آپ کے ڈیٹا کو کیسے ہینڈل کرتی ہے"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"دیگر Android اجازتوں کا نظم کرنے کے لیے جن تک یہ ایپ رسائی حاصل کر سکتی ہے، ترتیبات پر جائیں، پھر ایپس پر تھپتھپائیں"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"رازداری کی پالیسی پڑھیں"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"گزشتہ 24 گھنٹے میں رسائی حاصل کی گئی"</string>
     <string name="app_access_title" msgid="7137018424885371763">"ایپ تک رسائی"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"آپ کے پاس فی الحال کوئی موافق ایپ انسٹال نہیں ہے"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"اضافی رسائی"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"ماضی کا ڈیٹا، پس منظر کا ڈیٹا"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"اس ایپ کے لیے اضافی اجازتیں ہٹا دی گئیں"</string>
     <string name="permissions_header" msgid="6519976063360071569">"اجازتیں"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"تندرستی اور بہبودی"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"ورزش، نیند، غذائیت اور دیگر"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"صحت کے ریکارڈز"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"صحت کے ریکارڈز"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"لیب کے نتائج، ادویات، حفاظتی ٹیکے و دیگر"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"لیب کے نتائج، ادویات، ویکسینز اور دیگر"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"ایپ کی اجازتیں ہٹا دی گئیں"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect نے <xliff:g id="APP_DATA">%s</xliff:g> کے لیے اجازتیں ہٹا دیں"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect نے <xliff:g id="APP_DATA_0">%1$s</xliff:g> اور <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> کے لیے اجازتیں ہٹا دیں"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"‫Play اسٹور پر جائیں"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect کے ساتھ شروع کریں"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"‫Health Connect ایپ آپ کے صحت اور تندرستی کے ڈیٹا کو اسٹور کرتی ہے جو آپ کے آلہ پر مختلف ایپس کو سِنک کرنے کا ایک آسان طریقہ فراہم کرتا ہے"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"‫Health Connect مختلف ایپس کے آپ کی صحت اور تندرستی کے ڈیٹا کو اسٹور کرتی ہے اور مطابقت پذیر بناتی ہے۔\n\n"<b>"صحت اور فلاح و بہبود کا ڈیٹا،"</b>" بشمول ورزش کے سیشنز، قدموں کی تعداد، غذائیت اور نیند وغیرہ\n\n"<b>"صحت کے ریکارڈز،"</b>" بشمول ویکسینز اور لیب کے نتائج وغیرہ"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"‫Health Connect کے ساتھ آپ درج ذیل چیزیں کر سکتے ہیں"</string>
     <string name="share_data" msgid="3481932156368883946">"اپنی ایپس کے ساتھ ڈیٹا کا اشتراک کریں"</string>
     <string name="share_data_description" msgid="2919871301634375092">"وہ ڈیٹا منتخب کریں جسے ہر ایپ Health Connect پر پڑھ یا لکھ سکتی ہے"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"اپنی ترتیبات اور رازداری کا نظم کریں"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"ماہواری کا کم مقدار میں ہونا"</string>
     <string name="flow_medium" msgid="3783688724668943154">"ماہواری کا اوسط مقدار میں ہونا"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"ماہواری کا زیادہ مقدار میں ہونا"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"نامعلوم فلو"</string>
     <string name="period_day" msgid="3821944462093965882">"<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> میں سے حیض کا دن <xliff:g id="DAY">%1$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{ماہواری (1 دن)}other{ماہواری (# دن)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"مثبت"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"منفی"</string>
     <string name="ovulation_high" msgid="205362931427158291">"اعلی"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"موسیقی"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"دیگر"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"غیر رہنما شدہ سیشن"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"معتدل"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"مضبوط"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> منٹ"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> گھنٹے <xliff:g id="MIN">%2$s</xliff:g> منٹ"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> گھنٹہ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"انضمام پیشرفت میں ہے"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"‫Health Connect کو Android سسٹم کے ساتھ ضم کیا جا رہا ہے۔\n\nآپ کے ڈیٹا اور اجازتوں کی منتقلی میں کچھ وقت لگ سکتا ہے۔"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"ایپ کو اس وقت تک بند نہ کریں جب تک کہ آپ کو اطلاع نہ مل جائے کہ پروسیس مکمل ہو گیا ہے۔"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"‫Health Connect کا انضمام پیشرفت میں ہے"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"اپ ڈیٹ درکار ہے"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"‫Health Connect کو Android سسٹم کے ساتھ ضم کیا جا رہا ہے تاکہ آپ اسے اپنی ترتیبات سے براہ راست رسائی حاصل کر سکیں۔"</string>
     <string name="update_button" msgid="4544529019832009496">"اپ ڈیٹ کریں"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"اس اپ ڈیٹ کو شروع کریں تاکہ Health Connect کا آپ کے سسٹم کی ترتیبات کے ساتھ ضم ہونا جاری رہے"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"ابھی اپ ڈیٹ کریں"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"سسٹم اپ ڈیٹ درکار ہے"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"جاری رکھنے سے پہلے، اپنے فون سسٹم کو اپ ڈیٹ کریں۔"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"اگر آپ پہلے ہی اپنے فون سسٹم کو اپ ڈیٹ کر چکے ہیں تو انضمام جاری رکھنے کے لیے اپنے فون کو ری سٹارٹ کرنے کی کوشش کریں"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"‫Health Connect کو اپ ڈیٹ کرنے کی ضرورت ہے"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"جاری رکھنے سے پہلے، Health Connect ایپ کو تازہ ترین ورژن میں اپ ڈیٹ کریں۔"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"مزید جگہ درکار ہے"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"‫Health Connect کو انضمام جاری رکھنے کے لیے آپ کے فون پر <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> اسٹوریج کی جگہ درکار ہے۔\n\nاپنے فون پر کچھ جگہ خالی کریں اور پھر دوبارہ کوشش کریں۔"</string>
     <string name="try_again_button" msgid="8745496819992160789">"دوبارہ کوشش کریں"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"جگہ خالی کریں"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"مزید جگہ درکار ہے"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"‫Health Connect کو انضمام جاری رکھنے کے لیے آپ کے فون پر <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> اسٹوریج کی جگہ درکار ہے۔"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"انضمام موقوف ہو گیا"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"‫Android سسٹم کے ساتھ ضم ہونے کے دوران Health Connect ایپ بند ہو گئی۔\n\nایپ کو دوبارہ کھولنے کے لیے \'دوبارہ شروع کریں\' پر کلک کریں اور اپنے ڈیٹا اور اجازتوں کی منتقلی جاری رکھیں۔"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"اپنا Health Connect ڈیٹا برقرار رکھنے کے لیے، اسے <xliff:g id="TIME_NEEDED">%1$s</xliff:g> دن کے اندر مکمل کریں"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"‫Health Connect کو Android سسٹم کے ساتھ ضم کرنا جاری رکھنے کے لیے تھپتھپائیں۔ اپنا ڈیٹا برقرار رکھنے کے لیے، اسے <xliff:g id="TIME_NEEDED">%1$s</xliff:g> دن کے اندر مکمل کریں"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"‫Health Connect کو Android سسٹم کے ساتھ ضم کرنا جاری رکھنے کے لیے تھپتھپائیں۔"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"جاری رکھیں"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect کے انضمام کو دوبارہ شروع کریں"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"اپنا ڈیٹا برقرار رکھنے کے لیے، اسے <xliff:g id="TIME_NEEDED">%1$s</xliff:g> دن کے اندر مکمل کریں"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"ایپ کی اپ ڈیٹ درکار ہے"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect کے ساتھ مطابقت پذیری جاری رکھنے کے لیے <xliff:g id="APP_NAME">%1$s</xliff:g> کو اپ ڈیٹ کرنے کی ضرورت ہے"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect کے ساتھ مطابقت پذیری جاری رکھنے کے لیے کچھ ایپس کو اپ ڈیٹ کرنے کی ضرورت ہے"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"‫Health Connect کے ساتھ مطابقت پذیری جاری رکھنے کے لیے <xliff:g id="APP_NAME">%1$s</xliff:g> کو اپ ڈیٹ کرنے کی ضرورت ہے۔ ہو سکتا ہے اپ ڈیٹس سبھی ایپس کے لیے دستیاب نہ ہوں۔"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"‫Health Connect کے ساتھ مطابقت پذیری جاری رکھنے کے لیے کچھ ایپس کو اپ ڈیٹ کرنے کی ضرورت ہے۔ ہو سکتا ہے اپ ڈیٹس سبھی ایپس کے لیے دستیاب نہ ہوں۔"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"اپ ڈیٹس چیک کریں"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"مزید جانیں"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"‫Health Connect کا انضمام"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"‫Health Connect کا انضمام مکمل نہیں ہوا"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"اس کے دوبارہ دستیاب ہونے پر آپ کو ایک اطلاع موصول ہوگی۔"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"سمجھ آ گئی"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"‫Health Connect کا انضمام مکمل نہیں ہوا"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"مزید پڑھیں"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect کا انضمام مکمل ہو گیا"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"کھولیں"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"نیا کیا ہے"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"اب آپ اپنی ترتیبات سے براہ راست Health Connect تک رسائی حاصل کر سکتے ہیں۔ اسٹوریج کی جگہ خالی کرنے کے لیے کسی بھی وقت Health Connect ایپ کو اَن انسٹال کریں۔"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"سمجھ آ گئی"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"ایپ کے مآخذ میں ترمیم کریں"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"آلہ ڈیفالٹ"</string>
     <string name="app_data_title" msgid="6499967982291000837">"ایپ کا ڈیٹا"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect تک رسائی والی ایپس کا ڈیٹا یہاں ظاہر ہوگا"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> کا ڈیٹا یہاں دکھائی دے گا"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"‫Health Connect تک رسائی والی ایپس کا ڈیٹا یہاں ظاہر ہوگا"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"دن"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"ہفتہ"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"مہینہ"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"پچھلا مہینہ"</string>
     <string name="tab_entries" msgid="3402700951602029493">"اندراج"</string>
     <string name="tab_access" msgid="7818197975407243701">"رسائی"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"کیا آپ <xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اضافی رسائی دینا چاہتے ہیں؟"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"ایپ <xliff:g id="APP_NAME">%1$s</xliff:g> بھی Health Connect کی ان ترتیبات تک رسائی حاصل کرنا چاہتی ہے"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"اس ایپ کے لیے پس منظر یا ماضی کے ڈیٹا تک رسائی کو آن کرنے کے لیے کم از کم ایک پڑھنے کی اجازت کو فعال کریں"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"اس ایپ کے لیے پس منظر میں ہونے پر رسائی کو آن کرنے کی خاطر کم از کم ایک پڑھنے کی اجازت کو فعال کریں"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"اس ایپ کے لیے ماضی کے ڈیٹا تک رسائی کو آن کرنے کے لیے کم از کم ایک پڑھنے کی اجازت کو فعال کریں"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"‫Health Connect کو استعمال کرنا شروع کریں"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"اپنی پہلی ایپس کو ان کے درمیان صحت اور تندرستی کے ڈیٹا کا اشتراک کرنے کیلئے مطابقت پذیر بنائیں"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"سیٹ اپ کریں"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"موافق ایپس دیکھیں"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"‫Health Connect کے ذریعے <xliff:g id="APP_NAME">%s</xliff:g> کے ساتھ مطابقت پذیری کرنے کیلئے مزید ایپس تلاش کریں"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"‫App اسٹور پر دیکھیں"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"اسکرین لاک سیٹ کریں"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"اپنی صحت سے متعلق ڈیٹا کے لیے شامل کردہ سیکیورٹی کے لیے، اس آلے کے لیے PIN، پیٹرن یا پاس ورڈ سیٹ کریں"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"اسکرین لاک سیٹ کریں"</string>
     <string name="select_all" msgid="837499881590001166">"سبھی کو منتخب کریں"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"منسلک ایپس Health Connect سے اس ڈیٹا کو مزید نہیں پڑھ سکیں گی"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"نشان زد کر دیا گیا"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"نشان زد نہیں ہے"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"ورزش سے متعلق نقشے کا راستہ دستیاب ہے"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"اگلا دن"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"اگلا ہفتہ"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"اگلا مہینہ"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"پچھلا دن"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"پچھلا ہفتہ"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"پچھلا مہینہ"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"تمام ڈیٹا مستقل طور پر حذف کریں؟"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"منتخب ڈیٹا مستقل طور پر حذف کریں؟"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"<xliff:g id="APP_NAME">%s</xliff:g> کا تمام ڈیٹا مستقل طور پر حذف کریں؟"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> کے ہفتے کے لیے <xliff:g id="APP_NAME">%1$s</xliff:g> کے منتخب اندراجات کو مستقل طور پر حذف کریں؟"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> کے لیے <xliff:g id="APP_NAME">%1$s</xliff:g> کے منتخب اندراجات کو مستقل طور پر حذف کریں؟"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"مستقل طور پر اس <xliff:g id="APP_NAME">%s</xliff:g> کے اندراج کو حذف کریں؟"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> کے لیے <xliff:g id="DATA_TYPE">%1$s</xliff:g> ڈیٹا کو مستقل طور پر حذف کریں؟"</string>
+    <string name="on" msgid="8266542510798355807">"آن"</string>
+    <string name="off" msgid="6996623844428550649">"آف"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"<xliff:g id="TIME_DATE">%1$s</xliff:g> پر رسائی حاصل کی گئی"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"گزشتہ کل <xliff:g id="TIME_DATE">%1$s</xliff:g> پر رسائی حاصل کی گئی"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> پر رسائی حاصل کی گئی"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"ہر وقت اجازت دیں"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"منتخب کردہ کو اجازت دیں"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"ایپ استعمال کرتے وقت"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"سبھی مسترد کریں"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> کو تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی کی اجازت دیں؟"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DATA_TYPES">%2$s</xliff:g> تک رسائی کی درخواست کر رہا ہے۔\n\nسبھی کو اجازت دینے کا انتخاب کریں یا انہیں انفرادی طور پر کنٹرول کریں۔"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> کو <xliff:g id="DATA_TYPE">%2$s</xliff:g> تک رسائی حاصل کرنے کی اجازت دیں؟"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"تندرستی اور بہبودی"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ہر وقت"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"استعمال کے دوران"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"ہر وقت"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"استعمال کے دوران"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> آپ کے سبھی تندرستی اور فلاح و بہبود کے ڈیٹا تک رسائی <xliff:g id="ALLOW_MODE">%2$s</xliff:g> حاصل کر سکتی ہے"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"رسائی حاصل کرنے کی اجازت دی گئی"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"پڑھنے کی اجازت دی گئی"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"یہ اجازتیں آپ کے آلے کے سینسرز سے ڈیٹا تک <xliff:g id="APP_NAME">%1$s</xliff:g> کو رسائی دیتی ہیں۔"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"‫<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> میں سے <xliff:g id="NUMBER_0">%1$d</xliff:g> ایپس کو اجازت دی گئی ہے"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"کوئی ایپ درخواست نہیں کر رہی ہے"</string>
+    <string name="allowed" msgid="4158456017482263737">"اجازت یافتہ"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"اجازت نہیں ہے"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"اس اجازت والی ایپس آپ کے آلے کے سینسرز سے <xliff:g id="DATA_TYPE">%s</xliff:g> ڈیٹا تک رسائی حاصل کر سکتی ہے۔"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"اپنی گھڑی پر موجود سبھی ایپس پر <xliff:g id="DATA_TYPE">%s</xliff:g> تک رسائی ہٹائیں؟"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"چیک مارک"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"کراس کا نشان"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"فی الحال، <xliff:g id="APP_NAME">%1$s</xliff:g> تندرستی اور فلاح و بہبود کے ڈیٹا تک <xliff:g id="ALLOW_MODE">%2$s</xliff:g> رسائی حاصل کر سکتی ہے"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> کو تندرستی اور فلاح و بہبود کے ڈیٹا تک ہر وقت رسائی کی اجازت دیں؟"</string>
+    <string name="current_access" msgid="1457167070428176139">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> کو <xliff:g id="DATA_TYPES">%2$s</xliff:g> تک رسائی حاصل ہے۔"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"تندرستی اور فلاح و بہبود کی اجازتوں کا نظم کریں"</string>
 </resources>
diff --git a/apk/res/values-uz/strings.xml b/apk/res/values-uz/strings.xml
index 694a24f..8af7984 100644
--- a/apk/res/values-uz/strings.xml
+++ b/apk/res/values-uz/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Qurilmadagi jismoniy va salomatlik maʼlumotlarini tekshirish va boshqarish hamda buni koʻrishga qaysi ilovalarga ruxsat berilishi"</string>
     <string name="data_title" msgid="4456619761533380816">"Maʼlumotlar va ruxsat"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Salomatlik qaydlarini varaqlash"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Salomatlik axboroti va ularga ruxsati bor ilovalar"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Barcha turkumlar"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Barcha turkumlarni ochish"</string>
     <string name="no_data" msgid="1906986019249068659">"Hech narsa topilmadi"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Kecha"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Oʻqildi: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Yozildi: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Ruxsatlarni boshqarish"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Vaqt: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Faollik"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"salomatlik axborotiga kirish"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Sarflangan kaloriyani oʻqish"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Ilovaga sarflangan kaloriyalar miqdorini oʻqish uchun ruxsat beradi"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Orqa fonda maʼlumotlarga kirish"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga orqa fonda maʼlumotlarga kirish uchun ruxsat berilsinmi?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"<xliff:g id="APP_NAME">%1$s</xliff:g> maʼlumotlardan fonda foydalanishiga ruxsat berilsinmi?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Ruxsat bersangiz, ilova salomatlik va fitnes maʼlumotlari hamda tibbiy qaydlaringizdan fonda foydalanishi mumkin."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Ruxsat bersangiz, ilova tibbiy qaydlardan fonda foydalanishi mumkin."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Ruxsat bersangiz, ilova salomatlik va fitnes maʼlumotlaridan fonda foydalanishi mumkin."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Ruxsat bersangiz, ilova Health Connect maʼlumotlaridan fonda foydalanishi mumkin."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga saqlangan maʼlumotlardan foydalanishga ruxsat berilsinmi?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Ruxsat bersangiz, ilova <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> sanasidan avval kiritilgan salomatlik va fitnes maʼlumotlaridan foydalanishi mumkin."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Ruxsat bersangiz, bu ilova saqlangan barcha salomatlik va fitnes maʼlumotlaridan foydalanishi mumkin."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Ilova <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> sanasigacha qoʻshilgan Health Connect maʼlumotlaridan foydalanishi mumkin."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Ruxsat bersangiz, bu ilova saqlangan Health Connect maʼlumotlaridan foydalanishi mukmin."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun qoʻshimcha ruxsat berilsinmi?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> ham ushbu Health Connect sozlamalariga kirishni xohlaydi"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Barcha maʼlumotlardan fonda foydalanishga ruxsat"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Salomatlik qaydlaridan fonda foydalanishga ruxsat"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Salomatlik va fitnes maʼlumotlaridan fonda foydalanishga ruxsat"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Ilovadan foydalanmayotgan paytda ham, ushbu ilovaga fitnes va salomatlik hamda tibbiy qaydlaringiz uchun ruxsat berish"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Bu ilova mazkur maʼlumotlardan fonda foydalanishiga ruxsat"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Bu ilova mazkur maʼlumotlardan fonda foydalanishiga ruxsat"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Maʼlumotlardan fonda foydalanishga ruxsat"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Bu ilova Health Connect maʼlumotlaridan fonda foydalanishiga ruxsat"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Eski fitnes va salomatlik maʼlumotlariga ruxsat berish"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Bu ilovaga <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> sanasidan oldin qoʻshilgan maʼlumotlardan foydalanishga ruxsat berish"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Bu ilovaga barcha saqlangan maʼlumotlar uchun ruxsat berish"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Saqlangan maʼlumotlarga ruxsat"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Siz bu ilovaga <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> sanasidan oldin qoʻshilgan Health Connect maʼlumotlariga ruxsat berishingiz mumkin"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Bu ilova Health Connect maʼlumotlaridan fonda foydalanishiga ruxsat"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga allaqachon tibbiy qaydingizning saqlangan maʼlumotlari uchun ruxsat berilgan."</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Ruxsatlar haqida batafsil"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Barcha maʼlumotlardan fonda foydalanishga ruxsat"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Salomatlik qaydlaridan fonda foydalanishga ruxsat"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Salomatlik va fitnes maʼlumotlaridan fonda foydalanishga ruxsat"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Ilovadan foydalanmayotgan paytda ham, ushbu ilovaga fitnes va salomatlik hamda tibbiy qaydlaringiz uchun ruxsat berish"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Bu ilova mazkur maʼlumotlardan fonda foydalanishiga ruxsat"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Bu ilova mazkur maʼlumotlardan fonda foydalanishiga ruxsat"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Maʼlumotlardan fonda foydalanishga ruxsat"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Bu ilova Health Connect maʼlumotlaridan fonda foydalanishiga ruxsat"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Eski fitnes va salomatlik maʼlumotlariga ruxsat berish"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Bu ilovaga <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> sanasidan oldin qoʻshilgan maʼlumotlardan foydalanishga ruxsat berish"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Bu ilovaga barcha saqlangan maʼlumotlar uchun ruxsat berish"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Saqlangan maʼlumotlarga ruxsat"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Siz bu ilovaga <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> sanasidan oldin qoʻshilgan Health Connect maʼlumotlariga ruxsat berishingiz mumkin"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Bu ilovaga saqlangan barcha Health Connect maʼlumotlaridan foydalanishga ruxsat berish"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga oʻqish ruxsati berilmagani sababli, hozirda hech qanday fitnes maʼlumotlari oʻqilmayapti"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga allaqachon tibbiy qaydingizning eski maʼlumotlari uchun ruxsat berilgan. Buni oʻzgartirish uchun ushbu ilovaning tibbiy qaydlarga ruxsatini faolsizlantiring"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Tibbiy qayd ruxsatlarini boshqarish"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Bu ilovaga orqa fonda yoki avvalgi maʼlumotlarga kirishga ruxsat berish uchun kamida bitta oʻqish ruxsatini faollashtiring"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Bu ilovaga fon rejimida ruxsat berish uchun kamida bitta oʻqish ruxsatini faollashtiring"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Bu ilovaga avvalgi maʼlumotlarga kirishga ruxsat berish uchun kamida bitta oʻqish ruxsatini faollashtiring"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Bu ilova Health Connect maʼlumotlaridan fonda foydalanishiga ruxsat"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Ilovadan foydalanmayotganingizda unga Health Connect maʼlumotlariga kirishiga ruxsat bering"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Ruxsat bersangiz, ilovadan foydalanmayotganingizda u Health Connect maʼlumotlariga kira oladi."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Saqlangan maʼlumotlarga kirish uchun ruxsat berish"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga saqlangan maʼlumotlarga kirish uchun ruxsat berilsinmi?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Siz bu ilovaga <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> sanasidan oldin qoʻshilgan Health Connect maʼlumotlariga ruxsat berishingiz mumkin"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Bu ilova Health Connect maʼlumotlariga kirishiga ruxsat bering"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Ilova <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g> gacha qoʻshilgan Health Connect maʼlumotlariga kirish huquqiga ega boʻladi"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Ruxsat bersangiz, bu ilova saqlangan Health Connect maʼlumotlariga kira oladi."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Faol sarflangan kaloriyalar"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"faol sarflangan kaloriyalar"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Faol sarflangan kaloriyalar haqidagi axborotni oʻqish"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"nogironlar aravasida yurish"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Nogironlar aravasida yurishni oʻqish"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Nogironlar aravasida yurishni yozish"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Faollik intensivligi"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"faollik intensivligi"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Faollik intensivligini oʻqish"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Faollik intensivligini yozish"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Metabolizmning asosiy darajasi"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"Metabolizmning asosiy darajasi"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Metabolizmning asosiy darajasini oʻqish"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"tana harorati"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Tana haroratini oʻqish uchun ruxsat"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Tana harorati haqida maʼlumotlarni yozish"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Bunga Health Connect ilovasiga sinxronlangan va qoʻshilgan barcha tibbiy qaydlar kiradi. Bu toʻliq tibbiy qaydingiz bo‘lmasligi mumkin va tibbiy qaydingiz tavsifini oʻz ichiga olmaydi."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Barcha tibbiy qaydlar"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"barcha tibbiy qaydlar"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Barcha tibbiy qaydlarni yozish"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Allergiyalar"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"allergiyalar"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Allergiyalarni oʻqish"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Emlash"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"emlash"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Emlash axborotini oʻqish"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Laboratoriya natijalari"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"laboratoriya natijalari"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Laboratoriya natijalarini oʻqish"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Allergiyalar"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"allergiyalar"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Allergiyalarni oʻqish"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Shartlar"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"shartlar"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Shartlarni oʻqish"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vaksinalar"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vaksinalar"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Vaksinalarni oʻqish"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Laboratoriya natijalari"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"laboratoriya natijalari"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Laboratoriya natijalarini oʻqish"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Dori-darmon"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"dori-darmon"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Dorilar axborotini oʻqish"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Shaxsiy maʼlumotlar"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"shaxsiy maʼlumotlar"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Shaxsiy maʼlumotlarni oʻqish"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Amaliyotchi tafsilotlari"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"amaliyotchi tafsilotlari"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Amaliyotchi tafsilotlarini oʻqish"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Homiladorlik"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"homiladorlik"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Homiladorlik axborotini oʻqish"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Muammolar"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"muammolar"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Muammolar axborotini oʻqish"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Muolajalar"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"muolajalar"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Muolajalar axborotini oʻqish"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Ijtimoiy anamnez"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Ijtimoiy anamnez"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"ijtimoiy anamnez"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Ijtimoiy anamnez axborotini oʻqish"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Organizm holati"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Tashriflar"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"tashriflar"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Tashriflarni oʻqish"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Organizm holati"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"organizm holati"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Organizm holati axborotini oʻqish"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Xabardorlik"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Xabardorlik maʼlumotlariga yozish"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ilovasiga oʻqish uchun ruxsat bering"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"“<xliff:g id="APP_NAME">%1$s</xliff:g>” ilovasiga yozish uchun ruxsat bering"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Bekor qilish"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Ruxsat"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Hammasiga ruxsat"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ruxsat berilmasin"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Ilova qanday axborotlarni oʻqishi yoki Health Connectga yozishi mumkinligini tanlang."</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Bu ilova Health Connect xizmatidagi qaysi maʼlumotlarni oʻqishi va yozishi mumkinligini tanlang"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Bu ilova Health Connect xizmatidagi qaysi maʼlumotlarni oʻqishi mumkinligini tanlang"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Ilova Health Connect xizmatiga qaysi maʼlumotlarni yozishi mumkinligini tanlang"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Oʻqishga ruxsat bersangiz, ilova yangi maʼlumotlar va oxirgi 30 kunlik maʼlumotlarni oʻqiy oladi"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Oʻqishga ruxsat bersangiz, ilova yangi va eski maʼlumotlarni oʻqiy oladi"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"<xliff:g id="APP_NAME">%1$s</xliff:g> Health Connectga ulanishiga ruxsat berilsinmi?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi maʼlumotlaringizni qanday qayta ishlashi haqida dastur ishlab chiquvchining <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> orqali tanishishingiz mumkin"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga saqlangan salomatlik va fitnes maʼlumotlaridan foydalanishga ruxsat berilsinmi?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"<xliff:g id="APP_NAME">%1$s</xliff:g> maʼlumotlaringizni qanday ishlatishi haqida <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>da yozilgan"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"maxfiylik siyosati"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"<xliff:g id="APP_NAME">%1$s</xliff:g> tibbiy qaydlarga kirishiga ruxsat berilsinmi?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Agar ruxsat bersangiz, ilova allergiya, laboratoriya natijalari, vaksina va boshqa maʼlumotlarni oʻqishi va yozishi mumkin.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Agar ruxsat bersangiz, ilova allergiya, laboratoriya natijalari, vaksina va boshqa maʼlumotlarni oʻqishi mumkin.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Tibbiy qaydlar haqida"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Data to share includes"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Agar ruxsat bersangiz, <xliff:g id="APP_NAME">%1$s</xliff:g> tibbiy qaydlarni Health Connect xizmatiga ulasha oladi."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Bir joyda saqlash uchun turli ilova va manbalardan tibbiy qaydlaringizni sinxronlang"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Barcha ruxsatlar taqiqlansinmi?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Hammasini tozalash"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connect xizmatidagi axborotlarni oʻqishi yoki yozishi imkonsiz.\n\nBu mazkur ilova oladigan joylashuv, kamera yoki mikrofon kabi boshqa ruxsatlarga taʼsir qilmaydi."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connect maʼlumotlarini, jumladan, oldingi maʼlumotlarni oʻqiy olmaydi yoki yoza olmaydi.\n\nBu ushbu ilova oladigan joylashuv, kamera yoki mikrofon kabi boshqa ruxsatlarga taʼsir qilmaydi."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connect maʼlumotlarini, jumladan, fondagi va oldingi maʼlumotlarni oʻqiy olmaydi yoki yoza olmaydi.\n\nBu ushbu ilova oladigan joylashuv, kamera yoki mikrofon kabi boshqa ruxsatlarga taʼsir qilmaydi."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Health Connect ilovasidan <xliff:g id="APP_NAME">%1$s</xliff:g> maʼlumotlarini oʻchirish"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Barcha ruxsatlar olib tashlansinmi?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Salomatlikka oid barcha ruxsatlar olib tashlansinmi?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Barcha salomatlik va fitnes ruxsatlari olib tashlansinmi?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Health Connect xizmatidan <xliff:g id="APP_NAME">%1$s</xliff:g> saqlagan fitnes maʼlumotlarini ham oʻchirish"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Salomatlikka oid barcha ruxsatlar olib tashlansinmi?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Health Connect xizmatidan <xliff:g id="APP_NAME">%1$s</xliff:g> saqlagan tibbiy qaydlarni ham oʻchirish"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connect xizmatidagi axborotlarni oʻqishi yoki yozishi imkonsiz.\n\nBu ilovaning kamera, mikrofon yoki joylashuv kabi boshqa ruxsatlariga taʼsir qilmaydi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connectdagi bu maʼlumotlarni, jumladan, fondagi maʼlumotlarni oʻqiy olmaydi yoki yoza olmaydi.\n\nBu ilovaning kamera, mikrofon yoki joylashuv kabi boshqa ruxsatlariga taʼsir qilmaydi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connectdagi bu maʼlumotlarni, jumladan, avvalgi maʼlumotlarni oʻqiy olmaydi yoki yoza olmaydi.\n\nBu ilovaning kamera, mikrofon yoki joylashuv kabi boshqa ruxsatlariga taʼsir qilmaydi."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connectdagi bu maʼlumotlarni, jumladan, fondagi va avvalgi maʼlumotlarni oʻqiy olmaydi yoki yoza olmaydi.\n\nBu ilovaning kamera, mikrofon yoki joylashuv kabi boshqa ruxsatlariga taʼsir qilmaydi."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Barcha ruxsatlar olib tashlansinmi?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connect xizmatidagi axborotlarni oʻqishi yoki yozishi imkonsiz.\n\nBu mazkur ilova oladigan joylashuv, kamera yoki mikrofon kabi boshqa ruxsatlarga taʼsir qilmaydi."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connect maʼlumotlarini, jumladan, fondagi maʼlumotlarni oʻqiy olmaydi yoki yoza olmaydi.\n\nBu ushbu ilova oladigan joylashuv, kamera yoki mikrofon kabi boshqa ruxsatlarga taʼsir qilmaydi."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connect maʼlumotlarini, jumladan, oldingi maʼlumotlarni oʻqiy olmaydi yoki yoza olmaydi.\n\nBu ushbu ilova oladigan joylashuv, kamera yoki mikrofon kabi boshqa ruxsatlarga taʼsir qilmaydi."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"Endi <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi Health Connect maʼlumotlarini, jumladan, fondagi va oldingi maʼlumotlarni oʻqiy olmaydi yoki yoza olmaydi.\n\nBu ushbu ilova oladigan joylashuv, kamera yoki mikrofon kabi boshqa ruxsatlarga taʼsir qilmaydi."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Shuningdek, Health Connect xizmatidan <xliff:g id="APP_NAME">%1$s</xliff:g> saqlagan salomatlik va fitnes maʼlumotlari hamda tibbiy qaydlarni oʻchirish"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Bu ilova ruxsatlari olib tashlandi"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Barcha Health Connect maʼlumotlari ham oʻchirib tashlansin"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Keyingi kun"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Tanlangan kun"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Avvalgi kun"</string>
     <string name="default_error" msgid="7966868260616403475">"Nimadir xato ketdi. Qayta urining."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Notanish resurs"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Manba kodi"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Ochiluvchi qavs."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Yopiluvchi qavs."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Maydon <xliff:g id="FIELD">%2$s</xliff:g> Qiymat"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Bu ilovalarda endi ruxsat yoʻq, lekin ularning maʼlumotlari Health Connect ichida saqlanib turadi"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g> sanasidan keyin kiritilgan maʼlumotlarni oʻqishi mumkin"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Bu ilova olishi mumkin boʻlgan boshqa Android ruxsatlarini boshqarish uchun Sozlamalar &gt; Ilovalar rukniga kiring"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Axborotlar <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga ularning maxfiylik siyosati asosida ulashiladi"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi maʼlumotlaringizni qanday qayta ishlashi haqida dastur ishlab chiquvchining maxfiylik siyosati orqali tanishishingz mumkin"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Bu ilova olishi mumkin boʻlgan boshqa Android ruxsatlarini boshqarish uchun Sozlamalar &gt; Ilovalar rukniga kiring"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Maxfiylik siyosatini oʻqish"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Oxirgi 24 soat ichida kirilgan"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Ilovaga ruxsat"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Mos ilovalar oʻrnatilmagan"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Kengaytirilgan ruxsat"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Saqlangan maʼlumotlar, fon rejimi"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Bu ilova uchun qoʻshimcha ruxsatlar olib tashlandi"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Ruxsatlar"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Fitnes va salomatlik"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Mashq, uyqu, ovqatlanish va boshqalar"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Tibbiy qaydlar"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"tibbiy qaydlar"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Laboratoriya, dori, emlash va hokazo"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Laboratoriya, dori, vaksinalar va hokazo"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Ilovadan olingan ruxsatlar"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect <xliff:g id="APP_DATA">%s</xliff:g> ruxsatlarini olib tashladi"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect <xliff:g id="APP_DATA_0">%1$s</xliff:g> va <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> ruxsatlarini olib tashladi"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Google Play Marketni ochish"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Health Connect bilan ishlashni boshlash"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect salomatlik va fitnes maʼlumotlaringizni xavfsiz saqlaydi va qurilmadagi boshqa ilovalarga oson sinxronlash imkonini beradi"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect salomatlik va fitnes axborotlaringizni turli ilovalardan saqlaydi va sinxronlaydi.\n\n"<b>"Fitnes va salomatlik maʼlumotlari,"</b>" jumladan, mashq seanslari, qadamlar, ovqatlanish, uyqu va boshqa maʼlumotlar\n\n"<b>"Tibbiy qaydlar,"</b>" jumladan, vaksinalar, laboratoriya natijalari va boshqalar"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Health Connect yordamida siz quyidagilarni bajara olasiz:"</string>
     <string name="share_data" msgid="3481932156368883946">"Ilovalarga axborot ulashish"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Har bir ilova Health Connect xizmatining qaysi axborotlarni oʻqishi va yozishini tanlang."</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Sozlamalar va maxfiylikni boshqarish"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Kam qon kelishi"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Oʻrtacha qon kelishi"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Koʻp qon kelishi"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Oqim miqdori noaniq"</string>
     <string name="period_day" msgid="3821944462093965882">"Hayz kuni: <xliff:g id="DAY">%1$d</xliff:g>/<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Hayz (1 kun)}other{Hayz (# kun)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Ijobiy"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Salbiy"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Yuqori"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Musiqa"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Boshqa"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Boshqaruvsiz"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Oʻrtacha"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Kuchli"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> d"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> st <xliff:g id="MIN">%2$s</xliff:g> d"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> st"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Integratsiya davom etmoqda"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect ilovasi Android tizimi bilan integratsiya qilinmoqda.\n\nMaʼlumotlaringiz va ruxsatlaringiz uzatilishi biroz vaqt olishi mumkin."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Jarayon tugaganligi haqida bildirishnoma olmaguningizcha ilovani yopmang."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect integratsiyasi davom etmoqda"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Yangilash zarur"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect Android tizimi bilan integratsiya qilinmoqda, shuning uchun siz unga sozlamalaringiz orqali bevosita kirishingiz mumkin."</string>
     <string name="update_button" msgid="4544529019832009496">"Yangilash"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Health Connect tizim sozlamalari bilan integratsiyani davom ettirishi uchun ushbu yangilanishni boshlang"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Hoziroq yangilash"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Tizimni yangilash zarur"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Davom etishdan oldin telefon tizimingizni yangilang"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Agar telefoningiz tizimini allaqachon yangilagan boʻlsangiz, integratsiyani davom etish uchun telefoningizni qayta yoqing"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect yangilanishi kerak"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Davom etishdan oldin Health Connect ilovasini eng oxirgi versiyaga yangilang."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Xotirada koʻproq joy kerak"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect ilovasini integratsiya qilish uchun unga telefoningizdagi xotiradan <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> joy kerak.\n\nTelefoningizda biroz joy oching, keyin qaytadan urining."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Qayta urinish"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Xotiradan joy ochish"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Xotirada koʻproq joy kerak"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect ilovasini integratsiya qilish uchun unga telefoningizdagi xotiradan <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> joy kerak."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Integratsiya pauza qilindi"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Health Connect ilovasi Android tizimi bilan integratsiya qilinayotganda yopildi.\n\nIlovani qayta ochish hamda maʼlumotlar va ruxsatlarni uzatishda davom etish uchun “Davom etish” tugmasini bosing."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Health Connect maʼlumotlaringizni saqlab qolish uchun buni <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ichida tamomlashingiz kerak"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Health Connect ilovasini Android tizimi bilan integratsiya qilishni davom ettirish uchun bosing. Maʼlumotlaringizni saqlab qolish uchun buni <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ichida tamomlashingiz kerak"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Health Connect ilovasini Android tizimi bilan integratsiya qilishni davom ettirish uchun bosing."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Davom etish"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Health Connect integratsiyasini davom ettiring"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Maʼlumotlaringizni saqlab qolish uchun buni <xliff:g id="TIME_NEEDED">%1$s</xliff:g> ichida tamomlashingiz kerak"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Ilovani yangilash zarur"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Health Connect bilan sinxronlashda davom etish uchun <xliff:g id="APP_NAME">%1$s</xliff:g> yangilanishi kerak"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Health Connect bilan sinxronlashda davom etish uchun ayrim ilovalar yangilanishi kerak"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Health Connect bilan sinxronlashda davom etish uchun <xliff:g id="APP_NAME">%1$s</xliff:g> yangilanishi kerak. Yangilanishlar barcha ilovalar uchun chiqmasligi mumkin."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Health Connect bilan sinxronlashda davom etish uchun ayrim ilovalar yangilanishi kerak. Yangilanishlar barcha ilovalar uchun chiqmasligi mumkin."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Yangilanish mavjudligini tekshiring"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Batafsil"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect integratsiyasi"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect integratsiyasi tamomlanmadi"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Qayta ishga tushirilganda sizga bildirishnoma yuboriladi."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"OK"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect integratsiyasi tamomlanmadi"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Batafsil"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect integratsiya tamomlandi"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Ochish"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Nima yangiliklar"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Endi Health Connect ilovasidan bevosita sozlamalar orqali foydalanishingiz mumkin. Xotirada joy ochish uchun istalgan vaqt Health Connect ilovasini oʻchirib tashlash mumkin."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"OK"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Ilova manbalarini tahrirlash"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Qurilma standarti"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Ilovaga tegishli maʼlumotlar"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Health Connect xizmatiga ruxsati bor ilovalar axboroti shu yerda chiqadi"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"<xliff:g id="APP_NAME">%1$s</xliff:g> maʼlumotlari shu yerda chiqadi"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Health Connect xizmatiga ruxsati bor ilovalar axboroti shu yerda chiqadi"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Kun"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Hafta"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Oy"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Avvalgi oy"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Maʼlumotlar kiritish"</string>
     <string name="tab_access" msgid="7818197975407243701">"Ruxsat"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun qoʻshimcha ruxsat berilsinmi?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> ham ushbu Health Connect sozlamalariga kirishni xohlaydi"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Bu ilovaga orqa fonda yoki avvalgi maʼlumotlarga kirishga ruxsat berish uchun kamida bitta oʻqish ruxsatini faollashtiring"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Bu ilovaga fon rejimida ruxsat berish uchun kamida bitta oʻqish ruxsatini faollashtiring"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Bu ilovaga avvalgi maʼlumotlarga kirishga ruxsat berish uchun kamida bitta oʻqish ruxsatini faollashtiring"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Health Connect ishlatishni boshlash"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Salomatlik va fitnes maʼlumotlarni oʻzaro ulashadigan ilk ilovalaringizni sinxronlang"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Sozlash"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Mos ilovalar"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Health Connect orqali <xliff:g id="APP_NAME">%s</xliff:g> bilan sinxronlash uchun boshqa ilovalar toping"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"App Store orqali koʻrish"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Ekran qulfini sozlash"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Salomatlik maʼlumotlarini yanada yaxshi himoyalash uchun bu qurilmada PIN kod, grafik kalit yoki parolni sozlang."</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Ekran qulfini sozlash"</string>
     <string name="select_all" msgid="837499881590001166">"Hammasini tanlash"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Ulangan ilovalar keyin Health Connect xizmatidan ushbu axborotni ololmaydi"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Belgilandi"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Tanlanmagan"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Mashq marshruti xaritasi mavjud"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Keyingi kun"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Keyingi hafta"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Keyingi oy"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Avvalgi kun"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Avvalgi hafta"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Avvalgi oy"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Barcha maʼlumotlar butunlay oʻchirilsinmi?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Tanlangan maʼlumotlar butunlay oʻchirib tashlansinmi?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Barcha <xliff:g id="APP_NAME">%s</xliff:g> maʼlumotlari oʻchirib tashlansinmi?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g> haftasidagi tanlangan <xliff:g id="APP_NAME">%1$s</xliff:g> yozuvlari oʻchirib tashlansinmi?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>dagi tanlangan <xliff:g id="APP_NAME">%1$s</xliff:g> yozuvlari butunlay oʻchirib tashlansinmi?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Bu <xliff:g id="APP_NAME">%s</xliff:g> yozuvi butunlay oʻchirib tashlansinmi?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"<xliff:g id="APP_NAME">%2$s</xliff:g> ilovasi uchun <xliff:g id="DATA_TYPE">%1$s</xliff:g> maʼlumotlari butunlay oʻchirib tashlansinmi?"</string>
+    <string name="on" msgid="8266542510798355807">"Yoniq"</string>
+    <string name="off" msgid="6996623844428550649">"Oʻchiq"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Kirilgan: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Kecha kirilgan: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Kirilgan: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Har doim ruxsat"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Belgilanganlarga ruxsat berish"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Bu ilova ishlatilayotganida"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Barchasini rad etish"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga saqlangan salomatlik va fitnes maʼlumotlaridan foydalanishga ruxsat berilsinmi?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DATA_TYPES">%2$s</xliff:g> uchun ruxsat olmoqchi.\n\nHammasiga ruxsat bering yoki ularni alohida boshqaring."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga <xliff:g id="DATA_TYPE">%2$s</xliff:g> qurilmasidan foydalanishga ruxsat berilsinmi?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Fitnes va salomatlik"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"doimiy"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"ilova ishlatilganda"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Doimiy"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Ilova ishlatilganda"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi salomatlik va fitnes maʼlumotlaridan <xliff:g id="ALLOW_MODE">%2$s</xliff:g> foydalanishi mumkin"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Ruxsat berilgan"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Oʻqishga ruxsat berilgan"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Bunday ruxsatlar <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga qurilma sensorlaridagi axborotlardan foydalanish imkonini beradi."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Ruxsat berilgan ilovalar: <xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="OTHER_NUMBER">%2$d</xliff:g>"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Ilovalar ruxsat soʻramagan"</string>
+    <string name="allowed" msgid="4158456017482263737">"Ruxsat berilgan"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Ruxsat berilmagan"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Bunday ruxsatga ega ilovalar qurilma sensorlaridagi quyidagi axborotlardan foydalana oladi: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Soatdagi barcha ilovalarga quyidagi axborotlardan foydalanish ruxsati yopilsinmi: <xliff:g id="DATA_TYPE">%s</xliff:g>?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Tanlov belgisi"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Xoch belgisi"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Hozirda <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi salomatlik va fitnes maʼlumotlaridan <xliff:g id="ALLOW_MODE">%2$s</xliff:g> foydalanishi mumkin"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga har doim fitnes va salomatlik axborotidan foydalanishga ruxsat berilsinmi?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasining bunga ruxsati bor: <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Fitnes va salomatlik ruxsatlarini boshqarish"</string>
 </resources>
diff --git a/apk/res/values-vi/strings.xml b/apk/res/values-vi/strings.xml
index a1ed0f3..2b036fd 100644
--- a/apk/res/values-vi/strings.xml
+++ b/apk/res/values-vi/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Quản lý dữ liệu về sức khoẻ và hoạt động thể dục trên thiết bị của bạn, đồng thời kiểm soát ứng dụng nào có thể truy cập vào dữ liệu đó"</string>
     <string name="data_title" msgid="4456619761533380816">"Dữ liệu và quyền truy cập"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Duyệt xem hồ sơ sức khoẻ"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Xem hồ sơ sức khoẻ và các ứng dụng có thể truy cập vào hồ sơ đó"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Tất cả các danh mục"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Xem tất cả các danh mục"</string>
     <string name="no_data" msgid="1906986019249068659">"Không có dữ liệu"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Hôm qua"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Đọc: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Ghi: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Quản lý quyền"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Thời gian: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Hoạt động"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"truy cập vào dữ liệu sức khoẻ của bạn"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Đọc dữ liệu về lượng calo đã đốt cháy"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Cho phép ứng dụng đọc dữ liệu về lượng calo đã đốt cháy"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Truy cập vào dữ liệu ở chế độ nền"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào dữ liệu ở chế độ nền?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào dữ liệu ở chế độ nền?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào dữ liệu về sức khoẻ thể chất và tinh thần cũng như hồ sơ sức khoẻ khi bạn không dùng ứng dụng."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào hồ sơ sức khoẻ khi bạn không dùng ứng dụng."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào dữ liệu về sức khoẻ thể chất và tinh thần khi bạn không dùng ứng dụng."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào dữ liệu trên Health Connect khi bạn không dùng ứng dụng."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào dữ liệu trước đây?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào dữ liệu về sức khoẻ thể chất và tinh thần được thêm vào trước ngày <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào mọi dữ liệu trước đây về sức khoẻ thể chất và tinh thần."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào dữ liệu trên Health Connect được thêm vào trước ngày <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào mọi dữ liệu trước đây trên Health Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Cấp thêm quyền cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"<xliff:g id="APP_NAME">%1$s</xliff:g> cũng muốn truy cập vào các chế độ cài đặt này trên Health Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Truy cập vào mọi dữ liệu ở chế độ nền"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Truy cập vào hồ sơ sức khoẻ ở chế độ nền"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Truy cập vào dữ liệu về sức khoẻ thể chất và tinh thần ở chế độ nền"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Cho phép ứng dụng này truy cập vào dữ liệu về sức khoẻ thể chất và tinh thần cũng như hồ sơ sức khoẻ khi bạn không dùng ứng dụng"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Cho phép ứng dụng này truy cập vào dữ liệu này khi bạn không dùng ứng dụng"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Cho phép ứng dụng này truy cập vào dữ liệu này khi bạn không dùng ứng dụng"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Truy cập vào dữ liệu ở chế độ nền"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Cho phép ứng dụng này truy cập vào dữ liệu trên Health Connect khi bạn không dùng ứng dụng"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Truy cập vào dữ liệu trước đây về sức khoẻ thể chất và tinh thần"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Cho phép ứng dụng này truy cập vào dữ liệu được thêm vào trước ngày <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Cho phép ứng dụng này truy cập vào mọi dữ liệu trước đây"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Truy cập vào dữ liệu trước đây"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Cho phép ứng dụng này truy cập vào dữ liệu trên Health Connect được thêm vào trước ngày <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Cho phép ứng dụng này truy cập vào mọi dữ liệu trước đây trên Health Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"<xliff:g id="APP_NAME">%1$s</xliff:g> đã có thể truy cập vào dữ liệu trước đây trong hồ sơ sức khoẻ của bạn"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Đọc thêm về các quyền"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Truy cập vào mọi dữ liệu ở chế độ nền"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Truy cập vào hồ sơ sức khoẻ ở chế độ nền"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Truy cập vào dữ liệu về sức khoẻ thể chất và tinh thần ở chế độ nền"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Cho phép ứng dụng này truy cập vào dữ liệu về sức khoẻ thể chất và tinh thần cũng như hồ sơ sức khoẻ khi bạn không dùng ứng dụng"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Cho phép ứng dụng này truy cập vào dữ liệu này khi bạn không dùng ứng dụng"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Cho phép ứng dụng này truy cập vào dữ liệu này khi bạn không dùng ứng dụng"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Truy cập vào dữ liệu ở chế độ nền"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Cho phép ứng dụng này truy cập vào dữ liệu trên Health Connect khi bạn không dùng ứng dụng"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Truy cập vào dữ liệu trước đây về sức khoẻ thể chất và tinh thần"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Cho phép ứng dụng này truy cập vào dữ liệu được thêm vào trước ngày <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Cho phép ứng dụng này truy cập vào mọi dữ liệu trước đây"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Truy cập vào dữ liệu trước đây"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Cho phép ứng dụng này truy cập vào dữ liệu trên Health Connect được thêm vào trước ngày <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Cho phép ứng dụng này truy cập vào mọi dữ liệu trước đây trên Health Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Không có dữ liệu nào về sức khoẻ thể chất đang được đọc vì <xliff:g id="APP_NAME">%1$s</xliff:g> không có quyền đọc"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"<xliff:g id="APP_NAME">%1$s</xliff:g> đã có thể truy cập vào dữ liệu trước đây trong hồ sơ sức khoẻ của bạn. Để thay đổi chế độ này, hãy tắt quyền đối với hồ sơ sức khoẻ cho ứng dụng này"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Quản lý quyền đối với hồ sơ sức khoẻ"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Cần cấp ít nhất một quyền đọc để bật quyền truy cập khi ở nền sau hoặc quyền truy cập vào dữ liệu trước đây của ứng dụng"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Cần cấp ít nhất một quyền đọc để bật quyền truy cập khi ở nền sau của ứng dụng"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Cần cấp ít nhất một quyền đọc để bật quyền truy cập vào dữ liệu trước đây của ứng dụng"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Cho phép ứng dụng này truy cập vào mọi dữ liệu trước đây trên Health Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Cho phép ứng dụng này truy cập vào dữ liệu trên Health Connect khi bạn không dùng ứng dụng"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào dữ liệu trên Health Connect khi bạn không dùng ứng dụng."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Truy cập vào dữ liệu trước đây"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào dữ liệu trước đây?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Cho phép ứng dụng này truy cập vào dữ liệu trên Health Connect được thêm vào trước <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Cho phép ứng dụng này truy cập vào tất cả dữ liệu trước đây của Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào dữ liệu trên Health Connect được thêm vào trước ngày <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Nếu bạn cho phép, ứng dụng này có thể truy cập vào tất cả dữ liệu trước đây của Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Lượng calo đã đốt cháy khi vận động"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"lượng calo đã đốt cháy khi vận động"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Đọc dữ liệu về lượng calo hoạt động đã đốt cháy"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"số lần đẩy xe lăn"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Đọc dữ liệu về số lần đẩy xe lăn"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Ghi dữ liệu về số lần đẩy xe lăn"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Dữ liệu về cường độ hoạt động"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"dữ liệu về cường độ hoạt động"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Đọc dữ liệu về cường độ hoạt động"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Ghi dữ liệu về cường độ hoạt động"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Tỷ lệ trao đổi chất cơ bản"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"tỷ lệ trao đổi chất cơ bản"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Đọc dữ liệu về tỷ lệ trao đổi chất cơ bản"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"nhiệt độ trên da"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Đọc dữ liệu về nhiệt độ trên da"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Ghi dữ liệu về nhiệt độ trên da"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Dữ liệu này bao gồm mọi hồ sơ sức khoẻ đã được đồng bộ hoá và thêm vào Health Connect. Đây có thể không phải là hồ sơ y tế đầy đủ và không bao gồm nội dung mô tả y tế về hồ sơ sức khoẻ của bạn."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Tất cả hồ sơ sức khoẻ"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"tất cả hồ sơ sức khoẻ"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Ghi tất cả hồ sơ sức khoẻ"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Dị ứng"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"dị ứng"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Đọc dữ liệu về tình trạng dị ứng"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Dữ liệu tiêm chủng"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"dữ liệu tiêm chủng"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Đọc dữ liệu tiêm chủng"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Kết quả xét nghiệm"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"kết quả xét nghiệm"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Đọc kết quả xét nghiệm"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Dị ứng"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"dị ứng"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Đọc dữ liệu về tình trạng dị ứng"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Tình trạng bệnh"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"tình trạng bệnh"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Đọc dữ liệu về tình trạng bệnh"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Vắc-xin"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"vắc-xin"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Đọc dữ liệu về vắc-xin"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Kết quả xét nghiệm"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"kết quả xét nghiệm"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Đọc kết quả xét nghiệm"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Thuốc"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"thuốc"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Đọc dữ liệu về thuốc"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Thông tin cá nhân"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"thông tin cá nhân"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Đọc thông tin cá nhân"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Thông tin về chuyên gia"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"thông tin về chuyên gia"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Đọc thông tin về chuyên gia"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Thai kỳ"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"thai kỳ"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Đọc dữ liệu về thai kỳ"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Tình trạng bệnh"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"tình trạng bệnh"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Đọc dữ liệu về tình trạng bệnh"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Thủ thuật y tế"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"thủ thuật y tế"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Đọc dữ liệu về thủ thuật y tế"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Hoạt động trên mạng xã hội"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Hoạt động trên mạng xã hội"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"hoạt động trên mạng xã hội"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Đọc dữ liệu về hoạt động trên mạng xã hội"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Dấu hiệu sinh tồn"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Hoạt động thăm khám"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"hoạt động thăm khám"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Đọc dữ liệu về hoạt động thăm khám"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Dấu hiệu sinh tồn"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"dấu hiệu sinh tồn"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Đọc dữ liệu về các dấu hiệu sinh tồn"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Chánh niệm"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Ghi dữ liệu về buổi tập chánh niệm"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Cho phép \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" đọc dữ liệu"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Cho phép \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ghi dữ liệu"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Huỷ"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Cho phép"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Cho phép tất cả"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Không cho phép"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Chọn dữ liệu bạn muốn ứng dụng này đọc hoặc ghi vào Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Chọn dữ liệu bạn muốn ứng dụng này đọc hoặc ghi vào Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Chọn dữ liệu bạn muốn ứng dụng này đọc từ Health Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Chọn dữ liệu bạn muốn ứng dụng này ghi vào Health Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Nếu bạn cấp quyền đọc, ứng dụng này có thể đọc dữ liệu mới và dữ liệu trong 30 ngày qua"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Nếu bạn cấp quyền đọc, ứng dụng này có thể đọc dữ liệu mới và dữ liệu trước đây"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Bạn có thể tìm hiểu cách <xliff:g id="APP_NAME">%1$s</xliff:g> xử lý dữ liệu của bạn trong <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> của nhà phát triển"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào dữ liệu về sức khoẻ thể chất và tinh thần?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Bạn có thể tìm hiểu cách <xliff:g id="APP_NAME">%1$s</xliff:g> xử lý dữ liệu của bạn trong <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> của họ"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"chính sách quyền riêng tư"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào hồ sơ sức khoẻ của bạn?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Nếu bạn cấp quyền truy cập, ứng dụng này có thể đọc và ghi dữ liệu như tình trạng dị ứng, kết quả xét nghiệm, vắc-xin và nhiều dữ liệu khác\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Nếu bạn cấp quyền truy cập, ứng dụng này có thể đọc dữ liệu như tình trạng dị ứng, kết quả xét nghiệm, vắc-xin và nhiều dữ liệu khác\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Giới thiệu về hồ sơ sức khoẻ"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Dữ liệu cần chia sẻ bao gồm"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Nếu bạn cho phép, <xliff:g id="APP_NAME">%1$s</xliff:g> có thể chia sẻ hồ sơ sức khoẻ của bạn với Health Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Đồng bộ hoá hồ sơ sức khoẻ từ nhiều nguồn và ứng dụng để lưu trữ hồ sơ ở cùng một nơi"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Xoá tất cả các quyền?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Xoá tất cả"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi bất kỳ dữ liệu nào từ Health Connect nữa.\n\nĐiều này không ảnh hưởng đến các quyền khác mà ứng dụng này có thể có, chẳng hạn như camera, micrô hoặc thông tin vị trí."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi bất kỳ dữ liệu nào từ Health Connect được nữa.\n\nĐiều này không ảnh hưởng đến những quyền khác mà ứng dụng này có thể có (chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô)."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi bất kỳ dữ liệu nào từ Health Connect được nữa, kể cả dữ liệu nền và dữ liệu trước đây.\n\nĐiều này không ảnh hưởng đến những quyền khác mà ứng dụng này có thể có (chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô)."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Đồng thời xoá dữ liệu của <xliff:g id="APP_NAME">%1$s</xliff:g> khỏi Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Xoá tất cả các quyền?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Xoá tất cả các quyền đối với hồ sơ sức khoẻ?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Xoá mọi quyền sử dụng dữ liệu về thể dục và sức khoẻ?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Đồng thời xoá dữ liệu về hoạt động thể dục của <xliff:g id="APP_NAME">%1$s</xliff:g> khỏi Health Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Xoá tất cả các quyền đối với hồ sơ sức khoẻ?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Đồng thời xoá hồ sơ sức khoẻ của <xliff:g id="APP_NAME">%1$s</xliff:g> khỏi Health Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi dữ liệu này từ Health Connect nữa.\n\nĐiều này không ảnh hưởng đến các quyền khác mà ứng dụng này có thể có, chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi dữ liệu này từ Health Connect nữa, kể cả dữ liệu nền.\n\nĐiều này không ảnh hưởng đến những quyền khác mà ứng dụng này có thể có, chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi dữ liệu này từ Health Connect nữa, kể cả dữ liệu trước đây.\n\nĐiều này không ảnh hưởng đến những quyền khác mà ứng dụng này có thể có, chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi dữ liệu này từ Health Connect nữa, kể cả dữ liệu nền và dữ liệu trước đây.\n\nĐiều này không ảnh hưởng đến những quyền khác mà ứng dụng này có thể có, chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Xoá tất cả các quyền?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi dữ liệu từ Health Connect nữa.\n\nĐiều này không ảnh hưởng đến các quyền khác mà ứng dụng này có thể có, chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi dữ liệu từ Health Connect nữa, kể cả dữ liệu nền.\n\nĐiều này không ảnh hưởng đến những quyền khác mà ứng dụng này có thể có, chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi dữ liệu từ Health Connect nữa, kể cả dữ liệu trước đây.\n\nĐiều này không ảnh hưởng đến những quyền khác mà ứng dụng này có thể có, chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"<xliff:g id="APP_NAME">%1$s</xliff:g> sẽ không thể đọc hoặc ghi dữ liệu từ Health Connect nữa, kể cả dữ liệu nền và dữ liệu trước đây.\n\nĐiều này không ảnh hưởng đến những quyền khác mà ứng dụng này có thể có, chẳng hạn như quyền truy cập thông tin vị trí, camera hoặc micrô."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Đồng thời xoá dữ liệu về hoạt động thể dục và hồ sơ sức khoẻ của <xliff:g id="APP_NAME">%1$s</xliff:g> khỏi Health Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Đã xoá quyền của ứng dụng này"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Đồng thời xoá mọi dữ liệu trên Health Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Ngày tiếp theo"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Ngày đã chọn"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Ngày hôm trước"</string>
     <string name="default_error" msgid="7966868260616403475">"Đã xảy ra lỗi. Vui lòng thử lại."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Tài nguyên không xác định"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Dữ liệu nguồn"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Dấu ngoặc mở."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Dấu ngoặc đóng."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Giá trị trường <xliff:g id="FIELD">%2$s</xliff:g>"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Các ứng dụng này không còn quyền truy cập nhưng vẫn có dữ liệu được lưu trữ trong Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"<xliff:g id="APP_NAME">%1$s</xliff:g> có thể đọc dữ liệu được thêm sau ngày <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Để quản lý các quyền khác trên Android mà ứng dụng này có thể truy cập, hãy chuyển đến phần Cài đặt &gt; Ứng dụng"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Dữ liệu bạn chia sẻ với <xliff:g id="APP_NAME">%1$s</xliff:g> sẽ tuân theo chính sách quyền riêng tư của ứng dụng đó"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Bạn có thể tìm hiểu cách <xliff:g id="APP_NAME">%1$s</xliff:g> xử lý dữ liệu của bạn trong chính sách bảo mật của nhà phát triển"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Để quản lý các quyền khác trên Android mà ứng dụng này có thể truy cập, hãy chuyển đến phần Cài đặt, sau đó nhấn vào Ứng dụng"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Đọc chính sách quyền riêng tư"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Đã truy cập trong 24 giờ qua"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Quyền truy cập của ứng dụng"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Hiện bạn chưa cài đặt ứng dụng nào tương thích"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Quyền truy cập bổ sung"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Dữ liệu trước đây, dữ liệu nền"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Đã xoá các quyền bổ sung của ứng dụng này"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Quyền"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Sức khoẻ thể chất và tinh thần"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Bài tập, giấc ngủ, dinh dưỡng, v.v."</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Hồ sơ sức khoẻ"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"hồ sơ sức khoẻ"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Kết quả xét nghiệm, thuốc, t.chủng, v.v."</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Kết quả xét nghiệm, thuốc, vắc-xin, v.v."</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Đã xoá quyền cho ứng dụng"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect đã xoá quyền cho <xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect đã xoá quyền cho <xliff:g id="APP_DATA_0">%1$s</xliff:g> và <xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Chuyển tới Cửa hàng Play"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Làm quen với Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"Health Connect lưu trữ dữ liệu về sức khoẻ và hoạt động thể dục của bạn, qua đó mang lại cho bạn một cách đơn giản để đồng bộ hoá nhiều ứng dụng trên thiết bị"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"Health Connect lưu trữ và đồng bộ hoá dữ liệu về sức khoẻ và hoạt động thể dục của bạn từ nhiều ứng dụng.\n\n"<b>"Dữ liệu về sức khoẻ thể chất và tinh thần,"</b>" bao gồm dữ liệu về buổi tập thể dục, số bước, chế độ dinh dưỡng, giấc ngủ và nhiều dữ liệu khác\n\n"<b>"Hồ sơ sức khoẻ,"</b>" bao gồm dữ liệu về vắc-xin, kết quả xét nghiệm và nhiều dữ liệu khác"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"Với Health Connect, bạn có thể"</string>
     <string name="share_data" msgid="3481932156368883946">"Chia sẻ dữ liệu với ứng dụng"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Chọn dữ liệu mà mỗi ứng dụng có thể đọc hoặc ghi vào Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Quản lý chế độ cài đặt và quyền riêng tư"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Ra máu ít"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Ra máu vừa phải"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Ra máu nhiều"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Lượng máu kinh không xác định"</string>
     <string name="period_day" msgid="3821944462093965882">"Ngày <xliff:g id="DAY">%1$d</xliff:g>/<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> trong kỳ kinh nguyệt"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Kỳ kinh nguyệt (1 ngày)}other{Kỳ kinh nguyệt (# ngày)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Có khả năng thụ thai"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Không có khả năng thụ thai"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Khả năng thụ thai cao"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Nghe nhạc"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Khác"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Không có hướng dẫn"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Vừa"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Mạnh"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> phút"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> giờ <xliff:g id="MIN">%2$s</xliff:g> phút"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> giờ"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Đang trong quá trình tích hợp"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Đang tích hợp Health Connect với hệ thống Android.\n\nCó thể mất chút thời gian để chuyển các quyền cũng như dữ liệu của bạn."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Đừng đóng ứng dụng cho đến khi bạn nhận được một thông báo cho biết quá trình đã hoàn tất."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Đang trong quá trình tích hợp Health Connect"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Cần cập nhật"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Đang tích hợp Health Connect với hệ thống Android để bạn có thể truy cập Health Connect ngay trong phần cài đặt"</string>
     <string name="update_button" msgid="4544529019832009496">"Cập nhật"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Hãy bắt đầu cập nhật để Health Connect có thể tiếp tục tích hợp với các chế độ cài đặt của hệ thống"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Cập nhật ngay"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Cần cập nhật hệ thống"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Trước khi tiếp tục, hãy cập nhật hệ thống cho điện thoại của bạn."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Nếu đã cập nhật hệ thống cho điện thoại của bạn, hãy thử khởi động lại điện thoại để tiếp tục tích hợp"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Cần cập nhật Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Trước khi tiếp tục, hãy cập nhật ứng dụng Health Connect lên phiên bản mới nhất."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Cần thêm dung lượng lưu trữ"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect cần <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> dung lượng lưu trữ trên điện thoại của bạn để có thể tiếp tục tích hợp.\n\nHãy giải phóng thêm dung lượng trên điện thoại rồi thử lại."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Thử lại"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Giải phóng dung lượng"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Cần thêm dung lượng lưu trữ"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect cần <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> dung lượng lưu trữ trên điện thoại của bạn để có thể tiếp tục tích hợp."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Đã tạm dừng tích hợp"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"Ứng dụng Health Connect đã bị đóng trong quá trình tích hợp với hệ thống Android.\n\nHãy nhấp vào tiếp tục để mở lại ứng dụng này và tiếp tục chuyển các quyền cũng như dữ liệu của bạn."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Để duy trì dữ liệu Health Connect, hãy hoàn tất quá trình này trong vòng <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Hãy nhấn để tiếp tục tích hợp Health Connect với hệ thống Android Để duy trì dữ liệu của bạn, hãy hoàn tất trong vòng <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Hãy nhấn để tiếp tục tích hợp Health Connect với hệ thống Android"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Tiếp tục"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Tiếp tục tích hợp Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Để duy trì dữ liệu của bạn, hãy hoàn tất trong vòng <xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Cần cập nhật ứng dụng"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"Bạn cần cập nhật <xliff:g id="APP_NAME">%1$s</xliff:g> để tiếp tục quá trinhf đồng bộ hoá với Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Bạn cần cập nhật một số ứng dụng để tiếp tục quá trình đồng bộ hoá với Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"Bạn cần cập nhật <xliff:g id="APP_NAME">%1$s</xliff:g> để tiếp tục quá trình đồng bộ hoá với Health Connect. Chỉ một số ứng dụng có bản cập nhật."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Bạn cần cập nhật một số ứng dụng để tiếp tục quá trình đồng bộ hoá với Health Connect. Chỉ một số ứng dụng có bản cập nhật."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Kiểm tra để tìm bản cập nhật"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Tìm hiểu thêm"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Tích hợp Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Chưa tích hợp xong Health Connect"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Bạn sẽ nhận được thông báo khi quá trình tích hợp có thể tiếp tục."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Tôi hiểu"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Chưa tích hợp xong Health Connect"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Đọc thêm"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Đã tích hợp xong Health Connect"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Mở"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Tính năng mới"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Giờ đây, bạn có thể truy cập Health Connect ngay trong phần cài đặt. Gỡ cài đặt ứng dụng Health Connect bất cứ lúc nào để giải phóng không gian lưu trữ."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Tôi hiểu"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Chỉnh sửa nguồn ứng dụng"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Theo chế độ cài đặt mặc định của thiết bị"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Dữ liệu ứng dụng"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Dữ liệu của các ứng dụng có quyền truy cập vào Health Connect sẽ xuất hiện ở đây"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Dữ liệu của <xliff:g id="APP_NAME">%1$s</xliff:g> sẽ xuất hiện tại đây"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Dữ liệu của các ứng dụng có quyền truy cập vào Health Connect sẽ xuất hiện ở đây"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Ngày"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Tuần"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Tháng"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Tháng trước"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Mục nhập"</string>
     <string name="tab_access" msgid="7818197975407243701">"Quyền truy cập"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Cấp thêm quyền cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> cũng muốn truy cập vào các chế độ cài đặt này trên Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Cần cấp ít nhất một quyền đọc để bật quyền truy cập khi ở nền sau hoặc quyền truy cập vào dữ liệu trước đây của ứng dụng"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Cần cấp ít nhất một quyền đọc để bật quyền truy cập khi ở nền sau của ứng dụng"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Cần cấp ít nhất một quyền đọc để bật quyền truy cập vào dữ liệu trước đây của ứng dụng"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Bắt đầu sử dụng Health Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Hãy đồng bộ hoá những ứng dụng đầu tiên của bạn để chia sẻ dữ liệu về sức khoẻ và hoạt động thể dục giữa những ứng dụng đó"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Thiết lập"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Xem các ứng dụng tương thích"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Tìm các ứng dụng khác để đồng bộ hoá với <xliff:g id="APP_NAME">%s</xliff:g> qua Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Xem trên cửa hàng ứng dụng"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Đặt một phương thức khoá màn hình"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Để tăng cường bảo mật cho dữ liệu sức khoẻ của bạn, hãy đặt mã PIN, hình mở khoá hoặc mật khẩu cho thiết bị này"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Đặt phương thức khoá màn hình"</string>
     <string name="select_all" msgid="837499881590001166">"Chọn tất cả"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Các ứng dụng đã kết nối sẽ không thể đọc dữ liệu này từ Health Connect nữa"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Đã đánh dấu"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Chưa chọn"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Có tuyến đường tập thể dục trên bản đồ"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Ngày tiếp theo"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Tuần tiếp theo"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Tháng tiếp theo"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Ngày trước"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Tuần trước"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Tháng trước"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Xoá vĩnh viễn toàn bộ dữ liệu?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Xoá vĩnh viễn dữ liệu đã chọn?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Xoá vĩnh viễn toàn bộ dữ liệu trên <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Xoá vĩnh viễn các mục đã chọn trên <xliff:g id="APP_NAME">%1$s</xliff:g> trong tuần từ ngày <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Xoá vĩnh viễn các mục đã chọn trên <xliff:g id="APP_NAME">%1$s</xliff:g> trong tháng <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Xoá vĩnh viễn mục này trên <xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Xoá vĩnh viễn dữ liệu <xliff:g id="DATA_TYPE">%1$s</xliff:g> cho <xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Đang bật"</string>
+    <string name="off" msgid="6996623844428550649">"Đang tắt"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Truy cập lúc <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Truy cập hôm qua lúc <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Truy cập lúc <xliff:g id="TIME_DATE_1">%2$s</xliff:g> ngày <xliff:g id="TIME_DATE_0">%1$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Luôn cho phép"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Cho phép quyền đã chọn"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Trong khi dùng ứng dụng"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Từ chối tất cả"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào dữ liệu về sức khoẻ và hoạt động thể dục?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền truy cập vào <xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nChọn cho phép tất cả hoặc kiểm soát từng quyền."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào <xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Sức khoẻ và hoạt động thể dục"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"mọi lúc"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"khi đang sử dụng"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Mọi lúc"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Khi đang sử dụng"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="APP_NAME">%1$s</xliff:g> có thể truy cập vào tất cả dữ liệu về sức khoẻ và hoạt động thể dục của bạn <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Được phép truy cập"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Được phép đọc"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Những quyền này cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào dữ liệu từ các cảm biến trên thiết bị của bạn."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"Đã cho phép <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ứng dụng"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Không có ứng dụng nào đang yêu cầu"</string>
+    <string name="allowed" msgid="4158456017482263737">"Được phép"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Không được phép"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Các ứng dụng được cấp quyền này có thể truy cập vào dữ liệu <xliff:g id="DATA_TYPE">%s</xliff:g> từ các cảm biến trên thiết bị của bạn."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Xoá quyền truy cập vào <xliff:g id="DATA_TYPE">%s</xliff:g> cho mọi ứng dụng trên đồng hồ của bạn?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Dấu kiểm"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Dấu gạch chéo"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Hiện tại, <xliff:g id="APP_NAME">%1$s</xliff:g> có thể truy cập vào dữ liệu về sức khoẻ và hoạt động thể dục <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Cho phép <xliff:g id="APP_NAME">%1$s</xliff:g> truy cập vào dữ liệu về sức khoẻ và hoạt động thể dục của bạn mọi lúc?"</string>
+    <string name="current_access" msgid="1457167070428176139">"<xliff:g id="APP_NAME">%1$s</xliff:g> có quyền truy cập vào <xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Quản lý quyền đối với dữ liệu về sức khoẻ và hoạt động thể dục"</string>
 </resources>
diff --git a/apk/res/values-watch/colors.xml b/apk/res/values-watch/colors.xml
new file mode 100644
index 0000000..81d0459
--- /dev/null
+++ b/apk/res/values-watch/colors.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <!-- Copied from wearable support -->
+    <color name="circular_button_disabled">#757575</color>
+</resources>
diff --git a/apk/res/values-watch/donottranslate.xml b/apk/res/values-watch/donottranslate.xml
new file mode 100644
index 0000000..309c513
--- /dev/null
+++ b/apk/res/values-watch/donottranslate.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- font-family-device-default is expected to be preloaded in the font_customization.xml(/vendor/<OEM>/products/<PRODUCT>/fonts/fonts_customization.xml)-->
+    <!-- Falls back to system default when font-family-device-default doesn't exist    -->
+    <string name="wear_material_compose_display_1_font_family">font-family-device-default</string>
+    <string name="wear_material_compose_display_2_font_family">font-family-device-default</string>
+    <string name="wear_material_compose_display_3_font_family">font-family-device-default</string>
+    <string name="wear_material_compose_title_1_font_family">font-family-medium-device-default</string>
+    <string name="wear_material_compose_title_2_font_family">font-family-medium-device-default</string>
+    <string name="wear_material_compose_title_3_font_family">font-family-device-default</string>
+    <string name="wear_material_compose_body_1_font_family">font-family-text-device-default</string>
+    <string name="wear_material_compose_body_2_font_family">font-family-text-device-default</string>
+    <string name="wear_material_compose_button_font_family">font-family-text-medium-device-default</string>
+    <string name="wear_material_compose_caption_1_font_family">font-family-text-medium-device-default</string>
+    <string name="wear_material_compose_caption_2_font_family">font-family-text-medium-device-default</string>
+    <string name="wear_material_compose_caption_3_font_family">font-family-text-medium-device-default</string>
+
+    <string name="wear_compose_material3_arc_small_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_arc_medium_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_arc_large_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_body_extra_small_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_body_small_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_body_medium_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_body_large_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_display_small_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_display_medium_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_display_large_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_label_small_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_label_medium_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_label_large_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_numeral_extra_small_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_numeral_small_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_numeral_medium_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_numeral_large_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_numeral_extra_large_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_title_small_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_title_medium_font_family">font-family-flex-device-default</string>
+    <string name="wear_compose_material3_title_large_font_family">font-family-flex-device-default</string>
+
+    <dimen name="wear_compose_material3_arc_small_font_size">14</dimen>
+    <dimen name="wear_compose_material3_arc_medium_font_size">15</dimen>
+    <dimen name="wear_compose_material3_arc_large_font_size">20</dimen>
+    <dimen name="wear_compose_material3_body_extra_small_font_size">10</dimen>
+    <dimen name="wear_compose_material3_body_small_font_size">12</dimen>
+    <dimen name="wear_compose_material3_body_medium_font_size">14</dimen>
+    <dimen name="wear_compose_material3_body_large_font_size">16</dimen>
+    <dimen name="wear_compose_material3_display_small_font_size">24</dimen>
+    <dimen name="wear_compose_material3_display_medium_font_size">30</dimen>
+    <dimen name="wear_compose_material3_display_large_font_size">40</dimen>
+    <dimen name="wear_compose_material3_label_small_font_size">13</dimen>
+    <dimen name="wear_compose_material3_label_medium_font_size">15</dimen>
+    <dimen name="wear_compose_material3_label_large_font_size">20</dimen>
+    <dimen name="wear_compose_material3_numeral_extra_small_font_size">24</dimen>
+    <dimen name="wear_compose_material3_numeral_small_font_size">30</dimen>
+    <dimen name="wear_compose_material3_numeral_medium_font_size">40</dimen>
+    <dimen name="wear_compose_material3_numeral_large_font_size">50</dimen>
+    <dimen name="wear_compose_material3_numeral_extra_large_font_size">60</dimen>
+    <dimen name="wear_compose_material3_title_small_font_size">14</dimen>
+    <dimen name="wear_compose_material3_title_medium_font_size">16</dimen>
+    <dimen name="wear_compose_material3_title_large_font_size">20</dimen>
+
+    <dimen name="wear_compose_material3_shape_corner_extra_small_size">4</dimen>
+    <dimen name="wear_compose_material3_shape_corner_small_size">8</dimen>
+    <dimen name="wear_compose_material3_shape_corner_medium_size">18</dimen>
+    <dimen name="wear_compose_material3_shape_corner_large_size">26</dimen>
+    <dimen name="wear_compose_material3_shape_corner_extra_large_size">36</dimen>
+
+</resources>
diff --git a/apk/res/values-watch/integers.xml b/apk/res/values-watch/integers.xml
new file mode 100644
index 0000000..365ac3a
--- /dev/null
+++ b/apk/res/values-watch/integers.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- START: Ported values -->
+    <integer name="short_title_length">13</integer>
+    <integer name="char_limit_per_line">18</integer>
+    <!-- END: Ported values -->
+</resources>
diff --git a/apk/res/values-watch/strings.xml b/apk/res/values-watch/strings.xml
new file mode 100644
index 0000000..60aca8f
--- /dev/null
+++ b/apk/res/values-watch/strings.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Title for the dialog button to deny a permission grant and never ask the user again. [CHAR LIMIT=29]-->
+    <string name="grant_dialog_button_deny_dont_ask_again">Deny, don\'t ask again</string>
+
+    <!-- Template for the current permission from the total number of permissions. -->
+    <string name="current_permission_template">
+        <xliff:g id="current_permission_index" example="1">%1$s</xliff:g> /
+        <xliff:g id="permission_count" example="2">%2$s</xliff:g>
+    </string>
+
+    <!-- Preference row title for showing system apps. -->
+    <string name="preference_show_system_apps">Show system apps</string>
+
+    <!-- Summary of a permission switch when it's enforced by policy [CHAR LIMIT=17] -->
+    <string name="permission_summary_enforced_by_policy">Can\'t be changed</string>
+
+    <!-- Generic text to indicate a yes. [CHAR LIMIT=10] -->
+    <string name="generic_yes">Yes</string>
+
+    <!-- Generic text to indicate Cancel. [CHAR LIMIT=10] -->
+    <string name="generic_cancel">Cancel</string>
+
+    <!-- [CHAR LIMIT=25] App can always (when app is in foreground or background) access the resource protected by the permission -->
+    <string name="permission_access_always">All the time</string>
+
+    <!-- App can only access the resource protected by the permission while app is in foreground [CHAR LIMIT=25]-->
+    <string name="permission_access_only_foreground">While using app</string>
+
+    <!-- Title for the dialog button to allow a permission grant when you can also only allow in the foreground. [CHAR LIMIT=25] -->
+    <string name="app_permission_button_allow_always">All the time</string>
+
+    <!-- Title for the dialog button to allow a permission grant only when the app is in the foreground. [CHAR LIMIT=25] -->
+    <string name="app_permission_button_allow_foreground">While using app</string>
+
+    <!-- Title for the dialog button to allow a permission grant when you can also only allow in the foreground. [CHAR LIMIT=25] -->
+    <string name="grant_dialog_button_allow_always">All the time</string>
+
+    <!-- Title for the dialog button to allow a permission grant only when the app is in the foreground. [CHAR LIMIT=25] -->
+    <string name="grant_dialog_button_allow_foreground">While using app</string>
+
+    <!-- Title for the dialog button to allow a change from foreground to background permission grant. [CHAR LIMIT=25]  -->
+    <string name="grant_dialog_button_allow_background">All the time</string>
+</resources>
diff --git a/apk/res/values-watch/styles.xml b/apk/res/values-watch/styles.xml
new file mode 100644
index 0000000..805d43d
--- /dev/null
+++ b/apk/res/values-watch/styles.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="BreadcrumbText" parent="@android:style/TextAppearance.Material.Body2"/>
+    <style name="TitleText" parent="@android:style/TextAppearance.Material.Subhead"/>
+</resources>
diff --git a/apk/res/values-watch/themes.xml b/apk/res/values-watch/themes.xml
new file mode 100644
index 0000000..822bb55
--- /dev/null
+++ b/apk/res/values-watch/themes.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<resources>
+    <style name="Settings" parent="@android:style/Theme.DeviceDefault.NoActionBar" />
+
+    <style name="Theme.PermissionController.Settings" parent="Settings" />
+
+    <style name="GrantPermissions" parent="@android:style/Theme.DeviceDefault.NoActionBar">
+    </style>
+
+    <style name="RequestRole" parent="Settings" />
+
+    <style name="Theme.PermissionController.IncidentReportDialog"
+        parent="@android:style/Theme.DeviceDefault.Dialog.Alert" />
+</resources>
diff --git a/apk/res/values-zh-rCN/strings.xml b/apk/res/values-zh-rCN/strings.xml
index 8ba7924..50fa628 100644
--- a/apk/res/values-zh-rCN/strings.xml
+++ b/apk/res/values-zh-rCN/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"管理设备上的健康与健身数据,并控制哪些应用可以访问这些数据"</string>
     <string name="data_title" msgid="4456619761533380816">"数据和访问权限"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"浏览健康记录"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"查看您的健康记录,并了解哪些应用可以访问这些记录"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"所有类别"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"查看所有类别"</string>
     <string name="no_data" msgid="1906986019249068659">"无数据"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"昨天"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"读取:<xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"写入:<xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"、 "</string>
+    <string name="separator" msgid="5521285473288943819">"、 "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"管理权限"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"时间:<xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"活动"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"访问您的健康数据"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"读取消耗的卡路里数"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"允许该应用读取消耗的卡路里数"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"访问后台数据"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"要允许 <xliff:g id="APP_NAME">%1$s</xliff:g> 访问后台数据吗?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"要允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”在后台访问数据吗?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"如果您允许,此应用将可以在您未使用它时访问健身与健康数据以及健康记录。"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"如果您允许,此应用将可以在您未使用它时访问健康记录。"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"如果您允许,此应用将可以在您未使用它时访问健身与健康数据。"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"如果您允许,此应用将可以在您未使用它时访问“健康数据共享”数据。"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"要允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”访问过往数据吗?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"如果您允许,此应用将可以访问在 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前添加的健身与健康数据。"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"如果您允许,此应用将可以访问所有过往的健身与健康数据。"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"如果您允许,此应用将可以访问在 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前添加的“健康数据共享”数据。"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"如果您允许,此应用将可以访问所有过往的“健康数据共享”数据。"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"要允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”获得额外访问权限吗?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”还想访问这些“健康数据共享”设置"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"在后台访问所有数据"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"在后台访问健康记录"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"在后台访问健身与健康数据"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"允许此应用在您未使用它时访问健身与健康数据以及健康记录"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"允许此应用在您未使用它时访问此类数据"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"允许此应用在您未使用它时访问此类数据"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"在后台访问数据"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"允许此应用在您未使用它时访问“健康数据共享”数据"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"访问过往的健身与健康数据"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"允许此应用访问在 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前添加的数据"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"允许此应用访问所有过往数据"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"访问过往数据"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"允许此应用访问在 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前添加的“健康数据共享”数据"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"允许此应用访问所有过往的“健康数据共享”数据"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”已拥有访问过往的健康记录数据的权限"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"详细了解权限"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"在后台访问所有数据"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"在后台访问健康记录"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"在后台访问健身与健康数据"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"允许此应用在您未使用它时访问健身与健康数据以及健康记录"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"允许此应用在您未使用它时访问此类数据"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"允许此应用在您未使用它时访问此类数据"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"在后台访问数据"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"允许此应用在您未使用它时访问“健康数据共享”数据"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"访问过往的健身与健康数据"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"允许此应用访问在 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前添加的数据"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"允许此应用访问所有过往数据"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"访问过往数据"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"允许此应用访问在 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前添加的“健康数据共享”数据"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"允许此应用访问所有过往的“健康数据共享”数据"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"目前未读取任何健身数据,因为“<xliff:g id="APP_NAME">%1$s</xliff:g>”没有读取此类数据的权限"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”已经能够访问您过往的健康记录数据。如需更改此设置,请为此应用关闭健康记录相关权限"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"管理健康记录相关权限"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"请至少启用一项读取权限,以便为此应用开启后台或历史数据访问权"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"请至少启用一项读取权限,以便为此应用开启后台数据访问权"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"请至少启用一项读取权限,以便为此应用开启历史数据访问权"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"允许此应用访问所有过往的“健康数据共享”数据"</string>
     <string name="background_read_description" msgid="3203594555849969283">"允许此应用在后台访问“健康数据共享”数据"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"如果您允许,此应用可以在您不使用此应用时访问“健康数据共享”数据。"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"访问历史数据"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”访问过去的数据?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"允许此应用访问在<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前添加的“健康数据共享”数据"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"允许此应用访问“健康数据共享”的所有历史数据"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"如果您允许,此应用可以访问在 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前添加的“健康数据共享”数据。"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"如果您允许,此应用可以访问“健康数据共享”的所有历史数据。"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"运动消耗的卡路里"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"运动消耗的卡路里"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"读取运动消耗的卡路里数据"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"推轮椅次数"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"读取推轮椅次数数据"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"写入推轮椅次数数据"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"活动强度"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"活动强度"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"读取活动强度数据"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"写入活动强度数据"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"基础代谢率"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"基础代谢率"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"读取基础代谢率数据"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"体表温度"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"读取体表温度"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"写入体表温度"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"这包括已同步和添加到“健康数据共享”中的所有健康记录。这可能不是您的完整医疗记录,也不包含您的健康记录的医学描述。"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"所有健康记录"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"所有健康记录"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"写入所有健康记录"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"过敏反应"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"过敏反应"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"读取过敏反应数据"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"疫苗接种数据"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"疫苗接种数据"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"读取疫苗接种数据"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"实验室结果"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"实验室结果"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"读取实验室结果"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"过敏反应"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"过敏反应"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"读取过敏反应数据"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"病症数据"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"病症数据"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"读取病症数据"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"疫苗接种"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"疫苗接种"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"读取疫苗接种数据"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"化验结果"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"化验结果"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"读取化验结果"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"用药"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"用药"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"读取用药数据"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"个人详细信息"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"个人详细信息"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"读取个人详细信息"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"医师详细信息"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"医师详细信息"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"读取医师详细信息"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"怀孕数据"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"怀孕数据"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"读取怀孕数据"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"问题数据"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"问题数据"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"读取问题数据"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"医疗程序数据"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"医疗程序数据"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"读取医疗程序数据"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"社交媒体历史记录"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"社交媒体历史记录"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"社交媒体历史记录"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"读取社交媒体历史记录"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"生命体征数据"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"就医数据"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"就医数据"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"读取就医数据"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"生命体征数据"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"生命体征数据"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"读取生命体征数据"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"正念"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"写入正念数据"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”读取"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”写入"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"取消"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"允许"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"全部允许"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"不允许"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"选择允许此应用对健康数据共享读取或写入数据"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"选择您希望允许此应用从“健康数据共享”读取或写入到“健康数据共享”的数据"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"选择您希望允许此应用从“健康数据共享”读取的数据"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"选择您希望允许此应用写入到“健康数据共享”的数据"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"如果您授予读取权限,该应用可以读取新数据和过去 30 天的数据"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"如果您授予读取权限,该应用可以读取新数据和过去的数据"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"要允许<xliff:g id="APP_NAME">%1$s</xliff:g>访问健康数据共享吗?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"你可以参阅开发者的<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>,了解<xliff:g id="APP_NAME">%1$s</xliff:g>如何处理你的数据"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"要允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”访问健身与健康数据吗?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"您可以参阅“<xliff:g id="APP_NAME">%1$s</xliff:g>”的<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>,了解该应用如何处理您的数据"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"隐私权政策"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"要允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”访问您的健康记录吗?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"如果您授予访问权限,此应用将可以读取和写入过敏反应、化验结果、疫苗接种等数据\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"如果您授予访问权限,此应用将可以读取过敏反应、化验结果、疫苗接种等数据\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"关于健康记录"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"要分享的数据包括"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"如果您允许,“<xliff:g id="APP_NAME">%1$s</xliff:g>”将可以与“健康数据共享”共享您的健康记录。"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"同步来自不同应用和来源的健康记录,将其集中存放在一个位置"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"要撤消所有权限吗?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"全部移除"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的任何数据或向其中写入数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头、麦克风或位置信息使用权。"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的任何数据或向其中写入数据,包括历史数据。\n\n这不会影响此应用可能拥有的其他权限,例如位置信息、摄像头或麦克风使用权。"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的任何数据或向其中写入数据,包括后台和历史数据。\n\n这不会影响此应用可能拥有的其他权限,例如位置信息、摄像头或麦克风使用权。"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"同时删除“健康数据共享”中的“<xliff:g id="APP_NAME">%1$s</xliff:g>”数据"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"要移除所有权限吗?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"要移除所有的健康记录相关权限吗?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"要移除所有的健身和健康相关权限吗?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"同时从“健康数据共享”中删除来自“<xliff:g id="APP_NAME">%1$s</xliff:g>”的健身数据"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"要移除所有的健康记录相关权限吗?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"同时从“健康数据共享”中删除来自“<xliff:g id="APP_NAME">%1$s</xliff:g>”的健康记录"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的此类数据,也无法再向其中写入此类数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头使用权限、麦克风使用权限或位置信息访问权限。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的此类数据,也无法再向其中写入此类数据,包括后台数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头使用权限、麦克风使用权限或位置信息访问权限。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的此类数据,也无法再向其中写入此类数据,包括历史数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头使用权限、麦克风使用权限或位置信息访问权限。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的此类数据,也无法再向其中写入此类数据,包括后台数据和历史数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头使用权限、麦克风使用权限或位置信息访问权限。"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"要移除所有权限吗?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的数据,也无法再向其中写入数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头使用权限、麦克风使用权限或位置信息访问权限。"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的数据,也无法再向其中写入数据,包括后台数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头使用权限、麦克风使用权限或位置信息访问权限。"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的数据,也无法再向其中写入数据,包括历史数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头使用权限、麦克风使用权限或位置信息访问权限。"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”将无法再读取“健康数据共享”中的数据,也无法再向其中写入数据,包括后台数据和历史数据。\n\n这不会影响此应用可能拥有的其他权限,例如摄像头使用权限、麦克风使用权限或位置信息访问权限。"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"同时从“健康数据共享”中删除来自“<xliff:g id="APP_NAME">%1$s</xliff:g>”的健身数据和健康记录"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"已移除此应用的权限"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"同时删除所有来自“健康数据共享”的数据"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"后一天"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"选定的日期"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"前一天"</string>
     <string name="default_error" msgid="7966868260616403475">"出了点问题。请重试。"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"未知资源"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"源数据"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>左花括号。"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>右花括号。"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> 字段 <xliff:g id="FIELD">%2$s</xliff:g> 值"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"这些应用已经没有访问权限,但仍有数据存储在健康数据共享中"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”可以读取 <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>之后添加的数据"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"如需管理此应用可以访问的其他 Android 权限,请依次进入“设置”&gt;“应用”"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"您与“<xliff:g id="APP_NAME">%1$s</xliff:g>”共享的数据受其隐私权政策约束"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"您可在相应开发者的隐私权政策中了解“<xliff:g id="APP_NAME">%1$s</xliff:g>”会如何处理您的数据"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"如需管理此应用可以访问的其他 Android 权限,请进入“设置”,然后点按“应用”"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"阅读隐私权政策"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"上次访问时间:过去 24 小时内"</string>
     <string name="app_access_title" msgid="7137018424885371763">"应用访问权限"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"您目前没有安装任何兼容应用"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"其他访问权限"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"历史数据、后台数据"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"已撤消此应用的其他权限"</string>
     <string name="permissions_header" msgid="6519976063360071569">"权限"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"健身和健康"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"锻炼、睡眠、营养等"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"健康记录"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"健康记录"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"实验室结果、药物、免疫等"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"化验结果、药物、疫苗接种等"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"已撤消应用权限"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"健康数据共享已撤消“<xliff:g id="APP_DATA">%s</xliff:g>”的权限"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"健康数据共享已撤消“<xliff:g id="APP_DATA_0">%1$s</xliff:g>”和“<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>”的权限"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"前往 Play 商店"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"开始使用健康数据共享"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"“健康数据共享”会存储您的健康与健身数据,让您可以轻松同步设备上各应用的数据"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"“健康数据共享”会存储和同步来自不同应用的健康与健身数据。\n\n"<b>"健康与健身数据,"</b>"包括锻炼时段、步数、营养、睡眠等\n\n"<b>"健康记录,"</b>"包括疫苗接种、化验结果等"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"借助“健康数据共享”,您可以"</string>
     <string name="share_data" msgid="3481932156368883946">"与应用分享数据"</string>
     <string name="share_data_description" msgid="2919871301634375092">"选择每个应用可以从健康数据共享中读取或向其中写入的数据"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"管理设置和隐私"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"月经量:少"</string>
     <string name="flow_medium" msgid="3783688724668943154">"月经量:中"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"月经量:多"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"出血量未知"</string>
     <string name="period_day" msgid="3821944462093965882">"经期第 <xliff:g id="DAY">%1$d</xliff:g> 天(共 <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> 天)"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{经期(1 天)}other{经期(# 天)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"阳性"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"阴性"</string>
     <string name="ovulation_high" msgid="205362931427158291">"高"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"音乐"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"其他"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"无指导"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"中等"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"剧烈"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> 分钟"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> 小时 <xliff:g id="MIN">%2$s</xliff:g> 分钟"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> 小时"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"集成正在进行中"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"健康数据共享正在与 Android 系统集成。\n\n转移数据和权限可能需要一些时间。"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"在收到集成完成的通知之前,请勿关闭应用。"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"健康数据共享集成正在进行中"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"需要更新"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"健康数据共享正在与 Android 系统集成,完成后您可以直接在设置中访问它。"</string>
     <string name="update_button" msgid="4544529019832009496">"更新"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"开始执行此更新操作,以便健康数据共享能继续与您的系统设置集成"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"立即更新"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"需要更新系统"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"在继续集成之前,请更新您的手机系统。"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"如果您已更新手机系统,请尝试重启手机,继续进行集成"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"需要更新健康数据共享"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"在继续操作之前,请将健康数据共享应用更新到最新版本。"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"需要更多存储空间"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"健康数据共享需要 <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> 的手机存储空间,才能继续集成。\n\n请清除手机上的一些内容,然后重试。"</string>
     <string name="try_again_button" msgid="8745496819992160789">"重试"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"释放空间"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"需要更多存储空间"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"健康数据共享需要 <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> 的手机存储空间,才能继续集成。"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"集成已暂停"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"健康数据共享应用与 Android 系统集成时,会处于关闭状态。\n\n请点击“恢复”重新打开该应用,继续转移您的数据和权限。"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"为保留您的健康数据共享数据,请在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>内完成这项操作"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"点按即可继续将健康数据共享与 Android 系统进行集成。为保留您的数据,请在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>内完成这项操作"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"点按即可继续将健康数据共享与 Android 系统进行集成。"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"继续"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"恢复健康数据共享集成"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"为保留您的数据,请在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>内完成这项操作"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"需要更新应用"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”需要更新,才能继续与“健康数据共享”同步"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"部分应用需要更新,才能继续与“健康数据共享”同步"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”需要更新,才能继续与“健康数据共享”同步。某些应用可能无法更新。"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"部分应用需要更新,才能继续与“健康数据共享”同步。某些应用可能无法更新。"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"检查更新"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"了解详情"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"健康数据共享集成"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"健康数据共享集成未完成"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"当您可以再次集成时,会收到相关通知。"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"知道了"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"健康数据共享集成未完成"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"了解详情"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"健康数据共享集成已完成"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"打开"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"新增功能"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"现在,您可以直接在设置中访问健康数据共享,也可以随时卸载健康数据共享应用以释放存储空间。"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"知道了"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"编辑应用来源"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"设备默认设置"</string>
     <string name="app_data_title" msgid="6499967982291000837">"应用数据"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"具有健康数据共享访问权的应用中的数据将显示在此处"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"来自“<xliff:g id="APP_NAME">%1$s</xliff:g>”的数据将显示在此处"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"来自以下应用的数据将显示在此处:具有“健康数据共享”访问权限的应用"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"日"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"周"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"月"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"上个月"</string>
     <string name="tab_entries" msgid="3402700951602029493">"条目"</string>
     <string name="tab_access" msgid="7818197975407243701">"有访问权限的应用"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"允许 <xliff:g id="APP_NAME">%1$s</xliff:g> 获得额外访问权限?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"<xliff:g id="APP_NAME">%1$s</xliff:g> 还想访问这些“健康数据共享”设置"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"请至少启用一项读取权限,以便为此应用开启后台或历史数据访问权"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"请至少启用一项读取权限,以便为此应用开启后台数据访问权"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"请至少启用一项读取权限,以便为此应用开启历史数据访问权"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"开始使用“健康数据共享”"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"同步您的首批应用,以便在它们之间共享健康与健身数据"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"设置"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"查看兼容应用"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"通过“健康数据共享”查找更多要与<xliff:g id="APP_NAME">%s</xliff:g>同步的应用"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"在应用商店中查看"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"设置屏锁"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"为了提高健康数据的安全性,请为此设备设置 PIN 码、解锁图案或密码"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"设置屏锁"</string>
     <string name="select_all" msgid="837499881590001166">"全选"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"关联的应用将无法再通过“健康数据共享”读取这些数据"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"已选中"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"未选中"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"有锻炼路线地图可供使用"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"次日"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"下周"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"下个月"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"前一天"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"前一周"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"上个月"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"要永久删除所有数据吗?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"要永久删除所选数据吗?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"要永久删除所有“<xliff:g id="APP_NAME">%s</xliff:g>”数据吗?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"要永久删除 <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>这一周的所选“<xliff:g id="APP_NAME">%1$s</xliff:g>”条目吗?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"要永久删除 <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>的所选“<xliff:g id="APP_NAME">%1$s</xliff:g>”条目吗?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"要永久删除此“<xliff:g id="APP_NAME">%s</xliff:g>”条目吗?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"要永久删除“<xliff:g id="APP_NAME">%2$s</xliff:g>”的<xliff:g id="DATA_TYPE">%1$s</xliff:g>数据吗?"</string>
+    <string name="on" msgid="8266542510798355807">"开"</string>
+    <string name="off" msgid="6996623844428550649">"关"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"上次访问时间:<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"昨天<xliff:g id="TIME_DATE">%1$s</xliff:g>访问过"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>访问过"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"始终允许"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"允许使用所选权限"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"仅在使用该应用时允许"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"全部拒绝"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"要允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”访问健身与健康数据吗?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"<xliff:g id="APP_NAME">%1$s</xliff:g>正在请求访问“<xliff:g id="DATA_TYPES">%2$s</xliff:g>”。\n\n您可以全部允许,也可以单独控制。"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”访问<xliff:g id="DATA_TYPE">%2$s</xliff:g>吗?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"健身和健康"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"始终"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"使用期间"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"始终"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"使用期间"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”<xliff:g id="ALLOW_MODE">%2$s</xliff:g>可以访问您的所有健身和健康数据"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"允许访问"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"允许读取"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"有了这些权限,“<xliff:g id="APP_NAME">%1$s</xliff:g>”便可访问设备传感器中的数据。"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"允许 <xliff:g id="NUMBER_0">%1$d</xliff:g> 个应用(共 <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> 个)"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"没有应用请求权限"</string>
+    <string name="allowed" msgid="4158456017482263737">"允许"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"不允许"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"具有此权限的应用可以访问设备传感器中的<xliff:g id="DATA_TYPE">%s</xliff:g>数据。"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"要为手表上的所有应用撤消“<xliff:g id="DATA_TYPE">%s</xliff:g>”访问权限吗?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"对勾标记"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"叉号"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"目前,“<xliff:g id="APP_NAME">%1$s</xliff:g>”可以访问健身与健康数据,相应的权限类型为“<xliff:g id="ALLOW_MODE">%2$s</xliff:g>”"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"始终允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”访问健身与健康数据?"</string>
+    <string name="current_access" msgid="1457167070428176139">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”有权访问<xliff:g id="DATA_TYPES">%2$s</xliff:g>。"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"管理健身与健康相关权限"</string>
 </resources>
diff --git a/apk/res/values-zh-rHK/strings.xml b/apk/res/values-zh-rHK/strings.xml
index dd3b2a2..59098a1 100644
--- a/apk/res/values-zh-rHK/strings.xml
+++ b/apk/res/values-zh-rHK/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"管理裝置上的健康和健身資料,並控制哪些應用程式可存取這些資料"</string>
     <string name="data_title" msgid="4456619761533380816">"資料和存取權"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"瀏覽健康記錄"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"查看健康記錄和可以存取健康記錄的應用程式"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"所有類別"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"顯示所有類別"</string>
     <string name="no_data" msgid="1906986019249068659">"沒有資料"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"昨天"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"讀取:<xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"寫入:<xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"、 "</string>
+    <string name="separator" msgid="5521285473288943819">"、 "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"管理權限"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"時間:<xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"活動"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"存取你的健康資料"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"讀取卡路里消耗量資料"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"允許應用程式讀取卡路里消耗量資料"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"在背景存取資料"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」在背景存取資料嗎?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」在背景存取資料嗎?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"如授予此權限,此應用程式可在你不使用時存取健身與健康資料及健康記錄。"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"如授予此權限,此應用程式可在你不使用時存取健康記錄。"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"如授予此權限,此應用程式可在你不使用時存取健身與健康資料。"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"如授予此權限,此應用程式可在你不使用時存取「健康資料同步」資料。"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取過往資料嗎?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"如授予此權限,此應用程式可存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的健身與健康資料。"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"如授予此權限,此應用程式可存取所有過往的健身與健康資料。"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"如授予此權限,此應用程式可存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的「健康資料同步」資料。"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"如授予此權限,此應用程式可存取過往所有「健康資料同步」資料。"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"要授予「<xliff:g id="APP_NAME">%1$s</xliff:g>」其他存取權嗎?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」同時要求存取這些「健康資料同步」設定"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"在背景存取所有資料"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"在背景存取健康記錄"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"在背景存取健身與健康資料"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"允許此應用程式在你不使用時存取健身與健康資料及健康記錄"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"允許此應用程式在你不使用時存取這些資料"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"允許此應用程式在你不使用時存取這些資料"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"在背景存取資料"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"允許此應用程式在你不使用時存取「健康資料同步」資料"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"存取過往的健身與健康資料"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"允許此應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的資料"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"允許此應用程式存取所有過往資料"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"存取過往資料"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"允許此應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的「健康資料同步」資料"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"允許此應用程式存取過往所有「健康資料同步」資料"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」已可存取過往的健康記錄資料"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"進一步瞭解權限"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"在背景存取所有資料"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"在背景存取健康記錄"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"在背景存取健身與健康資料"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"允許此應用程式在你不使用時存取健身與健康資料及健康記錄"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"允許此應用程式在你不使用時存取這些資料"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"允許此應用程式在你不使用時存取這些資料"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"在背景存取資料"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"允許此應用程式在你不使用時存取「健康資料同步」資料"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"存取過往的健身與健康資料"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"允許此應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的資料"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"允許此應用程式存取所有過往資料"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"存取過往資料"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"允許此應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的「健康資料同步」資料"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"允許此應用程式存取過往所有「健康資料同步」資料"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」沒有讀取權限,目前未有讀取任何健身資料"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」已可存取過往的健康記錄資料。如要變更此設定,請關閉此應用程式的健康記錄權限"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"管理健康記錄權限"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"需要啟用至少一項讀取權限,才能開啟此應用程式的背景或過往資料存取權"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"需要啟用至少一項讀取權限,才能開啟此應用程式的背景存取權"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"需要啟用至少一項讀取權限,才能開啟此應用程式的過往資料存取權"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"允許此應用程式存取過往所有「健康資料同步」資料"</string>
     <string name="background_read_description" msgid="3203594555849969283">"允許此應用程式在你沒有使用應用程式時存取「健康資料同步」資料"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"如授予此權限,此應用程式可在你沒有使用應用程式時存取「健康資料同步」資料。"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"存取過往資料"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取過往資料嗎?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"允許此應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前新增的「健康資料同步」資料"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"允許此應用程式存取過往所有「健康資料同步」資料"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"如授予此權限,此應用程式可存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前新增的「健康資料同步」資料。"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"如授予此權限,此應用程式可存取過往所有「健康資料同步」資料。"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"活動卡路里消耗量"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"活動卡路里消耗量"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"讀取活動卡路里消耗量資料"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"推輪椅次數"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"讀取推輪椅次數資料"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"寫入推輪椅次數資料"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"活動強度"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"活動強度"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"讀取活動強度"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"寫入活動強度"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"基礎代謝率"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"基礎代謝率"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"讀取基礎代謝率資料"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"皮膚溫度"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"讀取皮膚溫度"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"寫入皮膚溫度"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"這包括所有已同步和新增至「健康資料同步」的健康記錄。這可能不是你的完整醫療記錄,且不包括健康記錄的醫療描述。"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"所有健康記錄"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"所有健康記錄"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"寫入所有健康記錄"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"過敏"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"過敏"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"讀取過敏資料"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"疫苗接種"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"疫苗接種"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"讀取疫苗接種"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"化驗結果"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"化驗結果"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"讀取化驗結果"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"過敏"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"過敏"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"讀取過敏資料"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"醫療狀況"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"醫療狀況"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"讀取醫療狀況"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"疫苗"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"疫苗"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"讀取疫苗資料"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"檢測結果"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"檢測結果"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"讀取檢測結果"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"藥物"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"藥物"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"讀取藥物"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"個人資料"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"個人資料"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"讀取個人資料"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"醫生資料"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"醫生資料"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"讀取醫生資料"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"懷孕"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"懷孕"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"讀取懷孕資料"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"問題"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"問題"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"讀取問題"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"手術"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"手術"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"讀取手術"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"社會背景"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"社會背景"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"社會背景"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"讀取社會背景"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"生命徵象"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"會診"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"會診"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"讀取會診"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"生命徵象"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"生命徵象"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"讀取生命徵象"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"正念"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"寫入正念"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」讀取"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」寫入"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"取消"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"允許"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"全部允許"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"不允許"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"選擇你希望此應用程式讀取或寫入 Health Connect 的資料"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"選擇你希望此應用程式讀取或寫入「健康資料同步」的資料"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"選擇你希望此應用程式讀取的「健康資料同步」資料"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"選擇你希望此應用程式寫入「健康資料同步」的資料"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"如果授予讀取權限,應用程式可讀取新資料和過去 30 天內的資料"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"如果授予讀取權限,應用程式可讀取新資料和過去的資料"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取 Health Connect 嗎?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"你可以參閱開發人員的<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>,瞭解「<xliff:g id="APP_NAME">%1$s</xliff:g>」如何處理你的資料"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取健身與健康資料嗎?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"如要瞭解「<xliff:g id="APP_NAME">%1$s</xliff:g>」如何處理你的資料,請參閱<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"私隱權政策"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取健康記錄嗎?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"如授予權限,應用程式便可讀取和寫入過敏、檢測結果、疫苗接種等資料\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"如授予權限,應用程式便可讀取過敏、檢測結果、疫苗接種等資料\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"關於健康記錄"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"要分享的資料包括"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"如授予權限,「<xliff:g id="APP_NAME">%1$s</xliff:g>」便可與「健康資料同步」分享你的健康記錄。"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"同步其他應用程式和來源的健康記錄,將健康記錄集中一處"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"要移除所有權限嗎?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"全部移除"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法讀取或寫入任何「健康資料同步」資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料,包括過往資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如位置、相機或麥克風的存取權。"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料,包括背景數據和過往資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如位置、相機或麥克風的存取權。"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"同時刪除「健康資料同步」中的「<xliff:g id="APP_NAME">%1$s</xliff:g>」資料"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"要移除所有權限嗎?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"要移除所有健康記錄權限嗎?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"要移除所有健身和身心健康權限嗎?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"同時刪除「健康資料同步」中的「<xliff:g id="APP_NAME">%1$s</xliff:g>」健身資料"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"要移除所有健康記錄權限嗎?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"同時刪除「健康資料同步」中的「<xliff:g id="APP_NAME">%1$s</xliff:g>」健康記錄"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入這些資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入這些資料,包括背景數據。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入這些資料,包括過往資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入這些資料,包括背景數據和過往資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"要移除所有權限嗎?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料,包括背景數據。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料,包括過往資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料,包括背景數據和過往資料。\n\n這不會影響此應用程式可能擁有的其他權限,例如相機、麥克風或位置的存取權。"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"同時刪除「健康資料同步」中的「<xliff:g id="APP_NAME">%1$s</xliff:g>」健身資料和健康記錄"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"已移除此應用程式的權限"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"一併刪除所有「健康資料同步」資料"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"下一天"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"所選日期"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"上一天"</string>
     <string name="default_error" msgid="7966868260616403475">"發生錯誤,請再試一次。"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"不明的資源"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"來源資料"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>左括號。"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>右括號。"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"「<xliff:g id="PREFIX">%1$s</xliff:g>」欄位「<xliff:g id="FIELD">%2$s</xliff:g>」值"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"這些應用程式不再擁有存取權,但仍有資料儲存在 Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」可以讀取 <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>後新增的資料"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"如要管理此應用程式可以存取的其他 Android 權限,請前往「設定」&gt; [應用程式]"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"你與「<xliff:g id="APP_NAME">%1$s</xliff:g>」分享的資料將受應用程式的私隱權政策約束"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"如要瞭解「<xliff:g id="APP_NAME">%1$s</xliff:g>」如何處理你的資料,請參閱開發人員的私隱權政策"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"如要管理此應用程式可以存取的其他 Android 權限,請前往「設定」,然後輕按 [應用程式]"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"閱讀私隱權政策"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"上次存取時間:過去 24 小時內"</string>
     <string name="app_access_title" msgid="7137018424885371763">"應用程式存取權"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"你目前未安裝任何兼容的應用程式"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"其他存取權"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"過往資料、背景數據"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"已移除此應用程式的其他權限"</string>
     <string name="permissions_header" msgid="6519976063360071569">"權限"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"健身和身心健康"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"運動、睡眠、營養和其他"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"健康記錄"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"健康記錄"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"檢測結果、藥物、疫苗接種和其他"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"檢測結果、藥物、疫苗等等"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"已移除應用程式權限"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"Health Connect 已移除 <xliff:g id="APP_DATA">%s</xliff:g> 的權限"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"Health Connect 已移除 <xliff:g id="APP_DATA_0">%1$s</xliff:g> 和 <xliff:g id="APP_DATA_TWO">%2$s</xliff:g> 的權限"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"前往「Play 商店」"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"開始使用 Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"「健康資料同步」能儲存健康和健身資料,方便你同步處理裝置上各個應用程式的資料"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"「健康資料同步」會儲存及同步來自不同應用程式的健康和健身資料。\n\n"<b>"健康和健身資料:"</b>"包括運動時段、步數、營養、睡眠等等\n\n"<b>"健康記錄:"</b>"包括疫苗、檢測結果等等"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"你可以用「健康資料同步」嚟"</string>
     <string name="share_data" msgid="3481932156368883946">"與應用程式分享資料"</string>
     <string name="share_data_description" msgid="2919871301634375092">"選擇每個應用程式可讀取或寫入 Health Connect 的資料"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"管理設定和私隱"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"輕流量"</string>
     <string name="flow_medium" msgid="3783688724668943154">"中等流量"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"多流量"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"不明流量"</string>
     <string name="period_day" msgid="3821944462093965882">"經期第 <xliff:g id="DAY">%1$d</xliff:g> 日,共 <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> 日"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{月經 (1 日)}other{月經 (# 日)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"正面"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"負面"</string>
     <string name="ovulation_high" msgid="205362931427158291">"多"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"音樂"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"其他"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"自學"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"中"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"劇烈"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> 分鐘"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> 小時 <xliff:g id="MIN">%2$s</xliff:g> 分鐘"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> 小時"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"整合中"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"Health Connect 正在與 Android 系統整合。\n\n系統轉移資料和權限時可能需要一段時間。"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"請勿關閉應用程式,直至收到程序完成的通知為止。"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Health Connect 整合中"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"需要更新"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"Health Connect 正在與 Android 系統整合,因此可直接從設定頁面存取。"</string>
     <string name="update_button" msgid="4544529019832009496">"更新"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"開始執行更新,讓 Health Connect 可繼續與系統設定整合"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"立即更新"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"需要安裝系統更新"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"繼續前,請更新手機系統。"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"如果你已更新手機系統,請嘗試重新啟動手機以繼續整合"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Health Connect 需要更新"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"繼續前,請將 Health Connect 應用程式更新至最新版本。"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"需要更多儲存空間"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"Health Connect 需要 <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> 手機儲存空間才能繼續整合。\n\n請騰出手機部分儲存空間,然後再試一次。"</string>
     <string name="try_again_button" msgid="8745496819992160789">"再試一次"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"騰出空間"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"需要更多儲存空間"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"Health Connect 需要 <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> 手機儲存空間才能繼續整合。"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"已暫停整合"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"與 Android 系統整合期間,Health Connect 應用程式已關閉。\n\n按一下 [恢復] 即可重新開啟應用程式,繼續轉移資料和權限。"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"請在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>內完成此程序,你的 Health Connect 資料才得以保留"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"輕按即可繼續整合 Health Connect 和 Android 系統。請在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>內完成此程序,你的資料才得以保留"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"輕按即可繼續整合 Health Connect 和 Android 系統。"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"繼續"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"恢復整合 Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"請在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>內完成此程序,你的資料才得以保留"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"需要更新應用程式"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」需要更新,才能繼續與「健康資料同步」同步"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"部分應用程式需要更新後,才能繼續與「健康資料同步」同步"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」需要更新,才能繼續與「健康資料同步」同步。部分應用程式可能無法更新。"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"部分應用程式需要更新,才能繼續與「健康資料同步」同步。部分應用程式可能無法更新。"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"檢查更新"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"瞭解詳情"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Health Connect 整合"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Health Connect 未完成整合"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"你會在可再次整合時收到通知。"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"知道了"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Health Connect 未完成整合"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"閱讀更多"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Health Connect 整合完成"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"開啟"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"新功能"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"你現可直接從設定頁面存取 Health Connect,亦可隨時解除安裝 Health Connect 應用程式騰出儲存空間。"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"知道了"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"編輯應用程式來源清單"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"裝置預設設定"</string>
     <string name="app_data_title" msgid="6499967982291000837">"應用程式資料"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"有「健康資料同步」存取權的應用程式所提供的資料會在這裡顯示"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的資料將在這裡顯示"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"資料來自可存取「健康資料同步」的應用程式將會在這裡顯示"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"日"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"週"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"月"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"上個月"</string>
     <string name="tab_entries" msgid="3402700951602029493">"項目"</string>
     <string name="tab_access" msgid="7818197975407243701">"存取權"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"要授予「<xliff:g id="APP_NAME">%1$s</xliff:g>」其他存取權嗎?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」同時要求存取這些「健康資料同步」設定"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"需要啟用至少一項讀取權限,才能開啟此應用程式的背景或過往資料存取權"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"需要啟用至少一項讀取權限,才能開啟此應用程式的背景存取權"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"需要啟用至少一項讀取權限,才能開啟此應用程式的過往資料存取權"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"開始使用「健康資料同步」"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"同步第一個應用程式,即可在這些應用程式間分享健康和健身資料"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"設定"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"查看兼容的應用程式"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"尋找更多可透過「健康資料同步」與「<xliff:g id="APP_NAME">%s</xliff:g>」同步的應用程式"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"在應用程式商店上查看"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"設定螢幕鎖定"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"為提高健康資料安全性,請為此裝置設定 PIN、圖案或密碼"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"設定螢幕鎖定"</string>
     <string name="select_all" msgid="837499881590001166">"全部選取"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"已連結的應用程式將無法在「健康資料同步」中讀取這些資料"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"已勾選"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"未勾選"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"有可用的運動路線"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"下一天"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"下星期"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"下個月"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"上一天"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"上星期"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"上個月"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"要永久刪除所有資料嗎?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"要永久刪除所選資料嗎?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"要永久刪除所有「<xliff:g id="APP_NAME">%s</xliff:g>」資料嗎?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"要永久刪除 <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>該星期所選的「<xliff:g id="APP_NAME">%1$s</xliff:g>」項目嗎?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"要永久刪除 <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>所選的「<xliff:g id="APP_NAME">%1$s</xliff:g>」項目嗎?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"要永久刪除此「<xliff:g id="APP_NAME">%s</xliff:g>」項目嗎?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"要永久刪除「<xliff:g id="APP_NAME">%2$s</xliff:g>」的<xliff:g id="DATA_TYPE">%1$s</xliff:g>資料嗎?"</string>
+    <string name="on" msgid="8266542510798355807">"開啟"</string>
+    <string name="off" msgid="6996623844428550649">"關閉"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"上次存取時間:<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"上次存取時間:昨天<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"上次存取時間:<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"一律允許"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"允許已選取的權限"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"使用應用程式時"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"全部拒絕"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取健身與健康資料嗎?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」要求存取<xliff:g id="DATA_TYPES">%2$s</xliff:g>。\n\n請選擇要一律允許還是個別控制權限。"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取<xliff:g id="DATA_TYPE">%2$s</xliff:g>嗎?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"健身和身心健康"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"一律允許"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"僅在使用時允許"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"一律允許"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"僅在使用時允許"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="ALLOW_MODE">%2$s</xliff:g>「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的所有健身和身心健康資料"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"允許存取"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"允許讀取"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"這些權限允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取裝置感應器的資料。"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"已允許 <xliff:g id="NUMBER_0">%1$d</xliff:g> 個應用程式 (共 <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> 個)"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"沒有任何應用程式提出要求"</string>
+    <string name="allowed" msgid="4158456017482263737">"允許"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"不允許"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"擁有此權限的應用程式可存取裝置感應器的<xliff:g id="DATA_TYPE">%s</xliff:g>資料。"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"要移除手錶上所有應用程式的<xliff:g id="DATA_TYPE">%s</xliff:g>存取權嗎?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"剔號"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"叉號"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」目前的健身和身心健康資料存取權:<xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"一律允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取健身和身心健康資料嗎?"</string>
+    <string name="current_access" msgid="1457167070428176139">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」可以存取<xliff:g id="DATA_TYPES">%2$s</xliff:g>。"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"管理健身和身心健康權限"</string>
 </resources>
diff --git a/apk/res/values-zh-rTW/strings.xml b/apk/res/values-zh-rTW/strings.xml
index b9f1191..810d3da 100644
--- a/apk/res/values-zh-rTW/strings.xml
+++ b/apk/res/values-zh-rTW/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"管理裝置上的健康與健身資料,並控管哪些應用程式可以存取這類資料"</string>
     <string name="data_title" msgid="4456619761533380816">"資料和存取權"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"瀏覽健康記錄"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"查看你的健康記錄以及可存取這些記錄的應用程式"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"所有類別"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"顯示所有類別"</string>
     <string name="no_data" msgid="1906986019249068659">"沒有資料"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"昨天"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"讀取:<xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"寫入:<xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">"、 "</string>
+    <string name="separator" msgid="5521285473288943819">"、 "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"管理權限"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"時間:<xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"活動"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"存取你的健康資料"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"讀取卡路里燃燒量資料"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"允許應用程式讀取卡路里燃燒量資料"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"在背景存取資料"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」在背景存取資料嗎?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」在背景存取資料嗎?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"如果允許,這個應用程式就能在你未使用時存取健康與健身資料和健康記錄。"</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"如果允許,這個應用程式就能在你未使用時存取健康記錄。"</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"如果允許,這個應用程式就能在你未使用時存取健康與健身資料。"</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"如果允許,這個應用程式就能在你未使用時存取「健康資料同步」的資料。"</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取過去的資料嗎?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"如果允許,這個應用程式就能存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的健康與健身資料。"</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"如果允許,這個應用程式就能存取所有過去的健身與健康資料。"</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"如果允許,這個應用程式就能存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入「健康資料同步」的資料。"</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"如果允許,這個應用程式就能存取所有過去的「健康資料同步」資料。"</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"要將額外存取權授予「<xliff:g id="APP_NAME">%1$s</xliff:g>」嗎?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」還想存取以下「健康資料同步」設定"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"在背景存取所有資料"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"在背景存取健康記錄"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"在背景存取健身與健康資料"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"允許這個應用程式在你未使用時存取健康與健身資料和健康記錄"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"允許這個應用程式在你未使用時存取這類資料"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"允許這個應用程式在你未使用時存取這類資料"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"在背景存取資料"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"允許這個應用程式在你未使用時存取「健康資料同步」的資料"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"存取過去的健身與健康資料"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"允許這個應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的資料"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"允許這個應用程式存取所有過去的資料"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"存取過去的資料"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"允許這個應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入「健康資料同步」的資料"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"允許這個應用程式存取所有過去的「健康資料同步」資料"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」現在可以存取過去的健康記錄"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"進一步瞭解權限"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"在背景存取所有資料"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"在背景存取健康記錄"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"在背景存取健身與健康資料"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"允許這個應用程式在你未使用時存取健康與健身資料和健康記錄"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"允許這個應用程式在你未使用時存取這類資料"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"允許這個應用程式在你未使用時存取這類資料"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"在背景存取資料"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"允許這個應用程式在你未使用時存取「健康資料同步」的資料"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"存取過去的健身與健康資料"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"允許這個應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入的資料"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"允許這個應用程式存取所有過去的資料"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"存取過去的資料"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"允許這個應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>前加入「健康資料同步」的資料"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"允許這個應用程式存取所有過去的「健康資料同步」資料"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」沒有以下項目的讀取權限,因此目前沒有讀取任何健身資料:"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」現在可以存取你過去的健康記錄。如要變更,請關閉應用程式的健康記錄權限"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"管理健康記錄權限"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"你至少要啟用一項讀取的權限,這個應用程式才能存取背景資料或過去的資料"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"你至少要啟用一項讀取的權限,這個應用程式才能存取背景資料"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"你至少要啟用一項讀取的權限,這個應用程式才能存取過去的資料"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"允許這個應用程式存取所有過去的「健康資料同步」資料"</string>
     <string name="background_read_description" msgid="3203594555849969283">"允許這個應用程式在你未使用時,存取「健康資料同步」的資料"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"如果允許,這個應用程式將可在你未使用時存取健康資料同步的資料。"</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"存取過往資料"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取過往資料嗎?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"允許這個應用程式存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前加入健康資料同步的資料"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"允許這個應用程式存取所有先前的「健康資料同步」資料"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"如果允許,這個應用程式將可存取 <xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>之前加入健康資料同步的資料。"</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"如果允許,這個應用程式就能存取所有先前的「健康資料同步」資料。"</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"活動卡路里燃燒量"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"活動卡路里燃燒量"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"讀取活動卡路里燃燒量資料"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"推動輪椅次數"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"讀取推動輪椅次數資料"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"寫入推動輪椅次數資料"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"活動強度"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"活動強度"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"讀取活動強度"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"寫入活動強度"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"基礎代謝率"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"基礎代謝率"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"讀取基礎代謝率資料"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"皮膚溫度"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"讀取皮膚溫度"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"寫入皮膚溫度"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"這包括所有已同步和新增至「健康資料同步」的健康記錄。這可能不是完整病歷,也不包含健康記錄的醫療說明。"</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"所有健康記錄"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"所有健康記錄"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"寫入所有健康記錄"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"過敏"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"過敏"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"讀取過敏資料"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"免疫接種"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"免疫接種"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"讀取免疫接種資料"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"實驗室結果"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"實驗室結果"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"讀取實驗室結果"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"過敏"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"過敏"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"讀取過敏資料"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"健康狀況"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"健康狀況"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"讀取健康狀況資料"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"疫苗"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"疫苗"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"讀取疫苗資料"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"檢驗結果"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"檢驗結果"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"讀取檢驗結果"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"藥物"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"藥物"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"讀取藥物資料"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"個人資訊"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"個人資訊"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"讀取個人資訊"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"醫事人員詳細資料"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"醫事人員詳細資料"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"讀取醫事人員詳細資料"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"懷孕"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"懷孕"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"讀取懷孕資料"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"問題"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"問題"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"讀取問題資料"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"程序"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"程序"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"閱讀程序資料"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"社交活動記錄"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"生活型態"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"社交活動記錄"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"讀取生活型態資料"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"生命徵象"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"就醫記錄"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"就醫記錄"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"讀取就醫記錄"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"生命徵象"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"生命徵象"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"讀取生命徵象"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"正念"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"寫入正念練習資料"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」讀取"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」寫入"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"取消"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"允許"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"全部允許"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"不允許"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"選擇要讓這個應用程式讀取或寫入「健康資料同步」的資料"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"選擇這個應用程式可讀取或寫入「健康資料同步」的資料"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"選擇這個應用程式可從「健康資料同步」讀取的資料"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"選擇這個應用程式可寫入「健康資料同步」的資料"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"如果授予讀取權限,這個應用程式將可讀取新資料和過去 30 天內的資料"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"如果授予讀取權限,這個應用程式將可讀取新資料和過往資料"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取「健康資料同步」嗎?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"你可以參考「<xliff:g id="APP_NAME">%1$s</xliff:g>」開發人員的<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>,瞭解該應用程式如何處理你的資料"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取健身與健康資料嗎?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"你可以參考「<xliff:g id="APP_NAME">%1$s</xliff:g>」的<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>,瞭解該應用程式如何處理你的資料"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"隱私權政策"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的健康記錄嗎?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"如果授予存取權,這個應用程式就能讀取及寫入過敏、檢驗結果、疫苗接種等資料\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"如果授予存取權,這個應用程式就能讀取過敏、檢驗結果、疫苗接種等資料\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"關於健康記錄"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"共用的資料包括"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"如果允許,「<xliff:g id="APP_NAME">%1$s</xliff:g>」就可以將你的健康記錄提供給「健康資料同步」。"</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"同步處理來自不同應用程式和來源的健康記錄,集中存放這些資料"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"要移除所有權限嗎?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"全部移除"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置資訊的存取權。"</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料,包括過去的資料。\n\n這不會影響這個應用程式可能擁有的其他權限,例如位置、相機或麥克風存取權。"</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入任何資料,包括背景資料和過去的資料。\n\n這不會影響這個應用程式可能擁有的其他權限,例如位置、相機或麥克風存取權。"</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"一併刪除「健康資料同步」內的「<xliff:g id="APP_NAME">%1$s</xliff:g>」資料"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"要移除所有權限嗎?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"要移除所有健康記錄權限嗎?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"要移除所有健身與健康權限嗎?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"一併刪除「<xliff:g id="APP_NAME">%1$s</xliff:g>」在「健康資料同步」中的健身資料"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"要移除所有健康記錄權限嗎?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"一併刪除「<xliff:g id="APP_NAME">%1$s</xliff:g>」在「健康資料同步」中的健康記錄"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法繼續在「健康資料同步」中讀取或寫入這類資料\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置資訊存取權。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法繼續在「健康資料同步」中讀取或寫入這類資料,包括背景資料。\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置存取權。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法繼續在「健康資料同步」中讀取或寫入這類資料,包括過去的資料。\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置存取權。"</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在繼續「健康資料同步」中讀取或寫入這類資料,包括背景資料和過去的資料。\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置存取權。"</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"要移除所有權限嗎?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入資料\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置資訊存取權。"</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入資料,包括背景資料。\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置存取權。"</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入資料,包括過去的資料。\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置存取權。"</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」將無法在「健康資料同步」中讀取或寫入資料,包括背景資料和過去的資料。\n\n這不會影響這個應用程式可能擁有的其他權限,例如相機、麥克風或位置存取權。"</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"一併刪除「<xliff:g id="APP_NAME">%1$s</xliff:g>」在「健康資料同步」中的健身資料和健康記錄"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"這個應用程式的權限已移除"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"一併刪除所有「健康資料同步」資料"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"後一天"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"所選日期"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"前一天"</string>
     <string name="default_error" msgid="7966868260616403475">"發生錯誤,請再試一次。"</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"不明的資源"</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"來源資料"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>左括號。"</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>右括號。"</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"「<xliff:g id="PREFIX">%1$s</xliff:g>」欄位「<xliff:g id="FIELD">%2$s</xliff:g>」值"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"這些應用程式已無存取權,但仍有資料儲存在「健康資料同步」中"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」可以讀取 <xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>後新增的資料"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"如要管理這個應用程式可以存取的其他 Android 權限,請依序前往「設定」&gt;「應用程式」"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"你與「<xliff:g id="APP_NAME">%1$s</xliff:g>」分享的資料適用於該應用程式的隱私權政策"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"如要瞭解「<xliff:g id="APP_NAME">%1$s</xliff:g>」如何處理你的資料,請參閱開發人員的隱私權政策"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"如要管理這個應用程式可以存取的其他 Android 權限,請前往「設定」,然後輕觸「應用程式」"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"閱讀隱私權政策"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"上次存取時間:過去 24 小時內"</string>
     <string name="app_access_title" msgid="7137018424885371763">"應用程式存取權"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"你目前未安裝任何相容的應用程式"</string>
     <string name="additional_access_label" msgid="4645249249222528341">"額外存取權"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"過去的資料、背景資料"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"這個應用程式的其他權限已移除"</string>
     <string name="permissions_header" msgid="6519976063360071569">"權限"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"健身與保健"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"運動、睡眠、營養等等"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"健康記錄"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"健康記錄"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"檢驗結果、用藥情形、疫苗接種等等"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"檢驗結果、用藥情形、疫苗接種等等"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"應用程式權限已移除"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"「健康資料同步」已移除「<xliff:g id="APP_DATA">%s</xliff:g>」的權限"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"「健康資料同步」已移除「<xliff:g id="APP_DATA_0">%1$s</xliff:g>」和「<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>」的權限"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"前往 Play 商店"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"開始使用「健康資料同步」"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"「健康資料同步」會儲存健康與健身資料,方便你在裝置上同步不同應用程式的資料"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"「健康資料同步」會儲存及同步來自不同應用程式的健康與健身資料。\n\n"<b>"健身與健康資料"</b>":包括運動時段、步數、營養、睡眠等等\n\n"<b>"健康記錄"</b>":包括疫苗接種、檢驗結果等等"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"你可以使用「健康資料同步」執行下列操作:"</string>
     <string name="share_data" msgid="3481932156368883946">"與應用程式分享資料"</string>
     <string name="share_data_description" msgid="2919871301634375092">"選擇每個應用程式可讀取或寫入「健康資料同步」的資料"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"管理設定和隱私權"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"流量少"</string>
     <string name="flow_medium" msgid="3783688724668943154">"流量中等"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"流量多"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"月經量不明"</string>
     <string name="period_day" msgid="3821944462093965882">"生理期第 <xliff:g id="DAY">%1$d</xliff:g> 天,共 <xliff:g id="TOTAL_LENGTH">%2$d</xliff:g> 天"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{經期 (1 天)}other{經期 (# 天)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"陽性"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"陰性"</string>
     <string name="ovulation_high" msgid="205362931427158291">"高"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"音樂"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"其他"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"未引導"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"中"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"劇烈"</string>
     <string name="minute_duration" msgid="9035288227090160206">"<xliff:g id="MINUTE">%1$s</xliff:g> 分鐘"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g> 小時 <xliff:g id="MIN">%2$s</xliff:g> 分鐘"</string>
     <string name="hour_duration" msgid="3472489613837138711">"<xliff:g id="HOUR">%1$s</xliff:g> 小時"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"整合中"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"「健康資料同步」正在與 Android 系統整合。\n\n系統轉移資料和權限時可能需要一些時間。"</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"收到程序完成的通知之前,請不要關閉應用程式。"</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"「健康資料同步」整合中"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"需要更新"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"「健康資料同步」正在與 Android 系統整合,方便你直接從設定頁面存取。"</string>
     <string name="update_button" msgid="4544529019832009496">"更新"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"開始執行這項更新作業,讓「健康資料同步」能夠繼續與系統設定整合"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"立即更新"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"需要完成系統更新"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"繼續操作前,請更新你的手機系統。"</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"如果你已更新手機系統,請嘗試重新啟動手機,繼續進行整合"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"「健康資料同步」需要更新"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"繼續操作前,請將「健康資料同步」應用程式更新到最新版本。"</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"需要更多空間"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"「健康資料同步」需要 <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> 的手機儲存空間才能繼續整合。\n\n請在手機上清出一些空間,然後再試一次。"</string>
     <string name="try_again_button" msgid="8745496819992160789">"再試一次"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"釋出空間"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"需要更多空間"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"「健康資料同步」需要 <xliff:g id="SPACE_NEEDED">%1$s</xliff:g> 的手機儲存空間才能繼續整合。"</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"已暫停整合"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"「健康資料同步」應用程式在與 Android 系統整合時關閉了。\n\n請按一下「繼續」重新開啟應用程式,繼續轉移資料和權限。"</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"為了保留你的「健康資料同步」資料,請在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>內完成這項操作"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"輕觸一下即可繼續讓「健康資料同步」與 Android 系統整合。為了保留你的資料,請在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>內完成這項操作"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"輕觸一下即可繼續讓「健康資料同步」與 Android 系統整合。"</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"繼續"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"繼續整合「健康資料同步」"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"為了保留你的資料,請在 <xliff:g id="TIME_NEEDED">%1$s</xliff:g>內完成這項操作"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"應用程式需要更新"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」需要更新,才能繼續與「健康資料同步」保持同步"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"部分應用程式需要更新,才能繼續與「健康資料同步」保持同步"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」需要更新,才能繼續與「健康資料同步」保持同步。部分應用程式可能無法更新。"</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"部分應用程式需要更新,才能繼續與「健康資料同步」保持同步。部分應用程式可能無法更新。"</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"檢查更新"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"瞭解詳情"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"「健康資料同步」整合作業"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"「健康資料同步」未完成整合"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"你會在能夠再次整合時收到通知。"</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"我知道了"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"「健康資料同步」未完成整合"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"閱讀完整內容"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"「健康資料同步」整合完成"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"開啟"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"新功能"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"你現在可以直接從設定頁面存取「健康資料同步」,也可以隨時解除安裝「健康資料同步」應用程式,釋出儲存空間。"</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"我知道了"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"編輯應用程式來源清單"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"裝置預設設定"</string>
     <string name="app_data_title" msgid="6499967982291000837">"應用程式資料"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"如果資料是來自有權存取「健康資料同步」的應用程式,就會顯示在這裡"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的資料會顯示在這裡"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"如果資料來自可存取「健康資料同步」的應用程式,就會顯示在這裡"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"一天"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"一週"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"一個月"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"上個月"</string>
     <string name="tab_entries" msgid="3402700951602029493">"資料"</string>
     <string name="tab_access" msgid="7818197975407243701">"存取權"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"要授予「<xliff:g id="APP_NAME">%1$s</xliff:g>」額外存取權嗎?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」還想存取這些健康資料同步設定"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"你至少要啟用一項讀取的權限,這個應用程式才能存取背景資料或過去的資料"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"你至少要啟用一項讀取的權限,這個應用程式才能存取背景資料"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"你至少要啟用一項讀取的權限,這個應用程式才能存取過去的資料"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"開始使用「健康資料同步」"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"同步第一組應用程式,即可在這些應用程式間分享健康與健身資料"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"設定"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"查看相容的應用程式"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"尋找更多可透過「健康資料同步」與「<xliff:g id="APP_NAME">%s</xliff:g>」同步的應用程式"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"前往應用程式商店查看"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"設定螢幕鎖定"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"為進一步保護健康資料,請為這部裝置設定 PIN 碼、解鎖圖案或密碼"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"設定螢幕鎖定"</string>
     <string name="select_all" msgid="837499881590001166">"全選"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"連結的應用程式將無法再從「健康資料同步」讀取這類資料"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"已勾選"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"未勾選"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"有運動地圖路線"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"後一天"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"下週"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"下個月"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"前一天"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"上週"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"上個月"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"要永久刪除所有資料嗎?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"要永久刪除所選資料嗎?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"要永久刪除所有「<xliff:g id="APP_NAME">%s</xliff:g>」資料嗎?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"要永久刪除 <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>該週的所選「<xliff:g id="APP_NAME">%1$s</xliff:g>」項目嗎?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"要永久刪除 <xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>的所選「<xliff:g id="APP_NAME">%1$s</xliff:g>」項目嗎?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"要永久刪除這個「<xliff:g id="APP_NAME">%s</xliff:g>」項目嗎?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"要永久刪除「<xliff:g id="APP_NAME">%2$s</xliff:g>」的<xliff:g id="DATA_TYPE">%1$s</xliff:g>資料嗎?"</string>
+    <string name="on" msgid="8266542510798355807">"開啟"</string>
+    <string name="off" msgid="6996623844428550649">"關閉"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"上次存取時間:<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"上次存取時間:昨天<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"上次存取時間:<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"一律允許"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"允許所選權限"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"使用應用程式時"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"全部拒絕"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取健身與健康資料嗎?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」要求存取<xliff:g id="DATA_TYPES">%2$s</xliff:g>資料。\n\n你可以全部允許,也可以個別授予權限。"</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取「<xliff:g id="DATA_TYPE">%2$s</xliff:g>」嗎?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"健身與保健"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"一律允許"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"僅在使用時允許"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"一律允許"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"僅在使用時允許"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"<xliff:g id="ALLOW_MODE">%2$s</xliff:g>「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的所有健身與健康資料"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"允許存取"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"允許讀取"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"這些權限可讓「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取裝置感應器的資料。"</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"已授權給 <xliff:g id="NUMBER_0">%1$d</xliff:g> 個應用程式 (共 <xliff:g id="OTHER_NUMBER">%2$d</xliff:g> 個)"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"沒有任何應用程式提出要求"</string>
+    <string name="allowed" msgid="4158456017482263737">"允許"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"不允許"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"具有這項權限的應用程式可以存取裝置感應器的<xliff:g id="DATA_TYPE">%s</xliff:g>資料。"</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"要移除手錶上所有應用程式的<xliff:g id="DATA_TYPE">%s</xliff:g>存取權嗎?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"勾號"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"叉號"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"目前,「<xliff:g id="APP_NAME">%1$s</xliff:g>」可以存取健身與健康資料 <xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」隨時存取健身與健康資料嗎?"</string>
+    <string name="current_access" msgid="1457167070428176139">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」可以存取<xliff:g id="DATA_TYPES">%2$s</xliff:g>。"</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"管理健身與健康權限"</string>
 </resources>
diff --git a/apk/res/values-zu/strings.xml b/apk/res/values-zu/strings.xml
index c1c2f14..ca59eb8 100644
--- a/apk/res/values-zu/strings.xml
+++ b/apk/res/values-zu/strings.xml
@@ -23,6 +23,7 @@
     <string name="home_subtitle" msgid="2154213430054477787">"Phatha idatha yezempilo nokufaneleka edivayisini yakho, futhi ulawule ukuthi yimaphi ama-app angafinyelela kuyo"</string>
     <string name="data_title" msgid="4456619761533380816">"Idatha kanye nokufinyelela"</string>
     <string name="browse_medical_data" msgid="6963802956096683273">"Bhrawuza amarekhodi ezempilo"</string>
+    <string name="browse_medical_data_subtitle" msgid="4115165261000205538">"Buka amarekhodi akho ezempilo nokuthi yimaphi ama-app angawafinyelela"</string>
     <string name="all_categories_title" msgid="1446410643217937926">"Zonke izigaba"</string>
     <string name="see_all_categories" msgid="5599882403901010434">"Bona zonke izigaba"</string>
     <string name="no_data" msgid="1906986019249068659">"Ayikho idatha"</string>
@@ -52,7 +53,7 @@
     <string name="yesterday_header" msgid="6652176268273681505">"Izolo"</string>
     <string name="read_data_access_label" msgid="8968758932021241976">"Funda: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
     <string name="write_data_access_label" msgid="105976369853871061">"Bhala: <xliff:g id="DATA_TYPE">%s</xliff:g>"</string>
-    <string name="data_type_separator" msgid="1299848322898210658">", "</string>
+    <string name="separator" msgid="5521285473288943819">", "</string>
     <string name="manage_permissions" msgid="8394221950712608160">"Lawula izimvume"</string>
     <string name="recent_access_time_content_descritption" msgid="1137471676075811472">"Isikhathi: <xliff:g id="RECENT_ACCESS_TIME">%1$s</xliff:g>"</string>
     <string name="activity_category_uppercase" msgid="136628843341377088">"Umsebenzi"</string>
@@ -92,16 +93,56 @@
     <string name="permgroupdesc_health" msgid="252080476917407273">"finyelela idatha yakho yezempilo"</string>
     <string name="permlab_readCaloriesBurned" msgid="8998140381590624692">"Funda amakholari ashisiwe"</string>
     <string name="permdesc_readCaloriesBurned" msgid="9012595355389868570">"Ivumela i-app ukufunda amakholari ashisiwe"</string>
-    <string name="background_read_title" msgid="5061383169517186234">"Finyelela idatha engemuva"</string>
-    <string name="background_read_request_title" msgid="8492898140120977977">"Vumela <xliff:g id="APP_NAME">%1$s</xliff:g> ukuthi ifinyelele idatha ingemuva?"</string>
+    <string name="background_read_single_request_title" msgid="4903874755139858906">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukuthi ifinyelele idatha kungemuva?"</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" msgid="7716161960428574364">"Uma uyivumela, le app ingafinyelela idatha yokufaneleka nenhlalakahle kanye namarekhodi ezempilo uma ungayisebenzisi i-app."</string>
+    <string name="background_read_medical_single_request_description_medical_granted" msgid="5162456401369633859">"Uma uyivumela, le app ingafinyelela amarekhodi empilo uma ungayisebenzisi i-app."</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" msgid="6850185345786666516">"Uma uyivumela, le app ingafinyelela idatha yokufaneleka kanye nedatha yenhlalakahle uma ungayisebenzisi i-app."</string>
+    <string name="background_read_single_request_description" msgid="2679634929322639576">"Uma uyivumela, le app izofinyelela kudatha yeHealth Connect uma ungayisebenzisi i-app."</string>
+    <string name="history_read_single_request_title" msgid="6848027207063414793">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukuthi ifinyelele kudatha eyedlule?"</string>
+    <string name="history_read_medical_single_request_description" msgid="6408051015819625330">"Uma uyivumela, le app ingafinyelela idatha yokufaneleka nenhlalakahle efakwe ngaphambi komhla ka-<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_medical_single_request_description_fallback" msgid="6685832866184737207">"Uma uyivumela, le app ingafinyelela yonke idatha eyedlule yokufaneleka nenhlalakahle."</string>
+    <string name="history_read_single_request_description" msgid="9140843675330318112">"Uma uyivumela, le app izofinyelela kudatha yeHealth Connect efakwe ngaphambi komhla ka-<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
+    <string name="history_read_single_request_description_fallback" msgid="7685531357676523654">"Uma uyivumela, le app izofinyelela yonke idatha yesikhathi esidlule yeHealth Connect."</string>
+    <string name="additional_permissions_combined_request_title" msgid="5509177449679251301">"Vumela ukufinyelela okwengeziwe kwe-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="additional_permissions_combined_request_description" msgid="7136418603696342323">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> nayo ifuna ukufinyelela kulawa masethingi eHealth Connect"</string>
+    <string name="background_read_medical_combined_request_title_both_types_granted" msgid="4225111383019900451">"Finyelela yonke idatha engemuva"</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" msgid="7245376864667067106">"Finyelela amarekhodi ezempilo engemuva"</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" msgid="2639416977416876229">"Finyelela idatha yokufaneleka nenhlalakahle engemuva"</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" msgid="8812552783934180223">"Vumela le app ukuthi ifinyelele idatha yokufaneleka nokuphila kahle kanye namarekhodi ezempilo uma ungasebenzisi i-app"</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" msgid="5140647084504657934">"Vumela le app ifinyelele le datha uma ungayisebenzisi i-app"</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" msgid="919785628751851996">"Vumela le app ifinyelele le datha uma ungayisebenzisi i-app"</string>
+    <string name="background_read_combined_request_title" msgid="4184649296697480520">"Finyelela idatha engemuva"</string>
+    <string name="background_read_combined_request_description" msgid="2423480522986545286">"Vumela le app ifinyelele kudatha yakho yeHealth Connect uma ungayisebenzisi i-app"</string>
+    <string name="history_read_medical_combined_request_title" msgid="1262267962861942478">"Finyelela idatha yesikhathi esidlule yokufaneleka nenhlalakahle"</string>
+    <string name="history_read_medical_combined_request_description" msgid="7550922315652791771">"Vumela le app ukuthi ifinyelele idatha efakwe ngaphambi komhla ka-<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_combined_request_description_fallback" msgid="3567968660826834911">"Vumela le app ukuthi ifinyelele yonke idatha yangaphambili"</string>
+    <string name="history_read_combined_request_title" msgid="9023811767370482028">"Finyelela idatha eyedlule"</string>
+    <string name="history_read_combined_request_description" msgid="1437787086896636484">"Vumela le app ukuthi ifinyelele idatha yeHealth Connect efakwe ngaphambi komhla ka-<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_combined_request_description_fallback" msgid="4974756796396067521">"Vumela le app ukuthi ifinyelele yonke idatha edlule yeHealth Connect"</string>
+    <string name="history_read_medical_combined_request_footer" msgid="5301940225768076844">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ingavele ifinyelele idatha yangaphambilini yamarekhodi akho ezempilo"</string>
+    <string name="history_read_medical_combined_request_footer_link" msgid="355676489585738987">"Funda kabanzi mayelana nezimvume"</string>
+    <string name="background_read_medical_access_title_both_types_granted" msgid="4475972082863444603">"Finyelela yonke idatha engemuva"</string>
+    <string name="background_read_medical_access_title_medical_granted" msgid="7852915238347056139">"Finyelela amarekhodi ezempilo engemuva"</string>
+    <string name="background_read_medical_access_title_fitness_granted" msgid="8691675952190647227">"Finyelela idatha yokufaneleka nenhlalakahle engemuva"</string>
+    <string name="background_read_medical_access_description_both_types_granted" msgid="7193350031798606366">"Vumela le app ukuthi ifinyelele idatha yokufaneleka nokuphila kahle kanye namarekhodi ezempilo uma ungasebenzisi i-app"</string>
+    <string name="background_read_medical_access_description_medical_granted" msgid="8570683510275055450">"Vumela le app ifinyelele le datha uma ungayisebenzisi i-app"</string>
+    <string name="background_read_medical_access_description_fitness_granted" msgid="2584567718805499407">"Vumela le app ifinyelele le datha uma ungayisebenzisi i-app"</string>
+    <string name="background_read_access_title" msgid="4184498185599147117">"Finyelela idatha engemuva"</string>
+    <string name="background_read_access_description" msgid="2360433029368320323">"Vumela le app ifinyelele kudatha yakho yeHealth Connect uma ungayisebenzisi i-app"</string>
+    <string name="history_read_medical_access_title" msgid="1375462150672418692">"Finyelela idatha yesikhathi esidlule yokufaneleka nenhlalakahle"</string>
+    <string name="history_read_medical_access_description" msgid="5615959269427106141">"Vumela le app ukuthi ifinyelele idatha efakwe ngaphambi komhla ka-<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_medical_access_description_fallback" msgid="3888547064992673535">"Vumela le app ukuthi ifinyelele yonke idatha yangaphambili"</string>
+    <string name="history_read_access_title" msgid="870048398702887144">"Finyelela idatha eyedlule"</string>
+    <string name="history_read_access_description" msgid="800722432229526128">"Vumela le app ukuthi ifinyelele idatha yeHealth Connect efakwe ngaphambi komhla ka-<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
+    <string name="history_read_access_description_fallback" msgid="4151538305657852010">"Vumela le app ukuthi ifinyelele yonke idatha eyedlule yeHealth Connect"</string>
+    <string name="history_read_medical_access_read_warning" msgid="8878271647163400440">"Ayikho idatha yokufaneleka efundwayo okwamanje ngoba i-<xliff:g id="APP_NAME">%1$s</xliff:g> ayinazo izimvume zokufunda ezivuliwe"</string>
+    <string name="additional_access_medical_read_footer" msgid="4640796038121080343">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ingavele ifinyelele idatha yangaphambilini yamarekhodi akho ezempilo Ukuze ushintshe lokhu, vala izimvume zerekhodi lezempilo zale app"</string>
+    <string name="additional_access_medical_read_footer_link" msgid="2797623091827504856">"Phatha izimvume zerekhodi lezempilo"</string>
+    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Nika amandla okungenani i-read permission eyodwa ukuze uvule ukufinyelela kwangemuva noma okwedatha yangaphambilini yale app"</string>
+    <string name="additional_access_background_footer" msgid="1638739578431818525">"Nika amandla okungenani i-read permission eyodwa ukuze uvule ukufinyelela kwangemuva kwale app"</string>
+    <string name="additional_access_history_footer" msgid="5326814559930548467">"Nika amandla okungenani i-read permission eyodwa ukuze uvule ukufinyelela kwedatha yangaphambilini yale app"</string>
+    <string name="historic_access_description" msgid="3309195636349468633">"Vumela le app ukuthi ifinyelele yonke idatha edlule yeHealth Connect"</string>
     <string name="background_read_description" msgid="3203594555849969283">"Vumela le app ifinyelele kudatha yakho ye-Health Connect uma ungayisebenzisi i-app"</string>
-    <string name="background_read_request_description" msgid="1664402237648709581">"Uma uyivumela, le app izofinyelela kudatha ye-Health Connect uma ungayisebenzisi i-app."</string>
-    <string name="historic_access_title" msgid="3584594624937737030">"Finyelela idatha eyedlule"</string>
-    <string name="historic_access_request_title" msgid="4645920231853414742">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ifinyelele kudatha eyedlule?"</string>
-    <string name="historic_access_description" msgid="2616669701088141765">"Vumela le app ukuthi ifinyelele idatha ye-Health Connect efakwe ngaphambi komhla ka-<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>"</string>
-    <string name="historic_access_description_fallback" msgid="3361696143557784403">"Vumela le app ukuthi ifinyelele yonke idatha edlule ye-Health Connect"</string>
-    <string name="historic_access_request_description" msgid="136335743939253358">"Uma uyivumela, le app izofinyelela kudatha ye-Health Connect efakwe ngaphambi komhla ka-<xliff:g id="DATA_ACCESS_DATE">%1$s</xliff:g>."</string>
-    <string name="historic_access_request_description_fallback" msgid="8519401358044984479">"Uma uyivumela, le app izofinyelela yonke idatha edlule ye-Health Connect."</string>
     <string name="active_calories_burned_uppercase_label" msgid="6231684842932528272">"Amakhalari asebenzayo ashisiwe"</string>
     <string name="active_calories_burned_lowercase_label" msgid="6743090878253096737">"amakhalari asebenzayo ashisiwe"</string>
     <string name="active_calories_burned_read_content_description" msgid="6449442660408754186">"Funda amakhalari asebenzayo ashisiwe"</string>
@@ -155,6 +196,10 @@
     <string name="wheelchair_pushes_lowercase_label" msgid="8919337990806379687">"ukuphusha isihlalo sabakhubazekile"</string>
     <string name="wheelchair_pushes_read_content_description" msgid="157304610943976471">"Funda ukuphusha kwesihlalo sabakhubazekile"</string>
     <string name="wheelchair_pushes_write_content_description" msgid="2745600707106818641">"Bhala ukuphusha kwesihlalo sabakhubazekile"</string>
+    <string name="activity_intensity_uppercase_label" msgid="8718366426053335611">"Ubukhulu bomsebenzi"</string>
+    <string name="activity_intensity_lowercase_label" msgid="4260366013498161858">"ubukhulu bomsebenzi"</string>
+    <string name="activity_intensity_read_content_description" msgid="5503681098610026279">"Funda ubukhulu bomsebenzi"</string>
+    <string name="activity_intensity_write_content_description" msgid="4843212785611055496">"Bhala ubukhulu bomsebenzi"</string>
     <string name="basal_metabolic_rate_uppercase_label" msgid="4802351493928086473">"Isilinganiselo se-Basal metabolic"</string>
     <string name="basal_metabolic_rate_lowercase_label" msgid="7195596626083893231">"isilinganiselo se-Basal metabolic"</string>
     <string name="basal_metabolic_rate_read_content_description" msgid="5583222212705234907">"Funda isilinganiselo se-basal metabolic"</string>
@@ -267,34 +312,44 @@
     <string name="skin_temperature_lowercase_label" msgid="7456421703641980581">"izinga lokushisa lesikhumba"</string>
     <string name="skin_temperature_read_content_description" msgid="1896127631429717621">"Funda izinga lokushisa lesikhumba"</string>
     <string name="skin_temperature_write_content_description" msgid="6448587289116206085">"Bhala izinga lokushisa lesikhumba"</string>
+    <string name="browse_health_records_intro" msgid="1611488691642390523">"Lokhu kufaka wonke amarekhodi ezempilo avunyelaniswe futhi engezwa kuHealth Connect. Leli kungenzeka kungabi yirekhodi lakho lezempilo eligcwele futhi alifaki incazelo yezempilo yamarekhodi akho ezempilo."</string>
     <string name="all_medical_data_uppercase_label" msgid="2380759160541898783">"Wonke amarekhodi ezempilo"</string>
     <string name="all_medical_data_lowercase_label" msgid="6293814928992081842">"wonke amarekhodi ezempilo"</string>
     <string name="all_medical_data_content_description" msgid="4846586780533295022">"Bhala wonke amarekhodi ezempilo"</string>
-    <string name="allergy_intolerance_uppercase_label" msgid="962905760867412783">"Okugulisayo"</string>
-    <string name="allergy_intolerance_lowercase_label" msgid="8705895234297776508">"okugulisayo"</string>
-    <string name="allergy_intolerance_content_description" msgid="5938549394285540206">"Funda okugulisayo"</string>
-    <string name="immunization_uppercase_label" msgid="1467176749064014020">"Ukugoma"</string>
-    <string name="immunization_lowercase_label" msgid="6464922369026887687">"ukugoma"</string>
-    <string name="immunization_content_description" msgid="2910674919337229803">"Funda ngokugoma"</string>
-    <string name="laboratory_results_uppercase_label" msgid="2521886562709901654">"Imiphumela Yaselabhorethri"</string>
-    <string name="laboratory_results_lowercase_label" msgid="6437932041744631964">"imiphumela yaselabhorethri"</string>
-    <string name="laboratory_results_content_description" msgid="5882338877203692484">"Funda imiphumela yaselabhorethri"</string>
+    <string name="allergies_intolerances_uppercase_label" msgid="2458552115947636884">"Okugulisayo"</string>
+    <string name="allergies_intolerances_lowercase_label" msgid="5066782073511167288">"okugulisayo"</string>
+    <string name="allergies_intolerances_content_description" msgid="7954532940667325068">"Funda okugulisayo"</string>
+    <string name="conditions_uppercase_label" msgid="5260404343402770877">"Izimo"</string>
+    <string name="conditions_lowercase_label" msgid="2678248918552246997">"izimo"</string>
+    <string name="conditions_content_description" msgid="3230552343616193829">"Izimo zokufunda"</string>
+    <string name="vaccines_uppercase_label" msgid="1101176371071123187">"Imigomo"</string>
+    <string name="vaccines_lowercase_label" msgid="4991324441768127447">"imigomo"</string>
+    <string name="vaccines_content_description" msgid="7152741514791951684">"Funda imigomo"</string>
+    <string name="laboratory_results_uppercase_label" msgid="3400725778254150910">"Imiphumela yelebhu"</string>
+    <string name="laboratory_results_lowercase_label" msgid="7647457227104919126">"imiphumela yelebhu"</string>
+    <string name="laboratory_results_content_description" msgid="7888886103734085841">"Funda imiphumela yelebhu"</string>
     <string name="medications_uppercase_label" msgid="4783281053427990225">"Amakhambi emithi"</string>
     <string name="medications_lowercase_label" msgid="7808038774503092207">"amakhambi emithi"</string>
     <string name="medications_content_description" msgid="6165382876281780190">"Funda amakhambi emithi"</string>
+    <string name="personal_details_uppercase_label" msgid="7241635933310394120">"Imininingwane yomuntu siqu"</string>
+    <string name="personal_details_lowercase_label" msgid="1907848447611775151">"imininingwane yomuntu siqu"</string>
+    <string name="personal_details_content_description" msgid="3191211304673909831">"Ukufunda imininingwane yomuntu siqu"</string>
+    <string name="practitioner_details_uppercase_label" msgid="2940667649808082510">"Imininingwane kadokotela"</string>
+    <string name="practitioner_details_lowercase_label" msgid="8195591077717971542">"imininingwane kadokotela"</string>
+    <string name="practitioner_details_content_description" msgid="8775396516928504185">"Ukufunda imininingwane kadokotela"</string>
     <string name="pregnancy_uppercase_label" msgid="5979925175194337864">"Ukukhulelwa"</string>
     <string name="pregnancy_lowercase_label" msgid="810439290131044517">"ukukhulelwa"</string>
     <string name="pregnancy_content_description" msgid="3436773729243586287">"Funda ukukhulelwa"</string>
-    <string name="problems_uppercase_label" msgid="4047882613795113715">"Izinkinga"</string>
-    <string name="problems_lowercase_label" msgid="6934298611508910866">"izinkinga"</string>
-    <string name="problems_content_description" msgid="1549418294742668962">"Funda izinkinga"</string>
     <string name="procedures_uppercase_label" msgid="9176087520132593261">"Izinqubo"</string>
     <string name="procedures_lowercase_label" msgid="5320804313946273234">"izinqubo"</string>
     <string name="procedures_content_description" msgid="1086900373141440005">"Funda izinqubo"</string>
-    <string name="social_history_uppercase_label" msgid="1731364502071035544">"Umlando Womphakathi"</string>
+    <string name="social_history_uppercase_label" msgid="4119611299449533999">"Umlando womphakathi"</string>
     <string name="social_history_lowercase_label" msgid="9027541979445736412">"umlando womphakathi"</string>
     <string name="social_history_content_description" msgid="7187059309389849831">"Funda ngomlando womphakathi"</string>
-    <string name="vital_signs_uppercase_label" msgid="214938594708280346">"Izimpawu Ezisemqoka"</string>
+    <string name="visits_uppercase_label" msgid="8532619758336375886">"Ukuvakasha"</string>
+    <string name="visits_lowercase_label" msgid="2545887061364564151">"ukuvakasha"</string>
+    <string name="visits_content_description" msgid="6336796415049565697">"Ukufunda ukuvakashelwa"</string>
+    <string name="vital_signs_uppercase_label" msgid="289862347143374640">"Izimpawu ezisemqoka"</string>
     <string name="vital_signs_lowercase_label" msgid="9141304492316454529">"izimpawu ezisemqoka"</string>
     <string name="vital_signs_content_description" msgid="914944352640528612">"Funda izimpawu ezisemqoka"</string>
     <string name="mindfulness_uppercase_label" msgid="7678646522566275472">"Ukugcwala kwengqondo"</string>
@@ -303,16 +358,25 @@
     <string name="mindfulness_write_content_description" msgid="7925112426563398421">"Bhala ukugcwala kwengqondo"</string>
     <string name="read_permission_category" msgid="6002099618259628632">"Vumela i-“<xliff:g id="APP_NAME">%1$s</xliff:g>” ukuba ifunde"</string>
     <string name="write_permission_category" msgid="1529702804865008111">"Vumela i-“<xliff:g id="APP_NAME">%1$s</xliff:g>” ukuba ibhale"</string>
-    <string name="request_permissions_cancel" msgid="1787483997235365393">"Khansela"</string>
     <string name="request_permissions_allow" msgid="4201324235711040631">"Vumela"</string>
     <string name="request_permissions_allow_all" msgid="3419414351406638770">"Vumela konke"</string>
     <string name="request_permissions_dont_allow" msgid="6375307410951549030">"Ungavumeli"</string>
-    <string name="request_permissions_header_desc" msgid="5561173070722750153">"Khetha idatha ofuna ukuthi le-app iyifunde noma iyibhale ku-Health Connect"</string>
+    <string name="request_permissions_data_access_type_read_write" msgid="3179244850699732544">"Khetha idatha ofuna ukuthi le-app iyifunde noma iyibhale ku-Health Connect"</string>
+    <string name="request_permissions_data_access_type_read" msgid="6005792244220381045">"Khetha idatha ofuna le app iyifunde kuHealth Connect"</string>
+    <string name="request_permissions_data_access_type_write" msgid="6369810467678676337">"Khetha idatha ofuna le app ukuthi iyibhale kuHealth Connect"</string>
     <string name="request_permissions_header_time_frame_desc" msgid="3023660534681391973">"Uma unikeza ukufinyelela kokufunda, i-app ingafunda idatha entsha nedatha yezinsukwini ezingu-30 ezedlule"</string>
     <string name="request_permissions_header_time_frame_history_desc" msgid="3792732353571153175">"Uma unikeza ukufinyelela kokufunda, i-app ungafunda idatha entsha neyesikhathi esedlule"</string>
     <string name="request_permissions_header_title" msgid="4264236128614363479">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukuthi ifinyelele i-Health Connect?"</string>
-    <string name="request_permissions_rationale" msgid="6154280355215802538">"Ungafunda ukuthi i-<xliff:g id="APP_NAME">%1$s</xliff:g> iyiphatha kanjani idatha yakho ku-<xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g> yonjiniyela"</string>
+    <string name="request_permissions_with_medical_header_title" msgid="6269944931319362595">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukuthi ifinyelele idatha yokufaneleka nenhlalakahle?"</string>
+    <string name="request_permissions_rationale" msgid="2642076968583316986">"Ungafunda ukuthi i-<xliff:g id="APP_NAME">%1$s</xliff:g> iyiphatha kanjani idatha yakho kokuthi <xliff:g id="PRIVACY_POLICY_LINK">%2$s</xliff:g>"</string>
     <string name="request_permissions_privacy_policy" msgid="228503452643555737">"inqubomgomo yobumfihlo"</string>
+    <string name="medical_request_header" msgid="2300521519021510027">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukuze ufinyelele amarekhodi akho ezempilo?"</string>
+    <string name="medical_request_header_access_info_read_write" msgid="221400464566148357">"Uma unikeza ukufinyelela, i-app ingafunda futhi ibhale idatha efana nokungezwani komzimba nezinto ezithile, imiphumela yalebhu, imithi yokugoma nokunye.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_header_access_info_read" msgid="7817630833626125558">"Uma unikeza ukufinyelela, i-app ingafunda idatha efana nokungezwani komzimba nezinto ezithile, imiphumela yalebhu, imithi yokugoma nokunye.\n<xliff:g id="ABOUT_HEALTH_RECORDS_LINK">%1$s</xliff:g>"</string>
+    <string name="medical_request_about_health_records" msgid="7204918218748362687">"Mayelana namarekhodi ezempilo"</string>
+    <string name="medical_request_data_to_share" msgid="6778034304921873317">"Idatha ezokwabiwa ifaka"</string>
+    <string name="medical_request_summary" msgid="7281321524805015510">"Uma uyivumela, i-<xliff:g id="APP_NAME">%1$s</xliff:g> ingabelana ngamarekhodi akho ezempilo neHealth Connect."</string>
+    <string name="medical_request_footer" msgid="6533749932770903089">"Vumelanisa amarekhodi akho ezempilo avela kuma-app nemithombo ehlukene ukuze uwagcine endaweni eyodwa"</string>
     <string name="permissions_disconnect_dialog_title" msgid="7355211540619034695">"Susa zonke izimvume?"</string>
     <string name="permissions_disconnect_dialog_disconnect" msgid="8854787587948224752">"Susa konke"</string>
     <string name="permissions_disconnect_dialog_message" msgid="7961269838207365478">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ibhale idatha evela ku-Health Connect.\n\nLokhu akuthinti ezinye izimvume le app okungenzeka inazo, njengekhamera, imakrofoni, noma indawo."</string>
@@ -320,20 +384,28 @@
     <string name="permissions_disconnect_dialog_message_history" msgid="3793206180295111081">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ibhale noma iyiphi idatha kusuka ku-Health Connect, okufaka idatha yangaphambilini.\n\nLokhu akufaki ezinye izimvume le app engaba nazo, njengendawo, ikhamera, noma imakrofoni."</string>
     <string name="permissions_disconnect_dialog_message_combined" msgid="4163369526932602203">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ibhale noma iyiphi idatha evela ku-Health Connect, okufaka idatha yokungemuva neyangaphambilini.\n\nLokhu akufaki ezinye izimvume le app engaba nazo, njengendawo, ikhamera, noma imakrofoni."</string>
     <string name="permissions_disconnect_dialog_checkbox" msgid="8646951566431872823">"Futhi sula idatha ye-<xliff:g id="APP_NAME">%1$s</xliff:g> ku-Health Connect"</string>
-    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Susa zonke izimvume?"</string>
-    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Susa zonke izimvume zerekhodi lezempilo?"</string>
     <string name="disconnect_all_fitness_permissions_title" msgid="7612364222525900592">"Susa zonke izimvume zempilo enhle nenhlalakahle?"</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" msgid="8808559689899914478">"Phinde usule idatha yokufaneleka evela ku-<xliff:g id="APP_NAME">%1$s</xliff:g> kuHealth Connect"</string>
+    <string name="disconnect_all_medical_permissions_title" msgid="735315242997370168">"Susa zonke izimvume zerekhodi lezempilo?"</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" msgid="7782158941871987263">"Phinde usule amarekhodi ezempilo avela ku-<xliff:g id="APP_NAME">%1$s</xliff:g> kuHealth Connect"</string>
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" msgid="6610810945930258582">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ibhale le datha evela kuHealth Connect.\n\nLokhu akuzithinti ezinye izimvume le app engase ibe inazo, njengekhamera, imakrofoni, noma indawo."</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" msgid="7138878481421234556">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ukubhala le datha evela kuHealth Connect, kuhlanganise idatha yokungemuva.\n\nLokhu akuzithinti ezinye izimvume le app engase ibe nazo, njengekhamera, imakrofoni noma indawo."</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" msgid="1519496566456028625">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ukubhala le datha evela kuHealth Connect, kuhlanganise idatha edlule.\n\nLokhu akuzithinti ezinye izimvume le app engase ibe nazo, njengekhamera, imakrofoni noma indawo."</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" msgid="5147728456578218902">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ukubhala le datha evela kuHealth Connect, kuhlanganise idatha yokungemuva kanye nedlule.\n\nLokhu akuzithinti ezinye izimvume le app engase ibe nazo, njengekhamera, imakrofoni noma indawo."</string>
+    <string name="disconnect_all_health_permissions_title" msgid="3995410660376966233">"Susa zonke izimvume?"</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" msgid="211728516196974197">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ibhale idatha evela kuHealth Connect.\n\nLokhu akuzithinti ezinye izimvume le app engase ibe inazo, njengekhamera, imakrofoni, noma indawo."</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" msgid="654533675296670869">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ukubhala kuHealth Connect, kuhlanganise idatha yokungemuva.\n\nLokhu akuzithinti ezinye izimvume le app engase ibe nazo, njengekhamera, imakrofoni noma indawo."</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" msgid="6743215620789357899">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ukubhala kuHealth Connect, kuhlanganise idatha edlule.\n\nLokhu akuzithinti ezinye izimvume le app engase ibe nazo, njengekhamera, imakrofoni noma indawo."</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" msgid="6062891741278986209">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ngeke isakwazi ukufunda noma ukubhala idatha evela kuHealth Connect, kuhlanganise idatha yokungemuva kanye nedlule.\n\nLokhu akuzithinti ezinye izimvume le app engase ibe nazo, njengekhamera, imakrofoni noma indawo."</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" msgid="762880061016391846">"Phinde usule idatha yokuzivocavoca namarekhodi ezempilo avela ku-<xliff:g id="APP_NAME">%1$s</xliff:g> kuHealth Connect"</string>
     <string name="disconnect_all_health_permissions_success_toast" msgid="9010063821116197894">"Kususwe izimvume zale app"</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" msgid="2927403999111348272">"Futhi sula yonke idatha yeHealth Connect"</string>
     <string name="navigation_next_day" msgid="8853443471183944219">"Usuku olulandelayo"</string>
     <string name="navigation_selected_day" msgid="2510843479734091348">"Usuku olukhethiwe"</string>
     <string name="navigation_previous_day" msgid="718353386484938584">"Usuku lwangaphambilini"</string>
     <string name="default_error" msgid="7966868260616403475">"Kukhona okungahambanga kahle. Sicela uzame futhi."</string>
     <string name="unkwown_resource" msgid="7932225227431922125">"Insiza Engaziwa."</string>
+    <string name="raw_fhir_title" msgid="1295744907036066319">"Idatha engumthombo"</string>
     <string name="raw_fhir_open_bracket" msgid="7974657451368655325">"<xliff:g id="PREFIX">%1$s</xliff:g>Abakaki abavuliwe."</string>
     <string name="raw_fhir_closed_bracket" msgid="9084379463440675078">"<xliff:g id="PREFIX">%1$s</xliff:g>Abakaki abavaliwe."</string>
     <string name="raw_fhir_field_value" msgid="369633095565031835">"<xliff:g id="PREFIX">%1$s</xliff:g> Inkambu <xliff:g id="FIELD">%2$s</xliff:g> Inani"</string>
@@ -361,20 +433,21 @@
     <string name="inactive_apps_section_message" msgid="2610789262055974739">"Lawa ma-app awasenakho ukufinyelela, kodwa asenayo idatha egcinwe ku-Health Connect"</string>
     <string name="manage_permissions_time_frame" msgid="1299483940842401923">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ingafunda idatha eyengeziwe ngemva komhla ka-<xliff:g id="DATA_ACCESS_DATE">%2$s</xliff:g>"</string>
     <string name="other_android_permissions" msgid="8051485761573324702">"Ukuze uphathe ezinye izimvume ze-Android le app engafinyelela kuzo, iya Kumasethingi &gt; Ama-app"</string>
-    <string name="manage_permissions_rationale" msgid="9183689798847740274">"Idatha owabelana ngayo no-<xliff:g id="APP_NAME">%1$s</xliff:g> ivikelwe yinqubomgomo yayo yobumfihlo"</string>
+    <string name="manage_permissions_rationale" msgid="2780008055185441703">"Ungafunda ukuthi i-<xliff:g id="APP_NAME">%1$s</xliff:g> iyisingatha kanjani idatha yakho kunqubomgomo yobumfihlo yonjiniyela"</string>
     <string name="other_android_permissions_content_description" msgid="2261431010048933820">"Ukuze uphathe ezinye izimvume ze-Android le-app engafinyelela kuzo, yiya kokuthi Amasethingi, bese uthepha ama-App"</string>
     <string name="manage_permissions_learn_more" msgid="2503189875093300767">"Funda inqubomgomo yobumfihlo"</string>
     <string name="app_perms_content_provider_24h" msgid="5977152673988158889">"Ifinyelelwe emahoreni angama-24 adlule"</string>
     <string name="app_access_title" msgid="7137018424885371763">"Ukufinyelela kwe-app"</string>
     <string name="connected_apps_empty_list_section_title" msgid="6821215432694207342">"Okwamanje awunawo ama-app ahambelanayo afakiwe."</string>
     <string name="additional_access_label" msgid="4645249249222528341">"Ukufinyelela okungeziwe"</string>
+    <string name="additional_access_summary" msgid="1076197455435130191">"Idatha edlule, idatha yasemuva"</string>
     <string name="removed_additional_permissions_toast" msgid="3443687215509477284">"Izimvume ezisusiwe ezengeziwe zale app"</string>
     <string name="permissions_header" msgid="6519976063360071569">"Izimvume"</string>
     <string name="fitness_permissions" msgid="586264186537460254">"Ukufaneleka nempilo enhle"</string>
     <string name="fitness_permissions_summary" msgid="6476469281589015459">"Ukujima, ukulala, ukudla okunomsoco nokunye"</string>
     <string name="medical_permissions" msgid="1224097151249321566">"Amarekhodi ezempilo"</string>
     <string name="medical_permissions_lowercase" msgid="3969792205103436491">"amarekhodi ezempilo"</string>
-    <string name="medical_permissions_summary" msgid="5553982055903211592">"Imiphumela yaselebhu, imithi, ukugonywa nokunye"</string>
+    <string name="medical_permissions_summary" msgid="5526004634109548577">"Imiphumela yelebhu, imithi, imigomo nokunye"</string>
     <string name="denied_apps_banner_title" msgid="1997745063608657965">"Izimvume zama-app ezisusiwe"</string>
     <string name="denied_apps_banner_message_one_app" msgid="17659513485678315">"I-Health Connect isuse izimvume ze-<xliff:g id="APP_DATA">%s</xliff:g>"</string>
     <string name="denied_apps_banner_message_two_apps" msgid="1147216810892373640">"I-Health Connect isuse izimvume ze-<xliff:g id="APP_DATA_0">%1$s</xliff:g>, ne-<xliff:g id="APP_DATA_TWO">%2$s</xliff:g>"</string>
@@ -466,6 +539,8 @@
     <string name="export_import_go_to_play_store_text" msgid="3210733429377429794">"Iya kuPlay Store"</string>
     <string name="onboarding_title" msgid="8550656211291180188">"Qalisa nge-Health Connect"</string>
     <string name="onboarding_description" msgid="3479157507808350452">"IHealth Connect igcina ngokuvikelekile idatha yakho yezempilo nokufaneleka, okukunikeza indlela elula yokuvumelanisa ama-app ahlukile edivayisini yakho"</string>
+    <string name="onboarding_description_health_records" msgid="6586657048844511252">"IHealth Connect igcina futhi ivumelanise idatha yakho yezempilo nokufaneleka okuvela kuma-app ahlukene.\n\n"<b>"Idatha yokufaneleka nokuphila kahle,"</b>" okuhlanganisa izikhathi zokujima, izinyathelo, ukudla okunomsoco, ukulala nokuningi\n\n"<b>"Amarekhodi ezempilo,"</b>" okuhlanganisa ukugoma, imiphumela yelebhu nokunye"</string>
+    <string name="onboarding_description_with_health_connect" msgid="8751881078749676542">"NgeHealth Connect ungakwazi"</string>
     <string name="share_data" msgid="3481932156368883946">"Yabelana ngedatha nama-app akho"</string>
     <string name="share_data_description" msgid="2919871301634375092">"Khetha idatha i-app ngayinye engayifunda noma iyibhalele ku-Health Connect"</string>
     <string name="manage_your_settings" msgid="7391184508015127137">"Phatha amasethingi akho nobumfihlo"</string>
@@ -566,7 +641,9 @@
     <string name="flow_light" msgid="1937543318146228793">"Ukopha kancane"</string>
     <string name="flow_medium" msgid="3783688724668943154">"Ukopha ngokumaphakathi"</string>
     <string name="flow_heavy" msgid="8672261792750634294">"Ukopha kakhulu"</string>
+    <string name="flow_unknown" msgid="1634411759928572900">"Ukopha okungaziwa"</string>
     <string name="period_day" msgid="3821944462093965882">"Usuku lwenkathi olu-<xliff:g id="DAY">%1$d</xliff:g> kwangu-<xliff:g id="TOTAL_LENGTH">%2$d</xliff:g>"</string>
+    <string name="period_length" msgid="2257138792780916599">"{count,plural, =1{Ukuya esikhathini (usuku olu-1)}one{Ukuya esikhathini (izinsuku ezingu-#)}other{Ukuya esikhathini (izinsuku ezingu-#)}}"</string>
     <string name="ovulation_positive" msgid="6588547263126320238">"Okuhle"</string>
     <string name="ovulation_negative" msgid="591588801112312454">"Okubi"</string>
     <string name="ovulation_high" msgid="205362931427158291">"Phezulu"</string>
@@ -713,6 +790,8 @@
     <string name="mindfulness_type_music" msgid="7041364137895485917">"Umculo"</string>
     <string name="mindfulness_type_other" msgid="793524328911038908">"Okunye"</string>
     <string name="mindfulness_type_unguided" msgid="2367259868577157922">"Akuqondisiwe"</string>
+    <string name="activity_intensity_type_moderate" msgid="7974792315871109564">"Maphakathi"</string>
+    <string name="activity_intensity_type_vigorous" msgid="5651020560923780330">"Unamandla"</string>
     <string name="minute_duration" msgid="9035288227090160206">"umzuzu o-<xliff:g id="MINUTE">%1$s</xliff:g>"</string>
     <string name="hour_minute_duration_short" msgid="6862483734123680444">"<xliff:g id="HOUR">%1$s</xliff:g>h <xliff:g id="MIN">%2$s</xliff:g>m"</string>
     <string name="hour_duration" msgid="3472489613837138711">"ihora eli-<xliff:g id="HOUR">%1$s</xliff:g>"</string>
@@ -965,23 +1044,18 @@
     <string name="migration_in_progress_screen_title" msgid="6564515269988205874">"Ukuhlanganisa kuyaqhubeka"</string>
     <string name="migration_in_progress_screen_integration_details" msgid="5916989113111973466">"I-Health Connect ihlanganiswa nesistimu ye-Android.\n\nKungase kuthathe isikhathi ngenkathi idatha yakho nezimvume kudluliselwa."</string>
     <string name="migration_in_progress_screen_integration_dont_close" msgid="2095732208438772444">"Ungayivali i-app uze uthole isaziso sokuthi inqubo isiphelile."</string>
-    <string name="migration_in_progress_notification_title" msgid="8873411008158407737">"Ukuhlanganiswa kwe-Health Connect kuyaqhubeka"</string>
     <string name="migration_update_needed_screen_title" msgid="3260466598312877429">"Kudingeka isibuyekezo"</string>
     <string name="migration_update_needed_screen_details" msgid="7984745102006782603">"I-Health Connect ihlanganiswa nesistimu ye-Android ukuze ukwazi ukuyifinyelela ngokuqondile ukusuka kumasethingi akho."</string>
     <string name="update_button" msgid="4544529019832009496">"Buyekeza"</string>
     <string name="migration_update_needed_notification_content" msgid="478899618719297517">"Qala lesi sibuyekezo ukuze i-Health Connect iqhubeke nokuhlanganisa namasethingi esistimu yakho"</string>
-    <string name="migration_update_needed_notification_action" msgid="1219223694165492000">"Buyekeza manje"</string>
     <string name="migration_module_update_needed_notification_title" msgid="5428523284357105379">"Isibuyekezo sesistimu siyadingeka"</string>
     <string name="migration_module_update_needed_action" msgid="7211167950758064289">"Ngaphambi kokuqhubeka, buyekeza isistimu yefoni yakho."</string>
     <string name="migration_module_update_needed_restart" msgid="1246884613546321798">"Uma usuvele ubuyekeze isistimu yefoni yakho, zama ukuqala kabusha ifoni yakho ukuze uqhubeke nokuhlanganisa"</string>
-    <string name="migration_app_update_needed_notification_title" msgid="8971076370900025444">"Kudingeka isibuyekezo se-Health Connect"</string>
     <string name="migration_app_update_needed_action" msgid="3289432528592774601">"Ngaphambi kokuqhubeka, buyekeza i-app ye-Health Connect ibe uhlobo lwakamuva."</string>
     <string name="migration_more_space_needed_screen_title" msgid="1535473230886051579">"Isikhala esengeziwe siyadingeka"</string>
     <string name="migration_more_space_needed_screen_details" msgid="621140247825603412">"I-Health Connect idinga isikhala sesitoreji esingu-<xliff:g id="SPACE_NEEDED">%1$s</xliff:g> kufoni yakho ukuze ukuhlanganiswa kuqhubeke.\n\nSula isikhala efonini yakho bese uyazama futhi."</string>
     <string name="try_again_button" msgid="8745496819992160789">"Zama futhi"</string>
     <string name="free_up_space_button" msgid="4141013808635654695">"Yenza isikhala"</string>
-    <string name="migration_more_space_needed_notification_title" msgid="8238155395120107672">"Isikhala esengeziwe siyadingeka"</string>
-    <string name="migration_more_space_needed_notification_content" msgid="4034728181940567836">"I-Health Connect idinga isikhala esingu-<xliff:g id="SPACE_NEEDED">%1$s</xliff:g> sesitoreji kufoni yakho ukuze uqhubeke nokuhlanganisa."</string>
     <string name="migration_paused_screen_title" msgid="8041170155372429894">"Ukuhlanganisa kumisiwe"</string>
     <string name="migration_paused_screen_details" msgid="5898311710030340187">"I-app ye-Health Connect ivaliwe ngenkathi ihlanganiswa nesistimu ye-Android.\n\nChofoza okuthi qhubeka ukuze uvule kabusha i-app futhi uqhubeke nokudlulisa idatha yakho nezimvume."</string>
     <string name="migration_paused_screen_details_timeout" msgid="353768000785837394">"Ukuze ugcine idatha yakho ye-Health Connect, qedela lokhu phakathi no-<xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
@@ -992,11 +1066,9 @@
     <string name="resume_migration_banner_description" msgid="6236230413670826036">"Thepha ukuze uqhubeke nokuhlanganisa i-Health Connect ngesistimu ye-Android. Ukuze ugcine idatha yakho, qedela lokhu phakathi no-<xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="resume_migration_banner_description_fallback" msgid="6060444898839211883">"Thepha ukuze uqhubeke nokuhlanganisa i-Health Connect ngesistimu ye-Android."</string>
     <string name="resume_migration_banner_button" msgid="2112318760107756469">"Qhubeka"</string>
-    <string name="resume_migration_notification_title" msgid="8859575633668908327">"Qhubeka ukuhlanganiswa kwe-Health Connect"</string>
-    <string name="resume_migration_notification_content" msgid="46172108837648715">"Ukuze ugcine idatha yakho, qedela lokhu phakathi no-<xliff:g id="TIME_NEEDED">%1$s</xliff:g>"</string>
     <string name="app_update_needed_banner_title" msgid="4724335956851853802">"Kudingeka isibuyekezo se-app"</string>
-    <string name="app_update_needed_banner_description_single" msgid="1114809360264027362">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> idinga ukubuyekezwa ukuze iqhubeke nokuvumelanisa nge-Health Connect"</string>
-    <string name="app_update_needed_banner_description_multiple" msgid="4660700626698013764">"Amanye ama-app adinga ukubuyekezwa ukuze aqhubeke nokuvumelanisa nge-Health Connect"</string>
+    <string name="app_update_needed_banner_description_single" msgid="8220676317438592573">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> idinga ukubuyekezwa ukuze iqhubeke nokuvumelanisa ngeHealth Connect. Izibuyekezo kungenzeka zingatholakali kuwo wonke ama-app."</string>
+    <string name="app_update_needed_banner_description_multiple" msgid="6021498912770754575">"Amanye ama-app adinga ukubuyekezwa ukuze aqhubeke nokuvumelanisa ngeHealth Connect. Izibuyekezo kungenzeka zingatholakali kuwo wonke ama-app."</string>
     <string name="app_update_needed_banner_button" msgid="8223115764065649627">"Hlola izibuyekezo"</string>
     <string name="app_update_needed_banner_learn_more_button" msgid="7269232067819258160">"Funda kabanzi"</string>
     <string name="migration_pending_permissions_dialog_title" msgid="6019552841791757048">"Ukuhlanganiswa kwe-Health Connect"</string>
@@ -1011,10 +1083,6 @@
     <string name="migration_not_complete_dialog_title" msgid="3725576338159027149">"Ukuhlanganiswa kwe-Health Connect akuqedanga"</string>
     <string name="migration_not_complete_dialog_content" msgid="4992771587233088606">"Uzothola isaziso uma sesitholakala futhi."</string>
     <string name="migration_not_complete_dialog_button" msgid="3271842109680807482">"Ngiyezwa"</string>
-    <string name="migration_not_complete_notification_title" msgid="7392885522310227293">"Ukuhlanganiswa kwe-Health Connect akuqedanga"</string>
-    <string name="migration_not_complete_notification_action" msgid="757041885992445657">"Funda kabanzi"</string>
-    <string name="migration_complete_notification_title" msgid="4988631739109332404">"Ukuhlanganiswa kwe-Health Connect kuqedile"</string>
-    <string name="migration_complete_notification_action" msgid="5350322865206331186">"Vula"</string>
     <string name="migration_whats_new_dialog_title" msgid="2349465358457105228">"Yini entsha"</string>
     <string name="migration_whats_new_dialog_content" msgid="1271560399054864488">"Manje usungakwazi ukufinyelela i-Health Connect ngokuqondile kumasethingi wakho. Khipha i-app ye-Health Connect nganoma yisiphi isikhathi ukuze uvule isikhala sesitoreji."</string>
     <string name="migration_whats_new_dialog_button" msgid="642575552457587805">"Ngiyezwa"</string>
@@ -1035,7 +1103,8 @@
     <string name="edit_data_sources" msgid="79641360876849547">"Hlela izinsiza ze-app"</string>
     <string name="default_app_summary" msgid="6183876151011837062">"Idivayisi ezenzakalelayo"</string>
     <string name="app_data_title" msgid="6499967982291000837">"Idatha ye-app"</string>
-    <string name="no_data_footer" msgid="4777297654713673100">"Idatha ekuma-app akwazi ukufinyelela ku-Health Connect izovela lapha"</string>
+    <string name="app_data_no_data_footer" msgid="7027700714577530371">"Idatha evela ku-<xliff:g id="APP_NAME">%1$s</xliff:g> izobonakala lapha"</string>
+    <string name="all_data_no_data_footer" msgid="2553443887019153340">"Idatha ekuma-app akwazi ukufinyelela kuHealth Connect izovela lapha"</string>
     <string name="date_picker_day" msgid="3076687507968958991">"Usuku"</string>
     <string name="date_picker_week" msgid="1038805538316142229">"Iviki"</string>
     <string name="date_picker_month" msgid="3560692391260778560">"Inyanga"</string>
@@ -1045,11 +1114,6 @@
     <string name="last_month_header" msgid="1359164797239191253">"Inyanga edlule"</string>
     <string name="tab_entries" msgid="3402700951602029493">"Ukungena"</string>
     <string name="tab_access" msgid="7818197975407243701">"Ukufinyelela"</string>
-    <string name="request_additional_permissions_header_title" msgid="948421892753976588">"Vumela ukufinyelela okwengeziwe kwe-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
-    <string name="request_additional_permissions_description" msgid="4179425089090269042">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> nayo ifuna ukufinyelela kulawa masethingi e-Health Connect"</string>
-    <string name="additional_access_combined_footer" msgid="5967785355544362840">"Nika amandla okungenani i-read permission eyodwa ukuze uvule ukufinyelela kwangemuva noma okwedatha yangaphambilini yale app"</string>
-    <string name="additional_access_background_footer" msgid="1638739578431818525">"Nika amandla okungenani i-read permission eyodwa ukuze uvule ukufinyelela kwangemuva kwale app"</string>
-    <string name="additional_access_history_footer" msgid="5326814559930548467">"Nika amandla okungenani i-read permission eyodwa ukuze uvule ukufinyelela kwedatha yangaphambilini yale app"</string>
     <string name="start_using_hc_banner_title" msgid="2030178284749796384">"Qala ukusebenzisa iHealth Connect"</string>
     <string name="start_using_hc_banner_content" msgid="3171560198945933334">"Vumelanisa ama-app akho okuqala ukuze wabelana ngedatha yezempilo nokufaneleka phakathi kwawo"</string>
     <string name="start_using_hc_set_up_button" msgid="7486865297236439364">"Setha"</string>
@@ -1059,8 +1123,20 @@
     <string name="see_compatible_apps_banner_title" msgid="5217106184748241727">"Bona ama-app ahambelanayo"</string>
     <string name="see_compatible_apps_banner_content" msgid="1940786301699569588">"Thola ama-app amaningi ukuze uvumelanise ne-<xliff:g id="APP_NAME">%s</xliff:g> nge-Health Connect"</string>
     <string name="see_compatible_apps_set_up_button" msgid="8260738204782792905">"Bheka ku-app store"</string>
+    <string name="lock_screen_banner_title" msgid="5384381892985739755">"Setha ukukhiya isikrini"</string>
+    <string name="lock_screen_banner_content" msgid="3392527073622152481">"Ukuze uthole ukuvikeleka okwengeziwe kwedatha yakho yezempilo, setha Iphinikhodi, iphethini, noma iphasiwedi yale divayisi"</string>
+    <string name="lock_screen_banner_button" msgid="2537090011380728122">"Setha ukukhiya isikrini"</string>
     <string name="select_all" msgid="837499881590001166">"Khetha konke"</string>
     <string name="deletion_confirmation_dialog_body" msgid="7643182907084645805">"Ama-app axhumene ngeke esakwazi ukufunda le datha kuHealth Connect"</string>
+    <string name="a11y_checked" msgid="3685413382346589880">"Kuhloliwe"</string>
+    <string name="a11y_unchecked" msgid="6258943223981886207">"Akuhloliwe"</string>
+    <string name="a11y_map_description" msgid="4992907698581164434">"Umzila wemephu yokujima uyatholakala"</string>
+    <string name="a11y_next_day" msgid="7298174378837366410">"Usuku olulandelayo"</string>
+    <string name="a11y_next_week" msgid="6692230156318350735">"Iviki elilandelayo"</string>
+    <string name="a11y_next_month" msgid="4462534553687997396">"Inyanga ezayo"</string>
+    <string name="a11y_previous_day" msgid="2529677154858456085">"Usuku lwangaphambilini"</string>
+    <string name="a11y_previous_week" msgid="2992971531628685405">"Iviki langaphambilini"</string>
+    <string name="a11y_previous_month" msgid="3304373968190750755">"Inyanga yangaphambilini"</string>
     <string name="all_data_selected_deletion_confirmation_dialog" msgid="2103387413531373305">"Sula unomphela yonke idatha?"</string>
     <string name="some_data_selected_deletion_confirmation_dialog" msgid="2466281529240054537">"Sula unomphela idatha ekhethiwe?"</string>
     <string name="all_app_data_selected_deletion_confirmation_dialog" msgid="1077157006579195958">"Sula unomphela yonke idatha ye-<xliff:g id="APP_NAME">%s</xliff:g>?"</string>
@@ -1079,4 +1155,38 @@
     <string name="some_app_entries_selected_week_deletion_confirmation_dialog" msgid="8009352719322914060">"Sula unomphela okukhona okukhethiwe ku-<xliff:g id="APP_NAME">%1$s</xliff:g> kwangeviki lomhla ka-<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" msgid="6617805533334875710">"Sula unomphela okukhona okukhethiwe ku-<xliff:g id="APP_NAME">%1$s</xliff:g> kwangomhla ka-<xliff:g id="SELECTED_DATE_RANGE">%2$s</xliff:g>?"</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" msgid="7101939753210640660">"Sula unomphela lokhu ku-<xliff:g id="APP_NAME">%s</xliff:g>?"</string>
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" msgid="3192411589802497811">"Sula ngokuzenzakalela idatha ye-<xliff:g id="DATA_TYPE">%1$s</xliff:g> ye-<xliff:g id="APP_NAME">%2$s</xliff:g>?"</string>
+    <string name="on" msgid="8266542510798355807">"Vuliwe"</string>
+    <string name="off" msgid="6996623844428550649">"Valiwe"</string>
+    <string name="wear_app_perms_24h_access" msgid="2997184871873750357">"Kufinyelelwe ngo-<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_24h_access_yest" msgid="325061728619254928">"Kufinyelelwe izolo ngo-<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+    <string name="wear_app_perms_7d_access" msgid="5694169440873563459">"Kufinyelelwe ngo-<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+    <string name="request_permissions_allow_all_the_time" msgid="4081502779872893569">"Vumela njalo"</string>
+    <string name="request_permissions_allow_selected" msgid="218527615680495438">"Vumela okukhethiwe"</string>
+    <string name="request_permissions_while_using_the_app" msgid="5155929974398889727">"Ngenkathi usebenzisa i-app"</string>
+    <string name="request_permissions_deny_all" msgid="4123735770293545320">"Yenqaba konke"</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" msgid="7914569541993476826">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukuthi ifinyelele idatha yokufaneleka nenhlalakahle?"</string>
+    <string name="wear_request_multiple_data_type_permissions" msgid="5348997693739610876">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela ukufinyelela ku-<xliff:g id="DATA_TYPES">%2$s</xliff:g>.\n\nKhetha ukuvumela konke noma ukuzilawula ngakunye."</string>
+    <string name="wear_request_single_data_type_permission" msgid="4479262151480683518">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukuze ufinyelele i-<xliff:g id="DATA_TYPE">%2$s</xliff:g>?"</string>
+    <string name="fitness_and_wellness" msgid="2002316898861559748">"Ukufaneleka nempilo enhle"</string>
+    <string name="view_permissions_all_the_time" msgid="6899702815770193290">"ngaso sonke isikhathi"</string>
+    <string name="view_permissions_while_in_use" msgid="2031627107397429473">"lapho isetshenziswa"</string>
+    <string name="view_permissions_all_the_time_cap" msgid="7703114160274796464">"Ngaso sonke isikhathi"</string>
+    <string name="view_permissions_while_in_use_cap" msgid="2567477283044619917">"Lapho isetshenziswa"</string>
+    <string name="view_permissions_mode" msgid="5954826327563393399">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ingafinyelela yonke idatha yakho yokufaneleka nokuphila kahle ye-<xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allowed_to_access" msgid="4179317387300812335">"Ivunyelwe ukufinyelela"</string>
+    <string name="allowed_to_read" msgid="2775365229411407406">"Ivunyelwe ukufunda"</string>
+    <string name="give_permission_prompt" msgid="5788144216023065504">"Lezi zimvume zinikeza i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukufinyelela kudatha evela kuzinzwa zedivayisi yakho."</string>
+    <string name="allowed_apps_count" msgid="2289260267605628310">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kuzinhlelo zokusebenza ezingu-<xliff:g id="OTHER_NUMBER">%2$d</xliff:g> ezivunyelwe"</string>
+    <string name="no_apps_requesting" msgid="8088684445910698363">"Awekho ama-app acelayo"</string>
+    <string name="allowed" msgid="4158456017482263737">"Kuvumelekile"</string>
+    <string name="not_allowed" msgid="6092523505093372147">"Akuvunyelwe"</string>
+    <string name="access_sensor_note" msgid="7949933977197789634">"Ama-app anale mvume angafinyelela idatha ye-<xliff:g id="DATA_TYPE">%s</xliff:g> kusuka kuzinzwa zedivayisi yakho."</string>
+    <string name="remove_one_permission_for_all" msgid="6732728480265044938">"Susa ukufinyelela kwe-<xliff:g id="DATA_TYPE">%s</xliff:g> kuwo wonke ama-app asewashini lakho?"</string>
+    <string name="icon_content_check_mark" msgid="358150681017987426">"Hlola umaka"</string>
+    <string name="icon_content_cross_mark" msgid="3007762424358780248">"Uphawu lokushayisana"</string>
+    <string name="current_allow_mode" msgid="6716206063077569218">"Okwamanje, i-<xliff:g id="APP_NAME">%1$s</xliff:g> ingafinyelela idatha yokufaneleka nokuphila kahle ye-<xliff:g id="ALLOW_MODE">%2$s</xliff:g>"</string>
+    <string name="allow_all_the_time_prompt" msgid="5625132426961157398">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukufinyelela kudatha yokufaneleka neyokuphila kahle ngaso sonke isikhathi?"</string>
+    <string name="current_access" msgid="1457167070428176139">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> inokufinyelela ku-<xliff:g id="DATA_TYPES">%2$s</xliff:g>."</string>
+    <string name="manage_fitness_and_wellness_permissions" msgid="6198936108436598267">"Phatha izimvume zokufaneleka nokuphila kahle"</string>
 </resources>
diff --git a/apk/res/values/attrs.xml b/apk/res/values/attrs.xml
index 60cacb0..d1484cc 100644
--- a/apk/res/values/attrs.xml
+++ b/apk/res/values/attrs.xml
@@ -107,6 +107,9 @@
     <attr name="proceduresIcon" format="reference"/>
     <attr name="vitalsIcon" format="reference"/>
     <attr name="socialHistoryIcon" format="reference"/>
+
+    <!-- Lock screen banner -->
+    <attr name="lockIcon" format="reference" />
     <!-- END REGION -->
 
     <!-- REGION DIALOG GRAVITY -->
diff --git a/apk/res/values/dimens.xml b/apk/res/values/dimens.xml
index 9337d10..0a5671b 100644
--- a/apk/res/values/dimens.xml
+++ b/apk/res/values/dimens.xml
@@ -49,5 +49,6 @@
     <dimen name="recent_access_fab_bottom_padding">90dp</dimen>
 
     <dimen name="tab_corner_radius">12dp</dimen>
+    <dimen name="tab_width">110dp</dimen>
 
 </resources>
diff --git a/apk/res/values/strings.xml b/apk/res/values/strings.xml
index c6f67cd..de9934e 100644
--- a/apk/res/values/strings.xml
+++ b/apk/res/values/strings.xml
@@ -22,6 +22,7 @@
     <string name="home_subtitle" description="Description on the home screen of the app. [CHAR_LIMIT=NONE]">Manage the health and fitness data on your device, and control which apps can access it</string>
     <string name="data_title" description="Label for a button that takes the user to the data management screens. [CHAR_LIMIT=40]">Data and access</string>
     <string name="browse_medical_data" description="Label for a button that navigates to a screen with medical data. [CHAR_LIMIT=50]">Browse health records</string>
+    <string name="browse_medical_data_subtitle" description="Description for a button that navigates to a screen with medical data. [CHAR_LIMIT=NONE]">View your health records and which apps can access them</string>
     <string name="all_categories_title" description="Title of a screen that lists all health data categories. [CHAR_LIMIT=40]">All categories</string>
     <string name="see_all_categories" description="Label for a button that takes the user to the all categories screens. [CHAR_LIMIT=40]">See all categories</string>
     <string name="no_data" description="Label that is displayed when the given health data category does not have any data.">No data</string>
@@ -58,7 +59,7 @@
     <string name="yesterday_header" description="Header in the list of data access entries to differentiate between entries from today and yesterday. [CHAR LIMIT=50]">Yesterday</string>
     <string name="read_data_access_label" description="Label used to indicate that app performed read access to specified data types (as opposed to writing the data), as in 'Read: Steps, Heart rate'. [CHAR_LIMIT=NONE]">Read: <xliff:g example="heart rate" id="data_type">%s</xliff:g></string>
     <string name="write_data_access_label" description="Label used to indicate that app performed write (insertion, deletion or update) access to specified data types (as opposed to reading the data), as in 'Write: Steps, Heart rate'. [CHAR_LIMIT=NONE]">Write: <xliff:g example="heart rate" id="data_type">%s</xliff:g></string>
-    <string name="data_type_separator" description="Separator (comma and whitespace in English) for a potentially long list of data type names listed in data access entry, as in 'Write: Steps, Distance, Calories'. [CHAR_LIMIT=NONE]">,\u0020</string>
+    <string name="separator" description="Separator (comma and whitespace in English) for a potentially long list of data type names listed in data access entry, as in 'Write: Steps, Distance, Calories'. [CHAR_LIMIT=NONE]">,\u0020</string>
     <string name="manage_permissions" description="Text for floating action button that takes users from Recent Access apps to the App permissions screen [CHAR LIMIT=40]">Manage permissions</string>
     <string name="recent_access_time_content_descritption" description="Content description for time section of recent access preference providing better context for accessibility talk back. [CHAR_LIMIT=NONE]">Time: <xliff:g example="13:05" id="recent_access_time">%1$s</xliff:g></string>
     <!--endregion-->
@@ -127,17 +128,78 @@
     <!-- region permission ui labels -->
 
     <!-- Other health permissions -->
-    <string name="background_read_title" description="Title for permission to read health data in the background. [CHAR_LIMIT=NONE]">Access data in the background</string>
-    <string name="background_read_request_title" description="Title for screen to give permission to an app to read health data in the background. [CHAR_LIMIT=NONE]">Allow <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> to access data in the background?</string>
-    <string name="background_read_description" description="Description for permission to read health data in the background. [CHAR_LIMIT=NONE]">Allow this app to access Health&#160;Connect data when you\'re not using the app</string>
-    <string name="background_read_request_description" description="Description for screen to give permission to an app to read health data in the background. [CHAR_LIMIT=NONE]">If you allow, this app can access Health&#160;Connect data when you\'re not using the app.</string>
+    <!-- Single request -->
+    <string name="background_read_single_request_title" description="Title for screen to give permission to an app to read health data in the background. [CHAR_LIMIT=NONE]">Allow <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> to access data in the background?</string>
+    <string name="background_read_medical_single_request_description_both_types_granted" description="Description for screen to give permission to an app to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">If you allow, this app can access fitness and wellness data and health records when you\'re not using the app.</string>
+    <string name="background_read_medical_single_request_description_medical_granted" description="Description for screen to give permission to an app to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">If you allow, this app can access health records when you\'re not using the app.</string>
+    <string name="background_read_medical_single_request_description_fitness_granted" description="Description for screen to give permission to an app to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">If you allow, this app can access fitness and wellness data when you\'re not using the app.</string>
+    <string name="background_read_single_request_description" description="Description for screen to give permission to an app to read health data in the background. [CHAR_LIMIT=NONE]">If you allow, this app can access Health&#160;Connect data when you\'re not using the app.</string>
 
-    <string name="historic_access_title" description="Title for permission to access past health data. [CHAR_LIMIT=NONE]">Access past data</string>
-    <string name="historic_access_request_title" description="Title for screen to give permission to an app to access past health data. [CHAR_LIMIT=NONE]">Allow <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> to access past data?</string>
-    <string name="historic_access_description" description="Description for permission to access past health data. [CHAR_LIMIT=NONE]">Allow this app to access Health&#160;Connect data added before <xliff:g example="22 January 2022" id="data_access_date">%1$s</xliff:g></string>
-    <string name="historic_access_description_fallback" description="Description for permission to access past health data when there is no access date [CHAR_LIMIT=NONE]">Allow this app to access all past Health&#160;Connect data</string>
-    <string name="historic_access_request_description" description="Description for screen to give permission to an app to access past health data. [CHAR_LIMIT=NONE]">If you allow, this app can access Health&#160;Connect data added before <xliff:g example="22 January 2022" id="data_access_date">%1$s</xliff:g>.</string>
-    <string name="historic_access_request_description_fallback" description="Description for screen to give permission to an app to access past health data. [CHAR_LIMIT=NONE]">If you allow, this app can access all past Health&#160;Connect data.</string>
+    <string name="history_read_single_request_title" description="Title for screen to give permission to an app to access past health data. [CHAR_LIMIT=NONE]">Allow <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> to access past data?</string>
+    <string name="history_read_medical_single_request_description" description="Description for screen to give permission to an app to access past health data when the app also has medical permissions. [CHAR_LIMIT=NONE]">If you allow, this app can access fitness and wellness data added before <xliff:g example="22 January 2022" id="data_access_date">%1$s</xliff:g>.</string>
+    <string name="history_read_medical_single_request_description_fallback" description="Description for screen to give permission to an app to access past health data when the app also has medical permissions. [CHAR_LIMIT=NONE]">If you allow, this app can access all past fitness and wellness data.</string>
+    <string name="history_read_single_request_description" description="Description for screen to give permission to an app to access past health data. [CHAR_LIMIT=NONE]">If you allow, this app can access Health&#160;Connect data added before <xliff:g example="22 January 2022" id="data_access_date">%1$s</xliff:g>.</string>
+    <string name="history_read_single_request_description_fallback" description="Description for screen to give permission to an app to access past health data. [CHAR_LIMIT=NONE]">If you allow, this app can access all past Health&#160;Connect data.</string>
+
+
+    <!-- Combined request -->
+    <string name="additional_permissions_combined_request_title" description="Title for screen to give additional permissions to an app. [CHAR_LIMIT=NONE]">Allow additional access for <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g>?</string>
+    <string name="additional_permissions_combined_request_description" description="Description for screen to give additional permissions to an app. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> also wants to access these Health&#160;Connect settings</string>
+
+    <string name="background_read_medical_combined_request_title_both_types_granted" description="Title for permission to read health data in the background, when the app also has medical permissions [CHAR_LIMIT=NONE]">Access all data in the background</string>
+    <string name="background_read_medical_combined_request_title_medical_granted" description="Title for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Access health records in the background</string>
+    <string name="background_read_medical_combined_request_title_fitness_granted" description="Title for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Access fitness and wellness data in the background</string>
+    <string name="background_read_medical_combined_request_description_both_types_granted" description="Description for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access fitness and wellness data and health records when you\'re not using the app</string>
+    <string name="background_read_medical_combined_request_description_medical_granted" description="Description for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access this data when you\'re not using the app</string>
+    <string name="background_read_medical_combined_request_description_fitness_granted" description="Description for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access this data when you\'re not using the app</string>
+
+    <string name="background_read_combined_request_title" description="Title for permission to read health data in the background. [CHAR_LIMIT=NONE]">Access data in the background</string>
+    <string name="background_read_combined_request_description" description="Description for permission to read health data in the background. [CHAR_LIMIT=NONE]">Allow this app to access Health&#160;Connect data when you\'re not using the app</string>
+
+    <string name="history_read_medical_combined_request_title" description="Title for permission to access past health data when the app also has medical permissions. [CHAR_LIMIT=NONE]">Access past fitness and wellness data</string>
+    <string name="history_read_medical_combined_request_description" description="Description for permission to access past health data when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access data added before <xliff:g example="22 January 2022" id="data_access_date">%1$s</xliff:g></string>
+    <string name="history_read_medical_combined_request_description_fallback" description="Description for permission to access past health data when the app also has medical permissions and when there is no access date [CHAR_LIMIT=NONE]">Allow this app to access all past data</string>
+
+    <string name="history_read_combined_request_title" description="Title for permission to access past health data. [CHAR_LIMIT=NONE]">Access past data</string>
+    <string name="history_read_combined_request_description" description="Description for permission to access past health data. [CHAR_LIMIT=NONE]">Allow this app to access Health&#160;Connect data added before <xliff:g example="22 January 2022" id="data_access_date">%1$s</xliff:g></string>
+    <string name="history_read_combined_request_description_fallback" description="Description for permission to access past health data when there is no access date [CHAR_LIMIT=NONE]">Allow this app to access all past Health&#160;Connect data</string>
+
+    <string name="history_read_medical_combined_request_footer" description="Footer of screen to request past data permissions for an app when medical read permissions are granted [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> can already access past data for your health records</string>
+    <string name="history_read_medical_combined_request_footer_link" description="Link of footer of screen to request past data permissions for an app when medical read permissions are granted [CHAR_LIMIT=NONE]">Read more about permissions</string>
+
+    <!-- Additional access screen -->
+    <string name="background_read_medical_access_title_both_types_granted" description="Title for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Access all data in the background</string>
+    <string name="background_read_medical_access_title_medical_granted" description="Title for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Access health records in the background</string>
+    <string name="background_read_medical_access_title_fitness_granted" description="Title for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Access fitness and wellness data in the background</string>
+
+    <string name="background_read_medical_access_description_both_types_granted" description="Description for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access fitness and wellness data and health records when you\'re not using the app</string>
+    <string name="background_read_medical_access_description_medical_granted" description="Description for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access this data when you\'re not using the app</string>
+    <string name="background_read_medical_access_description_fitness_granted" description="Description for permission to read health data in the background when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access this data when you\'re not using the app</string>
+
+    <string name="background_read_access_title" description="Title for permission to read health data in the background. [CHAR_LIMIT=NONE]">Access data in the background</string>
+    <string name="background_read_access_description" description="Description for permission to read health data in the background. [CHAR_LIMIT=NONE]">Allow this app to access Health&#160;Connect data when you\'re not using the app</string>
+
+    <string name="history_read_medical_access_title" description="Title for permission to access past health data when the app also has medical permissions. [CHAR_LIMIT=NONE]">Access past fitness and wellness data</string>
+    <string name="history_read_medical_access_description" description="Description for permission to access past health data when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access data added before <xliff:g example="22 January 2022" id="data_access_date">%1$s</xliff:g></string>
+    <string name="history_read_medical_access_description_fallback" description="Description for permission to access past health data when the app also has medical permissions and when there is no access date [CHAR_LIMIT=NONE]">Allow this app to access all past data</string>
+
+    <string name="history_read_access_title" description="Title for permission to access past health data. [CHAR_LIMIT=NONE]">Access past data</string>
+    <string name="history_read_access_description" description="Description for permission to access past health data when the app also has medical permissions. [CHAR_LIMIT=NONE]">Allow this app to access Health&#160;Connect data added before <xliff:g example="22 January 2022" id="data_access_date">%1$s</xliff:g></string>
+    <string name="history_read_access_description_fallback" description="Description for permission to access past health data when the app also has medical permissions and when there is no access date [CHAR_LIMIT=NONE]">Allow this app to access all Health&#160;Connect past data</string>
+
+    <!-- Warnings and footers -->
+    <string name="history_read_medical_access_read_warning" description="Message to inform the user that no fitness data is currently being read [CHAR_LIMIT=NONE]">No fitness data is currently being read because <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> has no read permissions on</string>
+    <string name="additional_access_medical_read_footer" description="Footer of screen to manage additional permissions for an app when medical read permissions are granted [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> can already access past data for your health records. To change this, turn off health record permissions for this app</string>
+    <string name="additional_access_medical_read_footer_link" description="Link to manage health records permissions in footer of screen showing the additional permissions of an app [CHAR_LIMIT=NONE]">Manage health record permissions</string>
+
+    <!-- Disabled additional permissions footers -->
+    <string name="additional_access_combined_footer" description="Footer of screen to manage additional permissions for an app when no read fitness permissions are granted [CHAR_LIMIT=NONE]">Enable at least one read permission in order to turn on background or past data access for this app</string>
+    <string name="additional_access_background_footer" description="Footer of screen to manage additional permissions for an app when no read fitness permissions are granted [CHAR_LIMIT=NONE]">Enable at least one read permission in order to turn on background access for this app</string>
+    <string name="additional_access_history_footer" description="Footer of screen to manage additional permissions for an app when no read fitness permissions are granted [CHAR_LIMIT=NONE]">Enable at least one read permission in order to turn on past data access for this app</string>
+
+    <!-- Additional permissions manifest descriptions -->
+    <string name="historic_access_description" description="Description for permission to access past health data. [CHAR_LIMIT=NONE]">Allow this app to access all past Health&#160;Connect data</string>
+    <string name="background_read_description" description="Description for permission to access past health data. [CHAR_LIMIT=NONE]">Allow this app to access Health&#160;Connect data when you\'re not using the app</string>
     <!--endregion-->
 
     <!-- region Activity data types -->
@@ -206,6 +268,11 @@
     <string name="wheelchair_pushes_lowercase_label" description="Lowercase label used to show the user's wheelchair pushes data [CHAR_LIMIT=50]">wheelchair pushes</string>
     <string name="wheelchair_pushes_read_content_description" description="Content description for switch that enables permissions for reading the user's wheelchair pushes data [CHAR_LIMIT=NONE]">Read wheelchair pushes</string>
     <string name="wheelchair_pushes_write_content_description" description="Content description for switch that enables permissions for writing the user's wheelchair pushes data [CHAR_LIMIT=NONE]">Write wheelchair pushes</string>
+
+    <string name="activity_intensity_uppercase_label" description="Uppercase label used to show the user's activity intensity data [CHAR_LIMIT=50]">Activity intensity</string>
+    <string name="activity_intensity_lowercase_label" description="Lowercase label used to show the user's activity intensity data [CHAR_LIMIT=50]">activity intensity</string>
+    <string name="activity_intensity_read_content_description" description="Content description for switch that enables permissions for reading the user's activity intensity data [CHAR_LIMIT=NONE]">Read activity intensity</string>
+    <string name="activity_intensity_write_content_description" description="Content description for switch that enables permissions for writing the user's activity intensity data [CHAR_LIMIT=NONE]">Write activity intensity</string>
     <!--endregion-->
 
     <!-- region Body measurements data types -->
@@ -360,43 +427,57 @@
     <!--endregion-->
 
     <!-- region Medical data types -->
+    <string name="browse_health_records_intro" description="Top intro for the Browse health records screen that lists the available Health records categories in Health Connect. [CHAR_LIMIT=NONE]">This includes all the health records synced to and added to Health&#160;Connect. This might not be your full medical record and does not include a medical description of your health records.</string>
+
     <string name="all_medical_data_uppercase_label" description="Uppercase label used to show the user's active calories burned data [CHAR_LIMIT=50]">All health records</string>
     <string name="all_medical_data_lowercase_label" description="Lowercase label used to show the user's active calories burned data [CHAR_LIMIT=50]">all health records</string>
     <string name="all_medical_data_content_description" description="Content description for switch that enables permissions for writing the user's medical data [CHAR_LIMIT=NONE]">Write all health records</string>
 
-    <string name="allergy_intolerance_uppercase_label" description="Uppercase label used to show the user's allergy intolerance data [CHAR_LIMIT=50]">Allergies</string>
-    <string name="allergy_intolerance_lowercase_label" description="Lowercase label used to show the user's allergy intolerance data [CHAR_LIMIT=50]">allergies</string>
-    <string name="allergy_intolerance_content_description" description="Content description for switch that enables permissions for reading the user's allergy intolerance data [CHAR_LIMIT=NONE]">Read allergies</string>
+    <string name="allergies_intolerances_uppercase_label" description="Uppercase label used to show the user's allergy intolerance data [CHAR_LIMIT=50]">Allergies</string>
+    <string name="allergies_intolerances_lowercase_label" description="Lowercase label used to show the user's allergy intolerance data [CHAR_LIMIT=50]">allergies</string>
+    <string name="allergies_intolerances_content_description" description="Content description for switch that enables permissions for reading the user's allergy and intolerance data [CHAR_LIMIT=NONE]">Read allergies</string>
 
-    <string name="immunization_uppercase_label" description="Uppercase label used to show the user's immunization data [CHAR_LIMIT=50]">Immunization</string>
-    <string name="immunization_lowercase_label" description="Lowercase label used to show the user's immunization data [CHAR_LIMIT=50]">immunization</string>
-    <string name="immunization_content_description" description="Content description for switch that enables permissions for reading the user's immunization data [CHAR_LIMIT=NONE]">Read immunization</string>
+    <string name="conditions_uppercase_label" description="Uppercase label used to show the user's data about medical conditions [CHAR_LIMIT=50]">Conditions</string>
+    <string name="conditions_lowercase_label" description="Lowercase label used to show the user's data about medical conditions [CHAR_LIMIT=50]">conditions</string>
+    <string name="conditions_content_description" description="Content description for switch that enables permissions for reading the user's data about medical conditions [CHAR_LIMIT=NONE]">Read conditions</string>
 
-    <string name="laboratory_results_uppercase_label" description="Uppercase label used to show the user's laboratory results data [CHAR_LIMIT=50]">Laboratory Results</string>
-    <string name="laboratory_results_lowercase_label" description="Lowercase label used to show the user's laboratory results data [CHAR_LIMIT=50]">laboratory results</string>
-    <string name="laboratory_results_content_description" description="Content description for switch that enables permissions for reading the user's laboratory results data [CHAR_LIMIT=NONE]">Read laboratory results</string>
+    <string name="vaccines_uppercase_label" description="Uppercase label used to show the user's vaccine data [CHAR_LIMIT=50]">Vaccines</string>
+    <string name="vaccines_lowercase_label" description="Lowercase label used to show the user's vaccine data [CHAR_LIMIT=50]">vaccines</string>
+    <string name="vaccines_content_description" description="Content description for switch that enables permissions for reading the user's vaccine data [CHAR_LIMIT=NONE]">Read vaccines</string>
+
+    <string name="laboratory_results_uppercase_label" description="Uppercase label used to show the user's laboratory results data [CHAR_LIMIT=50]">Lab results</string>
+    <string name="laboratory_results_lowercase_label" description="Lowercase label used to show the user's laboratory results data [CHAR_LIMIT=50]">lab results</string>
+    <string name="laboratory_results_content_description" description="Content description for switch that enables permissions for reading the user's laboratory results data [CHAR_LIMIT=NONE]">Read lab results</string>
 
     <string name="medications_uppercase_label" description="Uppercase label used to show the user's medications data [CHAR_LIMIT=50]">Medications</string>
     <string name="medications_lowercase_label" description="Lowercase label used to show the user's medications data [CHAR_LIMIT=50]">medications</string>
     <string name="medications_content_description" description="Content description for switch that enables permissions for reading the user's medications data [CHAR_LIMIT=NONE]">Read medications</string>
 
+    <string name="personal_details_uppercase_label" description="Uppercase label used to show the user's personal details (eg date of birth, name, address etc) [CHAR_LIMIT=50]">Personal details</string>
+    <string name="personal_details_lowercase_label" description="Lowercase label used to show the user's personal details (eg date of birth, name, address etc) [CHAR_LIMIT=50]">personal details</string>
+    <string name="personal_details_content_description" description="Content description for switch that enables permissions for reading the user's personal details (eg date of birth, name, address etc) [CHAR_LIMIT=NONE]">Read personal details</string>
+
+    <string name="practitioner_details_uppercase_label" description="Uppercase label used to show the user's medical practitioners (eg doctors, nurses but also masseurs, coaches etc) [CHAR_LIMIT=50]">Practitioner details</string>
+    <string name="practitioner_details_lowercase_label" description="Lowercase label used to show the user's medical practitioners (eg doctors, nurses but also masseurs, coaches etc) [CHAR_LIMIT=50]">practitioner details</string>
+    <string name="practitioner_details_content_description" description="Content description for switch that enables permissions for reading the user's medical practitioners (eg doctors, nurses but also masseurs, coaches etc) [CHAR_LIMIT=NONE]">Read practitioner details</string>
+
     <string name="pregnancy_uppercase_label" description="Uppercase label used to show the user's pregnancy data [CHAR_LIMIT=50]">Pregnancy</string>
     <string name="pregnancy_lowercase_label" description="Lowercase label used to show the user's pregnancy data [CHAR_LIMIT=50]">pregnancy</string>
     <string name="pregnancy_content_description" description="Content description for switch that enables permissions for reading the user's pregnancy data [CHAR_LIMIT=NONE]">Read pregnancy</string>
 
-    <string name="problems_uppercase_label" description="Uppercase label used to show the user's problem data [CHAR_LIMIT=50]">Problems</string>
-    <string name="problems_lowercase_label" description="Lowercase label used to show the user's problem data [CHAR_LIMIT=50]">problems</string>
-    <string name="problems_content_description" description="Content description for switch that enables permissions for reading the user's problem data [CHAR_LIMIT=NONE]">Read problems</string>
-
     <string name="procedures_uppercase_label" description="Uppercase label used to show the user's procedure data [CHAR_LIMIT=50]">Procedures</string>
     <string name="procedures_lowercase_label" description="Lowercase label used to show the user's procedure data [CHAR_LIMIT=50]">procedures</string>
     <string name="procedures_content_description" description="Content description for switch that enables permissions for reading the user's procedure data [CHAR_LIMIT=NONE]">Read procedures</string>
 
-    <string name="social_history_uppercase_label" description="Uppercase label used to show the user's social history data [CHAR_LIMIT=50]">Social History</string>
+    <string name="social_history_uppercase_label" description="Uppercase label used to show the user's social history data [CHAR_LIMIT=50]">Social history</string>
     <string name="social_history_lowercase_label" description="Lowercase label used to show the user's social history data [CHAR_LIMIT=50]">social history</string>
     <string name="social_history_content_description" description="Content description for switch that enables permissions for reading the user's social history data [CHAR_LIMIT=NONE]">Read social history</string>
 
-    <string name="vital_signs_uppercase_label" description="Uppercase label used to show the user's vital signs data [CHAR_LIMIT=50]">Vital Signs</string>
+    <string name="visits_uppercase_label" description="Uppercase label used to show the user's visits to a doctor or other encounters with a medical professional [CHAR_LIMIT=50]">Visits</string>
+    <string name="visits_lowercase_label" description="Lowercase label used to show the user's visits to a doctor or other encounters with a medical professional [CHAR_LIMIT=50]">visits</string>
+    <string name="visits_content_description" description="Content description for switch that enables permissions for reading the user's visits to a doctor or other encounters with a medical professional [CHAR_LIMIT=NONE]">Read visits</string>
+
+    <string name="vital_signs_uppercase_label" description="Uppercase label used to show the user's vital signs data [CHAR_LIMIT=50]">Vital signs</string>
     <string name="vital_signs_lowercase_label" description="Lowercase label used to show the user's vital signs data [CHAR_LIMIT=50]">vital signs</string>
     <string name="vital_signs_content_description" description="Content description for switch that enables permissions for reading the user's vital signs data [CHAR_LIMIT=NONE]">Read vital signs</string>
     <!--endregion-->
@@ -409,18 +490,39 @@
     <!--endregion-->
 
     <!-- region Permissions -->
+
+    <!-- region Common permission request strings -->
     <string name="read_permission_category" description="Title for read permission category in the app permission screen">Allow &#8220;<xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g>&#8221; to read</string>
     <string name="write_permission_category" description="Title for write permission category in the app permission screen">Allow &#8220;<xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g>&#8221; to write</string>
-    <string name="request_permissions_cancel" description="Label for button to cancel an app's request for permissions [CHAR_LIMIT=20]">Cancel</string>
     <string name="request_permissions_allow" description="Label for button to allow an app to have the selected permissions for the user's data [CHAR_LIMIT=20]">Allow</string>
     <string name="request_permissions_allow_all" description="Label for button to allow an app to have the selected permissions for the user's data [CHAR_LIMIT=20]">Allow all</string>
     <string name="request_permissions_dont_allow" description="Label for button to allow an app to have the selected permissions for the user's data [CHAR_LIMIT=20]">Don\'t allow</string>
-    <string name="request_permissions_header_desc" description="Text asking the user to select permissions for an app. [CHAR_LIMIT=NONE]">Choose data you want this app to read or write to Health&#160;Connect</string>
+    <string name="request_permissions_data_access_type_read_write" description="Text asking the user to select permissions for an app. [CHAR_LIMIT=NONE]">Choose data you want this app to read or write to Health&#160;Connect</string>
+    <string name="request_permissions_data_access_type_read" description="Text asking the user to select permissions for an app. [CHAR_LIMIT=NONE]">Choose data you want this app to read from Health&#160;Connect</string>
+    <string name="request_permissions_data_access_type_write" description="Text asking the user to select permissions for an app. [CHAR_LIMIT=NONE]">Choose data you want this app to write to Health&#160;Connect</string>
+    <!--endregion-->
+
+
+    <!-- region Fitness permission request -->
     <string name="request_permissions_header_time_frame_desc" description="Text describing the time frame of data which an app will be able to access. [CHAR_LIMIT=NONE]">If you give read access, the app can read new data and data from the past 30 days</string>
     <string name="request_permissions_header_time_frame_history_desc" description="Text describing the time frame of data which an app with history read permission will be able to access. [CHAR_LIMIT=NONE]">If you give read access, the app can read new and past data</string>
     <string name="request_permissions_header_title" description="Title for screen to give permissions to an app to read or write users data. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]">Allow <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> to access Health&#160;Connect?</string>
-    <string name="request_permissions_rationale" description="Text informing the user that data they share with an app is covered by that app's data privacy policy. Has a link to the app's privacy policy. [CHAR_LIMIT=NONE]">You can learn how <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> handles your data in the developer\'s <xliff:g example="privacy policy" id="privacy_policy_link">%2$s</xliff:g></string>
+    <string name="request_permissions_with_medical_header_title" description="Title for screen to give permissions to an app which also has medical permissions to read or write users fitness data. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]">Allow <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> to access fitness and wellness data?</string>
+    <string name="request_permissions_rationale" description="Text informing the user that data they share with an app is covered by that app's data privacy policy. Has a link to the app's privacy policy. [CHAR_LIMIT=NONE]">You can learn how <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> handles your data in their <xliff:g example="privacy policy" id="privacy_policy_link">%2$s</xliff:g></string>
     <string name="request_permissions_privacy_policy" description="Link text that open's a third party app's data privacy policy [CHAR_LIMIT=NONE]">privacy policy</string>
+    <!--endregion-->
+
+    <!-- region Medical permission request -->
+    <string name="medical_request_header" description="Title for screen to give medical permissions to an app [CHAR_LIMIT=NONE]">Allow <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> to access your health records?</string>
+    <string name="medical_request_header_access_info_read_write" description="Text describing which medical data can be accessed by the app that is requesting medical permissions [CHAR_LIMIT=NONE]">If you give access, the app can read and write data such as allergies, lab results, vaccines and more\n<xliff:g example="About health records" id="about_health_records_link">%1$s</xliff:g></string>
+    <string name="medical_request_header_access_info_read" description="Text describing which medical data can be accessed by the app that is requesting medical permissions [CHAR_LIMIT=NONE]">If you give access, the app can read data such as allergies, lab results, vaccines and more\n<xliff:g example="About health records" id="about_health_records_link">%1$s</xliff:g></string>
+    <string name="medical_request_about_health_records" description="Link to a help page about health records [CHAR_LIMIT=NONE]">About health records</string>
+    <string name="medical_request_data_to_share" description="Title for section of the medical permission request screen which lists some examples of the data types accessed by this write permission [CHAR_LIMIT=NONE]">Data to share includes</string>
+    <string name="medical_request_summary" description="Explanation than an app can access all health records when it requests medical write permissions [CHAR_LIMIT=NONE]">If you allow, <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> can share your health records with Health&#160;Connect.</string>
+    <string name="medical_request_footer" description="Footer for screen requesting medical write permissions for an app [CHAR_LIMIT=NONE]">Sync your health records from your different apps and sources to keep them in one place</string>
+    <!--endregion-->
+
+    <!-- region Fitness permissions (no medical) disconnect -->
     <string name="permissions_disconnect_dialog_title" description="Title for dialog asking the user to confirm they want to remove all permissions for an app [CHAR_LIMIT=40]">Remove all permissions?</string>
     <string name="permissions_disconnect_dialog_disconnect" description="Label for dialog button to confirm removal of all permissions for an app [CHAR_LIMIT=20]">Remove all</string>
     <string name="permissions_disconnect_dialog_message" description="Text informing the user that an app will no longer be able to read or write data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write any data from Health&#160;Connect.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone, or location.</string>
@@ -428,15 +530,36 @@
     <string name="permissions_disconnect_dialog_message_history" description="Text informing the user that an app will no longer be able to read or write data after the permissions have been removed, including the history read permission. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write any data from Health&#160;Connect, including past data.\n\nThis doesn\'t affect other permissions this app may have, like location, camera, or microphone.</string>
     <string name="permissions_disconnect_dialog_message_combined" description="Text informing the user that an app will no longer be able to read or write data after the permissions have been removed, including the background and history permissions. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write any data from Health&#160;Connect, including background and past data.\n\nThis doesn\'t affect other permissions this app may have, like location, camera, or microphone.</string>
     <string name="permissions_disconnect_dialog_checkbox" description="Text of a checkbox to decide whether to delete or not all data written by the app that is being disconnected by the user. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]">Also delete <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> data from Health&#160;Connect</string>
-    <string name="disconnect_all_health_permissions_title" description="Title for dialog asking user to confirm they want to remove all health permissions for an app [CHAR_LIMIT=60]">Remove all permissions?</string>
-    <string name="disconnect_all_medical_permissions_title" description="Title for dialog asking user to confirm they want to remove all medical permissions for an app [CHAR_LIMIT=60]">Remove all health record permissions?</string>
+    <!--endregion-->
+
+    <!-- region Fitness permissions (with medical) disconnect -->
     <string name="disconnect_all_fitness_permissions_title" description="Title for dialog asking user to confirm they want to remove all fitness permissions for an app [CHAR_LIMIT=60]">Remove all fitness and wellness permissions?</string>
+    <string name="disconnect_all_fitness_permissions_dialog_checkbox" description="Text of a checkbox to decide whether to delete all fitness data written by the app that is being disconnected by the user. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]">Also delete fitness data from <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> from Health&#160;Connect</string>
+    <!--endregion-->
+
+    <!-- region Medical permissions disconnect -->
+    <string name="disconnect_all_medical_permissions_title" description="Title for dialog asking user to confirm they want to remove all medical permissions for an app [CHAR_LIMIT=60]">Remove all health record permissions?</string>
+    <string name="disconnect_all_medical_permissions_dialog_checkbox" description="Text of a checkbox to decide whether to delete all medical data written by the app that is being disconnected by the user. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]">Also delete health records from <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> from Health&#160;Connect</string>
+    <!--endregion-->
+
+    <!-- region Medical or fitness permissions disconnect message -->
+    <string name="disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message" description="Text informing the user that an app will no longer be able to read or write fitness or medical data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write this data from Health&#160;Connect.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location.</string>
+    <string name="disconnect_all_fitness_or_medical_and_background_permissions_dialog_message" description="Text informing the user that an app will no longer be able to read or write fitness or medical data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write this data from Health&#160;Connect, including background data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location.</string>
+    <string name="disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message" description="Text informing the user that an app will no longer be able to read or write fitness or medical data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write this data from Health&#160;Connect, including past data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location.</string>
+    <string name="disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message" description="Text informing the user that an app will no longer be able to read or write fitness or medical data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write this data from Health&#160;Connect, including background and past data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location.</string>
+    <!--endregion-->
+
+    <!-- region All health permissions (fitness + medical) disconnect -->
+    <string name="disconnect_all_health_permissions_title" description="Title for dialog asking user to confirm they want to remove all health permissions for an app [CHAR_LIMIT=60]">Remove all permissions?</string>
     <string name="disconnect_all_health_no_additional_permissions_dialog_message" description="Text informing the user that an app will no longer be able to read or write fitness and medical data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write data from Health&#160;Connect.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location.</string>
     <string name="disconnect_all_health_and_background_permissions_dialog_message" description="Text informing the user that an app will no longer be able to read or write fitness and medical data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write data from Health&#160;Connect, including background data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location.</string>
     <string name="disconnect_all_health_and_historical_permissions_dialog_message" description="Text informing the user that an app will no longer be able to read or write fitness and medical data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write data from Health&#160;Connect, including past data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location.</string>
     <string name="disconnect_all_health_and_additional_permissions_dialog_message" description="Text informing the user that an app will no longer be able to read or write fitness and medical data after the permissions have been removed. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will no longer be able to read or write data from Health&#160;Connect, including background and past data.\n\nThis doesn\'t affect other permissions this app may have, like camera, microphone or location.</string>
     <string name="disconnect_all_health_permissions_dialog_checkbox" description="Text of a checkbox to decide whether to delete all fitness and medical data written by the app that is being disconnected by the user. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]">Also delete fitness data and health records from <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> from Health&#160;Connect</string>
     <string name="disconnect_all_health_permissions_success_toast" description="Toast shown when permissions have been successfully removed [CHAR_LIMIT=NONE]">Removed permissions for this app</string>
+    <string name="disconnect_all_app_permissions_dialog_checkbox" description="Text of a checkbox to decide whether to delete all data from Health Connect">Also delete all Health&#160;Connect data</string>
+    <!--endregion-->
+
     <!--endregion-->
 
     <!-- region Data Entries -->
@@ -449,10 +572,11 @@
     <!-- endregion -->
 
     <!-- region Raw FHIR -->
+    <string name="raw_fhir_title" description="Label for a screen that contains the detailed source code of a medical resource. [CHAR_LIMIT=40]">Source data</string>
     <string name="raw_fhir_open_bracket" description="Content description for the open curly bracket character and a prefix before that which is usually a space. [CHAR_LIMIT=50]"><xliff:g example=" " id="prefix">%1$s</xliff:g>Open bracket. </string>
     <string name="raw_fhir_closed_bracket" description="Content description for the closed curly bracket character. [CHAR_LIMIT=50]"><xliff:g example=" " id="prefix">%1$s</xliff:g>Closed bracket. </string>
     <string name="raw_fhir_field_value" description="Content description for a field and a corresponding value from a JSON file, starting with a prexif which is usually a space. [CHAR_LIMIT=50]"><xliff:g example=" " id="prefix">%1$s</xliff:g> Field <xliff:g example="name" id="field">%2$s</xliff:g> Value </string>
-    <string name="raw_fhir_value" description="Content description for a value from a JSON file, starting with a prexif which is usually a space. [CHAR_LIMIT=50]"><xliff:g example=" " id="prefix">%1$s</xliff:g>: <xliff:g example="Nora" id="value">%2$s</xliff:g>. </string>
+    <string name="raw_fhir_value" description="Content description for a value from a JSON file, starting with a prefix which is usually a space. [CHAR_LIMIT=50]"><xliff:g example=" " id="prefix">%1$s</xliff:g>: <xliff:g example="Nora" id="value">%2$s</xliff:g>. </string>
     <string name="raw_fhir_content_description" description="Content description for a JSON file that is an electronic health care record [CHAR_LIMIT=NONE]">Detailed source code: <xliff:g example="Open bracket. Field name Value John Doe. Field age Value 30. close bracket." id="source_code">%1$s</xliff:g></string>
     <!-- endregion -->
 
@@ -479,20 +603,21 @@
     <string name="inactive_apps_section_message" description="Description text shown in the inactive apps section that explains what inactive apps are [CHAR_LIMIT=NONE]">These apps no longer have access, but still have data stored in Health&#160;Connect</string>
     <string name="manage_permissions_time_frame" description="Text describing the time frame of data which an app will be able to access [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> can read data added after <xliff:g example="22 January 2022" id="data_access_date">%2$s</xliff:g></string>
     <string name="other_android_permissions" description="Text that describes how users can change other android permissions through the system settings [CHAR_LIMIT=NONE]">To manage other Android permissions this app can access, go to Settings > Apps</string>
-    <string name="manage_permissions_rationale" description="Text informing the user that data they share with an app is covered by that app's data privacy policy [CHAR_LIMIT=NONE]">Data you share with <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> is covered by their privacy policy</string>
+    <string name="manage_permissions_rationale" description="Text informing the user that data they share with an app is covered by that app's data privacy policy [CHAR_LIMIT=NONE]">You can learn how <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> handles your data in the developer\'s privacy policy</string>
     <string name="other_android_permissions_content_description" description="Content description that describes how users can change other android permissions through the system settings [CHAR_LIMIT=NONE]">To manage other Android permissions this app can access, go to Settings, then tap Apps</string>
     <string name="manage_permissions_learn_more" description="Link text that open's a third party app's data privacy policy [CHAR_LIMIT=NONE]">Read privacy policy</string>
     <string name="app_perms_content_provider_24h" description="Summary for showing the last access text for content provider permissions [CHAR LIMIT=70]">Accessed in past 24 hours</string>
     <string name="app_access_title" description="Title of screen for a user to manage the health and fitness data a particular app has access to [CHAR_LIMIT=40]">App access</string>
     <string name="connected_apps_empty_list_section_title" description="Title of section when there are no connected apps">You don\'t currently have any compatible apps installed</string>
     <string name="additional_access_label" description="Label of a button that opens additional permissions access for an app. [CHAR_LIMIT=40]">Additional access</string>
+    <string name="additional_access_summary" description="Summary of a button that opens the additional permissions screen. [CHAR_LIMIT=40]">Past data, background data</string>
     <string name="removed_additional_permissions_toast" description="Message letting the user know that additional permissions have also been removed for this app">Removed additional permissions for this app</string>
     <string name="permissions_header" description="Title shown for section that lists permissions. [CHAR_LIMIT=40]">Permissions</string>
     <string name="fitness_permissions" description="Label of a button that opens the fitness permissions screen. [CHAR_LIMIT=40]">Fitness and wellness</string>
     <string name="fitness_permissions_summary" description="Summary of a button that opens the fitness permissions screen. [CHAR_LIMIT=40]">Exercise, sleep, nutrition and others</string>
-    <string name="medical_permissions" description="Uppercase name of medical data category that contains lab results, immunizations, medications, etc. [CHAR_LIMIT=40]">Health records</string>
-    <string name="medical_permissions_lowercase" description="Lowercase name of medical data category that contains lab results, immunizations, medications, etc. [CHAR_LIMIT=40]">health records</string>
-    <string name="medical_permissions_summary" description="Summary of a button that opens the medical permissions screen. [CHAR_LIMIT=40]">Lab results, medications, immunizations and others</string>
+    <string name="medical_permissions" description="Uppercase name of medical data category that contains lab results, vaccines, medications, etc. [CHAR_LIMIT=40]">Health records</string>
+    <string name="medical_permissions_lowercase" description="Lowercase name of medical data category that contains lab results, vaccines, medications, etc. [CHAR_LIMIT=40]">health records</string>
+    <string name="medical_permissions_summary" description="Summary of a button that opens the medical permissions screen. [CHAR_LIMIT=40]">Lab results, medications, vaccines and others</string>
     <!--endregion-->
 
     <!--region Denied Apps -->
@@ -610,6 +735,8 @@
     <!--region Onboarding -->
     <string name="onboarding_title" description="Label used to show the title of onboarding page when user opens Health Connect app for the fist time">Get started with Health&#160;Connect</string>
     <string name="onboarding_description" description="Content description of Health Connect app on the onboarding page">Health&#160;Connect stores your health and fitness data, giving you a simple way to sync the different apps on your device</string>
+    <string name="onboarding_description_health_records" description="Content description of Health Connect app on the onboarding page that includes health records">Health&#160;Connect stores and syncs your health and fitness data from different apps.\n\n<b>Fitness and wellness data,</b> including exercise sessions, steps, nutrition, sleep and more\n\n<b>Health records,</b> including vaccines, lab results and more</string>
+    <string name="onboarding_description_with_health_connect" description="Content description of Health Connect app on the onboarding page that explains what the user can do with this app">With Health&#160;Connect you can</string>
     <string name="share_data" description="Label used to show how the user can share data with apps">Share data with your apps</string>
     <string name="share_data_description" description="Content description for how the user can share data with apps">Choose the data each app can read or write to Health&#160;Connect</string>
     <string name="manage_your_settings" description="Label used to show how the user can manage settings and privacy">Manage your settings and privacy</string>
@@ -702,6 +829,9 @@
     <!-- region Data entries -->
     <string name="data_entry_header_with_source_app" translatable="false"><xliff:g example="14:41" id="time">%1$s</xliff:g> • <xliff:g example="Run tracker" id="app_data">%2$s</xliff:g></string>
     <string name="data_entry_header_without_source_app" translatable="false"><xliff:g example="14:41" id="time">%1$s</xliff:g></string>
+    <string name="data_entry_header_date_range_with_source_app" translatable="false"><xliff:g example="Nov 11 - Nov 17" id="date_range">%1$s</xliff:g> • <xliff:g example="Run tracker" id="app_data">%2$s</xliff:g></string>
+    <string name="data_entry_header_date_range_without_source_app" translatable="false"><xliff:g example="Nov 11 - Nov 17" id="date_range">%1$s</xliff:g></string>
+
     <string name="data_point_action_content_description" description="Content description for the menu button of an individual data entry [CHAR LIMIT=NONE]">Delete data entry <xliff:g example="1000 steps" id="entry_to_delete">%s</xliff:g></string>
     <string name="delete_data_point" description="Menu option for deleting an individual data entry [CHAR LIMIT=50]">Delete entry <xliff:g example="1000 steps" id="entry_to_delete">%s</xliff:g></string>
     <string name="aggregation_total" description="Description before the total value. For instance, Total: 1000 steps. [CHAR LIMIT=50]">Total: <xliff:g example="1000 steps" id="total_value">%s</xliff:g></string>
@@ -764,8 +894,10 @@
     <string name="flow_light" description="How heavy the user's menstruation flow was - light. [CHAR LIMIT=50]">Light flow</string>
     <string name="flow_medium" description="How heavy the user's menstruation flow was - medium. [CHAR LIMIT=50]">Medium flow</string>
     <string name="flow_heavy" description="How heavy the user's menstruation flow was - heavy. [CHAR LIMIT=50]">Heavy flow</string>
+    <string name="flow_unknown" description="How heavy the user's menstruation flow was - unknown. [CHAR LIMIT=50]">Unknown flow</string>
 
     <string name="period_day" description="Which day of the user's menstruation period it was. [CHAR LIMIT=50]">Period day <xliff:g example="2" id="day">%1$d</xliff:g> of <xliff:g example="5" id="total_length">%2$d</xliff:g></string>
+    <string name="period_length" description="A user's period entry and how many days it lasted. [CHAR_LIMIT=50]">{count, plural, =1 {Period (1 day)} other {Period (# days)}}</string>
 
     <string name="ovulation_positive" description="The positive result of a user's ovulation test. [CHAR LIMIT=50]">Positive</string>
     <string name="ovulation_negative" description="The negative result of a user's ovulation test. [CHAR LIMIT=50]">Negative</string>
@@ -794,7 +926,7 @@
     <!-- endregion -->
 
     <!--  region activity -->
-    <string name="session_title" translatable="false"><xliff:g example="My Strava workout" id="title">%1$s</xliff:g>, <xliff:g example="Strength training" id="type">%2$s</xliff:g></string>
+    <string name="session_title" translatable="false"><xliff:g example="Strength training" id="type">%2$s</xliff:g> • <xliff:g example="My Strava workout" id="title">%1$s</xliff:g></string>
     <string name="repetitions_format" translatable="false"><xliff:g example="Push up" id="type">%1$s</xliff:g>: <xliff:g example="20" id="count">%2$s</xliff:g></string>
     <string name="repetitions" description="Repetitions of an exercise set. [ICU SYNTAX][CHAR LIMIT=50]">{count, plural, =1 {1 rep} other {# reps}}</string>
     <string name="repetitions_long" description="Repetitions of an exercise set.  [ICU SYNTAX][CHAR LIMIT=50]">{count, plural, =1 {1 repetition} other {# repetitions}}</string>
@@ -938,6 +1070,11 @@
     <string name="mindfulness_type_other" description="Mindfulness session type: Other. [CHAR LIMIT=20]">Other</string>
     <string name="mindfulness_type_unguided" description="Mindfulness session type: Unguided. [CHAR LIMIT=20]">Unguided</string>
     <!--endregion-->
+
+    <!-- region Activity Intensity -->
+    <string name="activity_intensity_type_moderate" description="Activity intensity type: Moderate. [CHAR LIMIT=20]">Moderate</string>
+    <string name="activity_intensity_type_vigorous" description="Activity intensity type: Vigorous. [CHAR LIMIT=20]">Vigorous</string>
+    <!--endregion-->
     <!-- endregion -->
 
     <!-- region Duration -->
@@ -1295,7 +1432,6 @@
     <string name="migration_in_progress_screen_title" description="Title of screen shown when migration is in progress">Integration in progress</string>
     <string name="migration_in_progress_screen_integration_details" description="Detail information shown when migration is in progress">Health&#160;Connect is being integrated with the Android system.\n\nIt may take some time while your data and permissions are being transferred.</string>
     <string name="migration_in_progress_screen_integration_dont_close" description="Instruction to not close application shown when migration is in progress">Don\'t close the app until you get a notification that the process is complete.</string>
-    <string name="migration_in_progress_notification_title" description="Title of notification sent when migration is in progress">Health&#160;Connect integration in progress</string>
     <!--  endregion -->
 
     <!-- region Update needed common -->
@@ -1303,7 +1439,6 @@
     <string name="migration_update_needed_screen_details" description="Detail information shown when migration is pending and an update is needed.">Health&#160;Connect is being integrated with the Android system so you can access it directly from your settings.</string>
     <string name="update_button" description="Text of a button prompting the user to update an app or their phone system [CHAR_LIMIT=40]">Update</string>
     <string name="migration_update_needed_notification_content" description="Content of notification sent when migration is pending and an app or module update is needed.">Start this update so that Health&#160;Connect can continue integrating with your system settings</string>
-    <string name="migration_update_needed_notification_action" description="Action of notification sent when migration is pending and an app or module update is needed.">Update now</string>
     <!--  endregion -->
 
     <!-- region Module Update needed -->
@@ -1313,7 +1448,6 @@
 
     <!--  endregion -->
     <!-- region App Update needed -->
-    <string name="migration_app_update_needed_notification_title" description="Title of notification sent when migration is pending and an app or module update is needed.">Health&#160;Connect update needed</string>
     <string name="migration_app_update_needed_action" description="Action information shown when migration is pending and an app update is needed.">Before continuing, update the Health&#160;Connect app to the latest version.</string>
     <!--  endregion -->
 
@@ -1323,8 +1457,6 @@
     <string name="migration_more_space_needed_screen_details" description="Detail information shown when migration is pending and more space is needed.">Health&#160;Connect needs <xliff:g example="500MB" id="space_needed">%1$s</xliff:g> of storage space on your phone in order for the integration to continue.\n\nClear some space on your phone and then try again.</string>
     <string name="try_again_button" description="Text of a button prompting the user to try looking at the space again [CHAR_LIMIT=40]">Try again</string>
     <string name="free_up_space_button" description="Text of a button leading the user to their system storage so they can free up space. [CHAR_LIMIT=40]">Free up space</string>
-    <string name="migration_more_space_needed_notification_title" description="Title of notification sent when migration is pending and more space is needed.">More space needed</string>
-    <string name="migration_more_space_needed_notification_content" description="Content of notification sent when migration is pending and more space is needed.">Health&#160;Connect needs <xliff:g example="500MB" id="space_needed">%1$s</xliff:g> of storage space on your phone to continue integrating.</string>
     <!--  endregion -->
 
     <!-- region Migration paused -->
@@ -1341,14 +1473,12 @@
     <string name="resume_migration_banner_description" description="Description of banner prompting the user to resume actions needed for migration">Tap to continue integrating Health&#160;Connect with the Android system. In order to keep your data, complete this within <xliff:g example="1 day" id="time_needed">%1$s</xliff:g></string>
     <string name="resume_migration_banner_description_fallback" description="Fallback description of banner prompting the user to resume actions needed for migration">Tap to continue integrating Health&#160;Connect with the Android system.</string>
     <string name="resume_migration_banner_button" description="Button of banner prompting the user to resume actions needed for migration">Continue</string>
-    <string name="resume_migration_notification_title" description="Title of notification prompting the user to resume actions needed for migration">Resume Health&#160;Connect integration</string>
-    <string name="resume_migration_notification_content" description="Content of notification prompting the user to resume actions needed for migration">In order to keep your data, complete this within <xliff:g example="1 day" id="time_needed">%1$s</xliff:g></string>
     <!--  endregion -->
 
     <!-- region App update needed banner -->
     <string name="app_update_needed_banner_title" description="Title of banner prompting the user to update an app which is not currently working on this Android version.">App update needed</string>
-    <string name="app_update_needed_banner_description_single" description="Description of banner prompting the user to update an app which is not currently working on this Android version."><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> needs to be updated to continue syncing with Health&#160;Connect</string>
-    <string name="app_update_needed_banner_description_multiple" description="Description of banner prompting the user to update an app which is not currently working on this Android version."> Some apps need to be updated to continue syncing with Health&#160;Connect</string>
+    <string name="app_update_needed_banner_description_single" description="Description of banner prompting the user to update an app which is not currently working on this Android version."><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> needs to be updated to continue syncing with Health&#160;Connect. Updates may not be available for all apps.</string>
+    <string name="app_update_needed_banner_description_multiple" description="Description of banner prompting the user to update an app which is not currently working on this Android version."> Some apps need to be updated to continue syncing with Health&#160;Connect. Updates may not be available for all apps.</string>
     <string name="app_update_needed_banner_button" description="Button of banner prompting the user to update an app which is not currently working on this Android version.">Check for updates</string>
     <string name="app_update_needed_banner_learn_more_button" description="Button of banner prompting the user to update an app which is not currently working on this Android version.">Learn more</string>
     <!--  endregion -->
@@ -1372,13 +1502,6 @@
     <string name="migration_not_complete_dialog_title" description="Title of dialog shown to the user when migration did not complete due to an error.">Health&#160;Connect integration didn\'t complete</string>
     <string name="migration_not_complete_dialog_content" description="Content of dialog shown to the user when migration did not complete due to an error.">You\'ll get a notification when it becomes available again.</string>
     <string name="migration_not_complete_dialog_button" description="Button of dialog shown to the user when migration did not complete due to an error.">Got it</string>
-    <string name="migration_not_complete_notification_title" description="Title of notification shown to the user when migration did not complete due to an error.">Health&#160;Connect integration didn\'t complete</string>
-    <string name="migration_not_complete_notification_action" description="Action of notification shown to the user when migration did not complete due to an error.">Read more</string>
-    <!--  endregion -->
-
-    <!-- region Migration complete -->
-    <string name="migration_complete_notification_title" description="Title of notification shown to the user when migration is complete">Health&#160;Connect integration complete</string>
-    <string name="migration_complete_notification_action" description="Action of notification shown to the user when migration is complete">Open</string>
     <!--  endregion -->
 
     <!-- region Whats new dialog -->
@@ -1411,7 +1534,8 @@
 
     <!-- region App data -->
     <string name="app_data_title" description="Title of screen that shows the data of a certain app. [CHAR_LIMIT=50]">App data</string>
-    <string name="no_data_footer" description="Footer displayed on the empty data browse screen if no data has been written to Health Connect. [CHAR_LIMIT=NONE]">Data from apps with access to Health Connect will show here</string>
+    <string name="app_data_no_data_footer" description="Footer displayed on the empty app data screen if no data from that app has been written to Health Connect. [CHAR_LIMIT=NONE]">Data from <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> will show here</string>
+    <string name="all_data_no_data_footer" description="Footer displayed on the empty data browse screen if no data has been written to Health Connect. Note: Health Connect is the brand. [CHAR_LIMIT=NONE]">Data from apps with access to Health&#160;Connect will show here</string>
     <!--  endregion -->
 
     <!-- region App entries -->
@@ -1429,14 +1553,6 @@
     <string name="tab_access" description="Tab that navigates to the screen that shows which apps have access to the given data type. [CHAR_LIMIT=50]">Access</string>
     <!--  endregion -->
 
-    <!-- region Additional Access -->
-    <string name="request_additional_permissions_header_title" description="Title for screen to give additional permissions to an app. [CHAR_LIMIT=NONE]">Allow additional access for <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g>?</string>
-    <string name="request_additional_permissions_description" description="Description for screen to give additional permissions to an app. [CHAR_LIMIT=NONE]"><xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> also wants to access these Health&#160;Connect settings</string>
-    <string name="additional_access_combined_footer" description="Footer of screen to manage additional permissions for an app when no read fitness permissions are granted [CHAR_LIMIT=NONE]">Enable at least one read permission in order to turn on background or past data access for this app</string>
-    <string name="additional_access_background_footer" description="Footer of screen to manage additional permissions for an app when no read fitness permissions are granted [CHAR_LIMIT=NONE]">Enable at least one read permission in order to turn on background access for this app</string>
-    <string name="additional_access_history_footer" description="Footer of screen to manage additional permissions for an app when no read fitness permissions are granted [CHAR_LIMIT=NONE]">Enable at least one read permission in order to turn on past data access for this app</string>
-    <!--  endregion -->
-
     <!-- region Onboarding -->
     <string name="start_using_hc_banner_title" description="Title for banner shown when users have not connected their first fitness app">Start using Health&#160;Connect</string>
     <string name="start_using_hc_banner_content" description="Content for banner shown when users have not connected their first fitness app">Sync your first apps to share health and fitness data between them</string>
@@ -1452,10 +1568,24 @@
 
     <!-- endregion -->
 
+    <!-- region Lock screen banner -->
+    <string name="lock_screen_banner_title" description="Title for banner shown when users don't have a device lock screen set up">Set a screen lock</string>
+    <string name="lock_screen_banner_content" description="Content for banner shown when users don't have a device lock screen set up">For added security for your health data, set a PIN, pattern, or password for this device</string>
+    <string name="lock_screen_banner_button" description="Button that takes users to the app store, for banner shown when users only have one available fitness app">Set screen lock</string>
+    <!-- endregion -->
+
     <!-- region Selectable deletion -->
     <string name="select_all" description="Label for a button that selects all data for deletion [CHAR_LIMIT=40]">Select all</string>
     <string name="deletion_confirmation_dialog_body" description="Text for dialog asking the user to confirm they want to delete all data">Connected apps will no longer be able to read this data from Health&#160;Connect</string>
-
+    <string name="a11y_checked" description="A11y title for an entry that has a checkbox showing and the checkbox is checked">Checked</string>
+    <string name="a11y_unchecked" description="A11y title for an entry that has a checkbox showing and the checkbox is not checked">Not checked</string>
+    <string name="a11y_map_description" description="Generic description of map to indicate it is present in an exercise entry view">Exercise map route available</string>
+    <string name="a11y_next_day" description="Content description for the next day button in the entries screen">Next day</string>
+    <string name="a11y_next_week" description="Content description for the next week button in the entries screen">Next week</string>
+    <string name="a11y_next_month" description="Content description for the next month button in the entries screen">Next month</string>
+    <string name="a11y_previous_day" description="Content description for the previous day button in the entries screen">Previous day</string>
+    <string name="a11y_previous_week" description="Content description for the previous week button in the entries screen">Previous week</string>
+    <string name="a11y_previous_month" description="Content description for the previous month button in the entries screen">Previous month</string>
     <!-- region All data -->
     <string name="all_data_selected_deletion_confirmation_dialog" description="Title for dialog asking the user to confirm they want to delete all data">Permanently delete all data?</string>
     <string name="some_data_selected_deletion_confirmation_dialog" description="Title for dialog asking the user to confirm they want to delete some data">Permanently delete selected data?</string>
@@ -1485,5 +1615,68 @@
     <string name="some_app_entries_selected_month_deletion_confirmation_dialog" description="Title for dialog asking the user to confirm they want to delete selected app entries from the selected month">Permanently delete selected <xliff:g example="Run Tracker" id="app_name">%1$s</xliff:g> entries for <xliff:g example="Jan 2022" id="selected_date_range">%2$s</xliff:g>?</string>
     <string name="one_app_entry_selected_deletion_confirmation_dialog" description="Title for dialog asking the user to confirm they want to delete the selected app entry">Permanently delete this <xliff:g example="Run Tracker" id="app_name">%s</xliff:g> entry?</string>
     <!-- endregion -->
+
+    <!-- region Inactive app data -->
+    <string name="inactive_app_data_selected_deletion_confirmation_dialog" description="Title for dialog asking the user to confirm they want to delete the selected permission type for an inactive app">Permanently delete <xliff:g example="steps" id="data_type">%1$s</xliff:g> data for <xliff:g example="Run Tracker" id="app_name">%2$s</xliff:g>?</string>
+    <!-- endregion -->
+    <!-- endregion -->
+
+    <!-- region Wear -->
+
+    <!-- region Necessary strings to use wear SystemUI copy. -->
+    <!-- Label indicating sensor is on. If you update this string, please update the string
+"switch_bar_on" in SystemUI or do not use the default string for the LocationTile [CHAR LIMIT=NONE] -->
+    <string name="on">On</string>
+    <!-- Label indicating sensor is off. If you update this string, please update the string
+    "switch_bar_off" in SystemUI or do not use the default string for the LocationTile [CHAR LIMIT=NONE] -->
+    <string name="off">Off</string>
+
+    <!-- Summary for showing the last access text for today for Wear [CHAR LIMIT=50] -->
+    <string name="wear_app_perms_24h_access">Accessed <xliff:g id="time_date" example="12:42 PM">%1$s</xliff:g></string>
+
+    <!-- Summary for showing the last access text for yesterday for Wear [CHAR LIMIT=50] -->
+    <string name="wear_app_perms_24h_access_yest">Accessed yesterday <xliff:g id="time_date" example="12:42 PM">%1$s</xliff:g></string>
+
+    <!-- Summary for showing the last access text for 7 days for Wear [CHAR LIMIT=50] -->
+    <string name="wear_app_perms_7d_access">Accessed <xliff:g id="time_date" example="Jan 3">%1$s</xliff:g> <xliff:g id="time_date" example="12:42 PM">%2$s</xliff:g></string>
+    <!-- endregion -->
+
+    <!-- region Grant permission  -->
+    <string name="request_permissions_allow_all_the_time" description="Label for button to allow an app to read health data in background.">Allow all the time</string>
+    <string name="request_permissions_allow_selected" description="Label for button to allow an app to have the selected permissions for the user's data [CHAR_LIMIT=20]">Allow selected</string>
+    <string name="request_permissions_while_using_the_app" description="Label for button to deny an app from reading health data in background.">While using the app</string>
+    <string name="request_permissions_deny_all" description="Label for button to deny an app to have all the requested permissions for the user's data [CHAR_LIMIT=20]">Deny all</string>
+    <string name="wear_allow_app_access_fitness_and_wellness_data" description="Title shown for allowing fitness permissions.">Allow <xliff:g id="app_name" example="Run Tracker">%1$s</xliff:g> to access fitness and wellness data?</string>
+    <string name="wear_request_multiple_data_type_permissions" description="Subtitle shown for allowing multiple fitness permissions. "><xliff:g id="app_name" example="Run Tracker">%1$s</xliff:g> is requesting access to <xliff:g id="data_types" example="Heart rate, Skin temp">%2$s</xliff:g>.\n\nChoose to allow all or control them individually.</string>
+    <string name="wear_request_single_data_type_permission" description="Title shown for allowing single fitness permission. ">Allow <xliff:g id="app_name" example="Run Tracker">%1$s</xliff:g> to access <xliff:g id="data_type" example="heart rate">%2$s</xliff:g>?</string>
+    <!-- endregion -->
+
+    <!-- region App Info Permissions  -->
+    <string name="fitness_and_wellness" description="Title to display fitness and wellness permissions.">Fitness and wellness</string>
+    <string name="view_permissions_all_the_time" description="Text to allow an app to read health data in background.">all the time</string>
+    <string name="view_permissions_while_in_use" description="Text to allow an app to read health data in foreground.">while in use</string>
+    <string name="view_permissions_all_the_time_cap" description="Label for button to allow an app to read health data in background.">All the time</string>
+    <string name="view_permissions_while_in_use_cap" description="Label for button to allow an app to read health data in foreground.">While in use</string>
+    <string name="view_permissions_mode" description="Text to allow an app to read health data in foreground or background."><xliff:g id="app_name" example="Run Tracker">%1$s</xliff:g> can access all of your fitness and wellness data <xliff:g id="allow_mode" example="all the time">%2$s</xliff:g></string>
+    <string name="allowed_to_access" description="Text to display view permission mode (all the time or while in use).">Allowed to access</string>
+    <string name="allowed_to_read" description="Subtitle to display which permissions are allowed">Allowed to read</string>
+    <string name="give_permission_prompt" description="Text to display what permissions are allowed.">These permissions give <xliff:g id="app_name" example="Run Tracker">%1$s</xliff:g> access to data from your device sensors.</string>
+    <!-- endregion -->
+
+    <!-- region Permission Manager  -->
+    <string name="allowed_apps_count" description="Text to indicate how many apps are allowed to a permission."><xliff:g id="number" example="2">%1$d</xliff:g> of <xliff:g id="other_number" example="2">%2$d</xliff:g> apps allowed</string>
+    <string name="no_apps_requesting" description="Text to indicate no app is requesting a permission.">No apps requesting</string>
+    <string name="allowed" description="Text to indicate an app is allowed for this permission.">Allowed</string>
+    <string name="not_allowed" description="Text to indicate an app is not allowed for this permission.">Not allowed</string>
+    <string name="access_sensor_note" description="Text to indicate which data types are allowed from device sensors.">Apps with this permission can access <xliff:g example="heart rate" id="data_type">%s</xliff:g> data from your device sensors.</string>
+    <string name="remove_one_permission_for_all" description="Text to indicate removing a data type access for all apps.">Remove <xliff:g example="heart rate" id="data_type">%s</xliff:g> access for all apps on your watch?</string>
+    <string name="icon_content_check_mark" description="Content description for icon to confirm removing one granular health permission for all apps.">Check mark</string>
+    <string name="icon_content_cross_mark" description="Content description for icon to dismiss removing one granular health permission for all apps.">Cross mark</string>
+    <string name="current_allow_mode" description="Text to indicate currently the app is allowed all the time or while in use.">"Currently, <xliff:g id="app_name" example="Run Tracker">%1$s</xliff:g> can access fitness and wellness data <xliff:g id="allow_mode" example="all the time">%2$s</xliff:g></string>
+    <string name="allow_all_the_time_prompt" description="Title to ask user select all the time or while in use.">Allow <xliff:g id="app_name" example="Run Tracker">%1$s</xliff:g> access to fitness and wellness data all the time?</string>
+    <string name="current_access" description="Subtitle to indicate which data types the app currently has permission to."><xliff:g id="app_name" example="Run Tracker">%1$s</xliff:g> has access to <xliff:g id="data_types" example="Heart rate, Skin temp">%2$s</xliff:g>.</string>
+    <string name="manage_fitness_and_wellness_permissions" description="Label for button to manager fitness and wellness permissions for an app.">Manage fitness and wellness permissions</string>
+    <!-- endregion -->
+
     <!-- endregion -->
 </resources>
diff --git a/apk/res/values/styles.xml b/apk/res/values/styles.xml
index 80469af..658dc75 100644
--- a/apk/res/values/styles.xml
+++ b/apk/res/values/styles.xml
@@ -235,10 +235,11 @@
         <item name="android:background">@drawable/settingslib_spinner_background</item>
         <item name="android:popupBackground">@drawable/settingslib_spinner_dropdown_background
         </item>
-        <item name="android:paddingStart">@dimen/spacing_normal</item>
+        <item name="android:paddingStart">@dimen/spacing_small</item>
         <item name="android:paddingEnd">@dimen/spacing_xlarge</item>
         <item name="android:textColor">@color/settingslib_spinner_title_color</item>
         <item name="android:textAppearance">?attr/textAppearanceLabel</item>
+        <item name="android:dropDownVerticalOffset">@dimen/button_size</item>
     </style>
 
     <style name="Widget.HealthConnect.RadioButton.Chip" parent="@style/Widget.AppCompat.CompoundButton.RadioButton">
diff --git a/apk/res/values/themes.xml b/apk/res/values/themes.xml
index e3226c7..93448c2 100644
--- a/apk/res/values/themes.xml
+++ b/apk/res/values/themes.xml
@@ -109,6 +109,10 @@
         <item name="vitalsIcon">@drawable/ic_medical_vital_signs</item>
         <item name="socialHistoryIcon">@drawable/ic_medical_social_history</item>
 
+        <!-- Lock screen banner -->
+        <item name="lockIcon">@drawable/ic_lock</item>
+
+
         <!-- END REGION -->
 
         <!-- REGION DIALOG GRAVITY -->
diff --git a/apk/res/xml/access_screen.xml b/apk/res/xml/access_screen.xml
index d7af26e..f587253 100644
--- a/apk/res/xml/access_screen.xml
+++ b/apk/res/xml/access_screen.xml
@@ -15,7 +15,10 @@
   limitations under the License.
 -->
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:key="access_screen">
+    <com.android.healthconnect.controller.shared.preference.NoDataPreference
+        app:isPreferenceVisible="false"/>
     <PreferenceCategory
         android:key="can_read">
     </PreferenceCategory>
diff --git a/apk/res/xml/additional_access_screen.xml b/apk/res/xml/additional_access_screen.xml
index 8ca19ba..aa85e6f 100644
--- a/apk/res/xml/additional_access_screen.xml
+++ b/apk/res/xml/additional_access_screen.xml
@@ -24,15 +24,19 @@
 
     <com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
         android:key="key_history_read"
-        android:title="@string/historic_access_title"
-        android:summary="@string/historic_access_description"
+        android:title="@string/history_read_combined_request_title"
+        android:summary="@string/history_read_combined_request_description"
         app:isPreferenceVisible="false"
         />
 
+    <com.android.healthconnect.controller.shared.preference.WarningPreference
+        android:key="key_warning"
+        app:isPreferenceVisible="false" />
+
     <com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
         android:key="key_background_read"
-        android:title="@string/background_read_title"
-        android:summary="@string/background_read_description"
+        android:title="@string/background_read_combined_request_title"
+        android:summary="@string/background_read_combined_request_description"
         app:isPreferenceVisible="false"
         />
 
diff --git a/apk/res/xml/additional_permissions_screen.xml b/apk/res/xml/additional_permissions_screen.xml
index c4b89af..92a6297 100644
--- a/apk/res/xml/additional_permissions_screen.xml
+++ b/apk/res/xml/additional_permissions_screen.xml
@@ -15,9 +15,12 @@
   -->
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
-    <com.android.healthconnect.controller.permissions.request.AdditionalPermissionHeaderPreference
-        android:key="request_additional_permissions_header"/>
+    <com.android.healthconnect.controller.permissions.request.RequestPermissionHeaderPreference
+        android:key="request_permissions_header"/>
     <PreferenceCategory
         android:key="additional_permissions_category"
         app:isPreferenceVisible="false"/>
+    <com.android.settingslib.widget.FooterPreference
+        android:key="request_permissions_footer"
+        app:isPreferenceVisible="false"/>
 </PreferenceScreen>
\ No newline at end of file
diff --git a/apk/res/xml/all_data_screen.xml b/apk/res/xml/all_data_screen.xml
index 4aba21b..0401bd8 100644
--- a/apk/res/xml/all_data_screen.xml
+++ b/apk/res/xml/all_data_screen.xml
@@ -16,6 +16,10 @@
 -->
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
+    <com.android.settingslib.widget.TopIntroPreference
+        android:key="key_top_intro"
+        android:title="@string/browse_health_records_intro"
+        app:isPreferenceVisible="false"/>
     <com.android.healthconnect.controller.selectabledeletion.SelectAllCheckboxPreference
         android:order="0"
         android:key="key_select_all"
@@ -27,7 +31,7 @@
         app:isPreferenceVisible="false"/>
     <com.android.settingslib.widget.FooterPreference
         android:key="key_footer"
-        android:title="@string/no_data_footer"
+        android:title="@string/all_data_no_data_footer"
         app:isPreferenceVisible="false"/>
 
 </PreferenceScreen>
\ No newline at end of file
diff --git a/apk/res/xml/app_data_screen.xml b/apk/res/xml/app_data_screen.xml
index 2e5bca8..b412fc6 100644
--- a/apk/res/xml/app_data_screen.xml
+++ b/apk/res/xml/app_data_screen.xml
@@ -29,6 +29,5 @@
         app:isPreferenceVisible="false"/>
     <com.android.settingslib.widget.FooterPreference
         android:key="key_footer"
-        android:title="@string/no_data_footer"
         app:isPreferenceVisible="false"/>
 </PreferenceScreen>
\ No newline at end of file
diff --git a/apk/res/xml/auto_delete_screen.xml b/apk/res/xml/auto_delete_screen.xml
index d2eaf39..5a00d60 100644
--- a/apk/res/xml/auto_delete_screen.xml
+++ b/apk/res/xml/auto_delete_screen.xml
@@ -16,13 +16,12 @@
 -->
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
     <PreferenceCategory
-        android:key="header">
-    </PreferenceCategory>
-    <PreferenceCategory
         android:key="auto_delete_section"
-        android:title="@string/auto_delete_section">
+        android:title="@string/auto_delete_section"
+        android:order="1">
     </PreferenceCategory>
     <com.android.settingslib.widget.FooterPreference
         android:key="auto_delete_footer"
-        android:title="@string/auto_delete_rationale"/>
+        android:title="@string/auto_delete_rationale"
+        android:order="2"/>
 </PreferenceScreen>
diff --git a/apk/res/xml/home_preference_screen.xml b/apk/res/xml/home_preference_screen.xml
index 01c3e29..681b10e 100644
--- a/apk/res/xml/home_preference_screen.xml
+++ b/apk/res/xml/home_preference_screen.xml
@@ -42,6 +42,7 @@
         <com.android.healthconnect.controller.shared.preference.HealthPreference
             android:key="medical_data"
             android:icon="?attr/dataAndAccessIcon"
-            android:title="@string/browse_medical_data"/>
+            android:title="@string/browse_medical_data"
+            android:summary="@string/browse_medical_data_subtitle"/>
     </PreferenceCategory>
 </PreferenceScreen>
diff --git a/apk/res/xml/permissions_screen_medical_write.xml b/apk/res/xml/permissions_screen_medical_write.xml
new file mode 100644
index 0000000..6e8a5f3
--- /dev/null
+++ b/apk/res/xml/permissions_screen_medical_write.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2024 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <com.android.healthconnect.controller.permissions.request.RequestPermissionHeaderPreference
+        android:key="request_permissions_header"/>
+    <PreferenceCategory
+        android:key="data_to_share"
+        android:title="@string/medical_request_data_to_share">
+        <com.android.healthconnect.controller.shared.preference.HealthPreference
+            android:key="supported_medical_permissions"/>
+    </PreferenceCategory>
+    <com.android.settingslib.widget.FooterPreference
+        android:key="request_medical_write_footer"/>
+</androidx.preference.PreferenceScreen>
\ No newline at end of file
diff --git a/apk/src/com/android/healthconnect/controller/autodelete/AutoDeleteFragment.kt b/apk/src/com/android/healthconnect/controller/autodelete/AutoDeleteFragment.kt
index 904a250..874381d 100644
--- a/apk/src/com/android/healthconnect/controller/autodelete/AutoDeleteFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/autodelete/AutoDeleteFragment.kt
@@ -30,8 +30,8 @@
 import com.android.healthconnect.controller.autodelete.AutoDeleteConfirmationDialogFragment.Companion.OLD_AUTO_DELETE_RANGE_BUNDLE
 import com.android.healthconnect.controller.autodelete.AutoDeleteRangePickerPreference.Companion.AUTO_DELETE_RANGE_PICKER_PREFERENCE_KEY
 import com.android.healthconnect.controller.autodelete.AutoDeleteRangePickerPreference.Companion.SET_TO_NEVER_EVENT
-import com.android.healthconnect.controller.shared.preference.HeaderPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
+import com.android.healthconnect.controller.shared.preference.topIntroPreference
 import com.android.healthconnect.controller.utils.DeviceInfoUtilsImpl
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -44,7 +44,6 @@
 
     companion object {
         private const val AUTO_DELETE_SECTION = "auto_delete_section"
-        private const val HEADER = "header"
     }
 
     init {
@@ -59,8 +58,6 @@
         preferenceScreen.findPreference(AUTO_DELETE_SECTION)
     }
 
-    private val mHeaderSection: PreferenceGroup? by lazy { preferenceScreen.findPreference(HEADER) }
-
     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
         super.onCreatePreferences(savedInstanceState, rootKey)
         setPreferencesFromResource(R.xml.auto_delete_screen, rootKey)
@@ -69,6 +66,15 @@
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
+        preferenceScreen.addPreference(
+            topIntroPreference(
+                context = requireContext(),
+                preferenceTitle = getString(R.string.auto_delete_header),
+                learnMoreText = getString(R.string.auto_delete_learn_more),
+                learnMoreAction = { DeviceInfoUtilsImpl().openHCGetStartedLink(requireActivity()) },
+            )
+        )
+
         viewModel.storedAutoDeleteRange.observe(viewLifecycleOwner) { state ->
             when (state) {
                 is AutoDeleteViewModel.AutoDeleteState.Loading -> {
@@ -78,8 +84,11 @@
                     Toast.makeText(activity, R.string.default_error, Toast.LENGTH_LONG).show()
                 }
                 is AutoDeleteViewModel.AutoDeleteState.WithData -> {
-                    if (mAutoDeleteSection?.findPreference<Preference>(
-                        AUTO_DELETE_RANGE_PICKER_PREFERENCE_KEY) == null) {
+                    if (
+                        mAutoDeleteSection?.findPreference<Preference>(
+                            AUTO_DELETE_RANGE_PICKER_PREFERENCE_KEY
+                        ) == null
+                    ) {
                         val autoDeletePreference =
                             AutoDeleteRangePickerPreference(
                                 requireContext(),
@@ -91,24 +100,14 @@
                     } else {
                         val autoDeletePreference =
                             mAutoDeleteSection?.findPreference<Preference>(
-                                AUTO_DELETE_RANGE_PICKER_PREFERENCE_KEY)
-                                as AutoDeleteRangePickerPreference
+                                AUTO_DELETE_RANGE_PICKER_PREFERENCE_KEY
+                            ) as AutoDeleteRangePickerPreference
                         autoDeletePreference.updateAutoDeleteRange(state.autoDeleteRange)
                     }
                 }
             }
         }
 
-        mHeaderSection?.removeAll()
-        mHeaderSection?.addPreference(
-            HeaderPreference(requireContext()).also {
-                it.setHeaderText(getString(R.string.auto_delete_header))
-                it.setHeaderLinkText(getString(R.string.auto_delete_learn_more))
-                it.setHeaderLinkAction {
-                    DeviceInfoUtilsImpl().openHCGetStartedLink(requireActivity())
-                }
-            })
-
         childFragmentManager.setFragmentResultListener(SET_TO_NEVER_EVENT, this) { _, _ ->
             viewModel.updateAutoDeleteRange(AutoDeleteRange.AUTO_DELETE_RANGE_NEVER)
             Toast.makeText(requireContext(), R.string.auto_delete_off_toast, Toast.LENGTH_LONG)
@@ -116,19 +115,20 @@
         }
 
         childFragmentManager.setFragmentResultListener(
-            AUTO_DELETE_CONFIRMATION_DIALOG_EVENT, this) { _, bundle ->
-                bundle.getSerializable(NEW_AUTO_DELETE_RANGE_BUNDLE)?.let { newAutoDeleteRange ->
-                    bundle.getSerializable(OLD_AUTO_DELETE_RANGE_BUNDLE)?.let { oldAutoDeleteRange
-                        ->
-                        viewModel.updateAutoDeleteDialogArguments(
-                            newAutoDeleteRange as AutoDeleteRange,
-                            oldAutoDeleteRange as AutoDeleteRange,
-                        )
-                        AutoDeleteConfirmationDialogFragment()
-                            .show(childFragmentManager, AutoDeleteConfirmationDialogFragment.TAG)
-                    }
+            AUTO_DELETE_CONFIRMATION_DIALOG_EVENT,
+            this,
+        ) { _, bundle ->
+            bundle.getSerializable(NEW_AUTO_DELETE_RANGE_BUNDLE)?.let { newAutoDeleteRange ->
+                bundle.getSerializable(OLD_AUTO_DELETE_RANGE_BUNDLE)?.let { oldAutoDeleteRange ->
+                    viewModel.updateAutoDeleteDialogArguments(
+                        newAutoDeleteRange as AutoDeleteRange,
+                        oldAutoDeleteRange as AutoDeleteRange,
+                    )
+                    AutoDeleteConfirmationDialogFragment()
+                        .show(childFragmentManager, AutoDeleteConfirmationDialogFragment.TAG)
                 }
             }
+        }
 
         childFragmentManager.setFragmentResultListener(AUTO_DELETE_SAVED_EVENT, this) { _, bundle ->
             bundle.getSerializable(AUTO_DELETE_SAVED_EVENT)?.let {
diff --git a/apk/src/com/android/healthconnect/controller/backuprestore/BackupAndRestoreSettingsFragment.kt b/apk/src/com/android/healthconnect/controller/backuprestore/BackupAndRestoreSettingsFragment.kt
index e16d5de..0e717ec 100644
--- a/apk/src/com/android/healthconnect/controller/backuprestore/BackupAndRestoreSettingsFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/backuprestore/BackupAndRestoreSettingsFragment.kt
@@ -236,6 +236,7 @@
             settingsCategory?.addPreference(
                 ExportStatusPreference(requireContext(), lastExportTime, exportLocation).also {
                     it.order = PREVIOUS_EXPORT_STATUS_ORDER
+                    it.isSelectable = false
                 }
             )
         } else if (
diff --git a/apk/src/com/android/healthconnect/controller/categories/HealthDataCategoriesFragment.kt b/apk/src/com/android/healthconnect/controller/categories/HealthDataCategoriesFragment.kt
index 00eaa74..1f4e8ff 100644
--- a/apk/src/com/android/healthconnect/controller/categories/HealthDataCategoriesFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/categories/HealthDataCategoriesFragment.kt
@@ -39,7 +39,6 @@
 import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.utils.AttributeResolver
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.logging.CategoriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -65,7 +64,6 @@
     }
 
     @Inject lateinit var logger: HealthConnectLogger
-    @Inject lateinit var featureUtils: FeatureUtils
 
     private val categoriesViewModel: HealthDataCategoryViewModel by viewModels()
     private val deletionViewModel: DeletionViewModel by activityViewModels()
@@ -92,7 +90,9 @@
         mDeleteAllData?.setOnPreferenceClickListener {
             val deletionType = DeletionType.DeletionTypeAllData()
             childFragmentManager.setFragmentResult(
-                START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionType))
+                START_DELETION_EVENT,
+                bundleOf(DELETION_TYPE to deletionType),
+            )
             true
         }
         mDeleteAllData?.isEnabled = false
@@ -145,7 +145,8 @@
         mBrowseDataCategory?.removeAll()
         if (sortedCategoriesList.isEmpty()) {
             mBrowseDataCategory?.addPreference(
-                Preference(requireContext()).also { it.setSummary(R.string.no_categories) })
+                Preference(requireContext()).also { it.setSummary(R.string.no_categories) }
+            )
         } else {
             sortedCategoriesList.forEach { categoryState ->
                 val newCategoryPreference =
@@ -157,7 +158,8 @@
                             findNavController()
                                 .navigate(
                                     R.id.action_healthDataCategories_to_healthPermissionTypes,
-                                    bundleOf(CATEGORY_KEY to categoryState.category))
+                                    bundleOf(CATEGORY_KEY to categoryState.category),
+                                )
                             true
                         }
                     }
@@ -181,6 +183,7 @@
                         .navigate(R.id.action_healthDataCategories_to_healthDataAllCategories)
                     true
                 }
-            })
+            }
+        )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/access/AccessFragment.kt b/apk/src/com/android/healthconnect/controller/data/access/AccessFragment.kt
index 597ff13..a2b22b0 100644
--- a/apk/src/com/android/healthconnect/controller/data/access/AccessFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/data/access/AccessFragment.kt
@@ -19,28 +19,31 @@
 import android.os.Bundle
 import android.view.View
 import androidx.core.os.bundleOf
+import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.viewModels
 import androidx.navigation.fragment.findNavController
 import androidx.preference.Preference
 import androidx.preference.PreferenceGroup
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.appdata.AppDataFragment.Companion.PERMISSION_TYPE_NAME_KEY
-import com.android.healthconnect.controller.deletion.DeletionConstants.DELETION_TYPE
-import com.android.healthconnect.controller.deletion.DeletionConstants.START_DELETION_EVENT
-import com.android.healthconnect.controller.deletion.DeletionType
 import com.android.healthconnect.controller.permissions.connectedapps.HealthAppPreference
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.fromPermissionTypeName
+import com.android.healthconnect.controller.selectabledeletion.DeletionConstants.START_DELETION_KEY
+import com.android.healthconnect.controller.selectabledeletion.DeletionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionViewModel
 import com.android.healthconnect.controller.shared.Constants.EXTRA_APP_NAME
 import com.android.healthconnect.controller.shared.app.AppPermissionsType
 import com.android.healthconnect.controller.shared.inactiveapp.InactiveAppPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
+import com.android.healthconnect.controller.shared.preference.NoDataPreference
 import com.android.healthconnect.controller.utils.logging.DataAccessElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
-import com.android.healthconnect.controller.utils.logging.ToolbarElement
+import com.android.healthconnect.controller.utils.pref
 import com.android.healthconnect.controller.utils.setTitle
-import com.android.healthconnect.controller.utils.setupMenu
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
@@ -52,29 +55,25 @@
         private const val CAN_READ_SECTION = "can_read"
         private const val CAN_WRITE_SECTION = "can_write"
         private const val INACTIVE_SECTION = "inactive"
-    }
-
-    init {
-        this.setPageName(PageName.DATA_ACCESS_PAGE)
+        private const val NO_DATA = "no_data_preference"
+        private const val DELETION_TAG = "DeletionTag"
+        private const val START_DELETION_ENTRIES_AND_ACCESS_KEY = "START_DELETION_ENTRIES_AND_ACCESS_KEY"
     }
 
     @Inject lateinit var logger: HealthConnectLogger
 
     private val viewModel: AccessViewModel by viewModels()
+    private val deletionViewModel: DeletionViewModel by activityViewModels()
 
     private lateinit var permissionType: HealthPermissionType
 
-    private val mCanReadSection: PreferenceGroup? by lazy {
-        preferenceScreen.findPreference(CAN_READ_SECTION)
-    }
+    private val mCanReadSection: PreferenceGroup by pref(CAN_READ_SECTION)
 
-    private val mCanWriteSection: PreferenceGroup? by lazy {
-        preferenceScreen.findPreference(CAN_WRITE_SECTION)
-    }
+    private val mCanWriteSection: PreferenceGroup by pref(CAN_WRITE_SECTION)
 
-    private val mInactiveSection: PreferenceGroup? by lazy {
-        preferenceScreen.findPreference(INACTIVE_SECTION)
-    }
+    private val mInactiveSection: PreferenceGroup by pref(INACTIVE_SECTION)
+
+    private val noDataPreference: NoDataPreference by pref(NO_DATA)
 
     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
         super.onCreatePreferences(savedInstanceState, rootKey)
@@ -86,13 +85,19 @@
             permissionType = fromPermissionTypeName(permissionTypeName)
         }
 
-        mCanReadSection?.isVisible = false
-        mCanWriteSection?.isVisible = false
-        mInactiveSection?.isVisible = false
-        mCanReadSection?.title =
+        mCanReadSection.isVisible = false
+        mCanWriteSection.isVisible = false
+        mInactiveSection.isVisible = false
+        mCanReadSection.title =
             getString(R.string.can_read, getString(permissionType.lowerCaseLabel()))
-        mCanWriteSection?.title =
+        mCanWriteSection.title =
             getString(R.string.can_write, getString(permissionType.lowerCaseLabel()))
+
+        if (permissionType is FitnessPermissionType) {
+            setPageName(PageName.TAB_ACCESS_PAGE)
+        } else if (permissionType is MedicalPermissionType) {
+            setPageName(PageName.TAB_MEDICAL_ACCESS_PAGE)
+        }
     }
 
     override fun onResume() {
@@ -120,78 +125,82 @@
             }
         }
 
-        setupMenu(R.menu.set_data_units_with_send_feedback_and_help, viewLifecycleOwner, logger) {
-            menuItem ->
-            when (menuItem.itemId) {
-                R.id.menu_open_units -> {
-                    logger.logImpression(ToolbarElement.TOOLBAR_UNITS_BUTTON)
-                    // TODO(b/291249677): Enable in an upcoming CL.
-                    //                    findNavController()
-                    //
-                    // .navigate(R.id.action_entriesAndAccessFragment_to_unitFragment)
-                    true
-                }
-                else -> false
+        deletionViewModel.inactiveAppsReloadNeeded.observe(viewLifecycleOwner) { isReloadNeeded ->
+            if (isReloadNeeded) {
+                viewModel.loadAppMetaDataMap(permissionType)
+                deletionViewModel.resetInactiveAppsReloadNeeded()
             }
         }
     }
 
     private fun updateDataAccess(appMetadataMap: Map<AppAccessState, List<AppAccessMetadata>>) {
-        mCanReadSection?.removeAll()
-        mCanWriteSection?.removeAll()
-        mInactiveSection?.removeAll()
+        mCanReadSection.removeAll()
+        mCanWriteSection.removeAll()
+        mInactiveSection.removeAll()
+        noDataPreference.isVisible = false
 
         if (appMetadataMap.containsKey(AppAccessState.Read)) {
             if (appMetadataMap[AppAccessState.Read]!!.isEmpty()) {
-                mCanReadSection?.isVisible = false
+                mCanReadSection.isVisible = false
             } else {
-                mCanReadSection?.isVisible = true
+                mCanReadSection.isVisible = true
                 appMetadataMap[AppAccessState.Read]!!.forEach { appAccessMetadata ->
-                    mCanReadSection?.addPreference(createAppPreference(appAccessMetadata))
+                    mCanReadSection.addPreference(createAppPreference(appAccessMetadata))
                 }
             }
         }
         if (appMetadataMap.containsKey(AppAccessState.Write)) {
             if (appMetadataMap[AppAccessState.Write]!!.isEmpty()) {
-                mCanWriteSection?.isVisible = false
+                mCanWriteSection.isVisible = false
             } else {
-                mCanWriteSection?.isVisible = true
+                mCanWriteSection.isVisible = true
                 appMetadataMap[AppAccessState.Write]!!.forEach { appAccessMetadata ->
-                    mCanWriteSection?.addPreference(createAppPreference(appAccessMetadata))
+                    mCanWriteSection.addPreference(createAppPreference(appAccessMetadata))
                 }
             }
         }
         if (appMetadataMap.containsKey(AppAccessState.Inactive)) {
             if (appMetadataMap[AppAccessState.Inactive]!!.isEmpty()) {
-                mInactiveSection?.isVisible = false
+                mInactiveSection.isVisible = false
             } else {
-                mInactiveSection?.isVisible = true
-                mInactiveSection?.addPreference(
+                mInactiveSection.isVisible = true
+                mInactiveSection.addPreference(
                     Preference(requireContext()).also {
                         it.summary =
                             getString(
                                 R.string.inactive_apps_message,
-                                getString(permissionType.lowerCaseLabel()))
-                    })
+                                getString(permissionType.lowerCaseLabel()),
+                            )
+                    }
+                )
                 appMetadataMap[AppAccessState.Inactive]?.forEach { appAccessMetadata ->
                     val appMetadata = appAccessMetadata.appMetadata
-                    mInactiveSection?.addPreference(
+                    mInactiveSection.addPreference(
                         InactiveAppPreference(requireContext()).also {
                             it.title = appMetadata.appName
                             it.icon = appMetadata.icon
                             it.logName = DataAccessElement.DATA_ACCESS_INACTIVE_APP_BUTTON
                             it.setOnDeleteButtonClickListener {
-                                // TODO(b/291249677): Update when new deletion flows are ready.
-                                val deletionType =
-                                    DeletionType.DeletionTypeAppData(
-                                        appMetadata.packageName, appMetadata.appName)
-                                childFragmentManager.setFragmentResult(
-                                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionType))
+                                deletionViewModel.setDeletionType(
+                                    DeletionType.DeleteInactiveAppData(
+                                        healthPermissionType = permissionType,
+                                        packageName = appMetadata.packageName,
+                                        appName = appMetadata.appName,
+                                    )
+                                )
+                                parentFragmentManager.setFragmentResult(
+                                    START_DELETION_ENTRIES_AND_ACCESS_KEY,
+                                    bundleOf(),
+                                )
                             }
-                        })
+                        }
+                    )
                 }
             }
         }
+
+        noDataPreference.isVisible =
+            !mCanReadSection.isVisible && !mCanWriteSection.isVisible && !mInactiveSection.isVisible
     }
 
     private fun createAppPreference(appAccessMetadata: AppAccessMetadata): HealthAppPreference {
@@ -220,6 +229,8 @@
                 navigationId,
                 bundleOf(
                     EXTRA_PACKAGE_NAME to appAccessMetadata.appMetadata.packageName,
-                    EXTRA_APP_NAME to appAccessMetadata.appMetadata.appName))
+                    EXTRA_APP_NAME to appAccessMetadata.appMetadata.appName,
+                ),
+            )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/access/LoadMedicalTypeContributorAppsUseCase.kt b/apk/src/com/android/healthconnect/controller/data/access/LoadMedicalTypeContributorAppsUseCase.kt
index fb26395..f6332a1 100644
--- a/apk/src/com/android/healthconnect/controller/data/access/LoadMedicalTypeContributorAppsUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/data/access/LoadMedicalTypeContributorAppsUseCase.kt
@@ -16,13 +16,18 @@
 package com.android.healthconnect.controller.data.access
 
 import android.health.connect.HealthConnectManager
+import android.health.connect.MedicalResourceTypeInfo
+import androidx.core.os.asOutcomeReceiver
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.permissions.data.fromMedicalResourceType
 import com.android.healthconnect.controller.service.IoDispatcher
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import javax.inject.Inject
 import javax.inject.Singleton
 import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlinx.coroutines.withContext
 
 @Singleton
 class LoadMedicalTypeContributorAppsUseCase
@@ -30,12 +35,36 @@
 constructor(
     private val appInfoReader: AppInfoReader,
     private val healthConnectManager: HealthConnectManager,
-    @IoDispatcher private val dispatcher: CoroutineDispatcher
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
 ) : ILoadMedicalTypeContributorAppsUseCase {
 
     /** Returns a list of [AppMetadata]s that have data in this [MedicalPermissionType]. */
     override suspend operator fun invoke(permissionType: MedicalPermissionType): List<AppMetadata> =
-            emptyList() //TODO(b/350031020): Call API when ready.
+        withContext(dispatcher) {
+            try {
+                val recordTypeInfoMap: List<MedicalResourceTypeInfo> =
+                    suspendCancellableCoroutine { continuation ->
+                        healthConnectManager.queryAllMedicalResourceTypeInfos(
+                            Runnable::run,
+                            continuation.asOutcomeReceiver(),
+                        )
+                    }
+                val packages =
+                    recordTypeInfoMap
+                        .filter {
+                            fromMedicalResourceType(it.medicalResourceType) == permissionType &&
+                                it.contributingDataSources.isNotEmpty()
+                        }
+                        .map { it.contributingDataSources }
+                        .flatten()
+                packages
+                    .map { appInfoReader.getAppMetadata(it.packageName) }
+                    .distinct()
+                    .sortedBy { it.appName }
+            } catch (e: Exception) {
+                emptyList()
+            }
+        }
 }
 
 interface ILoadMedicalTypeContributorAppsUseCase {
diff --git a/apk/src/com/android/healthconnect/controller/data/alldata/AllDataFragment.kt b/apk/src/com/android/healthconnect/controller/data/alldata/AllDataFragment.kt
index 06cbcfa..11185fa 100644
--- a/apk/src/com/android/healthconnect/controller/data/alldata/AllDataFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/data/alldata/AllDataFragment.kt
@@ -23,19 +23,21 @@
 import androidx.core.os.bundleOf
 import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.commitNow
+import androidx.fragment.app.viewModels
 import androidx.navigation.fragment.findNavController
 import androidx.preference.Preference
 import androidx.preference.PreferenceCategory
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.categories.HealthDataCategoriesFragment.Companion.CATEGORY_KEY
-import com.android.healthconnect.controller.data.alldata.AllDataViewModel.AllDataDeletionScreenState.DELETE
-import com.android.healthconnect.controller.data.alldata.AllDataViewModel.AllDataDeletionScreenState.VIEW
 import com.android.healthconnect.controller.data.appdata.AppDataFragment.Companion.PERMISSION_TYPE_NAME_KEY
 import com.android.healthconnect.controller.data.appdata.PermissionTypesPerCategory
 import com.android.healthconnect.controller.data.entries.EntriesViewModel
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
 import com.android.healthconnect.controller.selectabledeletion.DeletionConstants.START_DELETION_KEY
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState.DELETE
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState.VIEW
 import com.android.healthconnect.controller.selectabledeletion.DeletionFragment
 import com.android.healthconnect.controller.selectabledeletion.DeletionPermissionTypesPreference
 import com.android.healthconnect.controller.selectabledeletion.DeletionType
@@ -55,6 +57,7 @@
 import com.android.healthconnect.controller.utils.setupMenu
 import com.android.healthconnect.controller.utils.setupSharedMenu
 import com.android.settingslib.widget.FooterPreference
+import com.android.settingslib.widget.TopIntroPreference
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
@@ -68,14 +71,11 @@
         private const val KEY_SELECT_ALL = "key_select_all"
         private const val KEY_PERMISSION_TYPE = "key_permission_type"
         private const val KEY_NO_DATA = "no_data_preference"
+        private const val KEY_TOP_INTRO = "key_top_intro"
         private const val KEY_FOOTER = "key_footer"
         const val IS_BROWSE_MEDICAL_DATA_SCREEN = "key_is_browse_medical_data_screen"
     }
 
-    init {
-        this.setPageName(PageName.ALL_DATA_PAGE)
-    }
-
     @Inject lateinit var logger: HealthConnectLogger
 
     /** Decides whether this screen is supposed to display Fitness data or Medical data. */
@@ -83,7 +83,7 @@
 
     @HealthDataCategoryInt private var category: Int = 0
 
-    private val viewModel: AllDataViewModel by activityViewModels()
+    private val viewModel: AllDataViewModel by viewModels()
 
     private val deletionViewModel: DeletionViewModel by activityViewModels()
 
@@ -93,6 +93,8 @@
 
     private val noDataPreference: NoDataPreference by pref(KEY_NO_DATA)
 
+    private val topIntroPreference: TopIntroPreference by pref(KEY_TOP_INTRO)
+
     private val footerPreference: FooterPreference by pref(KEY_FOOTER)
 
     private val entriesViewModel: EntriesViewModel by activityViewModels()
@@ -181,6 +183,11 @@
         if (childFragmentManager.findFragmentByTag(DELETION_TAG) == null) {
             childFragmentManager.commitNow { add(DeletionFragment(), DELETION_TAG) }
         }
+        if (showMedicalData) {
+            setPageName(PageName.ALL_MEDICAL_DATA_PAGE)
+        } else {
+            setPageName(PageName.ALL_DATA_PAGE)
+        }
         selectAllCheckboxPreference.logName = AllDataElement.SELECT_ALL_BUTTON
     }
 
@@ -192,7 +199,7 @@
             when (state) {
                 is AllDataViewModel.AllDataState.Loading -> {
                     setLoading(isLoading = true)
-                    if (viewModel.getScreenState() == VIEW) {
+                    if (viewModel.getDeletionScreenStateValue() == VIEW) {
                         updateMenu(screenState = VIEW)
                         triggerDeletionState(screenState = VIEW)
                     }
@@ -210,10 +217,14 @@
             }
         }
 
+        viewModel.deletionScreenState.observe(viewLifecycleOwner) { screenState ->
+            updateMenu(screenState)
+        }
+
         deletionViewModel.permissionTypesReloadNeeded.observe(viewLifecycleOwner) { isReloadNeeded
             ->
             if (isReloadNeeded) {
-                viewModel.setScreenState(VIEW)
+                viewModel.setDeletionScreenStateValue(VIEW)
                 loadAllData()
                 deletionViewModel.resetPermissionTypesReloadNeeded()
             }
@@ -243,9 +254,11 @@
             return
         }
 
-        setupSelectAllPreference(screenState = viewModel.getScreenState())
+        setupSelectAllPreference(screenState = viewModel.getDeletionScreenStateValue())
 
-        updateMenu(screenState = viewModel.getScreenState())
+        updateMenu(screenState = viewModel.getDeletionScreenStateValue())
+        noDataPreference.isVisible = false
+        footerPreference.isVisible = false
 
         populatedCategories.forEach { permissionTypesPerCategory ->
             val category = permissionTypesPerCategory.category
@@ -271,24 +284,7 @@
         }
     }
 
-    private fun onDeletionMethod(preference: DeletionPermissionTypesPreference): () -> Unit {
-        return {
-            if (
-                preference.getHealthPermissionType() !in
-                    viewModel.setOfPermissionTypesToBeDeleted.value.orEmpty()
-            ) {
-                viewModel.addToDeleteSet(preference.getHealthPermissionType())
-            } else {
-                viewModel.removeFromDeleteSet(preference.getHealthPermissionType())
-            }
-            updateMenu(screenState = DELETE)
-        }
-    }
-
-    private fun updateMenu(
-        screenState: AllDataViewModel.AllDataDeletionScreenState,
-        hasData: Boolean = true,
-    ) {
+    private fun updateMenu(screenState: DeletionScreenState, hasData: Boolean = true) {
         if (!hasData && showMedicalData) {
             setupSharedMenu(viewLifecycleOwner, logger)
             return
@@ -333,13 +329,13 @@
     }
 
     @VisibleForTesting
-    fun triggerDeletionState(screenState: AllDataViewModel.AllDataDeletionScreenState) {
-        viewModel.setScreenState(screenState)
+    fun triggerDeletionState(screenState: DeletionScreenState) {
+        viewModel.setDeletionScreenStateValue(screenState)
         setupSelectAllPreference(screenState)
         updateMenu(screenState)
 
         iterateThroughPreferenceGroup { permissionTypePreference ->
-            permissionTypePreference.showCheckbox(screenState == DELETE)
+            permissionTypePreference.setShowCheckbox(screenState == DELETE)
         }
 
         // scroll to top to show Select all preference when triggered
@@ -351,6 +347,7 @@
     private fun setupEmptyState() {
         noDataPreference.isVisible = true
         footerPreference.isVisible = true
+        topIntroPreference.isVisible = false
         updateMenu(screenState = VIEW, hasData = false)
     }
 
@@ -358,7 +355,7 @@
         deletionViewModel.setDeletionType(
             DeletionType.DeleteHealthPermissionTypes(
                 viewModel.setOfPermissionTypesToBeDeleted.value.orEmpty(),
-                viewModel.getNumOfPermissionTypes(),
+                viewModel.getTheNumOfPermissionTypes(),
             )
         )
         childFragmentManager.setFragmentResult(START_DELETION_KEY, bundleOf())
@@ -369,34 +366,35 @@
         categoryIcon: Drawable?,
     ): Preference {
         val pref =
-            DeletionPermissionTypesPreference(requireContext()).also { preference ->
-                preference.setShowCheckbox(viewModel.getScreenState() == DELETE)
-                preference.setLogNameCheckbox(AllDataElement.PERMISSION_TYPE_BUTTON_WITH_CHECKBOX)
-                preference.setLogNameNoCheckbox(AllDataElement.PERMISSION_TYPE_BUTTON_NO_CHECKBOX)
-
-                viewModel.setOfPermissionTypesToBeDeleted.observe(viewLifecycleOwner) { deleteSet ->
-                    preference.setIsChecked(permissionType in deleteSet)
-                }
-
-                preference.icon = categoryIcon
-                preference.setTitle(permissionType.upperCaseLabel())
-                preference.setHealthPermissionType(permissionType)
-
-                preference.setOnPreferenceClickListener(onDeletionMethod(preference)) {
-                    entriesViewModel.setScreenState(
-                        EntriesViewModel.EntriesDeletionScreenState.VIEW
+            DeletionPermissionTypesPreference(requireContext(), viewModel) {
+                findNavController()
+                    .navigate(
+                        navigationDestination(permissionType),
+                        bundleOf(PERMISSION_TYPE_NAME_KEY to permissionType.name),
                     )
-                    entriesViewModel.setAllEntriesSelectedValue(false)
-                    entriesViewModel.currentSelectedDate.value = null
-                    findNavController()
-                        .navigate(
-                            navigationDestination(permissionType),
-                            bundleOf(PERMISSION_TYPE_NAME_KEY to permissionType.name),
-                        )
-                    true
-                }
+                true
             }
 
+        pref.apply {
+            setShowCheckbox(viewModel.getDeletionScreenStateValue() == DELETE)
+            setLogNameCheckbox(AllDataElement.PERMISSION_TYPE_BUTTON_WITH_CHECKBOX)
+            setLogNameNoCheckbox(AllDataElement.PERMISSION_TYPE_BUTTON_NO_CHECKBOX)
+
+            icon = categoryIcon
+            setTitle(permissionType.upperCaseLabel())
+            setHealthPermissionType(permissionType)
+
+            viewModel.setOfPermissionTypesToBeDeleted.observe(viewLifecycleOwner) { deleteSet ->
+                setIsChecked(permissionType in deleteSet)
+            }
+
+            entriesViewModel.setScreenState(
+                EntriesViewModel.EntriesDeletionScreenState.VIEW
+            )
+            entriesViewModel.setAllEntriesSelectedValue(false)
+            entriesViewModel.currentSelectedDate.value = null
+        }
+
         return pref
     }
 
@@ -405,8 +403,9 @@
         else R.id.action_medicalAllData_to_entriesAndAccess
     }
 
-    private fun setupSelectAllPreference(screenState: AllDataViewModel.AllDataDeletionScreenState) {
+    private fun setupSelectAllPreference(screenState: DeletionScreenState) {
         selectAllCheckboxPreference.isVisible = screenState == DELETE
+        topIntroPreference.isVisible = showMedicalData && screenState == VIEW
         if (screenState == DELETE) {
             viewModel.allPermissionTypesSelected.observe(viewLifecycleOwner) {
                 allPermissionTypesSelected ->
@@ -426,9 +425,9 @@
         return {
             iterateThroughPreferenceGroup { permissionTypePreference ->
                 if (selectAllCheckboxPreference.getIsChecked()) {
-                    viewModel.addToDeleteSet(permissionTypePreference.getHealthPermissionType())
+                    viewModel.addToDeletionSet(permissionTypePreference.getHealthPermissionType())
                 } else {
-                    viewModel.removeFromDeleteSet(
+                    viewModel.removeFromDeletionSet(
                         permissionTypePreference.getHealthPermissionType()
                     )
                 }
diff --git a/apk/src/com/android/healthconnect/controller/data/alldata/AllDataViewModel.kt b/apk/src/com/android/healthconnect/controller/data/alldata/AllDataViewModel.kt
index 64a4153..576f540 100644
--- a/apk/src/com/android/healthconnect/controller/data/alldata/AllDataViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/data/alldata/AllDataViewModel.kt
@@ -19,12 +19,10 @@
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
-import com.android.healthconnect.controller.data.appdata.AppDataUseCase
+import com.android.healthconnect.controller.data.appdata.AllDataUseCase
 import com.android.healthconnect.controller.data.appdata.PermissionTypesPerCategory
-import com.android.healthconnect.controller.permissions.data.HealthPermissionType
-import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.MEDICAL
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
@@ -32,8 +30,8 @@
 
 /** View model for the [AllDataFragment] . */
 @HiltViewModel
-class AllDataViewModel @Inject constructor(private val loadAppDataUseCase: AppDataUseCase) :
-    ViewModel() {
+class AllDataViewModel @Inject constructor(private val loadAllDataUseCase: AllDataUseCase) :
+    DeletionDataViewModel() {
 
     companion object {
         private const val TAG = "AllDataViewModel"
@@ -41,35 +39,14 @@
 
     private val _allData = MutableLiveData<AllDataState>()
 
-    private val _setOfPermissionTypesToBeDeleted = MutableLiveData<Set<HealthPermissionType>>()
-
-    val setOfPermissionTypesToBeDeleted: LiveData<Set<HealthPermissionType>>
-        get() = _setOfPermissionTypesToBeDeleted
-
-    private var numOfPermissionTypes: Int = 0
-
-    private var allDataDeletionScreenState: AllDataDeletionScreenState =
-        AllDataDeletionScreenState.VIEW
-
-    private val _allPermissionTypesSelected = MutableLiveData<Boolean>()
-
-    val allPermissionTypesSelected: LiveData<Boolean>
-        get() = _allPermissionTypesSelected
-
     /** Provides a list of [PermissionTypesPerCategory]s to be displayed in [AllDataFragment]. */
     val allData: LiveData<AllDataState>
         get() = _allData
 
-    private val _isAnyMedicalData = MutableLiveData(false)
-
-    /** Provides whether there is any medical data stored in HC. */
-    val isAnyMedicalData: LiveData<Boolean>
-        get() = _isAnyMedicalData
-
     fun loadAllFitnessData() {
         _allData.postValue(AllDataState.Loading)
         viewModelScope.launch {
-            when (val result = loadAppDataUseCase.loadAllFitnessData()) {
+            when (val result = loadAllDataUseCase.loadAllFitnessData()) {
                 is UseCaseResults.Success -> {
                     _allData.postValue(AllDataState.WithData(result.data))
                     numOfPermissionTypes = result.data.sumOf { it.data.size }
@@ -83,78 +60,24 @@
 
     fun loadAllMedicalData() {
         _allData.postValue(AllDataState.Loading)
-        _isAnyMedicalData.postValue(false)
         viewModelScope.launch {
-            when (val result = loadAppDataUseCase.loadAllMedicalData()) {
+            when (val result = loadAllDataUseCase.loadAllMedicalData()) {
                 is UseCaseResults.Success -> {
                     _allData.postValue(AllDataState.WithData(result.data))
                     numOfPermissionTypes = result.data.sumOf { it.data.size }
-                    _isAnyMedicalData.postValue(isAnyMedicalData(result.data))
                 }
                 is UseCaseResults.Failed -> {
                     _allData.postValue(AllDataState.Error)
-                    _isAnyMedicalData.postValue(false)
                 }
             }
         }
     }
 
-    private fun isAnyMedicalData(
-        permissionTypesPerCategory: List<PermissionTypesPerCategory>
-    ): Boolean {
-        return permissionTypesPerCategory
-            .filter { it.category == MEDICAL }
-            .flatMap { it.data }
-            .isNotEmpty()
-    }
-
-    fun resetDeleteSet() {
-        _setOfPermissionTypesToBeDeleted.value = (emptySet())
-    }
-
-    fun addToDeleteSet(permissionType: HealthPermissionType) {
-        val deleteSet = _setOfPermissionTypesToBeDeleted.value.orEmpty().toMutableSet()
-        deleteSet.add(permissionType)
-        _setOfPermissionTypesToBeDeleted.value = (deleteSet.toSet())
-        if (numOfPermissionTypes == deleteSet.size) {
-            _allPermissionTypesSelected.postValue(true)
-        }
-    }
-
-    fun removeFromDeleteSet(permissionType: HealthPermissionType) {
-        val deleteSet = _setOfPermissionTypesToBeDeleted.value.orEmpty().toMutableSet()
-        deleteSet.remove(permissionType)
-        _setOfPermissionTypesToBeDeleted.value = (deleteSet.toSet())
-        if (deleteSet.size != numOfPermissionTypes) {
-            _allPermissionTypesSelected.postValue(false)
-        }
-    }
-
-    fun setScreenState(screenState: AllDataDeletionScreenState) {
-        this.allDataDeletionScreenState = screenState
-        if (allDataDeletionScreenState == AllDataDeletionScreenState.VIEW) {
-            resetDeleteSet()
-        }
-    }
-
-    fun getScreenState(): AllDataDeletionScreenState {
-        return allDataDeletionScreenState
-    }
-
-    fun getNumOfPermissionTypes(): Int {
-        return numOfPermissionTypes
-    }
-
     sealed class AllDataState {
-        object Loading : AllDataState()
+        data object Loading : AllDataState()
 
-        object Error : AllDataState()
+        data object Error : AllDataState()
 
         data class WithData(val dataMap: List<PermissionTypesPerCategory>) : AllDataState()
     }
-
-    enum class AllDataDeletionScreenState {
-        VIEW,
-        DELETE,
-    }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/appdata/AppDataUseCase.kt b/apk/src/com/android/healthconnect/controller/data/appdata/AllDataUseCase.kt
similarity index 78%
rename from apk/src/com/android/healthconnect/controller/data/appdata/AppDataUseCase.kt
rename to apk/src/com/android/healthconnect/controller/data/appdata/AllDataUseCase.kt
index bbaf206..d7b9853 100644
--- a/apk/src/com/android/healthconnect/controller/data/appdata/AppDataUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/data/appdata/AllDataUseCase.kt
@@ -38,9 +38,8 @@
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
 
-// TODO rename to LoadAllDataUseCase
 @Singleton
-class AppDataUseCase
+class AllDataUseCase
 @Inject
 constructor(
     private val healthConnectManager: HealthConnectManager,
@@ -51,13 +50,7 @@
     suspend fun loadAllFitnessData(): UseCaseResults<List<PermissionTypesPerCategory>> =
         withContext(dispatcher) {
             try {
-                val recordTypeInfoMap: Map<Class<out Record>, RecordTypeInfoResponse> =
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.queryAllRecordTypesInfo(
-                            Runnable::run,
-                            continuation.asOutcomeReceiver(),
-                        )
-                    }
+                val recordTypeInfoMap = getRecordTypeInfoMap()
                 val categories =
                     FITNESS_DATA_CATEGORIES.map {
                         PermissionTypesPerCategory(
@@ -76,13 +69,7 @@
     suspend fun loadAllMedicalData(): UseCaseResults<List<PermissionTypesPerCategory>> =
         withContext(dispatcher) {
             try {
-                val medicalResourceTypeInfos: List<MedicalResourceTypeInfo> =
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.queryAllMedicalResourceTypeInfos(
-                            Runnable::run,
-                            continuation.asOutcomeReceiver(),
-                        )
-                    }
+                val medicalResourceTypeInfos = getMedicalResourceTypeInfos()
                 val medicalPermissionTypes =
                     medicalResourceTypeInfos
                         .filter { it.contributingDataSources.isNotEmpty() }
@@ -100,6 +87,34 @@
             }
         }
 
+    /** Returns whether there is any fitness data in HC. */
+    suspend fun loadHasAnyFitnessData(): UseCaseResults<Boolean> =
+        withContext(dispatcher) {
+            try {
+                val recordTypeInfoMap = getRecordTypeInfoMap()
+                val anyFitnessData =
+                    recordTypeInfoMap.any { it.value.contributingPackages.isNotEmpty() }
+                UseCaseResults.Success(anyFitnessData)
+            } catch (e: Exception) {
+                Log.e("TAG_ERROR", "Loading error ", e)
+                UseCaseResults.Failed(e)
+            }
+        }
+
+    /** Returns whether there is any medical data in HC. */
+    suspend fun loadHasAnyMedicalData(): UseCaseResults<Boolean> =
+        withContext(dispatcher) {
+            try {
+                val medicalResourceTypeInfos = getMedicalResourceTypeInfos()
+                val anyMedicalData =
+                    medicalResourceTypeInfos.any { it.contributingDataSources.isNotEmpty() }
+                UseCaseResults.Success(anyMedicalData)
+            } catch (e: Exception) {
+                Log.e("TAG_ERROR", "Loading error ", e)
+                UseCaseResults.Failed(e)
+            }
+        }
+
     /**
      * Returns list of fitness categories and permission types written by the given app to be shown
      * on the HC UI.
@@ -109,13 +124,7 @@
     ): UseCaseResults<List<PermissionTypesPerCategory>> =
         withContext(dispatcher) {
             try {
-                val recordTypeInfoMap: Map<Class<out Record>, RecordTypeInfoResponse> =
-                    suspendCancellableCoroutine { continuation ->
-                        healthConnectManager.queryAllRecordTypesInfo(
-                            Runnable::run,
-                            continuation.asOutcomeReceiver(),
-                        )
-                    }
+                val recordTypeInfoMap = getRecordTypeInfoMap()
                 val categories =
                     FITNESS_DATA_CATEGORIES.map {
                         PermissionTypesPerCategory(
@@ -138,12 +147,7 @@
     ): UseCaseResults<List<PermissionTypesPerCategory>> =
         withContext(dispatcher) {
             try {
-                val medicalResourceTypeInfos = suspendCancellableCoroutine { continuation ->
-                    healthConnectManager.queryAllMedicalResourceTypeInfos(
-                        Runnable::run,
-                        continuation.asOutcomeReceiver(),
-                    )
-                }
+                val medicalResourceTypeInfos = getMedicalResourceTypeInfos()
                 val medicalPermissionTypes =
                     filterMedicalPermissionTypes(medicalResourceTypeInfos, packageName)
                 if (medicalPermissionTypes.isEmpty()) {
@@ -158,6 +162,25 @@
             }
         }
 
+    private suspend fun getRecordTypeInfoMap(): Map<Class<out Record>, RecordTypeInfoResponse> {
+        val recordTypeInfoMap: Map<Class<out Record>, RecordTypeInfoResponse> =
+            suspendCancellableCoroutine { continuation ->
+                healthConnectManager.queryAllRecordTypesInfo(
+                    Runnable::run,
+                    continuation.asOutcomeReceiver(),
+                )
+            }
+        return recordTypeInfoMap
+    }
+
+    private suspend fun getMedicalResourceTypeInfos() =
+        suspendCancellableCoroutine { continuation ->
+            healthConnectManager.queryAllMedicalResourceTypeInfos(
+                Runnable::run,
+                continuation.asOutcomeReceiver(),
+            )
+        }
+
     private fun filterMedicalPermissionTypes(
         medicalResourceTypeInfos: List<MedicalResourceTypeInfo>,
         packageName: String,
diff --git a/apk/src/com/android/healthconnect/controller/data/appdata/AppDataFragment.kt b/apk/src/com/android/healthconnect/controller/data/appdata/AppDataFragment.kt
index aee74b0..923a23c 100644
--- a/apk/src/com/android/healthconnect/controller/data/appdata/AppDataFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/data/appdata/AppDataFragment.kt
@@ -29,12 +29,11 @@
 import androidx.preference.Preference
 import androidx.preference.PreferenceCategory
 import com.android.healthconnect.controller.R
-import com.android.healthconnect.controller.data.appdata.AppDataViewModel.AppDataDeletionScreenState.DELETE
-import com.android.healthconnect.controller.data.appdata.AppDataViewModel.AppDataDeletionScreenState.VIEW
-import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
-import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.selectabledeletion.DeletionConstants
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState.DELETE
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState.VIEW
 import com.android.healthconnect.controller.selectabledeletion.DeletionFragment
 import com.android.healthconnect.controller.selectabledeletion.DeletionPermissionTypesPreference
 import com.android.healthconnect.controller.selectabledeletion.DeletionType
@@ -44,7 +43,6 @@
 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.MEDICAL
 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.uppercaseTitle
 import com.android.healthconnect.controller.shared.children
-import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.shared.preference.NoDataPreference
 import com.android.healthconnect.controller.utils.logging.AllDataElement
@@ -166,6 +164,8 @@
                 icon = appMetadata.icon
                 title = appMetadata.appName
             }
+            footerPreference.title =
+                getString(R.string.app_data_no_data_footer, appMetadata.appName)
         }
 
         viewModel.fitnessAndMedicalData.observe(viewLifecycleOwner) { state ->
@@ -184,10 +184,14 @@
             }
         }
 
+        viewModel.deletionScreenState.observe(viewLifecycleOwner) { screenState ->
+            updateMenu(screenState)
+        }
+
         deletionViewModel.appPermissionTypesReloadNeeded.observe(viewLifecycleOwner) {
             isReloadNeeded ->
             if (isReloadNeeded) {
-                viewModel.setDeletionState(VIEW)
+                viewModel.setDeletionScreenStateValue(VIEW)
                 viewModel.loadAppData(packageName)
                 deletionViewModel.resetAppPermissionTypesReloadNeeded()
             }
@@ -205,8 +209,10 @@
             setupEmptyState()
             return
         }
-        setupSelectAllPreference(screenState = viewModel.getDeletionState())
-        updateMenu(viewModel.getDeletionState())
+        setupSelectAllPreference(screenState = viewModel.getDeletionScreenStateValue())
+        updateMenu(viewModel.getDeletionScreenStateValue())
+        noDataPreference.isVisible = false
+        footerPreference.isVisible = false
 
         populatedCategories.forEach { permissionTypesPerCategory ->
             val category = permissionTypesPerCategory.category
@@ -217,38 +223,11 @@
 
             permissionTypesPerCategory.data
                 .sortedBy { getString(it.upperCaseLabel()) }
-                .filterIsInstance<FitnessPermissionType>()
                 .forEach { permissionType ->
                     preferenceCategory.addPreference(
                         getPermissionTypePreference(permissionType, permissionType.icon(context))
                     )
                 }
-
-            permissionTypesPerCategory.data
-                .sortedBy { getString(it.upperCaseLabel()) }
-                .filterIsInstance<MedicalPermissionType>()
-                .forEach { permissionType ->
-                    preferenceCategory.addPreference(
-                        HealthPreference(requireContext()).also {
-                            it.icon = permissionType.icon(context)
-                            it.setTitle(permissionType.upperCaseLabel())
-                            it.setOnPreferenceClickListener {
-                                // TODO(b/281811925): Add in upcoming cl.
-                                // it.logName = AppDataElement.PERMISSION_TYPE_BUTTON
-                                findNavController()
-                                    .navigate(
-                                        R.id.action_appData_to_appEntries,
-                                        bundleOf(
-                                            EXTRA_PACKAGE_NAME to packageName,
-                                            Constants.EXTRA_APP_NAME to appName,
-                                            PERMISSION_TYPE_NAME_KEY to permissionType.name,
-                                        ),
-                                    )
-                                true
-                            }
-                        }
-                    )
-                }
         }
     }
 
@@ -278,10 +257,7 @@
         setupSelectAllPreference(screenState = VIEW)
     }
 
-    private fun updateMenu(
-        screenState: AppDataViewModel.AppDataDeletionScreenState,
-        hasData: Boolean = true,
-    ) {
+    private fun updateMenu(screenState: DeletionScreenState, hasData: Boolean = true) {
         if (!hasData) {
             setupSharedMenu(viewLifecycleOwner, logger)
             return
@@ -306,13 +282,13 @@
     }
 
     @VisibleForTesting
-    fun triggerDeletionState(screenState: AppDataViewModel.AppDataDeletionScreenState) {
+    fun triggerDeletionState(screenState: DeletionScreenState) {
         updateMenu(screenState)
         setupSelectAllPreference(screenState)
-        viewModel.setDeletionState(screenState)
+        viewModel.setDeletionScreenStateValue(screenState)
 
         iterateThroughPreferenceGroup { permissionTypePreference ->
-            permissionTypePreference.showCheckbox(screenState == DELETE)
+            permissionTypePreference.setShowCheckbox(screenState == DELETE)
         }
     }
 
@@ -334,7 +310,7 @@
         deletionViewModel.setDeletionType(
             DeletionType.DeleteHealthPermissionTypesFromApp(
                 viewModel.setOfPermissionTypesToBeDeleted.value.orEmpty(),
-                viewModel.getNumOfPermissionTypes(),
+                viewModel.getTheNumOfPermissionTypes(),
                 packageName,
                 appName,
             )
@@ -346,19 +322,8 @@
         permissionType: HealthPermissionType,
         categoryIcon: Drawable?,
     ): Preference {
-        return DeletionPermissionTypesPreference(requireContext()).also {
-            it.setShowCheckbox(viewModel.getDeletionState() == DELETE)
-            it.setLogNameCheckbox(AllDataElement.PERMISSION_TYPE_BUTTON_WITH_CHECKBOX)
-            it.setLogNameNoCheckbox(AllDataElement.PERMISSION_TYPE_BUTTON_NO_CHECKBOX)
-            it.setHealthPermissionType(permissionType)
-
-            viewModel.setOfPermissionTypesToBeDeleted.observe(viewLifecycleOwner) { deleteSet ->
-                it.setIsChecked(permissionType in deleteSet)
-            }
-
-            it.icon = categoryIcon
-            it.setTitle(permissionType.upperCaseLabel())
-            it.setOnPreferenceClickListener(onDeletionMethod(it)) {
+        val pref =
+            DeletionPermissionTypesPreference(requireContext(), viewModel) {
                 // TODO(b/281811925): Add in upcoming cl.
                 // it.logName = AppDataElement.PERMISSION_TYPE_BUTTON
                 findNavController()
@@ -372,10 +337,25 @@
                     )
                 true
             }
+
+        pref.apply {
+            setShowCheckbox(viewModel.getDeletionScreenStateValue() == DELETE)
+            setLogNameCheckbox(AllDataElement.PERMISSION_TYPE_BUTTON_WITH_CHECKBOX)
+            setLogNameNoCheckbox(AllDataElement.PERMISSION_TYPE_BUTTON_NO_CHECKBOX)
+            setHealthPermissionType(permissionType)
+
+            viewModel.setOfPermissionTypesToBeDeleted.observe(viewLifecycleOwner) { deleteSet ->
+                setIsChecked(permissionType in deleteSet)
+            }
+
+            icon = categoryIcon
+            setTitle(permissionType.upperCaseLabel())
         }
+
+        return pref
     }
 
-    private fun setupSelectAllPreference(screenState: AppDataViewModel.AppDataDeletionScreenState) {
+    private fun setupSelectAllPreference(screenState: DeletionScreenState) {
         selectAllCheckboxPreference.isVisible = screenState == DELETE
         if (screenState == DELETE) {
             viewModel.allPermissionTypesSelected.observe(viewLifecycleOwner) {
diff --git a/apk/src/com/android/healthconnect/controller/data/appdata/AppDataViewModel.kt b/apk/src/com/android/healthconnect/controller/data/appdata/AppDataViewModel.kt
index 2ffbe20..f5bdccc 100644
--- a/apk/src/com/android/healthconnect/controller/data/appdata/AppDataViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/data/appdata/AppDataViewModel.kt
@@ -20,10 +20,9 @@
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MediatorLiveData
 import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
-import com.android.healthconnect.controller.permissions.data.HealthPermissionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
@@ -38,8 +37,8 @@
 @Inject
 constructor(
     private val appInfoReader: AppInfoReader,
-    private val loadAppDataUseCase: AppDataUseCase,
-) : ViewModel() {
+    private val loadAllDataUseCase: AllDataUseCase,
+) : DeletionDataViewModel() {
 
     companion object {
         private const val TAG = "AppDataViewModel"
@@ -75,28 +74,13 @@
     val appInfo: LiveData<AppMetadata>
         get() = _appInfo
 
-    private val _setOfPermissionTypesToBeDeleted = MutableLiveData<Set<HealthPermissionType>>()
-
-    val setOfPermissionTypesToBeDeleted: LiveData<Set<HealthPermissionType>>
-        get() = _setOfPermissionTypesToBeDeleted
-
-    private var appDataDeletionScreenState: AppDataDeletionScreenState =
-        AppDataDeletionScreenState.VIEW
-
-    private var numOfPermissionTypes: Int = 0
-
-    private val _allPermissionTypesSelected = MutableLiveData<Boolean>()
-
-    val allPermissionTypesSelected: LiveData<Boolean>
-        get() = _allPermissionTypesSelected
-
     fun loadAppData(packageName: String) {
         _appFitnessData.postValue(AppDataState.Loading)
         _appMedicalData.postValue(AppDataState.Loading)
         numOfPermissionTypes = 0
         viewModelScope.launch {
-            val fitnessData = async { loadAppDataUseCase.loadFitnessAppData(packageName) }
-            val medicalData = async { loadAppDataUseCase.loadMedicalAppData(packageName) }
+            val fitnessData = async { loadAllDataUseCase.loadFitnessAppData(packageName) }
+            val medicalData = async { loadAllDataUseCase.loadMedicalAppData(packageName) }
 
             handleResult(fitnessData.await(), _appFitnessData)
             handleResult(medicalData.await(), _appMedicalData)
@@ -138,50 +122,10 @@
         viewModelScope.launch { _appInfo.postValue(appInfoReader.getAppMetadata(packageName)) }
     }
 
-    fun resetDeletionSet() {
-        _setOfPermissionTypesToBeDeleted.value = emptySet()
-    }
-
-    fun addToDeletionSet(permissionType: HealthPermissionType) {
-        val deleteSet = _setOfPermissionTypesToBeDeleted.value.orEmpty().toMutableSet()
-        deleteSet.add(permissionType)
-        _setOfPermissionTypesToBeDeleted.value = deleteSet.toSet()
-        if (numOfPermissionTypes == deleteSet.size) {
-            _allPermissionTypesSelected.postValue(true)
-        }
-    }
-
-    fun removeFromDeletionSet(permissionType: HealthPermissionType) {
-        val deleteSet = _setOfPermissionTypesToBeDeleted.value.orEmpty().toMutableSet()
-        deleteSet.remove(permissionType)
-        _setOfPermissionTypesToBeDeleted.value = deleteSet.toSet()
-        if (numOfPermissionTypes != deleteSet.size) {
-            _allPermissionTypesSelected.postValue(false)
-        }
-    }
-
-    fun setDeletionState(appDataDeletionScreenState: AppDataDeletionScreenState) {
-        this.appDataDeletionScreenState = appDataDeletionScreenState
-        if (this.appDataDeletionScreenState == AppDataDeletionScreenState.VIEW) {
-            resetDeletionSet()
-        }
-    }
-
-    fun getDeletionState(): AppDataDeletionScreenState {
-        return appDataDeletionScreenState
-    }
-
-    fun getNumOfPermissionTypes(): Int = numOfPermissionTypes
-
-    enum class AppDataDeletionScreenState {
-        VIEW,
-        DELETE,
-    }
-
     sealed class AppDataState {
-        object Loading : AppDataState()
+        data object Loading : AppDataState()
 
-        object Error : AppDataState()
+        data object Error : AppDataState()
 
         data class WithData(val dataMap: List<PermissionTypesPerCategory>) : AppDataState()
     }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/AllEntriesFragment.kt b/apk/src/com/android/healthconnect/controller/data/entries/AllEntriesFragment.kt
index 5edefb5..fe70413 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/AllEntriesFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/AllEntriesFragment.kt
@@ -27,7 +27,6 @@
 import androidx.core.view.isVisible
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
-import androidx.fragment.app.commitNow
 import androidx.navigation.fragment.findNavController
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
@@ -48,17 +47,19 @@
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.fromPermissionTypeName
-import com.android.healthconnect.controller.selectabledeletion.DeletionConstants
-import com.android.healthconnect.controller.selectabledeletion.DeletionFragment
+import com.android.healthconnect.controller.selectabledeletion.DeletionConstants.START_DELETION_KEY
 import com.android.healthconnect.controller.selectabledeletion.DeletionType
 import com.android.healthconnect.controller.selectabledeletion.DeletionViewModel
 import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.shared.recyclerview.RecyclerViewAdapter
+import com.android.healthconnect.controller.utils.TimeSource
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.logging.ToolbarElement
 import com.android.healthconnect.controller.utils.setTitle
 import com.android.healthconnect.controller.utils.setupMenu
 import com.android.healthconnect.controller.utils.setupSharedMenu
+import com.android.healthconnect.controller.utils.toInstant
 import dagger.hilt.android.AndroidEntryPoint
 import java.time.Instant
 import javax.inject.Inject
@@ -69,10 +70,11 @@
 
     companion object {
         private const val DELETION_TAG = "DeletionTag"
+        private const val START_DELETION_ENTRIES_AND_ACCESS_KEY = "START_DELETION_ENTRIES_AND_ACCESS_KEY"
     }
 
     @Inject lateinit var logger: HealthConnectLogger
-    // TODO(b/291249677): Add logging.
+    @Inject lateinit var timeSource: TimeSource
 
     private lateinit var permissionType: HealthPermissionType
     private val entriesViewModel: EntriesViewModel by activityViewModels()
@@ -116,7 +118,7 @@
     }
 
     // DELETE state click listener
-    private val mOnSelectEntryListener by lazy {
+    private val onSelectEntryListener by lazy {
         object : OnSelectEntryListener {
             override fun onSelectEntry(
                 id: String,
@@ -156,7 +158,7 @@
 
     private val aggregationViewBinder by lazy { AggregationViewBinder() }
     private val entryViewBinder by lazy {
-        EntryItemViewBinder(onSelectEntryListener = mOnSelectEntryListener)
+        EntryItemViewBinder(onSelectEntryListener = onSelectEntryListener)
     }
     private val medicalEntryViewBinder by lazy {
         MedicalEntryItemViewBinder(onClickMedicalEntryListener = onClickMedicalEntryListener)
@@ -165,24 +167,24 @@
     private val sleepSessionViewBinder by lazy {
         SleepSessionItemViewBinder(
             onItemClickedListener = onClickEntryListener,
-            onSelectEntryListener = mOnSelectEntryListener,
+            onSelectEntryListener = onSelectEntryListener,
         )
     }
     private val exerciseSessionItemViewBinder by lazy {
         ExerciseSessionItemViewBinder(
             onItemClickedListener = onClickEntryListener,
-            onSelectEntryListener = mOnSelectEntryListener,
+            onSelectEntryListener = onSelectEntryListener,
         )
     }
     private val seriesDataItemViewBinder by lazy {
         SeriesDataItemViewBinder(
             onItemClickedListener = onClickEntryListener,
-            onSelectEntryListener = mOnSelectEntryListener,
+            onSelectEntryListener = onSelectEntryListener,
         )
     }
     private val plannedExerciseSessionItemViewBinder by lazy {
         PlannedExerciseSessionItemViewBinder(
-            onSelectEntryListener = mOnSelectEntryListener,
+            onSelectEntryListener = onSelectEntryListener,
             onItemClickedListener = onClickEntryListener,
         )
     }
@@ -236,10 +238,12 @@
                     ?: throw IllegalArgumentException("PERMISSION_TYPE_NAME_KEY can't be null!")
             permissionType = fromPermissionTypeName(permissionTypeName)
         }
+        setLoggerPageId()
         setTitle(permissionType.upperCaseLabel())
         logger.logImpression(ToolbarElement.TOOLBAR_SETTINGS_BUTTON)
 
         dateNavigationView = view.findViewById(R.id.date_navigation_view)
+        setDateNavigationViewMaxDate()
         if (permissionType is MedicalPermissionType) {
             dateNavigationView.isVisible = false
         }
@@ -280,9 +284,6 @@
                 it.layoutManager = LinearLayoutManager(context, VERTICAL, false)
             }
 
-        if (childFragmentManager.findFragmentByTag(DELETION_TAG) == null) {
-            childFragmentManager.commitNow { add(DeletionFragment(), DELETION_TAG) }
-        }
         return view
     }
 
@@ -338,16 +339,29 @@
                 dateNavigationView.getPeriod(),
             )
         }
-        //
-        //        logger.setPageId(pageName)
-        //        logger.logPageImpression()
+        setLoggerPageId()
+        logger.logPageImpression()
+    }
+
+    private fun setLoggerPageId() {
+        when (permissionType) {
+            is FitnessPermissionType -> {
+                logger.setPageId(PageName.TAB_ENTRIES_PAGE)
+            }
+            is MedicalPermissionType -> {
+                logger.setPageId(PageName.TAB_MEDICAL_ENTRIES_PAGE)
+            }
+            else -> {
+                logger.setPageId(PageName.UNKNOWN_PAGE)
+            }
+        }
     }
 
     private fun updateMenu(
         screenState: EntriesViewModel.EntriesDeletionScreenState,
         hasData: Boolean = true,
     ) {
-        if (!hasData) {
+        if (permissionType is MedicalPermissionType || !hasData) {
             setupSharedMenu(viewLifecycleOwner, logger)
             return
         }
@@ -405,7 +419,15 @@
                 entriesViewModel.currentSelectedDate.value!!,
             )
         )
-        childFragmentManager.setFragmentResult(DeletionConstants.START_DELETION_KEY, bundleOf())
+        parentFragmentManager.setFragmentResult(START_DELETION_ENTRIES_AND_ACCESS_KEY, bundleOf())
+    }
+
+    private fun setDateNavigationViewMaxDate() {
+        if (permissionType == FitnessPermissionType.PLANNED_EXERCISE) {
+            dateNavigationView.setMaxDate(null)
+        } else {
+            dateNavigationView.setMaxDate(timeSource.currentTimeMillis().toInstant())
+        }
     }
 
     private fun observeEntriesUpdates() {
@@ -436,7 +458,10 @@
                     // Save aggregation for re-adding to the entries list
                     // when exiting deletion without having deleted any entries
                     aggregation =
-                        if (state.entries[0] is FormattedEntry.FormattedAggregation) {
+                        if (
+                            state.entries.isNotEmpty() &&
+                                state.entries[0] is FormattedEntry.FormattedAggregation
+                        ) {
                             state.entries[0] as FormattedEntry.FormattedAggregation
                         } else {
                             null
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/AppEntriesFragment.kt b/apk/src/com/android/healthconnect/controller/data/entries/AppEntriesFragment.kt
index ed4aaf5..dfde6df 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/AppEntriesFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/AppEntriesFragment.kt
@@ -19,12 +19,15 @@
 import android.health.connect.MedicalResourceId
 import android.os.Bundle
 import android.view.LayoutInflater
+import android.view.MenuItem
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
+import androidx.annotation.VisibleForTesting
 import androidx.core.os.bundleOf
 import androidx.core.view.isVisible
 import androidx.fragment.app.Fragment
+import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.commitNow
 import androidx.fragment.app.viewModels
 import androidx.navigation.fragment.findNavController
@@ -33,6 +36,8 @@
 import androidx.recyclerview.widget.RecyclerView.VERTICAL
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.appdata.AppDataFragment.Companion.PERMISSION_TYPE_NAME_KEY
+import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesDeletionScreenState.DELETE
+import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesDeletionScreenState.VIEW
 import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesFragmentState.Empty
 import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesFragmentState.Loading
 import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesFragmentState.LoadingFailed
@@ -40,20 +45,24 @@
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationView
 import com.android.healthconnect.controller.data.rawfhir.RawFhirFragment
-import com.android.healthconnect.controller.deletion.DeletionConstants.FRAGMENT_TAG_DELETION
-import com.android.healthconnect.controller.deletion.DeletionFragment
 import com.android.healthconnect.controller.entrydetails.DataEntryDetailsFragment
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.fromPermissionTypeName
+import com.android.healthconnect.controller.selectabledeletion.DeletionConstants
+import com.android.healthconnect.controller.selectabledeletion.DeletionFragment
+import com.android.healthconnect.controller.selectabledeletion.DeletionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionViewModel
 import com.android.healthconnect.controller.shared.Constants
+import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.shared.recyclerview.RecyclerViewAdapter
+import com.android.healthconnect.controller.utils.TimeSource
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
-import com.android.healthconnect.controller.utils.logging.ToolbarElement
 import com.android.healthconnect.controller.utils.setTitle
 import com.android.healthconnect.controller.utils.setupMenu
-import com.android.settingslib.widget.AppHeaderPreference
+import com.android.healthconnect.controller.utils.setupSharedMenu
+import com.android.healthconnect.controller.utils.toInstant
 import dagger.hilt.android.AndroidEntryPoint
 import java.time.Instant
 import javax.inject.Inject
@@ -62,22 +71,30 @@
 @AndroidEntryPoint(Fragment::class)
 class AppEntriesFragment : Hilt_AppEntriesFragment() {
 
+    companion object {
+        private const val DELETION_TAG = "DeletionTag"
+    }
+
     @Inject lateinit var logger: HealthConnectLogger
+    @Inject lateinit var timeSource: TimeSource
 
     private var packageName: String = ""
     private var appName: String = ""
 
     private lateinit var permissionType: HealthPermissionType
     private val entriesViewModel: EntriesViewModel by viewModels()
+    private val deletionViewModel: DeletionViewModel by activityViewModels()
 
-    private lateinit var header: AppHeaderPreference
+    private lateinit var header: AppHeaderView
     private lateinit var dateNavigationView: DateNavigationView
     private lateinit var entriesRecyclerView: RecyclerView
     private lateinit var noDataView: TextView
     private lateinit var loadingView: View
     private lateinit var errorView: View
     private lateinit var adapter: RecyclerViewAdapter
+    private var aggregation: FormattedEntry.FormattedAggregation? = null
 
+    // VIEW state click listener
     private val onClickEntryListener by lazy {
         object : OnClickEntryListener {
             override fun onItemClicked(id: String, index: Int) {
@@ -93,31 +110,126 @@
             }
         }
     }
+
+    // VIEW state click listener
     private val onClickMedicalEntryListener by lazy {
         object : OnClickMedicalEntryListener {
             override fun onItemClicked(id: MedicalResourceId, index: Int) {
                 findNavController()
                     .navigate(
-                        R.id.action_entriesAndAccessFragment_to_rawFhirFragment,
+                        R.id.action_appEntriesFragment_to_rawFhirFragment,
                         bundleOf(RawFhirFragment.MEDICAL_RESOURCE_ID_KEY to id),
                     )
             }
         }
     }
+
+    // DELETE state click listener
+    private val onSelectEntryListener by lazy {
+        object : OnSelectEntryListener {
+            override fun onSelectEntry(
+                id: String,
+                dataType: DataType,
+                index: Int,
+                startTime: Instant?,
+                endTime: Instant?,
+            ) {
+                if (id in entriesViewModel.mapOfEntriesToBeDeleted.value.orEmpty()) {
+                    entriesViewModel.removeFromDeleteMap(id)
+                } else {
+                    entriesViewModel.addToDeleteMap(id, dataType)
+                }
+                updateMenu(screenState = DELETE)
+            }
+        }
+    }
+
+    // DELETE state select all
+    private val onClickSelectAllListener by lazy {
+        object : OnClickSelectAllListener {
+            override fun onClicked(isChecked: Boolean) {
+                entriesViewModel.setAllEntriesSelectedValue(isChecked)
+                entriesViewModel.getEntriesList().forEach { entry ->
+                    if (entry is FormattedEntry.HasDataType) {
+                        if (isChecked) {
+                            entriesViewModel.addToDeleteMap(entry.uuid, entry.dataType)
+                        } else {
+                            entriesViewModel.removeFromDeleteMap(entry.uuid)
+                        }
+                    }
+                }
+                updateMenu(screenState = DELETE)
+            }
+        }
+    }
     private val aggregationViewBinder by lazy { AggregationViewBinder() }
-    private val entryViewBinder by lazy { EntryItemViewBinder() }
+    private val entryViewBinder by lazy {
+        EntryItemViewBinder(onSelectEntryListener = onSelectEntryListener)
+    }
     private val medicalEntryViewBinder by lazy {
         MedicalEntryItemViewBinder(onClickMedicalEntryListener = onClickMedicalEntryListener)
     }
     private val sectionTitleViewBinder by lazy { SectionTitleViewBinder() }
     private val sleepSessionViewBinder by lazy {
-        SleepSessionItemViewBinder(onItemClickedListener = onClickEntryListener)
+        SleepSessionItemViewBinder(
+            onItemClickedListener = onClickEntryListener,
+            onSelectEntryListener = onSelectEntryListener,
+        )
     }
     private val exerciseSessionItemViewBinder by lazy {
-        ExerciseSessionItemViewBinder(onItemClickedListener = onClickEntryListener)
+        ExerciseSessionItemViewBinder(
+            onItemClickedListener = onClickEntryListener,
+            onSelectEntryListener = onSelectEntryListener,
+        )
     }
     private val seriesDataItemViewBinder by lazy {
-        SeriesDataItemViewBinder(onItemClickedListener = onClickEntryListener)
+        SeriesDataItemViewBinder(
+            onItemClickedListener = onClickEntryListener,
+            onSelectEntryListener = onSelectEntryListener,
+        )
+    }
+    private val plannedExerciseSessionItemViewBinder by lazy {
+        PlannedExerciseSessionItemViewBinder(
+            onSelectEntryListener = onSelectEntryListener,
+            onItemClickedListener = onClickEntryListener,
+        )
+    }
+    private val selectAllViewBinder by lazy { SelectAllViewBinder(onClickSelectAllListener) }
+
+    // Not in deletion state
+    private val onMenuSetup: (MenuItem) -> Boolean = { menuItem ->
+        when (menuItem.itemId) {
+            R.id.menu_enter_deletion_state -> {
+                // enter deletion state
+                triggerDeletionState(DELETE)
+                true
+            }
+            else -> false
+        }
+    }
+
+    // In deletion state with data selected
+    private val onEnterDeletionState: (MenuItem) -> Boolean = { menuItem ->
+        when (menuItem.itemId) {
+            R.id.delete -> {
+                deleteData()
+                true
+            }
+            else -> false
+        }
+    }
+
+    // In deletion state without any data selected
+    private val onEmptyDeleteSetSetup: (MenuItem) -> Boolean = { menuItem ->
+        when (menuItem.itemId) {
+            R.id.menu_exit_deletion_state -> {
+                // exit deletion state
+                triggerDeletionState(VIEW)
+                true
+            }
+
+            else -> false
+        }
     }
 
     override fun onCreateView(
@@ -148,27 +260,20 @@
             permissionType = fromPermissionTypeName(permissionTypeName)
         }
         setTitle(permissionType.upperCaseLabel())
-        setupMenu(R.menu.set_data_units_with_send_feedback_and_help, viewLifecycleOwner, logger) {
-            menuItem ->
-            when (menuItem.itemId) {
-                R.id.menu_open_units -> {
-                    logger.logImpression(ToolbarElement.TOOLBAR_UNITS_BUTTON)
-                    findNavController().navigate(R.id.action_dataEntriesFragment_to_unitsFragment)
-                    true
-                }
-                else -> false
-            }
-        }
 
         dateNavigationView = view.findViewById(R.id.date_navigation_view)
         if (permissionType is MedicalPermissionType) {
             dateNavigationView.isVisible = false
+        } else {
+            setDateNavigationViewMaxDate()
         }
+        header = view.findViewById(R.id.app_header)
         noDataView = view.findViewById(R.id.no_data_view)
         errorView = view.findViewById(R.id.error_view)
         loadingView = view.findViewById(R.id.loading)
         adapter =
             RecyclerViewAdapter.Builder()
+                .setViewBinder(FormattedEntry.SelectAllHeader::class.java, selectAllViewBinder)
                 .setViewBinder(FormattedEntry.FormattedDataEntry::class.java, entryViewBinder)
                 .setViewBinder(
                     FormattedEntry.FormattedMedicalDataEntry::class.java,
@@ -188,6 +293,10 @@
                     FormattedEntry.EntryDateSectionHeader::class.java,
                     sectionTitleViewBinder,
                 )
+                .setViewBinder(
+                    FormattedEntry.PlannedExerciseSessionEntry::class.java,
+                    plannedExerciseSessionItemViewBinder,
+                )
                 .setViewModel(entriesViewModel)
                 .build()
         entriesRecyclerView =
@@ -196,8 +305,8 @@
                 it.layoutManager = LinearLayoutManager(context, VERTICAL, false)
             }
 
-        if (childFragmentManager.findFragmentByTag(FRAGMENT_TAG_DELETION) == null) {
-            childFragmentManager.commitNow { add(DeletionFragment(), FRAGMENT_TAG_DELETION) }
+        if (childFragmentManager.findFragmentByTag(DELETION_TAG) == null) {
+            childFragmentManager.commitNow { add(DeletionFragment(), DELETION_TAG) }
         }
 
         return view
@@ -222,16 +331,29 @@
             }
         )
 
-        header = AppHeaderPreference(requireContext())
         entriesViewModel.loadAppInfo(packageName)
 
         entriesViewModel.appInfo.observe(viewLifecycleOwner) { appMetadata ->
-            header.apply {
-                icon = appMetadata.icon
-                title = appMetadata.appName
+            header.setAppInfo(appMetadata)
+            header.visibility = View.VISIBLE
+        }
+
+        deletionViewModel.appEntriesReloadNeeded.observe(viewLifecycleOwner) { isReloadNeeded ->
+            if (isReloadNeeded) {
+                entriesViewModel.setScreenState(VIEW)
+                entriesViewModel.loadEntries(
+                    permissionType,
+                    dateNavigationView.getDate(),
+                    dateNavigationView.getPeriod(),
+                )
+                deletionViewModel.resetAppEntriesReloadNeeded()
             }
         }
 
+        entriesViewModel.allEntriesSelected.observe(viewLifecycleOwner) { allEntriesSelected ->
+            adapter.checkSelectAll(allEntriesSelected)
+        }
+
         observeEntriesUpdates()
     }
 
@@ -259,6 +381,73 @@
         // TODO(b/291249677): Log pagename.
     }
 
+    private fun updateMenu(
+        screenState: EntriesViewModel.EntriesDeletionScreenState,
+        hasData: Boolean = true,
+    ) {
+        if (!hasData || permissionType is MedicalPermissionType) {
+            setupSharedMenu(viewLifecycleOwner, logger)
+            return
+        }
+
+        if (screenState == VIEW) {
+            setupMenu(R.menu.all_entries_menu, viewLifecycleOwner, logger, onMenuSetup)
+            return
+        }
+
+        if (entriesViewModel.mapOfEntriesToBeDeleted.value.orEmpty().isEmpty()) {
+            setupMenu(
+                R.menu.all_data_delete_menu,
+                viewLifecycleOwner,
+                logger,
+                onEmptyDeleteSetSetup,
+            )
+            return
+        }
+
+        setupMenu(R.menu.deletion_state_menu, viewLifecycleOwner, logger, onEnterDeletionState)
+    }
+
+    @VisibleForTesting
+    fun triggerDeletionState(screenState: EntriesViewModel.EntriesDeletionScreenState) {
+        updateMenu(screenState)
+        if (screenState == VIEW) {
+            adapter.removeSelectAll()
+            aggregation?.let { adapter.insertAggregation(it) }
+        } else {
+            aggregation?.let { adapter.removeAggregation() }
+            adapter.insertSelectAll(FormattedEntry.SelectAllHeader())
+        }
+        adapter.showCheckBox(screenState == DELETE)
+        entriesViewModel.setScreenState(screenState)
+        if (entriesViewModel.getDateNavigationText() == null) {
+            dateNavigationView.getDateNavigationText()?.let {
+                entriesViewModel.setDateNavigationText(it)
+            }
+        }
+        entriesViewModel.getDateNavigationText()?.let { dateSpinnerText ->
+            dateNavigationView.disableDateNavigationView(
+                isEnabled = screenState == VIEW,
+                dateSpinnerText,
+            )
+        }
+    }
+
+    @VisibleForTesting
+    fun deleteData() {
+        deletionViewModel.setDeletionType(
+            DeletionType.DeleteEntriesFromApp(
+                entriesViewModel.mapOfEntriesToBeDeleted.value.orEmpty().toMap(),
+                packageName,
+                appName,
+                entriesViewModel.getNumOfEntries(),
+                dateNavigationView.getPeriod(),
+                entriesViewModel.currentSelectedDate.value!!,
+            )
+        )
+        childFragmentManager.setFragmentResult(DeletionConstants.START_DELETION_KEY, bundleOf())
+    }
+
     private fun observeEntriesUpdates() {
         entriesViewModel.entries.observe(viewLifecycleOwner) { state ->
             when (state) {
@@ -273,13 +462,35 @@
                     loadingView.isVisible = false
                     errorView.isVisible = false
                     entriesRecyclerView.isVisible = false
+                    updateMenu(screenState = VIEW, hasData = false)
+                    entriesViewModel.getDateNavigationText()?.let { dateSpinnerText ->
+                        dateNavigationView.disableDateNavigationView(
+                            isEnabled = true,
+                            dateSpinnerText,
+                        )
+                    }
                 }
                 is With -> {
                     entriesRecyclerView.isVisible = true
                     adapter.updateData(state.entries)
+                    // Save aggregation for re-adding to the entries list
+                    // when exiting deletion without having deleted any entries
+                    aggregation =
+                        if (
+                            state.entries.isNotEmpty() &&
+                                state.entries[0] is FormattedEntry.FormattedAggregation
+                        ) {
+                            state.entries[0] as FormattedEntry.FormattedAggregation
+                        } else {
+                            null
+                        }
+                    entriesRecyclerView.scrollToPosition(0)
                     errorView.isVisible = false
                     noDataView.isVisible = false
                     loadingView.isVisible = false
+                    entriesViewModel.screenState.value?.let {
+                        triggerDeletionState(screenState = it)
+                    }
                 }
                 is LoadingFailed -> {
                     errorView.isVisible = true
@@ -290,4 +501,12 @@
             }
         }
     }
+
+    private fun setDateNavigationViewMaxDate() {
+        if (permissionType == FitnessPermissionType.PLANNED_EXERCISE) {
+            dateNavigationView.setMaxDate(null)
+        } else {
+            dateNavigationView.setMaxDate(timeSource.currentTimeMillis().toInstant())
+        }
+    }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/AppHeaderView.kt b/apk/src/com/android/healthconnect/controller/data/entries/AppHeaderView.kt
new file mode 100644
index 0000000..91fc37a
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/data/entries/AppHeaderView.kt
@@ -0,0 +1,63 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.data.entries
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.shared.app.AppMetadata
+
+class AppHeaderView
+@JvmOverloads
+constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+    defStyleRes: Int = 0,
+) : LinearLayout(context, attrs, defStyleAttr, defStyleRes) {
+
+    private var appMetadata: AppMetadata? = null
+    private lateinit var appIcon: ImageView
+    private lateinit var appTitle: TextView
+
+    init {
+        val view = inflate(context, R.layout.widget_app_header, this)
+        bindAppHeader(view)
+    }
+
+    fun setAppInfo(appMetadata: AppMetadata) {
+        this.appMetadata = appMetadata
+        updateAppView()
+    }
+
+    private fun bindAppHeader(view: View) {
+        appIcon = view.findViewById(R.id.app_icon)
+        appTitle = view.findViewById(R.id.app_title)
+
+        updateAppView()
+    }
+
+    private fun updateAppView() {
+        appMetadata?.let {
+            appIcon.background = it.icon
+            appTitle.text = it.appName
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/EntryItemViewBinder.kt b/apk/src/com/android/healthconnect/controller/data/entries/EntryItemViewBinder.kt
index b8b210c..e3ffd74 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/EntryItemViewBinder.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/EntryItemViewBinder.kt
@@ -23,7 +23,7 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.entries.FormattedEntry.FormattedDataEntry
 import com.android.healthconnect.controller.shared.recyclerview.DeletionViewBinder
-import com.android.healthconnect.controller.utils.logging.DataEntriesElement
+import com.android.healthconnect.controller.utils.logging.AllEntriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import dagger.hilt.android.EntryPointAccessors
@@ -56,20 +56,20 @@
         val container = view.findViewById<LinearLayout>(R.id.item_data_entry_container)
         val header = view.findViewById<TextView>(R.id.item_data_entry_header)
         val title = view.findViewById<TextView>(R.id.item_data_entry_title)
-        logger.logImpression(DataEntriesElement.DATA_ENTRY_VIEW)
-        logger.logImpression(DataEntriesElement.DATA_ENTRY_DELETE_BUTTON)
+        logger.logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
         val checkBox = view.findViewById<CheckBox>(R.id.item_checkbox_button)
 
-        title.text = data.title
-        title.contentDescription = data.titleA11y
-
-        header.text = data.header
-        header.contentDescription = data.headerA11y
-
         if (isDeletionState) {
             container.setOnClickListener {
                 onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
                 checkBox.toggle()
+                title.contentDescription =
+                    getUpdatedContentDescription(
+                        title.resources,
+                        data.titleA11y,
+                        isDeletionState,
+                        checkBox.isChecked,
+                    )
             }
         }
 
@@ -77,7 +77,26 @@
         checkBox.isChecked = isChecked
         checkBox.setOnClickListener {
             onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
+            title.contentDescription =
+                getUpdatedContentDescription(
+                    title.resources,
+                    data.titleA11y,
+                    isDeletionState,
+                    checkBox.isChecked,
+                )
         }
         checkBox.tag = if (isDeletionState) "checkbox" else ""
+
+        title.text = data.title
+        title.contentDescription =
+            getUpdatedContentDescription(
+                title.resources,
+                data.titleA11y,
+                isDeletionState,
+                isChecked,
+            )
+
+        header.text = data.header
+        header.contentDescription = data.headerA11y
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/ExerciseSessionItemViewBinder.kt b/apk/src/com/android/healthconnect/controller/data/entries/ExerciseSessionItemViewBinder.kt
index 6dd172a..0c704b8 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/ExerciseSessionItemViewBinder.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/ExerciseSessionItemViewBinder.kt
@@ -25,7 +25,7 @@
 import com.android.healthconnect.controller.shared.RoundView
 import com.android.healthconnect.controller.shared.map.MapView
 import com.android.healthconnect.controller.shared.recyclerview.DeletionViewBinder
-import com.android.healthconnect.controller.utils.logging.DataEntriesElement
+import com.android.healthconnect.controller.utils.logging.AllEntriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import dagger.hilt.android.EntryPointAccessors
@@ -65,15 +65,14 @@
         val mapView = view.findViewById<MapView>(R.id.map_view)
         val mapContainer = view.findViewById<RoundView>(R.id.map_round_view)
         val checkBox = view.findViewById<CheckBox>(R.id.item_checkbox_button)
-        logger.logImpression(DataEntriesElement.EXERCISE_SESSION_ENTRY_BUTTON)
-        title.text = data.title
-        title.contentDescription = data.titleA11y
+        logger.logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
         header.text = data.header
         header.contentDescription = data.headerA11y
         notes.isVisible = !data.notes.isNullOrBlank()
         notes.text = data.notes
         divider.isVisible = false
         mapContainer.isVisible = (data.route != null)
+        mapContainer.contentDescription = view.resources.getString(R.string.a11y_map_description)
         if (data.route != null) {
             mapView.setRoute(data.route)
         }
@@ -82,11 +81,18 @@
             container.setOnClickListener {
                 onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
                 checkBox.toggle()
+                title.contentDescription =
+                    getUpdatedContentDescription(
+                        title.resources,
+                        data.titleA11y,
+                        isDeletionState,
+                        checkBox.isChecked,
+                    )
             }
         } else {
             if (data.isClickable) {
                 container.setOnClickListener {
-                    logger.logInteraction(DataEntriesElement.EXERCISE_SESSION_ENTRY_BUTTON)
+                    logger.logInteraction(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
                     onItemClickedListener?.onItemClicked(data.uuid, index)
                 }
             } else {
@@ -98,6 +104,22 @@
         checkBox.isChecked = isChecked
         checkBox.setOnClickListener {
             onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
+            title.contentDescription =
+                getUpdatedContentDescription(
+                    title.resources,
+                    data.titleA11y,
+                    isDeletionState,
+                    checkBox.isChecked,
+                )
         }
+
+        title.text = data.title
+        title.contentDescription =
+            getUpdatedContentDescription(
+                title.resources,
+                data.titleA11y,
+                isDeletionState,
+                isChecked,
+            )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/PlannedExerciseSessionItemViewBinder.kt b/apk/src/com/android/healthconnect/controller/data/entries/PlannedExerciseSessionItemViewBinder.kt
index 76147d5..959c389 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/PlannedExerciseSessionItemViewBinder.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/PlannedExerciseSessionItemViewBinder.kt
@@ -24,7 +24,7 @@
 import androidx.core.view.isVisible
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.shared.recyclerview.DeletionViewBinder
-import com.android.healthconnect.controller.utils.logging.DataEntriesElement
+import com.android.healthconnect.controller.utils.logging.AllEntriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import dagger.hilt.android.EntryPointAccessors
@@ -57,10 +57,8 @@
         val header = view.findViewById<TextView>(R.id.item_data_entry_header)
         val title = view.findViewById<TextView>(R.id.item_data_entry_title)
         val checkBox = view.findViewById<CheckBox>(R.id.item_checkbox_button)
-        logger.logImpression(DataEntriesElement.PLANNED_EXERCISE_SESSION_ENTRY_BUTTON)
+        logger.logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
 
-        title.text = data.title
-        title.contentDescription = data.titleA11y
         header.text = data.header
         header.contentDescription = data.headerA11y
 
@@ -68,8 +66,15 @@
             if (isDeletionState) {
                 onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
                 checkBox.toggle()
+                title.contentDescription =
+                    getUpdatedContentDescription(
+                        title.resources,
+                        data.titleA11y,
+                        isDeletionState,
+                        checkBox.isChecked,
+                    )
             } else {
-                logger.logInteraction(DataEntriesElement.PLANNED_EXERCISE_SESSION_ENTRY_BUTTON)
+                logger.logInteraction(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
                 onItemClickedListener?.onItemClicked(data.uuid, index)
             }
         }
@@ -77,6 +82,22 @@
         checkBox.isChecked = isChecked
         checkBox.setOnClickListener {
             onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
+            title.contentDescription =
+                getUpdatedContentDescription(
+                    title.resources,
+                    data.titleA11y,
+                    isDeletionState,
+                    checkBox.isChecked,
+                )
         }
+
+        title.text = data.title
+        title.contentDescription =
+            getUpdatedContentDescription(
+                title.resources,
+                data.titleA11y,
+                isDeletionState,
+                isChecked,
+            )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/SelectAllViewBinder.kt b/apk/src/com/android/healthconnect/controller/data/entries/SelectAllViewBinder.kt
index 1ce071e..427d3d7 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/SelectAllViewBinder.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/SelectAllViewBinder.kt
@@ -20,6 +20,7 @@
 import android.view.ViewGroup
 import android.widget.CheckBox
 import android.widget.LinearLayout
+import android.widget.TextView
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.shared.recyclerview.DeletionViewBinder
 
@@ -39,16 +40,31 @@
     ) {
         val checkBox = view.findViewById<CheckBox>(R.id.item_checkbox_button)
         val container = view.findViewById<LinearLayout>(R.id.item_select_all_container)
+        val selectAllText = view.findViewById<TextView>(R.id.select_all_text)
 
         container.setOnClickListener {
             checkBox.toggle()
             onClickSelectAllListener.onClicked(checkBox.isChecked)
+            container.contentDescription =
+                getUpdatedContentDescription(
+                    container.resources,
+                    selectAllText.text.toString(),
+                    isDeletionState,
+                    checkBox.isChecked,
+                )
         }
 
         checkBox.isChecked = isChecked
         checkBox.setOnClickListener {
             // check all entries
             onClickSelectAllListener.onClicked(checkBox.isChecked)
+            container.contentDescription =
+                getUpdatedContentDescription(
+                    container.resources,
+                    selectAllText.text.toString(),
+                    isDeletionState,
+                    checkBox.isChecked,
+                )
         }
         checkBox.tag = if (isDeletionState) "checkbox" else ""
     }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/SeriesDataItemViewBinder.kt b/apk/src/com/android/healthconnect/controller/data/entries/SeriesDataItemViewBinder.kt
index 83b3063..7553dbf 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/SeriesDataItemViewBinder.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/SeriesDataItemViewBinder.kt
@@ -24,7 +24,7 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.entries.FormattedEntry.SeriesDataEntry
 import com.android.healthconnect.controller.shared.recyclerview.DeletionViewBinder
-import com.android.healthconnect.controller.utils.logging.DataEntriesElement
+import com.android.healthconnect.controller.utils.logging.AllEntriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import dagger.hilt.android.EntryPointAccessors
@@ -62,10 +62,7 @@
         val title = view.findViewById<TextView>(R.id.item_data_entry_title)
         val checkBox = view.findViewById<CheckBox>(R.id.item_checkbox_button)
 
-        logger.logImpression(DataEntriesElement.DATA_ENTRY_VIEW)
-        logger.logImpression(DataEntriesElement.DATA_ENTRY_DELETE_BUTTON)
-        title.text = data.title
-        title.contentDescription = data.titleA11y
+        logger.logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
         header.text = data.header
         header.contentDescription = data.headerA11y
         divider.isVisible = false
@@ -73,8 +70,15 @@
             if (isDeletionState) {
                 onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
                 checkBox.toggle()
+                title.contentDescription =
+                    getUpdatedContentDescription(
+                        title.resources,
+                        data.titleA11y,
+                        isDeletionState,
+                        checkBox.isChecked,
+                    )
             } else {
-                logger.logInteraction(DataEntriesElement.DATA_ENTRY_VIEW)
+                logger.logInteraction(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
                 onItemClickedListener?.onItemClicked(data.uuid, index)
             }
         }
@@ -82,7 +86,23 @@
         checkBox.isChecked = isChecked
         checkBox.setOnClickListener {
             onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
+            title.contentDescription =
+                getUpdatedContentDescription(
+                    title.resources,
+                    data.titleA11y,
+                    isDeletionState,
+                    checkBox.isChecked,
+                )
         }
         checkBox.tag = if (isDeletionState) "checkbox" else ""
+
+        title.text = data.title
+        title.contentDescription =
+            getUpdatedContentDescription(
+                title.resources,
+                data.titleA11y,
+                isDeletionState,
+                isChecked,
+            )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/SleepSessionItemViewBinder.kt b/apk/src/com/android/healthconnect/controller/data/entries/SleepSessionItemViewBinder.kt
index 1462a3a..2fed3f1 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/SleepSessionItemViewBinder.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/SleepSessionItemViewBinder.kt
@@ -24,7 +24,7 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.entries.FormattedEntry.SleepSessionEntry
 import com.android.healthconnect.controller.shared.recyclerview.DeletionViewBinder
-import com.android.healthconnect.controller.utils.logging.DataEntriesElement
+import com.android.healthconnect.controller.utils.logging.AllEntriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import dagger.hilt.android.EntryPointAccessors
@@ -62,11 +62,8 @@
         val title = view.findViewById<TextView>(R.id.item_data_entry_title)
         val notes = view.findViewById<TextView>(R.id.item_data_entry_notes)
         val checkBox = view.findViewById<CheckBox>(R.id.item_checkbox_button)
-        logger.logImpression(DataEntriesElement.SLEEP_SESSION_ENTRY_BUTTON)
-        logger.logImpression(DataEntriesElement.DATA_ENTRY_DELETE_BUTTON)
+        logger.logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
 
-        title.text = data.title
-        title.contentDescription = data.titleA11y
         header.text = data.header
         header.contentDescription = data.headerA11y
         notes.isVisible = !data.notes.isNullOrBlank()
@@ -76,8 +73,15 @@
             if (isDeletionState) {
                 onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
                 checkBox.toggle()
+                title.contentDescription =
+                    getUpdatedContentDescription(
+                        title.resources,
+                        data.titleA11y,
+                        isDeletionState,
+                        checkBox.isChecked,
+                    )
             } else {
-                logger.logInteraction(DataEntriesElement.SLEEP_SESSION_ENTRY_BUTTON)
+                logger.logInteraction(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
                 onItemClickedListener?.onItemClicked(data.uuid, index)
             }
         }
@@ -85,6 +89,22 @@
         checkBox.isChecked = isChecked
         checkBox.setOnClickListener {
             onSelectEntryListener?.onSelectEntry(data.uuid, data.dataType, index)
+            title.contentDescription =
+                getUpdatedContentDescription(
+                    title.resources,
+                    data.titleA11y,
+                    isDeletionState,
+                    checkBox.isChecked,
+                )
         }
+
+        title.text = data.title
+        title.contentDescription =
+            getUpdatedContentDescription(
+                title.resources,
+                data.titleA11y,
+                isDeletionState,
+                isChecked,
+            )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/api/LoadEntriesHelper.kt b/apk/src/com/android/healthconnect/controller/data/entries/api/LoadEntriesHelper.kt
index 3276f91..a3a76a5 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/api/LoadEntriesHelper.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/api/LoadEntriesHelper.kt
@@ -25,7 +25,10 @@
 import android.health.connect.datatypes.DataOrigin
 import android.health.connect.datatypes.InstantRecord
 import android.health.connect.datatypes.IntervalRecord
+import android.health.connect.datatypes.MedicalDataSource
 import android.health.connect.datatypes.MedicalResource
+import android.health.connect.datatypes.MenstruationFlowRecord
+import android.health.connect.datatypes.MenstruationPeriodRecord
 import android.health.connect.datatypes.Record
 import android.util.Log
 import androidx.core.os.asOutcomeReceiver
@@ -33,9 +36,11 @@
 import com.android.healthconnect.controller.data.entries.FormattedEntry
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.data.entries.datenavigation.toPeriod
+import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.formatters.shared.HealthDataEntryFormatter
 import com.android.healthconnect.controller.permissions.data.toMedicalResourceType
 import com.android.healthconnect.controller.shared.HealthPermissionToDatatypeMapper
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
 import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import com.android.healthconnect.controller.utils.SystemTimeSource
 import com.android.healthconnect.controller.utils.TimeSource
@@ -60,7 +65,9 @@
 constructor(
     @ApplicationContext private val context: Context,
     private val healthDataEntryFormatter: HealthDataEntryFormatter,
+    private val menstruationPeriodFormatter: MenstruationPeriodFormatter,
     private val healthConnectManager: HealthConnectManager,
+    private val dataSourceReader: MedicalDataSourceReader,
     private val timeSource: TimeSource = SystemTimeSource,
 ) {
     private val dateFormatter = LocalDateTimeFormatter(context)
@@ -132,12 +139,20 @@
 
     /** Returns a list of records from a MedicalPermissionType. */
     suspend fun readMedicalRecords(input: LoadMedicalEntriesInput): List<MedicalResource> {
-        val medicalResourceType = toMedicalResourceType(input.medicalPermissionType)
-
-        if (medicalResourceType == MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN) {
-            return listOf()
+        val medicalResourceType: Int
+        try {
+            medicalResourceType = toMedicalResourceType(input.medicalPermissionType)
+        } catch (ex: IllegalArgumentException) {
+            Log.i(TAG, "Failed to convert permission type to medical resource type.")
+            return emptyList()
         }
-        val filter = buildMedicalResourceRequest(medicalResourceType, input.packageName)
+        val filter =
+            input.packageName?.let {
+                buildMedicalResourceRequest(
+                    medicalResourceType,
+                    dataSourceReader.fromPackageName(it),
+                )
+            } ?: buildMedicalResourceRequest(medicalResourceType)
         val medicalResources =
             suspendCancellableCoroutine<ReadMedicalResourcesResponse> { continuation ->
                     healthConnectManager.readMedicalResources(
@@ -153,6 +168,61 @@
 
     /**
      * If more than one day's data is displayed, inserts a section header for each day: 'Today',
+     * 'Yesterday', then date format, and group Menstruation Period and Flow entries together under
+     * the same header.
+     */
+    suspend fun maybeAddDateSectionHeadersForMenstruation(
+        startTime: Instant,
+        entries: List<Record>,
+        period: DateNavigationPeriod,
+        showDataOrigin: Boolean,
+    ): List<FormattedEntry> {
+        if (entries.isEmpty()) {
+            return listOf()
+        }
+        if (period == DateNavigationPeriod.PERIOD_DAY) {
+            return entries
+                .map { record ->
+                    if (record is MenstruationPeriodRecord) {
+                        menstruationPeriodFormatter.format(
+                            startTime,
+                            record,
+                            period,
+                            showDataOrigin,
+                        )
+                    } else {
+                        getFormatterRecord(record, showDataOrigin)
+                    }
+                }
+                .filterNotNull()
+        }
+
+        val entriesWithSectionHeaders: MutableList<FormattedEntry> = mutableListOf()
+        var lastHeaderDate = Instant.EPOCH
+
+        entries.forEach {
+            val possibleNextHeaderDate = getStartTime(it)
+            if (!areOnSameDay(lastHeaderDate, possibleNextHeaderDate)) {
+                lastHeaderDate = possibleNextHeaderDate
+                val sectionTitle = getSectionTitle(lastHeaderDate)
+                entriesWithSectionHeaders.add(FormattedEntry.EntryDateSectionHeader(sectionTitle))
+            }
+            if (it is MenstruationPeriodRecord) {
+                menstruationPeriodFormatter.format(startTime, it, period, showDataOrigin).let {
+                    formattedRecord ->
+                    entriesWithSectionHeaders.add(formattedRecord)
+                }
+            } else if (it is MenstruationFlowRecord) {
+                getFormatterRecord(it, showDataOrigin)?.let { formattedRecord ->
+                    entriesWithSectionHeaders.add(formattedRecord)
+                }
+            }
+        }
+        return entriesWithSectionHeaders.toList()
+    }
+
+    /**
+     * If more than one day's data is displayed, inserts a section header for each day: 'Today',
      * 'Yesterday', then date format.
      */
     suspend fun maybeAddDateSectionHeaders(
@@ -284,9 +354,15 @@
     @VisibleForTesting
     fun buildMedicalResourceRequest(
         medicalResourceType: Int,
-        packageName: String?,
+        dataSources: List<MedicalDataSource>,
     ): ReadMedicalResourcesInitialRequest {
-        // TODO(b/362672526): Filter by dataSourceIds once the API is ready.
+        val filter = ReadMedicalResourcesInitialRequest.Builder(medicalResourceType)
+        dataSources.map { it.id }.forEach { filter.addDataSourceId(it) }
+        return filter.build()
+    }
+
+    @VisibleForTesting
+    fun buildMedicalResourceRequest(medicalResourceType: Int): ReadMedicalResourcesInitialRequest {
         val filter = ReadMedicalResourcesInitialRequest.Builder(medicalResourceType)
         return filter.build()
     }
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/api/LoadMenstruationDataUseCase.kt b/apk/src/com/android/healthconnect/controller/data/entries/api/LoadMenstruationDataUseCase.kt
index 47b7c0a..b0447b7 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/api/LoadMenstruationDataUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/api/LoadMenstruationDataUseCase.kt
@@ -20,9 +20,9 @@
 import android.health.connect.TimeInstantRangeFilter
 import android.health.connect.datatypes.MenstruationFlowRecord
 import android.health.connect.datatypes.MenstruationPeriodRecord
+import android.health.connect.datatypes.Record
 import com.android.healthconnect.controller.data.entries.FormattedEntry
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
-import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.service.IoDispatcher
 import com.android.healthconnect.controller.shared.usecase.BaseUseCase
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
@@ -36,7 +36,6 @@
 @Inject
 constructor(
     private val loadEntriesHelper: LoadEntriesHelper,
-    private val menstruationPeriodFormatter: MenstruationPeriodFormatter,
     @IoDispatcher private val dispatcher: CoroutineDispatcher,
 ) :
     BaseUseCase<LoadMenstruationDataInput, List<FormattedEntry>>(dispatcher),
@@ -51,62 +50,87 @@
         val selectedDate = input.displayedStartTime
         val period = input.period
         val showDataOrigin = input.showDataOrigin
-        val data = buildList {
-            addAll(getMenstruationPeriodRecords(packageName, selectedDate, period, showDataOrigin))
-            addAll(getMenstruationFlowRecords(packageName, selectedDate, period, showDataOrigin))
-        }
-        return data
+        val data =
+            buildList {
+                    addAll(getMenstruationPeriodRecords(packageName, selectedDate, period))
+                    addAll(getMenstruationFlowRecords(packageName, selectedDate, period))
+                }
+                .sortedBy { record ->
+                    when (record) {
+                        is MenstruationPeriodRecord -> record.startTime
+                        is MenstruationFlowRecord -> record.time
+                        else -> Instant.EPOCH
+                    }
+                }
+
+        return loadEntriesHelper.maybeAddDateSectionHeadersForMenstruation(
+            selectedDate,
+            data,
+            period,
+            showDataOrigin,
+        )
     }
 
     private suspend fun getMenstruationPeriodRecords(
         packageName: String?,
         selectedDate: Instant,
         period: DateNavigationPeriod,
-        showDataOrigin: Boolean
-    ): List<FormattedEntry> {
+    ): List<Record> {
         val exactTimeRange =
             loadEntriesHelper.getTimeFilter(selectedDate, period, endTimeExclusive = true)
         val exactEnd = exactTimeRange.endTime!!
         val exactStart = exactTimeRange.startTime!!
 
-        // Special-casing MenstruationPeriod as it spans multiple days and we show it on all these
-        // days in the UI (not just the first day).
-        // Hardcode max period length to 30 days (completely arbitrary number).
-        val extendedSearchTimeRange =
-            TimeInstantRangeFilter.Builder()
-                .setStartTime(exactEnd.minus(SEARCH_RANGE))
-                .setEndTime(exactEnd)
-                .build()
+        val records: List<Record>
+        if (period == DateNavigationPeriod.PERIOD_DAY) {
+            // Special-casing MenstruationPeriod as it spans multiple days and we show it on all
+            // these
+            // days in the UI (not just the first day).
+            // Hardcode max period length to 30 days (completely arbitrary number).
+            val extendedSearchTimeRange =
+                TimeInstantRangeFilter.Builder()
+                    .setStartTime(exactEnd.minus(SEARCH_RANGE))
+                    .setEndTime(exactEnd)
+                    .build()
 
-        val records =
-            loadEntriesHelper
-                .readDataType(
-                    MenstruationPeriodRecord::class.java, extendedSearchTimeRange, packageName)
-                .filter { menstruationPeriodRecord ->
-                    menstruationPeriodRecord is MenstruationPeriodRecord &&
-                        menstruationPeriodRecord.startTime.isBefore(exactEnd) &&
-                        menstruationPeriodRecord.endTime.isAfter(exactStart)
-                }
-
-        return records.map { record ->
-            menstruationPeriodFormatter.format(
-                exactStart, record as MenstruationPeriodRecord, showDataOrigin)
+            records =
+                loadEntriesHelper
+                    .readDataType(
+                        MenstruationPeriodRecord::class.java,
+                        extendedSearchTimeRange,
+                        packageName,
+                    )
+                    .filter { menstruationPeriodRecord ->
+                        menstruationPeriodRecord is MenstruationPeriodRecord &&
+                            menstruationPeriodRecord.startTime.isBefore(exactEnd) &&
+                            menstruationPeriodRecord.endTime.isAfter(exactStart)
+                    }
+        } else {
+            records =
+                loadEntriesHelper.readDataType(
+                    MenstruationPeriodRecord::class.java,
+                    exactTimeRange,
+                    packageName,
+                )
         }
+
+        return records
     }
 
     private suspend fun getMenstruationFlowRecords(
         packageName: String?,
         selectedDate: Instant,
         period: DateNavigationPeriod,
-        showDataOrigin: Boolean
-    ): List<FormattedEntry> {
+    ): List<Record> {
         val timeRange =
             loadEntriesHelper.getTimeFilter(selectedDate, period, endTimeExclusive = true)
         val records =
             loadEntriesHelper.readDataType(
-                MenstruationFlowRecord::class.java, timeRange, packageName)
-
-        return loadEntriesHelper.maybeAddDateSectionHeaders(records, period, showDataOrigin)
+                MenstruationFlowRecord::class.java,
+                timeRange,
+                packageName,
+            )
+        return records
     }
 }
 
@@ -114,7 +138,7 @@
     val packageName: String?,
     val displayedStartTime: Instant,
     val period: DateNavigationPeriod,
-    val showDataOrigin: Boolean
+    val showDataOrigin: Boolean,
 )
 
 interface ILoadMenstruationDataUseCase {
diff --git a/apk/src/com/android/healthconnect/controller/data/entries/datenavigation/DateNavigationView.kt b/apk/src/com/android/healthconnect/controller/data/entries/datenavigation/DateNavigationView.kt
index 8ade932..b844222 100644
--- a/apk/src/com/android/healthconnect/controller/data/entries/datenavigation/DateNavigationView.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entries/datenavigation/DateNavigationView.kt
@@ -31,15 +31,16 @@
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod.PERIOD_WEEK
 import com.android.healthconnect.controller.utils.SystemTimeSource
 import com.android.healthconnect.controller.utils.TimeSource
+import com.android.healthconnect.controller.utils.getPeriodStartDate
+import com.android.healthconnect.controller.utils.logging.AllEntriesElement
 import com.android.healthconnect.controller.utils.logging.DataEntriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
+import com.android.healthconnect.controller.utils.toInstant
 import com.android.healthconnect.controller.utils.toLocalDate
 import dagger.hilt.android.EntryPointAccessors
-import java.time.DayOfWeek
 import java.time.Instant
 import java.time.LocalDate
-import java.time.Period
 import java.time.ZoneId
 
 /** Allows the user to navigate in time to see their past data. */
@@ -50,7 +51,7 @@
     attrs: AttributeSet? = null,
     defStyleAttr: Int = 0,
     defStyleRes: Int = 0,
-    private val timeSource: TimeSource = SystemTimeSource
+    private val timeSource: TimeSource = SystemTimeSource,
 ) : ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) {
 
     private val logger: HealthConnectLogger
@@ -62,12 +63,15 @@
     private var selectedDate = Instant.ofEpochMilli(timeSource.currentTimeMillis())
     private var period: DateNavigationPeriod = PERIOD_DAY
     private var onDateChangedListener: OnDateChangedListener? = null
-    private var mNextDayEnabled = true
+    private var nextDayEnabled = true
+    private var maxDate: Instant? = timeSource.currentTimeMillis().toInstant()
 
     init {
         val hiltEntryPoint =
             EntryPointAccessors.fromApplication(
-                context.applicationContext, HealthConnectLoggerEntryPoint::class.java)
+                context.applicationContext,
+                HealthConnectLoggerEntryPoint::class.java,
+            )
         logger = hiltEntryPoint.logger()
 
         val view = inflate(context, R.layout.widget_date_navigation_with_spinner, this)
@@ -91,6 +95,11 @@
         updateDisplayedDates()
     }
 
+    fun setMaxDate(instant: Instant?) {
+        maxDate = instant
+        updateDisplayedDates()
+    }
+
     fun getDate(): Instant {
         return selectedDate
     }
@@ -99,7 +108,7 @@
         return period
     }
 
-    fun disableDateNavigationView(isEnabled: Boolean, text: String){
+    fun disableDateNavigationView(isEnabled: Boolean, text: String) {
         setSpinnerText(text)
         disableButtons(isEnabled)
         toggleSpinnerVisibility(isEnabled)
@@ -109,17 +118,17 @@
         return (datePickerSpinner.adapter as DatePickerSpinnerAdapter).getText()
     }
 
-    private fun setSpinnerText(text:String){
+    private fun setSpinnerText(text: String) {
         // text from the adapter can be null on rotation
-        if(getDateNavigationText() == null){
+        if (getDateNavigationText() == null) {
             disabledSpinner.text = text
         } else {
             disabledSpinner.text = (datePickerSpinner.adapter as DatePickerSpinnerAdapter).getText()
         }
     }
 
-    private fun toggleSpinnerVisibility(isEnabled: Boolean){
-        if(!isEnabled){
+    private fun toggleSpinnerVisibility(isEnabled: Boolean) {
+        if (!isEnabled) {
             datePickerSpinner.visibility = GONE
             disabledSpinner.visibility = VISIBLE
         } else {
@@ -128,9 +137,9 @@
         }
     }
 
-    private fun disableButtons(isEnabled: Boolean){
-        if(isEnabled){
-            nextDayButton.isEnabled = mNextDayEnabled
+    private fun disableButtons(isEnabled: Boolean) {
+        if (isEnabled) {
+            nextDayButton.isEnabled = nextDayEnabled
         } else {
             nextDayButton.isEnabled = false
         }
@@ -163,7 +172,12 @@
         datePickerSpinner = view.findViewById(R.id.date_picker_spinner) as Spinner
         disabledSpinner = view.findViewById(R.id.disabled_spinner)
         val adapter =
-            DatePickerSpinnerAdapter(view.context, getDisplayedStartDate(), period, timeSource)
+            DatePickerSpinnerAdapter(
+                view.context,
+                getPeriodStartDate(selectedDate, period),
+                period,
+                timeSource,
+            )
         adapter.setDropDownViewResource(R.layout.date_navigation_spinner_item)
         datePickerSpinner.adapter = adapter
 
@@ -175,13 +189,22 @@
                     parent: AdapterView<*>?,
                     unused: View?,
                     position: Int,
-                    id: Long
+                    id: Long,
                 ) {
                     val period: DateNavigationPeriod =
                         when (position) {
-                            0 -> PERIOD_DAY
-                            1 -> PERIOD_WEEK
-                            2 -> PERIOD_MONTH
+                            0 -> {
+                                logger.logInteraction(AllEntriesElement.DATE_VIEW_SPINNER_DAY)
+                                PERIOD_DAY
+                            }
+                            1 -> {
+                                logger.logInteraction(AllEntriesElement.DATE_VIEW_SPINNER_WEEK)
+                                PERIOD_WEEK
+                            }
+                            2 -> {
+                                logger.logInteraction(AllEntriesElement.DATE_VIEW_SPINNER_MONTH)
+                                PERIOD_MONTH
+                            }
                             else -> throw IllegalStateException("Not supported time period.")
                         }
                     setPeriod(period)
@@ -193,23 +216,31 @@
             object : AccessibilityDelegate() {
                 override fun onInitializeAccessibilityNodeInfo(
                     host: View,
-                    info: AccessibilityNodeInfo
+                    info: AccessibilityNodeInfo,
                 ) {
                     super.onInitializeAccessibilityNodeInfo(host, info)
                     info.addAction(
                         AccessibilityNodeInfo.AccessibilityAction(
                             AccessibilityNodeInfoCompat.ACTION_CLICK,
-                            context.getString(R.string.selected_date_view_action_description)))
+                            context.getString(R.string.selected_date_view_action_description),
+                        )
+                    )
                 }
             }
+        when (period) {
+            PERIOD_DAY -> logger.logImpression(AllEntriesElement.DATE_VIEW_SPINNER_DAY)
+            PERIOD_WEEK -> logger.logImpression(AllEntriesElement.DATE_VIEW_SPINNER_WEEK)
+            PERIOD_MONTH -> logger.logImpression(AllEntriesElement.DATE_VIEW_SPINNER_MONTH)
+        }
     }
 
     private fun updateDisplayedDates() {
-        onDateChangedListener?.onDateChanged(getDisplayedStartDate(), period)
+        onDateChangedListener?.onDateChanged(getPeriodStartDate(selectedDate, period), period)
         val today =
             LocalDate.ofInstant(
                     Instant.ofEpochMilli(timeSource.currentTimeMillis()),
-                    timeSource.deviceZoneOffset())
+                    timeSource.deviceZoneOffset(),
+                )
                 .atStartOfDay(timeSource.deviceZoneOffset())
                 .toInstant()
 
@@ -217,55 +248,44 @@
         // from Day to Week (underlying selected day is still Sunday), navigates to the next week
         // (underlying selected day is next Sunday), sets the period back to Day => displayed day
         // would be next Sunday. Instead, display today.
-        if (today.isBefore(selectedDate)) {
+        if (today.isBefore(selectedDate) && maxDate != null) {
             selectedDate = today
         }
 
         val displayedEndDate =
-            getDisplayedStartDate()
+            getPeriodStartDate(selectedDate, period)
                 .toLocalDate()
                 .atStartOfDay(ZoneId.systemDefault())
                 .plus(toPeriod(period))
                 .toInstant()
-        //TODO: (b/363233408) Ensure new IA works with training plans
-        nextDayButton.isEnabled = !displayedEndDate.isAfter(today)
-        mNextDayEnabled = nextDayButton.isEnabled
+        nextDayButton.isEnabled = maxDate == null || !displayedEndDate.isAfter(today)
+        nextDayEnabled = nextDayButton.isEnabled
         (datePickerSpinner.adapter as DatePickerSpinnerAdapter).setStartTimeAndPeriod(
-            getDisplayedStartDate(), period)
-    }
+            getPeriodStartDate(selectedDate, period),
+            period,
+        )
+        // Needed to trigger the text update
+        datePickerSpinner.adapter.getView(
+            datePickerSpinner.selectedItemPosition,
+            null,
+            datePickerSpinner,
+        )
 
-    private fun getDisplayedStartDate(): Instant =
-        when (period) {
-            PERIOD_DAY -> {
-                selectedDate
-                    .atZone(ZoneId.systemDefault())
-                    .toLocalDate()
-                    .atStartOfDay(ZoneId.systemDefault())
-                    .toInstant()
+        datePickerSpinner.contentDescription =
+            (datePickerSpinner.adapter as DatePickerSpinnerAdapter).getText()
+        nextDayButton.contentDescription =
+            when (period) {
+                PERIOD_DAY -> resources.getString(R.string.a11y_next_day)
+                PERIOD_WEEK -> resources.getString(R.string.a11y_next_week)
+                PERIOD_MONTH -> resources.getString(R.string.a11y_next_month)
             }
-            PERIOD_WEEK -> {
-                val dayOfWeek: DayOfWeek =
-                    selectedDate.atZone(ZoneId.systemDefault()).toLocalDate().dayOfWeek
-                val dayOfWeekOffset: Int = dayOfWeek.value - 1
-                selectedDate
-                    .atZone(ZoneId.systemDefault())
-                    .minus(Period.ofDays(dayOfWeekOffset))
-                    .toLocalDate()
-                    .atStartOfDay(ZoneId.systemDefault())
-                    .toInstant()
+        previousDayButton.contentDescription =
+            when (period) {
+                PERIOD_DAY -> resources.getString(R.string.a11y_previous_day)
+                PERIOD_WEEK -> resources.getString(R.string.a11y_previous_week)
+                PERIOD_MONTH -> resources.getString(R.string.a11y_previous_month)
             }
-            PERIOD_MONTH -> {
-                val dayOfMonth =
-                    selectedDate.atZone(ZoneId.systemDefault()).toLocalDate().dayOfMonth
-                val dayOfMonthOffset: Int = dayOfMonth - 1
-                selectedDate
-                    .atZone(ZoneId.systemDefault())
-                    .minus(Period.ofDays(dayOfMonthOffset))
-                    .toLocalDate()
-                    .atStartOfDay(ZoneId.systemDefault())
-                    .toInstant()
-            }
-        }
+    }
 
     interface OnDateChangedListener {
         fun onDateChanged(displayedStartDate: Instant, period: DateNavigationPeriod)
diff --git a/apk/src/com/android/healthconnect/controller/data/entriesandaccess/EntiresAndAccessFragment.kt b/apk/src/com/android/healthconnect/controller/data/entriesandaccess/EntiresAndAccessFragment.kt
index 081f2a2..46c6603 100644
--- a/apk/src/com/android/healthconnect/controller/data/entriesandaccess/EntiresAndAccessFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/data/entriesandaccess/EntiresAndAccessFragment.kt
@@ -23,6 +23,8 @@
 import android.view.ViewGroup
 import androidx.core.os.bundleOf
 import androidx.fragment.app.Fragment
+import androidx.fragment.app.activityViewModels
+import androidx.fragment.app.commitNow
 import androidx.viewpager2.adapter.FragmentStateAdapter
 import androidx.viewpager2.widget.ViewPager2
 import com.android.healthconnect.controller.R
@@ -30,37 +32,46 @@
 import com.android.healthconnect.controller.data.appdata.AppDataFragment.Companion.PERMISSION_TYPE_NAME_KEY
 import com.android.healthconnect.controller.data.entries.AllEntriesFragment
 import com.android.healthconnect.controller.data.entries.EntriesViewModel
+import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesDeletionScreenState.DELETE
+import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesDeletionScreenState.VIEW
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
 import com.android.healthconnect.controller.permissions.data.fromPermissionTypeName
+import com.android.healthconnect.controller.selectabledeletion.DeletionConstants.START_DELETION_KEY
+import com.android.healthconnect.controller.selectabledeletion.DeletionFragment
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.google.android.material.tabs.TabLayout
 import com.google.android.material.tabs.TabLayoutMediator
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
-import androidx.fragment.app.activityViewModels
-import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesDeletionScreenState.VIEW
-import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesDeletionScreenState.DELETE
 
 /** Fragment with [AllEntriesFragment] tab and [AccessFragment] tab. */
 @AndroidEntryPoint(Fragment::class)
 class EntriesAndAccessFragment : Hilt_EntriesAndAccessFragment() {
 
+    companion object {
+        private const val DELETION_TAG = "DeletionTag"
+        private const val START_DELETION_ENTRIES_AND_ACCESS_KEY = "START_DELETION_ENTRIES_AND_ACCESS_KEY"
+    }
+
     @Inject lateinit var logger: HealthConnectLogger
 
     private lateinit var permissionType: HealthPermissionType
     private lateinit var viewPager: ViewPager2
     private lateinit var tabLayout: TabLayout
     private lateinit var tabLayoutDisabled: TabLayout
-    private val entriesViewModel : EntriesViewModel by activityViewModels()
+    private val entriesViewModel: EntriesViewModel by activityViewModels()
 
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
-        savedInstanceState: Bundle?
+        savedInstanceState: Bundle?,
     ): View? {
         // TODO(b/291249677): Add logging.
         // logger.setPageId(pageName)
 
+        childFragmentManager.setFragmentResultListener(START_DELETION_ENTRIES_AND_ACCESS_KEY, this) { _, _ ->
+            childFragmentManager.setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
         if (requireArguments().containsKey(PERMISSION_TYPE_NAME_KEY)) {
             val permissionTypeName =
                 arguments?.getString(PERMISSION_TYPE_NAME_KEY)
@@ -70,6 +81,13 @@
         return inflater.inflate(R.layout.fragment_entries_access, container, false)
     }
 
+    override fun onResume() {
+        super.onResume()
+        if (childFragmentManager.findFragmentByTag(DELETION_TAG) == null) {
+            childFragmentManager.commitNow { add(DeletionFragment(), DELETION_TAG) }
+        }
+    }
+
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
@@ -79,7 +97,7 @@
         tabLayoutDisabled = view.findViewById(R.id.tab_layout_disabled)
 
         entriesViewModel.screenState.observe(viewLifecycleOwner) { screenState ->
-            when(screenState) {
+            when (screenState) {
                 DELETE -> {
                     tabLayoutMediator(tabLayoutDisabled, isDeletionState = true)
                     tabLayout.visibility = GONE
@@ -93,30 +111,27 @@
                     viewPager.isUserInputEnabled = true
                 }
                 else -> {
-                    //do nothing
+                    // do nothing
                 }
             }
         }
     }
 
-    private fun tabLayoutMediator(tabLayout: TabLayout, isDeletionState: Boolean){
-         TabLayoutMediator(tabLayout, viewPager){tab, position ->
-            if (position == 0) {
-                tab.text = getString(R.string.tab_entries)
-            } else {
-                tab.text = getString(R.string.tab_access)
+    private fun tabLayoutMediator(tabLayout: TabLayout, isDeletionState: Boolean) {
+        TabLayoutMediator(tabLayout, viewPager) { tab, position ->
+                if (position == 0) {
+                    tab.text = getString(R.string.tab_entries)
+                } else {
+                    tab.text = getString(R.string.tab_access)
+                }
+                tab.view.isEnabled = !isDeletionState
             }
-            tab.view.isEnabled = !isDeletionState
-         }.attach()
-    }
-
-    override fun onResume() {
-        super.onResume()
+            .attach()
     }
 
     class ViewPagerAdapter(
         fragment: EntriesAndAccessFragment,
-        private val permissionType: HealthPermissionType
+        private val permissionType: HealthPermissionType,
     ) : FragmentStateAdapter(fragment) {
 
         override fun getItemCount(): Int = 2
diff --git a/apk/src/com/android/healthconnect/controller/data/rawfhir/RawFhirFragment.kt b/apk/src/com/android/healthconnect/controller/data/rawfhir/RawFhirFragment.kt
index 2811f3b..474b7f3 100644
--- a/apk/src/com/android/healthconnect/controller/data/rawfhir/RawFhirFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/data/rawfhir/RawFhirFragment.kt
@@ -33,6 +33,8 @@
 import com.android.healthconnect.controller.shared.recyclerview.SimpleViewBinder
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthconnect.controller.utils.logging.RawFhirPageElement
 import dagger.hilt.android.AndroidEntryPoint
 import dagger.hilt.android.EntryPointAccessors
 import javax.inject.Inject
@@ -53,16 +55,19 @@
     private lateinit var detailsAdapter: RecyclerViewAdapter
     private val rawFhirViewBinder by lazy { RawFhirViewBinder() }
 
-    // TODO(b/342159144): create page name atom.
-
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        // TODO(b/342159144): logger.setPageId(pageName)
+        setPageId()
     }
 
     override fun onResume() {
         super.onResume()
-        // TODO(b/342159144): logger.setPageId(pageName)
+        setPageId()
+        logger.logPageImpression()
+    }
+
+    private fun setPageId() {
+        logger.setPageId(PageName.RAW_FHIR_PAGE)
     }
 
     override fun onCreateView(
@@ -70,7 +75,6 @@
         container: ViewGroup?,
         savedInstanceState: Bundle?,
     ): View? {
-        // TODO(b/342159144): logger.setPageId(pageName)
         val view = inflater.inflate(R.layout.fragment_data_entry_details, container, false)
         medicalResourceId =
             requireArguments().getParcelable(MEDICAL_RESOURCE_ID_KEY)
@@ -135,7 +139,7 @@
             val rawFhir = view.findViewById<TextView>(R.id.item_raw_fhir)
             rawFhir.text = data.fhir
             rawFhir.contentDescription = data.fhirContentDescription
-            // TODO(b/342159144): Log impression.
+            logger.logImpression(RawFhirPageElement.RAW_FHIR_RESOURCE)
         }
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/DataEntriesFragment.kt b/apk/src/com/android/healthconnect/controller/dataentries/DataEntriesFragment.kt
index 9939f5f..5e0e186 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/DataEntriesFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/DataEntriesFragment.kt
@@ -15,6 +15,7 @@
  */
 package com.android.healthconnect.controller.dataentries
 
+import android.health.connect.datatypes.MenstruationPeriodRecord
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -31,6 +32,7 @@
 import androidx.recyclerview.widget.RecyclerView
 import androidx.recyclerview.widget.RecyclerView.VERTICAL
 import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.data.entries.EntriesViewModel
 import com.android.healthconnect.controller.data.entries.FormattedEntry.ExerciseSessionEntry
 import com.android.healthconnect.controller.data.entries.FormattedEntry.FormattedAggregation
 import com.android.healthconnect.controller.data.entries.FormattedEntry.FormattedDataEntry
@@ -66,7 +68,6 @@
 import dagger.hilt.android.AndroidEntryPoint
 import java.time.Instant
 import javax.inject.Inject
-import com.android.healthconnect.controller.data.entries.EntriesViewModel
 
 /** Fragment to show health data entries by date. */
 @Deprecated("This won't be used once the NEW_INFORMATION_ARCHITECTURE feature is enabled.")
@@ -96,7 +97,11 @@
                     .navigate(
                         R.id.action_dataEntriesFragment_to_dataEntryDetailsFragment,
                         DataEntryDetailsFragment.createBundle(
-                            permissionType, id, showDataOrigin = true))
+                            permissionType,
+                            id,
+                            showDataOrigin = true,
+                        ),
+                    )
             }
         }
     }
@@ -107,7 +112,7 @@
                 dataType: DataType,
                 index: Int,
                 startTime: Instant?,
-                endTime: Instant?
+                endTime: Instant?,
             ) {
                 deleteEntry(id, dataType, index, startTime, endTime)
             }
@@ -120,28 +125,32 @@
     private val sleepSessionViewBinder by lazy {
         SleepSessionItemViewBinder(
             onDeleteEntryListenerClicked = onDeleteEntryListener,
-            onItemClickedListener = onClickEntryListener)
+            onItemClickedListener = onClickEntryListener,
+        )
     }
     private val exerciseSessionItemViewBinder by lazy {
         ExerciseSessionItemViewBinder(
             onDeleteEntryClicked = onDeleteEntryListener,
-            onItemClickedListener = onClickEntryListener)
+            onItemClickedListener = onClickEntryListener,
+        )
     }
     private val seriesDataItemViewBinder by lazy {
         SeriesDataItemViewBinder(
             onDeleteEntryClicked = onDeleteEntryListener,
-            onItemClickedListener = onClickEntryListener)
+            onItemClickedListener = onClickEntryListener,
+        )
     }
     private val plannedExerciseSessionItemViewBinder by lazy {
         PlannedExerciseSessionItemViewBinder(
             onDeleteEntryClicked = onDeleteEntryListener,
-            onItemClickedListener = onClickEntryListener)
+            onItemClickedListener = onClickEntryListener,
+        )
     }
 
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
-        savedInstanceState: Bundle?
+        savedInstanceState: Bundle?,
     ): View? {
         logger.setPageId(pageName)
 
@@ -177,7 +186,9 @@
                 .setViewBinder(ExerciseSessionEntry::class.java, exerciseSessionItemViewBinder)
                 .setViewBinder(SeriesDataEntry::class.java, seriesDataItemViewBinder)
                 .setViewBinder(
-                    PlannedExerciseSessionEntry::class.java, plannedExerciseSessionItemViewBinder)
+                    PlannedExerciseSessionEntry::class.java,
+                    plannedExerciseSessionItemViewBinder,
+                )
                 .setViewBinder(FormattedAggregation::class.java, aggregationViewBinder)
                 .setViewModel(entriesViewModel) // Added to adjust to the new RecyclerViewAdapter
                 .build()
@@ -202,7 +213,8 @@
                 override fun onDateChanged(selectedDate: Instant) {
                     viewModel.loadData(permissionType, selectedDate)
                 }
-            })
+            }
+        )
         observeDeleteState()
         observeEntriesUpdates()
     }
@@ -289,18 +301,24 @@
         dataType: DataType,
         index: Int,
         startTime: Instant?,
-        endTime: Instant?
+        endTime: Instant?,
     ) {
         val deletionType = DeletionType.DeleteDataEntry(uuid, dataType, index)
 
-        if (deletionType.dataType == DataType.MENSTRUATION_PERIOD) {
+        if (deletionType.dataType == MenstruationPeriodRecord::class) {
             childFragmentManager.setFragmentResult(
                 START_DELETION_EVENT,
                 bundleOf(
-                    DELETION_TYPE to deletionType, START_TIME to startTime, END_TIME to endTime))
+                    DELETION_TYPE to deletionType,
+                    START_TIME to startTime,
+                    END_TIME to endTime,
+                ),
+            )
         } else {
             childFragmentManager.setFragmentResult(
-                START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionType))
+                START_DELETION_EVENT,
+                bundleOf(DELETION_TYPE to deletionType),
+            )
         }
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/LoadDataAggregationsUseCase.kt b/apk/src/com/android/healthconnect/controller/dataentries/LoadDataAggregationsUseCase.kt
index 2ecbae3..aa16945 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/LoadDataAggregationsUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/LoadDataAggregationsUseCase.kt
@@ -167,7 +167,7 @@
     }
 
     private suspend fun getContributingApps(apps: Set<DataOrigin>): String {
-        val separator: String = context.getString(R.string.data_type_separator)
+        val separator: String = context.getString(R.string.separator)
         return apps
             .map { origin -> appInfoReader.getAppMetadata(origin.packageName) }
             .joinToString(separator) { it.appName }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/LoadMenstruationDataUseCase.kt b/apk/src/com/android/healthconnect/controller/dataentries/LoadMenstruationDataUseCase.kt
index e090d45..aaf29eb 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/LoadMenstruationDataUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/LoadMenstruationDataUseCase.kt
@@ -28,6 +28,7 @@
 import android.util.Log
 import androidx.core.os.asOutcomeReceiver
 import com.android.healthconnect.controller.data.entries.FormattedEntry
+import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.formatters.shared.HealthDataEntryFormatter
 import com.android.healthconnect.controller.service.IoDispatcher
@@ -48,7 +49,7 @@
     private val healthConnectManager: HealthConnectManager,
     private val healthDataEntryFormatter: HealthDataEntryFormatter,
     private val menstruationPeriodFormatter: MenstruationPeriodFormatter,
-    @IoDispatcher private val dispatcher: CoroutineDispatcher
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
 ) : BaseUseCase<Instant, List<FormattedEntry>>(dispatcher) {
 
     companion object {
@@ -87,7 +88,10 @@
             suspendCancellableCoroutine<ReadRecordsResponse<MenstruationPeriodRecord>> {
                     continuation ->
                     healthConnectManager.readRecords(
-                        filter, Runnable::run, continuation.asOutcomeReceiver())
+                        filter,
+                        Runnable::run,
+                        continuation.asOutcomeReceiver(),
+                    )
                 }
                 .records
                 .filter { menstruationPeriodRecord ->
@@ -96,7 +100,13 @@
                             menstruationPeriodRecord.endTime.equals(startDate))
                 }
 
-        return records.map { record -> menstruationPeriodFormatter.format(startDate, record) }
+        return records.map { record ->
+            menstruationPeriodFormatter.format(
+                startDate,
+                record,
+                period = DateNavigationPeriod.PERIOD_DAY,
+            )
+        }
     }
 
     private suspend fun getMenstruationFlowRecords(selectedDate: Instant): List<FormattedEntry> {
@@ -117,7 +127,10 @@
             suspendCancellableCoroutine<ReadRecordsResponse<MenstruationFlowRecord>> { continuation
                     ->
                     healthConnectManager.readRecords(
-                        filter, Runnable::run, continuation.asOutcomeReceiver())
+                        filter,
+                        Runnable::run,
+                        continuation.asOutcomeReceiver(),
+                    )
                 }
                 .records
 
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/ActivityIntensityFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/ActivityIntensityFormatter.kt
new file mode 100644
index 0000000..773dbe8
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/ActivityIntensityFormatter.kt
@@ -0,0 +1,55 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.dataentries.formatters
+
+import android.content.Context
+import android.health.connect.datatypes.ActivityIntensityRecord
+import android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE
+import android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.dataentries.formatters.shared.EntryFormatter
+import com.android.healthconnect.controller.dataentries.units.UnitPreferences
+import dagger.hilt.android.qualifiers.ApplicationContext
+import javax.inject.Inject
+
+/** Formatter for printing [ActivityIntensityRecord] data. */
+class ActivityIntensityFormatter
+@Inject
+constructor(@ApplicationContext private val context: Context) :
+    EntryFormatter<ActivityIntensityRecord>(context) {
+
+    override suspend fun formatValue(
+        record: ActivityIntensityRecord,
+        unitPreferences: UnitPreferences,
+    ): String {
+        return when (record.activityIntensityType) {
+            ACTIVITY_INTENSITY_TYPE_MODERATE ->
+                return context.getString(R.string.activity_intensity_type_moderate)
+
+            ACTIVITY_INTENSITY_TYPE_VIGOROUS ->
+                return context.getString(R.string.activity_intensity_type_vigorous)
+
+            else -> context.getString(R.string.unknown_type)
+        }
+    }
+
+    override suspend fun formatA11yValue(
+        record: ActivityIntensityRecord,
+        unitPreferences: UnitPreferences,
+    ): String {
+        return formatValue(record, unitPreferences)
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/CyclingPedalingCadenceFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/CyclingPedalingCadenceFormatter.kt
index 27ac862..b1bba39 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/CyclingPedalingCadenceFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/CyclingPedalingCadenceFormatter.kt
@@ -41,7 +41,7 @@
         record: CyclingPedalingCadenceRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedEntry.SeriesDataEntry(
             uuid = record.metadata.id,
@@ -49,12 +49,13 @@
             headerA11y = headerA11y,
             title = formatValue(record, unitPreferences),
             titleA11y = formatA11yValue(record, unitPreferences),
-            dataType = getDataType(record))
+            dataType = record::class,
+        )
     }
 
     override suspend fun formatValue(
         record: CyclingPedalingCadenceRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return formatCadence(R.string.cycling_cadence_series_range, record) { rpm ->
             format(context.getString(R.string.cycling_rpm), mapOf("count" to rpm))
@@ -63,7 +64,7 @@
 
     override suspend fun formatA11yValue(
         record: CyclingPedalingCadenceRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return formatCadence(R.string.cycling_cadence_series_range_long, record) { rpm ->
             format(context.getString(R.string.cycling_rpm_long), mapOf("count" to rpm))
@@ -83,18 +84,21 @@
                     title =
                         format(
                             context.getString(R.string.cycling_rpm),
-                            mapOf("count" to sample.revolutionsPerMinute)),
+                            mapOf("count" to sample.revolutionsPerMinute),
+                        ),
                     titleA11y =
                         format(
                             context.getString(R.string.cycling_rpm_long),
-                            mapOf("count" to sample.revolutionsPerMinute)))
+                            mapOf("count" to sample.revolutionsPerMinute),
+                        ),
+                )
             }
     }
 
     private fun formatCadence(
         @StringRes res: Int,
         record: CyclingPedalingCadenceRecord,
-        getCadenceString: (rpm: Double) -> String
+        getCadenceString: (rpm: Double) -> String,
     ): String {
         if (record.samples.isEmpty()) {
             return context.getString(R.string.no_data)
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/ExerciseSessionFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/ExerciseSessionFormatter.kt
index 6564989..6aae8b2 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/ExerciseSessionFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/ExerciseSessionFormatter.kt
@@ -105,7 +105,7 @@
 @Inject
 constructor(
     @ApplicationContext private val context: Context,
-    private val exerciseSegmentTypeFormatter: ExerciseSegmentTypeFormatter
+    private val exerciseSegmentTypeFormatter: ExerciseSegmentTypeFormatter,
 ) : BaseFormatter<ExerciseSessionRecord>(context), RecordDetailsFormatter<ExerciseSessionRecord> {
 
     private val timeFormatter = LocalDateTimeFormatter(context)
@@ -114,7 +114,7 @@
         record: ExerciseSessionRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return ExerciseSessionEntry(
             uuid = record.metadata.id,
@@ -122,9 +122,10 @@
             headerA11y = headerA11y,
             title = formatValue(record),
             titleA11y = formatA11yValue(record),
-            dataType = getDataType(record),
+            dataType = record::class,
             notes = getNotes(record),
-            route = record.route)
+            route = record.route,
+        )
     }
 
     fun formatValue(record: ExerciseSessionRecord): String {
@@ -158,7 +159,7 @@
 
     private fun formatSession(
         record: ExerciseSessionRecord,
-        formatDuration: (duration: Duration) -> String
+        formatDuration: (duration: Duration) -> String,
     ): String {
         val type = getExerciseType(context, record.exerciseType)
         return if (!record.title.isNullOrBlank()) {
@@ -212,6 +213,7 @@
                 EXERCISE_SESSION_TYPE_BIKING -> context.getString(R.string.biking)
                 EXERCISE_SESSION_TYPE_BIKING_STATIONARY ->
                     context.getString(R.string.biking_stationary)
+
                 EXERCISE_SESSION_TYPE_BOOT_CAMP -> context.getString(R.string.boot_camp)
                 EXERCISE_SESSION_TYPE_BOXING -> context.getString(R.string.boxing)
                 EXERCISE_SESSION_TYPE_CALISTHENICS -> context.getString(R.string.calisthenics)
@@ -222,16 +224,20 @@
                 EXERCISE_SESSION_TYPE_FENCING -> context.getString(R.string.fencing)
                 EXERCISE_SESSION_TYPE_FOOTBALL_AMERICAN ->
                     context.getString(R.string.football_american)
+
                 EXERCISE_SESSION_TYPE_FOOTBALL_AUSTRALIAN ->
                     context.getString(R.string.activity_type_australian_football)
+
                 EXERCISE_SESSION_TYPE_FRISBEE_DISC -> context.getString(R.string.frisbee_disc)
                 EXERCISE_SESSION_TYPE_GOLF -> context.getString(R.string.golf)
                 EXERCISE_SESSION_TYPE_GUIDED_BREATHING ->
                     context.getString(R.string.guided_breathing)
+
                 EXERCISE_SESSION_TYPE_GYMNASTICS -> context.getString(R.string.gymnastics)
                 EXERCISE_SESSION_TYPE_HANDBALL -> context.getString(R.string.handball)
                 EXERCISE_SESSION_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING ->
                     context.getString(R.string.high_intensity_interval_training)
+
                 EXERCISE_SESSION_TYPE_HIKING -> context.getString(R.string.hiking)
                 EXERCISE_SESSION_TYPE_ICE_HOCKEY -> context.getString(R.string.ice_hockey)
                 EXERCISE_SESSION_TYPE_ICE_SKATING -> context.getString(R.string.ice_skating)
@@ -248,6 +254,7 @@
                 EXERCISE_SESSION_TYPE_RUNNING -> context.getString(R.string.running)
                 EXERCISE_SESSION_TYPE_RUNNING_TREADMILL ->
                     context.getString(R.string.running_treadmill)
+
                 EXERCISE_SESSION_TYPE_SAILING -> context.getString(R.string.sailing)
                 EXERCISE_SESSION_TYPE_SCUBA_DIVING -> context.getString(R.string.scuba_diving)
                 EXERCISE_SESSION_TYPE_SKATING -> context.getString(R.string.skating)
@@ -260,12 +267,15 @@
                 EXERCISE_SESSION_TYPE_STAIR_CLIMBING -> context.getString(R.string.stair_climbing)
                 EXERCISE_SESSION_TYPE_STAIR_CLIMBING_MACHINE ->
                     context.getString(R.string.stair_climbing_machine)
+
                 EXERCISE_SESSION_TYPE_STRENGTH_TRAINING ->
                     context.getString(R.string.strength_training)
+
                 EXERCISE_SESSION_TYPE_STRETCHING -> context.getString(R.string.stretching)
                 EXERCISE_SESSION_TYPE_SURFING -> context.getString(R.string.surfing)
                 EXERCISE_SESSION_TYPE_SWIMMING_OPEN_WATER ->
                     context.getString(R.string.swimming_open_water)
+
                 EXERCISE_SESSION_TYPE_SWIMMING_POOL -> context.getString(R.string.swimming_pool)
                 EXERCISE_SESSION_TYPE_TABLE_TENNIS -> context.getString(R.string.table_tennis)
                 EXERCISE_SESSION_TYPE_TENNIS -> context.getString(R.string.tennis)
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/HeartRateFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/HeartRateFormatter.kt
index 0103940..6814138 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/HeartRateFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/HeartRateFormatter.kt
@@ -40,7 +40,7 @@
         record: HeartRateRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedEntry.SeriesDataEntry(
             uuid = record.metadata.id,
@@ -48,12 +48,13 @@
             headerA11y = headerA11y,
             title = formatValue(record, unitPreferences),
             titleA11y = formatA11yValue(record, unitPreferences),
-            dataType = getDataType(record))
+            dataType = record::class,
+        )
     }
 
     override suspend fun formatValue(
         record: HeartRateRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return if (record.samples.size == 1) {
             formatSampleValue(R.string.heart_rate_value, record.samples.first().beatsPerMinute)
@@ -66,15 +67,12 @@
 
     override suspend fun formatA11yValue(
         record: HeartRateRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return if (record.samples.size == 1) {
             formatSampleValue(R.string.heart_rate_long_value, record.samples.first().beatsPerMinute)
         } else {
-            return formatRange(
-                R.string.heart_rate_series_range_long,
-                record,
-            ) { heartRate: Long ->
+            return formatRange(R.string.heart_rate_series_range_long, record) { heartRate: Long ->
                 formatSampleValue(R.string.heart_rate_long_value, heartRate)
             }
         }
@@ -92,7 +90,7 @@
 
     private fun formatSample(
         id: String,
-        sample: HeartRateRecord.HeartRateSample
+        sample: HeartRateRecord.HeartRateSample,
     ): FormattedEntry.FormattedSessionDetail {
         return FormattedEntry.FormattedSessionDetail(
             uuid = id,
@@ -110,7 +108,7 @@
     private fun formatRange(
         @StringRes res: Int,
         record: HeartRateRecord,
-        getSample: (heartRate: Long) -> String
+        getSample: (heartRate: Long) -> String,
     ): String {
         val min = record.samples.minOf { it.beatsPerMinute }
         val max = record.samples.maxOf { it.beatsPerMinute }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/MenstruationFlowFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/MenstruationFlowFormatter.kt
index bbe33b9..3271356 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/MenstruationFlowFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/MenstruationFlowFormatter.kt
@@ -20,6 +20,7 @@
 import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.FLOW_HEAVY
 import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.FLOW_LIGHT
 import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.FLOW_MEDIUM
+import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.FLOW_UNKNOWN
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.dataentries.formatters.shared.EntryFormatter
 import com.android.healthconnect.controller.dataentries.units.UnitPreferences
@@ -34,12 +35,13 @@
 
     override suspend fun formatValue(
         record: MenstruationFlowRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return when (record.flow) {
             FLOW_LIGHT -> return context.getString(R.string.flow_light)
             FLOW_MEDIUM -> return context.getString(R.string.flow_medium)
             FLOW_HEAVY -> return context.getString(R.string.flow_heavy)
+            FLOW_UNKNOWN -> return context.getString(R.string.flow_unknown)
             else -> {
                 ""
             }
@@ -48,7 +50,7 @@
 
     override suspend fun formatA11yValue(
         record: MenstruationFlowRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return formatValue(record, unitPreferences)
     }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/MenstruationPeriodFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/MenstruationPeriodFormatter.kt
index e024eac..ceb08b1 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/MenstruationPeriodFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/MenstruationPeriodFormatter.kt
@@ -21,13 +21,19 @@
 import android.content.Context
 import android.health.connect.datatypes.MenstruationPeriodRecord
 import android.health.connect.datatypes.Record
+import android.icu.text.MessageFormat.format
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.entries.FormattedEntry.FormattedDataEntry
-import com.android.healthconnect.controller.shared.DataType
+import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.shared.app.AppInfoReader
+import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
+import com.android.healthconnect.controller.utils.TimeSource
+import com.android.healthconnect.controller.utils.isLessThanOneYearAgo
 import com.android.healthconnect.controller.utils.toLocalDate
+import com.android.healthconnect.controller.utils.toLocalTime
 import dagger.hilt.android.qualifiers.ApplicationContext
 import java.time.Instant
+import java.time.LocalTime
 import java.time.Period
 import java.time.temporal.ChronoUnit.DAYS
 import javax.inject.Inject
@@ -37,28 +43,52 @@
 @Inject
 constructor(
     private val appInfoReader: AppInfoReader,
-    @ApplicationContext private val context: Context
+    @ApplicationContext private val context: Context,
+    private val timeSource: TimeSource,
 ) {
 
+    val dateFormatter = LocalDateTimeFormatter(context)
+
     suspend fun format(
         day: Instant,
         record: MenstruationPeriodRecord,
-        showDataOrigin: Boolean = true
+        period: DateNavigationPeriod,
+        showDataOrigin: Boolean = true,
     ): FormattedDataEntry {
-        val dayOfPeriod = dayOfPeriod(record, day)
         val totalDays = totalDaysOfPeriod(record)
-        val title = context.getString(R.string.period_day, dayOfPeriod, totalDays)
         val appName = if (showDataOrigin) getAppName(record) else ""
+        return when (period) {
+            DateNavigationPeriod.PERIOD_DAY -> {
+                val dayOfPeriod = dayOfPeriod(record, day)
+                val title = context.getString(R.string.period_day, dayOfPeriod, totalDays)
+                FormattedDataEntry(
+                    uuid = record.metadata.id,
+                    title = title,
+                    titleA11y = title,
+                    header = appName,
+                    headerA11y = appName,
+                    dataType = MenstruationPeriodRecord::class,
+                    startTime = record.startTime,
+                    endTime = record.endTime,
+                )
+            }
 
-        return FormattedDataEntry(
-            uuid = record.metadata.id,
-            title = title,
-            titleA11y = title,
-            header = appName,
-            headerA11y = appName,
-            dataType = DataType.MENSTRUATION_PERIOD,
-            startTime = record.startTime,
-            endTime = record.endTime)
+            else -> {
+                val header = getHeader(record.startTime, record.endTime, appName)
+                val title =
+                    format(context.getString(R.string.period_length), mapOf("count" to totalDays))
+                FormattedDataEntry(
+                    uuid = record.metadata.id,
+                    title = title,
+                    titleA11y = title,
+                    header = header,
+                    headerA11y = header,
+                    dataType = MenstruationPeriodRecord::class,
+                    startTime = record.startTime,
+                    endTime = record.endTime,
+                )
+            }
+        }
     }
 
     private fun dayOfPeriod(record: MenstruationPeriodRecord, day: Instant): Int {
@@ -74,4 +104,45 @@
     private suspend fun getAppName(record: Record): String {
         return appInfoReader.getAppMetadata(record.metadata.dataOrigin.packageName).appName
     }
+
+    private fun getHeader(startDate: Instant, endDate: Instant, appName: String): String {
+        if (appName == "")
+            return context.getString(
+                R.string.data_entry_header_date_range_without_source_app,
+                getDateRange(startDate, endDate),
+            )
+        return context.getString(
+            R.string.data_entry_header_date_range_with_source_app,
+            getDateRange(startDate, endDate),
+            appName,
+        )
+    }
+
+    private fun getDateRange(startDate: Instant, endDate: Instant): String {
+        return if (endDate != startDate) {
+            var localEndDate: Instant = endDate
+
+            // If endDate is midnight, add one millisecond so that DateUtils
+            // correctly formats it as a separate date.
+            if (endDate.toLocalTime() == LocalTime.MIDNIGHT) {
+                localEndDate = endDate.plusMillis(1)
+            }
+            // display date range
+            if (
+                startDate.isLessThanOneYearAgo(timeSource) &&
+                    localEndDate.isLessThanOneYearAgo(timeSource)
+            ) {
+                dateFormatter.formatDateRangeWithoutYear(startDate, localEndDate)
+            } else {
+                dateFormatter.formatDateRangeWithYear(startDate, localEndDate)
+            }
+        } else {
+            // display only one date
+            if (startDate.isLessThanOneYearAgo(timeSource)) {
+                dateFormatter.formatShortDate(startDate)
+            } else {
+                dateFormatter.formatLongDate(startDate)
+            }
+        }
+    }
 }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/MindfulnessSessionFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/MindfulnessSessionFormatter.kt
index 1e935f3..674e1bb 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/MindfulnessSessionFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/MindfulnessSessionFormatter.kt
@@ -55,7 +55,7 @@
             headerA11y = headerA11y,
             title = formatValue(record),
             titleA11y = formatA11yValue(record),
-            dataType = getDataType(record),
+            dataType = record::class,
             notes = record.notes?.toString(),
             isClickable = false,
         )
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/PlannedExerciseSessionRecordFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/PlannedExerciseSessionRecordFormatter.kt
index 7358d05..22dad71 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/PlannedExerciseSessionRecordFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/PlannedExerciseSessionRecordFormatter.kt
@@ -26,7 +26,6 @@
 import com.android.healthconnect.controller.dataentries.formatters.shared.BaseFormatter
 import com.android.healthconnect.controller.dataentries.formatters.shared.RecordDetailsFormatter
 import com.android.healthconnect.controller.dataentries.units.UnitPreferences
-import com.android.healthconnect.controller.shared.DataType
 import dagger.hilt.android.qualifiers.ApplicationContext
 import javax.inject.Inject
 
@@ -35,7 +34,7 @@
 @Inject
 constructor(
     @ApplicationContext private val context: Context,
-    private val plannedExerciseBlockFormatter: PlannedExerciseBlockFormatter
+    private val plannedExerciseBlockFormatter: PlannedExerciseBlockFormatter,
 ) :
     BaseFormatter<PlannedExerciseSessionRecord>(context),
     RecordDetailsFormatter<PlannedExerciseSessionRecord> {
@@ -44,7 +43,7 @@
         record: PlannedExerciseSessionRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedEntry.PlannedExerciseSessionEntry(
             uuid = record.metadata.id,
@@ -53,14 +52,16 @@
             title = formatTitle(record),
             titleA11y = formatTitle(record),
             notes = getNotes(record),
-            dataType = DataType.PLANNED_EXERCISE)
+            dataType = PlannedExerciseSessionRecord::class,
+        )
     }
 
     fun formatTitle(record: PlannedExerciseSessionRecord): String {
         return context.getString(
             R.string.planned_exercise_session_title,
             getExerciseType(context, record.exerciseType),
-            record.title)
+            record.title,
+        )
     }
 
     private fun getNotes(record: PlannedExerciseSessionRecord): String? {
@@ -82,7 +83,10 @@
                 add(plannedExerciseBlockFormatter.formatBlock(plannedExerciseBlock))
                 addAll(
                     plannedExerciseBlockFormatter.formatBlockDetails(
-                        plannedExerciseBlock, unitPreferences))
+                        plannedExerciseBlock,
+                        unitPreferences,
+                    )
+                )
                 add(ItemDataEntrySeparator())
             }
         }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/PowerFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/PowerFormatter.kt
index b18e535..6b1c55c 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/PowerFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/PowerFormatter.kt
@@ -42,7 +42,7 @@
         record: PowerRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedEntry.SeriesDataEntry(
             uuid = record.metadata.id,
@@ -50,19 +50,20 @@
             headerA11y = headerA11y,
             title = formatValue(record, unitPreferences),
             titleA11y = formatA11yValue(record, unitPreferences),
-            dataType = getDataType(record))
+            dataType = record::class,
+        )
     }
 
     override suspend fun formatValue(
         record: PowerRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return format(R.string.watt_format, record.samples)
     }
 
     override suspend fun formatA11yValue(
         record: PowerRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return format(R.string.watt_format_long, record.samples)
     }
@@ -89,11 +90,13 @@
             title =
                 MessageFormat.format(
                     context.getString(R.string.watt_format),
-                    mapOf("value" to sample.power.inWatts)),
+                    mapOf("value" to sample.power.inWatts),
+                ),
             titleA11y =
                 MessageFormat.format(
                     context.getString(R.string.watt_format_long),
-                    mapOf("value" to sample.power.inWatts)),
+                    mapOf("value" to sample.power.inWatts),
+                ),
         )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/SkinTemperatureFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/SkinTemperatureFormatter.kt
index 7ddf639..7f9095f 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/SkinTemperatureFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/SkinTemperatureFormatter.kt
@@ -47,7 +47,7 @@
         record: SkinTemperatureRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedEntry.SeriesDataEntry(
             uuid = record.metadata.id,
@@ -55,7 +55,8 @@
             headerA11y = headerA11y,
             title = formatValue(record, unitPreferences),
             titleA11y = formatA11yValue(record, unitPreferences),
-            dataType = getDataType(record))
+            dataType = record::class,
+        )
     }
 
     override suspend fun formatRecordDetails(record: SkinTemperatureRecord): List<FormattedEntry> {
@@ -72,7 +73,9 @@
                         titleA11y =
                             context.getString(R.string.skin_temperature_measurement_location_title),
                         header = formatLocation(context, record.measurementLocation),
-                        headerA11y = formatLocation(context, record.measurementLocation)))
+                        headerA11y = formatLocation(context, record.measurementLocation),
+                    )
+                )
             }
 
         val baselineEntry: List<FormattedEntry> =
@@ -85,13 +88,17 @@
                         title = context.getString(R.string.skin_temperature_baseline_title),
                         titleA11y = context.getString(R.string.skin_temperature_baseline_title),
                         header = formatNullableTemperature(record.baseline, false),
-                        headerA11y = formatNullableTemperature(record.baseline, true)))
+                        headerA11y = formatNullableTemperature(record.baseline, true),
+                    )
+                )
             }
 
         val deltasTitle: List<FormattedEntry> =
             listOf(
                 FormattedEntry.FormattedSectionTitle(
-                    context.getString(R.string.skin_temperature_delta_details_heading)))
+                    context.getString(R.string.skin_temperature_delta_details_heading)
+                )
+            )
 
         val deltas =
             record.deltas
@@ -113,17 +120,25 @@
         if (temperature == null) return ""
         return if (isA11y) {
             TemperatureFormatter.formatA11tValue(
-                context, temperature, MEASUREMENT_LOCATION_UNKNOWN, unitPreferences)
+                context,
+                temperature,
+                MEASUREMENT_LOCATION_UNKNOWN,
+                unitPreferences,
+            )
         } else {
             TemperatureFormatter.formatValue(
-                context, temperature, MEASUREMENT_LOCATION_UNKNOWN, unitPreferences)
+                context,
+                temperature,
+                MEASUREMENT_LOCATION_UNKNOWN,
+                unitPreferences,
+            )
         }
     }
 
     private fun formatDelta(
         id: String,
         delta: Delta,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry.FormattedSessionDetail {
         return FormattedEntry.FormattedSessionDetail(
             uuid = id,
@@ -131,10 +146,17 @@
             headerA11y = timeFormatter.formatTime(delta.time),
             title =
                 TemperatureDeltaFormatter.formatSingleDeltaValue(
-                    context, delta.delta, unitPreferences),
+                    context,
+                    delta.delta,
+                    unitPreferences,
+                ),
             titleA11y =
                 TemperatureDeltaFormatter.formatSingleDeltaA11yValue(
-                    context, delta.delta, unitPreferences))
+                    context,
+                    delta.delta,
+                    unitPreferences,
+                ),
+        )
     }
 
     override suspend fun formatValue(
@@ -150,7 +172,7 @@
 
     override suspend fun formatA11yValue(
         record: SkinTemperatureRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return if (record.deltas.size == 1) {
             formatA11yUnit(record.deltas.first().delta)
@@ -170,20 +192,27 @@
     private fun format(
         record: SkinTemperatureRecord,
         unitPreferences: UnitPreferences,
-        isA11y: Boolean
+        isA11y: Boolean,
     ): String {
         if (record.deltas.isEmpty()) {
             return context.getString(R.string.no_data)
         }
         val averageDelta =
             TemperatureDelta.fromCelsius(
-                record.deltas.sumOf { it.delta.inCelsius } / record.deltas.size)
+                record.deltas.sumOf { it.delta.inCelsius } / record.deltas.size
+            )
         return if (isA11y) {
             TemperatureDeltaFormatter.formatAverageDeltaA11yValue(
-                context, averageDelta, unitPreferences)
+                context,
+                averageDelta,
+                unitPreferences,
+            )
         } else {
             TemperatureDeltaFormatter.formatAverageDeltaValue(
-                context, averageDelta, unitPreferences)
+                context,
+                averageDelta,
+                unitPreferences,
+            )
         }
     }
 
@@ -197,7 +226,8 @@
                 context.getString(R.string.temperature_location_wrist)
             else -> {
                 throw IllegalArgumentException(
-                    "Unrecognised skin temperature measurement location: $location")
+                    "Unrecognised skin temperature measurement location: $location"
+                )
             }
         }
     }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/SleepSessionFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/SleepSessionFormatter.kt
index 7a146b8..ac296e2 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/SleepSessionFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/SleepSessionFormatter.kt
@@ -50,7 +50,7 @@
         record: SleepSessionRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedEntry.SleepSessionEntry(
             uuid = record.metadata.id,
@@ -58,8 +58,9 @@
             headerA11y = headerA11y,
             title = formatValue(record),
             titleA11y = formatA11yValue(record),
-            dataType = getDataType(record),
-            notes = getNotes(record))
+            dataType = record::class,
+            notes = getNotes(record),
+        )
     }
 
     @VisibleForTesting
@@ -86,7 +87,7 @@
 
     private fun formatSleepSession(
         record: SleepSessionRecord,
-        formatDuration: (duration: Duration) -> String
+        formatDuration: (duration: Duration) -> String,
     ): String {
         return if (!record.title.isNullOrBlank()) {
             context.getString(R.string.sleep_session_with_one_field, record.title)
@@ -107,14 +108,13 @@
             header = timeFormatter.formatTimeRange(stage.startTime, stage.endTime),
             headerA11y = timeFormatter.formatTimeRangeA11y(stage.startTime, stage.endTime),
             title = formatStageType(stage) { duration -> formatDurationShort(context, duration) },
-            titleA11y =
-                formatStageType(stage) { duration -> formatDurationLong(context, duration) },
+            titleA11y = formatStageType(stage) { duration -> formatDurationLong(context, duration) },
         )
     }
 
     private fun formatStageType(
         stage: SleepSessionRecord.Stage,
-        formatDuration: (duration: Duration) -> String
+        formatDuration: (duration: Duration) -> String,
     ): String {
         val stageStringRes =
             when (stage.type) {
@@ -133,6 +133,9 @@
         val stageString = context.getString(stageStringRes)
         val duration = Duration.between(stage.startTime, stage.endTime)
         return context.getString(
-            R.string.sleep_stage_default, formatDuration(duration), stageString)
+            R.string.sleep_stage_default,
+            formatDuration(duration),
+            stageString,
+        )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/SpeedFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/SpeedFormatter.kt
index dd12671..fc39ad6 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/SpeedFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/SpeedFormatter.kt
@@ -49,7 +49,7 @@
         record: SpeedRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedEntry.SeriesDataEntry(
             uuid = record.metadata.id,
@@ -57,12 +57,13 @@
             headerA11y = headerA11y,
             title = formatValue(record, unitPreferences),
             titleA11y = formatA11yValue(record, unitPreferences),
-            dataType = getDataType(record))
+            dataType = record::class,
+        )
     }
 
     override suspend fun formatValue(
         record: SpeedRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         val res = getUnitRes(unitPreferences)
         return formatRecord(res, record.samples, unitPreferences)
@@ -70,7 +71,7 @@
 
     override suspend fun formatA11yValue(
         record: SpeedRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         val res = getA11yUnitRes(unitPreferences)
         return formatRecord(res, record.samples, unitPreferences)
@@ -85,7 +86,7 @@
     private fun formatSample(
         id: String,
         sample: SpeedRecordSample,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedSessionDetail {
         return FormattedSessionDetail(
             uuid = id,
@@ -93,18 +94,23 @@
             headerA11y = timeFormatter.formatTime(sample.time),
             title =
                 formatSpeedValue(
-                    getUnitRes(unitPreferences), sample.speed.inMetersPerSecond, unitPreferences),
+                    getUnitRes(unitPreferences),
+                    sample.speed.inMetersPerSecond,
+                    unitPreferences,
+                ),
             titleA11y =
                 formatSpeedValue(
                     getA11yUnitRes(unitPreferences),
                     sample.speed.inMetersPerSecond,
-                    unitPreferences))
+                    unitPreferences,
+                ),
+        )
     }
 
     private fun formatRecord(
         @StringRes res: Int,
         samples: List<SpeedRecordSample>,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         if (samples.isEmpty()) {
             return context.getString(R.string.no_data)
@@ -116,7 +122,7 @@
     fun formatSpeedValue(
         @StringRes res: Int,
         speed: Double,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         val speedWithUnit = convertToDistancePerHour(unitPreferences.getDistanceUnit(), speed)
         return MessageFormat.format(context.getString(res), mapOf("value" to speedWithUnit))
@@ -139,46 +145,66 @@
     fun formatSpeedValue(
         speed: Velocity,
         unitPreferences: UnitPreferences,
-        exerciseSegmentType: Int
+        exerciseSegmentType: Int,
     ): String {
         if (Companion.ACTIVITY_TYPES_WITH_PACE_VELOCITY.contains(exerciseSegmentType)) {
             return formatSpeedValueToMinPerDistance(
-                getUnitResInMinPerDistance(unitPreferences), speed, unitPreferences)
+                getUnitResInMinPerDistance(unitPreferences),
+                speed,
+                unitPreferences,
+            )
         } else if (Companion.SWIMMING_ACTIVITY_TYPES.contains(exerciseSegmentType)) {
             return formatSpeedValueToMinPerOneHundredDistance(
-                getUnitResInMinPerOneHundredDistance(unitPreferences), speed, unitPreferences)
+                getUnitResInMinPerOneHundredDistance(unitPreferences),
+                speed,
+                unitPreferences,
+            )
         }
         return formatSpeedValue(
-            getUnitRes(unitPreferences), speed.inMetersPerSecond, unitPreferences)
+            getUnitRes(unitPreferences),
+            speed.inMetersPerSecond,
+            unitPreferences,
+        )
     }
 
     fun formatA11ySpeedValue(
         speed: Velocity,
         unitPreferences: UnitPreferences,
-        exerciseSegmentType: Int
+        exerciseSegmentType: Int,
     ): String {
         if (Companion.ACTIVITY_TYPES_WITH_PACE_VELOCITY.contains(exerciseSegmentType)) {
             return formatSpeedValueToMinPerDistance(
-                getA11yUnitResInMinPerDistance(unitPreferences), speed, unitPreferences)
+                getA11yUnitResInMinPerDistance(unitPreferences),
+                speed,
+                unitPreferences,
+            )
         }
         if (Companion.SWIMMING_ACTIVITY_TYPES.contains(exerciseSegmentType)) {
             return formatSpeedValueToMinPerOneHundredDistance(
-                getA11yUnitResInMinPerOneHundredDistance(unitPreferences), speed, unitPreferences)
+                getA11yUnitResInMinPerOneHundredDistance(unitPreferences),
+                speed,
+                unitPreferences,
+            )
         }
         return formatSpeedValue(
-            getA11yUnitRes(unitPreferences), speed.inMetersPerSecond, unitPreferences)
+            getA11yUnitRes(unitPreferences),
+            speed.inMetersPerSecond,
+            unitPreferences,
+        )
     }
 
     private fun formatSpeedValueToMinPerDistance(
         @StringRes res: Int,
         speed: Velocity,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         val timePerUnitInSeconds =
             if (speed.inMetersPerSecond != 0.0)
                 3600 /
                     convertToDistancePerHour(
-                        unitPreferences.getDistanceUnit(), speed.inMetersPerSecond)
+                        unitPreferences.getDistanceUnit(),
+                        speed.inMetersPerSecond,
+                    )
             else speed.inMetersPerSecond
 
         // Display "--:--" if pace value is unrealistic
@@ -206,11 +232,12 @@
     private fun formatSpeedValueToMinPerOneHundredDistance(
         @StringRes res: Int,
         speed: Velocity,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         val timePerUnitInSeconds =
-            if (unitPreferences.getDistanceUnit() == MILES &&
-                Locale.getDefault().equals(Locale.US)) {
+            if (
+                unitPreferences.getDistanceUnit() == MILES && Locale.getDefault().equals(Locale.US)
+            ) {
                 val yardsPerSecond = speed.inMetersPerSecond * METER_TO_YARD
                 if (yardsPerSecond != 0.0) 100 / yardsPerSecond else yardsPerSecond
             } else {
@@ -263,6 +290,7 @@
                 ExerciseSegmentType.EXERCISE_SEGMENT_TYPE_SWIMMING_MIXED,
                 ExerciseSegmentType.EXERCISE_SEGMENT_TYPE_SWIMMING_OPEN_WATER,
                 ExerciseSegmentType.EXERCISE_SEGMENT_TYPE_SWIMMING_OTHER,
-                ExerciseSegmentType.EXERCISE_SEGMENT_TYPE_SWIMMING_POOL)
+                ExerciseSegmentType.EXERCISE_SEGMENT_TYPE_SWIMMING_POOL,
+            )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/StepsCadenceFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/StepsCadenceFormatter.kt
index 1b01721..0af5b5d 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/StepsCadenceFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/StepsCadenceFormatter.kt
@@ -39,7 +39,7 @@
         record: StepsCadenceRecord,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedEntry.SeriesDataEntry(
             uuid = record.metadata.id,
@@ -47,13 +47,14 @@
             headerA11y = headerA11y,
             title = formatValue(record, unitPreferences),
             titleA11y = formatA11yValue(record, unitPreferences),
-            dataType = getDataType(record))
+            dataType = record::class,
+        )
     }
 
     /** Returns localized average StepsCadence from multiple data points. */
     override suspend fun formatValue(
         record: StepsCadenceRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return formatRange(R.string.steps_per_minute, record.samples)
     }
@@ -61,7 +62,7 @@
     /** Returns localized StepsCadence value. */
     override suspend fun formatA11yValue(
         record: StepsCadenceRecord,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): String {
         return formatRange(R.string.steps_per_minute_long, record.samples)
     }
@@ -72,7 +73,7 @@
 
     private fun formatSample(
         id: String,
-        sample: StepsCadenceRecordSample
+        sample: StepsCadenceRecordSample,
     ): FormattedEntry.FormattedSessionDetail {
         return FormattedEntry.FormattedSessionDetail(
             uuid = id,
@@ -80,11 +81,15 @@
             headerA11y = timeFormatter.formatTime(sample.time),
             title =
                 MessageFormat.format(
-                    context.getString(R.string.steps_per_minute), mapOf("value" to sample.rate)),
+                    context.getString(R.string.steps_per_minute),
+                    mapOf("value" to sample.rate),
+                ),
             titleA11y =
                 MessageFormat.format(
                     context.getString(R.string.steps_per_minute_long),
-                    mapOf("value" to sample.rate)))
+                    mapOf("value" to sample.rate),
+                ),
+        )
     }
 
     private fun formatRange(@StringRes res: Int, samples: List<StepsCadenceRecordSample>): String {
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/medical/DisplayNameExtractor.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/medical/DisplayNameExtractor.kt
index 044fc30..fd3e50d 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/medical/DisplayNameExtractor.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/medical/DisplayNameExtractor.kt
@@ -49,6 +49,7 @@
         private const val CVX_SYSTEM = "http://hl7.org/fhir/sid/cvx"
         private const val VACCINE_CODE = "vaccineCode"
         private const val MEDICATION_CODEABLE_CONCEPT = "medicationCodeableConcept"
+        private const val MEDICATION_REFERENCE = "medicationReference"
         private const val MEDICATION = "medication"
         private const val ALIAS = "alias"
         private const val PREFIX = "prefix"
@@ -75,17 +76,13 @@
         fhirData = JSONObject(fhirResourceJson)
         val resourceType = fhirData.optString(RESOURCE_TYPE)
 
-        fun concat(vararg args: String?): String {
-            return args.filterNotNull().filter { it.isNotBlank() }.joinToString(" ")
-        }
-
         return when (resourceType) {
             ALLERGY_INTOLERANCE,
             CONDITION,
             MEDICATION_RESOURCE,
             PROCEDURE -> extractCodeDisplay(CODE, listOf(SNOMED_SYSTEM))
             ENCOUNTER -> extractEncounter()
-            IMMUNIZATION -> extractCodeDisplay(VACCINE_CODE, listOf(CVX_SYSTEM))
+            IMMUNIZATION -> extractCodeDisplay(VACCINE_CODE, listOf(CVX_SYSTEM, SNOMED_SYSTEM))
             LOCATION,
             ORGANIZATION -> extractNameOrAlias()
             MEDICATION_REQUEST,
@@ -102,10 +99,12 @@
         val codeOrVaccineCode = fhirData.optJSONObject(code) ?: return unknownResource
         return codeOrVaccineCode.optString(TEXT).takeIf { !it.isNullOrEmpty() }
             ?: codeOrVaccineCode.optJSONArray(CODING)?.let { codingArray ->
-                for (i in 0 until codingArray.length()) {
-                    val coding = codingArray.getJSONObject(i)
-                    if (coding.optString(SYSTEM) in codings) {
-                        return coding.optString(DISPLAY)
+                for (codingSystem in codings) {
+                    for (i in 0 until codingArray.length()) {
+                        val coding = codingArray.getJSONObject(i)
+                        if (coding.optString(SYSTEM) == codingSystem) {
+                            return coding.optString(DISPLAY)
+                        }
                     }
                 }
                 codingArray.optJSONObject(0)?.optString(DISPLAY)
@@ -114,12 +113,12 @@
     }
 
     private fun extractEncounter(): String {
-        val classText = extractTextOrDisplay(CLASS)
+        val classText = fhirData.optJSONObject(CLASS)?.optStringOrNull(DISPLAY)
         val serviceText = extractTextOrDisplay(SERVICE_TYPE)
-        return if (classText == null || serviceText == null) {
+        return if (classText == null && serviceText == null) {
             unknownResource
         } else {
-            concat(classText, "-", serviceText)
+            concat(classText, serviceText, delim = " - ")
         }
     }
 
@@ -137,21 +136,20 @@
             ?: unknownResource)
 
     private fun extractMedicationConcept(): String {
-        val medication =
-            fhirData.optJSONObject(MEDICATION_CODEABLE_CONCEPT)
-                ?: fhirData.optJSONObject(MEDICATION)
-                ?: return unknownResource
-        return medication.optStringOrNull(TEXT)
-            ?: medication.optJSONArray(CODING)?.let { codingArray ->
-                for (i in 0 until codingArray.length()) {
-                    val coding = codingArray.getJSONObject(i)
-                    if (coding.optString(SYSTEM) == SNOMED_SYSTEM) {
-                        return coding.optString(DISPLAY)
+        val medicationReference = fhirData.optJSONObject(MEDICATION_REFERENCE)
+        val medicationCodeableConcept = fhirData.optJSONObject(MEDICATION_CODEABLE_CONCEPT)
+        return medicationReference?.optStringOrNull(DISPLAY)
+            ?: medicationCodeableConcept?.optStringOrNull(TEXT)
+                ?: medicationCodeableConcept?.optJSONArray(CODING)?.let { codingArray ->
+                    for (i in 0 until codingArray.length()) {
+                        val coding = codingArray.getJSONObject(i)
+                        if (coding.optString(SYSTEM) == SNOMED_SYSTEM) {
+                            return coding.optString(DISPLAY)
+                        }
                     }
+                    codingArray.optJSONObject(0)?.optString(DISPLAY)
                 }
-                codingArray.optJSONObject(0)?.optString(DISPLAY)
-            }
-            ?: unknownResource
+                    ?: unknownResource
     }
 
     private fun extractPatient(): String {
@@ -201,28 +199,30 @@
 
     private fun extractPractitionerRole(): String {
         val codeText =
-            fhirData.optJSONObject(CODE)?.optStringOrNull(TEXT)
+            fhirData.optJSONArray(CODE)?.optJSONObject(0)?.optStringOrNull(TEXT)
                 ?: fhirData
-                    .optJSONObject(CODE)
+                    .optJSONArray(CODE)
+                    ?.optJSONObject(0)
                     ?.optJSONArray(CODING)
                     ?.optJSONObject(0)
                     ?.optString(DISPLAY)
         val specialtyText =
-            fhirData.optJSONObject(SPECIALTY)?.optStringOrNull(TEXT)
+            fhirData.optJSONArray(SPECIALTY)?.optJSONObject(0)?.optStringOrNull(TEXT)
                 ?: fhirData
-                    .optJSONObject(SPECIALTY)
+                    .optJSONArray(SPECIALTY)
+                    ?.optJSONObject(0)
                     ?.optJSONArray(CODING)
                     ?.optJSONObject(0)
                     ?.optString(DISPLAY)
-        return if (codeText != "" && specialtyText != "") {
-            concat(codeText, "-", specialtyText)
-        } else {
+        return if (codeText == null && specialtyText == null) {
             unknownResource
+        } else {
+            concat(codeText, specialtyText, delim = " - ")
         }
     }
 
-    private fun concat(vararg args: String?): String {
-        return args.filterNotNull().filter { it.isNotBlank() }.joinToString(" ")
+    private fun concat(vararg args: String?, delim: String = " "): String {
+        return args.filterNotNull().filter { it.isNotBlank() }.joinToString(delim)
     }
 }
 
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/medical/MedicalEntryFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/medical/MedicalEntryFormatter.kt
index b1533fb..b63d005 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/medical/MedicalEntryFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/medical/MedicalEntryFormatter.kt
@@ -69,8 +69,8 @@
 
         return context.getString(
             R.string.data_entry_header_with_source_app,
-            dataSourceName,
             appName,
+            dataSourceName,
         )
     }
 
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/BaseFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/BaseFormatter.kt
index 04e932d..ab13b81 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/BaseFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/BaseFormatter.kt
@@ -20,7 +20,6 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.entries.FormattedEntry
 import com.android.healthconnect.controller.dataentries.units.UnitPreferences
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import java.time.Instant
 
@@ -35,20 +34,17 @@
             record = record,
             header = getHeader(record, appName),
             headerA11y = getHeaderA11y(record, appName),
-            unitPreferences = unitPreferences)
+            unitPreferences = unitPreferences,
+        )
     }
 
     abstract suspend fun formatRecord(
         record: T,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry
 
-    protected fun getDataType(record: T): DataType {
-        return DataType.values().first { it.recordClass == record::class.java }
-    }
-
     protected fun getStartTime(record: T): Instant {
         return when (record) {
             is IntervalRecord -> record.startTime
@@ -60,17 +56,27 @@
     private fun getHeader(record: T, appName: String): String {
         if (appName == "")
             return context.getString(
-                R.string.data_entry_header_without_source_app, getFormattedTime(record))
+                R.string.data_entry_header_without_source_app,
+                getFormattedTime(record),
+            )
         return context.getString(
-            R.string.data_entry_header_with_source_app, getFormattedTime(record), appName)
+            R.string.data_entry_header_with_source_app,
+            getFormattedTime(record),
+            appName,
+        )
     }
 
     private fun getHeaderA11y(record: T, appName: String): String {
         if (appName == "")
             return context.getString(
-                R.string.data_entry_header_without_source_app, getFormattedA11yTime(record))
+                R.string.data_entry_header_without_source_app,
+                getFormattedA11yTime(record),
+            )
         return context.getString(
-            R.string.data_entry_header_with_source_app, getFormattedA11yTime(record), appName)
+            R.string.data_entry_header_with_source_app,
+            getFormattedA11yTime(record),
+            appName,
+        )
     }
 
     private fun getFormattedTime(record: T): String {
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/EntryFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/EntryFormatter.kt
index dd592a9..b2be987 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/EntryFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/EntryFormatter.kt
@@ -28,7 +28,7 @@
         record: T,
         header: String,
         headerA11y: String,
-        unitPreferences: UnitPreferences
+        unitPreferences: UnitPreferences,
     ): FormattedEntry {
         return FormattedDataEntry(
             uuid = record.metadata.id,
@@ -36,7 +36,8 @@
             headerA11y = headerA11y,
             title = formatValue(record, unitPreferences),
             titleA11y = formatA11yValue(record, unitPreferences),
-            dataType = getDataType(record))
+            dataType = record::class,
+        )
     }
 
     abstract suspend fun formatValue(record: T, unitPreferences: UnitPreferences): String
diff --git a/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/HealthDataEntryFormatter.kt b/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/HealthDataEntryFormatter.kt
index 2cdc666..dbcfddc 100644
--- a/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/HealthDataEntryFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/dataentries/formatters/shared/HealthDataEntryFormatter.kt
@@ -19,6 +19,7 @@
 package com.android.healthconnect.controller.dataentries.formatters.shared
 
 import android.health.connect.datatypes.ActiveCaloriesBurnedRecord
+import android.health.connect.datatypes.ActivityIntensityRecord
 import android.health.connect.datatypes.BasalBodyTemperatureRecord
 import android.health.connect.datatypes.BasalMetabolicRateRecord
 import android.health.connect.datatypes.BloodGlucoseRecord
@@ -61,6 +62,7 @@
 import android.health.connect.datatypes.WheelchairPushesRecord
 import com.android.healthconnect.controller.data.entries.FormattedEntry
 import com.android.healthconnect.controller.dataentries.formatters.ActiveCaloriesBurnedFormatter
+import com.android.healthconnect.controller.dataentries.formatters.ActivityIntensityFormatter
 import com.android.healthconnect.controller.dataentries.formatters.BasalBodyTemperatureFormatter
 import com.android.healthconnect.controller.dataentries.formatters.BasalMetabolicRateFormatter
 import com.android.healthconnect.controller.dataentries.formatters.BloodGlucoseFormatter
@@ -149,6 +151,7 @@
     private val skinTemperatureFormatter: SkinTemperatureFormatter,
     private val plannedExerciseSessionRecordFormatter: PlannedExerciseSessionRecordFormatter,
     private val mindfulnessSessionFormatter: MindfulnessSessionFormatter,
+    private val activityIntensityFormatter: ActivityIntensityFormatter,
 ) {
 
     suspend fun format(record: Record, showDataOrigin: Boolean = true): FormattedEntry {
@@ -198,6 +201,7 @@
             is PlannedExerciseSessionRecord ->
                 plannedExerciseSessionRecordFormatter.format(record, appName)
             is MindfulnessSessionRecord -> mindfulnessSessionFormatter.format(record, appName)
+            is ActivityIntensityRecord -> activityIntensityFormatter.format(record, appName)
             else -> throw IllegalArgumentException("${record::class.java} Not supported!")
         }
     }
diff --git a/apk/src/com/android/healthconnect/controller/datasources/AddAnAppFragment.kt b/apk/src/com/android/healthconnect/controller/datasources/AddAnAppFragment.kt
index 5dd94ba..47c50b3 100644
--- a/apk/src/com/android/healthconnect/controller/datasources/AddAnAppFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/datasources/AddAnAppFragment.kt
@@ -22,9 +22,9 @@
 import com.android.healthconnect.controller.categories.HealthDataCategoriesFragment.Companion.CATEGORY_KEY
 import com.android.healthconnect.controller.datasources.DataSourcesViewModel.PotentialAppSourcesState
 import com.android.healthconnect.controller.datasources.DataSourcesViewModel.PriorityListState
+import com.android.healthconnect.controller.permissions.connectedapps.HealthAppPreference
 import com.android.healthconnect.controller.shared.HealthDataCategoryInt
 import com.android.healthconnect.controller.shared.app.AppMetadata
-import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.AddAnAppElement
@@ -84,9 +84,7 @@
             .sortedBy { it.appName }
             .forEach { appMetadata ->
                 preferenceScreen.addPreference(
-                    HealthPreference(requireContext()).also { preference ->
-                        preference.title = appMetadata.appName
-                        preference.icon = appMetadata.icon
+                    HealthAppPreference(requireContext(), appMetadata).also { preference ->
                         preference.logName = AddAnAppElement.POTENTIAL_PRIORITY_APP_BUTTON
                         preference.setOnPreferenceClickListener {
                             // add this app to the bottom of the priority list
@@ -96,11 +94,14 @@
                                     .also { it.add(appMetadata) }
                                     .toList()
                             dataSourcesViewModel.updatePriorityList(
-                                newPriority.map { it.packageName }.toList(), category)
+                                newPriority.map { it.packageName }.toList(),
+                                category,
+                            )
                             navigationUtils.popBackStack(this)
                             true
                         }
-                    })
+                    }
+                )
             }
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/datasources/DataSourcesFragment.kt b/apk/src/com/android/healthconnect/controller/datasources/DataSourcesFragment.kt
index ed59b99..df9f9d8 100644
--- a/apk/src/com/android/healthconnect/controller/datasources/DataSourcesFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/datasources/DataSourcesFragment.kt
@@ -22,6 +22,7 @@
 import androidx.core.os.bundleOf
 import androidx.fragment.app.activityViewModels
 import androidx.navigation.fragment.findNavController
+import androidx.preference.Preference
 import androidx.preference.PreferenceGroup
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.categories.HealthDataCategoriesFragment.Companion.CATEGORY_KEY
@@ -36,9 +37,9 @@
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.shared.app.AppUtils
 import com.android.healthconnect.controller.shared.preference.CardContainerPreference
-import com.android.healthconnect.controller.shared.preference.HeaderPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
+import com.android.healthconnect.controller.shared.preference.topIntroPreference
 import com.android.healthconnect.controller.utils.AttributeResolver
 import com.android.healthconnect.controller.utils.DeviceInfoUtilsImpl
 import com.android.healthconnect.controller.utils.TimeSource
@@ -240,7 +241,7 @@
     /** Updates the priority list preference. */
     private fun updateAppSourcesSection(
         priorityList: List<AppMetadata>,
-        potentialAppSources: List<AppMetadata>
+        potentialAppSources: List<AppMetadata>,
     ) {
         removeEmptyState()
         appSourcesPreferenceGroup?.isVisible = true
@@ -253,11 +254,13 @@
                     appUtils,
                     dataSourcesViewModel,
                     currentCategorySelection,
-                    this)
+                    this,
+                )
                 .also {
                     it.key = APP_SOURCES_PREFERENCE_KEY
                     it.setEditMode(isEditMode)
-                })
+                }
+        )
 
         updateAddApp(potentialAppSources.isNotEmpty() && !isEditMode)
         nonEmptyFooterPreference?.isVisible = true
@@ -288,10 +291,12 @@
                     findNavController()
                         .navigate(
                             R.id.action_dataSourcesFragment_to_addAnAppFragment,
-                            bundleOf(CATEGORY_KEY to currentCategorySelection))
+                            bundleOf(CATEGORY_KEY to currentCategorySelection),
+                        )
                     true
                 }
-            })
+            }
+        )
     }
 
     /** Populates the data totals section with aggregation cards if needed. */
@@ -312,7 +317,8 @@
                     it.key = DATA_TOTALS_PREFERENCE_KEY
                 }
             dataTotalsPreferenceGroup?.addPreference(
-                (cardContainerPreference as CardContainerPreference))
+                (cardContainerPreference as CardContainerPreference)
+            )
         }
     }
 
@@ -360,11 +366,12 @@
         nonEmptyFooterPreference?.isVisible = false
     }
 
-    private fun getEmptyStateHeaderPreference(): HeaderPreference {
-        return HeaderPreference(requireContext()).also {
-            it.setHeaderText(getString(R.string.data_sources_empty_state))
-            it.key = EMPTY_STATE_HEADER_PREFERENCE_KEY
-        }
+    private fun getEmptyStateHeaderPreference(): Preference {
+        return topIntroPreference(
+            context = requireContext(),
+            preferenceTitle = getString(R.string.data_sources_empty_state),
+            preferenceKey = EMPTY_STATE_HEADER_PREFERENCE_KEY,
+        )
     }
 
     private fun getEmptyStateFooterPreference(): FooterPreference {
@@ -372,7 +379,8 @@
             it.title =
                 getString(
                     R.string.data_sources_empty_state_footer,
-                    getString(currentCategorySelection.lowercaseTitle()))
+                    getString(currentCategorySelection.lowercaseTitle()),
+                )
             it.setLearnMoreText(getString(R.string.data_sources_help_link))
             it.setLearnMoreAction { DeviceInfoUtilsImpl().openHCGetStartedLink(requireActivity()) }
             it.key = EMPTY_STATE_FOOTER_PREFERENCE_KEY
@@ -382,9 +390,8 @@
     private fun setupSpinnerPreference() {
         spinnerPreference = SettingsSpinnerPreference(context)
         spinnerPreference.setAdapter(
-            SettingsSpinnerAdapter<String>(context).also {
-                it.addAll(dataSourcesCategoriesStrings)
-            })
+            SettingsSpinnerAdapter<String>(context).also { it.addAll(dataSourcesCategoriesStrings) }
+        )
 
         spinnerPreference.setOnItemSelectedListener(
             object : AdapterView.OnItemSelectedListener {
@@ -392,7 +399,7 @@
                     parent: AdapterView<*>?,
                     view: View?,
                     position: Int,
-                    id: Long
+                    id: Long,
                 ) {
                     logger.logInteraction(DataSourcesElement.DATA_TYPE_SPINNER)
 
@@ -406,10 +413,12 @@
                 }
 
                 override fun onNothingSelected(p0: AdapterView<*>?) {}
-            })
+            }
+        )
 
         spinnerPreference.setSelection(
-            dataSourcesCategories.indexOf(dataSourcesViewModel.getCurrentSelection()))
+            dataSourcesCategories.indexOf(dataSourcesViewModel.getCurrentSelection())
+        )
 
         dataTypeSpinnerPreferenceGroup?.isVisible = true
         dataTypeSpinnerPreferenceGroup?.addPreference(spinnerPreference)
diff --git a/apk/src/com/android/healthconnect/controller/deletion/DeletionConfirmationDialogFragment.kt b/apk/src/com/android/healthconnect/controller/deletion/DeletionConfirmationDialogFragment.kt
index bf228cc..a18aecd 100644
--- a/apk/src/com/android/healthconnect/controller/deletion/DeletionConfirmationDialogFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/deletion/DeletionConfirmationDialogFragment.kt
@@ -16,6 +16,7 @@
 package com.android.healthconnect.controller.deletion
 
 import android.app.Dialog
+import android.health.connect.datatypes.MenstruationPeriodRecord
 import android.os.Bundle
 import androidx.fragment.app.DialogFragment
 import androidx.fragment.app.activityViewModels
@@ -23,7 +24,6 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.deletion.DeletionConstants.CONFIRMATION_EVENT
 import com.android.healthconnect.controller.deletion.DeletionConstants.GO_BACK_EVENT
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.shared.dialog.AlertDialogBuilder
 import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import com.android.healthconnect.controller.utils.logging.DeletionDialogConfirmationElement
@@ -102,13 +102,19 @@
                 return when (chosenRange) {
                     ChosenRange.DELETE_RANGE_LAST_24_HOURS ->
                         getString(
-                            R.string.confirming_question_data_type_one_day, permissionTypeLabel)
+                            R.string.confirming_question_data_type_one_day,
+                            permissionTypeLabel,
+                        )
                     ChosenRange.DELETE_RANGE_LAST_7_DAYS ->
                         getString(
-                            R.string.confirming_question_data_type_one_week, permissionTypeLabel)
+                            R.string.confirming_question_data_type_one_week,
+                            permissionTypeLabel,
+                        )
                     ChosenRange.DELETE_RANGE_LAST_30_DAYS ->
                         getString(
-                            R.string.confirming_question_data_type_one_month, permissionTypeLabel)
+                            R.string.confirming_question_data_type_one_month,
+                            permissionTypeLabel,
+                        )
                     ChosenRange.DELETE_RANGE_ALL_DATA ->
                         getString(R.string.confirming_question_data_type_all, permissionTypeLabel)
                 }
@@ -183,8 +189,10 @@
         val deletionType = deletionParameters.deletionType
         var message = getString(R.string.confirming_question_message)
 
-        if (deletionType is DeletionType.DeleteDataEntry &&
-            deletionType.dataType == DataType.MENSTRUATION_PERIOD) {
+        if (
+            deletionType is DeletionType.DeleteDataEntry &&
+                deletionType.dataType == MenstruationPeriodRecord::class
+        ) {
             message =
                 getString(
                     R.string.confirming_question_message_menstruation,
diff --git a/apk/src/com/android/healthconnect/controller/deletion/DeletionFragment.kt b/apk/src/com/android/healthconnect/controller/deletion/DeletionFragment.kt
index a541450..c4caf1c 100644
--- a/apk/src/com/android/healthconnect/controller/deletion/DeletionFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/deletion/DeletionFragment.kt
@@ -108,7 +108,7 @@
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
-        savedInstanceState: Bundle?
+        savedInstanceState: Bundle?,
     ): View? {
         return inflater.inflate(R.layout.fragment_deletion, container, false)
     }
@@ -145,8 +145,10 @@
     }
 
     private fun showConfirmationDialog() {
-        if (viewModel.deletionParameters.value?.deletionType is DeletionType.DeletionTypeAppData &&
-            viewModel.deletionParameters.value?.chosenRange == ChosenRange.DELETE_RANGE_ALL_DATA) {
+        if (
+            viewModel.deletionParameters.value?.deletionType is DeletionType.DeletionTypeAppData &&
+                viewModel.deletionParameters.value?.chosenRange == ChosenRange.DELETE_RANGE_ALL_DATA
+        ) {
             showAppDeleteConfirmationDialog()
         } else {
             DeletionConfirmationDialogFragment()
diff --git a/apk/src/com/android/healthconnect/controller/deletion/DeletionType.kt b/apk/src/com/android/healthconnect/controller/deletion/DeletionType.kt
index cb35e23..dcb66d0 100644
--- a/apk/src/com/android/healthconnect/controller/deletion/DeletionType.kt
+++ b/apk/src/com/android/healthconnect/controller/deletion/DeletionType.kt
@@ -20,13 +20,15 @@
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.shared.HealthDataCategoryInt
+import com.android.healthconnect.controller.shared.getDataTypeForClassName
 
 /** Represents the types of deletion that the user can perform. */
 sealed class DeletionType : Parcelable {
     class DeletionTypeAllData() : DeletionType() {
 
         @Suppress(
-            "UNUSED_PARAMETER") // the class has no data to write but inherits from a Parcelable
+            "UNUSED_PARAMETER"
+        ) // the class has no data to write but inherits from a Parcelable
         constructor(parcel: Parcel) : this() {}
 
         override fun writeToParcel(parcel: Parcel, flags: Int) {}
@@ -51,7 +53,9 @@
             parcel: Parcel
         ) : this(
             FitnessPermissionType.valueOf(
-                parcel.readString() ?: FitnessPermissionType.ACTIVE_CALORIES_BURNED.toString())) {}
+                parcel.readString() ?: FitnessPermissionType.ACTIVE_CALORIES_BURNED.toString()
+            )
+        ) {}
 
         override fun writeToParcel(parcel: Parcel, flags: Int) {
             parcel.writeString(fitnessPermissionType.toString())
@@ -120,15 +124,17 @@
     data class DeletionTypeHealthPermissionTypeFromApp(
         val fitnessPermissionType: FitnessPermissionType,
         val packageName: String,
-        val appName: String
+        val appName: String,
     ) : DeletionType() {
         constructor(
             parcel: Parcel
         ) : this(
             FitnessPermissionType.valueOf(
-                parcel.readString() ?: FitnessPermissionType.ACTIVE_CALORIES_BURNED.toString()),
+                parcel.readString() ?: FitnessPermissionType.ACTIVE_CALORIES_BURNED.toString()
+            ),
             parcel.readString() ?: "",
-            parcel.readString() ?: "") {}
+            parcel.readString() ?: "",
+        ) {}
 
         override fun writeToParcel(parcel: Parcel, flags: Int) {
             parcel.writeString(fitnessPermissionType.toString())
@@ -158,14 +164,15 @@
             parcel: Parcel
         ) : this(
             parcel.readString().orEmpty(),
-            DataType.valueOf(parcel.readString().orEmpty()),
-            parcel.readInt())
+            getDataTypeForClassName(parcel.readString().orEmpty()),
+            parcel.readInt(),
+        )
 
         override fun describeContents(): Int = 0
 
         override fun writeToParcel(parcel: Parcel, flags: Int) {
             parcel.writeString(id)
-            parcel.writeString(dataType.name)
+            parcel.writeString(dataType.simpleName)
             parcel.writeInt(index)
         }
 
diff --git a/apk/src/com/android/healthconnect/controller/deletion/DeletionViewModel.kt b/apk/src/com/android/healthconnect/controller/deletion/DeletionViewModel.kt
index 8c4b05b..4607fe5 100644
--- a/apk/src/com/android/healthconnect/controller/deletion/DeletionViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/deletion/DeletionViewModel.kt
@@ -75,7 +75,8 @@
             currentDeletionParameters()
                 .copy(
                     showTimeRangePickerDialog = showTimeRangePickerDialog,
-                    deletionType = deletionType)
+                    deletionType = deletionType,
+                )
     }
 
     fun setChosenRange(chosenRange: ChosenRange) {
@@ -144,7 +145,10 @@
                     is DeletionType.DeletionTypeAppData -> {
                         deletionParameters.value?.let {
                             deleteAppDataUseCase.invoke(
-                                deletionType, timeRangeFilter, _removePermissions)
+                                deletionType,
+                                timeRangeFilter,
+                                _removePermissions,
+                            )
                             if (_removePermissions) {
                                 _appPermissionReloadNeeded.value = true
                             }
@@ -166,4 +170,8 @@
             }
         }
     }
+
+    fun resetAppPermissionReloadNeeded() {
+        _appPermissionReloadNeeded.postValue(false)
+    }
 }
diff --git a/apk/src/com/android/healthconnect/controller/deletion/api/DeleteEntryUseCase.kt b/apk/src/com/android/healthconnect/controller/deletion/api/DeleteEntryUseCase.kt
index 9f40103..a41679b 100644
--- a/apk/src/com/android/healthconnect/controller/deletion/api/DeleteEntryUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/deletion/api/DeleteEntryUseCase.kt
@@ -30,12 +30,11 @@
 @Inject
 constructor(
     private val healthConnectManager: HealthConnectManager,
-    @IoDispatcher private val dispatcher: CoroutineDispatcher
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
 ) {
     suspend fun invoke(deleteEntry: DeleteDataEntry) =
         withContext(dispatcher) {
-            val recordIdFilter =
-                RecordIdFilter.fromId(deleteEntry.dataType.recordClass, deleteEntry.id)
+            val recordIdFilter = RecordIdFilter.fromId(deleteEntry.dataType.java, deleteEntry.id)
 
             healthConnectManager.deleteRecords(listOf(recordIdFilter), Runnable::run) {}
         }
diff --git a/apk/src/com/android/healthconnect/controller/entrydetails/DataEntryDetailsFragment.kt b/apk/src/com/android/healthconnect/controller/entrydetails/DataEntryDetailsFragment.kt
index 5dd37e0..e8b3e3d 100644
--- a/apk/src/com/android/healthconnect/controller/entrydetails/DataEntryDetailsFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/entrydetails/DataEntryDetailsFragment.kt
@@ -13,6 +13,7 @@
  */
 package com.android.healthconnect.controller.entrydetails
 
+import android.health.connect.datatypes.MenstruationPeriodRecord
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -256,7 +257,7 @@
     ) {
         val deletionType = DeletionType.DeleteDataEntry(uuid, dataType, index)
 
-        if (deletionType.dataType == DataType.MENSTRUATION_PERIOD) {
+        if (deletionType.dataType == MenstruationPeriodRecord::class) {
             childFragmentManager.setFragmentResult(
                 START_DELETION_EVENT,
                 bundleOf(
diff --git a/apk/src/com/android/healthconnect/controller/exportimport/ScheduledExportFragment.kt b/apk/src/com/android/healthconnect/controller/exportimport/ScheduledExportFragment.kt
index f3e00ab..b5948ff 100644
--- a/apk/src/com/android/healthconnect/controller/exportimport/ScheduledExportFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/exportimport/ScheduledExportFragment.kt
@@ -169,6 +169,7 @@
         preferenceScreen.addPreference(
             ExportStatusPreference(requireContext(), nextExportText, nextExportLocation).also {
                 it.order = EXPORT_STATUS_PREFERENCE_ORDER
+                it.isSelectable = false
             })
     }
 
diff --git a/apk/src/com/android/healthconnect/controller/home/HomeFragment.kt b/apk/src/com/android/healthconnect/controller/home/HomeFragment.kt
index 323e5fb..362b65b 100644
--- a/apk/src/com/android/healthconnect/controller/home/HomeFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/home/HomeFragment.kt
@@ -19,6 +19,7 @@
 import android.content.Intent
 import android.icu.text.MessageFormat
 import android.os.Bundle
+import android.provider.Settings.ACTION_SECURITY_SETTINGS
 import android.view.View
 import androidx.core.os.bundleOf
 import androidx.fragment.app.activityViewModels
@@ -28,10 +29,10 @@
 import androidx.preference.PreferenceGroup
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.alldata.AllDataFragment.Companion.IS_BROWSE_MEDICAL_DATA_SCREEN
-import com.android.healthconnect.controller.data.alldata.AllDataViewModel
 import com.android.healthconnect.controller.exportimport.api.ExportStatusViewModel
 import com.android.healthconnect.controller.exportimport.api.ScheduledExportUiState
 import com.android.healthconnect.controller.exportimport.api.ScheduledExportUiStatus
+import com.android.healthconnect.controller.home.HomeViewModel.LockScreenBannerState
 import com.android.healthconnect.controller.migration.MigrationActivity.Companion.maybeShowWhatsNewDialog
 import com.android.healthconnect.controller.migration.MigrationViewModel
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState
@@ -42,6 +43,8 @@
 import com.android.healthconnect.controller.recentaccess.RecentAccessViewModel
 import com.android.healthconnect.controller.recentaccess.RecentAccessViewModel.RecentAccessState
 import com.android.healthconnect.controller.shared.Constants
+import com.android.healthconnect.controller.shared.Constants.LOCK_SCREEN_BANNER_SEEN_FITNESS
+import com.android.healthconnect.controller.shared.Constants.LOCK_SCREEN_BANNER_SEEN_MEDICAL
 import com.android.healthconnect.controller.shared.Constants.MIGRATION_NOT_COMPLETE_DIALOG_SEEN
 import com.android.healthconnect.controller.shared.Constants.USER_ACTIVITY_TRACKER
 import com.android.healthconnect.controller.shared.app.AppMetadata
@@ -54,18 +57,20 @@
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.utils.AttributeResolver
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import com.android.healthconnect.controller.utils.TimeSource
+import com.android.healthconnect.controller.utils.formatRecentAccessTime
 import com.android.healthconnect.controller.utils.logging.DataRestoreElement
 import com.android.healthconnect.controller.utils.logging.HomePageElement
 import com.android.healthconnect.controller.utils.logging.MigrationElement
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.logging.UnknownGenericElement
+import com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled
 import com.android.healthfitness.flags.Flags.exportImport
 import com.android.healthfitness.flags.Flags.newInformationArchitecture
 import com.android.healthfitness.flags.Flags.onboarding
-import com.android.healthfitness.flags.Flags.personalHealthRecord
+import com.android.healthfitness.flags.Flags.personalHealthRecordLockScreenBanner
+import com.android.settingslib.widget.SettingsThemeHelper
 import com.android.settingslib.widget.TopIntroPreference
 import dagger.hilt.android.AndroidEntryPoint
 import java.time.Instant
@@ -89,6 +94,8 @@
         private const val START_USING_HC_BANNER_KEY = "start_using_hc"
         private const val CONNECT_MORE_APPS_BANNER_KEY = "connect_more_apps"
         private const val SEE_COMPATIBLE_APPS_BANNER_KEY = "see_compatible_apps"
+        private const val LOCK_SCREEN_BANNER_KEY = "lock_screen_banner"
+        private val securitySettingsIntent = Intent(ACTION_SECURITY_SETTINGS)
 
         @JvmStatic fun newInstance() = HomeFragment()
     }
@@ -97,15 +104,13 @@
         this.setPageName(PageName.HOME_PAGE)
     }
 
-    @Inject lateinit var featureUtils: FeatureUtils
     @Inject lateinit var timeSource: TimeSource
     @Inject lateinit var deviceInfoUtils: DeviceInfoUtils
 
     private val recentAccessViewModel: RecentAccessViewModel by viewModels()
-    private val homeFragmentViewModel: HomeFragmentViewModel by viewModels()
+    private val homeViewModel: HomeViewModel by viewModels()
     private val migrationViewModel: MigrationViewModel by activityViewModels()
     private val exportStatusViewModel: ExportStatusViewModel by activityViewModels()
-    private val allDataViewModel: AllDataViewModel by viewModels()
 
     private val mTopIntroPreference: TopIntroPreference? by lazy {
         preferenceScreen.findPreference(TOP_INTRO_PREFERENCE_KEY)
@@ -135,6 +140,11 @@
         LocalDateTimeFormatter(requireContext())
     }
 
+    private val isLockScreenBannerAvailable: Boolean by lazy {
+        personalHealthRecordLockScreenBanner() &&
+            deviceInfoUtils.isIntentHandlerAvailable(requireContext(), securitySettingsIntent)
+    }
+
     private lateinit var migrationBannerSummary: String
     private var migrationBanner: BannerPreference? = null
 
@@ -168,8 +178,7 @@
             mManageDataPreference?.summary = getString(R.string.manage_data_summary)
         }
 
-        if (personalHealthRecord()) {
-            // TODO(b/343148212): Add logname.
+        if (isPersonalHealthRecordEnabled()) {
             mBrowseMedicalDataPreference?.setOnPreferenceClickListener {
                 findNavController()
                     .navigate(
@@ -179,6 +188,7 @@
                 true
             }
             mBrowseMedicalDataPreference?.isVisible = false
+            mBrowseMedicalDataPreference?.logName = HomePageElement.BROWSE_HEALTH_RECORDS_BUTTON
         } else {
             preferenceScreen.removePreferenceRecursively(BROSE_MEDICAL_DATA_PREFERENCE_KEY)
         }
@@ -190,12 +200,18 @@
     override fun onResume() {
         super.onResume()
         recentAccessViewModel.loadRecentAccessApps(maxNumEntries = 3)
-        homeFragmentViewModel.loadConnectedApps()
+        homeViewModel.loadConnectedApps()
         if (exportImport()) {
             exportStatusViewModel.loadScheduledExportStatus()
         }
-        if (personalHealthRecord()) {
-            allDataViewModel.loadAllMedicalData()
+        if (isPersonalHealthRecordEnabled()) {
+            homeViewModel.loadHasAnyMedicalData()
+            if (isLockScreenBannerAvailable) {
+                homeViewModel.loadShouldShowLockScreenBanner(
+                    getSharedPreference(),
+                    requireContext(),
+                )
+            }
         }
     }
 
@@ -213,7 +229,7 @@
                 }
             }
         }
-        homeFragmentViewModel.connectedApps.observe(viewLifecycleOwner) { connectedApps ->
+        homeViewModel.connectedApps.observe(viewLifecycleOwner) { connectedApps ->
             updateConnectedApps(connectedApps)
             updateOnboardingBanner(connectedApps)
         }
@@ -241,14 +257,39 @@
                 }
             }
         }
-        if (personalHealthRecord()) {
-            allDataViewModel.loadAllMedicalData()
-            allDataViewModel.isAnyMedicalData.observe(viewLifecycleOwner) { isAnyMedicalData ->
-                mBrowseMedicalDataPreference?.isVisible = isAnyMedicalData
+        if (isPersonalHealthRecordEnabled()) {
+            homeViewModel.loadHasAnyMedicalData()
+            homeViewModel.hasAnyMedicalData.observe(viewLifecycleOwner) { hasAnyMedicalData ->
+                mBrowseMedicalDataPreference?.isVisible = hasAnyMedicalData ?: false
+            }
+            if (isLockScreenBannerAvailable) {
+                val sharedPreference = getSharedPreference()
+                homeViewModel.loadShouldShowLockScreenBanner(sharedPreference, requireContext())
+                homeViewModel.showLockScreenBanner.observe(viewLifecycleOwner) { bannerState ->
+                    if (bannerState is LockScreenBannerState.ShowBanner) {
+                        addLockScreenBanner(bannerState)
+                    } else {
+                        removeLockScreenBanner()
+                    }
+                }
             }
         }
     }
 
+    private fun isLockScreenBannerAlreadyAdded(): Boolean {
+        return preferenceScreen.findPreference<BannerPreference>(LOCK_SCREEN_BANNER_KEY) != null
+    }
+
+    private fun addLockScreenBanner(bannerState: LockScreenBannerState.ShowBanner) {
+        if (!isLockScreenBannerAlreadyAdded()) {
+            preferenceScreen.addPreference(getLockScreenBanner(bannerState))
+        }
+    }
+
+    private fun removeLockScreenBanner() {
+        preferenceScreen.removePreferenceRecursively(LOCK_SCREEN_BANNER_KEY)
+    }
+
     private fun showMigrationState(migrationRestoreState: MigrationRestoreState) {
         preferenceScreen.removePreferenceRecursively(MIGRATION_BANNER_PREFERENCE_KEY)
         preferenceScreen.removePreferenceRecursively(DATA_RESTORE_BANNER_PREFERENCE_KEY)
@@ -276,8 +317,7 @@
     }
 
     private fun maybeShowMigrationNotCompleteDialog() {
-        val sharedPreference =
-            requireActivity().getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+        val sharedPreference = getSharedPreference()
         val dialogSeen = sharedPreference.getBoolean(MIGRATION_NOT_COMPLETE_DIALOG_SEEN, false)
 
         if (!dialogSeen) {
@@ -368,7 +408,7 @@
             it.setPrimaryButtonOnClickListener {
                 findNavController().navigate(R.id.action_homeFragment_to_systemUpdateActivity)
             }
-            it.order = 1
+            it.order = HOME_FRAGMENT_BANNER_ORDER
         }
     }
 
@@ -381,7 +421,7 @@
             banner.key = START_USING_HC_BANNER_KEY
             banner.icon =
                 AttributeResolver.getNullableDrawable(requireContext(), R.attr.healthConnectIcon)
-            banner.order = 1
+            banner.order = HOME_FRAGMENT_BANNER_ORDER
             banner.setPrimaryButton(
                 resources.getString(R.string.start_using_hc_set_up_button),
                 UnknownGenericElement.UNKNOWN_BANNER_BUTTON,
@@ -391,9 +431,7 @@
             }
             banner.setIsDismissable(true)
             banner.setDismissAction(UnknownGenericElement.UNKNOWN_BANNER_BUTTON) {
-                val sharedPreference =
-                    requireActivity()
-                        .getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+                val sharedPreference = getSharedPreference()
                 sharedPreference.edit().apply {
                     putBoolean(Constants.START_USING_HC_BANNER_SEEN, true)
                     apply()
@@ -411,7 +449,7 @@
                 resources.getString(R.string.connect_more_apps_banner_content, appMetadata.appName)
             banner.key = CONNECT_MORE_APPS_BANNER_KEY
             banner.icon = AttributeResolver.getNullableDrawable(requireContext(), R.attr.syncIcon)
-            banner.order = 1
+            banner.order = HOME_FRAGMENT_BANNER_ORDER
             banner.setPrimaryButton(
                 resources.getString(R.string.connect_more_apps_set_up_button),
                 UnknownGenericElement.UNKNOWN_BANNER_BUTTON,
@@ -421,9 +459,7 @@
             }
             banner.setIsDismissable(true)
             banner.setDismissAction(UnknownGenericElement.UNKNOWN_BANNER_BUTTON) {
-                val sharedPreference =
-                    requireActivity()
-                        .getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+                val sharedPreference = getSharedPreference()
                 sharedPreference.edit().apply {
                     putBoolean(Constants.CONNECT_MORE_APPS_BANNER_SEEN, true)
                     apply()
@@ -448,7 +484,7 @@
                     requireContext(),
                     R.attr.seeAllCompatibleAppsIcon,
                 )
-            banner.order = 1
+            banner.order = HOME_FRAGMENT_BANNER_ORDER
             banner.setPrimaryButton(
                 resources.getString(R.string.see_compatible_apps_set_up_button),
                 UnknownGenericElement.UNKNOWN_BANNER_BUTTON,
@@ -458,9 +494,7 @@
             }
             banner.setIsDismissable(true)
             banner.setDismissAction(UnknownGenericElement.UNKNOWN_BANNER_BUTTON) {
-                val sharedPreference =
-                    requireActivity()
-                        .getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+                val sharedPreference = getSharedPreference()
                 sharedPreference.edit().apply {
                     putBoolean(Constants.SEE_MORE_COMPATIBLE_APPS_BANNER_SEEN, true)
                     apply()
@@ -470,6 +504,57 @@
         }
     }
 
+    private fun getLockScreenBanner(
+        bannerState: LockScreenBannerState.ShowBanner
+    ): BannerPreference {
+        return BannerPreference(requireContext(), HomePageElement.LOCK_SCREEN_BANNER).also { banner
+            ->
+            banner.title = resources.getString(R.string.lock_screen_banner_title)
+            banner.summary = resources.getString(R.string.lock_screen_banner_content)
+            banner.key = LOCK_SCREEN_BANNER_KEY
+            banner.icon = AttributeResolver.getNullableDrawable(requireContext(), R.attr.lockIcon)
+            banner.order = HOME_FRAGMENT_BANNER_ORDER
+            banner.setPrimaryButton(
+                resources.getString(R.string.lock_screen_banner_button),
+                HomePageElement.LOCK_SCREEN_BANNER_BUTTON,
+            )
+            banner.setPrimaryButtonOnClickListener {
+                updateBannerSeen(bannerState)
+                navigateToSecuritySettings()
+            }
+            banner.setIsDismissable(true)
+            banner.setDismissAction(HomePageElement.LOCK_SCREEN_BANNER_DISMISS_BUTTON) {
+                updateBannerSeen(bannerState)
+                preferenceScreen.removePreference(banner)
+            }
+        }
+    }
+
+    private fun updateBannerSeen(bannerState: LockScreenBannerState.ShowBanner) {
+        val sharedPreference = getSharedPreference()
+        sharedPreference.edit().apply {
+            val anyFitnessData = bannerState.hasAnyFitnessData
+            val anyMedicalData = bannerState.hasAnyMedicalData
+
+            if (!(anyFitnessData || anyMedicalData)) {
+                // This should not happen.
+                putBoolean(LOCK_SCREEN_BANNER_SEEN_FITNESS, true)
+                putBoolean(LOCK_SCREEN_BANNER_SEEN_MEDICAL, true)
+            }
+            if (anyFitnessData) {
+                putBoolean(LOCK_SCREEN_BANNER_SEEN_FITNESS, true)
+            }
+            if (anyMedicalData) {
+                putBoolean(LOCK_SCREEN_BANNER_SEEN_MEDICAL, true)
+            }
+            apply()
+        }
+    }
+
+    private fun navigateToSecuritySettings() {
+        startActivity(securitySettingsIntent)
+    }
+
     private fun updateConnectedApps(connectedApps: List<ConnectedAppMetadata>) {
         val connectedAppsGroup = connectedApps.groupBy { it.status }
         val numAllowedApps = connectedAppsGroup[ConnectedAppStatus.ALLOWED].orEmpty().size
@@ -508,8 +593,7 @@
         val numNotAllowedApps = connectedAppsGroup[ConnectedAppStatus.DENIED].orEmpty().size
         val numTotalApps = numAllowedApps + numNotAllowedApps
 
-        val sharedPreference =
-            requireActivity().getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+        val sharedPreference = getSharedPreference()
 
         if (numTotalApps > 0 && numAllowedApps == 0) {
             // No apps connected, one available
@@ -567,16 +651,7 @@
             )
         } else {
             recentAppsList.forEach { recentApp ->
-                val newRecentAccessPreference =
-                    RecentAccessPreference(requireContext(), recentApp, timeSource, false).also {
-                        newPreference ->
-                        if (!recentApp.isInactive) {
-                            newPreference.setOnPreferenceClickListener {
-                                navigateToAppInfoScreen(recentApp)
-                                true
-                            }
-                        }
-                    }
+                val newRecentAccessPreference = getRecentAccessPreference(recentApp)
                 mRecentAccessPreference?.addPreference(newRecentAccessPreference)
             }
             val seeAllPreference =
@@ -593,6 +668,33 @@
         }
     }
 
+    private fun getRecentAccessPreference(recentApp: RecentAccessEntry): HealthPreference {
+        return if (SettingsThemeHelper.isExpressiveTheme(requireContext())) {
+            HealthPreference(requireContext()).also { newPreference ->
+                newPreference.title = recentApp.metadata.appName
+                newPreference.icon = recentApp.metadata.icon
+                newPreference.summary =
+                    formatRecentAccessTime(recentApp.instantTime, timeSource, requireContext())
+                if (!recentApp.isInactive) {
+                    newPreference.setOnPreferenceClickListener {
+                        navigateToAppInfoScreen(recentApp)
+                        true
+                    }
+                }
+            }
+        } else {
+            RecentAccessPreference(requireContext(), recentApp, timeSource, false).also {
+                newPreference ->
+                if (!recentApp.isInactive) {
+                    newPreference.setOnPreferenceClickListener {
+                        navigateToAppInfoScreen(recentApp)
+                        true
+                    }
+                }
+            }
+        }
+    }
+
     private fun navigateToAppInfoScreen(recentApp: RecentAccessEntry) {
         val appPermissionsType = recentApp.appPermissionsType
         val navigationId =
@@ -613,4 +715,7 @@
                 ),
             )
     }
+
+    private fun getSharedPreference() =
+        requireActivity().getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
 }
diff --git a/apk/src/com/android/healthconnect/controller/home/HomeFragmentViewModel.kt b/apk/src/com/android/healthconnect/controller/home/HomeFragmentViewModel.kt
deleted file mode 100644
index d12d533..0000000
--- a/apk/src/com/android/healthconnect/controller/home/HomeFragmentViewModel.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.healthconnect.controller.home
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
-import com.android.healthconnect.controller.permissions.connectedapps.LoadHealthPermissionApps
-import com.android.healthconnect.controller.shared.app.ConnectedAppMetadata
-import com.android.healthconnect.controller.utils.postValueIfUpdated
-import dagger.hilt.android.lifecycle.HiltViewModel
-import javax.inject.Inject
-import kotlinx.coroutines.launch
-
-@HiltViewModel
-class HomeFragmentViewModel
-@Inject
-constructor(private val loadHealthPermissionApps: LoadHealthPermissionApps) : ViewModel() {
-
-    private val _connectedApps = MutableLiveData<List<ConnectedAppMetadata>>()
-    val connectedApps: LiveData<List<ConnectedAppMetadata>>
-        get() = _connectedApps
-
-    init {
-        loadConnectedApps()
-    }
-
-    fun loadConnectedApps() {
-        viewModelScope.launch {
-            _connectedApps.postValueIfUpdated(loadHealthPermissionApps.invoke())
-        }
-    }
-}
diff --git a/apk/src/com/android/healthconnect/controller/home/HomeViewModel.kt b/apk/src/com/android/healthconnect/controller/home/HomeViewModel.kt
new file mode 100644
index 0000000..e81e2cf
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/home/HomeViewModel.kt
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.home
+
+import android.content.Context
+import android.content.SharedPreferences
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MediatorLiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.android.healthconnect.controller.data.appdata.AllDataUseCase
+import com.android.healthconnect.controller.permissions.connectedapps.ILoadHealthPermissionApps
+import com.android.healthconnect.controller.shared.Constants.LOCK_SCREEN_BANNER_SEEN_FITNESS
+import com.android.healthconnect.controller.shared.Constants.LOCK_SCREEN_BANNER_SEEN_MEDICAL
+import com.android.healthconnect.controller.shared.app.ConnectedAppMetadata
+import com.android.healthconnect.controller.shared.usecase.UseCaseResults
+import com.android.healthconnect.controller.utils.KeyguardManagerUtil
+import com.android.healthconnect.controller.utils.postValueIfUpdated
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+import kotlinx.coroutines.launch
+
+@HiltViewModel
+class HomeViewModel
+@Inject
+constructor(
+    private val loadHealthPermissionApps: ILoadHealthPermissionApps,
+    private val loadAllDataUseCase: AllDataUseCase,
+    private val keyguardManagerUtil: KeyguardManagerUtil,
+) : ViewModel() {
+
+    private val _connectedApps = MutableLiveData<List<ConnectedAppMetadata>>()
+    val connectedApps: LiveData<List<ConnectedAppMetadata>>
+        get() = _connectedApps
+
+    private val _hasAnyFitnessData: MutableLiveData<Boolean> = MutableLiveData(false)
+    private val _hasAnyMedicalData: MutableLiveData<Boolean> = MutableLiveData(false)
+    private var _isBannerSeenWithFitnessData = true
+    private var _isBannerSeenWithMedicalData = true
+    private var _isDeviceSecure = true
+
+    val showLockScreenBanner =
+        MediatorLiveData<LockScreenBannerState>(LockScreenBannerState.NoBanner).apply {
+            addSource(_hasAnyFitnessData) { postValue(shouldShowLockScreenBanner()) }
+            addSource(_hasAnyMedicalData) { postValue(shouldShowLockScreenBanner()) }
+        }
+
+    val hasAnyMedicalData: LiveData<Boolean>
+        get() = _hasAnyMedicalData
+
+    init {
+        loadConnectedApps()
+    }
+
+    fun loadConnectedApps() {
+        viewModelScope.launch {
+            _connectedApps.postValueIfUpdated(loadHealthPermissionApps.invoke())
+        }
+    }
+
+    fun loadHasAnyMedicalData() {
+        _hasAnyMedicalData.postValue(false)
+        viewModelScope.launch {
+            when (val result = loadAllDataUseCase.loadHasAnyMedicalData()) {
+                is UseCaseResults.Success -> {
+                    _hasAnyMedicalData.postValue(result.data)
+                }
+
+                is UseCaseResults.Failed -> {
+                    _hasAnyMedicalData.postValue(false)
+                }
+            }
+        }
+    }
+
+    fun loadShouldShowLockScreenBanner(sharedPreference: SharedPreferences, context: Context) {
+        _isDeviceSecure = keyguardManagerUtil.isDeviceSecure(context) ?: true
+        _isBannerSeenWithFitnessData =
+            sharedPreference.getBoolean(LOCK_SCREEN_BANNER_SEEN_FITNESS, false)
+        _isBannerSeenWithMedicalData =
+            sharedPreference.getBoolean(LOCK_SCREEN_BANNER_SEEN_MEDICAL, false)
+        loadHasAnyFitnessData()
+        loadHasAnyMedicalData()
+    }
+
+    private fun loadHasAnyFitnessData() {
+        _hasAnyFitnessData.postValue(false)
+        viewModelScope.launch {
+            when (val result = loadAllDataUseCase.loadHasAnyFitnessData()) {
+                is UseCaseResults.Success -> {
+                    _hasAnyFitnessData.postValue(result.data)
+                }
+
+                is UseCaseResults.Failed -> {
+                    _hasAnyFitnessData.postValue(false)
+                }
+            }
+        }
+    }
+
+    /**
+     * The lock screen banner appears at most twice: 1) when the user has some fitness data, and
+     * also 2) when the user has some medical data (while the device is not secure).
+     *
+     * <p> Example flow: the user has some fitness data -> the banner appears -> user dismisses it
+     * -> later the user has some medical data -> the banner appears for the second time.
+     */
+    private fun shouldShowLockScreenBanner(): LockScreenBannerState {
+        if (_isDeviceSecure) {
+            return LockScreenBannerState.NoBanner
+        }
+
+        val showBannerWhenFitnessData =
+            _hasAnyFitnessData.value == true && !_isBannerSeenWithFitnessData
+        val showBannerWhenMedicalData =
+            _hasAnyMedicalData.value == true && !_isBannerSeenWithMedicalData
+
+        if (showBannerWhenFitnessData || showBannerWhenMedicalData) {
+            return LockScreenBannerState.ShowBanner(
+                _hasAnyFitnessData.value ?: false,
+                _hasAnyMedicalData.value ?: false,
+            )
+        }
+
+        return LockScreenBannerState.NoBanner
+    }
+
+    sealed class LockScreenBannerState {
+        object NoBanner : LockScreenBannerState()
+
+        data class ShowBanner(
+            val hasAnyFitnessData: Boolean = false,
+            val hasAnyMedicalData: Boolean = false,
+        ) : LockScreenBannerState()
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/navigation/TrampolineActivity.kt b/apk/src/com/android/healthconnect/controller/navigation/TrampolineActivity.kt
index 48efb82..cab021f 100644
--- a/apk/src/com/android/healthconnect/controller/navigation/TrampolineActivity.kt
+++ b/apk/src/com/android/healthconnect/controller/navigation/TrampolineActivity.kt
@@ -29,6 +29,8 @@
 import com.android.healthconnect.controller.data.DataManagementActivity
 import com.android.healthconnect.controller.onboarding.OnboardingActivity
 import com.android.healthconnect.controller.onboarding.OnboardingActivity.Companion.shouldRedirectToOnboardingActivity
+import com.android.healthconnect.controller.permissions.app.wear.WearViewAppInfoPermissionsActivity
+import com.android.healthconnect.controller.permissions.connectedapps.wear.WearSettingsPermissionActivity
 import com.android.healthconnect.controller.permissions.shared.SettingsActivity
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
 import com.android.healthconnect.controller.utils.activity.EmbeddingUtils.maybeRedirectIntoTwoPaneSettings
@@ -52,24 +54,32 @@
         super.onCreate(savedInstanceState)
         // This flag ensures a non system app cannot show an overlay on Health Connect. b/313425281
         window.addSystemFlags(
-            WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
+            WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
+        )
         // Handles unsupported devices and user profiles.
         if (!deviceInfoUtils.isHealthConnectAvailable(this)) {
             Log.e(TAG, "Health connect is not available for this user or hardware, finishing!")
             finish()
             return
         }
+        val isOnWatch = deviceInfoUtils.isOnWatch(this)
 
         // Handles large screen support in settings.
-        if (maybeRedirectIntoTwoPaneSettings(this)) {
+        if (!isOnWatch && maybeRedirectIntoTwoPaneSettings(this)) {
             finish()
             return
         }
 
-        val targetIntent = getTargetIntent()
+        val targetIntent =
+            if (isOnWatch) {
+                getWearTargetIntent()
+            } else {
+                getHandheldTargetIntent()
+            }
 
         // Handles showing Health Connect Onboarding.
-        if (shouldRedirectToOnboardingActivity(this)) {
+        // Do not show onboarding UI on watch.
+        if (!isOnWatch && shouldRedirectToOnboardingActivity(this)) {
             startActivity(OnboardingActivity.createIntent(this, targetIntent))
             finish()
             return
@@ -79,7 +89,7 @@
         finish()
     }
 
-    private fun getTargetIntent(): Intent {
+    private fun getHandheldTargetIntent(): Intent {
         return when (intent.action) {
             HealthConnectManager.ACTION_HEALTH_HOME_SETTINGS -> {
                 Intent(this, MainActivity::class.java)
@@ -102,4 +112,23 @@
             }
         }
     }
+
+    // Returns an intent to handle Wear request.
+    private fun getWearTargetIntent(): Intent {
+        if (intent.action != HealthConnectManager.ACTION_MANAGE_HEALTH_PERMISSIONS) {
+            Log.e(TAG, "getWearTargetIntent() has unexpected intent action: " + intent.action)
+            // If unexpected intent, fall default to WearPermissionManagerActivity.
+        }
+        val extraPackageName: String? = intent.getStringExtra(EXTRA_PACKAGE_NAME)
+
+        return if (extraPackageName != null) {
+            // AppInfo page.
+            Intent(this, WearViewAppInfoPermissionsActivity::class.java).apply {
+                putExtra(EXTRA_PACKAGE_NAME, extraPackageName)
+            }
+        } else {
+            // PermissionManager page.
+            Intent(this, WearSettingsPermissionActivity::class.java)
+        }
+    }
 }
diff --git a/apk/src/com/android/healthconnect/controller/onboarding/OnboardingActivity.kt b/apk/src/com/android/healthconnect/controller/onboarding/OnboardingActivity.kt
index c006074..c339a93 100644
--- a/apk/src/com/android/healthconnect/controller/onboarding/OnboardingActivity.kt
+++ b/apk/src/com/android/healthconnect/controller/onboarding/OnboardingActivity.kt
@@ -22,8 +22,10 @@
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
+import android.view.View
 import android.view.WindowManager
 import android.widget.Button
+import android.widget.TextView
 import androidx.fragment.app.FragmentActivity
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.shared.Constants.ONBOARDING_SHOWN_PREF_KEY
@@ -31,6 +33,7 @@
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.OnboardingElement
 import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
@@ -71,18 +74,29 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         // This flag ensures a non system app cannot show an overlay on Health Connect. b/313425281
-        window.addSystemFlags(WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
+        window.addSystemFlags(
+            WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
+        )
         setContentView(R.layout.onboarding_screen)
 
         if (intent.hasExtra(TARGET_ACTIVITY_INTENT)) {
-            targetIntent =
-                intent.getParcelableExtra(
-                    TARGET_ACTIVITY_INTENT,
-                )
+            targetIntent = intent.getParcelableExtra(TARGET_ACTIVITY_INTENT)
         }
 
         logger.setPageId(PageName.ONBOARDING_PAGE)
 
+        val onboardingDescription = findViewById<TextView>(R.id.onboarding_description)
+        val withHealthConnectTitle =
+            findViewById<TextView>(R.id.onboarding_description_with_health_connect)
+        if (isPersonalHealthRecordEnabled()) {
+            onboardingDescription.setText(R.string.onboarding_description_health_records)
+            withHealthConnectTitle.setVisibility(View.VISIBLE)
+            logger.logImpression(OnboardingElement.ONBOARDING_MESSAGE_WITH_PHR)
+        } else {
+            onboardingDescription.setText(R.string.onboarding_description)
+            withHealthConnectTitle.setVisibility(View.GONE)
+        }
+
         val sharedPreference = getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
         val goBackButton = findViewById<Button>(R.id.go_back_button)
         val getStartedButton = findViewById<Button>(R.id.get_started_button)
diff --git a/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/AdditionalAccessFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/AdditionalAccessFragment.kt
index 89811b5..978075e 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/AdditionalAccessFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/AdditionalAccessFragment.kt
@@ -23,17 +23,23 @@
 import android.os.Bundle
 import android.util.Log
 import android.view.View
+import androidx.core.os.bundleOf
 import androidx.fragment.app.activityViewModels
+import androidx.navigation.fragment.findNavController
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.permissions.additionalaccess.PermissionUiState.ALWAYS_ALLOW
 import com.android.healthconnect.controller.permissions.additionalaccess.PermissionUiState.ASK_EVERY_TIME
 import com.android.healthconnect.controller.permissions.additionalaccess.PermissionUiState.NOT_DECLARED
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel
-import com.android.healthconnect.controller.permissions.data.AdditionalPermissionStrings
+import com.android.healthconnect.controller.permissions.data.AccessType
 import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.additionalPermissionString
+import com.android.healthconnect.controller.shared.Constants.EXTRA_APP_NAME
+import com.android.healthconnect.controller.shared.Constants.SHOW_MANAGE_APP_SECTION
 import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
+import com.android.healthconnect.controller.shared.preference.WarningPreference
 import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import com.android.healthconnect.controller.utils.logging.AdditionalAccessElement.BACKGROUND_READ_BUTTON
 import com.android.healthconnect.controller.utils.logging.AdditionalAccessElement.EXERCISE_ROUTES_BUTTON
@@ -59,6 +65,7 @@
     private val historicReadPref: HealthSwitchPreference by pref(KEY_HISTORY_READ_PERMISSION)
     private val backgroundReadPref: HealthSwitchPreference by pref(KEY_BACKGROUND_READ_PERMISSION)
     private val footerPref: FooterPreference by pref(KEY_FOOTER)
+    private val warningPref: WarningPreference by pref(KEY_WARNING)
 
     private val dateFormatter by lazy { LocalDateTimeFormatter(requireContext()) }
 
@@ -84,10 +91,6 @@
         }
         packageName = packageNameExtra
 
-        viewModel.additionalAccessState.observe(viewLifecycleOwner) { state ->
-            setupAdditionalPrefs(state)
-        }
-
         viewModel.showEnableExerciseEvent.observe(viewLifecycleOwner) { state ->
             if (state.shouldShowDialog) {
                 EnableExercisePermissionDialog.createDialog(packageName, state.appName)
@@ -95,6 +98,11 @@
             }
         }
 
+        viewModel.screenState.observe(viewLifecycleOwner) { screenState ->
+            setupAdditionalPrefs(screenState)
+            maybeShowFooter(screenState.state, screenState.showMedicalPastDataFooter)
+        }
+
         permissionsViewModel.appInfo.observe(viewLifecycleOwner) { appMetaData ->
             header.apply {
                 icon = appMetaData.icon
@@ -122,7 +130,8 @@
                     ASK_EVERY_TIME -> R.string.route_permissions_ask
                     ALWAYS_ALLOW -> R.string.route_permissions_always_allow
                     else -> R.string.route_permissions_deny
-                })
+                }
+            )
             exerciseRoutePref.setOnPreferenceClickListener {
                 val dialog = ExerciseRoutesPermissionDialogFragment.createDialog(packageName)
                 dialog.show(childFragmentManager, EXERCISE_ROUTES_DIALOG_TAG)
@@ -131,17 +140,45 @@
         }
     }
 
-    private fun maybeShowFooter(state: AdditionalAccessViewModel.State) {
-        val shouldShow = state.showFooter()
+    private fun maybeShowFooter(
+        state: AdditionalAccessViewModel.State,
+        showMedicalPastDataFooter: Boolean,
+    ) {
+        // We show a different message when medical read is on and history read is available
+        // to let the user know that medical data is already read from the past
+        val shouldShow = state.showEnableReadFooter() || showMedicalPastDataFooter
 
         if (!shouldShow) {
             footerPref.isVisible = false
             return
         }
 
+        if (showMedicalPastDataFooter) {
+            footerPref.isVisible = true
+            val appName = permissionsViewModel.appInfo.value!!.appName
+            footerPref.title = getString(R.string.additional_access_medical_read_footer, appName)
+            footerPref.setLearnMoreText(
+                getString(R.string.additional_access_medical_read_footer_link)
+            )
+            footerPref.setLearnMoreAction {
+                findNavController()
+                    .navigate(
+                        R.id.action_additionalAccess_to_medicalApp,
+                        bundleOf(
+                            EXTRA_PACKAGE_NAME to packageName,
+                            EXTRA_APP_NAME to appName,
+                            SHOW_MANAGE_APP_SECTION to false,
+                        ),
+                    )
+            }
+            return
+        }
+
         val title =
-            if (state.isAdditionalPermissionDisabled(state.historyReadUIState) &&
-                state.isAdditionalPermissionDisabled(state.backgroundReadUIState)) {
+            if (
+                state.isAdditionalPermissionDisabled(state.historyReadUIState) &&
+                    state.isAdditionalPermissionDisabled(state.backgroundReadUIState)
+            ) {
                 R.string.additional_access_combined_footer
             } else if (state.isAdditionalPermissionDisabled(state.backgroundReadUIState)) {
                 R.string.additional_access_background_footer
@@ -153,55 +190,101 @@
         footerPref.isVisible = true
     }
 
-    private fun setupAdditionalPrefs(state: AdditionalAccessViewModel.State) {
-        setupExerciseRoutePref(state.exerciseRoutePermissionUIState)
-        maybeShowFooter(state)
+    private fun setupAdditionalPrefs(screenState: AdditionalAccessViewModel.ScreenState) {
+        setupExerciseRoutePref(screenState.state.exerciseRoutePermissionUIState)
 
-        if (state.historyReadUIState.isDeclared) {
-            val permStrings =
-                AdditionalPermissionStrings.fromAdditionalPermission(
-                    HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY)
+        if (screenState.state.historyReadUIState.isDeclared) {
+            val appName = permissionsViewModel.appInfo.value!!.appName
+
+            val historyReadStrings =
+                additionalPermissionString(
+                    HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY,
+                    type = AccessType.ACCESS,
+                    hasMedicalPermissions = screenState.appHasDeclaredMedicalPermissions,
+                    isMedicalReadGranted = false, // doesn't matter here
+                    isFitnessReadGranted = false, // doesn't matter here
+                )
 
             val dataAccessDate = viewModel.loadAccessDate(packageName)
             val summary =
                 if (dataAccessDate != null) {
                     val formattedDate = dateFormatter.formatLongDate(dataAccessDate)
-                    getString(permStrings.permissionDescription, formattedDate)
+                    getString(historyReadStrings.description, formattedDate)
                 } else {
-                    getString(permStrings.permissionDescriptionFallback)
+                    getString(historyReadStrings.descriptionFallback)
                 }
 
+            historicReadPref.title = getString(historyReadStrings.title)
             historicReadPref.isVisible = true
             healthConnectLogger.logImpression(HISTORY_READ_BUTTON)
-            historicReadPref.isChecked = state.historyReadUIState.isGranted
-            historicReadPref.isEnabled = state.historyReadUIState.isEnabled
+            historicReadPref.isChecked = screenState.state.historyReadUIState.isGranted
+            historicReadPref.isEnabled = screenState.state.historyReadUIState.isEnabled
             historicReadPref.summary = summary
             historicReadPref.logNameActive = HISTORY_READ_BUTTON
             historicReadPref.logNameInactive = HISTORY_READ_BUTTON
-            historicReadPref.setOnPreferenceChangeListener { _, newValue ->
+            historicReadPref.setOnPreferenceChangeListener { _, isGranted ->
                 viewModel.updatePermission(
-                    packageName, HealthPermissions.READ_HEALTH_DATA_HISTORY, newValue as Boolean)
+                    packageName,
+                    HealthPermissions.READ_HEALTH_DATA_HISTORY,
+                    isGranted as Boolean,
+                )
+
+                updateWarningPreference(
+                    appName,
+                    screenState.state.historyReadUIState.isEnabled,
+                    isGranted,
+                    screenState.appHasGrantedFitnessReadPermission,
+                )
                 true
             }
+
+            updateWarningPreference(
+                appName,
+                screenState.state.historyReadUIState.isEnabled,
+                screenState.state.historyReadUIState.isGranted,
+                screenState.appHasGrantedFitnessReadPermission,
+            )
         }
 
-        if (state.backgroundReadUIState.isDeclared) {
+        if (screenState.state.backgroundReadUIState.isDeclared) {
+            val backgroundReadString =
+                additionalPermissionString(
+                    HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+                    type = AccessType.ACCESS,
+                    hasMedicalPermissions = screenState.appHasDeclaredMedicalPermissions,
+                    isMedicalReadGranted = screenState.showMedicalPastDataFooter,
+                    isFitnessReadGranted = screenState.appHasGrantedFitnessReadPermission,
+                )
+
+            backgroundReadPref.title = getString(backgroundReadString.title)
+            backgroundReadPref.summary = getString(backgroundReadString.description)
             backgroundReadPref.isVisible = true
             healthConnectLogger.logImpression(BACKGROUND_READ_BUTTON)
-            backgroundReadPref.isChecked = state.backgroundReadUIState.isGranted
-            backgroundReadPref.isEnabled = state.backgroundReadUIState.isEnabled
+            backgroundReadPref.isChecked = screenState.state.backgroundReadUIState.isGranted
+            backgroundReadPref.isEnabled = screenState.state.backgroundReadUIState.isEnabled
             historicReadPref.logNameActive = BACKGROUND_READ_BUTTON
             historicReadPref.logNameInactive = BACKGROUND_READ_BUTTON
             backgroundReadPref.setOnPreferenceChangeListener { _, newValue ->
                 viewModel.updatePermission(
                     packageName,
                     HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND,
-                    newValue as Boolean)
+                    newValue as Boolean,
+                )
                 true
             }
         }
     }
 
+    private fun updateWarningPreference(
+        appName: String,
+        isEnabled: Boolean,
+        isGranted: Boolean,
+        anyFitnessReadPermissionGranted: Boolean,
+    ) {
+        warningPref.setTitle(getString(R.string.history_read_medical_access_read_warning, appName))
+        warningPref.isVisible = isGranted && isEnabled && !anyFitnessReadPermissionGranted
+    }
+
     companion object {
         private const val TAG = "AdditionalAccessFragmen"
         private const val PREF_APP_HEADER = "manage_app_permission_header"
@@ -210,6 +293,7 @@
         private const val ENABLE_EXERCISE_DIALOG_TAG = "EnableExercisePermissionDialog"
         private const val KEY_BACKGROUND_READ_PERMISSION = "key_background_read"
         private const val KEY_HISTORY_READ_PERMISSION = "key_history_read"
+        private const val KEY_WARNING = "key_warning"
         private const val KEY_FOOTER = "key_additional_access_footer"
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/AdditionalAccessViewModel.kt b/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/AdditionalAccessViewModel.kt
index 587dc4d..d17f453 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/AdditionalAccessViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/AdditionalAccessViewModel.kt
@@ -35,12 +35,12 @@
 import com.android.healthconnect.controller.permissions.api.LoadAccessDateUseCase
 import com.android.healthconnect.controller.permissions.api.RevokeHealthPermissionUseCase
 import com.android.healthconnect.controller.permissions.api.SetHealthPermissionsUserFixedFlagValueUseCase
-import com.android.healthconnect.controller.permissions.data.HealthPermission
-import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isFitnessReadPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalReadPermission
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
-import com.android.healthconnect.controller.utils.FeatureUtils
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
 import kotlinx.coroutines.launch
@@ -50,7 +50,6 @@
 class AdditionalAccessViewModel
 @Inject
 constructor(
-    private val featureUtils: FeatureUtils,
     private val appInfoReader: AppInfoReader,
     private val loadExerciseRoutePermissionUseCase: LoadExerciseRoutePermissionUseCase,
     private val grantHealthPermissionUseCase: GrantHealthPermissionUseCase,
@@ -59,7 +58,8 @@
         SetHealthPermissionsUserFixedFlagValueUseCase,
     private val getAdditionalPermissionUseCase: GetAdditionalPermissionUseCase,
     private val getGrantedHealthPermissionsUseCase: GetGrantedHealthPermissionsUseCase,
-    private val loadAccessDateUseCase: LoadAccessDateUseCase
+    private val loadAccessDateUseCase: LoadAccessDateUseCase,
+    private val loadDeclaredHealthPermissionUseCase: LoadDeclaredHealthPermissionUseCase,
 ) : ViewModel() {
 
     private val _additionalAccessState = MutableLiveData<State>()
@@ -69,19 +69,27 @@
     private val _showEnableExerciseEvent = MutableLiveData(false)
     private val _appInfo = MutableLiveData<AppMetadata>()
 
+    private val _screenState = MutableLiveData<ScreenState>()
+    val screenState: LiveData<ScreenState>
+        get() = _screenState
+
     val showEnableExerciseEvent =
         MediatorLiveData(EnableExerciseDialogEvent()).apply {
             addSource(_showEnableExerciseEvent) {
                 postValue(
                     EnableExerciseDialogEvent(
                         shouldShowDialog = _showEnableExerciseEvent.value ?: false,
-                        appName = _appInfo.value?.appName ?: ""))
+                        appName = _appInfo.value?.appName ?: "",
+                    )
+                )
             }
             addSource(_appInfo) {
                 postValue(
                     EnableExerciseDialogEvent(
                         shouldShowDialog = _showEnableExerciseEvent.value ?: false,
-                        appName = _appInfo.value?.appName ?: ""))
+                        appName = _appInfo.value?.appName ?: "",
+                    )
+                )
             }
         }
 
@@ -92,29 +100,37 @@
         viewModelScope.launch {
             _appInfo.postValue(appInfoReader.getAppMetadata(packageName))
             var newState = State()
-            if (featureUtils.isExerciseRouteReadAllEnabled()) {
-                newState =
-                    when (val result = loadExerciseRoutePermissionUseCase(packageName)) {
-                        is UseCaseResults.Success -> {
-                            newState.copy(
-                                exerciseRoutePermissionUIState =
-                                    result.data.exerciseRoutePermissionState,
-                                exercisePermissionUIState = result.data.exercisePermissionState)
-                        }
-                        else -> {
-                            newState.copy(
-                                exerciseRoutePermissionUIState = NOT_DECLARED,
-                                exercisePermissionUIState = NOT_DECLARED)
-                        }
+            newState =
+                when (val result = loadExerciseRoutePermissionUseCase(packageName)) {
+                    is UseCaseResults.Success -> {
+                        newState.copy(
+                            exerciseRoutePermissionUIState =
+                                result.data.exerciseRoutePermissionState,
+                            exercisePermissionUIState = result.data.exercisePermissionState,
+                        )
                     }
-            }
+                    else -> {
+                        newState.copy(
+                            exerciseRoutePermissionUIState = NOT_DECLARED,
+                            exercisePermissionUIState = NOT_DECLARED,
+                        )
+                    }
+                }
 
             val additionalPermissions = getAdditionalPermissionUseCase(packageName)
             val grantedPermissions = getGrantedHealthPermissionsUseCase.invoke(packageName)
-            val isAnyReadPermissionGranted =
-                grantedPermissions.any { permission -> isDataTypeReadPermission(permission) }
-            if (featureUtils.isBackgroundReadEnabled() &&
-                additionalPermissions.contains(HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND)) {
+            val declaredPermissions = loadDeclaredHealthPermissionUseCase.invoke(packageName)
+
+            val isAnyHealthReadPermissionGranted =
+                grantedPermissions.any {
+                    isFitnessReadPermission(it) || isMedicalReadPermission(it)
+                }
+            val isAnyMedicalReadPermissionGranted =
+                grantedPermissions.any { isMedicalReadPermission(it) }
+
+            var shouldShowMedicalPastDataFooter = false
+
+            if (additionalPermissions.contains(HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND)) {
                 newState =
                     newState.copy(
                         backgroundReadUIState =
@@ -122,11 +138,13 @@
                                 isDeclared = true,
                                 isGranted =
                                     grantedPermissions.contains(
-                                        HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND),
-                                isEnabled = isAnyReadPermissionGranted))
+                                        HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND
+                                    ),
+                                isEnabled = isAnyHealthReadPermissionGranted,
+                            )
+                    )
             }
-            if (featureUtils.isHistoryReadEnabled() &&
-                additionalPermissions.contains(HealthPermissions.READ_HEALTH_DATA_HISTORY)) {
+            if (additionalPermissions.contains(HealthPermissions.READ_HEALTH_DATA_HISTORY)) {
                 newState =
                     newState.copy(
                         historyReadUIState =
@@ -134,25 +152,37 @@
                                 isDeclared = true,
                                 isGranted =
                                     grantedPermissions.contains(
-                                        HealthPermissions.READ_HEALTH_DATA_HISTORY),
-                                isEnabled = isAnyReadPermissionGranted))
+                                        HealthPermissions.READ_HEALTH_DATA_HISTORY
+                                    ),
+                                isEnabled = isAnyHealthReadPermissionGranted,
+                            )
+                    )
+                // Only true if READ_HEALTH_DATA_HISTORY is declared and any medical read
+                // permissions granted
+                shouldShowMedicalPastDataFooter = isAnyMedicalReadPermissionGranted
             }
 
             _additionalAccessState.postValue(newState)
+            _screenState.postValue(
+                ScreenState(
+                    state = newState,
+                    appHasDeclaredMedicalPermissions =
+                        declaredPermissions.any { isMedicalPermission(it) },
+                    appHasGrantedFitnessReadPermission =
+                        grantedPermissions.any { isFitnessReadPermission(it) },
+                    showMedicalPastDataFooter = shouldShowMedicalPastDataFooter,
+                )
+            )
         }
     }
 
-    private fun isDataTypeReadPermission(permission: String): Boolean {
-        val healthPermission = HealthPermission.fromPermissionString(permission)
-        return ((healthPermission is HealthPermission.FitnessPermission) &&
-            healthPermission.permissionsAccessType == PermissionsAccessType.READ)
-    }
-
     /** Updates exercise route permission state and refreshes the screen state. */
     fun updateExerciseRouteState(packageName: String, exerciseRouteNewState: PermissionUiState) {
         val screenState = _additionalAccessState.value
-        if (screenState == null ||
-            screenState.exerciseRoutePermissionUIState == exerciseRouteNewState)
+        if (
+            screenState == null ||
+                screenState.exerciseRoutePermissionUIState == exerciseRouteNewState
+        )
             return
         when (exerciseRouteNewState) {
             ALWAYS_ALLOW -> {
@@ -169,7 +199,10 @@
                     revokeHealthPermissionUseCase(packageName, READ_EXERCISE_ROUTES)
                 } else if (screenState.exerciseRoutePermissionUIState == NEVER_ALLOW) {
                     setHealthPermissionsUserFixedFlagValueUseCase(
-                        packageName, listOf(READ_EXERCISE_ROUTES), false)
+                        packageName,
+                        listOf(READ_EXERCISE_ROUTES),
+                        false,
+                    )
                 }
             }
             else -> {
@@ -177,7 +210,10 @@
                     revokeHealthPermissionUseCase(packageName, READ_EXERCISE_ROUTES)
                 }
                 setHealthPermissionsUserFixedFlagValueUseCase(
-                    packageName, listOf(READ_EXERCISE_ROUTES), true)
+                    packageName,
+                    listOf(READ_EXERCISE_ROUTES),
+                    true,
+                )
             }
         }
         // refresh the ui
@@ -212,7 +248,7 @@
         val exerciseRoutePermissionUIState: PermissionUiState = NOT_DECLARED,
         val exercisePermissionUIState: PermissionUiState = NOT_DECLARED,
         val backgroundReadUIState: AdditionalPermissionState = AdditionalPermissionState(),
-        val historyReadUIState: AdditionalPermissionState = AdditionalPermissionState()
+        val historyReadUIState: AdditionalPermissionState = AdditionalPermissionState(),
     ) {
 
         /**
@@ -222,18 +258,26 @@
          * Used by [SettingsManageAppPermissionsFragment] to decide to show additional access entry
          * point.
          */
-        fun isValid(): Boolean {
+        fun isAvailable(): Boolean {
             return (exerciseRoutePermissionUIState != NOT_DECLARED &&
                 exercisePermissionUIState != NOT_DECLARED) ||
                 backgroundReadUIState.isDeclared ||
                 historyReadUIState.isDeclared
         }
 
-        fun showFooter(): Boolean {
+        /**
+         * Whether to show the footer in additional permissions informing the user they need at
+         * least one read permission in order to toggle the permissions on.
+         */
+        fun showEnableReadFooter(): Boolean {
             return isAdditionalPermissionDisabled(backgroundReadUIState) ||
                 isAdditionalPermissionDisabled(historyReadUIState)
         }
 
+        /**
+         * Whether the toggle for this permission is disabled due to missing fitness or medical read
+         * permissions.
+         */
         fun isAdditionalPermissionDisabled(
             additionalPermissionState: AdditionalPermissionState
         ): Boolean {
@@ -244,11 +288,21 @@
     data class AdditionalPermissionState(
         val isDeclared: Boolean = false,
         val isEnabled: Boolean = false,
-        val isGranted: Boolean = false
+        val isGranted: Boolean = false,
     )
 
     data class EnableExerciseDialogEvent(
         val shouldShowDialog: Boolean = false,
-        val appName: String = ""
+        val appName: String = "",
+    )
+
+    data class ScreenState(
+        val state: State = State(),
+        // Controls whether to show the new additional permission strings
+        val appHasDeclaredMedicalPermissions: Boolean = false,
+        // Controls whether to show the warning message
+        val appHasGrantedFitnessReadPermission: Boolean = false,
+        // Controls whether to show the medical past data footer
+        val showMedicalPastDataFooter: Boolean = false,
     )
 }
diff --git a/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/LoadDeclaredHealthPermissionUseCase.kt b/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/LoadDeclaredHealthPermissionUseCase.kt
index 894d922..c7a383c 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/LoadDeclaredHealthPermissionUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/additionalaccess/LoadDeclaredHealthPermissionUseCase.kt
@@ -19,6 +19,7 @@
 package com.android.healthconnect.controller.permissions.additionalaccess
 
 import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -27,6 +28,10 @@
 @Inject
 constructor(private val healthPermissionReader: HealthPermissionReader) {
     operator fun invoke(packageName: String): List<String> {
-        return healthPermissionReader.getDeclaredHealthPermissions(packageName)
+        return if (isPersonalHealthRecordEnabled()) {
+            healthPermissionReader.getValidHealthPermissions(packageName).map { it.toString() }
+        } else {
+            healthPermissionReader.getDeclaredHealthPermissions(packageName)
+        }
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/permissions/api/GetHealthPermissionsFlagsUseCase.kt b/apk/src/com/android/healthconnect/controller/permissions/api/GetHealthPermissionsFlagsUseCase.kt
index 7f51ecb..257a2d5 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/api/GetHealthPermissionsFlagsUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/api/GetHealthPermissionsFlagsUseCase.kt
@@ -20,7 +20,7 @@
 import javax.inject.Inject
 import javax.inject.Singleton
 
-/** Use case to get health permissions flags for an app. */
+/** Use case to get permission flags for the declared health permissions of an app. */
 @Singleton
 class GetHealthPermissionsFlagsUseCase
 @Inject
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/AppPermissionViewModel.kt b/apk/src/com/android/healthconnect/controller/permissions/app/AppPermissionViewModel.kt
index 7e02e89..4911c79 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/app/AppPermissionViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/AppPermissionViewModel.kt
@@ -17,13 +17,14 @@
 import android.health.connect.HealthPermissions.READ_EXERCISE_ROUTES
 import android.health.connect.TimeInstantRangeFilter
 import android.util.Log
+import androidx.annotation.VisibleForTesting
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MediatorLiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
-import com.android.healthconnect.controller.deletion.DeletionType
-import com.android.healthconnect.controller.deletion.api.DeleteAppDataUseCase
+import com.android.healthconnect.controller.deletion.DeletionType.DeletionTypeAppData
+import com.android.healthconnect.controller.deletion.api.DeleteAppDataUseCase as OldDeleteAppDataUseCase
 import com.android.healthconnect.controller.permissions.additionalaccess.ILoadExerciseRoutePermissionUseCase
 import com.android.healthconnect.controller.permissions.additionalaccess.PermissionUiState.ALWAYS_ALLOW
 import com.android.healthconnect.controller.permissions.api.GrantHealthPermissionUseCase
@@ -31,17 +32,21 @@
 import com.android.healthconnect.controller.permissions.api.LoadAccessDateUseCase
 import com.android.healthconnect.controller.permissions.api.RevokeAllHealthPermissionsUseCase
 import com.android.healthconnect.controller.permissions.api.RevokeHealthPermissionUseCase
-import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission.Companion.fromPermissionString
 import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
+import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteAppData
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAppDataUseCase
 import com.android.healthconnect.controller.service.IoDispatcher
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
-import com.android.healthconnect.controller.utils.FeatureUtils
+import com.android.healthfitness.flags.Flags.newInformationArchitecture
+import com.android.healthfitness.flags.Flags.personalHealthRecord
 import dagger.hilt.android.lifecycle.HiltViewModel
 import java.time.Instant
 import javax.inject.Inject
@@ -60,11 +65,11 @@
     private val revokePermissionsStatusUseCase: RevokeHealthPermissionUseCase,
     private val revokeAllHealthPermissionsUseCase: RevokeAllHealthPermissionsUseCase,
     private val deleteAppDataUseCase: DeleteAppDataUseCase,
+    private val oldDeleteAppDataUseCase: OldDeleteAppDataUseCase,
     private val loadAccessDateUseCase: LoadAccessDateUseCase,
     private val loadGrantedHealthPermissionsUseCase: IGetGrantedHealthPermissionsUseCase,
     private val loadExerciseRoutePermissionUseCase: ILoadExerciseRoutePermissionUseCase,
     private val healthPermissionReader: HealthPermissionReader,
-    private val featureUtils: FeatureUtils,
     @IoDispatcher private val ioDispatcher: CoroutineDispatcher,
 ) : ViewModel() {
 
@@ -109,6 +114,13 @@
     val grantedMedicalPermissions: LiveData<Set<MedicalPermission>>
         get() = _grantedMedicalPermissions
 
+    private var _additionalPermissions = MutableLiveData<List<AdditionalPermission>>(emptyList())
+    private var _grantedAdditionalPermissions =
+        MutableLiveData<Set<AdditionalPermission>>(emptySet())
+    @VisibleForTesting
+    val grantedAdditionalPermissions: LiveData<Set<AdditionalPermission>>
+        get() = _grantedAdditionalPermissions
+
     val allMedicalPermissionsGranted =
         MediatorLiveData(false).apply {
             addSource(_medicalPermissions) {
@@ -140,6 +152,57 @@
             }
         }
 
+    private fun atLeastOneMedicalReadPermissionGranted(): Boolean =
+        _grantedMedicalPermissions.value
+            .orEmpty()
+            .filterNot { perm ->
+                perm.medicalPermissionType == MedicalPermissionType.ALL_MEDICAL_DATA
+            }
+            .isNotEmpty()
+
+    private fun atLeastOneFitnessReadPermissionGranted(): Boolean =
+        _grantedFitnessPermissions.value.orEmpty().any { perm ->
+            perm.permissionsAccessType == PermissionsAccessType.READ
+        }
+
+    fun revokeFitnessShouldIncludeBackground(): Boolean =
+        _additionalPermissions.value
+            .orEmpty()
+            .contains(AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND) &&
+            atLeastOneFitnessReadPermissionGranted() &&
+            !atLeastOneMedicalReadPermissionGranted()
+
+    fun revokeFitnessShouldIncludePastData(): Boolean =
+        _additionalPermissions.value
+            .orEmpty()
+            .contains(AdditionalPermission.READ_HEALTH_DATA_HISTORY) &&
+            atLeastOneFitnessReadPermissionGranted() &&
+            !atLeastOneMedicalReadPermissionGranted()
+
+    fun revokeMedicalShouldIncludeBackground(): Boolean =
+        _additionalPermissions.value
+            .orEmpty()
+            .contains(AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND) &&
+            atLeastOneMedicalReadPermissionGranted() &&
+            !atLeastOneFitnessReadPermissionGranted()
+
+    fun revokeMedicalShouldIncludePastData(): Boolean =
+        _additionalPermissions.value
+            .orEmpty()
+            .contains(AdditionalPermission.READ_HEALTH_DATA_HISTORY) &&
+            atLeastOneMedicalReadPermissionGranted() &&
+            !atLeastOneFitnessReadPermissionGranted()
+
+    fun revokeAllShouldIncludeBackground(): Boolean =
+        _additionalPermissions.value
+            .orEmpty()
+            .contains(AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND)
+
+    fun revokeAllShouldIncludePastData(): Boolean =
+        _additionalPermissions.value
+            .orEmpty()
+            .contains(AdditionalPermission.READ_HEALTH_DATA_HISTORY)
+
     private val _appInfo = MutableLiveData<AppMetadata>()
     val appInfo: LiveData<AppMetadata>
         get() = _appInfo
@@ -182,7 +245,7 @@
     val lastReadPermissionDisconnected: LiveData<Boolean>
         get() = _lastReadPermissionDisconnected
 
-    private var grantedAdditionalPermissions: List<String> = emptyList()
+    private val newDeletionFlow = personalHealthRecord() || newInformationArchitecture()
 
     fun loadPermissionsForPackage(packageName: String) {
         // clear app permissions
@@ -190,6 +253,8 @@
         _grantedFitnessPermissions.postValue(emptySet())
         _medicalPermissions.postValue(emptyList())
         _grantedMedicalPermissions.postValue(emptySet())
+        _additionalPermissions.postValue(emptyList())
+        _grantedAdditionalPermissions.postValue(emptySet())
 
         viewModelScope.launch { _appInfo.postValue(appInfoReader.getAppMetadata(packageName)) }
         if (isPackageSupported(packageName)) {
@@ -228,12 +293,19 @@
                     .filterIsInstance<MedicalPermission>()
                     .toSet()
             )
-            grantedAdditionalPermissions =
+            // invalid additional permissions filtered in the useCase
+            _additionalPermissions.postValue(
+                healthPermissionsList
+                    .map { it.healthPermission }
+                    .filterIsInstance<AdditionalPermission>()
+            )
+            _grantedAdditionalPermissions.postValue(
                 healthPermissionsList
                     .filter { it.isGranted }
                     .map { it.healthPermission }
-                    .filterIsInstance<HealthPermission.AdditionalPermission>()
-                    .map { it.additionalPermission }
+                    .filterIsInstance<AdditionalPermission>()
+                    .toSet()
+            )
         }
     }
 
@@ -268,6 +340,13 @@
                         .filterIsInstance<MedicalPermission>()
                         .toSet()
                 )
+
+                _grantedAdditionalPermissions.postValue(
+                    grantedPermissions
+                        .map { it.healthPermission }
+                        .filterIsInstance<AdditionalPermission>()
+                        .toSet()
+                )
             }
             shouldLoadGrantedPermissions = false
         }
@@ -289,7 +368,7 @@
                 if (shouldDisplayExerciseRouteDialog(packageName, fitnessPermission)) {
                     _showDisableExerciseRouteEvent.postValue(true)
                 } else {
-                    revokePermission(fitnessPermission, packageName)
+                    revokeFitnessPermission(fitnessPermission, packageName)
                 }
             }
 
@@ -300,6 +379,28 @@
         return false
     }
 
+    fun updateAdditionalPermission(
+        packageName: String,
+        additionalPermission: AdditionalPermission,
+        grant: Boolean
+    ) : Boolean {
+        try {
+            val grantedPermissions = _grantedAdditionalPermissions.value.orEmpty().toMutableSet()
+            if (grant) {
+                grantPermissionsStatusUseCase.invoke(packageName,additionalPermission.toString())
+                grantedPermissions.add(additionalPermission)
+            } else {
+                revokePermissionsStatusUseCase.invoke(packageName, additionalPermission.toString())
+                grantedPermissions.remove(additionalPermission)
+            }
+            _grantedAdditionalPermissions.postValue(grantedPermissions)
+            return true
+        } catch (ex: Exception) {
+            Log.e(TAG, "Failed to update additional permission!", ex)
+        }
+        return false
+    }
+
     fun updatePermission(
         packageName: String,
         medicalPermission: MedicalPermission,
@@ -309,7 +410,7 @@
             if (grant) {
                 grantPermission(packageName, medicalPermission)
             } else {
-                revokePermission(medicalPermission, packageName)
+                revokeMedicalPermission(medicalPermission, packageName)
             }
 
             return true
@@ -333,27 +434,37 @@
         _grantedMedicalPermissions.postValue(grantedPermissions)
     }
 
-    private fun revokePermission(fitnessPermission: FitnessPermission, packageName: String) {
-        val grantedPermissions = _grantedFitnessPermissions.value.orEmpty().toMutableSet()
+    private fun revokeFitnessPermission(fitnessPermission: FitnessPermission, packageName: String) {
+        val grantedFitnessPermissions = _grantedFitnessPermissions.value.orEmpty().toMutableSet()
+        val grantedMedicalPermissions = _grantedMedicalPermissions.value.orEmpty()
+
         val readPermissionsBeforeDisconnect =
-            grantedPermissions.count { permission ->
+            grantedFitnessPermissions.count { permission ->
                 permission.permissionsAccessType == PermissionsAccessType.READ
-            }
-        grantedPermissions.remove(fitnessPermission)
+            } +
+                grantedMedicalPermissions.count { medicalPermission ->
+                    medicalPermission.medicalPermissionType !=
+                        MedicalPermissionType.ALL_MEDICAL_DATA
+                }
+        grantedFitnessPermissions.remove(fitnessPermission)
         val readPermissionsAfterDisconnect =
-            grantedPermissions.count { permission ->
+            grantedFitnessPermissions.count { permission ->
                 permission.permissionsAccessType == PermissionsAccessType.READ
-            }
-        _grantedFitnessPermissions.postValue(grantedPermissions)
+            } +
+                grantedMedicalPermissions.count { medicalPermission ->
+                    medicalPermission.medicalPermissionType !=
+                        MedicalPermissionType.ALL_MEDICAL_DATA
+                }
+        _grantedFitnessPermissions.postValue(grantedFitnessPermissions)
 
         val lastReadPermissionRevoked =
-            grantedAdditionalPermissions.isNotEmpty() &&
+            _grantedAdditionalPermissions.value.orEmpty().isNotEmpty() &&
                 (readPermissionsBeforeDisconnect > readPermissionsAfterDisconnect) &&
                 readPermissionsAfterDisconnect == 0
 
         if (lastReadPermissionRevoked) {
-            grantedAdditionalPermissions.forEach { permission ->
-                revokePermissionsStatusUseCase.invoke(packageName, permission)
+            _grantedAdditionalPermissions.value.orEmpty().forEach { permission ->
+                revokePermissionsStatusUseCase.invoke(packageName, permission.additionalPermission)
             }
         }
 
@@ -361,10 +472,39 @@
         revokePermissionsStatusUseCase.invoke(packageName, fitnessPermission.toString())
     }
 
-    private fun revokePermission(medicalPermission: MedicalPermission, packageName: String) {
-        val grantedPermissions = _grantedMedicalPermissions.value.orEmpty().toMutableSet()
-        grantedPermissions.remove(medicalPermission)
-        _grantedMedicalPermissions.postValue(grantedPermissions)
+    private fun revokeMedicalPermission(medicalPermission: MedicalPermission, packageName: String) {
+        val grantedMedicalPermissions = _grantedMedicalPermissions.value.orEmpty().toMutableSet()
+        val grantedFitnessPermissions = _grantedFitnessPermissions.value.orEmpty()
+
+        val readPermissionsBeforeDisconnect =
+            grantedFitnessPermissions.count { permission ->
+                permission.permissionsAccessType == PermissionsAccessType.READ
+            } +
+                grantedMedicalPermissions.count { permission ->
+                    permission.medicalPermissionType != MedicalPermissionType.ALL_MEDICAL_DATA
+                }
+        grantedMedicalPermissions.remove(medicalPermission)
+        val readPermissionsAfterDisconnect =
+            grantedFitnessPermissions.count { permission ->
+                permission.permissionsAccessType == PermissionsAccessType.READ
+            } +
+                grantedMedicalPermissions.count { permission ->
+                    permission.medicalPermissionType != MedicalPermissionType.ALL_MEDICAL_DATA
+                }
+        _grantedMedicalPermissions.postValue(grantedMedicalPermissions)
+
+        val lastReadPermissionRevoked =
+            _grantedAdditionalPermissions.value.orEmpty().isNotEmpty() &&
+                (readPermissionsBeforeDisconnect > readPermissionsAfterDisconnect) &&
+                readPermissionsAfterDisconnect == 0
+
+        if (lastReadPermissionRevoked) {
+            _grantedAdditionalPermissions.value.orEmpty().forEach { permission ->
+                revokePermissionsStatusUseCase.invoke(packageName, permission.additionalPermission)
+            }
+        }
+
+        _lastReadPermissionDisconnected.postValue(lastReadPermissionRevoked)
         revokePermissionsStatusUseCase.invoke(packageName, medicalPermission.toString())
     }
 
@@ -376,10 +516,7 @@
         packageName: String,
         fitnessPermission: FitnessPermission,
     ): Boolean {
-        if (
-            !featureUtils.isExerciseRouteReadAllEnabled() ||
-                fitnessPermission.toString() != READ_EXERCISE
-        ) {
+        if (fitnessPermission.toString() != READ_EXERCISE) {
             return false
         }
 
@@ -419,7 +556,7 @@
     }
 
     fun disableExerciseRoutePermission(packageName: String) {
-        revokePermission(fromPermissionString(READ_EXERCISE), packageName)
+        revokeFitnessPermission(fromPermissionString(READ_EXERCISE), packageName)
         // the revokePermission call will automatically revoke all additional permissions
         // including Exercise Routes if the READ_EXERCISE permission is the last READ permission
         if (isExerciseRoutePermissionAlwaysAllow(packageName)) {
@@ -436,7 +573,6 @@
         }
     }
 
-    // TODO(b/343142873): Update the behavior.
     fun revokeAllHealthPermissions(packageName: String): Boolean {
         // TODO (b/325729045) if there is an error within the coroutine scope
         // it will not be caught by this statement in tests. Consider using LiveData instead
@@ -450,7 +586,7 @@
                 _revokeAllHealthPermissionsState.postValue(RevokeAllState.Updated)
                 _grantedFitnessPermissions.postValue(emptySet())
                 _grantedMedicalPermissions.postValue(emptySet())
-                grantedAdditionalPermissions
+                _grantedAdditionalPermissions.postValue(emptySet())
             }
             return true
         } catch (ex: Exception) {
@@ -459,14 +595,22 @@
         return false
     }
 
-    fun revokeAllFitnessPermissions(packageName: String): Boolean {
+    fun revokeAllFitnessAndMaybeAdditionalPermissions(packageName: String): Boolean {
         try {
-            _revokeAllHealthPermissionsState.postValue(RevokeAllState.Loading)
-            _fitnessPermissions.value?.forEach {
-                revokePermissionsStatusUseCase.invoke(packageName, it.toString())
+            viewModelScope.launch(ioDispatcher) {
+                _revokeAllHealthPermissionsState.postValue(RevokeAllState.Loading)
+                _fitnessPermissions.value?.forEach {
+                    revokePermissionsStatusUseCase.invoke(packageName, it.toString())
+                }
+                if (!atLeastOneMedicalReadPermissionGranted()) {
+                    _grantedAdditionalPermissions.value?.forEach {
+                        revokePermissionsStatusUseCase.invoke(packageName, it.additionalPermission)
+                    }
+                    _grantedAdditionalPermissions.postValue(emptySet())
+                }
+                _revokeAllHealthPermissionsState.postValue(RevokeAllState.Updated)
+                _grantedFitnessPermissions.postValue(emptySet())
             }
-            _revokeAllHealthPermissionsState.postValue(RevokeAllState.Updated)
-            _grantedFitnessPermissions.postValue(emptySet())
             return true
         } catch (ex: Exception) {
             Log.e(TAG, "Failed to revoke fitness permissions!", ex)
@@ -474,13 +618,22 @@
         return false
     }
 
-    fun revokeAllMedicalPermissions(packageName: String): Boolean {
+    fun revokeAllMedicalAndMaybeAdditionalPermissions(packageName: String): Boolean {
         try {
-            _medicalPermissions.value?.forEach {
-                revokePermissionsStatusUseCase.invoke(packageName, it.toString())
+            viewModelScope.launch(ioDispatcher) {
+                _revokeAllHealthPermissionsState.postValue(RevokeAllState.Loading)
+                _medicalPermissions.value?.forEach {
+                    revokePermissionsStatusUseCase.invoke(packageName, it.toString())
+                }
+                if (!atLeastOneFitnessReadPermissionGranted()) {
+                    _grantedAdditionalPermissions.value?.forEach {
+                        revokePermissionsStatusUseCase.invoke(packageName, it.additionalPermission)
+                    }
+                    _grantedAdditionalPermissions.postValue(emptySet())
+                }
+                _revokeAllHealthPermissionsState.postValue(RevokeAllState.Updated)
+                _grantedMedicalPermissions.postValue(emptySet())
             }
-            _revokeAllHealthPermissionsState.postValue(RevokeAllState.Updated)
-            _grantedMedicalPermissions.postValue(emptySet())
             return true
         } catch (ex: Exception) {
             Log.e(TAG, "Failed to revoke medical permissions!", ex)
@@ -489,14 +642,26 @@
     }
 
     fun deleteAppData(packageName: String, appName: String) {
+        if (newDeletionFlow) {
+            newDeleteAppData(packageName, appName)
+        } else {
+            oldDeleteAppData(packageName, appName)
+        }
+    }
+
+    private fun newDeleteAppData(packageName: String, appName: String) {
+        viewModelScope.launch { deleteAppDataUseCase.invoke(DeleteAppData(packageName, appName)) }
+    }
+
+    private fun oldDeleteAppData(packageName: String, appName: String) {
         viewModelScope.launch {
-            val appData = DeletionType.DeletionTypeAppData(packageName, appName)
+            val appData = DeletionTypeAppData(packageName, appName)
             val timeRangeFilter =
                 TimeInstantRangeFilter.Builder()
                     .setStartTime(Instant.EPOCH)
                     .setEndTime(Instant.ofEpochMilli(Long.MAX_VALUE))
                     .build()
-            deleteAppDataUseCase.invoke(appData, timeRangeFilter)
+            oldDeleteAppDataUseCase.invoke(appData, timeRangeFilter)
         }
     }
 
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/CombinedPermissionsFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/app/CombinedPermissionsFragment.kt
index db27d72..6b84128 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/app/CombinedPermissionsFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/CombinedPermissionsFragment.kt
@@ -28,9 +28,9 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.permissions.additionalaccess.AdditionalAccessViewModel
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel.RevokeAllState
-import com.android.healthconnect.controller.permissions.shared.DisconnectAllAppPermissionsDialogFragment
-import com.android.healthconnect.controller.permissions.shared.DisconnectAllAppPermissionsDialogFragment.Companion.DISCONNECT_EVENT
-import com.android.healthconnect.controller.permissions.shared.DisconnectAllAppPermissionsDialogFragment.Companion.KEY_DELETE_DATA
+import com.android.healthconnect.controller.permissions.shared.DisconnectHealthPermissionsDialogFragment
+import com.android.healthconnect.controller.permissions.shared.DisconnectHealthPermissionsDialogFragment.Companion.DISCONNECT_ALL_EVENT
+import com.android.healthconnect.controller.permissions.shared.DisconnectHealthPermissionsDialogFragment.Companion.KEY_DELETE_DATA
 import com.android.healthconnect.controller.shared.Constants.EXTRA_APP_NAME
 import com.android.healthconnect.controller.shared.Constants.SHOW_MANAGE_APP_SECTION
 import com.android.healthconnect.controller.shared.HealthPermissionReader
@@ -39,6 +39,7 @@
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.utils.dismissLoadingDialog
 import com.android.healthconnect.controller.utils.logging.AppAccessElement
+import com.android.healthconnect.controller.utils.logging.CombinedAppAccessElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.pref
@@ -65,8 +66,7 @@
     }
 
     init {
-        // TODO(b/342159144): Update visual elements.
-        this.setPageName(PageName.UNKNOWN_PAGE)
+        this.setPageName(PageName.COMBINED_APP_ACCESS_PAGE)
     }
 
     private var packageName = ""
@@ -119,7 +119,7 @@
             setupManageAppPreferenceCategory(granted)
         }
 
-        childFragmentManager.setFragmentResultListener(DISCONNECT_EVENT, this) { _, bundle ->
+        childFragmentManager.setFragmentResultListener(DISCONNECT_ALL_EVENT, this) { _, bundle ->
             val permissionsUpdated = revokeAllPermissions()
             val toastString =
                 if (!permissionsUpdated) {
@@ -152,6 +152,7 @@
 
         managePermissionsCategory.addPreference(
             HealthPreference(requireContext()).also {
+                it.logName = CombinedAppAccessElement.FITNESS_PERMISSIONS_BUTTON
                 it.title = getString(R.string.fitness_permissions)
                 it.summary = getString(R.string.fitness_permissions_summary)
                 it.setOnPreferenceClickListener {
@@ -171,6 +172,7 @@
 
         managePermissionsCategory.addPreference(
             HealthPreference(requireContext()).also {
+                it.logName = CombinedAppAccessElement.MEDICAL_PERMISSIONS_BUTTON
                 it.title = getString(R.string.medical_permissions)
                 it.summary = getString(R.string.medical_permissions_summary)
                 it.setOnPreferenceClickListener {
@@ -190,12 +192,13 @@
 
         additionalAccessViewModel.loadAdditionalAccessPreferences(packageName)
         additionalAccessViewModel.additionalAccessState.observe(viewLifecycleOwner) { state ->
-            if (state.isValid() && shouldAddAdditionalAccessPref()) {
+            if (state.isAvailable() && shouldAddAdditionalAccessPref()) {
                 val additionalAccessPref =
                     HealthPreference(requireContext()).also {
                         it.key = KEY_ADDITIONAL_ACCESS
                         it.logName = AppAccessElement.ADDITIONAL_ACCESS_BUTTON
-                        it.setTitle(R.string.additional_access_label)
+                        it.title = getString(R.string.additional_access_label)
+                        it.summary = getString(R.string.additional_access_summary)
                         it.setOnPreferenceClickListener { _ ->
                             val extras = bundleOf(EXTRA_PACKAGE_NAME to packageName)
                             findNavController()
@@ -209,7 +212,7 @@
                 managePermissionsCategory.addPreference(additionalAccessPref)
             }
             managePermissionsCategory.children.find { it.key == KEY_ADDITIONAL_ACCESS }?.isVisible =
-                state.isValid()
+                state.isAvailable()
         }
     }
 
@@ -234,6 +237,7 @@
         )
         manageAppCategory.addPreference(
             HealthPreference(requireContext()).also {
+                it.logName = CombinedAppAccessElement.REMOVE_ALL_PERMISSIONS_BUTTON
                 it.title = getString(R.string.remove_access_for_this_app)
                 it.setOnPreferenceClickListener {
                     showRevokeAllPermissions()
@@ -268,8 +272,12 @@
     }
 
     private fun showRevokeAllPermissions() {
-        DisconnectAllAppPermissionsDialogFragment(appName)
-            .show(childFragmentManager, DisconnectAllAppPermissionsDialogFragment.TAG)
+        DisconnectHealthPermissionsDialogFragment(
+                appName,
+                enableDeleteData = true,
+                disconnectType = DisconnectHealthPermissionsDialogFragment.DisconnectType.ALL,
+            )
+            .show(childFragmentManager, DisconnectHealthPermissionsDialogFragment.TAG)
     }
 
     private fun revokeAllPermissions(): Boolean {
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/FitnessAppFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/app/FitnessAppFragment.kt
index f895ce2..cf842a9 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/app/FitnessAppFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/FitnessAppFragment.kt
@@ -54,7 +54,6 @@
 import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import com.android.healthconnect.controller.utils.dismissLoadingDialog
 import com.android.healthconnect.controller.utils.logging.AppAccessElement
@@ -62,6 +61,7 @@
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.pref
 import com.android.healthconnect.controller.utils.showLoadingDialog
+import com.android.healthfitness.flags.Flags
 import com.android.settingslib.widget.AppHeaderPreference
 import com.android.settingslib.widget.FooterPreference
 import dagger.hilt.android.AndroidEntryPoint
@@ -90,12 +90,13 @@
         this.setPageName(PageName.APP_ACCESS_PAGE)
     }
 
-    @Inject lateinit var featureUtils: FeatureUtils
     @Inject lateinit var logger: HealthConnectLogger
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
 
     private var packageName: String = ""
     private var appName: String = ""
+    // TODO (b/367626030) rename as proxy for whether app also has medical/additional permissions
+    // Or use viewModel
     private var showManageAppSection: Boolean = true
 
     private val appPermissionViewModel: AppPermissionViewModel by activityViewModels()
@@ -118,6 +119,7 @@
 
         allowAllPreference.logNameActive = AppAccessElement.ALLOW_ALL_PERMISSIONS_SWITCH_ACTIVE
         allowAllPreference.logNameInactive = AppAccessElement.ALLOW_ALL_PERMISSIONS_SWITCH_INACTIVE
+        allowAllPreference.isChecked = false
 
         if (childFragmentManager.findFragmentByTag(FRAGMENT_TAG_DELETION) == null) {
             childFragmentManager.commitNow { add(DeletionFragment(), FRAGMENT_TAG_DELETION) }
@@ -210,13 +212,7 @@
     }
 
     private fun revokeAllPermissions(): Boolean {
-        // The manage app section includes the additional permissions button too. If this section is
-        // visible then all health permissions should be revoked (fitness and additional). If the
-        // manage app section is not visible then fitness permissions should be revoked only,
-        // because medical and additional permissions are displayed on other screens.
-        return if (showManageAppSection)
-            appPermissionViewModel.revokeAllHealthPermissions(packageName)
-        else appPermissionViewModel.revokeAllFitnessPermissions(packageName)
+        return appPermissionViewModel.revokeAllFitnessAndMaybeAdditionalPermissions(packageName)
     }
 
     private fun setupHeader() {
@@ -235,7 +231,32 @@
         }
         manageDataCategory.isVisible = true
         manageDataCategory.removeAll()
-        if (featureUtils.isNewInformationArchitectureEnabled()) {
+
+        additionalAccessViewModel.loadAdditionalAccessPreferences(packageName)
+        additionalAccessViewModel.additionalAccessState.observe(viewLifecycleOwner) { state ->
+            if (state.isAvailable() && shouldAddAdditionalAccessPref()) {
+                val additionalAccessPref =
+                    HealthPreference(requireContext()).also {
+                        it.key = KEY_ADDITIONAL_ACCESS
+                        it.logName = AppAccessElement.ADDITIONAL_ACCESS_BUTTON
+                        it.setTitle(R.string.additional_access_label)
+                        it.setOnPreferenceClickListener { _ ->
+                            val extras = bundleOf(EXTRA_PACKAGE_NAME to packageName)
+                            findNavController()
+                                .navigate(
+                                    R.id.action_fitnessAppFragment_to_additionalAccessFragment,
+                                    extras,
+                                )
+                            true
+                        }
+                    }
+                manageDataCategory.addPreference(additionalAccessPref)
+            }
+            manageDataCategory.children.find { it.key == KEY_ADDITIONAL_ACCESS }?.isVisible =
+                state.isAvailable()
+        }
+
+        if (Flags.newInformationArchitecture()) {
             manageDataCategory.addPreference(
                 HealthPreference(requireContext()).also {
                     it.title = getString(R.string.see_app_data)
@@ -268,29 +289,6 @@
                 }
             )
         }
-        additionalAccessViewModel.loadAdditionalAccessPreferences(packageName)
-        additionalAccessViewModel.additionalAccessState.observe(viewLifecycleOwner) { state ->
-            if (state.isValid() && shouldAddAdditionalAccessPref()) {
-                val additionalAccessPref =
-                    HealthPreference(requireContext()).also {
-                        it.key = KEY_ADDITIONAL_ACCESS
-                        it.logName = AppAccessElement.ADDITIONAL_ACCESS_BUTTON
-                        it.setTitle(R.string.additional_access_label)
-                        it.setOnPreferenceClickListener { _ ->
-                            val extras = bundleOf(EXTRA_PACKAGE_NAME to packageName)
-                            findNavController()
-                                .navigate(
-                                    R.id.action_fitnessAppFragment_to_additionalAccessFragment,
-                                    extras,
-                                )
-                            true
-                        }
-                    }
-                manageDataCategory.addPreference(additionalAccessPref)
-            }
-            manageDataCategory.children.find { it.key == KEY_ADDITIONAL_ACCESS }?.isVisible =
-                state.isValid()
-        }
     }
 
     private fun shouldAddAdditionalAccessPref(): Boolean {
@@ -305,7 +303,7 @@
                 Toast.makeText(requireContext(), R.string.default_error, Toast.LENGTH_SHORT).show()
             }
         } else {
-            showRevokeAllPermissions()
+            showRevokeAllFitnessPermissions()
         }
     }
 
@@ -319,8 +317,12 @@
         }
     }
 
-    private fun showRevokeAllPermissions() {
-        DisconnectHealthPermissionsDialogFragment(appName)
+    private fun showRevokeAllFitnessPermissions() {
+        DisconnectHealthPermissionsDialogFragment(
+                appName,
+                enableDeleteData = true,
+                disconnectType = DisconnectHealthPermissionsDialogFragment.DisconnectType.FITNESS,
+            )
             .show(childFragmentManager, DisconnectHealthPermissionsDialogFragment.TAG)
     }
 
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/MedicalAppFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/app/MedicalAppFragment.kt
index b32e21c..e13ee6f 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/app/MedicalAppFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/MedicalAppFragment.kt
@@ -44,7 +44,6 @@
 import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.dismissLoadingDialog
 import com.android.healthconnect.controller.utils.logging.AppAccessElement
 import com.android.healthconnect.controller.utils.logging.ErrorPageElement
@@ -76,11 +75,9 @@
     }
 
     init {
-        // TODO(b/342159144): Update visual elements.
-        this.setPageName(PageName.UNKNOWN_PAGE)
+        setPageName(PageName.MEDICAL_APP_ACCESS_PAGE)
     }
 
-    @Inject lateinit var featureUtils: FeatureUtils
     @Inject lateinit var logger: HealthConnectLogger
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
 
@@ -183,13 +180,7 @@
     }
 
     private fun revokeAllPermissions(): Boolean {
-        // The manage app section includes the additional permissions button too. If this section is
-        // visible then all health permissions should be revoked (medical and additional). If the
-        // manage app section is not visible then medical permissions should be revoked only,
-        // because fitness and additional permissions are displayed on other screens.
-        return if (showManageAppSection)
-            appPermissionViewModel.revokeAllHealthPermissions(packageName)
-        else appPermissionViewModel.revokeAllMedicalPermissions(packageName)
+        return appPermissionViewModel.revokeAllMedicalAndMaybeAdditionalPermissions(packageName)
     }
 
     private fun setupHeader() {
@@ -209,22 +200,10 @@
 
         manageDataCategory.isVisible = true
         manageDataCategory.removeAll()
-        manageDataCategory.addPreference(
-            HealthPreference(requireContext()).also {
-                it.title = getString(R.string.see_app_data)
-                it.setOnPreferenceClickListener {
-                    findNavController()
-                        .navigate(
-                            R.id.action_medicalApp_to_appData,
-                            bundleOf(EXTRA_PACKAGE_NAME to packageName, EXTRA_APP_NAME to appName),
-                        )
-                    true
-                }
-            }
-        )
+
         additionalAccessViewModel.loadAdditionalAccessPreferences(packageName)
         additionalAccessViewModel.additionalAccessState.observe(viewLifecycleOwner) { state ->
-            if (state.isValid() && shouldAddAdditionalAccessPref()) {
+            if (state.isAvailable() && shouldAddAdditionalAccessPref()) {
                 val additionalAccessPref =
                     HealthPreference(requireContext()).also {
                         it.key = KEY_ADDITIONAL_ACCESS
@@ -243,8 +222,22 @@
                 manageDataCategory.addPreference(additionalAccessPref)
             }
             manageDataCategory.children.find { it.key == KEY_ADDITIONAL_ACCESS }?.isVisible =
-                state.isValid()
+                state.isAvailable()
         }
+
+        manageDataCategory.addPreference(
+            HealthPreference(requireContext()).also {
+                it.title = getString(R.string.see_app_data)
+                it.setOnPreferenceClickListener {
+                    findNavController()
+                        .navigate(
+                            R.id.action_medicalApp_to_appData,
+                            bundleOf(EXTRA_PACKAGE_NAME to packageName, EXTRA_APP_NAME to appName),
+                        )
+                    true
+                }
+            }
+        )
     }
 
     private fun shouldAddAdditionalAccessPref(): Boolean {
@@ -274,7 +267,11 @@
     }
 
     private fun showRevokeAllPermissions() {
-        DisconnectHealthPermissionsDialogFragment(appName)
+        DisconnectHealthPermissionsDialogFragment(
+                appName,
+                enableDeleteData = true,
+                DisconnectHealthPermissionsDialogFragment.DisconnectType.MEDICAL,
+            )
             .show(childFragmentManager, DisconnectHealthPermissionsDialogFragment.TAG)
     }
 
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/SettingsCombinedPermissionsFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/app/SettingsCombinedPermissionsFragment.kt
index 24cbb0e..99e12cb 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/app/SettingsCombinedPermissionsFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/SettingsCombinedPermissionsFragment.kt
@@ -28,13 +28,13 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.migration.MigrationActivity.Companion.maybeShowMigrationDialog
 import com.android.healthconnect.controller.migration.MigrationViewModel
-import com.android.healthconnect.controller.migration.MigrationViewModel.MigrationFragmentState.*
+import com.android.healthconnect.controller.migration.MigrationViewModel.MigrationFragmentState.WithData
 import com.android.healthconnect.controller.permissions.additionalaccess.AdditionalAccessViewModel
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel.RevokeAllState
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
-import com.android.healthconnect.controller.permissions.shared.DisconnectAllAppPermissionsDialogFragment
-import com.android.healthconnect.controller.permissions.shared.DisconnectAllAppPermissionsDialogFragment.Companion.DISCONNECT_EVENT
+import com.android.healthconnect.controller.permissions.shared.DisconnectHealthPermissionsDialogFragment
+import com.android.healthconnect.controller.permissions.shared.DisconnectHealthPermissionsDialogFragment.Companion.DISCONNECT_ALL_EVENT
 import com.android.healthconnect.controller.shared.Constants
 import com.android.healthconnect.controller.shared.Constants.SHOW_MANAGE_APP_SECTION
 import com.android.healthconnect.controller.shared.HealthPermissionReader
@@ -64,7 +64,7 @@
 class SettingsCombinedPermissionsFragment : Hilt_SettingsCombinedPermissionsFragment() {
 
     init {
-        this.setPageName(PageName.MANAGE_PERMISSIONS_PAGE)
+        setPageName(PageName.SETTINGS_MANAGE_COMBINED_APP_PERMISSIONS_PAGE)
     }
 
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
@@ -111,7 +111,7 @@
             setupManageAppPreferenceCategory(granted)
         }
 
-        childFragmentManager.setFragmentResultListener(DISCONNECT_EVENT, this) { _, bundle ->
+        childFragmentManager.setFragmentResultListener(DISCONNECT_ALL_EVENT, this) { _, bundle ->
             val permissionsUpdated = revokeAllPermissions()
             val toastString =
                 if (!permissionsUpdated) {
@@ -193,12 +193,13 @@
 
         additionalAccessViewModel.loadAdditionalAccessPreferences(packageName)
         additionalAccessViewModel.additionalAccessState.observe(viewLifecycleOwner) { state ->
-            if (state.isValid() && shouldAddAdditionalAccessPref()) {
+            if (state.isAvailable() && shouldAddAdditionalAccessPref()) {
                 val additionalAccessPref =
                     HealthPreference(requireContext()).also {
                         it.key = KEY_ADDITIONAL_ACCESS
                         it.logName = AppAccessElement.ADDITIONAL_ACCESS_BUTTON
-                        it.setTitle(R.string.additional_access_label)
+                        it.title = getString(R.string.additional_access_label)
+                        it.summary = getString(R.string.additional_access_summary)
                         it.setOnPreferenceClickListener { _ ->
                             val extras = bundleOf(EXTRA_PACKAGE_NAME to packageName)
                             navigationUtils.navigate(
@@ -212,7 +213,7 @@
                 managePermissionsCategory.addPreference(additionalAccessPref)
             }
             managePermissionsCategory.children.find { it.key == KEY_ADDITIONAL_ACCESS }?.isVisible =
-                state.isValid()
+                state.isAvailable()
         }
     }
 
@@ -241,11 +242,12 @@
     }
 
     private fun showRevokeAllPermissions() {
-        DisconnectAllAppPermissionsDialogFragment(
+        DisconnectHealthPermissionsDialogFragment(
                 viewModel.appInfo.value?.appName!!,
-                showCheckbox = false,
+                enableDeleteData = false,
+                disconnectType = DisconnectHealthPermissionsDialogFragment.DisconnectType.ALL,
             )
-            .show(childFragmentManager, DisconnectAllAppPermissionsDialogFragment.TAG)
+            .show(childFragmentManager, DisconnectHealthPermissionsDialogFragment.TAG)
     }
 
     private fun revokeAllPermissions(): Boolean {
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/SettingsFitnessAppFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/app/SettingsFitnessAppFragment.kt
index dcbdeb9..b6126fb 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/app/SettingsFitnessAppFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/SettingsFitnessAppFragment.kt
@@ -70,7 +70,7 @@
 class SettingsFitnessAppFragment : Hilt_SettingsFitnessAppFragment() {
 
     init {
-        this.setPageName(PageName.MANAGE_PERMISSIONS_PAGE)
+        setPageName(PageName.MANAGE_PERMISSIONS_PAGE)
     }
 
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
@@ -192,7 +192,7 @@
             DisconnectHealthPermissionsDialogFragment.DISCONNECT_ALL_EVENT,
             this,
         ) { _, bundle ->
-            if (!viewModel.revokeAllHealthPermissions(packageName)) {
+            if (!viewModel.revokeAllFitnessAndMaybeAdditionalPermissions(packageName)) {
                 Toast.makeText(requireContext(), R.string.default_error, Toast.LENGTH_SHORT).show()
             }
 
@@ -238,9 +238,9 @@
             return
         }
         additionalAccessViewModel.additionalAccessState.observe(viewLifecycleOwner) { state ->
-            manageAppCategory.isVisible = state.isValid()
+            manageAppCategory.isVisible = state.isAvailable()
             manageAppCategory.removeAll()
-            if (state.isValid()) {
+            if (state.isAvailable()) {
                 val additionalAccessPref =
                     HealthPreference(requireContext()).also {
                         it.key = KEY_ADDITIONAL_ACCESS
@@ -271,7 +271,11 @@
     }
 
     private fun showRevokeAllPermissions() {
-        DisconnectHealthPermissionsDialogFragment(appName = appName, enableDeleteData = false)
+        DisconnectHealthPermissionsDialogFragment(
+                appName = appName,
+                enableDeleteData = false,
+                DisconnectHealthPermissionsDialogFragment.DisconnectType.FITNESS,
+            )
             .show(childFragmentManager, DisconnectHealthPermissionsDialogFragment.TAG)
     }
 
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/SettingsMedicalAppFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/app/SettingsMedicalAppFragment.kt
index 2218982..f7dbc87 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/app/SettingsMedicalAppFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/SettingsMedicalAppFragment.kt
@@ -66,7 +66,7 @@
 class SettingsMedicalAppFragment : Hilt_SettingsMedicalAppFragment() {
 
     init {
-        this.setPageName(PageName.MANAGE_PERMISSIONS_PAGE)
+        setPageName(PageName.SETTINGS_MANAGE_MEDICAL_APP_PERMISSIONS_PAGE)
     }
 
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
@@ -180,7 +180,7 @@
             DisconnectHealthPermissionsDialogFragment.DISCONNECT_ALL_EVENT,
             this,
         ) { _, bundle ->
-            if (!viewModel.revokeAllHealthPermissions(packageName)) {
+            if (!viewModel.revokeAllMedicalAndMaybeAdditionalPermissions(packageName)) {
                 Toast.makeText(requireContext(), R.string.default_error, Toast.LENGTH_SHORT).show()
             }
 
@@ -226,9 +226,9 @@
             return
         }
         additionalAccessViewModel.additionalAccessState.observe(viewLifecycleOwner) { state ->
-            manageAppCategory.isVisible = state.isValid()
+            manageAppCategory.isVisible = state.isAvailable()
             manageAppCategory.removeAll()
-            if (state.isValid()) {
+            if (state.isAvailable()) {
                 val additionalAccessPref =
                     HealthPreference(requireContext()).also {
                         it.key = KEY_ADDITIONAL_ACCESS
@@ -259,7 +259,11 @@
     }
 
     private fun showRevokeAllPermissions() {
-        DisconnectHealthPermissionsDialogFragment(appName = appName, enableDeleteData = false)
+        DisconnectHealthPermissionsDialogFragment(
+                appName = appName,
+                enableDeleteData = false,
+                DisconnectHealthPermissionsDialogFragment.DisconnectType.MEDICAL,
+            )
             .show(childFragmentManager, DisconnectHealthPermissionsDialogFragment.TAG)
     }
 
@@ -285,7 +289,7 @@
                     }
                 val switchPreference =
                     HealthSwitchPreference(requireContext()).also {
-                        // it.icon = healthCategory.icon(requireContext())
+                        it.icon = permission.medicalPermissionType.icon(requireContext())
                         it.setTitle(
                             fromPermissionType(permission.medicalPermissionType).uppercaseLabel
                         )
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/wear/WearViewAppInfoPermissionsActivity.kt b/apk/src/com/android/healthconnect/controller/permissions/app/wear/WearViewAppInfoPermissionsActivity.kt
new file mode 100644
index 0000000..0fccc9e
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/wear/WearViewAppInfoPermissionsActivity.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package com.android.healthconnect.controller.permissions.app.wear
+
+import android.content.Intent.EXTRA_PACKAGE_NAME
+import android.content.pm.PackageManager
+import android.os.Bundle
+import android.util.Log
+import android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
+import androidx.activity.ComponentActivity
+import androidx.activity.viewModels
+import androidx.compose.ui.platform.ComposeView
+import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel
+import com.android.healthfitness.flags.Flags
+import dagger.hilt.android.AndroidEntryPoint
+
+/** Wear View App Info Permissions activity for Health&Fitness. */
+@AndroidEntryPoint(ComponentActivity::class)
+class WearViewAppInfoPermissionsActivity : Hilt_WearViewAppInfoPermissionsActivity() {
+
+  companion object {
+    private const val TAG = "WearViewAppInfoPermissionsActivity"
+  }
+
+  private val viewModel: AppPermissionViewModel by viewModels()
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+
+    if (
+      !getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH) ||
+      !Flags.replaceBodySensorPermissionEnabled()
+    ) {
+      Log.e(
+        TAG,
+        "Health connect is not available on watch, activity should not have been started, " +
+          "finishing!",
+      )
+      finish()
+      return
+    }
+
+    // This flag ensures a non system app cannot show an overlay on Health Connect. b/313425281
+    window.addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
+
+    val packageName = getPackageNameExtra()
+    if (packageName.isEmpty()) {
+      Log.e(TAG, "empty packageName extra from intent, unable to load permissions")
+      finish()
+      return
+    }
+    viewModel.loadPermissionsForPackage(getPackageNameExtra())
+
+    val root = ComposeView(this)
+    root.setContent { WearViewAppPermissionsScreen(viewModel) }
+    setContentView(root)
+  }
+
+  private fun getPackageNameExtra(): String {
+    return intent.getStringExtra(EXTRA_PACKAGE_NAME).orEmpty()
+  }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/app/wear/WearViewAppPermissionsScreen.kt b/apk/src/com/android/healthconnect/controller/permissions/app/wear/WearViewAppPermissionsScreen.kt
new file mode 100644
index 0000000..c8864ef
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/app/wear/WearViewAppPermissionsScreen.kt
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.app.wear
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.State
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.wear.compose.material3.RadioButton
+import androidx.wear.compose.material3.SwitchButton
+import androidx.wear.compose.material3.Text
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionStrings
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
+import com.android.healthconnect.controller.permissions.request.wear.elements.ScrollableScreen
+import com.android.healthconnect.controller.shared.app.AppMetadata
+
+/**
+ * Wear View App Permissions Screen. This screen includes: Allow/Deny foreground and background
+ * health permissions for an app.
+ */
+@Composable
+fun WearViewAppPermissionsScreen(viewModel: AppPermissionViewModel) {
+  val res = LocalContext.current.resources
+  val appMetadata: State<AppMetadata?> = viewModel.appInfo.observeAsState(null)
+  val appName = appMetadata.value?.appName ?: ""
+  val packageName = appMetadata.value?.packageName ?: ""
+  val allFitnessPermissionsGranted by viewModel.allFitnessPermissionsGranted.observeAsState(false)
+  val grantedFitnessPermissions by viewModel.grantedFitnessPermissions.observeAsState(emptyList())
+  val allFitnessPermissions = viewModel.fitnessPermissions.observeAsState(emptyList())
+  val allDataTypes =
+    allFitnessPermissions.value.map { permission ->
+      stringResource(
+        FitnessPermissionStrings.fromPermissionType(permission.fitnessPermissionType).uppercaseLabel
+      )
+    }
+  val checkedStates =
+    remember(allFitnessPermissions.value) { // Recalculate when permissions change
+      mutableStateListOf<Boolean>(
+        *(allFitnessPermissions.value)
+          .map { perm ->
+            grantedFitnessPermissions.any { grantedPerm ->
+              perm.fitnessPermissionType == grantedPerm.fitnessPermissionType
+            }
+          }
+          .toTypedArray()
+      )
+    }
+
+  // Background read permission state.
+  val grantedAdditionalPermissions by
+  viewModel.grantedAdditionalPermissions.observeAsState(emptyList())
+  val allowAllTheTime by
+  remember(grantedAdditionalPermissions) {
+    derivedStateOf { grantedAdditionalPermissions.any { it.isBackgroundReadPermission() } }
+  }
+
+  ScrollableScreen(showTimeText = false, title = res.getString(R.string.fitness_and_wellness)) {
+    // Allow all toggle.
+    item {
+      var isAllowAllChecked by remember { mutableStateOf(allFitnessPermissionsGranted) }
+      val allDataTypesSelected by
+      remember(checkedStates) { derivedStateOf { checkedStates.all { it } } }
+      // Update isAllowAllChecked when allFitnessPermissionsGranted changes.
+      LaunchedEffect(allFitnessPermissionsGranted) {
+        isAllowAllChecked = allFitnessPermissionsGranted
+      }
+      SwitchButton(
+        modifier = Modifier.fillMaxWidth(),
+        label = { Text(res.getString(R.string.request_permissions_allow_all)) },
+        checked = isAllowAllChecked,
+        onCheckedChange = { isChecked ->
+          isAllowAllChecked = isChecked
+          for (i in checkedStates.indices) { checkedStates[i] = isChecked }
+          if (isChecked) {
+            viewModel.grantAllFitnessPermissions(packageName)
+          } else {
+            viewModel.revokeAllFitnessAndMaybeAdditionalPermissions(packageName)
+          }
+        },
+        enabled = true,
+      )
+    }
+
+    // Granular data type toggles.
+    item {
+      Row(horizontalArrangement = Arrangement.Start) {
+        Text(res.getString(R.string.allowed_to_read))
+      }
+    }
+    items(allDataTypes.size) { index ->
+      val dataType = allDataTypes[index]
+      val isChecked = checkedStates[index]
+      SwitchButton(
+        modifier = Modifier.fillMaxWidth(),
+        label = { Text(dataType) },
+        checked = isChecked,
+        onCheckedChange = { newCheckedValue ->
+          checkedStates[index] = newCheckedValue
+          viewModel.updatePermission(
+            packageName,
+            allFitnessPermissions.value[index],
+            newCheckedValue as Boolean,
+          )
+        },
+        enabled = true,
+      )
+    }
+    item {
+      Row(horizontalArrangement = Arrangement.Start) {
+        Text(res.getString(R.string.give_permission_prompt, appName))
+      }
+    }
+
+    // Background permission.
+    // Allow all the time.
+    item {
+      Row(horizontalArrangement = Arrangement.Start) {
+        Text(res.getString(R.string.allowed_to_access))
+      }
+    }
+    item {
+      RadioButton(
+        modifier = Modifier.fillMaxWidth(),
+        enabled = true,
+        selected = allowAllTheTime,
+        onSelect = {
+          viewModel.updateAdditionalPermission(
+            packageName,
+            AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+            true,
+          )
+        },
+        label = { Text(res.getString(R.string.view_permissions_all_the_time_cap)) },
+      )
+    }
+    // Allow while in use. (Deny background read permission.)
+    item {
+      RadioButton(
+        modifier = Modifier.fillMaxWidth(),
+        enabled = true,
+        selected = !allowAllTheTime,
+        onSelect = {
+          viewModel.updateAdditionalPermission(
+            packageName,
+            AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+            false,
+          )
+        },
+        label = { Text(res.getString(R.string.view_permissions_while_in_use_cap)) },
+      )
+    }
+
+    item {
+      Row(horizontalArrangement = Arrangement.Start) {
+        val accessText =
+          if (allowAllTheTime) {
+            res.getString(R.string.view_permissions_all_the_time)
+          } else {
+            res.getString(R.string.view_permissions_while_in_use)
+          }
+        Text(res.getString(R.string.view_permissions_mode, appName, accessText))
+      }
+    }
+  }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/ConnectedAppsFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/ConnectedAppsFragment.kt
index 90edbeb..5d31d4a 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/ConnectedAppsFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/ConnectedAppsFragment.kt
@@ -22,10 +22,14 @@
 import android.view.MenuItem
 import android.view.View
 import android.view.View.GONE
+import android.widget.CheckBox
+import android.widget.ImageView
+import android.widget.TextView
 import android.widget.Toast
 import androidx.annotation.StringRes
 import androidx.appcompat.app.AlertDialog
 import androidx.core.os.bundleOf
+import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.commitNow
 import androidx.fragment.app.viewModels
 import androidx.navigation.fragment.findNavController
@@ -34,12 +38,16 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.deletion.DeletionConstants
 import com.android.healthconnect.controller.deletion.DeletionConstants.DELETION_TYPE
-import com.android.healthconnect.controller.deletion.DeletionConstants.FRAGMENT_TAG_DELETION
-import com.android.healthconnect.controller.deletion.DeletionFragment
-import com.android.healthconnect.controller.deletion.DeletionType
+import com.android.healthconnect.controller.deletion.DeletionFragment as OldDeletionFragment
+import com.android.healthconnect.controller.deletion.DeletionType as OldDeletionType
+import com.android.healthconnect.controller.deletion.DeletionViewModel as OldDeletionViewModel
 import com.android.healthconnect.controller.permissions.connectedapps.ConnectedAppsViewModel.DisconnectAllState
 import com.android.healthconnect.controller.permissions.shared.HelpAndFeedbackFragment.Companion.APP_INTEGRATION_REQUEST_BUCKET_ID
 import com.android.healthconnect.controller.permissions.shared.HelpAndFeedbackFragment.Companion.FEEDBACK_INTENT_RESULT_CODE
+import com.android.healthconnect.controller.selectabledeletion.DeletionConstants.START_DELETION_KEY
+import com.android.healthconnect.controller.selectabledeletion.DeletionFragment
+import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteAppData
+import com.android.healthconnect.controller.selectabledeletion.DeletionViewModel
 import com.android.healthconnect.controller.shared.Constants.APP_UPDATE_NEEDED_BANNER_SEEN
 import com.android.healthconnect.controller.shared.Constants.EXTRA_APP_NAME
 import com.android.healthconnect.controller.shared.Constants.USER_ACTIVITY_TRACKER
@@ -67,7 +75,8 @@
 import com.android.healthconnect.controller.utils.setupMenu
 import com.android.healthconnect.controller.utils.setupSharedMenu
 import com.android.healthconnect.controller.utils.showLoadingDialog
-import com.android.settingslib.widget.AppPreference
+import com.android.healthfitness.flags.Flags.newInformationArchitecture
+import com.android.healthfitness.flags.Flags.personalHealthRecord
 import com.android.settingslib.widget.TopIntroPreference
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
@@ -85,6 +94,7 @@
         private const val THINGS_TO_TRY = "things_to_try_app_permissions_screen"
         private const val SETTINGS_AND_HELP = "settings_and_help"
         private const val BANNER_PREFERENCE_KEY = "banner_preference"
+        private const val FRAGMENT_TAG_DELETION = "FRAGMENT_TAG_DELETION"
     }
 
     init {
@@ -97,8 +107,11 @@
     @Inject lateinit var navigationUtils: NavigationUtils
 
     private val viewModel: ConnectedAppsViewModel by viewModels()
+    private val deletionViewModel: DeletionViewModel by activityViewModels()
+    private val oldDeletionViewModel: OldDeletionViewModel by activityViewModels()
     private lateinit var searchMenuItem: MenuItem
     private lateinit var removeAllAppsDialog: AlertDialog
+    private val newDeletionFlow = personalHealthRecord() || newInformationArchitecture()
 
     private val mTopIntro: TopIntroPreference by lazy {
         preferenceScreen.findPreference(TOP_INTRO)!!
@@ -128,43 +141,108 @@
         preferenceScreen.findPreference(SETTINGS_AND_HELP)!!
     }
 
-    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
-        super.onCreatePreferences(savedInstanceState, rootKey)
-        setPreferencesFromResource(R.xml.connected_apps_screen, rootKey)
-
-        if (childFragmentManager.findFragmentByTag(FRAGMENT_TAG_DELETION) == null) {
-            childFragmentManager.commitNow { add(DeletionFragment(), FRAGMENT_TAG_DELETION) }
+    private fun createRemoveAllAppsAccessDialog(apps: List<ConnectedAppMetadata>) {
+        if (newDeletionFlow) {
+            createNewIADialog(apps)
+        } else {
+            createOldIADialog(apps)
         }
     }
 
-    private fun createRemoveAllAppsAccessDialog(apps: List<ConnectedAppMetadata>) {
+    private fun createOldIADialog(apps: List<ConnectedAppMetadata>) {
         removeAllAppsDialog =
             AlertDialogBuilder(
-                    this, DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_CONTAINER)
+                    this,
+                    DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_CONTAINER,
+                )
                 .setIcon(R.attr.disconnectAllIcon)
                 .setTitle(R.string.permissions_disconnect_all_dialog_title)
                 .setMessage(R.string.permissions_disconnect_all_dialog_message)
                 .setCancelable(false)
                 .setNeutralButton(
                     android.R.string.cancel,
-                    DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_CANCEL_BUTTON) { _, _
-                        ->
-                        viewModel.setAlertDialogStatus(false)
-                    }
+                    DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_CANCEL_BUTTON,
+                ) { _, _ ->
+                    viewModel.setAlertDialogStatus(false)
+                }
                 .setPositiveButton(
                     R.string.permissions_disconnect_all_dialog_disconnect,
-                    DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_REMOVE_ALL_BUTTON) {
-                        _,
-                        _ ->
-                        if (!viewModel.disconnectAllApps(apps)) {
-                            Toast.makeText(
-                                    requireContext(), R.string.default_error, Toast.LENGTH_SHORT)
-                                .show()
-                        }
+                    DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_REMOVE_ALL_BUTTON,
+                ) { _, _ ->
+                    if (!viewModel.disconnectAllApps(apps)) {
+                        Toast.makeText(requireContext(), R.string.default_error, Toast.LENGTH_SHORT)
+                            .show()
                     }
+                }
                 .create()
     }
 
+    private fun createNewIADialog(apps: List<ConnectedAppMetadata>) {
+        val body = layoutInflater.inflate(R.layout.dialog_message_with_checkbox, null)
+        body.findViewById<TextView>(R.id.dialog_message).apply {
+            text = getString(R.string.permissions_disconnect_all_dialog_message)
+        }
+        body.findViewById<TextView>(R.id.dialog_title).apply {
+            text = getString(R.string.permissions_disconnect_all_dialog_title)
+        }
+
+        val imageIcon = body.findViewById(R.id.dialog_icon) as ImageView
+        imageIcon.setImageDrawable(
+            AttributeResolver.getNullableDrawable(requireContext(), R.attr.disconnectAllIcon)
+        )
+        imageIcon.visibility = View.VISIBLE
+
+        val checkBox =
+            body.findViewById<CheckBox>(R.id.dialog_checkbox).apply {
+                text = getString(R.string.disconnect_all_app_permissions_dialog_checkbox)
+            }
+        checkBox.setOnCheckedChangeListener { _, _ ->
+            // TODO(b/372636258): add logging
+        }
+
+        removeAllAppsDialog =
+            AlertDialogBuilder(
+                    this,
+                    DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_CONTAINER,
+                )
+                .setView(body)
+                .setCancelable(false)
+                .setNeutralButton(
+                    android.R.string.cancel,
+                    DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_CANCEL_BUTTON,
+                ) { _, _ ->
+                    viewModel.setAlertDialogStatus(false)
+                }
+                .setPositiveButton(
+                    R.string.permissions_disconnect_all_dialog_disconnect,
+                    DisconnectAllAppsDialogElement.DISCONNECT_ALL_APPS_DIALOG_REMOVE_ALL_BUTTON,
+                ) { _, _ ->
+                    if (!viewModel.disconnectAllApps(apps)) {
+                        Toast.makeText(requireContext(), R.string.default_error, Toast.LENGTH_SHORT)
+                            .show()
+                    }
+                    if (checkBox.isChecked) {
+                        viewModel.deleteAllData()
+                    }
+                }
+                .create()
+    }
+
+    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+        super.onCreatePreferences(savedInstanceState, rootKey)
+        setPreferencesFromResource(R.xml.connected_apps_screen, rootKey)
+
+        if (newDeletionFlow) {
+            if (childFragmentManager.findFragmentByTag(FRAGMENT_TAG_DELETION) == null) {
+                childFragmentManager.commitNow { add(DeletionFragment(), FRAGMENT_TAG_DELETION) }
+            }
+        } else {
+            if (childFragmentManager.findFragmentByTag(FRAGMENT_TAG_DELETION) == null) {
+                childFragmentManager.commitNow { add(OldDeletionFragment(), FRAGMENT_TAG_DELETION) }
+            }
+        }
+    }
+
     override fun onResume() {
         super.onResume()
         viewModel.loadConnectedApps()
@@ -174,6 +252,24 @@
         super.onViewCreated(view, savedInstanceState)
         observeConnectedApps()
         observeRevokeAllAppsPermissions()
+
+        if (newDeletionFlow) {
+            deletionViewModel.connectedAppsReloadNeeded.observe(viewLifecycleOwner) { isReloadNeeded
+                ->
+                if (isReloadNeeded) {
+                    viewModel.loadConnectedApps()
+                    deletionViewModel.resetPermissionTypesReloadNeeded()
+                }
+            }
+        } else {
+            oldDeletionViewModel.appPermissionReloadNeeded.observe(viewLifecycleOwner) {
+                isReloadNeeded ->
+                if (isReloadNeeded) {
+                    viewModel.loadConnectedApps()
+                    oldDeletionViewModel.resetAppPermissionReloadNeeded()
+                }
+            }
+        }
     }
 
     private fun observeRevokeAllAppsPermissions() {
@@ -228,10 +324,13 @@
                             viewModel.setAlertDialogStatus(true)
                             true
                         }
-                    })
+                    }
+                )
 
-                if (deviceInfoUtils.isPlayStoreAvailable(requireContext()) ||
-                    deviceInfoUtils.isSendFeedbackAvailable(requireContext())) {
+                if (
+                    deviceInfoUtils.isPlayStoreAvailable(requireContext()) ||
+                        deviceInfoUtils.isSendFeedbackAvailable(requireContext())
+                ) {
                     mSettingsAndHelpCategory.addPreference(getHelpAndFeedbackPreference())
                 }
 
@@ -266,12 +365,13 @@
                             it.icon = app.appMetadata.icon
                             it.logName = AppPermissionsElement.INACTIVE_APP_BUTTON
                             it.setOnDeleteButtonClickListener {
-                                val appDeletionType =
-                                    DeletionType.DeletionTypeAppData(
-                                        app.appMetadata.packageName, app.appMetadata.appName)
-                                childFragmentManager.setFragmentResult(
-                                    DeletionConstants.START_INACTIVE_APP_DELETION_EVENT,
-                                    bundleOf(DELETION_TYPE to appDeletionType))
+                                val packageName = app.appMetadata.packageName
+                                val appName = app.appMetadata.appName
+                                if (newDeletionFlow) {
+                                    deleteData(packageName, appName)
+                                } else {
+                                    oldDeleteData(packageName, appName)
+                                }
                             }
                         }
                     mInactiveAppsCategory.addPreference(inactiveAppPreference)
@@ -279,6 +379,19 @@
         }
     }
 
+    private fun deleteData(packageName: String, appName: String) {
+        deletionViewModel.setDeletionType(DeleteAppData(packageName, appName))
+        childFragmentManager.setFragmentResult(START_DELETION_KEY, bundleOf())
+    }
+
+    private fun oldDeleteData(packageName: String, appName: String) {
+        val appDeletionType = OldDeletionType.DeletionTypeAppData(packageName, appName)
+        childFragmentManager.setFragmentResult(
+            DeletionConstants.START_INACTIVE_APP_DELETION_EVENT,
+            bundleOf(DELETION_TYPE to appDeletionType),
+        )
+    }
+
     private fun updateNeedUpdateApps(appsList: List<ConnectedAppMetadata>) {
         if (appsList.isEmpty()) {
             mNeedUpdateAppsCategory?.isVisible = false
@@ -290,10 +403,12 @@
                     val intent = appStoreUtils.getAppStoreLink(app.appMetadata.packageName)
                     if (intent == null) {
                         mNeedUpdateAppsCategory?.addPreference(
-                            getAppPreference(app).also { it.isSelectable = false })
+                            getAppPreference(app).also { it.isSelectable = false }
+                        )
                     } else {
                         mNeedUpdateAppsCategory?.addPreference(
-                            getAppPreference(app) { navigationUtils.startActivity(this, intent) })
+                            getAppPreference(app) { navigationUtils.startActivity(this, intent) }
+                        )
                     }
                 }
 
@@ -317,7 +432,8 @@
                 .sortedBy { it.appMetadata.appName }
                 .forEach { app ->
                     mAllowedAppsCategory.addPreference(
-                        getAppPreference(app) { navigateToAppInfoScreen(app) })
+                        getAppPreference(app) { navigateToAppInfoScreen(app) }
+                    )
                 }
         }
     }
@@ -330,7 +446,8 @@
                 .sortedBy { it.appMetadata.appName }
                 .forEach { app ->
                     mNotAllowedAppsCategory.addPreference(
-                        getAppPreference(app) { navigateToAppInfoScreen(app) })
+                        getAppPreference(app) { navigateToAppInfoScreen(app) }
+                    )
                 }
         }
     }
@@ -350,7 +467,9 @@
                 navigationId,
                 bundleOf(
                     EXTRA_PACKAGE_NAME to app.appMetadata.packageName,
-                    EXTRA_APP_NAME to app.appMetadata.appName))
+                    EXTRA_APP_NAME to app.appMetadata.appName,
+                ),
+            )
     }
 
     private fun getNoAppsPreference(@StringRes res: Int): Preference {
@@ -362,8 +481,8 @@
 
     private fun getAppPreference(
         app: ConnectedAppMetadata,
-        onClick: (() -> Unit)? = null
-    ): AppPreference {
+        onClick: (() -> Unit)? = null,
+    ): HealthAppPreference {
         return HealthAppPreference(requireContext(), app.appMetadata).also {
             if (app.status == ALLOWED) {
                 it.logName = AppPermissionsElement.CONNECTED_APP_BUTTON
@@ -447,10 +566,12 @@
             .also { banner ->
                 banner.setPrimaryButton(
                     resources.getString(R.string.app_update_needed_banner_button),
-                    MigrationElement.MIGRATION_APP_UPDATE_BUTTON)
+                    MigrationElement.MIGRATION_APP_UPDATE_BUTTON,
+                )
                 banner.setSecondaryButton(
                     resources.getString(R.string.app_update_needed_banner_learn_more_button),
-                    MigrationElement.MIGRATION_APP_UPDATE_LEARN_MORE_BUTTON)
+                    MigrationElement.MIGRATION_APP_UPDATE_LEARN_MORE_BUTTON,
+                )
                 banner.title = resources.getString(R.string.app_update_needed_banner_title)
 
                 if (appsList.size > 1) {
@@ -460,7 +581,8 @@
                     banner.summary =
                         resources.getString(
                             R.string.app_update_needed_banner_description_single,
-                            appsList[0].appMetadata.appName)
+                            appsList[0].appMetadata.appName,
+                        )
                 }
 
                 banner.key = BANNER_PREFERENCE_KEY
@@ -480,23 +602,26 @@
                 }
                 banner.setIsDismissable(true)
                 banner.setDismissAction(
-                    MigrationElement.MIGRATION_APP_UPDATE_BANNER_DISMISS_BUTTON) {
-                        val sharedPreference =
-                            requireActivity()
-                                .getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
-                        sharedPreference.edit().apply {
-                            putBoolean(APP_UPDATE_NEEDED_BANNER_SEEN, true)
-                            apply()
-                        }
-                        preferenceScreen.removePreference(banner)
+                    MigrationElement.MIGRATION_APP_UPDATE_BANNER_DISMISS_BUTTON
+                ) {
+                    val sharedPreference =
+                        requireActivity()
+                            .getSharedPreferences(USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+                    sharedPreference.edit().apply {
+                        putBoolean(APP_UPDATE_NEEDED_BANNER_SEEN, true)
+                        apply()
                     }
+                    preferenceScreen.removePreference(banner)
+                }
             }
     }
 
     private fun setUpEmptyState() {
         mTopIntro.title = getString(R.string.connected_apps_empty_list_section_title)
-        if (deviceInfoUtils.isPlayStoreAvailable(requireContext()) ||
-            deviceInfoUtils.isSendFeedbackAvailable(requireContext())) {
+        if (
+            deviceInfoUtils.isPlayStoreAvailable(requireContext()) ||
+                deviceInfoUtils.isSendFeedbackAvailable(requireContext())
+        ) {
             mThingsToTryCategory.isVisible = true
         }
         if (deviceInfoUtils.isPlayStoreAvailable(requireContext())) {
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/ConnectedAppsViewModel.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/ConnectedAppsViewModel.kt
index 97fcdd4..d31a522 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/ConnectedAppsViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/ConnectedAppsViewModel.kt
@@ -22,6 +22,7 @@
 import androidx.lifecycle.viewModelScope
 import com.android.healthconnect.controller.permissions.api.RevokeAllHealthPermissionsUseCase
 import com.android.healthconnect.controller.permissions.connectedapps.searchapps.SearchHealthPermissionApps
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAllDataUseCase
 import com.android.healthconnect.controller.service.IoDispatcher
 import com.android.healthconnect.controller.shared.app.ConnectedAppMetadata
 import com.android.healthconnect.controller.utils.postValueIfUpdated
@@ -37,7 +38,8 @@
     private val loadHealthPermissionApps: ILoadHealthPermissionApps,
     private val searchHealthPermissionApps: SearchHealthPermissionApps,
     private val revokeAllHealthPermissionsUseCase: RevokeAllHealthPermissionsUseCase,
-    @IoDispatcher val ioDispatcher: CoroutineDispatcher
+    private val deleteAllDataUseCase: DeleteAllDataUseCase,
+    @IoDispatcher val ioDispatcher: CoroutineDispatcher,
 ) : ViewModel() {
 
     companion object {
@@ -74,7 +76,8 @@
     fun searchConnectedApps(searchValue: String) {
         viewModelScope.launch {
             _connectedApps.postValueIfUpdated(
-                searchHealthPermissionApps.search(loadHealthPermissionApps.invoke(), searchValue))
+                searchHealthPermissionApps.search(loadHealthPermissionApps.invoke(), searchValue)
+            )
         }
     }
 
@@ -97,6 +100,10 @@
         return false
     }
 
+    fun deleteAllData() {
+        viewModelScope.launch { deleteAllDataUseCase.invoke() }
+    }
+
     sealed class DisconnectAllState {
         object NotStarted : DisconnectAllState()
 
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/HealthAppPreference.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/HealthAppPreference.kt
index 793d0bb..05be59a 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/HealthAppPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/HealthAppPreference.kt
@@ -18,10 +18,9 @@
 import android.content.Context
 import android.text.TextUtils
 import androidx.preference.Preference
-import androidx.preference.PreferenceViewHolder
+import androidx.preference.Preference.OnPreferenceClickListener
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.utils.logging.ElementName
-import com.android.healthconnect.controller.utils.logging.ErrorPageElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import com.android.healthconnect.controller.utils.logging.UnknownGenericElement
@@ -32,7 +31,7 @@
     AppPreference(context), ComparablePreference {
 
     private var logger: HealthConnectLogger
-    var logName : ElementName = UnknownGenericElement.UNKNOWN_HEALTH_PREFERENCE
+    var logName: ElementName = UnknownGenericElement.UNKNOWN_HEALTH_PREFERENCE
 
     init {
         title = appMetadata.appName
@@ -40,7 +39,9 @@
 
         val hiltEntryPoint =
             EntryPointAccessors.fromApplication(
-                context.applicationContext, HealthConnectLoggerEntryPoint::class.java)
+                context.applicationContext,
+                HealthConnectLoggerEntryPoint::class.java,
+            )
         logger = hiltEntryPoint.logger()
     }
 
@@ -67,10 +68,6 @@
     override fun hasSameContents(preference: Preference): Boolean {
         return preference is HealthAppPreference && appMetadata == preference.appMetadata
     }
-
-    override fun onBindViewHolder(view: PreferenceViewHolder) {
-        super.onBindViewHolder(view)
-    }
 }
 
 /** Allows comparison with a [Preference] to determine if it has been changed. */
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/SettingsManagePermissionFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/SettingsManagePermissionFragment.kt
index 09559fd..a45503a 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/SettingsManagePermissionFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/SettingsManagePermissionFragment.kt
@@ -39,7 +39,6 @@
 import androidx.annotation.StringRes
 import androidx.core.os.bundleOf
 import androidx.fragment.app.viewModels
-import androidx.navigation.fragment.findNavController
 import androidx.preference.Preference
 import androidx.preference.PreferenceGroup
 import com.android.healthconnect.controller.R
@@ -61,7 +60,6 @@
 import com.android.healthconnect.controller.utils.logging.AppPermissionsElement
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.showLoadingDialog
-import com.android.settingslib.widget.AppPreference
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
@@ -176,7 +174,7 @@
         }
     }
 
-    private fun getAppPreference(app: ConnectedAppMetadata): AppPreference {
+    private fun getAppPreference(app: ConnectedAppMetadata): HealthAppPreference {
         return HealthAppPreference(requireContext(), app.appMetadata).also {
             if (app.status == ALLOWED) {
                 it.logName = AppPermissionsElement.CONNECTED_APP_BUTTON
@@ -197,16 +195,22 @@
 
     private fun navigateToSettingsAppInfoScreen(app: ConnectedAppMetadata) {
         val navigationId =
-                when (app.permissionsType) {
-                    AppPermissionsType.FITNESS_PERMISSIONS_ONLY -> R.id.action_settingsManagePermission_to_settingsFitnessApp
-                    AppPermissionsType.MEDICAL_PERMISSIONS_ONLY -> R.id.action_settingsManagePermission_to_settingsMedicalApp
-                    AppPermissionsType.COMBINED_PERMISSIONS -> R.id.action_settingsManagePermission_to_settingsCombinedPermissions
-                }
+            when (app.permissionsType) {
+                AppPermissionsType.FITNESS_PERMISSIONS_ONLY ->
+                    R.id.action_settingsManagePermission_to_settingsFitnessApp
+                AppPermissionsType.MEDICAL_PERMISSIONS_ONLY ->
+                    R.id.action_settingsManagePermission_to_settingsMedicalApp
+                AppPermissionsType.COMBINED_PERMISSIONS ->
+                    R.id.action_settingsManagePermission_to_settingsCombinedPermissions
+            }
         navigationUtils.navigate(
-                fragment = this,
-                action = navigationId,
-                bundle = bundleOf(
-                        EXTRA_PACKAGE_NAME to app.appMetadata.packageName,
-                        EXTRA_APP_NAME to app.appMetadata.appName))
+            fragment = this,
+            action = navigationId,
+            bundle =
+                bundleOf(
+                    EXTRA_PACKAGE_NAME to app.appMetadata.packageName,
+                    EXTRA_APP_NAME to app.appMetadata.appName,
+                ),
+        )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/AllDataTypesScreen.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/AllDataTypesScreen.kt
new file mode 100644
index 0000000..1cbe977
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/AllDataTypesScreen.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.connectedapps.wear
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.res.stringResource
+import androidx.wear.compose.material3.Text
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionStrings
+import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.request.wear.elements.Chip
+import com.android.healthconnect.controller.permissions.request.wear.elements.ScrollableScreen
+
+/** Wear Settings Permissions Screen to see allowed/disallowed status for all apps. */
+@Composable
+fun AllDataTypesScreen(viewModel: WearConnectedAppsViewModel, onClick: (String, String) -> Unit) {
+    val connectedApps by viewModel.connectedApps.collectAsState()
+    val dataTypeToAllowedApps by viewModel.dataTypeToAllowedApps.collectAsState()
+    val dataTypeToDeniedApps by viewModel.dataTypeToDeniedApps.collectAsState()
+    val systemHealthPermissions by viewModel.systemHealthPermissions.collectAsState()
+    val nTotalApps = connectedApps.size
+
+    ScrollableScreen(showTimeText = false, title = stringResource(R.string.fitness_and_wellness)) {
+        item {
+            Row(horizontalArrangement = Arrangement.Start) {
+                Text(stringResource(R.string.vitals_category_uppercase))
+            }
+        }
+
+        // Granular data type and the number of apps allowed.
+        items(systemHealthPermissions.size) { index ->
+            val healthPermission = systemHealthPermissions[index]
+            val strDataType =
+                stringResource(
+                    FitnessPermissionStrings.fromPermissionType(
+                            (healthPermission as HealthPermission.FitnessPermission)
+                                .fitnessPermissionType
+                        )
+                        .uppercaseLabel
+                )
+            val nAllowedApps = dataTypeToAllowedApps[healthPermission]?.size ?: 0
+            val nDeniedApps = dataTypeToDeniedApps[healthPermission]?.size ?: 0
+            val nRequestedApps = nAllowedApps + nDeniedApps
+            val enabled = nRequestedApps != 0
+            val message =
+                if (enabled) {
+                    stringResource(R.string.allowed_apps_count, nAllowedApps, nRequestedApps)
+                } else {
+                    stringResource(R.string.no_apps_requesting)
+                }
+            Chip(
+                label = strDataType,
+                labelMaxLines = 3,
+                secondaryLabel = message,
+                secondaryLabelMaxLines = 3,
+                onClick = { onClick(healthPermission.toString(), strDataType) },
+                enabled = enabled,
+            )
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/ControlBackgroundPermissionForSingleAppScreen.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/ControlBackgroundPermissionForSingleAppScreen.kt
new file mode 100644
index 0000000..99f8361
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/ControlBackgroundPermissionForSingleAppScreen.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.connectedapps.wear
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.res.stringResource
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionStrings
+import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission.Companion.READ_HEALTH_DATA_IN_BACKGROUND
+import com.android.healthconnect.controller.permissions.request.wear.elements.Chip
+import com.android.healthconnect.controller.permissions.request.wear.elements.ScrollableScreen
+
+/** Wear Settings Permissions Screen to allow/disallow background permission for an app. */
+@Composable
+fun ControlBackgroundReadForSingleAppScreen(
+    viewModel: WearConnectedAppsViewModel,
+    packageName: String,
+    onBackClick: () -> Unit,
+    onAppInfoPermissionClick: () -> Unit,
+) {
+    // Get app metadata. PackageName is passed from allowed/denied apps page and must be in the
+    // connectedApps list, thus it's safe to have nonnull!! assert.
+    val appMetadata by viewModel.getAppMetadataByPackageName(packageName).collectAsState()
+    val appName = appMetadata!!.appName
+
+    val allowedDataTypePermissions by viewModel.appToAllowedDataTypes.collectAsState()
+    val allowedDataTypesStr =
+        allowedDataTypePermissions[appMetadata!!]
+            ?.map { permission ->
+                stringResource(
+                    FitnessPermissionStrings.fromPermissionType(
+                            (permission as HealthPermission.FitnessPermission).fitnessPermissionType
+                        )
+                        .lowercaseLabel
+                )
+            }
+            ?.joinToString(", ") ?: ""
+
+    ScrollableScreen(
+        showTimeText = false,
+        title = stringResource(R.string.allow_all_the_time_prompt, appName),
+        subtitle = stringResource(R.string.current_access, appName, allowedDataTypesStr),
+    ) {
+        // Allow all the time button.
+        item {
+            Chip(
+                label = stringResource(R.string.request_permissions_allow_all_the_time),
+                labelMaxLines = 3,
+                onClick = {
+                    viewModel.updatePermission(
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        appMetadata!!,
+                        grant = true,
+                    )
+                    onBackClick()
+                },
+            )
+        }
+
+        // Only while in use button.
+        item {
+            Chip(
+                label = stringResource(R.string.request_permissions_while_using_the_app),
+                labelMaxLines = 3,
+                onClick = {
+                    viewModel.updatePermission(
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        appMetadata!!,
+                        grant = false,
+                    )
+                    onBackClick()
+                },
+            )
+        }
+
+        // Manage fitness&wellness button, clicking this launches AppInfoPermission page.
+        item {
+            Chip(
+                label = stringResource(R.string.manage_fitness_and_wellness_permissions),
+                labelMaxLines = 3,
+                onClick = { onAppInfoPermissionClick() },
+            )
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/ControlSingleDataTypeForSingleAppScreen.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/ControlSingleDataTypeForSingleAppScreen.kt
new file mode 100644
index 0000000..79e9bbe
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/ControlSingleDataTypeForSingleAppScreen.kt
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.connectedapps.wear
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.wear.compose.material3.RadioButton
+import androidx.wear.compose.material3.Text
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission.Companion.fromPermissionString
+import com.android.healthconnect.controller.permissions.request.wear.elements.Chip
+import com.android.healthconnect.controller.permissions.request.wear.elements.ScrollableScreen
+
+/** Wear Settings Permissions Screen to allow/disallow a single data type permission for an app. */
+@Composable
+fun ControlSingleDataTypeForSingleAppScreen(
+    viewModel: WearConnectedAppsViewModel,
+    permissionStr: String,
+    dataTypeStr: String,
+    packageName: String,
+    onAdditionalPermissionClick: (String) -> Unit,
+) {
+    val healthPermission = fromPermissionString(permissionStr)
+
+    // Get app metadata. PackageName is passed from allowed/denied apps page and must be in the
+    // connectedApps list, thus it's safe to have nonnull!! assert.
+    val appMetadata by viewModel.getAppMetadataByPackageName(packageName).collectAsState()
+
+    val dataTypeToAllowedApps by viewModel.dataTypeToAllowedApps.collectAsState()
+    // Whether this data type permission is allowed (foreground).
+    var allowed by remember { mutableStateOf(true) }
+    allowed = dataTypeToAllowedApps[healthPermission]?.any { it.packageName == packageName } == true
+
+    // Background permission status.
+    val backgroundReadStatus by viewModel.appToBackgroundReadStatus.collectAsState()
+    val isBackgroundPermissionRequested = appMetadata!! in backgroundReadStatus
+
+    ScrollableScreen(showTimeText = false, title = appMetadata!!.appName) {
+        // Data type text.
+        item { Row(horizontalArrangement = Arrangement.Start) { Text(dataTypeStr) } }
+
+        // "Allowed" radio button.
+        item {
+            RadioButton(
+                modifier = Modifier.fillMaxWidth(),
+                enabled = true,
+                selected = allowed,
+                onSelect = {
+                    viewModel.updatePermission(healthPermission, appMetadata!!, grant = true)
+                    allowed = true
+                },
+                label = { Text(stringResource(R.string.allowed)) },
+            )
+        }
+
+        // "Don't allow" radio button.
+        item {
+            RadioButton(
+                modifier = Modifier.fillMaxWidth(),
+                enabled = true,
+                selected = !allowed,
+                onSelect = {
+                    viewModel.updatePermission(healthPermission, appMetadata!!, grant = false)
+                    allowed = false
+                },
+                label = { Text(stringResource(R.string.request_permissions_dont_allow)) },
+            )
+        }
+
+        // Button to allow/disallow background permission.
+        item {
+            Chip(
+                label = stringResource(R.string.additional_access_label),
+                labelMaxLines = 3,
+                onClick = { onAdditionalPermissionClick(packageName) },
+                enabled = isBackgroundPermissionRequested,
+            )
+        }
+
+        // Allow mode text.
+        item {
+            val message =
+                if (backgroundReadStatus[appMetadata!!] == true) {
+                    stringResource(R.string.view_permissions_all_the_time)
+                } else {
+                    stringResource(R.string.view_permissions_while_in_use)
+                }
+            Row(horizontalArrangement = Arrangement.Start) {
+                Text(stringResource(R.string.current_allow_mode, appMetadata!!.appName, message))
+            }
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/PerDataTypeScreen.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/PerDataTypeScreen.kt
new file mode 100644
index 0000000..8f73b61
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/PerDataTypeScreen.kt
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.connectedapps.wear
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material3.Text
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission.Companion.fromPermissionString
+import com.android.healthconnect.controller.permissions.request.wear.elements.Chip
+import com.android.healthconnect.controller.permissions.request.wear.elements.ScrollableScreen
+
+/** Wear Settings Permissions Screen to see allowed/disallowed status for one app. */
+@Composable
+fun PerDataTypeScreen(
+    viewModel: WearConnectedAppsViewModel,
+    permissionStr: String,
+    dataTypeStr: String,
+    onAppChipClick: (String, String, String) -> Unit,
+    onRemoveAllAppAccessButtonClick: (String, String) -> Unit,
+) {
+    val healthPermission = fromPermissionString(permissionStr)
+    ScrollableScreen(showTimeText = false, title = dataTypeStr) {
+        // Allowed apps.
+        item {
+            AllowedAppsList(
+                viewModel,
+                healthPermission,
+                dataTypeStr,
+                onAppChipClick,
+                onRemoveAllAppAccessButtonClick,
+            )
+        }
+
+        // Notes on what this permission is about.
+        item {
+            Row(horizontalArrangement = Arrangement.Start) {
+                Text(stringResource(R.string.access_sensor_note, dataTypeStr))
+            }
+        }
+
+        // Not allowed apps.
+        item { DeniedAppsList(viewModel, healthPermission, dataTypeStr, onAppChipClick) }
+    }
+}
+
+@Composable
+fun AllowedAppsList(
+    viewModel: WearConnectedAppsViewModel,
+    healthPermission: HealthPermission,
+    dataTypeStr: String,
+    onAppChipClick: (String, String, String) -> Unit,
+    onRemoveAllAppAccessButtonClick: (String, String) -> Unit,
+) {
+    val dataTypeToAllowedApps by viewModel.dataTypeToAllowedApps.collectAsState()
+    val allowedApps = dataTypeToAllowedApps[healthPermission]
+    if (allowedApps?.isNotEmpty() == true) {
+        val nApps = allowedApps.size
+        Column {
+            // Allowed text.
+            Text(stringResource(R.string.allowed))
+
+            // A chip for each allowed app for this data type.
+            allowedApps.forEach { app ->
+                Chip(
+                    label = app.appName,
+                    labelMaxLines = 3,
+                    onClick = {
+                        onAppChipClick(healthPermission.toString(), dataTypeStr, app.packageName)
+                    },
+                    icon = app.icon,
+                    modifier = Modifier.padding(4.dp),
+                )
+            }
+
+            // Remove access for all apps button.
+            Chip(
+                label = stringResource(R.string.disconnect_all_apps),
+                labelMaxLines = 3,
+                onClick = {
+                    onRemoveAllAppAccessButtonClick(healthPermission.toString(), dataTypeStr)
+                },
+                icon = R.drawable.ic_remove_access_for_all_apps,
+            )
+        }
+    }
+}
+
+@Composable
+fun DeniedAppsList(
+    viewModel: WearConnectedAppsViewModel,
+    healthPermission: HealthPermission,
+    dataTypeStr: String,
+    onAppChipClick: (String, String, String) -> Unit,
+) {
+    val dataTypeToDeniedApps by viewModel.dataTypeToDeniedApps.collectAsState()
+    val deniedApps = dataTypeToDeniedApps[healthPermission]
+    if (deniedApps?.isNotEmpty() == true) {
+        val nApps = deniedApps.size
+        Column {
+            // Not allowed text.
+            Text(stringResource(R.string.not_allowed))
+
+            // A chip for each denied app for this data type.
+            deniedApps.forEach { app ->
+                Chip(
+                    label = app.appName,
+                    labelMaxLines = 3,
+                    onClick = {
+                        onAppChipClick(healthPermission.toString(), dataTypeStr, app.packageName)
+                    },
+                    icon = app.icon,
+                    modifier = Modifier.padding(4.dp),
+                )
+            }
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/RemoveAllAppsOnePermissionScreen.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/RemoveAllAppsOnePermissionScreen.kt
new file mode 100644
index 0000000..cd051e3
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/RemoveAllAppsOnePermissionScreen.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package com.android.healthconnect.controller.permissions.connectedapps.wear
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.wear.compose.material3.Button
+import androidx.wear.compose.material3.Icon
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission.Companion.fromPermissionString
+import com.android.healthconnect.controller.permissions.request.wear.elements.ScrollableScreen
+
+/** Wear Settings Permissions Screen to remove access to a data type for all apps. */
+@Composable
+fun RemoveAllAppsOnePermissionScreen(
+    viewModel: WearConnectedAppsViewModel,
+    permissionStr: String,
+    dataTypeStr: String,
+    onBackClick: () -> Unit,
+) {
+    val healthPermission = fromPermissionString(permissionStr)
+    ScrollableScreen(
+        showTimeText = false,
+        title = stringResource(R.string.remove_one_permission_for_all, dataTypeStr),
+    ) {
+        item {
+            Row(
+                horizontalArrangement = Arrangement.SpaceAround,
+                modifier = Modifier.fillMaxWidth(),
+            ) {
+                // Not revoke permissions, get back to per data type screen.
+                // TODO: b/373692569 - Use AlertDialog.Confirm and Dismiss Buttons.
+                Button(onClick = { onBackClick() }) {
+                    Icon(
+                        painter = painterResource(id = R.drawable.ic_cross),
+                        contentDescription = stringResource(R.string.icon_content_cross_mark),
+                    )
+                }
+                // Button to revoke this permission for all apps.
+                Button(
+                    onClick = {
+                        viewModel.removeFitnessPermissionForAllApps(
+                            healthPermission as HealthPermission.FitnessPermission
+                        )
+                        onBackClick()
+                    }
+                ) {
+                    Icon(
+                        painter = painterResource(id = R.drawable.ic_check),
+                        contentDescription = stringResource(R.string.icon_content_check_mark),
+                    )
+                }
+            }
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearConnectedAppsViewModel.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearConnectedAppsViewModel.kt
new file mode 100644
index 0000000..2c72a58
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearConnectedAppsViewModel.kt
@@ -0,0 +1,227 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.permissions.connectedapps.wear
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.android.healthconnect.controller.permissions.api.GrantHealthPermissionUseCase
+import com.android.healthconnect.controller.permissions.api.RevokeHealthPermissionUseCase
+import com.android.healthconnect.controller.permissions.app.LoadAppPermissionsStatusUseCase
+import com.android.healthconnect.controller.permissions.connectedapps.ILoadHealthPermissionApps
+import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission.Companion.READ_HEALTH_DATA_IN_BACKGROUND
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission.Companion.fromPermissionString
+import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.shared.app.AppMetadata
+import com.android.healthconnect.controller.shared.app.ConnectedAppMetadata
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+import kotlin.collections.MutableList
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.launch
+
+@HiltViewModel
+class WearConnectedAppsViewModel
+@Inject
+constructor(
+    private val loadHealthPermissionApps: ILoadHealthPermissionApps,
+    private val loadAppPermissionsStatusUseCase: LoadAppPermissionsStatusUseCase,
+    private val grantPermissionsStatusUseCase: GrantHealthPermissionUseCase,
+    private val revokeHealthPermissionUseCase: RevokeHealthPermissionUseCase,
+    private val healthPermissionReader: HealthPermissionReader,
+) : ViewModel() {
+
+    companion object {
+        private const val TAG = "WearConnectedAppsViewModel"
+    }
+
+    /** A list of [AppMetadata] of all the apps that requests health permissions. */
+    val connectedApps = MutableStateFlow<List<ConnectedAppMetadata>>(emptyList())
+
+    /** Mapping from [HealthPermission] to a list of [AppMetadata] of the allowed apps. */
+    val dataTypeToAllowedApps =
+        MutableStateFlow<Map<HealthPermission, MutableList<AppMetadata>>>(emptyMap())
+
+    /** Mapping from [HealthPermission] to a list of [AppMetadata] of the denied apps. */
+    val dataTypeToDeniedApps =
+        MutableStateFlow<Map<HealthPermission, MutableList<AppMetadata>>>(emptyMap())
+
+    /**
+     * Mapping from [AppMetadata] of the all connected apps to a boolean representing whether
+     * background permission is granted.
+     */
+    val appToBackgroundReadStatus = MutableStateFlow<Map<AppMetadata, Boolean>>(emptyMap())
+
+    /**
+     * Mapping from [AppMetadata] of the all connected apps to a list of all the allowed
+     * [HealthPermission].
+     */
+    val appToAllowedDataTypes =
+        MutableStateFlow<Map<AppMetadata, MutableList<HealthPermission>>>(emptyMap())
+
+    /** A list of [HealthPermission] that are at system level (not restricted to HC-only). */
+    val systemHealthPermissions = MutableStateFlow<List<HealthPermission>>(emptyList())
+
+    init {
+        loadConnectedApps()
+    }
+
+    fun loadConnectedApps() {
+        viewModelScope.launch {
+            connectedApps.value = loadHealthPermissionApps.invoke()
+
+            // Load system health permissions and granular permission to allowed/denied apps maps.
+            val sysHealthPermissions =
+                healthPermissionReader.getSystemHealthPermissions().map { perm ->
+                    fromPermissionString(perm)
+                }
+            systemHealthPermissions.value = sysHealthPermissions
+
+            // Init dataTypeToAllowedApps and dataTypeToDeniedApps.
+            // For each granular health permission, create a mapping of the allowed and denied apps.
+            val allowedAppsMap = mutableMapOf<HealthPermission, MutableList<AppMetadata>>()
+            val deniedAppsMap = mutableMapOf<HealthPermission, MutableList<AppMetadata>>()
+            val backgroundReadPermissionStatus = mutableMapOf<AppMetadata, Boolean>()
+            val allowedDataTypesMap = mutableMapOf<AppMetadata, MutableList<HealthPermission>>()
+            connectedApps.value.forEach { connectedAppMetadata ->
+                val packageName = connectedAppMetadata.appMetadata.packageName
+                val healthPermissionStatus = loadAppPermissionsStatusUseCase.invoke(packageName)
+                healthPermissionStatus
+                    .filter { sysHealthPermissions.contains(it.healthPermission) }
+                    .forEach { status ->
+                        val permission = status.healthPermission
+                        val appList = if (status.isGranted) allowedAppsMap else deniedAppsMap
+                        appList
+                            .getOrPut(permission) { mutableListOf() }
+                            .add(connectedAppMetadata.appMetadata)
+                        if (status.isGranted) {
+                            allowedDataTypesMap
+                                .getOrPut(connectedAppMetadata.appMetadata) { mutableListOf() }
+                                .add(permission)
+                        }
+                    }
+                healthPermissionStatus
+                    .firstOrNull { it.healthPermission == READ_HEALTH_DATA_IN_BACKGROUND }
+                    ?.let {
+                        backgroundReadPermissionStatus[connectedAppMetadata.appMetadata] =
+                            it.isGranted
+                    }
+            }
+            dataTypeToAllowedApps.value = allowedAppsMap
+            dataTypeToDeniedApps.value = deniedAppsMap
+            appToBackgroundReadStatus.value = backgroundReadPermissionStatus
+            appToAllowedDataTypes.value = allowedDataTypesMap
+        }
+    }
+
+    /** Grant or revoke a specific permission for an app. */
+    fun updatePermission(permission: HealthPermission, appMetadata: AppMetadata, grant: Boolean) {
+        if (grant) {
+            grantPermissionsStatusUseCase.invoke(appMetadata.packageName, permission.toString())
+        } else {
+            revokeHealthPermissionUseCase.invoke(appMetadata.packageName, permission.toString())
+        }
+
+        // Update app to background status map.
+        if (permission == READ_HEALTH_DATA_IN_BACKGROUND) {
+            appToBackgroundReadStatus.value =
+                appToBackgroundReadStatus.value.toMutableMap().also { it[appMetadata] = grant }
+            return
+        }
+
+        // Update app to allowed data types map.
+        appToAllowedDataTypes.value =
+            appToAllowedDataTypes.value.toMutableMap().also { map ->
+                if (grant) {
+                    map[appMetadata] =
+                        (map[appMetadata] ?: mutableListOf()).also {
+                            if (permission !in it) it.add(permission)
+                        }
+                } else {
+                    map[appMetadata]?.remove(permission)
+                    if (map[appMetadata]?.isEmpty() == true) {
+                        map.remove(appMetadata)
+                    }
+                }
+            }
+
+        // Update data type to allowed/denied apps map.
+        val mapToAdd =
+            if (grant) {
+                dataTypeToAllowedApps
+            } else {
+                dataTypeToDeniedApps
+            }
+        val mapToRemove =
+            if (grant) {
+                dataTypeToDeniedApps
+            } else {
+                dataTypeToAllowedApps
+            }
+        mapToAdd.value =
+            mapToAdd.value.toMutableMap().also {
+                it[permission] =
+                    (it[permission] ?: mutableListOf()).also { appsList ->
+                        if (appsList.none { it.packageName == appMetadata.packageName }) {
+                            appsList.add(appMetadata)
+                        }
+                    }
+            }
+        mapToRemove.value =
+            mapToRemove.value.toMutableMap().also {
+                it[permission] =
+                    (it[permission] ?: mutableListOf()).also { appsList ->
+                        appsList.removeIf { it.packageName == appMetadata.packageName }
+                        if (appsList.isEmpty()) {
+                            it.remove(permission)
+                        }
+                    }
+            }
+    }
+
+    /** Removes all apps from accessing a specific fitness permission. */
+    fun removeFitnessPermissionForAllApps(permission: HealthPermission) {
+        val permissionStr = permission.toString()
+
+        // Update data type to allowed/denied apps map.
+        val deniedAppsMap = dataTypeToDeniedApps.value.toMutableMap()
+        dataTypeToAllowedApps.value[permission]?.forEach { appMetadata ->
+            revokeHealthPermissionUseCase.invoke(appMetadata.packageName, permissionStr)
+            deniedAppsMap.getOrPut(permission) { mutableListOf() }.add(appMetadata)
+        }
+        dataTypeToAllowedApps.value = dataTypeToAllowedApps.value - permission
+        dataTypeToDeniedApps.value = deniedAppsMap
+
+        // Update app to allowed data types map.
+        appToAllowedDataTypes.value =
+            appToAllowedDataTypes.value.toMutableMap().also { map ->
+                map.keys.forEach { appMetadata ->
+                    map[appMetadata]?.remove(permission)
+                    if (map[appMetadata]?.isEmpty() == true) {
+                        map.remove(appMetadata)
+                    }
+                }
+            }
+    }
+
+    fun getAppMetadataByPackageName(packageName: String): MutableStateFlow<AppMetadata?> =
+        MutableStateFlow<AppMetadata?>(null).also { flow ->
+            flow.value =
+                connectedApps.value
+                    .firstOrNull { it.appMetadata.packageName == packageName }
+                    ?.appMetadata
+        }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearSettingsPermissionActivity.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearSettingsPermissionActivity.kt
new file mode 100644
index 0000000..95983d1
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearSettingsPermissionActivity.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.connectedapps.wear
+
+import android.content.pm.PackageManager
+import android.os.Bundle
+import android.util.Log
+import android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import com.android.healthfitness.flags.Flags
+import dagger.hilt.android.AndroidEntryPoint
+
+/** Wear Settings Permission activity for Health&Fitness. */
+@AndroidEntryPoint(ComponentActivity::class)
+class WearSettingsPermissionActivity : Hilt_WearSettingsPermissionActivity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        if (
+            !getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH) ||
+                !Flags.replaceBodySensorPermissionEnabled()
+        ) {
+            Log.e(
+                TAG,
+                "Health connect is not available on watch, activity should not have been started, " +
+                    "finishing!",
+            )
+            return
+        }
+
+        // This flag ensures a non system app cannot show an overlay on Health Connect. b/313425281
+        window.addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
+
+        setContent { WearSettingsPermissionsNavGraph() }
+    }
+
+    companion object {
+        private const val TAG = "WearSettingsPermissionActivity"
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearSettingsPermissionsNavGraph.kt b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearSettingsPermissionsNavGraph.kt
new file mode 100644
index 0000000..34c1b4e
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/connectedapps/wear/WearSettingsPermissionsNavGraph.kt
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.connectedapps.wear
+
+import android.content.Intent
+import androidx.activity.compose.rememberLauncherForActivityResult
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.platform.LocalContext
+import androidx.hilt.navigation.compose.hiltViewModel
+import androidx.navigation.NavType
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.rememberNavController
+import androidx.navigation.navArgument
+import com.android.healthconnect.controller.permissions.app.wear.WearViewAppInfoPermissionsActivity
+
+/** Wear Settings Permissions navigation graph. */
+@Composable
+fun WearSettingsPermissionsNavGraph() {
+    val viewModel = hiltViewModel<WearConnectedAppsViewModel>()
+    val navController = rememberNavController()
+    NavHost(navController = navController, startDestination = PermissionManagerScreen.Vitals.name) {
+        composable(route = PermissionManagerScreen.Vitals.name) {
+            AllDataTypesScreen(
+                viewModel,
+                onClick = { permissionStr, dataTypeStr ->
+                    navController.navigate(
+                        "${PermissionManagerScreen.PerDataType.name}/$permissionStr/$dataTypeStr"
+                    )
+                },
+            )
+        }
+
+        composable(
+            route = "${PermissionManagerScreen.PerDataType.name}/{permissionStr}/{dataTypeStr}",
+            arguments =
+                listOf(
+                    navArgument("permissionStr") { type = NavType.StringType },
+                    navArgument("dataTypeStr") { type = NavType.StringType },
+                ),
+        ) { backStackEntry ->
+            val permissionStr = backStackEntry.arguments?.getString("permissionStr") ?: ""
+            val dataTypeStr = backStackEntry.arguments?.getString("dataTypeStr") ?: ""
+            PerDataTypeScreen(
+                viewModel,
+                permissionStr,
+                dataTypeStr,
+                onAppChipClick = { permissionStr, dataTypeStr, packageName ->
+                    navController.navigate(
+                        "${PermissionManagerScreen.PerDataTypePerApp.name}/$permissionStr/$dataTypeStr/$packageName"
+                    )
+                },
+                onRemoveAllAppAccessButtonClick = { permissionStr, dataTypeStr ->
+                    navController.navigate(
+                        "${PermissionManagerScreen.RemoveAll.name}/$permissionStr/$dataTypeStr"
+                    )
+                },
+            )
+        }
+
+        composable(
+            route = "${PermissionManagerScreen.RemoveAll.name}/{permissionStr}/{dataTypeStr}",
+            arguments =
+                listOf(
+                    navArgument("permissionStr") { type = NavType.StringType },
+                    navArgument("dataTypeStr") { type = NavType.StringType },
+                ),
+        ) { backStackEntry ->
+            val permissionStr = backStackEntry.arguments?.getString("permissionStr") ?: ""
+            val dataTypeStr = backStackEntry.arguments?.getString("dataTypeStr") ?: ""
+            RemoveAllAppsOnePermissionScreen(
+                viewModel,
+                permissionStr,
+                dataTypeStr,
+                onBackClick = { navController.popBackStack() },
+            )
+        }
+
+        composable(
+            route =
+                "${PermissionManagerScreen.PerDataTypePerApp.name}/{permissionStr}/{dataTypeStr}/{packageName}",
+            arguments =
+                listOf(
+                    navArgument("permissionStr") { type = NavType.StringType },
+                    navArgument("dataTypeStr") { type = NavType.StringType },
+                    navArgument("packageName") { type = NavType.StringType },
+                ),
+        ) { backStackEntry ->
+            val permissionStr = backStackEntry.arguments?.getString("permissionStr") ?: ""
+            val dataTypeStr = backStackEntry.arguments?.getString("dataTypeStr") ?: ""
+            val packageName = backStackEntry.arguments?.getString("packageName") ?: ""
+            ControlSingleDataTypeForSingleAppScreen(
+                viewModel,
+                permissionStr,
+                dataTypeStr,
+                packageName,
+                onAdditionalPermissionClick = {
+                    navController.navigate(
+                        "${PermissionManagerScreen.BackgroundPermission.name}/$packageName"
+                    )
+                },
+            )
+        }
+
+        composable(
+            route = "${PermissionManagerScreen.BackgroundPermission.name}/{packageName}",
+            arguments = listOf(navArgument("packageName") { type = NavType.StringType }),
+        ) { backStackEntry ->
+            // Handle the activity result and re-initialize the ViewModel when swipe back.
+            val launcher =
+                rememberLauncherForActivityResult(
+                    contract = ActivityResultContracts.StartActivityForResult()
+                ) {
+                    viewModel.loadConnectedApps()
+                }
+            val packageName = backStackEntry.arguments?.getString("packageName") ?: ""
+            val context = LocalContext.current
+            ControlBackgroundReadForSingleAppScreen(
+                viewModel,
+                packageName,
+                onBackClick = { navController.popBackStack() },
+                onAppInfoPermissionClick = {
+                    // Launch AppInfo->Permissions->Fitness&Wellness screen.
+                    val intent =
+                        Intent(context, WearViewAppInfoPermissionsActivity::class.java).apply {
+                            putExtra(android.content.Intent.EXTRA_PACKAGE_NAME, packageName)
+                        }
+                    launcher.launch(intent)
+                },
+            )
+        }
+    }
+}
+
+enum class PermissionManagerScreen() {
+    Vitals,
+    PerDataType,
+    RemoveAll,
+    PerDataTypePerApp,
+    BackgroundPermission,
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/data/AdditionalPermissionStrings.kt b/apk/src/com/android/healthconnect/controller/permissions/data/AdditionalPermissionStrings.kt
index cfc477a..5a92005 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/data/AdditionalPermissionStrings.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/data/AdditionalPermissionStrings.kt
@@ -15,48 +15,235 @@
  */
 package com.android.healthconnect.controller.permissions.data
 
-import android.health.connect.HealthPermissions
 import androidx.annotation.StringRes
 import com.android.healthconnect.controller.R
-import com.google.common.collect.ImmutableMap
 
 /** Represents the display strings used for Additional Permissions. */
 data class AdditionalPermissionStrings(
-    @StringRes val permissionTitle: Int,
-    @StringRes val permissionDescription: Int,
-    @StringRes val requestTitle: Int,
-    @StringRes val requestDescription: Int,
-    @StringRes val permissionDescriptionFallback: Int = 0,
-    @StringRes val requestDescriptionFallback: Int = 0
-) {
+    @StringRes val title: Int,
+    @StringRes val description: Int,
+    @StringRes val descriptionFallback: Int = 0,
+)
 
-    companion object {
-        fun fromAdditionalPermission(
-            additionalPermission: HealthPermission.AdditionalPermission
-        ): AdditionalPermissionStrings {
-            return ADDITIONAL_PERMISSION_STRINGS[additionalPermission.additionalPermission]
-                ?: throw IllegalArgumentException(
-                    "No strings for additional permission $additionalPermission")
+fun additionalPermissionString(
+    additionalPermission: HealthPermission.AdditionalPermission,
+    type: AccessType,
+    hasMedicalPermissions: Boolean,
+    isMedicalReadGranted: Boolean,
+    isFitnessReadGranted: Boolean,
+): AdditionalPermissionStrings {
+    return if (additionalPermission.isBackgroundReadPermission()) {
+        getBackgroundReadString(
+            type,
+            hasMedicalPermissions,
+            isMedicalReadGranted,
+            isFitnessReadGranted,
+        )
+    } else if (additionalPermission.isHistoryReadPermission()) {
+        getHistoryReadString(type, hasMedicalPermissions)
+    } else {
+        throw IllegalArgumentException("No strings for additional permission $additionalPermission")
+    }
+}
+
+private fun getHistoryReadString(
+    type: AccessType,
+    hasMedicalPermissions: Boolean,
+): AdditionalPermissionStrings {
+    return if (hasMedicalPermissions) {
+        getHistoryMedicalString(type)
+    } else {
+        getHistoryNonMedicalString(type)
+    }
+}
+
+private fun getHistoryNonMedicalString(type: AccessType): AdditionalPermissionStrings {
+    return when (type) {
+        AccessType.SINGLE_REQUEST -> {
+            AdditionalPermissionStrings(
+                title = R.string.history_read_single_request_title,
+                description = R.string.history_read_single_request_description,
+                descriptionFallback = R.string.history_read_single_request_description_fallback,
+            )
+        }
+        AccessType.COMBINED_REQUEST -> {
+            AdditionalPermissionStrings(
+                title = R.string.history_read_combined_request_title,
+                description = R.string.history_read_combined_request_description,
+                descriptionFallback = R.string.history_read_combined_request_description_fallback,
+            )
+        }
+        AccessType.ACCESS -> {
+            AdditionalPermissionStrings(
+                title = R.string.history_read_access_title,
+                description = R.string.history_read_access_description,
+                descriptionFallback = R.string.history_read_access_description_fallback,
+            )
         }
     }
 }
 
-private val ADDITIONAL_PERMISSION_STRINGS: ImmutableMap<String, AdditionalPermissionStrings> =
-    ImmutableMap.Builder<String, AdditionalPermissionStrings>()
-        .put(
-            HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND,
+private fun getHistoryMedicalString(type: AccessType): AdditionalPermissionStrings {
+    return when (type) {
+        AccessType.SINGLE_REQUEST -> {
             AdditionalPermissionStrings(
-                R.string.background_read_title,
-                R.string.background_read_description,
-                R.string.background_read_request_title,
-                R.string.background_read_request_description))
-        .put(
-            HealthPermissions.READ_HEALTH_DATA_HISTORY,
+                title = R.string.history_read_single_request_title,
+                description = R.string.history_read_medical_single_request_description,
+                descriptionFallback =
+                    R.string.history_read_medical_single_request_description_fallback,
+            )
+        }
+        AccessType.COMBINED_REQUEST -> {
             AdditionalPermissionStrings(
-                R.string.historic_access_title,
-                R.string.historic_access_description,
-                R.string.historic_access_request_title,
-                R.string.historic_access_request_description,
-                R.string.historic_access_description_fallback,
-                R.string.historic_access_request_description_fallback))
-        .buildOrThrow()
+                title = R.string.history_read_medical_combined_request_title,
+                description = R.string.history_read_medical_combined_request_description,
+                descriptionFallback =
+                    R.string.history_read_medical_combined_request_description_fallback,
+            )
+        }
+        AccessType.ACCESS -> {
+            AdditionalPermissionStrings(
+                title = R.string.history_read_medical_access_title,
+                description = R.string.history_read_medical_access_description,
+                descriptionFallback = R.string.history_read_medical_access_description_fallback,
+            )
+        }
+    }
+}
+
+private fun getBackgroundReadString(
+    type: AccessType,
+    hasMedicalPermissions: Boolean,
+    isMedicalReadGranted: Boolean,
+    isFitnessReadGranted: Boolean,
+): AdditionalPermissionStrings {
+    return if (hasMedicalPermissions) {
+        getBackgroundMedicalString(type, isMedicalReadGranted, isFitnessReadGranted)
+    } else {
+        getBackgroundNonMedicalString(type)
+    }
+}
+
+private fun getBackgroundNonMedicalString(type: AccessType): AdditionalPermissionStrings {
+    return when (type) {
+        AccessType.SINGLE_REQUEST -> {
+            AdditionalPermissionStrings(
+                title = R.string.background_read_single_request_title,
+                description = R.string.background_read_single_request_description,
+            )
+        }
+        AccessType.COMBINED_REQUEST -> {
+            AdditionalPermissionStrings(
+                title = R.string.background_read_combined_request_title,
+                description = R.string.background_read_combined_request_description,
+            )
+        }
+        AccessType.ACCESS -> {
+            AdditionalPermissionStrings(
+                title = R.string.background_read_access_title,
+                description = R.string.background_read_access_description,
+            )
+        }
+    }
+}
+
+private fun getBackgroundMedicalString(
+    type: AccessType,
+    isMedicalReadGranted: Boolean,
+    isFitnessReadGranted: Boolean,
+): AdditionalPermissionStrings {
+    return when (type) {
+        AccessType.SINGLE_REQUEST -> {
+            if (isMedicalReadGranted && isFitnessReadGranted) {
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_single_request_title,
+                    description =
+                        R.string
+                            .background_read_medical_single_request_description_both_types_granted,
+                )
+            } else if (isMedicalReadGranted) {
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_single_request_title,
+                    description =
+                        R.string.background_read_medical_single_request_description_medical_granted,
+                )
+            } else if (isFitnessReadGranted) {
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_single_request_title,
+                    description =
+                        R.string.background_read_medical_single_request_description_fitness_granted,
+                )
+            } else {
+                throw IllegalArgumentException(
+                    "No strings for this state of additional permission " +
+                        "${HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND}"
+                )
+            }
+        }
+        AccessType.COMBINED_REQUEST -> {
+            if (isMedicalReadGranted && isFitnessReadGranted) {
+                AdditionalPermissionStrings(
+                    title =
+                        R.string.background_read_medical_combined_request_title_both_types_granted,
+                    description =
+                        R.string
+                            .background_read_medical_combined_request_description_both_types_granted,
+                )
+            } else if (isMedicalReadGranted) {
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_medical_combined_request_title_medical_granted,
+                    description =
+                        R.string
+                            .background_read_medical_combined_request_description_medical_granted,
+                )
+            } else if (isFitnessReadGranted) {
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_medical_combined_request_title_fitness_granted,
+                    description =
+                        R.string
+                            .background_read_medical_combined_request_description_fitness_granted,
+                )
+            } else {
+                throw IllegalArgumentException(
+                    "No strings for this state of additional permission " +
+                        "${HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND}"
+                )
+            }
+        }
+        AccessType.ACCESS -> {
+            if (isMedicalReadGranted && isFitnessReadGranted) {
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_medical_access_title_both_types_granted,
+                    description =
+                        R.string.background_read_medical_access_description_both_types_granted,
+                )
+            } else if (isMedicalReadGranted) {
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_medical_access_title_medical_granted,
+                    description =
+                        R.string.background_read_medical_access_description_medical_granted,
+                )
+            } else if (isFitnessReadGranted) {
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_medical_access_title_fitness_granted,
+                    description =
+                        R.string.background_read_medical_access_description_fitness_granted,
+                )
+            } else {
+                // text to show when disabled
+                AdditionalPermissionStrings(
+                    title = R.string.background_read_medical_access_title_both_types_granted,
+                    description =
+                        R.string.background_read_medical_access_description_both_types_granted,
+                )
+            }
+        }
+    }
+}
+
+/** Defines the type of strings shown for additional permissions */
+enum class AccessType {
+    SINGLE_REQUEST,
+    COMBINED_REQUEST,
+    ACCESS,
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/data/FitnessPermissionStrings.kt b/apk/src/com/android/healthconnect/controller/permissions/data/FitnessPermissionStrings.kt
index 116dcc0..ea00571 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/data/FitnessPermissionStrings.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/data/FitnessPermissionStrings.kt
@@ -23,7 +23,7 @@
     @StringRes val uppercaseLabel: Int,
     @StringRes val lowercaseLabel: Int,
     @StringRes val readContentDescription: Int,
-    @StringRes val writeContentDescription: Int
+    @StringRes val writeContentDescription: Int,
 ) {
     companion object {
         fun fromPermissionType(
@@ -31,7 +31,8 @@
         ): FitnessPermissionStrings {
             return PERMISSION_TYPE_STRINGS[fitnessPermissionType]
                 ?: throw IllegalArgumentException(
-                    "No strings for permission group " + fitnessPermissionType.name)
+                    "No strings for permission group " + fitnessPermissionType.name
+                )
         }
     }
 }
@@ -44,252 +45,333 @@
                 R.string.active_calories_burned_uppercase_label,
                 R.string.active_calories_burned_lowercase_label,
                 R.string.active_calories_burned_read_content_description,
-                R.string.active_calories_burned_write_content_description))
+                R.string.active_calories_burned_write_content_description,
+            ),
+        )
+        .put(
+            FitnessPermissionType.ACTIVITY_INTENSITY,
+            FitnessPermissionStrings(
+                R.string.activity_intensity_uppercase_label,
+                R.string.activity_intensity_lowercase_label,
+                R.string.activity_intensity_read_content_description,
+                R.string.activity_intensity_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.DISTANCE,
             FitnessPermissionStrings(
                 R.string.distance_uppercase_label,
                 R.string.distance_lowercase_label,
                 R.string.distance_read_content_description,
-                R.string.distance_write_content_description))
+                R.string.distance_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.ELEVATION_GAINED,
             FitnessPermissionStrings(
                 R.string.elevation_gained_uppercase_label,
                 R.string.elevation_gained_lowercase_label,
                 R.string.elevation_gained_read_content_description,
-                R.string.elevation_gained_write_content_description))
+                R.string.elevation_gained_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.EXERCISE,
             FitnessPermissionStrings(
                 R.string.exercise_uppercase_label,
                 R.string.exercise_lowercase_label,
                 R.string.exercise_read_content_description,
-                R.string.exercise_write_content_description))
+                R.string.exercise_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.SPEED,
             FitnessPermissionStrings(
                 R.string.speed_uppercase_label,
                 R.string.speed_lowercase_label,
                 R.string.speed_read_content_description,
-                R.string.speed_write_content_description))
+                R.string.speed_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.POWER,
             FitnessPermissionStrings(
                 R.string.power_uppercase_label,
                 R.string.power_lowercase_label,
                 R.string.power_read_content_description,
-                R.string.power_write_content_description))
+                R.string.power_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.FLOORS_CLIMBED,
             FitnessPermissionStrings(
                 R.string.floors_climbed_uppercase_label,
                 R.string.floors_climbed_lowercase_label,
                 R.string.floors_climbed_read_content_description,
-                R.string.floors_climbed_write_content_description))
+                R.string.floors_climbed_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.INTERMENSTRUAL_BLEEDING,
             FitnessPermissionStrings(
                 R.string.spotting_uppercase_label,
                 R.string.spotting_lowercase_label,
                 R.string.spotting_read_content_description,
-                R.string.spotting_write_content_description))
+                R.string.spotting_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.STEPS,
             FitnessPermissionStrings(
                 R.string.steps_uppercase_label,
                 R.string.steps_lowercase_label,
                 R.string.steps_read_content_description,
-                R.string.steps_write_content_description))
+                R.string.steps_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.TOTAL_CALORIES_BURNED,
             FitnessPermissionStrings(
                 R.string.total_calories_burned_uppercase_label,
                 R.string.total_calories_burned_lowercase_label,
                 R.string.total_calories_burned_read_content_description,
-                R.string.total_calories_burned_write_content_description))
+                R.string.total_calories_burned_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.VO2_MAX,
             FitnessPermissionStrings(
                 R.string.vo2_max_uppercase_label,
                 R.string.vo2_max_lowercase_label,
                 R.string.vo2_max_read_content_description,
-                R.string.vo2_max_write_content_description))
+                R.string.vo2_max_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.WHEELCHAIR_PUSHES,
             FitnessPermissionStrings(
                 R.string.wheelchair_pushes_uppercase_label,
                 R.string.wheelchair_pushes_lowercase_label,
                 R.string.wheelchair_pushes_read_content_description,
-                R.string.wheelchair_pushes_write_content_description))
+                R.string.wheelchair_pushes_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.BASAL_METABOLIC_RATE,
             FitnessPermissionStrings(
                 R.string.basal_metabolic_rate_uppercase_label,
                 R.string.basal_metabolic_rate_lowercase_label,
                 R.string.basal_metabolic_rate_read_content_description,
-                R.string.basal_metabolic_rate_write_content_description))
+                R.string.basal_metabolic_rate_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.BODY_FAT,
             FitnessPermissionStrings(
                 R.string.body_fat_uppercase_label,
                 R.string.body_fat_lowercase_label,
                 R.string.body_fat_read_content_description,
-                R.string.body_fat_write_content_description))
+                R.string.body_fat_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.BODY_WATER_MASS,
             FitnessPermissionStrings(
                 R.string.body_water_mass_uppercase_label,
                 R.string.body_water_mass_lowercase_label,
                 R.string.body_water_mass_read_content_description,
-                R.string.body_water_mass_write_content_description))
+                R.string.body_water_mass_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.BONE_MASS,
             FitnessPermissionStrings(
                 R.string.bone_mass_uppercase_label,
                 R.string.bone_mass_lowercase_label,
                 R.string.bone_mass_read_content_description,
-                R.string.bone_mass_write_content_description))
+                R.string.bone_mass_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.HEIGHT,
             FitnessPermissionStrings(
                 R.string.height_uppercase_label,
                 R.string.height_lowercase_label,
                 R.string.height_read_content_description,
-                R.string.height_write_content_description))
+                R.string.height_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.LEAN_BODY_MASS,
             FitnessPermissionStrings(
                 R.string.lean_body_mass_uppercase_label,
                 R.string.lean_body_mass_lowercase_label,
                 R.string.lean_body_mass_read_content_description,
-                R.string.lean_body_mass_write_content_description))
+                R.string.lean_body_mass_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.WEIGHT,
             FitnessPermissionStrings(
                 R.string.weight_uppercase_label,
                 R.string.weight_lowercase_label,
                 R.string.weight_read_content_description,
-                R.string.weight_write_content_description))
+                R.string.weight_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.CERVICAL_MUCUS,
             FitnessPermissionStrings(
                 R.string.cervical_mucus_uppercase_label,
                 R.string.cervical_mucus_lowercase_label,
                 R.string.cervical_mucus_read_content_description,
-                R.string.cervical_mucus_write_content_description))
+                R.string.cervical_mucus_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.MENSTRUATION,
             FitnessPermissionStrings(
                 R.string.menstruation_uppercase_label,
                 R.string.menstruation_lowercase_label,
                 R.string.menstruation_read_content_description,
-                R.string.menstruation_write_content_description))
+                R.string.menstruation_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.OVULATION_TEST,
             FitnessPermissionStrings(
                 R.string.ovulation_test_uppercase_label,
                 R.string.ovulation_test_lowercase_label,
                 R.string.ovulation_test_read_content_description,
-                R.string.ovulation_test_write_content_description))
+                R.string.ovulation_test_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.SEXUAL_ACTIVITY,
             FitnessPermissionStrings(
                 R.string.sexual_activity_uppercase_label,
                 R.string.sexual_activity_lowercase_label,
                 R.string.sexual_activity_read_content_description,
-                R.string.sexual_activity_write_content_description))
+                R.string.sexual_activity_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.HYDRATION,
             FitnessPermissionStrings(
                 R.string.hydration_uppercase_label,
                 R.string.hydration_lowercase_label,
                 R.string.hydration_read_content_description,
-                R.string.hydration_write_content_description))
+                R.string.hydration_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.NUTRITION,
             FitnessPermissionStrings(
                 R.string.nutrition_uppercase_label,
                 R.string.nutrition_lowercase_label,
                 R.string.nutrition_read_content_description,
-                R.string.nutrition_write_content_description))
+                R.string.nutrition_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.SLEEP,
             FitnessPermissionStrings(
                 R.string.sleep_uppercase_label,
                 R.string.sleep_lowercase_label,
                 R.string.sleep_read_content_description,
-                R.string.sleep_write_content_description))
+                R.string.sleep_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.BASAL_BODY_TEMPERATURE,
             FitnessPermissionStrings(
                 R.string.basal_body_temperature_uppercase_label,
                 R.string.basal_body_temperature_lowercase_label,
                 R.string.basal_body_temperature_read_content_description,
-                R.string.basal_body_temperature_write_content_description))
+                R.string.basal_body_temperature_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.BLOOD_GLUCOSE,
             FitnessPermissionStrings(
                 R.string.blood_glucose_uppercase_label,
                 R.string.blood_glucose_lowercase_label,
                 R.string.blood_glucose_read_content_description,
-                R.string.blood_glucose_write_content_description))
+                R.string.blood_glucose_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.BLOOD_PRESSURE,
             FitnessPermissionStrings(
                 R.string.blood_pressure_uppercase_label,
                 R.string.blood_pressure_lowercase_label,
                 R.string.blood_pressure_read_content_description,
-                R.string.blood_pressure_write_content_description))
+                R.string.blood_pressure_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.BODY_TEMPERATURE,
             FitnessPermissionStrings(
                 R.string.body_temperature_uppercase_label,
                 R.string.body_temperature_lowercase_label,
                 R.string.body_temperature_read_content_description,
-                R.string.body_temperature_write_content_description))
+                R.string.body_temperature_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.HEART_RATE,
             FitnessPermissionStrings(
                 R.string.heart_rate_uppercase_label,
                 R.string.heart_rate_lowercase_label,
                 R.string.heart_rate_read_content_description,
-                R.string.heart_rate_write_content_description))
+                R.string.heart_rate_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.HEART_RATE_VARIABILITY,
             FitnessPermissionStrings(
                 R.string.heart_rate_variability_uppercase_label,
                 R.string.heart_rate_variability_lowercase_label,
                 R.string.heart_rate_variability_read_content_description,
-                R.string.heart_rate_variability_write_content_description))
+                R.string.heart_rate_variability_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.OXYGEN_SATURATION,
             FitnessPermissionStrings(
                 R.string.oxygen_saturation_uppercase_label,
                 R.string.oxygen_saturation_lowercase_label,
                 R.string.oxygen_saturation_read_content_description,
-                R.string.oxygen_saturation_write_content_description))
+                R.string.oxygen_saturation_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.RESPIRATORY_RATE,
             FitnessPermissionStrings(
                 R.string.respiratory_rate_uppercase_label,
                 R.string.respiratory_rate_lowercase_label,
                 R.string.respiratory_rate_read_content_description,
-                R.string.respiratory_rate_write_content_description))
+                R.string.respiratory_rate_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.RESTING_HEART_RATE,
             FitnessPermissionStrings(
                 R.string.resting_heart_rate_uppercase_label,
                 R.string.resting_heart_rate_lowercase_label,
                 R.string.resting_heart_rate_read_content_description,
-                R.string.resting_heart_rate_write_content_description))
+                R.string.resting_heart_rate_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.SKIN_TEMPERATURE,
             FitnessPermissionStrings(
                 R.string.skin_temperature_uppercase_label,
                 R.string.skin_temperature_lowercase_label,
                 R.string.skin_temperature_read_content_description,
-                R.string.skin_temperature_write_content_description))
+                R.string.skin_temperature_write_content_description,
+            ),
+        )
         .put(
             FitnessPermissionType.EXERCISE_ROUTE,
             FitnessPermissionStrings(
@@ -297,7 +379,8 @@
                 R.string.exercise_route_lowercase_label,
                 R.string.exercise_route_read_content_description,
                 R.string.exercise_route_write_content_description,
-            ))
+            ),
+        )
         .put(
             FitnessPermissionType.PLANNED_EXERCISE,
             FitnessPermissionStrings(
@@ -305,7 +388,8 @@
                 R.string.planned_exercise_lowercase_label,
                 R.string.planned_exercise_read_content_description,
                 R.string.planned_exercise_write_content_description,
-            ))
+            ),
+        )
         .put(
             FitnessPermissionType.MINDFULNESS,
             FitnessPermissionStrings(
@@ -313,5 +397,6 @@
                 R.string.mindfulness_lowercase_label,
                 R.string.mindfulness_read_content_description,
                 R.string.mindfulness_write_content_description,
-            ))
+            ),
+        )
         .buildOrThrow()
diff --git a/apk/src/com/android/healthconnect/controller/permissions/data/FitnessPermissionType.kt b/apk/src/com/android/healthconnect/controller/permissions/data/FitnessPermissionType.kt
index 9af439f..0e52654 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/data/FitnessPermissionType.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/data/FitnessPermissionType.kt
@@ -25,6 +25,7 @@
 enum class FitnessPermissionType(val category: Int) : HealthPermissionType {
     // ACTIVITY
     ACTIVE_CALORIES_BURNED(HealthPermissionCategory.ACTIVE_CALORIES_BURNED),
+    ACTIVITY_INTENSITY(HealthPermissionCategory.ACTIVITY_INTENSITY),
     DISTANCE(HealthPermissionCategory.DISTANCE),
     ELEVATION_GAINED(HealthPermissionCategory.ELEVATION_GAINED),
     EXERCISE(HealthPermissionCategory.EXERCISE),
@@ -101,6 +102,7 @@
         // ACTIVITY
         HealthPermissionCategory.ACTIVE_CALORIES_BURNED ->
             FitnessPermissionType.ACTIVE_CALORIES_BURNED
+        HealthPermissionCategory.ACTIVITY_INTENSITY -> FitnessPermissionType.ACTIVITY_INTENSITY
         HealthPermissionCategory.DISTANCE -> FitnessPermissionType.DISTANCE
         HealthPermissionCategory.ELEVATION_GAINED -> FitnessPermissionType.ELEVATION_GAINED
         HealthPermissionCategory.EXERCISE -> FitnessPermissionType.EXERCISE
diff --git a/apk/src/com/android/healthconnect/controller/permissions/data/HealthPermission.kt b/apk/src/com/android/healthconnect/controller/permissions/data/HealthPermission.kt
index a322530..d5cf30b 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/data/HealthPermission.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/data/HealthPermission.kt
@@ -25,22 +25,25 @@
             setOf(
                 HealthPermissions.READ_EXERCISE_ROUTES,
                 HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND,
-                HealthPermissions.READ_HEALTH_DATA_HISTORY
+                HealthPermissions.READ_HEALTH_DATA_HISTORY,
             )
 
         /** Permissions that are grouped separately to general health data types */
         private val medicalPermissions =
             setOf(
                 HealthPermissions.WRITE_MEDICAL_DATA,
-                HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE,
-                HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION,
+                HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
                 HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS,
                 HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS,
+                HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS,
+                HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS,
                 HealthPermissions.READ_MEDICAL_DATA_PREGNANCY,
-                HealthPermissions.READ_MEDICAL_DATA_PROBLEMS,
                 HealthPermissions.READ_MEDICAL_DATA_PROCEDURES,
                 HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY,
-                HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS
+                HealthPermissions.READ_MEDICAL_DATA_VACCINES,
+                HealthPermissions.READ_MEDICAL_DATA_VISITS,
+                HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS,
             )
 
         fun fromPermissionString(permission: String): HealthPermission {
@@ -52,12 +55,54 @@
                 FitnessPermission.fromPermissionString(permission)
             }
         }
+
+        fun isFitnessReadPermission(permission: String): Boolean {
+            val healthPermission = fromPermissionString(permission)
+            return isFitnessReadPermission(healthPermission)
+        }
+
+        fun isMedicalReadPermission(permission: String): Boolean {
+            val healthPermission = fromPermissionString(permission)
+            return isMedicalReadPermission(healthPermission)
+        }
+
+        fun isFitnessReadPermission(permission: HealthPermission): Boolean {
+            return (permission is FitnessPermission) &&
+                permission.permissionsAccessType == PermissionsAccessType.READ
+        }
+
+        fun isFitnessWritePermission(permission: HealthPermission): Boolean {
+            return (permission is FitnessPermission) &&
+                permission.permissionsAccessType == PermissionsAccessType.WRITE
+        }
+
+        fun isMedicalReadPermission(permission: HealthPermission): Boolean {
+            return (permission is MedicalPermission) &&
+                permission.medicalPermissionType != MedicalPermissionType.ALL_MEDICAL_DATA
+        }
+
+        fun isMedicalWritePermission(permission: HealthPermission): Boolean {
+            return (permission is MedicalPermission) &&
+                permission.medicalPermissionType == MedicalPermissionType.ALL_MEDICAL_DATA
+        }
+
+        fun isAdditionalPermission(permission: String): Boolean {
+            return additionalPermissions.contains(permission)
+        }
+
+        fun isMedicalPermission(permission: String): Boolean {
+            return medicalPermissions.contains(permission)
+        }
+
+        fun isFitnessPermission(permission: String): Boolean {
+            return !isAdditionalPermission(permission) && !isMedicalPermission(permission)
+        }
     }
 
     /** Pair of {@link HealthPermissionType} and {@link PermissionsAccessType}. */
     data class FitnessPermission(
         val fitnessPermissionType: FitnessPermissionType,
-        val permissionsAccessType: PermissionsAccessType
+        val permissionsAccessType: PermissionsAccessType,
     ) : HealthPermission() {
         companion object {
             private const val READ_PERMISSION_PREFIX = "android.permission.health.READ_"
@@ -124,8 +169,7 @@
     data class MedicalPermission(val medicalPermissionType: MedicalPermissionType) :
         HealthPermission() {
         companion object {
-            private const val WRITE_MEDICAL_DATA =
-                "android.permission.health.WRITE_MEDICAL_DATA"
+            private const val WRITE_MEDICAL_DATA = "android.permission.health.WRITE_MEDICAL_DATA"
             private const val READ_MEDICAL_DATA_PREFIX =
                 "android.permission.health.READ_MEDICAL_DATA_"
 
diff --git a/apk/src/com/android/healthconnect/controller/permissions/data/MedicalPermissionStrings.kt b/apk/src/com/android/healthconnect/controller/permissions/data/MedicalPermissionStrings.kt
index 3f8f40b..f46a3b0 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/data/MedicalPermissionStrings.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/data/MedicalPermissionStrings.kt
@@ -22,7 +22,7 @@
 data class MedicalPermissionStrings(
     @StringRes val uppercaseLabel: Int,
     @StringRes val lowercaseLabel: Int,
-    @StringRes val contentDescription: Int
+    @StringRes val contentDescription: Int,
 ) {
     companion object {
         fun fromPermissionType(
@@ -30,7 +30,8 @@
         ): MedicalPermissionStrings {
             return PERMISSION_TYPE_STRINGS[medicalPermissionType]
                 ?: throw IllegalArgumentException(
-                    "No strings for permission group " + medicalPermissionType.name)
+                    "No strings for permission group " + medicalPermissionType.name
+                )
         }
     }
 }
@@ -42,59 +43,103 @@
             MedicalPermissionStrings(
                 R.string.all_medical_data_uppercase_label,
                 R.string.all_medical_data_lowercase_label,
-                R.string.all_medical_data_content_description))
+                R.string.all_medical_data_content_description,
+            ),
+        )
         .put(
-            MedicalPermissionType.ALLERGY_INTOLERANCE,
+            MedicalPermissionType.ALLERGIES_INTOLERANCES,
             MedicalPermissionStrings(
-                R.string.allergy_intolerance_uppercase_label,
-                R.string.allergy_intolerance_lowercase_label,
-                R.string.allergy_intolerance_content_description))
+                R.string.allergies_intolerances_uppercase_label,
+                R.string.allergies_intolerances_lowercase_label,
+                R.string.allergies_intolerances_content_description,
+            )
+        )
         .put(
-            MedicalPermissionType.IMMUNIZATION,
+            MedicalPermissionType.CONDITIONS,
             MedicalPermissionStrings(
-                R.string.immunization_uppercase_label,
-                R.string.immunization_lowercase_label,
-                R.string.immunization_content_description))
+                R.string.conditions_uppercase_label,
+                R.string.conditions_lowercase_label,
+                R.string.conditions_content_description,
+            ),
+        )
         .put(
             MedicalPermissionType.LABORATORY_RESULTS,
             MedicalPermissionStrings(
                 R.string.laboratory_results_uppercase_label,
                 R.string.laboratory_results_lowercase_label,
-                R.string.laboratory_results_content_description))
+                R.string.laboratory_results_content_description,
+            ),
+        )
         .put(
             MedicalPermissionType.MEDICATIONS,
             MedicalPermissionStrings(
                 R.string.medications_uppercase_label,
                 R.string.medications_lowercase_label,
-                R.string.medications_content_description))
+                R.string.medications_content_description,
+            ),
+        )
+        .put(
+            MedicalPermissionType.PERSONAL_DETAILS,
+            MedicalPermissionStrings(
+                R.string.personal_details_uppercase_label,
+                R.string.personal_details_lowercase_label,
+                R.string.personal_details_content_description,
+            ),
+        )
+        .put(
+            MedicalPermissionType.PRACTITIONER_DETAILS,
+            MedicalPermissionStrings(
+                R.string.practitioner_details_uppercase_label,
+                R.string.practitioner_details_lowercase_label,
+                R.string.practitioner_details_content_description,
+            ),
+        )
         .put(
             MedicalPermissionType.PREGNANCY,
             MedicalPermissionStrings(
                 R.string.pregnancy_uppercase_label,
                 R.string.pregnancy_lowercase_label,
-                R.string.pregnancy_content_description))
-        .put(
-            MedicalPermissionType.PROBLEMS,
-            MedicalPermissionStrings(
-                R.string.problems_uppercase_label,
-                R.string.problems_lowercase_label,
-                R.string.problems_content_description))
+                R.string.pregnancy_content_description,
+            ),
+        )
         .put(
             MedicalPermissionType.PROCEDURES,
             MedicalPermissionStrings(
                 R.string.procedures_uppercase_label,
                 R.string.procedures_lowercase_label,
-                R.string.procedures_content_description))
+                R.string.procedures_content_description,
+            ),
+        )
         .put(
             MedicalPermissionType.SOCIAL_HISTORY,
             MedicalPermissionStrings(
                 R.string.social_history_uppercase_label,
                 R.string.social_history_lowercase_label,
-                R.string.social_history_content_description))
+                R.string.social_history_content_description,
+            ),
+        )
+        .put(
+            MedicalPermissionType.VACCINES,
+            MedicalPermissionStrings(
+                R.string.vaccines_uppercase_label,
+                R.string.vaccines_lowercase_label,
+                R.string.vaccines_content_description,
+            ),
+        )
+        .put(
+            MedicalPermissionType.VISITS,
+            MedicalPermissionStrings(
+                R.string.visits_uppercase_label,
+                R.string.visits_lowercase_label,
+                R.string.visits_content_description,
+            ),
+        )
         .put(
             MedicalPermissionType.VITAL_SIGNS,
             MedicalPermissionStrings(
                 R.string.vital_signs_uppercase_label,
                 R.string.vital_signs_lowercase_label,
-                R.string.vital_signs_content_description))
+                R.string.vital_signs_content_description,
+            ),
+        )
         .buildOrThrow()
diff --git a/apk/src/com/android/healthconnect/controller/permissions/data/MedicalPermissionType.kt b/apk/src/com/android/healthconnect/controller/permissions/data/MedicalPermissionType.kt
index 31eac00..75dee50 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/data/MedicalPermissionType.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/data/MedicalPermissionType.kt
@@ -17,29 +17,34 @@
 
 import android.content.Context
 import android.graphics.drawable.Drawable
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
 import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS
 import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS
 import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROBLEMS
 import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES
 import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS
 import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.utils.AttributeResolver
 
 enum class MedicalPermissionType : HealthPermissionType {
     ALL_MEDICAL_DATA,
-    ALLERGY_INTOLERANCE,
-    IMMUNIZATION,
+    ALLERGIES_INTOLERANCES,
+    CONDITIONS,
     LABORATORY_RESULTS,
     MEDICATIONS,
+    PERSONAL_DETAILS,
+    PRACTITIONER_DETAILS,
     PREGNANCY,
-    PROBLEMS,
     PROCEDURES,
     SOCIAL_HISTORY,
+    VACCINES,
+    VISITS,
     VITAL_SIGNS;
 
     override fun lowerCaseLabel(): Int =
@@ -52,15 +57,18 @@
         val attrRes: Int =
             when (this) {
                 ALL_MEDICAL_DATA -> R.attr.medicalServicesIcon
-                ALLERGY_INTOLERANCE -> R.attr.allergiesIcon
-                IMMUNIZATION -> R.attr.immunizationIcon
+                ALLERGIES_INTOLERANCES -> R.attr.allergiesIcon
+                CONDITIONS -> R.attr.conditionsIcon
                 LABORATORY_RESULTS -> R.attr.labResultsIcon
+                MEDICATIONS -> R.attr.medicationsIcon
+                PERSONAL_DETAILS -> R.attr.patientInfoIcon
+                PRACTITIONER_DETAILS -> R.attr.practitionerDetailsIcon
                 PREGNANCY -> R.attr.pregnancyIcon
-                PROBLEMS -> R.attr.conditionsIcon
                 PROCEDURES -> R.attr.proceduresIcon
                 SOCIAL_HISTORY -> R.attr.socialHistoryIcon
+                VACCINES -> R.attr.immunizationIcon
+                VISITS -> R.attr.pastVisitsIcon
                 VITAL_SIGNS -> R.attr.vitalsIcon
-                else -> return null
             }
         return AttributeResolver.getDrawable(context, attrRes)
     }
@@ -77,16 +85,17 @@
 
 fun fromMedicalResourceType(medicalResourceType: Int): MedicalPermissionType {
     return when (medicalResourceType) {
-        MEDICAL_RESOURCE_TYPE_UNKNOWN ->
-            throw IllegalArgumentException("MedicalResourceType is UNKNOWN.")
-        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE -> MedicalPermissionType.ALLERGY_INTOLERANCE
-        MEDICAL_RESOURCE_TYPE_IMMUNIZATION -> MedicalPermissionType.IMMUNIZATION
+        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES -> MedicalPermissionType.ALLERGIES_INTOLERANCES
+        MEDICAL_RESOURCE_TYPE_CONDITIONS -> MedicalPermissionType.CONDITIONS
         MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS -> MedicalPermissionType.LABORATORY_RESULTS
         MEDICAL_RESOURCE_TYPE_MEDICATIONS -> MedicalPermissionType.MEDICATIONS
+        MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS -> MedicalPermissionType.PERSONAL_DETAILS
+        MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS -> MedicalPermissionType.PRACTITIONER_DETAILS
         MEDICAL_RESOURCE_TYPE_PREGNANCY -> MedicalPermissionType.PREGNANCY
-        MEDICAL_RESOURCE_TYPE_PROBLEMS -> MedicalPermissionType.PROBLEMS
         MEDICAL_RESOURCE_TYPE_PROCEDURES -> MedicalPermissionType.PROCEDURES
         MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY -> MedicalPermissionType.SOCIAL_HISTORY
+        MEDICAL_RESOURCE_TYPE_VACCINES -> MedicalPermissionType.VACCINES
+        MEDICAL_RESOURCE_TYPE_VISITS -> MedicalPermissionType.VISITS
         MEDICAL_RESOURCE_TYPE_VITAL_SIGNS -> MedicalPermissionType.VITAL_SIGNS
         else -> throw IllegalArgumentException("MedicalResourceType is not supported.")
     }
@@ -94,15 +103,18 @@
 
 fun toMedicalResourceType(medicalPermissionType: MedicalPermissionType): Int {
     return when (medicalPermissionType) {
-        MedicalPermissionType.ALLERGY_INTOLERANCE -> MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE
-        MedicalPermissionType.IMMUNIZATION -> MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+        MedicalPermissionType.ALLERGIES_INTOLERANCES -> MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
+        MedicalPermissionType.CONDITIONS -> MEDICAL_RESOURCE_TYPE_CONDITIONS
         MedicalPermissionType.LABORATORY_RESULTS -> MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS
         MedicalPermissionType.MEDICATIONS -> MEDICAL_RESOURCE_TYPE_MEDICATIONS
+        MedicalPermissionType.PERSONAL_DETAILS -> MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS
+        MedicalPermissionType.PRACTITIONER_DETAILS -> MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS
         MedicalPermissionType.PREGNANCY -> MEDICAL_RESOURCE_TYPE_PREGNANCY
-        MedicalPermissionType.PROBLEMS -> MEDICAL_RESOURCE_TYPE_PROBLEMS
         MedicalPermissionType.PROCEDURES -> MEDICAL_RESOURCE_TYPE_PROCEDURES
         MedicalPermissionType.SOCIAL_HISTORY -> MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY
+        MedicalPermissionType.VACCINES -> MEDICAL_RESOURCE_TYPE_VACCINES
+        MedicalPermissionType.VISITS -> MEDICAL_RESOURCE_TYPE_VISITS
         MedicalPermissionType.VITAL_SIGNS -> MEDICAL_RESOURCE_TYPE_VITAL_SIGNS
-        else -> MEDICAL_RESOURCE_TYPE_UNKNOWN
+        else -> throw IllegalArgumentException("MedicalPermissionType does not map to a MedicalResourceType.")
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/AdditionalPermissionHeaderPreference.kt b/apk/src/com/android/healthconnect/controller/permissions/request/AdditionalPermissionHeaderPreference.kt
deleted file mode 100644
index c6321d0..0000000
--- a/apk/src/com/android/healthconnect/controller/permissions/request/AdditionalPermissionHeaderPreference.kt
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.healthconnect.controller.permissions.request
-
-import android.content.Context
-import android.util.AttributeSet
-import android.widget.TextView
-import androidx.preference.Preference
-import androidx.preference.PreferenceViewHolder
-import com.android.healthconnect.controller.R
-import com.android.healthconnect.controller.utils.boldAppName
-
-internal class AdditionalPermissionHeaderPreference
-@JvmOverloads
-constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0,
-    defStyleRes: Int = 0,
-) : Preference(context, attrs, defStyleAttr, defStyleRes) {
-
-    private lateinit var title: TextView
-    private var appName: String? = null
-    private var titleText = 0
-
-    private lateinit var summary: TextView
-    private var summaryText = ""
-
-    init {
-        layoutResource = R.layout.widget_request_additional_permission_header
-        isSelectable = false
-    }
-
-    override fun onBindViewHolder(holder: PreferenceViewHolder) {
-        super.onBindViewHolder(holder)
-        title = holder.findViewById(R.id.title) as TextView
-        summary = holder.findViewById(R.id.summary) as TextView
-
-        updateTitle()
-        updateSummary()
-    }
-
-    fun bind(titleText: Int, appName: String, summaryText: String) {
-        this.appName = appName
-        this.titleText = titleText
-        this.summaryText = summaryText
-        notifyChanged()
-    }
-
-    private fun updateTitle() {
-        if (titleText != 0) {
-            val text = context.getString(titleText, appName)
-            title.text = boldAppName(appName, text)
-        }
-    }
-
-    private fun updateSummary() {
-        summary.text = summaryText
-    }
-}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/AdditionalPermissionsFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/request/AdditionalPermissionsFragment.kt
deleted file mode 100644
index b02d5e0..0000000
--- a/apk/src/com/android/healthconnect/controller/permissions/request/AdditionalPermissionsFragment.kt
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.healthconnect.controller.permissions.request
-
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.activityViewModels
-import androidx.preference.PreferenceCategory
-import com.android.healthconnect.controller.R
-import com.android.healthconnect.controller.permissions.data.AdditionalPermissionStrings
-import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
-import com.android.healthconnect.controller.shared.app.AppMetadata
-import com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
-import com.android.healthconnect.controller.utils.FeatureUtils
-import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
-import com.android.healthconnect.controller.utils.logging.ElementName
-import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
-import com.android.healthconnect.controller.utils.logging.PageName
-import com.android.healthconnect.controller.utils.logging.RequestBackgroundReadPermissionElement
-import com.android.healthconnect.controller.utils.logging.RequestCombinedAdditionalPermissionsElement
-import com.android.healthconnect.controller.utils.logging.RequestHistoryReadPermissionElement
-import com.android.healthconnect.controller.utils.pref
-import dagger.hilt.android.AndroidEntryPoint
-import javax.inject.Inject
-
-/** Fragment that can show combined or single additional permission request screens. */
-@AndroidEntryPoint(PermissionsFragment::class)
-class AdditionalPermissionsFragment : Hilt_AdditionalPermissionsFragment() {
-
-    companion object {
-        private const val HEADER = "request_additional_permissions_header"
-        private const val CATEGORY = "additional_permissions_category"
-    }
-
-    private val viewModel: RequestPermissionViewModel by activityViewModels()
-
-    private val header: AdditionalPermissionHeaderPreference by pref(HEADER)
-    private val category: PreferenceCategory by pref(CATEGORY)
-
-    private var pageName = PageName.REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE
-    private var allowButtonName: ElementName =
-        RequestCombinedAdditionalPermissionsElement.ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
-    private var cancelButtonName: ElementName =
-        RequestCombinedAdditionalPermissionsElement.CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
-
-    private val dateFormatter by lazy { LocalDateTimeFormatter(requireContext()) }
-
-    @Inject lateinit var featureUtils: FeatureUtils
-    @Inject lateinit var logger: HealthConnectLogger
-
-    override fun onResume() {
-        super.onResume()
-        logger.setPageId(pageName)
-        logger.logPageImpression()
-    }
-
-    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
-        setPreferencesFromResource(R.xml.additional_permissions_screen, rootKey)
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        viewModel.additionalPermissionsInfo.observe(viewLifecycleOwner) { info ->
-            val (additionalPermissions, appMetadata) = info
-
-            if (additionalPermissions.isNullOrEmpty()) {
-                return@observe
-            }
-
-            if (additionalPermissions.size > 1) {
-                showCombinedAdditionalPermissions(appMetadata!!)
-            } else {
-                showSingleAdditionalPermission(additionalPermissions[0], appMetadata!!)
-            }
-
-            setupAllowButton(additionalPermissions)
-            setupDontAllowButton()
-        }
-    }
-
-    private fun setupAllowButton(permissionList: List<AdditionalPermission>) {
-        logger.logImpression(allowButtonName)
-
-        if (viewModel.isFitnessPermissionRequestConcluded() ||
-            viewModel.isMedicalPermissionRequestConcluded()) {
-            // if requested additional permissions == 1 then allow by default
-            if (permissionList.size == 1) {
-                getAllowButton().isEnabled = true
-            } else {
-                viewModel.grantedAdditionalPermissions.observe(viewLifecycleOwner) {
-                    grantedPermissions ->
-                    getAllowButton().isEnabled = grantedPermissions.isNotEmpty()
-                }
-            }
-        }
-
-        getAllowButton().setOnClickListener {
-            logger.logInteraction(allowButtonName)
-            if (permissionList.size == 1) {
-                viewModel.updateAdditionalPermissions(true)
-            }
-            viewModel.requestAdditionalPermissions(getPackageNameExtra())
-            handlePermissionResults(viewModel.getPermissionGrants())
-        }
-    }
-
-    private fun setupDontAllowButton() {
-        logger.logImpression(cancelButtonName)
-
-        getDontAllowButton().setOnClickListener {
-            logger.logInteraction(cancelButtonName)
-            viewModel.updateAdditionalPermissions(false)
-            viewModel.requestAdditionalPermissions(this.getPackageNameExtra())
-            handlePermissionResults(viewModel.getPermissionGrants())
-        }
-    }
-
-    private fun showCombinedAdditionalPermissions(appMetadata: AppMetadata) {
-        pageName = PageName.REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE
-        allowButtonName =
-            RequestCombinedAdditionalPermissionsElement.ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
-        cancelButtonName =
-            RequestCombinedAdditionalPermissionsElement
-                .CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
-
-        header.bind(
-            titleText = R.string.request_additional_permissions_header_title,
-            appName = appMetadata.appName,
-            summaryText =
-                getString(R.string.request_additional_permissions_description, appMetadata.appName))
-
-        category.removeAll()
-        category.isVisible = true
-
-        category.addPreference(getHistoryReadPreference(appMetadata))
-        category.addPreference(getBackgroundReadPreference())
-    }
-
-    private fun getBackgroundReadPreference(): HealthSwitchPreference {
-        val additionalPermission = AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND
-        val additionalPermissionStrings =
-            AdditionalPermissionStrings.fromAdditionalPermission(additionalPermission)
-        val value = viewModel.isPermissionLocallyGranted(additionalPermission)
-        val summary = getString(additionalPermissionStrings.permissionDescription)
-
-        return HealthSwitchPreference(requireContext()).also { switchPreference ->
-            switchPreference.setDefaultValue(value)
-            switchPreference.title = getString(additionalPermissionStrings.permissionTitle)
-            switchPreference.summary = summary
-            switchPreference.logNameActive =
-                RequestCombinedAdditionalPermissionsElement.BACKGROUND_READ_BUTTON
-            switchPreference.logNameInactive =
-                RequestCombinedAdditionalPermissionsElement.BACKGROUND_READ_BUTTON
-
-            switchPreference.setOnPreferenceChangeListener { _, newValue ->
-                viewModel.updateHealthPermission(additionalPermission, newValue as Boolean)
-                true
-            }
-        }
-    }
-
-    private fun getHistoryReadPreference(appMetadata: AppMetadata): HealthSwitchPreference {
-        val additionalPermission = AdditionalPermission.READ_HEALTH_DATA_HISTORY
-        val additionalPermissionStrings =
-            AdditionalPermissionStrings.fromAdditionalPermission(additionalPermission)
-        val value = viewModel.isPermissionLocallyGranted(additionalPermission)
-        val summary = getHistoryReadPermissionPreferenceSummary(appMetadata)
-
-        return HealthSwitchPreference(requireContext()).also { switchPreference ->
-            switchPreference.setDefaultValue(value)
-            switchPreference.title = getString(additionalPermissionStrings.permissionTitle)
-            switchPreference.summary = summary
-            switchPreference.logNameActive =
-                RequestCombinedAdditionalPermissionsElement.HISTORY_READ_BUTTON
-            switchPreference.logNameInactive =
-                RequestCombinedAdditionalPermissionsElement.HISTORY_READ_BUTTON
-
-            switchPreference.setOnPreferenceChangeListener { _, newValue ->
-                viewModel.updateHealthPermission(additionalPermission, newValue as Boolean)
-                true
-            }
-        }
-    }
-
-    private fun getHistoryReadPermissionPreferenceSummary(appMetadata: AppMetadata): String {
-        val additionalPermission = AdditionalPermission.READ_HEALTH_DATA_HISTORY
-        val dataAccessDate = viewModel.loadAccessDate(appMetadata.packageName)
-        return if (dataAccessDate != null) {
-            val formattedDate = dateFormatter.formatLongDate(dataAccessDate)
-            getString(
-                AdditionalPermissionStrings.fromAdditionalPermission(additionalPermission)
-                    .permissionDescription,
-                formattedDate)
-        } else {
-            getString(
-                AdditionalPermissionStrings.fromAdditionalPermission(additionalPermission)
-                    .permissionDescriptionFallback)
-        }
-    }
-
-    private fun getHistoryReadPermissionRequestText(appMetadata: AppMetadata): String {
-        val additionalPermission = AdditionalPermission.READ_HEALTH_DATA_HISTORY
-        val dataAccessDate = viewModel.loadAccessDate(appMetadata.packageName)
-        return if (dataAccessDate != null) {
-            val formattedDate = dateFormatter.formatLongDate(dataAccessDate)
-            getString(
-                AdditionalPermissionStrings.fromAdditionalPermission(additionalPermission)
-                    .requestDescription,
-                formattedDate)
-        } else {
-            getString(
-                AdditionalPermissionStrings.fromAdditionalPermission(additionalPermission)
-                    .requestDescriptionFallback)
-        }
-    }
-
-    private fun showSingleAdditionalPermission(
-        additionalPermission: AdditionalPermission,
-        appMetadata: AppMetadata
-    ) {
-        val additionalPermissionStrings =
-            AdditionalPermissionStrings.fromAdditionalPermission(additionalPermission)
-
-        if (additionalPermission.isHistoryReadPermission()) {
-            pageName = PageName.REQUEST_HISTORY_READ_PERMISSION_PAGE
-            allowButtonName = RequestHistoryReadPermissionElement.ALLOW_HISTORY_READ_BUTTON
-            cancelButtonName = RequestHistoryReadPermissionElement.CANCEL_HISTORY_READ_BUTTON
-
-            header.bind(
-                titleText = additionalPermissionStrings.requestTitle,
-                appName = appMetadata.appName,
-                summaryText = getHistoryReadPermissionRequestText(appMetadata))
-        } else {
-            pageName = PageName.REQUEST_BACKGROUND_READ_PERMISSION_PAGE
-            allowButtonName = RequestBackgroundReadPermissionElement.ALLOW_BACKGROUND_READ_BUTTON
-            cancelButtonName = RequestBackgroundReadPermissionElement.CANCEL_BACKGROUND_READ_BUTTON
-
-            header.bind(
-                titleText = additionalPermissionStrings.requestTitle,
-                appName = appMetadata.appName,
-                summaryText = getString(additionalPermissionStrings.requestDescription))
-        }
-    }
-}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/CombinedAdditionalPermissionsFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/request/CombinedAdditionalPermissionsFragment.kt
new file mode 100644
index 0000000..f865850
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/CombinedAdditionalPermissionsFragment.kt
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request
+
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.activityViewModels
+import androidx.preference.PreferenceCategory
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.AccessType
+import com.android.healthconnect.controller.permissions.data.AdditionalPermissionStrings
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
+import com.android.healthconnect.controller.permissions.data.additionalPermissionString
+import com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
+import com.android.healthconnect.controller.utils.DeviceInfoUtils
+import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
+import com.android.healthconnect.controller.utils.logging.ElementName
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthconnect.controller.utils.logging.RequestCombinedAdditionalPermissionsElement
+import com.android.healthconnect.controller.utils.pref
+import com.android.settingslib.widget.FooterPreference
+import dagger.hilt.android.AndroidEntryPoint
+import java.time.Instant
+import javax.inject.Inject
+
+/** Fragment that shows a combined additional permission request screen. */
+@AndroidEntryPoint(PermissionsFragment::class)
+class CombinedAdditionalPermissionsFragment : Hilt_CombinedAdditionalPermissionsFragment() {
+
+    companion object {
+        private const val HEADER = "request_permissions_header"
+        private const val CATEGORY = "additional_permissions_category"
+        private const val FOOTER = "request_permissions_footer"
+    }
+
+    private val viewModel: RequestPermissionViewModel by activityViewModels()
+
+    private val header: RequestPermissionHeaderPreference by pref(HEADER)
+    private val category: PreferenceCategory by pref(CATEGORY)
+    private val footer: FooterPreference by pref(FOOTER)
+
+    private var allowButtonName: ElementName =
+        RequestCombinedAdditionalPermissionsElement.ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
+    private var cancelButtonName: ElementName =
+        RequestCombinedAdditionalPermissionsElement.CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
+
+    private val dateFormatter by lazy { LocalDateTimeFormatter(requireContext()) }
+
+    @Inject lateinit var logger: HealthConnectLogger
+    @Inject lateinit var deviceInfoUtils: DeviceInfoUtils
+
+    init {
+        this.setPageName(PageName.REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE)
+    }
+
+    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+        setPreferencesFromResource(R.xml.additional_permissions_screen, rootKey)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        viewModel.additionalScreenState.observe(viewLifecycleOwner) { screenState ->
+            when (screenState) {
+                is AdditionalScreenState.NoAdditionalData -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .remove(this)
+                        .commit()
+                }
+                is AdditionalScreenState.ShowCombined -> {
+                    setupScreen(screenState)
+                }
+                else -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .replace(R.id.permission_content, SingleAdditionalPermissionFragment())
+                        .commit()
+                }
+            }
+        }
+    }
+
+    private fun setupScreen(screenState: AdditionalScreenState.ShowCombined) {
+        header.bind(appName = screenState.appMetadata.appName, screenState = screenState)
+
+        setupAllowButton()
+        setupDontAllowButton()
+        showCombinedAdditionalPermissions(screenState)
+        maybeShowFooter(screenState.isMedicalReadGranted, screenState.appMetadata.appName)
+    }
+
+    private fun maybeShowFooter(shouldShow: Boolean, appName: String) {
+        if (!shouldShow) {
+            footer.isVisible = false
+            return
+        }
+
+        footer.title = getString(R.string.history_read_medical_combined_request_footer, appName)
+        footer.setLearnMoreText(
+            getString(R.string.history_read_medical_combined_request_footer_link)
+        )
+        footer.setLearnMoreAction { deviceInfoUtils.openHCGetStartedLink(requireActivity()) }
+        footer.isVisible = true
+    }
+
+    private fun setupAllowButton() {
+        logger.logImpression(allowButtonName)
+
+        viewModel.grantedAdditionalPermissions.observe(viewLifecycleOwner) { grantedPermissions ->
+            getAllowButton().isEnabled = grantedPermissions.isNotEmpty()
+        }
+
+        getAllowButton().setOnClickListener {
+            logger.logInteraction(allowButtonName)
+            viewModel.requestAdditionalPermissions(getPackageNameExtra())
+            handlePermissionResults(viewModel.getPermissionGrants())
+        }
+    }
+
+    private fun setupDontAllowButton() {
+        logger.logImpression(cancelButtonName)
+
+        getDontAllowButton().setOnClickListener {
+            logger.logInteraction(cancelButtonName)
+            viewModel.updateAdditionalPermissions(false)
+            viewModel.requestAdditionalPermissions(this.getPackageNameExtra())
+            handlePermissionResults(viewModel.getPermissionGrants())
+        }
+    }
+
+    private fun showCombinedAdditionalPermissions(screenState: AdditionalScreenState.ShowCombined) {
+        this.setPageName(PageName.REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE)
+        allowButtonName =
+            RequestCombinedAdditionalPermissionsElement.ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
+        cancelButtonName =
+            RequestCombinedAdditionalPermissionsElement
+                .CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
+
+        category.removeAll()
+        category.isVisible = true
+
+        category.addPreference(getHistoryReadPreference(screenState))
+        category.addPreference(getBackgroundReadPreference(screenState))
+    }
+
+    private fun getBackgroundReadPreference(
+        screenState: AdditionalScreenState.ShowCombined
+    ): HealthSwitchPreference {
+        val additionalPermission = AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND
+        val additionalPermissionStrings =
+            additionalPermissionString(
+                additionalPermission,
+                type = AccessType.COMBINED_REQUEST,
+                hasMedicalPermissions = screenState.hasMedical,
+                isMedicalReadGranted = screenState.isMedicalReadGranted,
+                isFitnessReadGranted = screenState.isFitnessReadGranted,
+            )
+        val value = viewModel.isPermissionLocallyGranted(additionalPermission)
+
+        return HealthSwitchPreference(requireContext()).also { switchPreference ->
+            switchPreference.setDefaultValue(value)
+            switchPreference.title = getString(additionalPermissionStrings.title)
+            switchPreference.summary = getString(additionalPermissionStrings.description)
+            switchPreference.logNameActive =
+                RequestCombinedAdditionalPermissionsElement.BACKGROUND_READ_BUTTON
+            switchPreference.logNameInactive =
+                RequestCombinedAdditionalPermissionsElement.BACKGROUND_READ_BUTTON
+
+            switchPreference.setOnPreferenceChangeListener { _, newValue ->
+                viewModel.updateHealthPermission(additionalPermission, newValue as Boolean)
+                true
+            }
+        }
+    }
+
+    private fun getHistoryReadPreference(
+        screenState: AdditionalScreenState.ShowCombined
+    ): HealthSwitchPreference {
+        val additionalPermission = AdditionalPermission.READ_HEALTH_DATA_HISTORY
+        val additionalPermissionStrings =
+            additionalPermissionString(
+                additionalPermission,
+                type = AccessType.COMBINED_REQUEST,
+                hasMedicalPermissions = screenState.hasMedical,
+                isMedicalReadGranted = screenState.isMedicalReadGranted,
+                isFitnessReadGranted = screenState.isFitnessReadGranted,
+            )
+        val value = viewModel.isPermissionLocallyGranted(additionalPermission)
+        val summary =
+            getHistoryReadPermissionPreferenceSummary(
+                additionalPermissionStrings,
+                screenState.dataAccessDate,
+            )
+
+        return HealthSwitchPreference(requireContext()).also { switchPreference ->
+            switchPreference.setDefaultValue(value)
+            switchPreference.title = getString(additionalPermissionStrings.title)
+            switchPreference.summary = summary
+            switchPreference.logNameActive =
+                RequestCombinedAdditionalPermissionsElement.HISTORY_READ_BUTTON
+            switchPreference.logNameInactive =
+                RequestCombinedAdditionalPermissionsElement.HISTORY_READ_BUTTON
+
+            switchPreference.setOnPreferenceChangeListener { _, newValue ->
+                viewModel.updateHealthPermission(additionalPermission, newValue as Boolean)
+                true
+            }
+        }
+    }
+
+    private fun getHistoryReadPermissionPreferenceSummary(
+        additionalPermissionStrings: AdditionalPermissionStrings,
+        dataAccessDate: Instant?,
+    ): String {
+        return if (dataAccessDate != null) {
+            val formattedDate = dateFormatter.formatLongDate(dataAccessDate)
+            getString(additionalPermissionStrings.description, formattedDate)
+        } else {
+            getString(additionalPermissionStrings.descriptionFallback)
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/FitnessPermissionsFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/request/FitnessPermissionsFragment.kt
index aae0069..a660895 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/request/FitnessPermissionsFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/FitnessPermissionsFragment.kt
@@ -16,9 +16,7 @@
 package com.android.healthconnect.controller.permissions.request
 
 import android.os.Bundle
-import android.view.LayoutInflater
 import android.view.View
-import android.view.ViewGroup
 import android.widget.CompoundButton.OnCheckedChangeListener
 import androidx.fragment.app.activityViewModels
 import androidx.preference.Preference
@@ -31,12 +29,14 @@
 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions
 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.icon
 import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.shared.children
 import com.android.healthconnect.controller.shared.preference.HealthMainSwitchPreference
 import com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.logging.PermissionsElement
+import com.android.healthconnect.controller.utils.pref
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
@@ -50,94 +50,101 @@
         private const val HEADER = "request_permissions_header"
     }
 
-    private val pageName = PageName.REQUEST_PERMISSIONS_PAGE
     @Inject lateinit var logger: HealthConnectLogger
 
     private val viewModel: RequestPermissionViewModel by activityViewModels()
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
 
-    private val header: RequestPermissionHeaderPreference? by lazy {
-        preferenceScreen.findPreference(HEADER)
-    }
+    private val header: RequestPermissionHeaderPreference by pref(HEADER)
 
-    private val allowAllPreference: HealthMainSwitchPreference? by lazy {
-        preferenceScreen.findPreference(ALLOW_ALL_PREFERENCE)
-    }
+    private val allowAllPreference: HealthMainSwitchPreference by pref(ALLOW_ALL_PREFERENCE)
 
-    private val readPermissionCategory: PreferenceGroup? by lazy {
-        preferenceScreen.findPreference(READ_CATEGORY)
-    }
+    private val readPermissionCategory: PreferenceGroup by pref(READ_CATEGORY)
 
-    private val writePermissionCategory: PreferenceGroup? by lazy {
-        preferenceScreen.findPreference(WRITE_CATEGORY)
-    }
+    private val writePermissionCategory: PreferenceGroup by pref(WRITE_CATEGORY)
 
     private val onSwitchChangeListener = OnCheckedChangeListener { _, grant ->
-        readPermissionCategory?.children?.forEach { preference ->
+        readPermissionCategory.children.forEach { preference ->
             (preference as TwoStatePreference).isChecked = grant
         }
-        writePermissionCategory?.children?.forEach { preference ->
+        writePermissionCategory.children.forEach { preference ->
             (preference as TwoStatePreference).isChecked = grant
         }
         viewModel.updateFitnessPermissions(grant)
     }
 
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        logger.setPageId(pageName)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        logger.setPageId(pageName)
-        logger.logPageImpression()
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater,
-        container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View {
-        logger.setPageId(pageName)
-        return super.onCreateView(inflater, container, savedInstanceState)
+    init {
+        this.setPageName(PageName.REQUEST_PERMISSIONS_PAGE)
     }
 
     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
         setPreferencesFromResource(R.xml.permissions_screen, rootKey)
-        allowAllPreference?.logNameActive = PermissionsElement.ALLOW_ALL_SWITCH
-        allowAllPreference?.logNameInactive = PermissionsElement.ALLOW_ALL_SWITCH
+        allowAllPreference.logNameActive = PermissionsElement.ALLOW_ALL_SWITCH
+        allowAllPreference.logNameInactive = PermissionsElement.ALLOW_ALL_SWITCH
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-        viewModel.appMetadata.observe(viewLifecycleOwner) { app ->
-            logger.logImpression(PermissionsElement.APP_RATIONALE_LINK)
-            header?.bind(app.appName, viewModel.isHistoryAccessGranted()) {
-                val startRationaleIntent =
-                    healthPermissionReader.getApplicationRationaleIntent(app.packageName)
-                logger.logInteraction(PermissionsElement.APP_RATIONALE_LINK)
-                startActivity(startRationaleIntent)
+
+        viewModel.fitnessScreenState.observe(viewLifecycleOwner) { screenState ->
+            when (screenState) {
+                is FitnessScreenState.NoFitnessData -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .remove(this)
+                        .commit()
+                }
+                is FitnessScreenState.ShowFitnessWrite -> {
+                    setupHeader(screenState.appMetadata, screenState)
+                    updateDataList(screenState.fitnessPermissions)
+                    updateCategoryTitles(screenState.appMetadata.appName)
+                    setupButtons()
+                }
+                is FitnessScreenState.ShowFitnessReadWrite -> {
+                    setupHeader(screenState.appMetadata, screenState)
+                    updateDataList(screenState.fitnessPermissions)
+                    updateCategoryTitles(screenState.appMetadata.appName)
+                    setupButtons()
+                }
+                is FitnessScreenState.ShowFitnessRead -> {
+                    setupHeader(screenState.appMetadata, screenState)
+                    updateDataList(screenState.fitnessPermissions)
+                    updateCategoryTitles(screenState.appMetadata.appName)
+                    setupButtons()
+                }
             }
-            readPermissionCategory?.title =
-                getString(R.string.read_permission_category, app.appName)
-            writePermissionCategory?.title =
-                getString(R.string.write_permission_category, app.appName)
-        }
-        viewModel.healthPermissionsList.observe(viewLifecycleOwner) { allPermissions ->
-            val fitnessPermissions =
-                allPermissions.filterIsInstance<HealthPermission.FitnessPermission>()
-            val additionalPermissions =
-                allPermissions.filterIsInstance<HealthPermission.AdditionalPermission>()
-
-            updateDataList(fitnessPermissions)
-            setupAllowAll()
-
-            setupAllowButton(additionalPermissions.isNotEmpty())
-            setupDontAllowButton()
         }
     }
 
-    private fun setupAllowButton(isCombinedPermissionRequest: Boolean) {
+    private fun setupHeader(appMetadata: AppMetadata, screenState: RequestPermissionsScreenState) {
+        val onRationaleLinkClicked = {
+            val startRationaleIntent =
+                healthPermissionReader.getApplicationRationaleIntent(appMetadata.packageName)
+            logger.logInteraction(PermissionsElement.APP_RATIONALE_LINK)
+            startActivity(startRationaleIntent)
+        }
+
+        header.bind(
+            appMetadata.appName,
+            screenState,
+            onRationaleLinkClicked = onRationaleLinkClicked,
+        )
+    }
+
+    private fun updateCategoryTitles(appName: String) {
+        readPermissionCategory.title = getString(R.string.read_permission_category, appName)
+        writePermissionCategory.title = getString(R.string.write_permission_category, appName)
+    }
+
+    private fun setupButtons() {
+        setupAllowAll()
+
+        setupAllowButton()
+        setupDontAllowButton()
+    }
+
+    private fun setupAllowButton() {
         logger.logImpression(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
 
         if (!viewModel.isFitnessPermissionRequestConcluded()) {
@@ -146,29 +153,14 @@
             }
         }
 
-        if (isCombinedPermissionRequest) {
-            getAllowButton().setOnClickListener {
-                viewModel.setFitnessPermissionRequestConcluded(true)
-                // When fitness permissions are concluded we need to
-                // grant/revoke only the fitness permissions, to trigger the
-                // access date. We can't request all at once because we might accidentally
-                // set the additional permissions USER_FIXED
-                viewModel.requestFitnessPermissions(getPackageNameExtra())
-                logger.logInteraction(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
-                // navigate to additional permissions
-                requireActivity()
-                    .supportFragmentManager
-                    .beginTransaction()
-                    .replace(R.id.permission_content, AdditionalPermissionsFragment())
-                    .commit()
-            }
-        } else {
-            // Just health permissions
-            getAllowButton().setOnClickListener {
-                logger.logInteraction(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
-                viewModel.requestFitnessPermissions(getPackageNameExtra())
-                this.handlePermissionResults(viewModel.getPermissionGrants())
-            }
+        getAllowButton().setOnClickListener {
+            viewModel.setFitnessPermissionRequestConcluded(true)
+            // When fitness permissions are concluded we need to
+            // grant/revoke only the fitness permissions, to trigger the
+            // access date. We can't request all at once because we might accidentally
+            // set the additional permissions USER_FIXED
+            viewModel.requestFitnessPermissions(getPackageNameExtra())
+            logger.logInteraction(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
         }
     }
 
@@ -176,10 +168,10 @@
         logger.logImpression(PermissionsElement.CANCEL_PERMISSIONS_BUTTON)
 
         getDontAllowButton().setOnClickListener {
+            viewModel.setFitnessPermissionRequestConcluded(true)
             logger.logInteraction(PermissionsElement.CANCEL_PERMISSIONS_BUTTON)
             viewModel.updateFitnessPermissions(false)
             viewModel.requestFitnessPermissions(getPackageNameExtra())
-            handlePermissionResults(viewModel.getPermissionGrants())
         }
     }
 
@@ -187,52 +179,55 @@
         viewModel.allFitnessPermissionsGranted.observe(viewLifecycleOwner) { allPermissionsGranted
             ->
             // does not trigger removing/enabling all permissions
-            allowAllPreference?.removeOnSwitchChangeListener(onSwitchChangeListener)
-            allowAllPreference?.isChecked = allPermissionsGranted
-            allowAllPreference?.addOnSwitchChangeListener(onSwitchChangeListener)
+            allowAllPreference.removeOnSwitchChangeListener(onSwitchChangeListener)
+            allowAllPreference.isChecked = allPermissionsGranted
+            allowAllPreference.addOnSwitchChangeListener(onSwitchChangeListener)
         }
-        allowAllPreference?.addOnSwitchChangeListener(onSwitchChangeListener)
+        allowAllPreference.addOnSwitchChangeListener(onSwitchChangeListener)
     }
 
     private fun updateDataList(permissionsList: List<HealthPermission.FitnessPermission>) {
-        readPermissionCategory?.removeAll()
-        writePermissionCategory?.removeAll()
+        readPermissionCategory.removeAll()
+        writePermissionCategory.removeAll()
 
         permissionsList
             .sortedBy {
                 requireContext()
                     .getString(
                         FitnessPermissionStrings.fromPermissionType(it.fitnessPermissionType)
-                            .uppercaseLabel)
+                            .uppercaseLabel
+                    )
             }
             .forEach { permission ->
                 val value = viewModel.isPermissionLocallyGranted(permission)
                 if (PermissionsAccessType.READ == permission.permissionsAccessType) {
-                    readPermissionCategory?.addPreference(
-                        getPermissionPreference(value, permission))
+                    readPermissionCategory.addPreference(getPermissionPreference(value, permission))
                 } else if (PermissionsAccessType.WRITE == permission.permissionsAccessType) {
-                    writePermissionCategory?.addPreference(
-                        getPermissionPreference(value, permission))
+                    writePermissionCategory.addPreference(
+                        getPermissionPreference(value, permission)
+                    )
                 }
             }
 
-        readPermissionCategory?.apply { isVisible = (preferenceCount != 0) }
-        writePermissionCategory?.apply { isVisible = (preferenceCount != 0) }
+        readPermissionCategory.apply { isVisible = (preferenceCount != 0) }
+        writePermissionCategory.apply { isVisible = (preferenceCount != 0) }
     }
 
     private fun getPermissionPreference(
         defaultValue: Boolean,
-        permission: HealthPermission.FitnessPermission
+        permission: HealthPermission.FitnessPermission,
     ): Preference {
         return HealthSwitchPreference(requireContext()).also {
             val healthCategory =
                 HealthDataCategoryExtensions.fromFitnessPermissionType(
-                    permission.fitnessPermissionType)
+                    permission.fitnessPermissionType
+                )
             it.icon = healthCategory.icon(requireContext())
             it.setDefaultValue(defaultValue)
             it.setTitle(
                 FitnessPermissionStrings.fromPermissionType(permission.fitnessPermissionType)
-                    .uppercaseLabel)
+                    .uppercaseLabel
+            )
             it.logNameActive = PermissionsElement.PERMISSION_SWITCH
             it.logNameInactive = PermissionsElement.PERMISSION_SWITCH
             it.setOnPreferenceChangeListener { _, newValue ->
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/MedicalPermissionsFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/request/MedicalPermissionsFragment.kt
index ef1b621..87b61f0 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/request/MedicalPermissionsFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/MedicalPermissionsFragment.kt
@@ -16,9 +16,7 @@
 package com.android.healthconnect.controller.permissions.request
 
 import android.os.Bundle
-import android.view.LayoutInflater
 import android.view.View
-import android.view.ViewGroup
 import android.widget.CompoundButton.OnCheckedChangeListener
 import androidx.fragment.app.activityViewModels
 import androidx.preference.Preference
@@ -29,16 +27,23 @@
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionStrings
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.shared.children
 import com.android.healthconnect.controller.shared.preference.HealthMainSwitchPreference
 import com.android.healthconnect.controller.shared.preference.HealthSwitchPreference
+import com.android.healthconnect.controller.utils.DeviceInfoUtils
 import com.android.healthconnect.controller.utils.logging.ErrorPageElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.logging.PermissionsElement
+import com.android.healthconnect.controller.utils.pref
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
+/**
+ * Fragment for displaying a medical permission request, when an app is requesting at least one
+ * medical read permission.
+ */
 @AndroidEntryPoint(PermissionsFragment::class)
 class MedicalPermissionsFragment : Hilt_MedicalPermissionsFragment() {
 
@@ -49,98 +54,107 @@
         private const val HEADER = "request_permissions_header"
     }
 
-    // TODO(b/342159144): Update page name.
-    private val pageName = PageName.UNKNOWN_PAGE
     @Inject lateinit var logger: HealthConnectLogger
 
     private val viewModel: RequestPermissionViewModel by activityViewModels()
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
+    @Inject lateinit var deviceInfoUtils: DeviceInfoUtils
 
-    private val header: RequestPermissionHeaderPreference? by lazy {
-        preferenceScreen.findPreference(HEADER)
-    }
+    private val header: RequestPermissionHeaderPreference by pref(HEADER)
 
-    private val allowAllPreference: HealthMainSwitchPreference? by lazy {
-        preferenceScreen.findPreference(ALLOW_ALL_PREFERENCE)
-    }
+    private val allowAllPreference: HealthMainSwitchPreference by pref(ALLOW_ALL_PREFERENCE)
 
-    private val readPermissionCategory: PreferenceGroup? by lazy {
-        preferenceScreen.findPreference(READ_CATEGORY)
-    }
+    private val readPermissionCategory: PreferenceGroup by pref(READ_CATEGORY)
 
-    private val writePermissionCategory: PreferenceGroup? by lazy {
-        preferenceScreen.findPreference(WRITE_CATEGORY)
-    }
+    private val writePermissionCategory: PreferenceGroup by pref(WRITE_CATEGORY)
 
     private val onSwitchChangeListener = OnCheckedChangeListener { _, grant ->
-        readPermissionCategory?.children?.forEach { preference ->
+        readPermissionCategory.children.forEach { preference ->
             (preference as TwoStatePreference).isChecked = grant
         }
-        writePermissionCategory?.children?.forEach { preference ->
+        writePermissionCategory.children.forEach { preference ->
             (preference as TwoStatePreference).isChecked = grant
         }
         viewModel.updateMedicalPermissions(grant)
     }
 
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        logger.setPageId(pageName)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        logger.setPageId(pageName)
-        logger.logPageImpression()
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater,
-        container: ViewGroup?,
-        savedInstanceState: Bundle?,
-    ): View {
-        logger.setPageId(pageName)
-        return super.onCreateView(inflater, container, savedInstanceState)
+    init {
+        this.setPageName(PageName.REQUEST_MEDICAL_PERMISSIONS_PAGE)
     }
 
     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
         setPreferencesFromResource(R.xml.permissions_screen, rootKey)
         // TODO(b/342159144): Update visual elements.
-        allowAllPreference?.logNameActive = ErrorPageElement.UNKNOWN_ELEMENT
-        allowAllPreference?.logNameInactive = ErrorPageElement.UNKNOWN_ELEMENT
+        allowAllPreference.logNameActive = ErrorPageElement.UNKNOWN_ELEMENT
+        allowAllPreference.logNameInactive = ErrorPageElement.UNKNOWN_ELEMENT
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-        viewModel.appMetadata.observe(viewLifecycleOwner) { app ->
-            logger.logImpression(PermissionsElement.APP_RATIONALE_LINK)
-            header?.bind(app.appName, /* historyAccessGranted= */ true) {
-                val startRationaleIntent =
-                    healthPermissionReader.getApplicationRationaleIntent(app.packageName)
-                logger.logInteraction(PermissionsElement.APP_RATIONALE_LINK)
-                startActivity(startRationaleIntent)
+
+        viewModel.medicalScreenState.observe(viewLifecycleOwner) { screenState ->
+            when (screenState) {
+                is MedicalScreenState.NoMedicalData -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .remove(this)
+                        .commit()
+                }
+                is MedicalScreenState.ShowMedicalWrite -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .replace(R.id.permission_content, MedicalWritePermissionFragment())
+                        .commit()
+                }
+                is MedicalScreenState.ShowMedicalReadWrite -> {
+                    setupHeader(screenState.appMetadata, screenState)
+                    updateDataList(screenState.medicalPermissions)
+                    updateCategoryTitles(screenState.appMetadata.appName)
+                    setupButtons()
+                }
+                is MedicalScreenState.ShowMedicalRead -> {
+                    setupHeader(screenState.appMetadata, screenState)
+                    updateDataList(screenState.medicalPermissions)
+                    updateCategoryTitles(screenState.appMetadata.appName)
+                    setupButtons()
+                }
             }
-            readPermissionCategory?.title =
-                getString(R.string.read_permission_category, app.appName)
-            writePermissionCategory?.title =
-                getString(R.string.write_permission_category, app.appName)
-        }
-        viewModel.healthPermissionsList.observe(viewLifecycleOwner) { allPermissions ->
-            val medicalPermissions =
-                allPermissions.filterIsInstance<HealthPermission.MedicalPermission>()
-            val fitnessPermissions =
-                allPermissions.filterIsInstance<HealthPermission.FitnessPermission>()
-            val additionalPermissions =
-                allPermissions.filterIsInstance<HealthPermission.AdditionalPermission>()
-
-            updateDataList(medicalPermissions)
-            setupAllowAll()
-
-            setupAllowButton(fitnessPermissions.isNotEmpty(), additionalPermissions.isNotEmpty())
-            setupDontAllowButton()
         }
     }
 
-    private fun setupAllowButton(isDataTypeNotEmpty: Boolean, isAdditionalNotEmpty: Boolean) {
+    private fun setupHeader(appMetadata: AppMetadata, screenState: RequestPermissionsScreenState) {
+        val onAboutHealthRecordsClicked = {
+            deviceInfoUtils.openHCGetStartedLink(requireActivity())
+        }
+        val onRationaleLinkClicked = {
+            val startRationaleIntent =
+                healthPermissionReader.getApplicationRationaleIntent(appMetadata.packageName)
+            logger.logInteraction(PermissionsElement.APP_RATIONALE_LINK)
+            startActivity(startRationaleIntent)
+        }
+
+        header.bind(
+            appMetadata.appName,
+            screenState,
+            onAboutHealthRecordsClicked = onAboutHealthRecordsClicked,
+            onRationaleLinkClicked = onRationaleLinkClicked,
+        )
+    }
+
+    private fun updateCategoryTitles(appName: String) {
+        readPermissionCategory.title = getString(R.string.read_permission_category, appName)
+        writePermissionCategory.title = getString(R.string.write_permission_category, appName)
+    }
+
+    private fun setupButtons() {
+        setupAllowAll()
+        setupAllowButton()
+        setupDontAllowButton()
+    }
+
+    private fun setupAllowButton() {
         // TODO(b/342159144): Update visual element.
         logger.logImpression(ErrorPageElement.UNKNOWN_ELEMENT)
 
@@ -150,39 +164,15 @@
             }
         }
 
-        if (isDataTypeNotEmpty || isAdditionalNotEmpty) {
-            getAllowButton().setOnClickListener {
-                viewModel.setMedicalPermissionRequestConcluded(true)
-                // When medical permissions are concluded we need to
-                // grant/revoke only the medical permissions, to trigger the
-                // access date. We can't request all at once because we might accidentally
-                // set the data type and additional permissions USER_FIXED
-                viewModel.requestMedicalPermissions(getPackageNameExtra())
-                // TODO(b/342159144): Update visual element.
-                logger.logInteraction(ErrorPageElement.UNKNOWN_ELEMENT)
-                // navigate to the next permission screen
-                if (isDataTypeNotEmpty) {
-                    requireActivity()
-                        .supportFragmentManager
-                        .beginTransaction()
-                        .replace(R.id.permission_content, FitnessPermissionsFragment())
-                        .commit()
-                } else {
-                    requireActivity()
-                        .supportFragmentManager
-                        .beginTransaction()
-                        .replace(R.id.permission_content, AdditionalPermissionsFragment())
-                        .commit()
-                }
-            }
-        } else {
-            // Just medical permissions
-            getAllowButton().setOnClickListener {
-                // TODO(b/342159144): Update visual element.
-                logger.logInteraction(ErrorPageElement.UNKNOWN_ELEMENT)
-                viewModel.requestMedicalPermissions(getPackageNameExtra())
-                this.handlePermissionResults(viewModel.getPermissionGrants())
-            }
+        getAllowButton().setOnClickListener {
+            viewModel.setMedicalPermissionRequestConcluded(true)
+            // When medical permissions are concluded we need to
+            // grant/revoke only the medical permissions, to trigger the
+            // access date. We can't request all at once because we might accidentally
+            // set the data type and additional permissions USER_FIXED
+            viewModel.requestMedicalPermissions(getPackageNameExtra())
+            // TODO(b/342159144): Update visual element.
+            logger.logInteraction(ErrorPageElement.UNKNOWN_ELEMENT)
         }
     }
 
@@ -191,11 +181,15 @@
         logger.logImpression(ErrorPageElement.UNKNOWN_ELEMENT)
 
         getDontAllowButton().setOnClickListener {
+            viewModel.updateMedicalPermissions(false)
+            viewModel.setMedicalPermissionRequestConcluded(true)
+            // When medical permissions are concluded we need to
+            // grant/revoke only the medical permissions, to trigger the
+            // access date. We can't request all at once because we might accidentally
+            // set the data type and additional permissions USER_FIXED
+            viewModel.requestMedicalPermissions(getPackageNameExtra())
             // TODO(b/342159144): Update visual element.
             logger.logInteraction(ErrorPageElement.UNKNOWN_ELEMENT)
-            viewModel.updateMedicalPermissions(false)
-            viewModel.requestMedicalPermissions(getPackageNameExtra())
-            handlePermissionResults(viewModel.getPermissionGrants())
         }
     }
 
@@ -203,16 +197,16 @@
         viewModel.allMedicalPermissionsGranted.observe(viewLifecycleOwner) { allPermissionsGranted
             ->
             // does not trigger removing/enabling all permissions
-            allowAllPreference?.removeOnSwitchChangeListener(onSwitchChangeListener)
-            allowAllPreference?.isChecked = allPermissionsGranted
-            allowAllPreference?.addOnSwitchChangeListener(onSwitchChangeListener)
+            allowAllPreference.removeOnSwitchChangeListener(onSwitchChangeListener)
+            allowAllPreference.isChecked = allPermissionsGranted
+            allowAllPreference.addOnSwitchChangeListener(onSwitchChangeListener)
         }
-        allowAllPreference?.addOnSwitchChangeListener(onSwitchChangeListener)
+        allowAllPreference.addOnSwitchChangeListener(onSwitchChangeListener)
     }
 
     private fun updateDataList(permissionsList: List<HealthPermission.MedicalPermission>) {
-        readPermissionCategory?.removeAll()
-        writePermissionCategory?.removeAll()
+        readPermissionCategory.removeAll()
+        writePermissionCategory.removeAll()
 
         permissionsList
             .sortedBy {
@@ -225,18 +219,16 @@
             .forEach { permission ->
                 val value = viewModel.isPermissionLocallyGranted(permission)
                 if (permission.medicalPermissionType == MedicalPermissionType.ALL_MEDICAL_DATA) {
-                    writePermissionCategory?.addPreference(
+                    writePermissionCategory.addPreference(
                         getPermissionPreference(value, permission)
                     )
                 } else {
-                    readPermissionCategory?.addPreference(
-                        getPermissionPreference(value, permission)
-                    )
+                    readPermissionCategory.addPreference(getPermissionPreference(value, permission))
                 }
             }
 
-        readPermissionCategory?.apply { isVisible = (preferenceCount != 0) }
-        writePermissionCategory?.apply { isVisible = (preferenceCount != 0) }
+        readPermissionCategory.apply { isVisible = (preferenceCount != 0) }
+        writePermissionCategory.apply { isVisible = (preferenceCount != 0) }
     }
 
     private fun getPermissionPreference(
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/MedicalWritePermissionFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/request/MedicalWritePermissionFragment.kt
new file mode 100644
index 0000000..349c8c7
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/MedicalWritePermissionFragment.kt
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request
+
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.activityViewModels
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.shared.preference.HealthPreference
+import com.android.healthconnect.controller.utils.DeviceInfoUtils
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.MedicalWritePermissionPageElement
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthconnect.controller.utils.pref
+import com.android.settingslib.widget.FooterPreference
+import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
+
+/** Fragment for displaying a medical WRITE permission request. */
+@AndroidEntryPoint(PermissionsFragment::class)
+class MedicalWritePermissionFragment : Hilt_MedicalWritePermissionFragment() {
+
+    companion object {
+        private const val HEADER_PREFERENCE = "request_permissions_header"
+        private const val SUPPORTED_PERMS_PREFERENCE = "supported_medical_permissions"
+        private const val FOOTER_PREFERENCE = "request_medical_write_footer"
+        private val sampleMedicalPermissionTypes =
+            setOf(
+                MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                MedicalPermissionType.CONDITIONS,
+                MedicalPermissionType.LABORATORY_RESULTS,
+                MedicalPermissionType.MEDICATIONS,
+                MedicalPermissionType.PROCEDURES,
+                MedicalPermissionType.VACCINES,
+                MedicalPermissionType.VITAL_SIGNS,
+            )
+    }
+
+    @Inject lateinit var logger: HealthConnectLogger
+    @Inject lateinit var healthPermissionReader: HealthPermissionReader
+    @Inject lateinit var deviceInfoUtils: DeviceInfoUtils
+
+    private val viewModel: RequestPermissionViewModel by activityViewModels()
+
+    private val header: RequestPermissionHeaderPreference by pref(HEADER_PREFERENCE)
+
+    private val supportedMedicalPreference: HealthPreference? by lazy {
+        preferenceScreen.findPreference(SUPPORTED_PERMS_PREFERENCE)
+    }
+
+    private val footer: FooterPreference? by lazy {
+        preferenceScreen.findPreference(FOOTER_PREFERENCE)
+    }
+
+    init {
+        this.setPageName(PageName.REQUEST_WRITE_MEDICAL_PERMISSION_PAGE)
+    }
+
+    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+        setPreferencesFromResource(R.xml.permissions_screen_medical_write, rootKey)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        viewModel.medicalScreenState.observe(viewLifecycleOwner) { screenState ->
+            when (screenState) {
+                is MedicalScreenState.ShowMedicalWrite -> {
+                    setupScreen(screenState)
+                }
+                is MedicalScreenState.ShowMedicalRead,
+                is MedicalScreenState.ShowMedicalReadWrite -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .replace(R.id.permission_content, MedicalPermissionsFragment())
+                        .commit()
+                }
+                else -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .remove(this)
+                        .commit()
+                }
+            }
+        }
+    }
+
+    private fun setupScreen(screenState: MedicalScreenState.ShowMedicalWrite) {
+        header.bind(appName = screenState.appMetadata.appName, screenState = screenState)
+
+        val sampleMedicalPermissions =
+            sampleMedicalPermissionTypes
+                .filterNot { it == MedicalPermissionType.ALL_MEDICAL_DATA }
+                .map { getString(it.upperCaseLabel()) }
+                .sorted()
+                .joinToString("\n")
+        supportedMedicalPreference?.summary = sampleMedicalPermissions
+        supportedMedicalPreference?.isSelectable = false
+
+        footer?.title = getString(R.string.medical_request_footer)
+        footer?.setLearnMoreText(getString(R.string.medical_request_about_health_records))
+        footer?.setLearnMoreAction { deviceInfoUtils.openHCGetStartedLink(requireActivity()) }
+
+        setupAllowButton()
+        setupDontAllowButton()
+    }
+
+    private fun setupAllowButton() {
+        logger.logImpression(MedicalWritePermissionPageElement.ALLOW_WRITE_HEALTH_RECORDS_BUTTON)
+        getAllowButton().isEnabled = true
+
+        getAllowButton().setOnClickListener {
+            viewModel.setMedicalPermissionRequestConcluded(true)
+            viewModel.updateMedicalPermissions(true)
+            viewModel.requestMedicalPermissions(getPackageNameExtra())
+            logger.logInteraction(
+                MedicalWritePermissionPageElement.ALLOW_WRITE_HEALTH_RECORDS_BUTTON
+            )
+        }
+    }
+
+    private fun setupDontAllowButton() {
+        logger.logImpression(MedicalWritePermissionPageElement.CANCEL_WRITE_HEALTH_RECORDS_BUTTON)
+
+        getDontAllowButton().setOnClickListener {
+            viewModel.setMedicalPermissionRequestConcluded(true)
+            viewModel.updateMedicalPermissions(false)
+            viewModel.requestMedicalPermissions(getPackageNameExtra())
+            logger.logInteraction(
+                MedicalWritePermissionPageElement.CANCEL_WRITE_HEALTH_RECORDS_BUTTON
+            )
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/PermissionsActivity.kt b/apk/src/com/android/healthconnect/controller/permissions/request/PermissionsActivity.kt
index 202aabc..b357aff 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/request/PermissionsActivity.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/PermissionsActivity.kt
@@ -41,13 +41,14 @@
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.MigrationUiState
 import com.android.healthconnect.controller.onboarding.OnboardingActivity
 import com.android.healthconnect.controller.onboarding.OnboardingActivity.Companion.shouldRedirectToOnboardingActivity
-import com.android.healthconnect.controller.permissions.data.HealthPermission
 import com.android.healthconnect.controller.permissions.data.PermissionState
+import com.android.healthconnect.controller.permissions.request.wear.WearGrantPermissionsActivity
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.activity.EmbeddingUtils.maybeRedirectIntoTwoPaneSettings
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled
+import com.android.healthfitness.flags.Flags
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
@@ -65,8 +66,6 @@
 
     @Inject lateinit var deviceInfoUtils: DeviceInfoUtils
 
-    @Inject lateinit var featureUtils: FeatureUtils
-
     private val requestPermissionsViewModel: RequestPermissionViewModel by viewModels()
 
     private val migrationViewModel: MigrationViewModel by viewModels()
@@ -81,6 +80,22 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        // If device is enabled on watch, redirect to WearGrantPermissionsActivity.
+        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+            if (!Flags.replaceBodySensorPermissionEnabled()) {
+                Log.e(TAG, "Health connect is not available on watch, finishing!")
+                finish()
+                return
+            }
+            val wearIntent = Intent(this, WearGrantPermissionsActivity::class.java).apply {
+                putExtra(EXTRA_PACKAGE_NAME, getPackageNameExtra())
+                putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES, getPermissionStrings())
+            }
+            startActivity(wearIntent)
+            finish()
+            return
+        }
+
         // This flag ensures a non system app cannot show an overlay on Health Connect. b/313425281
         window.addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
 
@@ -115,90 +130,55 @@
         }
 
         requestPermissionsViewModel.init(getPackageNameExtra(), getPermissionStrings())
-        if (requestPermissionsViewModel.isAnyPermissionUserFixed(
-            getPackageNameExtra(), getPermissionStrings())) {
-            Log.e(TAG, "App has at least one USER_FIXED permission, finishing!")
-            requestPermissionsViewModel.requestHealthPermissions(getPackageNameExtra())
-            handlePermissionResults()
-        }
-
-        requestPermissionsViewModel.healthPermissionsList.observe(this) { allPermissions ->
-            val medicalPermissions =
-                allPermissions.filterIsInstance<HealthPermission.MedicalPermission>()
-            val fitnessPermissions =
-                allPermissions.filterIsInstance<HealthPermission.FitnessPermission>()
-            val additionalPermissions =
-                allPermissions.filterIsInstance<HealthPermission.AdditionalPermission>()
-            val noMedicalRequest = medicalPermissions.isEmpty()
-            val noDataTypeRequest = fitnessPermissions.isEmpty()
-            val noAdditionalRequest = additionalPermissions.isEmpty()
-
-            // Case 1 - no permissions
-            if (noMedicalRequest && noDataTypeRequest && noAdditionalRequest) {
+        if (
+            requestPermissionsViewModel.isAnyPermissionUserFixed(
+                getPackageNameExtra(),
+                getPermissionStrings(),
+            )
+        ) {
+            if (isPersonalHealthRecordEnabled()) {
+                // First check if we are already in a permission request flow.
+                // Without this check, if any permissions from the previous screen
+                // were USER_FIXED, we would terminate the request without showing
+                // the subsequent screens.
+                if (
+                    !requestPermissionsViewModel.isFitnessPermissionRequestConcluded() &&
+                        !requestPermissionsViewModel.isMedicalPermissionRequestConcluded()
+                ) {
+                    Log.e(TAG, "App has at least one USER_FIXED permission, finishing!")
+                    requestPermissionsViewModel.updatePermissionGrants()
+                    handlePermissionResults()
+                }
+            } else {
+                Log.e(TAG, "App has at least one USER_FIXED permission, finishing!")
                 requestPermissionsViewModel.requestHealthPermissions(getPackageNameExtra())
                 handlePermissionResults()
             }
+        }
 
-            // Case 2 - just medical permissions
-            else if (noDataTypeRequest && noAdditionalRequest) {
-                showFragment(MedicalPermissionsFragment())
-            }
-
-            // Case 3 - just fitness permissions
-            else if (noMedicalRequest && noAdditionalRequest) {
-                showFragment(FitnessPermissionsFragment())
-            }
-
-            // Case 4 - just additional permissions
-            else if (noMedicalRequest && noDataTypeRequest) {
-                if (!requestPermissionsViewModel.isAnyReadPermissionGranted()) {
-                    Log.e(
-                        TAG,
-                        "No data type read permissions are granted, cannot request additional permissions.")
-                    handlePermissionResults(RESULT_CANCELED)
+        requestPermissionsViewModel.permissionsActivityState.observe(this) { screenState ->
+            when (screenState) {
+                is PermissionsActivityState.ShowMedical -> {
+                    if (screenState.isWriteOnly) {
+                        showFragment(MedicalWritePermissionFragment())
+                    } else {
+                        showFragment(MedicalPermissionsFragment())
+                    }
                 }
-
-                // Show only additional access request
-                requestPermissionsViewModel.setFitnessPermissionRequestConcluded(true)
-                showFragment(AdditionalPermissionsFragment())
-            }
-
-            // Case 5 - medical and data type
-            else if (noAdditionalRequest) {
-                if (!requestPermissionsViewModel.isMedicalPermissionRequestConcluded()) {
-                    showFragment(MedicalPermissionsFragment())
-                } else {
+                is PermissionsActivityState.ShowFitness -> {
                     showFragment(FitnessPermissionsFragment())
                 }
-            }
-
-            // Case 6 - medical and additional
-            else if (noDataTypeRequest) {
-                if (!requestPermissionsViewModel.isMedicalPermissionRequestConcluded()) {
-                    showFragment(MedicalPermissionsFragment())
-                } else {
-                    showFragment(AdditionalPermissionsFragment())
+                is PermissionsActivityState.ShowAdditional -> {
+                    if (screenState.singlePermission) {
+                        showFragment(SingleAdditionalPermissionFragment())
+                    } else {
+                        showFragment(CombinedAdditionalPermissionsFragment())
+                    }
                 }
-            }
-
-            // Case 7 - data type and additional
-            else if (noMedicalRequest) {
-                if (!requestPermissionsViewModel.isFitnessPermissionRequestConcluded()) {
-                    showFragment(FitnessPermissionsFragment())
-                } else {
-                    showFragment(AdditionalPermissionsFragment())
-                }
-            }
-
-            // Case 8 - all three combined
-            else {
-                if (!requestPermissionsViewModel.isMedicalPermissionRequestConcluded()) {
-                    showFragment(MedicalPermissionsFragment())
-                } else if (!requestPermissionsViewModel.isFitnessPermissionRequestConcluded()) {
-                    showFragment(FitnessPermissionsFragment())
-                } else {
-                    // After configuration change
-                    showFragment(AdditionalPermissionsFragment())
+                else -> {
+                    // No permissions
+                    requestPermissionsViewModel.updatePermissionGrants()
+                    handlePermissionResults()
                 }
             }
         }
@@ -225,20 +205,26 @@
                 this,
                 getString(
                     R.string.migration_in_progress_permissions_dialog_content,
-                    requestPermissionsViewModel.appMetadata.value?.appName)) { _, _ ->
-                    finish()
-                }
-        } else if (migrationUiState in
-            listOf(
-                MigrationUiState.ALLOWED_PAUSED,
-                MigrationUiState.ALLOWED_NOT_STARTED,
-                MigrationUiState.MODULE_UPGRADE_REQUIRED,
-                MigrationUiState.APP_UPGRADE_REQUIRED)) {
+                    requestPermissionsViewModel.appMetadata.value?.appName,
+                ),
+            ) { _, _ ->
+                finish()
+            }
+        } else if (
+            migrationUiState in
+                listOf(
+                    MigrationUiState.ALLOWED_PAUSED,
+                    MigrationUiState.ALLOWED_NOT_STARTED,
+                    MigrationUiState.MODULE_UPGRADE_REQUIRED,
+                    MigrationUiState.APP_UPGRADE_REQUIRED,
+                )
+        ) {
             showMigrationPendingDialog(
                 this,
                 getString(
                     R.string.migration_pending_permissions_dialog_content,
-                    requestPermissionsViewModel.appMetadata.value?.appName),
+                    requestPermissionsViewModel.appMetadata.value?.appName,
+                ),
                 null,
             ) { _, _ ->
                 if (requestPermissionsViewModel.isFitnessPermissionRequestConcluded()) {
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/PermissionsFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/request/PermissionsFragment.kt
index 7279c35..1760c89 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/request/PermissionsFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/PermissionsFragment.kt
@@ -31,23 +31,56 @@
 import com.android.healthconnect.controller.permissions.data.HealthPermission
 import com.android.healthconnect.controller.permissions.data.PermissionState
 import com.android.healthconnect.controller.utils.increaseViewTouchTargetSize
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
+import com.android.healthconnect.controller.utils.logging.PageName
+import dagger.hilt.android.EntryPointAccessors
 
 /** Base fragment class for permission request screens. */
 abstract class PermissionsFragment : PreferenceFragmentCompat() {
 
+    private lateinit var logger: HealthConnectLogger
     private lateinit var preferenceContainer: ViewGroup
     private lateinit var prefView: ViewGroup
 
     private lateinit var allowButton: Button
     private lateinit var dontAllowButton: Button
 
+    private var pageName: PageName = PageName.UNKNOWN_PAGE
+
+    fun setPageName(pageName: PageName) {
+        this.pageName = pageName
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        setupLogger()
+        super.onCreate(savedInstanceState)
+    }
+
+    private fun setupLogger() {
+        val hiltEntryPoint =
+            EntryPointAccessors.fromApplication(
+                requireContext().applicationContext,
+                HealthConnectLoggerEntryPoint::class.java,
+            )
+        logger = hiltEntryPoint.logger()
+        logger.setPageId(pageName)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        logger.setPageId(pageName)
+        logger.logPageImpression()
+    }
+
     // Places the preference fragment inside the preference container and allows us
     // to have the action buttons in the same fragment
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
-        savedInstanceState: Bundle?
+        savedInstanceState: Bundle?,
     ): View {
+        logger.setPageId(pageName)
         val rootView = inflater.inflate(R.layout.fragment_permissions_request, container, false)
         prefView = rootView.findViewById(R.id.preference_container)
         preferenceContainer =
@@ -90,7 +123,9 @@
 
         val result = Intent()
         result.putExtra(
-            PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES, permissionStrings.toTypedArray())
+            PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES,
+            permissionStrings.toTypedArray(),
+        )
         result.putExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS, grants.toIntArray())
         requireActivity().setResult(RESULT_OK, result)
         requireActivity().finish()
@@ -102,4 +137,4 @@
             .getStringArrayExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES)
             .orEmpty()
     }
-}
\ No newline at end of file
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/RequestPermissionHeaderPreference.kt b/apk/src/com/android/healthconnect/controller/permissions/request/RequestPermissionHeaderPreference.kt
index b445a18..880adc4 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/request/RequestPermissionHeaderPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/RequestPermissionHeaderPreference.kt
@@ -17,10 +17,15 @@
 
 import android.content.Context
 import android.util.AttributeSet
+import android.view.View
+import android.widget.LinearLayout
 import android.widget.TextView
+import androidx.annotation.AttrRes
 import androidx.preference.Preference
 import androidx.preference.PreferenceViewHolder
 import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.utils.AttributeResolver
+import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import com.android.healthconnect.controller.utils.boldAppName
 import com.android.healthconnect.controller.utils.convertTextViewIntoLink
 
@@ -34,11 +39,18 @@
 ) : Preference(context, attrs, defStyleAttr, defStyleRes) {
 
     private lateinit var title: TextView
-    private lateinit var historyAccess: TextView
+    private lateinit var summary: TextView
+    private lateinit var detailedPermissions: LinearLayout
+    private lateinit var dataAccessType: TextView
+    private lateinit var accessInfo: TextView
     private lateinit var privacyPolicy: TextView
+
     private var appName: String? = null
     private var onRationaleLinkClicked: (() -> Unit)? = null
-    private var historyAccessGranted: Boolean = false
+    private var onAboutHealthRecordsClicked: (() -> Unit)? = null
+    private var screenState = RequestPermissionsScreenState()
+
+    private val dateFormatter by lazy { LocalDateTimeFormatter(context) }
 
     init {
         layoutResource = R.layout.widget_request_permission_header
@@ -48,46 +60,282 @@
     override fun onBindViewHolder(holder: PreferenceViewHolder) {
         super.onBindViewHolder(holder)
         title = holder.findViewById(R.id.title) as TextView
-        updateTitle()
-        historyAccess = holder.findViewById(R.id.history_access) as TextView
-        updateHistoryAccess()
+        summary = holder.findViewById(R.id.summary) as TextView
+        detailedPermissions = holder.findViewById(R.id.detailed_permissions) as LinearLayout
+        dataAccessType = holder.findViewById(R.id.data_access_type) as TextView
+        accessInfo = holder.findViewById(R.id.access_info) as TextView
         privacyPolicy = holder.findViewById(R.id.privacy_policy) as TextView
-        updatePrivacyString()
+
+        updateTitle()
+        updateSummary()
+        updateDetailedPermissions()
     }
 
-    fun bind(appName: String, historyAccessGranted: Boolean, onRationaleLinkClicked: () -> Unit) {
+    fun bind(
+        appName: String,
+        screenState: RequestPermissionsScreenState,
+        onRationaleLinkClicked: (() -> Unit)? = null,
+        onAboutHealthRecordsClicked: (() -> Unit)? = null,
+    ) {
         this.appName = appName
-        this.historyAccessGranted = historyAccessGranted
+        this.screenState = screenState
         this.onRationaleLinkClicked = onRationaleLinkClicked
+        this.onAboutHealthRecordsClicked = onAboutHealthRecordsClicked
         notifyChanged()
     }
 
     private fun updateTitle() {
-        val text = context.getString(R.string.request_permissions_header_title, appName)
+        val text =
+            when (screenState) {
+                is MedicalScreenState -> {
+                    context.getString(R.string.medical_request_header, appName)
+                }
+                is FitnessScreenState -> {
+                    if ((screenState as FitnessScreenState).hasMedical) {
+                        context.getString(
+                            R.string.request_permissions_with_medical_header_title,
+                            appName,
+                        )
+                    } else {
+                        context.getString(R.string.request_permissions_header_title, appName)
+                    }
+                }
+                is AdditionalScreenState -> {
+                    when (screenState) {
+                        is AdditionalScreenState.ShowHistory -> {
+                            context.getString(R.string.history_read_single_request_title, appName)
+                        }
+                        is AdditionalScreenState.ShowBackground -> {
+                            context.getString(
+                                R.string.background_read_single_request_title,
+                                appName,
+                            )
+                        }
+                        is AdditionalScreenState.ShowCombined -> {
+                            context.getString(
+                                R.string.additional_permissions_combined_request_title,
+                                appName,
+                            )
+                        }
+                        else -> {
+                            ""
+                        }
+                    }
+                }
+
+                else -> {
+                    ""
+                }
+            }
         title.text = boldAppName(appName, text)
     }
 
-    private fun updateHistoryAccess() {
-        if (historyAccessGranted) {
-            historyAccess.text =
-                context.getString(R.string.request_permissions_header_time_frame_history_desc)
-        } else {
-            historyAccess.text =
-                context.getString(R.string.request_permissions_header_time_frame_desc)
+    private fun updateSummary() {
+        when (screenState) {
+            is MedicalScreenState.ShowMedicalWrite -> {
+                summary.visibility = View.VISIBLE
+                summary.text = context.getString(R.string.medical_request_summary, appName)
+            }
+            is AdditionalScreenState -> {
+                summary.visibility = View.VISIBLE
+                summary.text = getAdditionalScreenStateSummary(screenState as AdditionalScreenState)
+            }
+            else -> {
+                summary.visibility = View.GONE
+            }
         }
     }
 
-    private fun updatePrivacyString() {
+    private fun getAdditionalScreenStateSummary(screenState: AdditionalScreenState): String {
+        return when (screenState) {
+            is AdditionalScreenState.ShowHistory -> {
+                if (screenState.hasMedical) {
+                    if (screenState.dataAccessDate != null) {
+                        val formattedDate = dateFormatter.formatLongDate(screenState.dataAccessDate)
+                        context.getString(
+                            R.string.history_read_medical_single_request_description,
+                            formattedDate,
+                        )
+                    } else {
+                        context.getString(
+                            R.string.history_read_medical_single_request_description_fallback
+                        )
+                    }
+                } else {
+                    if (screenState.dataAccessDate != null) {
+                        val formattedDate = dateFormatter.formatLongDate(screenState.dataAccessDate)
+                        context.getString(
+                            R.string.history_read_single_request_description,
+                            formattedDate,
+                        )
+                    } else {
+                        context.getString(R.string.history_read_single_request_description_fallback)
+                    }
+                }
+            }
+            is AdditionalScreenState.ShowBackground -> {
+                if (screenState.hasMedical) {
+                    if (screenState.isMedicalReadGranted && screenState.isFitnessReadGranted) {
+                        context.getString(
+                            R.string
+                                .background_read_medical_single_request_description_both_types_granted
+                        )
+                    } else if (screenState.isMedicalReadGranted) {
+                        context.getString(
+                            R.string
+                                .background_read_medical_single_request_description_medical_granted
+                        )
+                    } else {
+                        context.getString(
+                            R.string
+                                .background_read_medical_single_request_description_fitness_granted
+                        )
+                    }
+                } else {
+                    context.getString(R.string.background_read_single_request_description)
+                }
+            }
+            is AdditionalScreenState.ShowCombined -> {
+                context.getString(
+                    R.string.additional_permissions_combined_request_description,
+                    screenState.appMetadata.appName,
+                )
+            }
+            else -> {
+                ""
+            }
+        }
+    }
+
+    private fun updateDetailedPermissions() {
+        when (screenState) {
+            is MedicalScreenState -> {
+                updateMedicalDetailedPermissions()
+            }
+            is FitnessScreenState -> {
+                updateFitnessDetailedPermissions()
+            }
+            else -> {
+                // No detailed permissions for additional permissions requests
+                detailedPermissions.visibility = View.GONE
+            }
+        }
+    }
+
+    private fun updateMedicalDetailedPermissions() {
+        when (screenState) {
+            is MedicalScreenState.ShowMedicalReadWrite -> {
+                dataAccessType.text =
+                    context.getString(R.string.request_permissions_data_access_type_read_write)
+                updateMedicalAccessInfo(showWrite = true)
+                updatePrivacyPolicy()
+            }
+            is MedicalScreenState.ShowMedicalRead -> {
+                dataAccessType.text =
+                    context.getString(R.string.request_permissions_data_access_type_read)
+                updateMedicalAccessInfo(showWrite = false)
+                updatePrivacyPolicy()
+            }
+            else -> {
+                detailedPermissions.visibility = View.GONE
+            }
+        }
+    }
+
+    private fun updateFitnessDetailedPermissions() {
+        when (screenState) {
+            is FitnessScreenState.ShowFitnessRead -> {
+                dataAccessType.text =
+                    context.getString(R.string.request_permissions_data_access_type_read)
+                updateFitnessAccessInfo(
+                    isHistoryGranted =
+                        (screenState as FitnessScreenState.ShowFitnessRead).historyGranted
+                )
+                updatePrivacyPolicy()
+            }
+            is FitnessScreenState.ShowFitnessWrite -> {
+                dataAccessType.text =
+                    context.getString(R.string.request_permissions_data_access_type_write)
+                accessInfo.visibility = View.GONE
+                updatePrivacyPolicy()
+            }
+            is FitnessScreenState.ShowFitnessReadWrite -> {
+                dataAccessType.text =
+                    context.getString(R.string.request_permissions_data_access_type_read_write)
+                updateFitnessAccessInfo(
+                    isHistoryGranted =
+                        (screenState as FitnessScreenState.ShowFitnessReadWrite).historyGranted
+                )
+                updatePrivacyPolicy()
+            }
+            else -> {
+                detailedPermissions.visibility = View.GONE
+            }
+        }
+    }
+
+    private fun updateFitnessAccessInfo(isHistoryGranted: Boolean) {
+        accessInfo.visibility = View.VISIBLE
+        setAccessInfoIcon(R.attr.accessHistoryIcon)
+        accessInfo.text =
+            if (isHistoryGranted) {
+                context.getString(R.string.request_permissions_header_time_frame_history_desc)
+            } else {
+                context.getString(R.string.request_permissions_header_time_frame_desc)
+            }
+    }
+
+    private fun updateMedicalAccessInfo(showWrite: Boolean) {
+        setAccessInfoIcon(R.attr.medicalServicesIcon)
+        val aboutHealthRecordsString =
+            context.getString(R.string.medical_request_about_health_records)
+        val accessInfoText =
+            if (showWrite) {
+                context.getString(
+                    R.string.medical_request_header_access_info_read_write,
+                    aboutHealthRecordsString,
+                )
+            } else {
+                context.getString(
+                    R.string.medical_request_header_access_info_read,
+                    aboutHealthRecordsString,
+                )
+            }
+        accessInfo.text = accessInfoText
+        convertTextViewIntoLink(
+            accessInfo,
+            accessInfoText,
+            accessInfoText.indexOf(aboutHealthRecordsString),
+            accessInfoText.indexOf(aboutHealthRecordsString) + aboutHealthRecordsString.length,
+        ) {
+            onAboutHealthRecordsClicked?.invoke()
+        }
+    }
+
+    private fun updatePrivacyPolicy() {
         val policyString = context.getString(R.string.request_permissions_privacy_policy)
         val rationaleText =
             context.resources.getString(
-                R.string.request_permissions_rationale, appName, policyString)
+                R.string.request_permissions_rationale,
+                appName,
+                policyString,
+            )
         convertTextViewIntoLink(
             privacyPolicy,
             rationaleText,
             rationaleText.indexOf(policyString),
-            rationaleText.indexOf(policyString) + policyString.length) {
-                onRationaleLinkClicked?.invoke()
-            }
+            rationaleText.indexOf(policyString) + policyString.length,
+        ) {
+            onRationaleLinkClicked?.invoke()
+        }
+    }
+
+    private fun setAccessInfoIcon(@AttrRes icon: Int) {
+        accessInfo.setCompoundDrawablesRelativeWithIntrinsicBounds(
+            AttributeResolver.getNullableDrawable(context, icon),
+            null,
+            null,
+            null,
+        )
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/RequestPermissionViewModel.kt b/apk/src/com/android/healthconnect/controller/permissions/request/RequestPermissionViewModel.kt
index f974e4f..70fbbf9 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/request/RequestPermissionViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/RequestPermissionViewModel.kt
@@ -26,6 +26,7 @@
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
+import com.android.healthconnect.controller.permissions.additionalaccess.LoadDeclaredHealthPermissionUseCase
 import com.android.healthconnect.controller.permissions.api.GetGrantedHealthPermissionsUseCase
 import com.android.healthconnect.controller.permissions.api.GetHealthPermissionsFlagsUseCase
 import com.android.healthconnect.controller.permissions.api.GrantHealthPermissionUseCase
@@ -33,14 +34,21 @@
 import com.android.healthconnect.controller.permissions.api.RevokeHealthPermissionUseCase
 import com.android.healthconnect.controller.permissions.data.HealthPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isAdditionalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isFitnessPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isFitnessReadPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isFitnessWritePermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalReadPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalWritePermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.PermissionState
-import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
-import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import dagger.hilt.android.lifecycle.HiltViewModel
+import java.time.Instant
 import javax.inject.Inject
 import kotlinx.coroutines.launch
 
@@ -55,7 +63,7 @@
     private val getGrantedHealthPermissionsUseCase: GetGrantedHealthPermissionsUseCase,
     private val getHealthPermissionsFlagsUseCase: GetHealthPermissionsFlagsUseCase,
     private val loadAccessDateUseCase: LoadAccessDateUseCase,
-    private val healthPermissionReader: HealthPermissionReader
+    private val loadDeclaredHealthPermissionUseCase: LoadDeclaredHealthPermissionUseCase,
 ) : ViewModel() {
 
     companion object {
@@ -66,36 +74,87 @@
     val appMetadata: LiveData<AppMetadata>
         get() = _appMetaData
 
+    /** List of grantable [MedicalPermission]s */
+    private val _medicalPermissionsList = MutableLiveData<List<MedicalPermission>>()
+
     /** List of grantable [FitnessPermission]s */
     private val _fitnessPermissionsList = MutableLiveData<List<FitnessPermission>>()
+    // TODO: b/376526849 - Use FitnessScreenState and AdditionalScreenState in Wear UI
     val fitnessPermissionsList: LiveData<List<FitnessPermission>>
         get() = _fitnessPermissionsList
 
-    /** List of grantable [MedicalPermission]s */
-    private val _medicalPermissionsList = MutableLiveData<List<MedicalPermission>>()
-    val medicalPermissionsList: LiveData<List<MedicalPermission>>
-        get() = _medicalPermissionsList
 
     /** List of grantable [AdditionalPermission]s */
     private val _additionalPermissionsList = MutableLiveData<List<AdditionalPermission>>()
+    // TODO: b/376526849 - Use FitnessScreenState and AdditionalScreenState in Wear UI
     val additionalPermissionsList: LiveData<List<AdditionalPermission>>
         get() = _additionalPermissionsList
 
     /** List of grantable [HealthPermissions]s */
     private val _healthPermissionsList = MutableLiveData<List<HealthPermission>>()
-    val healthPermissionsList: LiveData<List<HealthPermission>>
-        get() = _healthPermissionsList
+
+    /** Screen states */
+    private val _medicalScreenState =
+        MediatorLiveData<MedicalScreenState>().apply {
+            addSource(_appMetaData) { appMetadata ->
+                this.postValue(
+                    getMedicalScreenState(appMetadata, _medicalPermissionsList.value.orEmpty())
+                )
+            }
+            addSource(_medicalPermissionsList) { medicalPermissions ->
+                this.postValue(getMedicalScreenState(appMetadata.value, medicalPermissions))
+            }
+        }
+    val medicalScreenState: LiveData<MedicalScreenState>
+        get() = _medicalScreenState
+
+    private val _fitnessScreenState =
+        MediatorLiveData<FitnessScreenState>().apply {
+            addSource(_appMetaData) { appMetadata ->
+                this.postValue(
+                    getFitnessScreenState(appMetadata, _healthPermissionsList.value.orEmpty())
+                )
+            }
+            addSource(_healthPermissionsList) { healthPermissions ->
+                this.postValue(getFitnessScreenState(appMetadata.value, healthPermissions))
+            }
+        }
+    val fitnessScreenState: LiveData<FitnessScreenState>
+        get() = _fitnessScreenState
+
+    private val _additionalScreenState =
+        MediatorLiveData<AdditionalScreenState>().apply {
+            addSource(_appMetaData) { appMetadata ->
+                this.postValue(
+                    getAdditionalScreenState(
+                        appMetadata,
+                        _additionalPermissionsList.value.orEmpty(),
+                    )
+                )
+            }
+            addSource(_additionalPermissionsList) { additionalPermissions ->
+                this.postValue(getAdditionalScreenState(appMetadata.value, additionalPermissions))
+            }
+        }
+
+    val additionalScreenState: LiveData<AdditionalScreenState>
+        get() = _additionalScreenState
+
+    private val _permissionsActivityState = MutableLiveData<PermissionsActivityState>()
+    val permissionsActivityState: LiveData<PermissionsActivityState>
+        get() = _permissionsActivityState
+
+    /** Permission grants */
+    /** [MedicalPermission]s that have been granted locally via a toggle, but not yet requested */
+    private val _grantedMedicalPermissions = MutableLiveData<Set<MedicalPermission>>(emptySet())
+    val grantedMedicalPermissions: LiveData<Set<MedicalPermission>>
+        get() = _grantedMedicalPermissions
 
     /** [FitnessPermission]s that have been granted locally via a toggle, but not yet requested */
     private val _grantedFitnessPermissions = MutableLiveData<Set<FitnessPermission>>(emptySet())
     val grantedFitnessPermissions: LiveData<Set<FitnessPermission>>
         get() = _grantedFitnessPermissions
 
-    /** [FitnessPermission]s that have been granted locally via a toggle, but not yet requested */
-    private val _grantedMedicalPermissions = MutableLiveData<Set<MedicalPermission>>(emptySet())
-    val grantedMedicalPermissions: LiveData<Set<MedicalPermission>>
-        get() = _grantedMedicalPermissions
-
     /**
      * [AdditionalPermission]s that have been granted locally via a toggle, but not yet requested
      */
@@ -105,53 +164,38 @@
         get() = _grantedAdditionalPermissions
 
     /** Used to control the enabled state of the Allow all switch */
-    private val _allFitnessPermissionsGranted =
-        MediatorLiveData(false).apply {
-            addSource(_fitnessPermissionsList) {
-                postValue(
-                    areAllPermissionsGranted(fitnessPermissionsList, grantedFitnessPermissions))
-            }
-            addSource(_grantedFitnessPermissions) {
-                postValue(
-                    areAllPermissionsGranted(fitnessPermissionsList, grantedFitnessPermissions))
-            }
-        }
-    val allFitnessPermissionsGranted: LiveData<Boolean>
-        get() = _allFitnessPermissionsGranted
-
-    /** Used to control the enabled state of the Allow all switch */
     private val _allMedicalPermissionsGranted =
         MediatorLiveData(false).apply {
             addSource(_medicalPermissionsList) {
                 postValue(
-                    areAllPermissionsGranted(medicalPermissionsList, grantedMedicalPermissions))
+                    areAllPermissionsGranted(_medicalPermissionsList, grantedMedicalPermissions)
+                )
             }
             addSource(_grantedFitnessPermissions) {
                 postValue(
-                    areAllPermissionsGranted(medicalPermissionsList, grantedMedicalPermissions))
+                    areAllPermissionsGranted(_medicalPermissionsList, grantedMedicalPermissions)
+                )
             }
         }
     val allMedicalPermissionsGranted: LiveData<Boolean>
         get() = _allMedicalPermissionsGranted
 
-    /**
-     * MediatorLiveData to hold the caller app info and the requested additional permissions needed
-     * for the [AdditionalPermissionsRequestFragment]
-     */
-    private val _additionalPermissionsInfo =
-        MediatorLiveData<AdditionalPermissionsInfo>().apply {
-            addSource(_additionalPermissionsList) { additionalPermissionsList ->
-                this.postValue(
-                    AdditionalPermissionsInfo(additionalPermissionsList, _appMetaData.value))
+    /** Used to control the enabled state of the Allow all switch */
+    private val _allFitnessPermissionsGranted =
+        MediatorLiveData(false).apply {
+            addSource(_fitnessPermissionsList) {
+                postValue(
+                    areAllPermissionsGranted(_fitnessPermissionsList, grantedFitnessPermissions)
+                )
             }
-            addSource(_appMetaData) { appMetadata ->
-                this.postValue(
-                    AdditionalPermissionsInfo(_additionalPermissionsList.value, appMetadata))
+            addSource(_grantedFitnessPermissions) {
+                postValue(
+                    areAllPermissionsGranted(_fitnessPermissionsList, grantedFitnessPermissions)
+                )
             }
         }
-
-    val additionalPermissionsInfo: LiveData<AdditionalPermissionsInfo>
-        get() = _additionalPermissionsInfo
+    val allFitnessPermissionsGranted: LiveData<Boolean>
+        get() = _allFitnessPermissionsGranted
 
     /** Retains the originally requested permissions and their state. */
     private var requestedPermissions: MutableMap<HealthPermission, PermissionState> = mutableMapOf()
@@ -162,15 +206,6 @@
      */
     private var grants: MutableMap<HealthPermission, PermissionState> = mutableMapOf()
 
-    /** Indicates whether the fitness data type request has been concluded. */
-    private var fitnessPermissionsConcluded = false
-
-    fun isFitnessPermissionRequestConcluded(): Boolean = fitnessPermissionsConcluded
-
-    fun setFitnessPermissionRequestConcluded(boolean: Boolean) {
-        fitnessPermissionsConcluded = boolean
-    }
-
     /** Indicates whether the medical data type request has been concluded. */
     private var medicalPermissionsConcluded = false
 
@@ -180,6 +215,15 @@
         medicalPermissionsConcluded = boolean
     }
 
+    /** Indicates whether the fitness data type request has been concluded. */
+    private var fitnessPermissionsConcluded = false
+
+    fun isFitnessPermissionRequestConcluded(): Boolean = fitnessPermissionsConcluded
+
+    fun setFitnessPermissionRequestConcluded(boolean: Boolean) {
+        fitnessPermissionsConcluded = boolean
+    }
+
     /**
      * If no read permissions granted, the AdditionalPermissions request screen will not be shown
      */
@@ -187,14 +231,24 @@
 
     fun isAnyReadPermissionGranted(): Boolean = anyReadPermissionsGranted
 
+    private var anyFitnessReadPermissionsGranted: Boolean = false
+
+    private var anyMedicalReadPermissionsGranted: Boolean = false
+
     /** Whether to modify the historic access text on the [FitnessPermissionsFragment] */
     private var historyAccessGranted: Boolean = false
 
     fun isHistoryAccessGranted(): Boolean = historyAccessGranted
 
-    fun loadAccessDate(packageName: String) = loadAccessDateUseCase.invoke(packageName)
+    private fun loadAccessDate(packageName: String) = loadAccessDateUseCase.invoke(packageName)
+
+    private var initialRequestedPermissions: Array<out String> = arrayOf()
+    private lateinit var packageName: String
+    private var anyMedicalPermissionsDeclared: Boolean = false
 
     fun init(packageName: String, permissions: Array<out String>) {
+        initialRequestedPermissions = permissions
+        this.packageName = packageName
         loadAppInfo(packageName)
         loadPermissions(packageName, permissions)
     }
@@ -216,29 +270,34 @@
 
     /** Returns true if any of the requested permissions is USER_FIXED, false otherwise. */
     fun isAnyPermissionUserFixed(packageName: String, permissions: Array<out String>): Boolean {
-        return getHealthPermissionsFlagsUseCase.invoke(packageName, permissions.toList()).any {
-            (_, flags) ->
-            flags.and(PackageManager.FLAG_PERMISSION_USER_FIXED) != 0
+        val declaredPermissions = loadDeclaredHealthPermissionUseCase.invoke(packageName)
+        val validPermissions = permissions.filter { declaredPermissions.contains(it) }
+        val permissionFlags =
+            getHealthPermissionsFlagsUseCase.invoke(packageName, validPermissions.toList())
+        val userFixedPermissions =
+            permissionFlags
+                .filter { (_, flags) -> flags.and(PackageManager.FLAG_PERMISSION_USER_FIXED) != 0 }
+                .keys
+                .toList()
+        if (userFixedPermissions.isNotEmpty()) {
+            Log.e(TAG, "Permissions are user-fixed: $userFixedPermissions")
+            return true
         }
+        return false
     }
 
     /** Mark a permission as locally granted */
     fun updateHealthPermission(permission: HealthPermission, grant: Boolean) {
-        if (permission is FitnessPermission) {
-            updateFitnessPermission(permission, grant)
-        } else if (permission is MedicalPermission) {
-            updateMedicalPermission(permission, grant)
-        } else if (permission is AdditionalPermission) {
-            updateAdditionalPermission(permission, grant)
-        }
-    }
-
-    /** Mark all [FitnessPermission]s as locally granted */
-    fun updateFitnessPermissions(grant: Boolean) {
-        if (grant) {
-            _grantedFitnessPermissions.setValue(_fitnessPermissionsList.value.orEmpty().toSet())
-        } else {
-            _grantedFitnessPermissions.setValue(emptySet())
+        when (permission) {
+            is FitnessPermission -> {
+                updateFitnessPermission(permission, grant)
+            }
+            is MedicalPermission -> {
+                updateMedicalPermission(permission, grant)
+            }
+            is AdditionalPermission -> {
+                updateAdditionalPermission(permission, grant)
+            }
         }
     }
 
@@ -251,6 +310,15 @@
         }
     }
 
+    /** Mark all [FitnessPermission]s as locally granted */
+    fun updateFitnessPermissions(grant: Boolean) {
+        if (grant) {
+            _grantedFitnessPermissions.setValue(_fitnessPermissionsList.value.orEmpty().toSet())
+        } else {
+            _grantedFitnessPermissions.setValue(emptySet())
+        }
+    }
+
     /** Mark all [AdditionalPermission]s as locally granted */
     fun updateAdditionalPermissions(grant: Boolean) {
         if (grant) {
@@ -260,15 +328,6 @@
         }
     }
 
-    /** Grants/Revokes all the [FitnessPermission]s sent by the caller. */
-    fun requestFitnessPermissions(packageName: String) {
-        requestedPermissions
-            .filterKeys { it is FitnessPermission }
-            .forEach { (permission, permissionState) ->
-                internalGrantOrRevokePermission(packageName, permission, permissionState)
-            }
-    }
-
     /** Grants/Revokes all the [MedicalPermission]s sent by the caller. */
     fun requestMedicalPermissions(packageName: String) {
         requestedPermissions
@@ -276,6 +335,17 @@
             .forEach { (permission, permissionState) ->
                 internalGrantOrRevokePermission(packageName, permission, permissionState)
             }
+        reloadPermissions()
+    }
+
+    /** Grants/Revokes all the [FitnessPermission]s sent by the caller. */
+    fun requestFitnessPermissions(packageName: String) {
+        requestedPermissions
+            .filterKeys { it is FitnessPermission }
+            .forEach { (permission, permissionState) ->
+                internalGrantOrRevokePermission(packageName, permission, permissionState)
+            }
+        reloadPermissions()
     }
 
     /** Grants/Revokes all the [AdditionalPermission]s sent by the caller. */
@@ -296,6 +366,18 @@
     }
 
     /**
+     * Updates the internal grants map without granting or revoking permissions. This is used when
+     * the request permissions screen is not shown because a permission is USER_FIXED or no valid
+     * permissions are requested. In that case, we don't want to revoke other permissions, e.g.
+     * Exercise Routes, because the user hasn't specifically fixed them.
+     */
+    fun updatePermissionGrants() {
+        requestedPermissions.forEach { (permission, permissionState) ->
+            updateGrants(permission, permissionState)
+        }
+    }
+
+    /**
      * Returns a map of all [HealthPermission]s that have been requested by the caller and their
      * current grant state. A permission may be granted if it was already granted when the request
      * was made, or if it was granted during this permission request. Similarly for not granted
@@ -309,7 +391,7 @@
 
     private fun <T> areAllPermissionsGranted(
         permissionsListLiveData: LiveData<List<T>>,
-        grantedPermissionsLiveData: LiveData<Set<T>>
+        grantedPermissionsLiveData: LiveData<Set<T>>,
     ): Boolean {
         val permissionsList = permissionsListLiveData.value.orEmpty()
         val grantedPermissions = grantedPermissionsLiveData.value.orEmpty()
@@ -320,33 +402,33 @@
         }
     }
 
-    private fun isDataTypeReadPermission(permission: String): Boolean {
-        val healthPermission = HealthPermission.fromPermissionString(permission)
-        return ((healthPermission is FitnessPermission) &&
-            healthPermission.permissionsAccessType == PermissionsAccessType.READ)
-    }
-
     private fun isHistoryReadPermission(permission: String): Boolean {
         return permission == HealthPermissions.READ_HEALTH_DATA_HISTORY
     }
 
+    /** Reloads permissions after one type of permissions have been granted in a flow */
+    private fun reloadPermissions() {
+        loadPermissions(packageName, initialRequestedPermissions)
+    }
+
     private fun loadPermissions(packageName: String, permissions: Array<out String>) {
         val grantedPermissions = getGrantedHealthPermissionsUseCase.invoke(packageName)
 
+        anyFitnessReadPermissionsGranted = grantedPermissions.any { isFitnessReadPermission(it) }
+        anyMedicalReadPermissionsGranted = grantedPermissions.any { isMedicalReadPermission(it) }
+
         anyReadPermissionsGranted =
-            grantedPermissions.any { permission -> isDataTypeReadPermission(permission) }
+            anyFitnessReadPermissionsGranted || anyMedicalReadPermissionsGranted
+
         historyAccessGranted =
             grantedPermissions.any { permission -> isHistoryReadPermission(permission) }
-        val declaredPermissions = healthPermissionReader.getDeclaredHealthPermissions(packageName)
+        val validPermissions = loadDeclaredHealthPermissionUseCase.invoke(packageName)
+        anyMedicalPermissionsDeclared = validPermissions.any { isMedicalPermission(it) }
 
         val filteredPermissions =
             permissions
-                // Do not show hidden permissions
-                .filterNot { permission -> healthPermissionReader.shouldHidePermission(permission) }
-                // Do not show undeclared permissions
-                .filter { permission -> declaredPermissions.contains(permission) }
-                // Filter invalid health permissions
-                // This will also transform each permission into DataType or Medical or Additional
+                // Do not show undeclared or invalid permissions
+                .filter { permission -> validPermissions.contains(permission) }
                 .mapNotNull { permissionString ->
                     try {
                         HealthPermission.fromPermissionString(permissionString)
@@ -359,44 +441,171 @@
                 .onEach { permission -> addToRequestedPermissions(grantedPermissions, permission) }
                 // Finally, filter out the granted permissions
                 .filterNot { permission -> grantedPermissions.contains(permission.toString()) }
+                .toMutableList()
 
-        val dataTypeNotGrantedPermissions =
-            filteredPermissions
-                .filter { permission ->
-                    healthPermissionReader.isFitnessPermission(permission.toString())
-                }
-                .map { permission -> permission as FitnessPermission }
+        val fitnessNotGrantedPermissions =
+            if (isFitnessPermissionRequestConcluded()) emptyList()
+            else
+                filteredPermissions
+                    .filter { permission -> isFitnessPermission(permission.toString()) }
+                    .map { permission -> permission as FitnessPermission }
 
         val medicalNotGrantedPermissions =
-            filteredPermissions
-                .filter { permission ->
-                    healthPermissionReader.isMedicalPermission(permission.toString())
-                }
-                .map { permission -> permission as MedicalPermission }
+            if (isMedicalPermissionRequestConcluded()) emptyList()
+            else
+                filteredPermissions
+                    .filter { permission -> isMedicalPermission(permission.toString()) }
+                    .map { permission -> permission as MedicalPermission }
 
         val additionalNotGrantedPermissions =
             filteredPermissions
-                .filter { permission ->
-                    healthPermissionReader.isAdditionalPermission(permission.toString())
-                }
+                .filter { permission -> isAdditionalPermission(permission.toString()) }
                 .filterNot { permission ->
                     permission.toString() == HealthPermissions.READ_EXERCISE_ROUTES
                 }
                 .map { permission -> permission as AdditionalPermission }
+                // Filter out additional permissions if the correct read permissions were not
+                // granted
+                .filterNot { permission ->
+                    !anyFitnessReadPermissionsGranted &&
+                        permission == AdditionalPermission.READ_HEALTH_DATA_HISTORY
+                }
+                .filterNot { permission ->
+                    !anyReadPermissionsGranted &&
+                        permission == AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND
+                }
 
-        _fitnessPermissionsList.value = dataTypeNotGrantedPermissions
+        _fitnessPermissionsList.value = fitnessNotGrantedPermissions
         _medicalPermissionsList.value = medicalNotGrantedPermissions
         _additionalPermissionsList.value = additionalNotGrantedPermissions
         _healthPermissionsList.value =
-            dataTypeNotGrantedPermissions +
+            fitnessNotGrantedPermissions +
                 medicalNotGrantedPermissions +
                 additionalNotGrantedPermissions
+
+        val anyMedicalRequested = medicalNotGrantedPermissions.isNotEmpty()
+        val anyFitnessRequested = fitnessNotGrantedPermissions.isNotEmpty()
+        val anyAdditionalRequested = additionalNotGrantedPermissions.isNotEmpty()
+
+        val permissionsActivityState =
+            if (anyMedicalRequested) {
+                val isMedicalOnlyWrite =
+                    medicalNotGrantedPermissions.size == 1 &&
+                        medicalNotGrantedPermissions.contains(
+                            MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
+                        )
+                PermissionsActivityState.ShowMedical(isMedicalOnlyWrite)
+            } else if (anyFitnessRequested) {
+                PermissionsActivityState.ShowFitness
+            } else if (anyAdditionalRequested) {
+                PermissionsActivityState.ShowAdditional(additionalNotGrantedPermissions.size == 1)
+            } else {
+                PermissionsActivityState.NoPermissions
+            }
+        _permissionsActivityState.value = permissionsActivityState
+    }
+
+    private fun getMedicalScreenState(
+        appMetadata: AppMetadata?,
+        medicalPermissions: List<MedicalPermission>,
+    ): MedicalScreenState {
+        val containsReadMedical = medicalPermissions.any { isMedicalReadPermission(it) }
+        val containsWriteMedical = medicalPermissions.any { isMedicalWritePermission(it) }
+        val isMedicalOnlyWrite = medicalPermissions.size == 1 && containsWriteMedical
+        if (appMetadata == null) {
+            return MedicalScreenState.NoMedicalData
+        }
+
+        return if (isMedicalOnlyWrite) {
+            MedicalScreenState.ShowMedicalWrite(appMetadata, medicalPermissions)
+        } else if (containsReadMedical && containsWriteMedical) {
+            MedicalScreenState.ShowMedicalReadWrite(appMetadata, medicalPermissions)
+        } else if (containsReadMedical) {
+            MedicalScreenState.ShowMedicalRead(appMetadata, medicalPermissions)
+        } else {
+            MedicalScreenState.NoMedicalData
+        }
+    }
+
+    private fun getFitnessScreenState(
+        appMetadata: AppMetadata?,
+        healthPermissions: List<HealthPermission>,
+    ): FitnessScreenState {
+        if (appMetadata == null) {
+            return FitnessScreenState.NoFitnessData
+        }
+
+        val containsFitnessRead = healthPermissions.any { isFitnessReadPermission(it) }
+        val containsFitnessWrite = healthPermissions.any { isFitnessWritePermission(it) }
+        val fitnessPermissions = healthPermissions.filterIsInstance<FitnessPermission>()
+        return if (containsFitnessRead && containsFitnessWrite) {
+            FitnessScreenState.ShowFitnessReadWrite(
+                hasMedical = anyMedicalPermissionsDeclared,
+                appMetadata = appMetadata,
+                fitnessPermissions = fitnessPermissions,
+                historyGranted = historyAccessGranted,
+            )
+        } else if (containsFitnessRead) {
+            FitnessScreenState.ShowFitnessRead(
+                hasMedical = anyMedicalPermissionsDeclared,
+                appMetadata = appMetadata,
+                fitnessPermissions = fitnessPermissions,
+                historyGranted = historyAccessGranted,
+            )
+        } else if (containsFitnessWrite) {
+            FitnessScreenState.ShowFitnessWrite(
+                hasMedical = anyMedicalPermissionsDeclared,
+                appMetadata = appMetadata,
+                fitnessPermissions = fitnessPermissions,
+            )
+        } else {
+            FitnessScreenState.NoFitnessData
+        }
+    }
+
+    private fun getAdditionalScreenState(
+        appMetadata: AppMetadata?,
+        additionalPermissions: List<AdditionalPermission>,
+    ): AdditionalScreenState {
+        if (appMetadata == null) {
+            return AdditionalScreenState.NoAdditionalData
+        }
+
+        val containsBackground = additionalPermissions.any { it.isBackgroundReadPermission() }
+        val containsHistory = additionalPermissions.any { it.isHistoryReadPermission() }
+        val dataAccessDate = loadAccessDate(packageName)
+
+        return if (containsBackground && containsHistory) {
+            AdditionalScreenState.ShowCombined(
+                hasMedical = anyMedicalPermissionsDeclared,
+                appMetadata = appMetadata,
+                isMedicalReadGranted = anyMedicalReadPermissionsGranted,
+                isFitnessReadGranted = anyFitnessReadPermissionsGranted,
+                dataAccessDate = dataAccessDate,
+            )
+        } else if (containsBackground) {
+            AdditionalScreenState.ShowBackground(
+                hasMedical = anyMedicalPermissionsDeclared,
+                appMetadata = appMetadata,
+                isMedicalReadGranted = anyMedicalReadPermissionsGranted,
+                isFitnessReadGranted = anyFitnessReadPermissionsGranted,
+            )
+        } else if (containsHistory) {
+            AdditionalScreenState.ShowHistory(
+                hasMedical = anyMedicalPermissionsDeclared,
+                appMetadata = appMetadata,
+                isMedicalReadGranted = anyMedicalReadPermissionsGranted,
+                dataAccessDate = dataAccessDate,
+            )
+        } else {
+            AdditionalScreenState.NoAdditionalData
+        }
     }
 
     /** Adds a permission to the [requestedPermissions] map with its original granted state */
     private fun addToRequestedPermissions(
         grantedPermissions: List<String>,
-        permission: HealthPermission
+        permission: HealthPermission,
     ) {
         val isPermissionGranted = grantedPermissions.contains(permission.toString())
         if (isPermissionGranted) {
@@ -442,10 +651,23 @@
         viewModelScope.launch { _appMetaData.postValue(appInfoReader.getAppMetadata(packageName)) }
     }
 
+    /** Updates grants without granting or revoking permissions. */
+    private fun updateGrants(permission: HealthPermission, permissionState: PermissionState) {
+        val granted =
+            isPermissionLocallyGranted(permission) || permissionState == PermissionState.GRANTED
+
+        if (granted) {
+            grants[permission] = PermissionState.GRANTED
+        } else {
+            grants[permission] = PermissionState.NOT_GRANTED
+        }
+    }
+
+    /** Grants or revokes permissions according to the state in the internal [grants] variable. */
     private fun internalGrantOrRevokePermission(
         packageName: String,
         permission: HealthPermission,
-        permissionState: PermissionState
+        permissionState: PermissionState,
     ) {
         val granted =
             isPermissionLocallyGranted(permission) || permissionState == PermissionState.GRANTED
@@ -466,7 +688,93 @@
     }
 }
 
-data class AdditionalPermissionsInfo(
-    val additionalPermissions: List<AdditionalPermission>?,
-    val appInfo: AppMetadata?
-)
+/** Represents a UI state for the [PermissionsActivity] */
+sealed class PermissionsActivityState {
+    data class ShowMedical(val isWriteOnly: Boolean) : PermissionsActivityState()
+
+    data object ShowFitness : PermissionsActivityState()
+
+    data class ShowAdditional(val singlePermission: Boolean) : PermissionsActivityState()
+
+    data object NoPermissions : PermissionsActivityState()
+}
+
+/**
+ * Represents a UI state for the [MedicalPermissionsFragment] and [MedicalWritePermissionFragment]
+ */
+sealed class MedicalScreenState : RequestPermissionsScreenState() {
+    data object NoMedicalData : MedicalScreenState()
+
+    data class ShowMedicalWrite(
+        val appMetadata: AppMetadata,
+        val medicalPermissions: List<MedicalPermission>,
+    ) : MedicalScreenState()
+
+    data class ShowMedicalRead(
+        val appMetadata: AppMetadata,
+        val medicalPermissions: List<MedicalPermission>,
+    ) : MedicalScreenState()
+
+    data class ShowMedicalReadWrite(
+        val appMetadata: AppMetadata,
+        val medicalPermissions: List<MedicalPermission>,
+    ) : MedicalScreenState()
+}
+
+/** Represents a UI state for the [FitnessPermissionsFragment] */
+sealed class FitnessScreenState(open val hasMedical: Boolean) : RequestPermissionsScreenState() {
+    data object NoFitnessData : FitnessScreenState(hasMedical = false)
+
+    data class ShowFitnessRead(
+        override val hasMedical: Boolean,
+        val appMetadata: AppMetadata,
+        val fitnessPermissions: List<FitnessPermission>,
+        val historyGranted: Boolean,
+    ) : FitnessScreenState(hasMedical)
+
+    data class ShowFitnessWrite(
+        override val hasMedical: Boolean,
+        val appMetadata: AppMetadata,
+        val fitnessPermissions: List<FitnessPermission>,
+    ) : FitnessScreenState(hasMedical)
+
+    data class ShowFitnessReadWrite(
+        override val hasMedical: Boolean,
+        val appMetadata: AppMetadata,
+        val fitnessPermissions: List<FitnessPermission>,
+        val historyGranted: Boolean,
+    ) : FitnessScreenState(hasMedical)
+}
+
+/**
+ * Represents a UI state for the [SingleAdditionalPermissionFragment] and
+ * [CombinedAdditionalPermissionsFragment]
+ */
+sealed class AdditionalScreenState(open val hasMedical: Boolean) : RequestPermissionsScreenState() {
+    data object NoAdditionalData : AdditionalScreenState(hasMedical = false)
+
+    data class ShowHistory(
+        override val hasMedical: Boolean,
+        val appMetadata: AppMetadata,
+        val isMedicalReadGranted: Boolean,
+        val dataAccessDate: Instant?,
+    ) : AdditionalScreenState(hasMedical)
+
+    data class ShowBackground(
+        override val hasMedical: Boolean,
+        val appMetadata: AppMetadata,
+        val isMedicalReadGranted: Boolean,
+        val isFitnessReadGranted: Boolean,
+    ) : AdditionalScreenState(hasMedical)
+
+    data class ShowCombined(
+        override val hasMedical: Boolean,
+        val appMetadata: AppMetadata,
+        val isMedicalReadGranted: Boolean,
+        val isFitnessReadGranted: Boolean,
+        val dataAccessDate: Instant?,
+    ) : AdditionalScreenState(hasMedical)
+}
+
+/** Parent class for permission-related screen states */
+open class RequestPermissionsScreenState
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/SingleAdditionalPermissionFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/request/SingleAdditionalPermissionFragment.kt
new file mode 100644
index 0000000..ebede51
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/SingleAdditionalPermissionFragment.kt
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.request
+
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.activityViewModels
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.utils.DeviceInfoUtils
+import com.android.healthconnect.controller.utils.logging.ElementName
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthconnect.controller.utils.logging.RequestCombinedAdditionalPermissionsElement
+import com.android.healthconnect.controller.utils.pref
+import com.android.settingslib.widget.FooterPreference
+import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
+
+@AndroidEntryPoint(PermissionsFragment::class)
+class SingleAdditionalPermissionFragment : Hilt_SingleAdditionalPermissionFragment() {
+
+    companion object {
+        private const val HEADER = "request_permissions_header"
+        private const val FOOTER = "request_permissions_footer"
+    }
+
+    private val viewModel: RequestPermissionViewModel by activityViewModels()
+
+    private val header: RequestPermissionHeaderPreference by pref(HEADER)
+    private val footer: FooterPreference by pref(FOOTER)
+    @Inject lateinit var logger: HealthConnectLogger
+
+    private var allowButtonName: ElementName =
+        RequestCombinedAdditionalPermissionsElement.ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
+    private var dontAllowButtonName: ElementName =
+        RequestCombinedAdditionalPermissionsElement.CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
+    @Inject lateinit var deviceInfoUtils: DeviceInfoUtils
+
+    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+        setPreferencesFromResource(R.xml.additional_permissions_screen, rootKey)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        viewModel.additionalScreenState.observe(viewLifecycleOwner) { screenState ->
+            when (screenState) {
+                is AdditionalScreenState.NoAdditionalData -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .remove(this)
+                        .commit()
+                }
+                is AdditionalScreenState.ShowCombined -> {
+                    requireActivity()
+                        .supportFragmentManager
+                        .beginTransaction()
+                        .replace(R.id.permission_content, CombinedAdditionalPermissionsFragment())
+                        .commit()
+                }
+                is AdditionalScreenState.ShowHistory -> {
+                    setupHistoryScreen(screenState)
+                    this.setPageName(PageName.REQUEST_HISTORY_READ_PERMISSION_PAGE)
+                }
+                is AdditionalScreenState.ShowBackground -> {
+                    setupBackgroundScreen(screenState)
+                    this.setPageName(PageName.REQUEST_BACKGROUND_READ_PERMISSION_PAGE)
+                }
+            }
+        }
+    }
+
+    private fun setupHistoryScreen(screenState: AdditionalScreenState.ShowHistory) {
+        header.bind(screenState.appMetadata.appName, screenState)
+
+        setupAllowButton()
+        setupDontAllowButton()
+        maybeShowFooter(screenState.isMedicalReadGranted, screenState.appMetadata.appName)
+    }
+
+    private fun maybeShowFooter(isMedicalReadGranted: Boolean, appName: String) {
+        if (!isMedicalReadGranted) {
+            footer.isVisible = false
+            return
+        }
+
+        footer.isVisible = true
+        footer.title = getString(R.string.history_read_medical_combined_request_footer, appName)
+        footer.setLearnMoreText(
+            getString(R.string.history_read_medical_combined_request_footer_link)
+        )
+        footer.setLearnMoreAction { deviceInfoUtils.openHCGetStartedLink(requireActivity()) }
+    }
+
+    private fun setupBackgroundScreen(screenState: AdditionalScreenState.ShowBackground) {
+        header.bind(screenState.appMetadata.appName, screenState)
+
+        setupAllowButton()
+        setupDontAllowButton()
+    }
+
+    private fun setupAllowButton() {
+        logger.logImpression(allowButtonName)
+        getAllowButton().isEnabled = true
+
+        getAllowButton().setOnClickListener {
+            logger.logInteraction(allowButtonName)
+            viewModel.updateAdditionalPermissions(true)
+            viewModel.requestAdditionalPermissions(getPackageNameExtra())
+            handlePermissionResults(viewModel.getPermissionGrants())
+        }
+    }
+
+    private fun setupDontAllowButton() {
+        logger.logImpression(dontAllowButtonName)
+
+        getDontAllowButton().setOnClickListener {
+            logger.logInteraction(dontAllowButtonName)
+            viewModel.updateAdditionalPermissions(false)
+            viewModel.requestAdditionalPermissions(this.getPackageNameExtra())
+            handlePermissionResults(viewModel.getPermissionGrants())
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearGrantPermissionsActivity.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearGrantPermissionsActivity.kt
new file mode 100644
index 0000000..aa808c1
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearGrantPermissionsActivity.kt
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear
+
+import android.content.Intent
+import android.content.Intent.EXTRA_PACKAGE_NAME
+import android.content.pm.PackageManager
+import android.content.pm.PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES
+import android.content.pm.PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS
+import android.health.connect.HealthPermissions
+import android.os.Bundle
+import android.util.Log
+import android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
+import androidx.activity.ComponentActivity
+import androidx.activity.viewModels
+import androidx.compose.ui.platform.ComposeView
+import com.android.healthconnect.controller.permissions.data.PermissionState
+import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
+import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthfitness.flags.Flags
+import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
+
+/** Wear Grant Permissions activity for Health Connect. */
+@AndroidEntryPoint(ComponentActivity::class)
+class WearGrantPermissionsActivity : Hilt_WearGrantPermissionsActivity() {
+
+    companion object {
+        private const val TAG = "WearGrantPermissionsActivity"
+    }
+
+    private val requestPermissionsViewModel: RequestPermissionViewModel by viewModels()
+    @Inject lateinit var healthPermissionReader: HealthPermissionReader
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        if (
+            !getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH) ||
+                !Flags.replaceBodySensorPermissionEnabled()
+        ) {
+            Log.e(
+                TAG,
+                "Health connect is not available on watch, activity should not have been started, " +
+                    "finishing!",
+            )
+            return
+        }
+
+        // This flag ensures a non system app cannot show an overlay on Health Connect. b/313425281
+        window.addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
+
+        // Load permissions for this package.
+        val packageName = getPackageNameExtra()
+        val rawPermissionStrings = getPermissionStrings()
+        // Only allow requests for system health permissions and background permission.
+        val allowedPermissionsToRequest =
+            healthPermissionReader.getSystemHealthPermissions().toMutableList().also {
+                it.add(HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND)
+            }
+        val permissionStrings =
+            rawPermissionStrings.intersect(allowedPermissionsToRequest.toSet()).toTypedArray()
+        requestPermissionsViewModel.init(packageName, permissionStrings)
+
+        // Dismiss this request if any permission is USER_FIXED.
+        if (requestPermissionsViewModel.isAnyPermissionUserFixed(packageName, permissionStrings)) {
+            handlePermissionResults()
+            finish()
+            return
+        }
+
+        // Launch composable UI.
+        val root = ComposeView(this)
+        root.setContent {
+            WearGrantPermissionsScreen(requestPermissionsViewModel) {
+                requestPermissionsViewModel.requestHealthPermissions(packageName)
+                handlePermissionResults()
+                finish()
+            }
+        }
+        setContentView(root)
+    }
+
+    // TODO: b/376845793 - Reuse handlePermissionResults code in phone and wear, potentially move
+    // this method to RequestPermissionViewModel.
+    private fun handlePermissionResults(resultCode: Int = RESULT_OK) {
+        val results = requestPermissionsViewModel.getPermissionGrants()
+        val grants = mutableListOf<Int>()
+        val permissionStrings = mutableListOf<String>()
+
+        for ((permission, state) in results) {
+            if (state == PermissionState.GRANTED) {
+                grants.add(PackageManager.PERMISSION_GRANTED)
+            } else {
+                grants.add(PackageManager.PERMISSION_DENIED)
+            }
+
+            permissionStrings.add(permission.toString())
+        }
+
+        val result = Intent()
+        result.putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES, permissionStrings.toTypedArray())
+        result.putExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS, grants.toIntArray())
+        setResult(resultCode, result)
+        finish()
+    }
+
+    private fun getPermissionStrings(): Array<out String> {
+        return intent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES).orEmpty()
+    }
+
+    private fun getPackageNameExtra(): String {
+        return intent.getStringExtra(EXTRA_PACKAGE_NAME).orEmpty()
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearGrantPermissionsScreen.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearGrantPermissionsScreen.kt
new file mode 100644
index 0000000..1978575
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearGrantPermissionsScreen.kt
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.permissions.request.wear
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.State
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.foundation.expandableButton
+import androidx.wear.compose.foundation.expandableItems
+import androidx.wear.compose.foundation.rememberExpandableState
+import androidx.wear.compose.material.ChipDefaults
+import androidx.wear.compose.material.CompactChip
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material3.SwitchButton
+import androidx.wear.compose.material3.Text
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionStrings
+import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
+import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
+import com.android.healthconnect.controller.permissions.request.wear.elements.Chip
+import com.android.healthconnect.controller.permissions.request.wear.elements.ScrollableScreen
+import com.android.healthconnect.controller.shared.app.AppMetadata
+
+/**
+ * Wear Grant Permissions Screen. This screen includes: grant single health permission, grant
+ * multiple health permission, grant background health permission.
+ *
+ * TODO: b/376514553 - Write tests for Wear UI.
+ */
+@Composable
+fun WearGrantPermissionsScreen(viewModel: RequestPermissionViewModel, onButtonClicked: () -> Unit) {
+  val appMetadata: State<AppMetadata?> = viewModel.appMetadata.observeAsState(null)
+  val appName = appMetadata.value?.appName ?: ""
+  val fitnessPermissions = viewModel.fitnessPermissionsList.observeAsState(emptyList())
+  val dataTypes =
+    fitnessPermissions.value.map { permission ->
+      stringResource(
+        FitnessPermissionStrings.fromPermissionType(permission.fitnessPermissionType).uppercaseLabel
+      )
+    }
+  val additionalPermissions = viewModel.additionalPermissionsList.observeAsState(emptyList())
+  val backgroundPermission = additionalPermissions.value.filter { it.isBackgroundReadPermission() }
+
+  if (dataTypes.size > 1) {
+    GrantMultipleFitnessPermissions(
+      fitnessPermissions,
+      appName,
+      dataTypes,
+      onButtonClicked,
+      viewModel,
+    )
+  } else if (dataTypes.size == 1) {
+    GrantSingleFitnessPermission(appName, dataTypes[0], onButtonClicked, viewModel)
+  } else if (dataTypes.size == 0 && !backgroundPermission.isEmpty()) {
+    GrantReadBackgroundHealthPermission(appName, onButtonClicked, viewModel)
+  }
+}
+
+@Composable
+fun GrantMultipleFitnessPermissions(
+  fitnessPermissions: State<List<FitnessPermission>>,
+  appName: String,
+  dataTypes: List<String>,
+  onButtonClicked: () -> Unit,
+  viewModel: RequestPermissionViewModel,
+) {
+  val res = LocalContext.current.resources
+  // Represents whether user has toggled-on a granular data type permission, by default toggled.
+  val checkedStates =
+    remember(fitnessPermissions.value) { // Recalculate when fitness permissions change.
+      mutableStateListOf(*(fitnessPermissions.value).map { true }.toTypedArray())
+    }
+  val expandableState = rememberExpandableState()
+
+  ScrollableScreen(
+    showTimeText = false,
+    title = res.getString(R.string.wear_allow_app_access_fitness_and_wellness_data, appName),
+    subtitle =
+    res.getString(
+      R.string.wear_request_multiple_data_type_permissions,
+      appName,
+      dataTypes.joinToString(", "),
+    ),
+  ) {
+    // Granular health data types. By default hidden, will show up once user clicks expand button.
+    expandableItems(expandableState, dataTypes.size) { index ->
+      val dataType = dataTypes[index]
+      val isChecked = checkedStates[index]
+      Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
+        SwitchButton(
+          label = { Text(dataType, maxLines = 3, overflow = TextOverflow.Ellipsis) },
+          checked = isChecked,
+          onCheckedChange = { newCheckedValue ->
+            checkedStates[index] = newCheckedValue
+            viewModel.updateHealthPermission(
+              fitnessPermissions.value[index],
+              newCheckedValue as Boolean,
+            )
+          },
+          enabled = true,
+        )
+      }
+    }
+    // Buttons.
+    // Allow all / Allow selected button.
+    item {
+      Chip(
+        label =
+        if (expandableState.expanded) {
+            res.getString(R.string.request_permissions_allow_selected)
+        } else {
+            res.getString(R.string.request_permissions_allow_all)
+        },
+        onClick = {
+          if (!expandableState.expanded) {
+            // User hasn't toggle any chip, allow all.
+            viewModel.updateFitnessPermissions(true)
+          }
+          onButtonClicked()
+        },
+        modifier = Modifier.fillMaxWidth(),
+        labelMaxLines = Integer.MAX_VALUE,
+      )
+    }
+    // Deny all button.
+    item {
+      Chip(
+        label = res.getString(R.string.request_permissions_deny_all),
+        onClick = {
+          checkedStates.fill(false)
+          viewModel.updateFitnessPermissions(false)
+          onButtonClicked()
+        },
+        modifier = Modifier.fillMaxWidth(),
+        labelMaxLines = Integer.MAX_VALUE,
+      )
+    }
+    // Expand granular control button. User clicks this to control each data type individually.
+    expandableButton(expandableState) {
+      CompactChip(
+        label = {
+          Row(verticalAlignment = Alignment.CenterVertically) {
+            Icon(
+              painter = painterResource(R.drawable.ic_expand_more_24),
+              contentDescription = "Expand more",
+            )
+          }
+        },
+        onClick = {
+          expandableState.expanded = !expandableState.expanded
+          // By default, all the data types are selected when user clicks expand button.
+          viewModel.updateFitnessPermissions(true)
+        },
+        border = ChipDefaults.chipBorder(),
+        colors = ChipDefaults.chipColors(backgroundColor = Color.Black, contentColor = Color.White),
+        contentPadding = PaddingValues(0.dp), // Remove Chip's default contentPadding
+      )
+    }
+  }
+}
+
+@Composable
+fun GrantSingleFitnessPermission(
+  appName: String,
+  dataType: String,
+  onButtonClicked: () -> Unit,
+  viewModel: RequestPermissionViewModel,
+) {
+  val res = LocalContext.current.resources
+  ScrollableScreen(
+    showTimeText = false,
+    title = res.getString(R.string.wear_request_single_data_type_permission, appName, dataType),
+  ) {
+    // Allow button.
+    item {
+      Chip(
+        label = res.getString(R.string.request_permissions_allow),
+        onClick = {
+          viewModel.updateFitnessPermissions(true)
+          onButtonClicked()
+        },
+        modifier = Modifier.fillMaxWidth(),
+        labelMaxLines = Integer.MAX_VALUE,
+      )
+    }
+    // Deny button.
+    item {
+      Chip(
+        label = res.getString(R.string.request_permissions_dont_allow),
+        onClick = {
+          viewModel.updateFitnessPermissions(false)
+          onButtonClicked()
+        },
+        modifier = Modifier.fillMaxWidth(),
+        labelMaxLines = Integer.MAX_VALUE,
+      )
+    }
+  }
+}
+
+@Composable
+fun GrantReadBackgroundHealthPermission(
+  appName: String,
+  onButtonClicked: () -> Unit,
+  viewModel: RequestPermissionViewModel,
+) {
+  val res = LocalContext.current.resources
+  val grantedAdditionalPermissions =
+    viewModel.grantedAdditionalPermissions.observeAsState(emptySet())
+  // Wait until the grantedAdditionalPermission value has been posted then return to Activity and
+  // handle permission results.
+  LaunchedEffect(grantedAdditionalPermissions.value) {
+    if (
+      HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND in
+      grantedAdditionalPermissions.value
+    ) {
+      onButtonClicked()
+    }
+  }
+
+  ScrollableScreen(
+    showTimeText = false,
+    title = res.getString(R.string.wear_allow_app_access_fitness_and_wellness_data, appName),
+  ) {
+    // Allow all the time button.
+    item {
+      Chip(
+        label = res.getString(R.string.request_permissions_allow_all_the_time),
+        onClick = {
+          viewModel.updateHealthPermission(
+            HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+            true,
+          )
+        },
+        modifier = Modifier.fillMaxWidth(),
+        labelMaxLines = Integer.MAX_VALUE,
+      )
+    }
+    // Allow while in use button. (Deny background read permission.)
+    item {
+      Chip(
+        label = res.getString(R.string.request_permissions_while_using_the_app),
+        onClick = {
+          viewModel.updateHealthPermission(
+            HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+            false,
+          )
+          onButtonClicked()
+        },
+        modifier = Modifier.fillMaxWidth(),
+        labelMaxLines = Integer.MAX_VALUE,
+      )
+    }
+  }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearUtils.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearUtils.kt
new file mode 100644
index 0000000..77d3f36
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/WearUtils.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear
+
+import android.content.Context
+import android.text.format.DateFormat
+import androidx.annotation.IntDef
+import com.android.healthconnect.controller.R
+import java.time.ZonedDateTime
+import java.time.temporal.ChronoUnit
+import java.util.Locale
+
+object WearUtils {
+  @Retention(AnnotationRetention.SOURCE)
+  @IntDef(value = [LAST_24H_TODAY, LAST_24H_YESTERDAY, LAST_7D, NOT_IN_LAST_7D])
+  annotation class AppPermsLastAccessType
+
+  const val LAST_24H_TODAY = 1
+  const val LAST_24H_YESTERDAY = 2
+  const val LAST_7D = 3
+  const val NOT_IN_LAST_7D = 4
+
+  /** Get the preference summary in app permission groups and permission apps screens for Wear. */
+  @JvmStatic
+  fun getPreferenceSummary(context: Context, lastAccessTime: Long?): String {
+    val summaryTimestamp = getPermissionLastAccessSummaryTimestamp(lastAccessTime, context)
+    val res = context.resources
+    return when (summaryTimestamp.second) {
+      LAST_24H_TODAY ->
+        res.getString(R.string.wear_app_perms_24h_access, summaryTimestamp.first)
+      LAST_24H_YESTERDAY ->
+        res.getString(R.string.wear_app_perms_24h_access_yest, summaryTimestamp.first)
+      LAST_7D ->
+        res.getString(
+          R.string.wear_app_perms_7d_access,
+          summaryTimestamp.third,
+          summaryTimestamp.first
+        )
+      else -> ""
+    }
+  }
+
+  @JvmStatic
+  private fun getPermissionLastAccessSummaryTimestamp(
+    lastAccessTime: Long?,
+    context: Context
+  ): Triple<String, Int, String> {
+    val midnightToday =
+      (ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS).toEpochSecond() * 1000L)
+    val midnightYesterday =
+      ZonedDateTime.now().minusDays(1).truncatedTo(ChronoUnit.DAYS).toEpochSecond() * 1000L
+    val isLastAccessToday = (lastAccessTime != null && midnightToday <= lastAccessTime)
+    val isLastAccessTodayOrYesterday =
+      (lastAccessTime != null && midnightYesterday <= lastAccessTime)
+    var lastAccessTimeFormatted = ""
+    var lastAccessDateFormatted = ""
+    @AppPermsLastAccessType var lastAccessType = NOT_IN_LAST_7D
+    if (lastAccessTime != null) {
+      lastAccessTimeFormatted = DateFormat.getTimeFormat(context).format(lastAccessTime)
+      lastAccessDateFormatted = DateFormat.getDateFormat(context).format(lastAccessTime)
+      lastAccessType =
+        if (isLastAccessToday) LAST_24H_TODAY
+        else if (isLastAccessTodayOrYesterday) LAST_24H_YESTERDAY else LAST_7D
+    }
+    return Triple(lastAccessTimeFormatted, lastAccessType, lastAccessDateFormatted)
+  }
+
+  fun String.capitalize(): String = replaceFirstChar {
+    if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
+  }
+}
\ No newline at end of file
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/AlertDialog.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/AlertDialog.kt
new file mode 100644
index 0000000..4cf637d
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/AlertDialog.kt
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Check
+import androidx.compose.material.icons.filled.Close
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.rememberTextMeasurer
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
+import androidx.wear.compose.foundation.lazy.ScalingLazyListState
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.LocalTextStyle
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.dialog.Alert
+import androidx.wear.compose.material.dialog.Dialog
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.ScalingLazyColumnDefaults
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.ScalingLazyColumnState
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.rememberColumnState
+
+/**
+ * This component is an alternative to [AlertContent], providing the following:
+ * - a convenient way of passing a title and a message;
+ * - additional content can be specified between the message and the buttons
+ * - default positive and negative buttons;
+ * - wrapped in a [Dialog];
+ */
+@Composable
+fun AlertDialog(
+    message: String,
+    iconRes: Int? = null,
+    okButtonIcon: Any = Icons.Default.Check,
+    cancelButtonIcon: Any = Icons.Default.Close,
+    onCancelButtonClick: () -> Unit,
+    onOKButtonClick: () -> Unit,
+    showDialog: Boolean,
+    scalingLazyListState: ScalingLazyListState,
+    modifier: Modifier = Modifier,
+    title: String? = null,
+    okButtonContentDescription: String = stringResource(android.R.string.ok),
+    cancelButtonContentDescription: String = stringResource(android.R.string.cancel)
+) {
+    val focusManager = LocalFocusManager.current
+    Dialog(
+        showDialog = showDialog,
+        onDismissRequest = {
+            focusManager.clearFocus()
+            onCancelButtonClick()
+        },
+        scrollState = scalingLazyListState,
+        modifier = modifier
+    ) {
+        AlertContent(
+            title = title,
+            icon = { AlertIcon(iconRes) },
+            message = message,
+            okButtonIcon = okButtonIcon,
+            cancelButtonIcon = cancelButtonIcon,
+            onCancel = onCancelButtonClick,
+            onOk = onOKButtonClick,
+            okButtonContentDescription = okButtonContentDescription,
+            cancelButtonContentDescription = cancelButtonContentDescription
+        )
+    }
+}
+
+/**
+ * This component is an alternative to [Alert], providing the following:
+ * - a convenient way of passing a title and a message;
+ * - default one button;
+ * - wrapped in a [Dialog];
+ */
+@Composable
+fun SingleButtonAlertDialog(
+    message: String,
+    iconRes: Int? = null,
+    okButtonIcon: Any = Icons.Default.Check,
+    onButtonClick: () -> Unit,
+    showDialog: Boolean,
+    scalingLazyListState: ScalingLazyListState,
+    modifier: Modifier = Modifier,
+    title: String? = null,
+    buttonContentDescription: String = stringResource(android.R.string.ok)
+) {
+    Dialog(
+        showDialog = showDialog,
+        onDismissRequest = {},
+        scrollState = scalingLazyListState,
+        modifier = modifier
+    ) {
+        AlertContent(
+            title = title,
+            icon = { AlertIcon(iconRes) },
+            message = message,
+            okButtonIcon = okButtonIcon,
+            onOk = onButtonClick,
+            okButtonContentDescription = buttonContentDescription
+        )
+    }
+}
+
+@Composable
+fun AlertContent(
+    onCancel: (() -> Unit)? = null,
+    onOk: (() -> Unit)? = null,
+    icon: @Composable (() -> Unit)? = null,
+    title: String? = null,
+    message: String? = null,
+    okButtonIcon: Any = Icons.Default.Check,
+    cancelButtonIcon: Any = Icons.Default.Close,
+    okButtonContentDescription: String = stringResource(android.R.string.ok),
+    cancelButtonContentDescription: String = stringResource(android.R.string.cancel),
+    state: ScalingLazyColumnState =
+        rememberColumnState(
+            ScalingLazyColumnDefaults.responsive(
+                additionalPaddingAtBottom = 0.dp,
+            ),
+        ),
+    showPositionIndicator: Boolean = true,
+    content: (ScalingLazyListScope.() -> Unit)? = null,
+) {
+    val density = LocalDensity.current
+    val maxScreenWidthPx = with(density) { LocalConfiguration.current.screenWidthDp.dp.toPx() }
+
+    ResponsiveDialogContent(
+        icon = icon,
+        title =
+            title?.let {
+                {
+                    Text(
+                        modifier = Modifier.fillMaxWidth(),
+                        text = it,
+                        color = MaterialTheme.colors.onBackground,
+                        textAlign = TextAlign.Center,
+                        overflow = TextOverflow.Ellipsis,
+                    )
+                }
+            },
+        message =
+            message?.let {
+                {
+                    // Should message be start or center aligned?
+                    val textMeasurer = rememberTextMeasurer()
+                    val textStyle = LocalTextStyle.current
+                    val totalPaddingPercentage =
+                        globalHorizontalPadding + messageExtraHorizontalPadding
+                    val lineCount =
+                        remember(it, density, textStyle, textMeasurer) {
+                            textMeasurer
+                                .measure(
+                                    text = it,
+                                    style = textStyle,
+                                    constraints =
+                                        Constraints(
+                                            // Available width is reduced by responsive dialog
+                                            // horizontal
+                                            // padding.
+                                            maxWidth =
+                                                (maxScreenWidthPx *
+                                                        (1f - totalPaddingPercentage * 2f / 100f))
+                                                    .toInt(),
+                                        ),
+                                )
+                                .lineCount
+                        }
+                    val textAlign = if (lineCount <= 3) TextAlign.Center else TextAlign.Start
+                    Text(
+                        modifier = Modifier.fillMaxWidth(),
+                        text = it,
+                        color = MaterialTheme.colors.onBackground,
+                        textAlign = textAlign,
+                    )
+                }
+            },
+        content = content,
+        onOk = onOk,
+        onCancel = onCancel,
+        okButtonIcon = okButtonIcon,
+        cancelButtonIcon = cancelButtonIcon,
+        okButtonContentDescription = okButtonContentDescription,
+        cancelButtonContentDescription = cancelButtonContentDescription,
+        state = state,
+        showPositionIndicator = showPositionIndicator,
+    )
+}
+
+@Composable
+private fun AlertIcon(iconRes: Int?) =
+    if (iconRes != null && iconRes != 0) {
+        Icon(painter = painterResource(iconRes), contentDescription = null)
+    } else {
+        null
+    }
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/AnnotatedText.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/AnnotatedText.kt
new file mode 100644
index 0000000..81f33aa
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/AnnotatedText.kt
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import android.text.Spanned
+import android.text.style.ClickableSpan
+import android.view.View
+import androidx.compose.foundation.text.BasicText
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.LinkAnnotation
+import androidx.compose.ui.text.LinkInteractionListener
+import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.buildAnnotatedString
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.wear.compose.material.MaterialTheme
+import com.android.healthconnect.controller.permissions.request.wear.WearUtils.capitalize
+
+const val CLICKABLE_SPAN_TAG = "CLICKABLE_SPAN_TAG"
+
+@Composable
+fun AnnotatedText(
+    text: CharSequence,
+    style: TextStyle,
+    modifier: Modifier = Modifier,
+    shouldCapitalize: Boolean
+) {
+    val onClickCallbacks = mutableMapOf<String, (View) -> Unit>()
+    val context = LocalContext.current
+    val listener = LinkInteractionListener {
+        if (it is LinkAnnotation.Clickable) {
+            onClickCallbacks[it.tag]?.invoke(View(context))
+        }
+    }
+
+    val annotatedString =
+        spannableStringToAnnotatedString(
+            text,
+            shouldCapitalize,
+            onClickCallbacks,
+            listener = listener
+        )
+    BasicText(text = annotatedString, style = style, modifier = modifier)
+}
+
+@Composable
+private fun spannableStringToAnnotatedString(
+    text: CharSequence,
+    shouldCapitalize: Boolean,
+    onClickCallbacks: MutableMap<String, (View) -> Unit>,
+    spanColor: Color = MaterialTheme.colors.primary,
+    listener: LinkInteractionListener
+): AnnotatedString {
+    val finalString = if (shouldCapitalize) text.toString().capitalize() else text.toString()
+    val annotatedString =
+        if (text is Spanned) {
+            buildAnnotatedString {
+                append(finalString)
+                for (span in text.getSpans(0, text.length, Any::class.java)) {
+                    val start = text.getSpanStart(span)
+                    val end = text.getSpanEnd(span)
+                    when (span) {
+                        is ClickableSpan ->
+                            addClickableSpan(
+                                span,
+                                spanColor,
+                                start,
+                                end,
+                                onClickCallbacks,
+                                listener
+                            )
+                        else -> addStyle(SpanStyle(), start, end)
+                    }
+                }
+            }
+        } else {
+            AnnotatedString(text.toString())
+        }
+    return annotatedString
+}
+
+private fun AnnotatedString.Builder.addClickableSpan(
+    span: ClickableSpan,
+    spanColor: Color,
+    start: Int,
+    end: Int,
+    onClickCallbacks: MutableMap<String, (View) -> Unit>,
+    listener: LinkInteractionListener
+) {
+    val key = "${CLICKABLE_SPAN_TAG}:$start:$end"
+    onClickCallbacks[key] = span::onClick
+    addLink(LinkAnnotation.Clickable(key, linkInteractionListener = listener), start, end)
+    addStyle(
+        SpanStyle(color = spanColor, textDecoration = TextDecoration.Underline),
+        start,
+        end,
+    )
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Button.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Button.kt
new file mode 100644
index 0000000..4b57f2a
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Button.kt
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import androidx.annotation.DrawableRes
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.unit.Dp
+import androidx.wear.compose.material.Button
+import androidx.wear.compose.material.ButtonColors
+import androidx.wear.compose.material.ButtonDefaults
+import androidx.wear.compose.material.ButtonDefaults.DefaultButtonSize
+import androidx.wear.compose.material.ButtonDefaults.DefaultIconSize
+import androidx.wear.compose.material.ButtonDefaults.LargeButtonSize
+import androidx.wear.compose.material.ButtonDefaults.LargeIconSize
+import androidx.wear.compose.material.ButtonDefaults.SmallButtonSize
+import androidx.wear.compose.material.ButtonDefaults.SmallIconSize
+
+/**
+ * This component is an alternative to [Button], providing the following:
+ * - a convenient way of providing an icon and choosing its size from a range of sizes recommended
+ *   by the Wear guidelines;
+ */
+@Composable
+public fun Button(
+    imageVector: ImageVector,
+    contentDescription: String,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    colors: ButtonColors = ButtonDefaults.primaryButtonColors(),
+    buttonSize: ButtonSize = ButtonSize.Default,
+    iconRtlMode: IconRtlMode = IconRtlMode.Default,
+    enabled: Boolean = true
+) {
+    Button(
+        icon = imageVector,
+        contentDescription = contentDescription,
+        onClick = onClick,
+        modifier = modifier,
+        colors = colors,
+        buttonSize = buttonSize,
+        iconRtlMode = iconRtlMode,
+        enabled = enabled
+    )
+}
+
+/**
+ * This component is an alternative to [Button], providing the following:
+ * - a convenient way of providing an icon and choosing its size from a range of sizes recommended
+ *   by the Wear guidelines;
+ */
+@Composable
+public fun Button(
+    @DrawableRes id: Int,
+    contentDescription: String,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    colors: ButtonColors = ButtonDefaults.primaryButtonColors(),
+    buttonSize: ButtonSize = ButtonSize.Default,
+    iconRtlMode: IconRtlMode = IconRtlMode.Default,
+    enabled: Boolean = true
+) {
+    Button(
+        icon = id,
+        contentDescription = contentDescription,
+        onClick = onClick,
+        modifier = modifier,
+        colors = colors,
+        buttonSize = buttonSize,
+        iconRtlMode = iconRtlMode,
+        enabled = enabled
+    )
+}
+
+@Composable
+internal fun Button(
+    icon: Any,
+    contentDescription: String,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    colors: ButtonColors = ButtonDefaults.primaryButtonColors(),
+    buttonSize: ButtonSize = ButtonSize.Default,
+    iconRtlMode: IconRtlMode = IconRtlMode.Default,
+    enabled: Boolean = true
+) {
+    Button(
+        onClick = onClick,
+        modifier = modifier.size(buttonSize.tapTargetSize),
+        enabled = enabled,
+        colors = colors
+    ) {
+        val iconModifier = Modifier.size(buttonSize.iconSize).align(Alignment.Center)
+
+        Icon(
+            icon = icon,
+            contentDescription = contentDescription,
+            modifier = iconModifier,
+            rtlMode = iconRtlMode
+        )
+    }
+}
+
+public sealed class ButtonSize(public val iconSize: Dp, public val tapTargetSize: Dp) {
+    public object Default :
+        ButtonSize(iconSize = DefaultIconSize, tapTargetSize = DefaultButtonSize)
+
+    public object Large : ButtonSize(iconSize = LargeIconSize, tapTargetSize = LargeButtonSize)
+    public object Small : ButtonSize(iconSize = SmallIconSize, tapTargetSize = SmallButtonSize)
+
+    /**
+     * Custom sizes should follow the
+     * [accessibility principles and guidance for touch targets](https://developer.android.com/training/wearables/accessibility#set-minimum).
+     */
+    public data class Custom(val customIconSize: Dp, val customTapTargetSize: Dp) :
+        ButtonSize(iconSize = customIconSize, tapTargetSize = customTapTargetSize)
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/CheckYourPhone.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/CheckYourPhone.kt
new file mode 100644
index 0000000..4f5e951
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/CheckYourPhone.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import android.content.res.Configuration
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Scaffold
+import androidx.wear.compose.material.Text
+import com.android.healthconnect.controller.R
+
+private const val TOP_PADDING_SCREEN_PERCENTAGE = 0.1248f
+private const val BOTTOM_PADDING_SCREEN_PERCENTAGE = 0.0624f
+private const val SIDE_PADDING_SCREEN_PERCENTAGE = 0.052f
+private const val TEXT_PADDING_SCREEN_PERCENTAGE = 0.0416f
+
+enum class CheckYourPhoneState {
+    InProgress,
+    Success
+}
+
+/**
+ * A screen to request the user to check their paired phone to proceed. It also allows a [message]
+ * to be displayed.
+ *
+ * <img
+ * src="https://media.githubusercontent.com/media/google/horologist/main/docs/auth-composables/check_your_phone_screen_code.png"
+ * height="120" width="120"/>
+ */
+@Composable
+fun CheckYourPhoneScreen(
+    title: String,
+    state: CheckYourPhoneState,
+    modifier: Modifier = Modifier,
+    message: String? = null,
+) {
+    val configuration = LocalConfiguration.current
+
+    val isLarge = configuration.isLargeScreen
+
+    val topPadding = (configuration.screenHeightDp * TOP_PADDING_SCREEN_PERCENTAGE).dp
+    val bottomPadding = (configuration.screenHeightDp * BOTTOM_PADDING_SCREEN_PERCENTAGE).dp
+    val sidePadding = (configuration.screenHeightDp * SIDE_PADDING_SCREEN_PERCENTAGE).dp
+    val textPadding =
+        if (isLarge) (configuration.screenHeightDp * TEXT_PADDING_SCREEN_PERCENTAGE).dp else 0.dp
+
+    Scaffold {
+        Column(
+            modifier =
+                modifier
+                    .fillMaxSize()
+                    .padding(
+                        top = topPadding,
+                        bottom = bottomPadding,
+                        start = sidePadding,
+                        end = sidePadding,
+                    ),
+        ) {
+            Column(
+                modifier = Modifier.fillMaxWidth().weight(1f).padding(horizontal = textPadding),
+                verticalArrangement = Arrangement.Center,
+            ) {
+                Text(
+                    text = title,
+                    modifier = Modifier.fillMaxWidth().align(Alignment.CenterHorizontally),
+                    textAlign = TextAlign.Center,
+                    style = MaterialTheme.typography.title3.copy(fontWeight = FontWeight.W600),
+                )
+
+                if (message != null) {
+                    Text(
+                        text = message,
+                        modifier =
+                            Modifier.padding(top = 20.dp)
+                                .fillMaxWidth()
+                                .align(Alignment.CenterHorizontally),
+                        textAlign = TextAlign.Center,
+                    )
+                }
+            }
+            when (state) {
+                CheckYourPhoneState.InProgress ->
+                    RemoteConnectionProgressIndicator(
+                        iconRes = R.drawable.ic_security_update_good,
+                        Modifier.align(Alignment.CenterHorizontally)
+                    )
+                CheckYourPhoneState.Success ->
+                    RemoteConnectionSuccess(
+                        iconRes = R.drawable.ic_security_update_good,
+                        Modifier.align(Alignment.CenterHorizontally)
+                    )
+            }
+        }
+    }
+}
+
+/** Whether the device is considered large screen for layout adjustment purposes. */
+internal val Configuration.isLargeScreen: Boolean
+    get() = screenHeightDp > 224
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Chip.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Chip.kt
new file mode 100644
index 0000000..3e93b43
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Chip.kt
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import android.graphics.drawable.Drawable
+import androidx.annotation.StringRes
+import androidx.compose.foundation.layout.BoxScope
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.Hyphens
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.Chip
+import androidx.wear.compose.material.ChipColors
+import androidx.wear.compose.material.ChipDefaults
+import androidx.wear.compose.material.ContentAlpha
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.contentColorFor
+
+/**
+ * This component is an alternative to [Chip], providing the following:
+ * - a convenient way of providing a label and a secondary label;
+ * - a convenient way of providing an icon, and choosing their size based on the sizes recommended
+ *   by the Wear guidelines;
+ */
+@Composable
+fun Chip(
+    label: String,
+    labelMaxLines: Int? = null,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    secondaryLabel: String? = null,
+    secondaryLabelMaxLines: Int? = null,
+    icon: Any? = null,
+    iconContentDescription: String? = null,
+    largeIcon: Boolean = false,
+    textColor: Color = MaterialTheme.colors.onSurface,
+    iconColor: Color = Color.Unspecified,
+    colors: ChipColors = chipDefaultColors(),
+    enabled: Boolean = true
+) {
+    val iconParam: (@Composable BoxScope.() -> Unit)? =
+        icon?.let {
+            {
+                val iconSize =
+                    if (largeIcon) {
+                        ChipDefaults.LargeIconSize
+                    } else {
+                        ChipDefaults.IconSize
+                    }
+
+                Row {
+                    val iconModifier = Modifier.size(iconSize).clip(CircleShape)
+                    when (icon) {
+                        is ImageVector ->
+                            Icon(
+                                imageVector = icon,
+                                tint = iconColor,
+                                contentDescription = iconContentDescription,
+                                modifier = iconModifier
+                            )
+                        is Int ->
+                            Icon(
+                                painter = painterResource(id = icon),
+                                tint = iconColor,
+                                contentDescription = iconContentDescription,
+                                modifier = iconModifier
+                            )
+                        is Drawable ->
+                            Icon(
+                                painter = rememberDrawablePainter(icon),
+                                tint = iconColor,
+                                contentDescription = iconContentDescription,
+                                modifier = iconModifier
+                            )
+                        else -> {}
+                    }
+                }
+            }
+        }
+
+    Chip(
+        label = label,
+        labelMaxLines = labelMaxLines,
+        onClick = onClick,
+        modifier = modifier,
+        secondaryLabel = secondaryLabel,
+        secondaryLabelMaxLines = secondaryLabelMaxLines,
+        icon = iconParam,
+        largeIcon = largeIcon,
+        textColor = textColor,
+        colors = colors,
+        enabled = enabled
+    )
+}
+
+/**
+ * This component is an alternative to [Chip], providing the following:
+ * - a convenient way of providing a label and a secondary label;
+ * - a convenient way of providing an icon, and choosing their size based on the sizes recommended
+ *   by the Wear guidelines;
+ */
+@Composable
+fun Chip(
+    @StringRes labelId: Int,
+    labelMaxLines: Int? = null,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    @StringRes secondaryLabel: Int? = null,
+    secondaryLabelMaxLines: Int? = null,
+    icon: Any? = null,
+    largeIcon: Boolean = false,
+    textColor: Color = MaterialTheme.colors.onSurface,
+    iconColor: Color = Color.Unspecified,
+    colors: ChipColors = chipDefaultColors(),
+    enabled: Boolean = true
+) {
+    Chip(
+        label = stringResource(id = labelId),
+        labelMaxLines = labelMaxLines,
+        onClick = onClick,
+        modifier = modifier,
+        secondaryLabel = secondaryLabel?.let { stringResource(id = it) },
+        secondaryLabelMaxLines = secondaryLabelMaxLines,
+        icon = icon,
+        largeIcon = largeIcon,
+        textColor = textColor,
+        iconColor = iconColor,
+        colors = colors,
+        enabled = enabled
+    )
+}
+
+/**
+ * This component is an alternative to [Chip], providing the following:
+ * - a convenient way of providing a label and a secondary label;
+ */
+// Setting the color as per
+// https://source.corp.google.com/piper///depot/google3/java/com/google/android/clockwork/common/wearable/wearmaterial/button/res/color/wear_button_secondary_text_stateful.xml?q=wear_button_secondary_text_stateful
+@Composable
+fun Chip(
+    label: String,
+    labelMaxLines: Int? = null,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    secondaryLabel: String? = null,
+    secondaryLabelMaxLines: Int? = null,
+    icon: (@Composable BoxScope.() -> Unit)? = null,
+    largeIcon: Boolean = false,
+    textColor: Color = MaterialTheme.colors.onSurface,
+    secondaryTextColor: Color = MaterialTheme.colors.primary,
+    colors: ChipColors = chipDefaultColors(),
+    enabled: Boolean = true
+) {
+    val hasSecondaryLabel = secondaryLabel != null
+    val hasIcon = icon != null
+
+    val labelParam: (@Composable RowScope.() -> Unit) = {
+        Text(
+            text = label,
+            color = textColor,
+            modifier = Modifier.fillMaxWidth(),
+            textAlign = if (hasSecondaryLabel || hasIcon) TextAlign.Start else TextAlign.Center,
+            overflow = TextOverflow.Ellipsis,
+            maxLines = labelMaxLines ?: if (hasSecondaryLabel) 1 else 2,
+            style =
+                MaterialTheme.typography.button.copy(
+                    fontWeight = FontWeight.W600,
+                    hyphens = Hyphens.Auto
+                )
+        )
+    }
+
+    val secondaryLabelParam: (@Composable RowScope.() -> Unit)? =
+        secondaryLabel?.let {
+            {
+                Text(
+                    text = secondaryLabel,
+                    color = secondaryTextColor,
+                    overflow = TextOverflow.Ellipsis,
+                    maxLines = secondaryLabelMaxLines ?: 1,
+                    style = MaterialTheme.typography.caption2
+                )
+            }
+        }
+
+    val contentPadding =
+        if (largeIcon) {
+            val verticalPadding = ChipDefaults.ChipVerticalPadding
+            PaddingValues(
+                start = 10.dp,
+                top = verticalPadding,
+                end = ChipDefaults.ChipHorizontalPadding,
+                bottom = verticalPadding
+            )
+        } else {
+            ChipDefaults.ContentPadding
+        }
+
+    Chip(
+        label = labelParam,
+        onClick = onClick,
+        modifier = modifier.fillMaxWidth(),
+        secondaryLabel = secondaryLabelParam,
+        icon = icon,
+        colors = colors,
+        enabled = enabled,
+        contentPadding = contentPadding,
+        shape = RoundedCornerShape(26.dp)
+    )
+}
+
+/** Default colors of a Chip. */
+@Composable fun chipDefaultColors(): ChipColors = ChipDefaults.secondaryChipColors()
+
+/**
+ * ChipColors that disabled alpha is applied based on [ChipDefaults.secondaryChipColors()]. It is
+ * used for a Chip which would like to respond to click events, meanwhile it seems disabled.
+ */
+@Composable
+fun chipDisabledColors(): ChipColors {
+    val backgroundColor = MaterialTheme.colors.surface
+    val contentColor = contentColorFor(backgroundColor)
+    val secondaryContentColor = contentColor
+    val iconColor = contentColor
+
+    return ChipDefaults.chipColors(
+        backgroundColor = backgroundColor.copy(alpha = ContentAlpha.disabled),
+        contentColor = contentColor.copy(alpha = ContentAlpha.disabled),
+        secondaryContentColor = secondaryContentColor.copy(alpha = ContentAlpha.disabled),
+        iconColor = iconColor.copy(alpha = ContentAlpha.disabled)
+    )
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/DrawablePainter.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/DrawablePainter.kt
new file mode 100644
index 0000000..6db209e
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/DrawablePainter.kt
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import android.graphics.drawable.Animatable
+import android.graphics.drawable.ColorDrawable
+import android.graphics.drawable.Drawable
+import android.os.Build
+import android.os.Handler
+import android.os.Looper
+import android.view.View
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.RememberObserver
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.graphics.asAndroidColorFilter
+import androidx.compose.ui.graphics.drawscope.DrawScope
+import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
+import androidx.compose.ui.graphics.nativeCanvas
+import androidx.compose.ui.graphics.painter.ColorPainter
+import androidx.compose.ui.graphics.painter.Painter
+import androidx.compose.ui.graphics.withSave
+import androidx.compose.ui.unit.LayoutDirection
+import kotlin.math.roundToInt
+
+private val MAIN_HANDLER by lazy(LazyThreadSafetyMode.NONE) { Handler(Looper.getMainLooper()) }
+
+/**
+ * A [Painter] which draws an Android [Drawable] and supports [Animatable] drawables. Instances
+ * should be remembered to be able to start and stop [Animatable] animations.
+ *
+ * Instances are usually retrieved from [rememberDrawablePainter].
+ */
+class DrawablePainter(val drawable: Drawable) : Painter(), RememberObserver {
+    private var drawInvalidateTick by mutableStateOf(0)
+    private var drawableIntrinsicSize by mutableStateOf(drawable.intrinsicSize)
+
+    private val callback: Drawable.Callback by lazy {
+        object : Drawable.Callback {
+            override fun invalidateDrawable(d: Drawable) {
+                // Update the tick so that we get re-drawn
+                drawInvalidateTick++
+                // Update our intrinsic size too
+                drawableIntrinsicSize = drawable.intrinsicSize
+            }
+
+            override fun scheduleDrawable(d: Drawable, what: Runnable, time: Long) {
+                MAIN_HANDLER.postAtTime(what, time)
+            }
+
+            override fun unscheduleDrawable(d: Drawable, what: Runnable) {
+                MAIN_HANDLER.removeCallbacks(what)
+            }
+        }
+    }
+
+    init {
+        if (drawable.intrinsicWidth >= 0 && drawable.intrinsicHeight >= 0) {
+            // Update the drawable's bounds to match the intrinsic size
+            drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
+        }
+    }
+
+    override fun onRemembered() {
+        drawable.callback = callback
+        drawable.setVisible(true, true)
+        if (drawable is Animatable) drawable.start()
+    }
+
+    override fun onAbandoned() = onForgotten()
+
+    override fun onForgotten() {
+        if (drawable is Animatable) drawable.stop()
+        drawable.setVisible(false, false)
+        drawable.callback = null
+    }
+
+    override fun applyAlpha(alpha: Float): Boolean {
+        drawable.alpha = (alpha * 255).roundToInt().coerceIn(0, 255)
+        return true
+    }
+
+    override fun applyColorFilter(colorFilter: ColorFilter?): Boolean {
+        drawable.colorFilter = colorFilter?.asAndroidColorFilter()
+        return true
+    }
+
+    override fun applyLayoutDirection(layoutDirection: LayoutDirection): Boolean {
+        if (Build.VERSION.SDK_INT >= 23) {
+            return drawable.setLayoutDirection(
+                when (layoutDirection) {
+                    LayoutDirection.Ltr -> View.LAYOUT_DIRECTION_LTR
+                    LayoutDirection.Rtl -> View.LAYOUT_DIRECTION_RTL
+                }
+            )
+        }
+        return false
+    }
+
+    override val intrinsicSize: Size
+        get() = drawableIntrinsicSize
+
+    override fun DrawScope.onDraw() {
+        drawIntoCanvas { canvas ->
+            // Reading this ensures that we invalidate when invalidateDrawable() is called
+            drawInvalidateTick
+
+            // Update the Drawable's bounds
+            drawable.setBounds(0, 0, size.width.roundToInt(), size.height.roundToInt())
+
+            canvas.withSave { drawable.draw(canvas.nativeCanvas) }
+        }
+    }
+}
+
+/**
+ * Remembers [Drawable] wrapped up as a [Painter]. This function attempts to un-wrap the drawable
+ * contents and use Compose primitives where possible.
+ *
+ * If the provided [drawable] is `null`, an empty no-op painter is returned.
+ *
+ * This function tries to dispatch lifecycle events to [drawable] as much as possible from within
+ * Compose.
+ */
+@Composable
+fun rememberDrawablePainter(drawable: Drawable?): Painter =
+    remember(drawable) {
+        when (drawable) {
+            null -> EmptyPainter
+            is ColorDrawable -> ColorPainter(Color(drawable.color))
+            // Since the DrawablePainter will be remembered and it implements RememberObserver, it
+            // will receive the necessary events
+            else -> DrawablePainter(drawable.mutate())
+        }
+    }
+
+private val Drawable.intrinsicSize: Size
+    get() =
+        when {
+            // Only return a finite size if the drawable has an intrinsic size
+            intrinsicWidth >= 0 && intrinsicHeight >= 0 -> {
+                Size(width = intrinsicWidth.toFloat(), height = intrinsicHeight.toFloat())
+            }
+            else -> Size.Unspecified
+        }
+
+internal object EmptyPainter : Painter() {
+    override val intrinsicSize: Size
+        get() = Size.Unspecified
+    override fun DrawScope.onDraw() {}
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Icon.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Icon.kt
new file mode 100644
index 0000000..4a4a498
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/Icon.kt
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import android.graphics.drawable.Drawable
+import androidx.annotation.DrawableRes
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.scale
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.LocalContentAlpha
+import androidx.wear.compose.material.LocalContentColor
+
+/**
+ * This component is an alternative to [Icon], providing the following:
+ * - a convenient way of setting the icon to be mirrored in RTL mode;
+ */
+@Composable
+public fun Icon(
+    imageVector: ImageVector,
+    contentDescription: String?,
+    modifier: Modifier = Modifier,
+    tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current),
+    rtlMode: IconRtlMode = IconRtlMode.Default
+) {
+    val shouldMirror =
+        rtlMode == IconRtlMode.Mirrored && LocalLayoutDirection.current == LayoutDirection.Rtl
+    Icon(
+        modifier = modifier.scale(scaleX = if (shouldMirror) -1f else 1f, scaleY = 1f),
+        imageVector = imageVector,
+        contentDescription = contentDescription,
+        tint = tint
+    )
+}
+
+/**
+ * This component is an alternative to [Icon], providing the following:
+ * - a convenient way of setting the icon to be mirrored in RTL mode;
+ */
+@Composable
+public fun Icon(
+    @DrawableRes id: Int,
+    contentDescription: String?,
+    modifier: Modifier = Modifier,
+    tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current),
+    rtlMode: IconRtlMode = IconRtlMode.Default
+) {
+    val shouldMirror =
+        rtlMode == IconRtlMode.Mirrored && LocalLayoutDirection.current == LayoutDirection.Rtl
+
+    Icon(
+        painter = painterResource(id = id),
+        contentDescription = contentDescription,
+        modifier = modifier.scale(scaleX = if (shouldMirror) -1f else 1f, scaleY = 1f),
+        tint = tint
+    )
+}
+
+/**
+ * This component is an alternative to [Icon], providing the following:
+ * - a convenient way of providing an icon of various types
+ * - a convenient way of setting the icon to be mirrored in RTL mode;
+ */
+@Composable
+fun Icon(
+    icon: Any,
+    contentDescription: String?,
+    modifier: Modifier = Modifier,
+    tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current),
+    rtlMode: IconRtlMode = IconRtlMode.Default
+) {
+    val shouldMirror =
+        rtlMode == IconRtlMode.Mirrored && LocalLayoutDirection.current == LayoutDirection.Rtl
+
+    val iconModifier = modifier.scale(scaleX = if (shouldMirror) -1f else 1f, scaleY = 1f)
+    when (icon) {
+        is ImageVector -> {
+            Icon(
+                imageVector = icon,
+                modifier = iconModifier,
+                contentDescription = contentDescription,
+                tint = tint
+            )
+        }
+        is Int -> {
+            Icon(
+                painter = painterResource(id = icon),
+                contentDescription = contentDescription,
+                modifier = iconModifier,
+                tint = tint
+            )
+        }
+        is Drawable -> {
+            Icon(
+                painter = rememberDrawablePainter(icon),
+                contentDescription = contentDescription,
+                modifier = iconModifier,
+                tint = tint
+            )
+        }
+        else -> throw IllegalArgumentException("Type not supported.")
+    }
+}
+
+public enum class IconRtlMode {
+    Default,
+    Mirrored
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ListFooter.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ListFooter.kt
new file mode 100644
index 0000000..ef4ad62
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ListFooter.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Text
+
+/** A slot based composable for creating a list footer item. */
+@Composable
+fun ListFooter(description: String, iconRes: Int? = null, onClick: (() -> Unit)? = null) {
+    val modifier = Modifier.fillMaxWidth()
+    Row(
+        modifier =
+            if (onClick == null) {
+                modifier
+            } else {
+                modifier.clickable(onClick = onClick)
+            }
+    ) {
+        iconRes?.let {
+            Spacer(modifier = Modifier.width(LeadingIconStartSpacing))
+            Icon(
+                painter = painterResource(id = it),
+                contentDescription = null,
+                modifier =
+                    Modifier.size(LeadingIconSize, LeadingIconSize)
+                        .align(Alignment.CenterVertically)
+            )
+            Spacer(modifier = Modifier.width(LeadingIconEndSpacing))
+        }
+        Text(
+            text = description,
+            modifier = Modifier.fillMaxWidth(),
+            textAlign = TextAlign.Start,
+            overflow = TextOverflow.Ellipsis,
+            color = MaterialTheme.colors.onSurfaceVariant,
+            style = MaterialTheme.typography.caption2
+        )
+    }
+}
+
+/** The size of the spacing before the leading icon when they used inside a list footer. */
+private val LeadingIconStartSpacing = 4.dp
+
+/** The size of the spacing between the leading icon and a text inside a list footer. */
+private val LeadingIconEndSpacing = 8.dp
+
+/** The size of the leading icon. */
+private val LeadingIconSize = 24.dp
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ListHeader.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ListHeader.kt
new file mode 100644
index 0000000..f3ed1ef
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ListHeader.kt
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxScope
+import androidx.compose.foundation.layout.IntrinsicSize
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.Hyphens
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.LocalContentColor
+import androidx.wear.compose.material.LocalTextStyle
+import androidx.wear.compose.material.MaterialTheme
+
+/**
+ * A slot based composable for creating a list header item. [ListHeader]s are typically expected to
+ * be a few words of text on a single line. The contents will be start and end padded.
+ *
+ * @param modifier The modifier for the [ListHeader].
+ * @param backgroundColor The background color to apply - typically Color.Transparent
+ * @param contentColor The color to apply to content.
+ * @param content Slot for [ListHeader] content, expected to be a single line of text.
+ */
+
+// Styling updated to match with wear material title
+// Ref:
+// https://source.corp.google.com/h/googleplex-android/platform/superproject/main/+/main:vendor/google_clockwork_partners/libs/ClockworkCommonLibs/common/wearable/wearmaterial/preference/res/layout/wear_title_preference.xml;l=1;drc=8ebd53cbba588e8e9aa964522fb05f4f5224609e;bpv=1;bpt=0
+@Composable
+fun ListHeader(
+    modifier: Modifier = Modifier,
+    backgroundColor: Color = Color.Transparent,
+    contentColor: Color = MaterialTheme.colors.onBackground,
+    content: @Composable RowScope.() -> Unit
+) {
+    Row(
+        horizontalArrangement = Arrangement.Center,
+        modifier =
+            modifier.wrapContentSize().background(backgroundColor).semantics(
+                mergeDescendants = true
+            ) {
+                heading()
+            }
+    ) {
+        CompositionLocalProvider(
+            LocalContentColor provides contentColor,
+            LocalTextStyle provides
+                MaterialTheme.typography.title3.copy(
+                    fontWeight = FontWeight.W600,
+                    hyphens = Hyphens.Auto
+                ),
+        ) {
+            content()
+        }
+    }
+}
+
+/**
+ * A two slot based composable for creating a list subheader item. [ListSubheader]s offer slots for
+ * an icon and for a text label. The contents will be start and end padded.
+ *
+ * @param modifier The modifier for the [ListSubheader].
+ * @param backgroundColor The background color to apply - typically Color.Transparent
+ * @param contentColor The color to apply to content.
+ * @param icon A slot for providing icon to the [ListSubheader].
+ * @param label A slot for providing label to the [ListSubheader].
+ */
+@Composable
+fun ListSubheader(
+    modifier: Modifier = Modifier,
+    backgroundColor: Color = Color.Transparent,
+    contentColor: Color = MaterialTheme.colors.onBackground,
+    icon: (@Composable BoxScope.() -> Unit)? = null,
+    label: @Composable RowScope.() -> Unit,
+) {
+    Row(
+        verticalAlignment = Alignment.CenterVertically,
+        horizontalArrangement = Arrangement.Start,
+        modifier =
+            modifier
+                .height(IntrinsicSize.Min)
+                .fillMaxWidth()
+                .wrapContentSize(align = Alignment.CenterStart)
+                .background(backgroundColor)
+                .semantics(mergeDescendants = true) { heading() }
+    ) {
+        CompositionLocalProvider(
+            LocalContentColor provides contentColor,
+            LocalTextStyle provides MaterialTheme.typography.caption1,
+        ) {
+            if (icon != null) {
+                Box(
+                    modifier = Modifier.wrapContentSize(align = Alignment.CenterStart),
+                    content = icon
+                )
+                Spacer(modifier = Modifier.width(6.dp))
+            }
+            label()
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/RemoteConnectionProgressIndicator.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/RemoteConnectionProgressIndicator.kt
new file mode 100644
index 0000000..c23ffc5
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/RemoteConnectionProgressIndicator.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.CircularProgressIndicator
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.MaterialTheme
+
+@Composable
+fun RemoteConnectionProgressIndicator(iconRes: Int, modifier: Modifier) {
+    val indicatorPadding = 8.dp
+    val iconSize = 48.dp
+    val progressBarStrokeWidth = 4.dp
+    Box(
+        modifier = modifier.size(iconSize).clip(CircleShape),
+    ) {
+        CircularProgressIndicator(
+            modifier = Modifier.size(iconSize - progressBarStrokeWidth + indicatorPadding),
+            strokeWidth = progressBarStrokeWidth,
+        )
+        Icon(
+            painter = painterResource(iconRes),
+            contentDescription = null,
+            modifier =
+                Modifier.align(Alignment.Center)
+                    .size(iconSize - indicatorPadding - 8.dp)
+                    .clip(CircleShape),
+        )
+    }
+}
+
+@Composable
+fun RemoteConnectionSuccess(iconRes: Int, modifier: Modifier) {
+    val indicatorPadding = 8.dp
+    val iconSize = 48.dp
+    val backgroundColor = MaterialTheme.colors.onSurface
+    val contentColor = MaterialTheme.colors.surface
+    Box(
+        modifier = modifier.size(iconSize).clip(CircleShape).background(backgroundColor),
+    ) {
+        Icon(
+            painter = painterResource(iconRes),
+            contentDescription = null,
+            tint = contentColor,
+            modifier =
+                Modifier.align(Alignment.Center)
+                    .size(iconSize - indicatorPadding - 8.dp)
+                    .clip(CircleShape),
+        )
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ResponsiveDialog.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ResponsiveDialog.kt
new file mode 100644
index 0000000..19e8ac6
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ResponsiveDialog.kt
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Arrangement.spacedBy
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Check
+import androidx.compose.material.icons.filled.Close
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
+import androidx.wear.compose.material.ButtonDefaults
+import androidx.wear.compose.material.ChipColors
+import androidx.wear.compose.material.ChipDefaults
+import androidx.wear.compose.material.LocalTextStyle
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.PositionIndicator
+import androidx.wear.compose.material.Scaffold
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.ScalingLazyColumn
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.ScalingLazyColumnDefaults.responsive
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.ScalingLazyColumnState
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.rememberColumnState
+
+// This file is a copy of ResponsiveDialogContent.kt from Horologist (go/horologist),
+// remove it once after wear compose supports large screen dialogs.
+
+@Composable
+fun ResponsiveDialogContent(
+    modifier: Modifier = Modifier,
+    icon: @Composable (() -> Unit)? = null,
+    title: @Composable (() -> Unit)? = null,
+    message: @Composable (() -> Unit)? = null,
+    okButtonIcon: Any = Icons.Default.Check,
+    cancelButtonIcon: Any = Icons.Default.Close,
+    onOk: (() -> Unit)? = null,
+    onCancel: (() -> Unit)? = null,
+    okButtonContentDescription: String = stringResource(android.R.string.ok),
+    cancelButtonContentDescription: String = stringResource(android.R.string.cancel),
+    state: ScalingLazyColumnState =
+        rememberColumnState(
+            responsive(
+                firstItemIsFullWidth = icon == null,
+                additionalPaddingAtBottom = 0.dp,
+            ),
+        ),
+    showPositionIndicator: Boolean = true,
+    content: (ScalingLazyListScope.() -> Unit)? = null,
+) {
+    Scaffold(
+        modifier = modifier.fillMaxSize(),
+        positionIndicator = {
+            if (showPositionIndicator) {
+                PositionIndicator(scalingLazyListState = state.state)
+            }
+        },
+        timeText = {},
+    ) {
+        // This will be applied only to the content.
+        CompositionLocalProvider(
+            LocalTextStyle provides MaterialTheme.typography.body2,
+        ) {
+            ScalingLazyColumn(columnState = state) {
+                icon?.let {
+                    item {
+                        Row(
+                            Modifier.fillMaxWidth().padding(bottom = 4.dp), // 8.dp below icon
+                            horizontalArrangement = Arrangement.Center,
+                        ) {
+                            it()
+                        }
+                    }
+                }
+                title?.let {
+                    item {
+                        CompositionLocalProvider(
+                            LocalTextStyle provides
+                                MaterialTheme.typography.title3.copy(fontWeight = FontWeight.W600),
+                        ) {
+                            Box(
+                                Modifier.fillMaxWidth(titleMaxWidthFraction)
+                                    .padding(bottom = 8.dp), // 12.dp below icon
+                            ) {
+                                it()
+                            }
+                        }
+                    }
+                }
+                if (icon == null && title == null) {
+                    // Ensure the content is visible when there is nothing above it.
+                    item { Spacer(Modifier.height(20.dp)) }
+                }
+                message?.let {
+                    item {
+                        Box(
+                            Modifier.fillMaxWidth(messageMaxWidthFraction),
+                        ) {
+                            it()
+                        }
+                    }
+                }
+                content?.let { it() }
+                if (onOk != null || onCancel != null) {
+                    item {
+                        val width = LocalConfiguration.current.screenWidthDp
+                        // Single buttons, or buttons on smaller screens are not meant to be
+                        // responsive.
+                        val buttonWidth =
+                            if (width < 225 || onOk == null || onCancel == null) {
+                                ButtonDefaults.DefaultButtonSize
+                            } else {
+                                // 14.56% on top of 5.2% margin on the sides, 12.dp between.
+                                ((width * (1f - (2 * 0.1456f) - (2 * 0.052f)) - 12) / 2).dp
+                            }
+                        Row(
+                            Modifier.fillMaxWidth()
+                                .padding(
+                                    top = if (content != null || message != null) 12.dp else 0.dp,
+                                ),
+                            horizontalArrangement = spacedBy(12.dp, Alignment.CenterHorizontally),
+                            verticalAlignment = Alignment.CenterVertically,
+                        ) {
+                            onCancel?.let {
+                                ResponsiveButton(
+                                    icon = cancelButtonIcon,
+                                    cancelButtonContentDescription,
+                                    onClick = it,
+                                    buttonWidth,
+                                    ChipDefaults.secondaryChipColors(),
+                                )
+                            }
+                            onOk?.let {
+                                ResponsiveButton(
+                                    icon = okButtonIcon,
+                                    okButtonContentDescription,
+                                    onClick = it,
+                                    buttonWidth,
+                                )
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+@Composable
+private fun ResponsiveButton(
+    icon: Any,
+    contentDescription: String,
+    onClick: () -> Unit,
+    buttonWidth: Dp,
+    colors: ChipColors = ChipDefaults.primaryChipColors(),
+) {
+    androidx.wear.compose.material.Chip(
+        label = {
+            Box(Modifier.fillMaxWidth()) {
+                Icon(
+                    icon = icon,
+                    contentDescription = contentDescription,
+                    modifier =
+                        Modifier.size(ButtonDefaults.DefaultIconSize).align(Alignment.Center),
+                )
+            }
+        },
+        contentPadding = PaddingValues(0.dp),
+        shape = CircleShape,
+        onClick = onClick,
+        modifier = Modifier.width(buttonWidth),
+        colors = colors,
+    )
+}
+
+internal const val globalHorizontalPadding = 5.2f
+internal const val messageExtraHorizontalPadding = 4.56f
+internal const val titleExtraHorizontalPadding = 8.84f
+
+// Fraction of the max available width that message should take (after global and message padding)
+internal val messageMaxWidthFraction =
+    1f -
+        2f *
+            calculatePaddingFraction(
+                messageExtraHorizontalPadding,
+            )
+
+// Fraction of the max available width that title should take (after global and message padding)
+internal val titleMaxWidthFraction =
+    1f -
+        2f *
+            calculatePaddingFraction(
+                titleExtraHorizontalPadding,
+            )
+
+// Calculate total padding given global padding and additional padding required inside that.
+internal fun calculatePaddingFraction(extraPadding: Float) =
+    extraPadding / (100f - 2f * globalHorizontalPadding)
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ScrollableScreen.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ScrollableScreen.kt
new file mode 100644
index 0000000..67e106f
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ScrollableScreen.kt
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import android.app.Activity
+import android.content.Context
+import android.content.ContextWrapper
+import android.graphics.drawable.Drawable
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.fragment.app.FragmentActivity
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.compose.LocalLifecycleOwner
+import androidx.lifecycle.repeatOnLifecycle
+import androidx.wear.compose.foundation.SwipeToDismissValue
+import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
+import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
+import androidx.wear.compose.foundation.lazy.ScalingLazyListState
+import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState
+import androidx.wear.compose.material.CircularProgressIndicator
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.PositionIndicator
+import androidx.wear.compose.material.Scaffold
+import androidx.wear.compose.material.SwipeToDismissBox
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.TimeText
+import androidx.wear.compose.material.Vignette
+import androidx.wear.compose.material.VignettePosition
+import androidx.wear.compose.material.scrollAway
+import com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput.rotaryWithScroll
+import com.android.healthconnect.controller.permissions.request.wear.theme.WearPermissionTheme
+
+/**
+ * Screen that contains a list of items defined using the [content] parameter, adds the time text
+ * (if [showTimeText] is true), the tile (if [title] is not null), the vignette and the position
+ * indicator. It also manages the scaling animation and allows the user to scroll the content using
+ * the crown.
+ */
+@Composable
+fun ScrollableScreen(
+    showTimeText: Boolean = true,
+    title: String? = null,
+    subtitle: CharSequence? = null,
+    image: Any? = null,
+    isLoading: Boolean = false,
+    titleTestTag: String? = null,
+    subtitleTestTag: String? = null,
+    content: ScalingLazyListScope.() -> Unit,
+) {
+    var dismissed by remember { mutableStateOf(false) }
+    val activity = LocalContext.current.findActivity()
+    val state = rememberSwipeToDismissBoxState()
+
+    LaunchedEffect(state.currentValue) {
+        // If the swipe is complete
+        if (state.currentValue == SwipeToDismissValue.Dismissed) {
+            // pop the top fragment immediately or dismiss activity.
+            dismiss(activity)
+            // Set  dismissed state as true
+            dismissed = true
+            // Set swipe box back to starting position(that is cancelled swipe effect) to
+            // show loading indicator while fragment dismisses.
+            // For some reason fragment `popBackImmediate` takes few secs at times.
+            state.snapTo(SwipeToDismissValue.Default)
+        }
+    }
+
+    if (getBackStackEntryCount(activity) > 0) {
+        SwipeToDismissBox(state = state) { isBackground ->
+            Scaffold(
+                showTimeText,
+                title,
+                subtitle,
+                image,
+                isLoading = isLoading || isBackground || dismissed,
+                content,
+                titleTestTag,
+                subtitleTestTag
+            )
+        }
+    } else {
+        Scaffold(
+            showTimeText,
+            title,
+            subtitle,
+            image,
+            isLoading,
+            content,
+            titleTestTag,
+            subtitleTestTag
+        )
+    }
+}
+
+@Composable
+internal fun Scaffold(
+    showTimeText: Boolean,
+    title: String?,
+    subtitle: CharSequence?,
+    image: Any?,
+    isLoading: Boolean,
+    content: ScalingLazyListScope.() -> Unit,
+    titleTestTag: String? = null,
+    subtitleTestTag: String? = null,
+) {
+    val itemsSpacedBy = 4.dp
+    val screenWidth = LocalConfiguration.current.screenWidthDp
+    val screenHeight = LocalConfiguration.current.screenHeightDp
+    val scrollContentHorizontalPadding = (screenWidth * 0.052).dp
+    val titleHorizontalPadding = (screenWidth * 0.0884).dp
+    val subtitleHorizontalPadding = (screenWidth * 0.0416).dp
+    val scrollContentTopPadding = (screenHeight * 0.1456).dp - itemsSpacedBy
+    val scrollContentBottomPadding = (screenHeight * 0.3636).dp
+    val titleBottomPadding =
+        if (subtitle == null) {
+            8.dp
+        } else {
+            4.dp
+        }
+    val subtitleBottomPadding = 8.dp
+    val timeTextTopPadding =
+        if (showTimeText) {
+            1.dp
+        } else {
+            0.dp
+        }
+    val titlePaddingValues =
+        PaddingValues(
+            start = titleHorizontalPadding,
+            top = 4.dp,
+            bottom = titleBottomPadding,
+            end = titleHorizontalPadding
+        )
+    val subTitlePaddingValues =
+        PaddingValues(
+            start = subtitleHorizontalPadding,
+            top = 4.dp,
+            bottom = subtitleBottomPadding,
+            end = subtitleHorizontalPadding
+        )
+    val initialCenterIndex = 0
+    val centerHeightDp = Dp(LocalConfiguration.current.screenHeightDp / 2.0f)
+    // We are adding TimeText's padding to create a smooth scrolling
+    val initialCenterItemScrollOffset = scrollContentTopPadding + timeTextTopPadding
+    val scrollAwayOffset = centerHeightDp - initialCenterItemScrollOffset
+    val focusRequester = remember { FocusRequester() }
+    val listState = remember { ScalingLazyListState(initialCenterItemIndex = initialCenterIndex) }
+    LaunchedEffect(title) {
+        listState.animateScrollToItem(index = 0) // Scroll to the top when triggerValue changes
+    }
+    WearPermissionTheme {
+        Scaffold(
+            // TODO: Use a rotary modifier from Wear Compose once Wear Compose 1.4 is landed.
+            // (b/325560444)
+            modifier =
+                Modifier.rotaryWithScroll(
+                    scrollableState = listState,
+                    focusRequester = focusRequester
+                ),
+            timeText = {
+                if (showTimeText && !isLoading) {
+                    TimeText(
+                        modifier =
+                            Modifier.scrollAway(listState, initialCenterIndex, scrollAwayOffset)
+                                .padding(top = timeTextTopPadding),
+                    )
+                }
+            },
+            vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) },
+            positionIndicator =
+                if (!isLoading) {
+                    { PositionIndicator(scalingLazyListState = listState) }
+                } else {
+                    null
+                }
+        ) {
+            Box(modifier = Modifier.background(Color.Black).fillMaxSize()) {
+                if (isLoading) {
+                    CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
+                } else {
+                    ScalingLazyColumn(
+                        modifier = Modifier.fillMaxWidth(),
+                        state = listState,
+                        // Set autoCentering to null to avoid adding extra padding based on the
+                        // content.
+                        autoCentering = null,
+                        contentPadding =
+                            PaddingValues(
+                                start = scrollContentHorizontalPadding,
+                                end = scrollContentHorizontalPadding,
+                                top = scrollContentTopPadding,
+                                bottom = scrollContentBottomPadding
+                            )
+                    ) {
+                        staticItem()
+                        image?.let {
+                            val imageModifier = Modifier.size(24.dp)
+                            when (image) {
+                                is Int ->
+                                    item {
+                                        Image(
+                                            painter = painterResource(id = image),
+                                            contentDescription = null,
+                                            contentScale = ContentScale.Crop,
+                                            modifier = imageModifier
+                                        )
+                                    }
+                                is Drawable ->
+                                    item {
+                                        Image(
+                                            painter = rememberDrawablePainter(image),
+                                            contentDescription = null,
+                                            contentScale = ContentScale.Crop,
+                                            modifier = imageModifier
+                                        )
+                                    }
+                                else -> {}
+                            }
+                        }
+                        if (title != null) {
+                            item {
+                                var modifier: Modifier = Modifier
+                                if (titleTestTag != null) {
+                                    modifier = modifier.testTag(titleTestTag)
+                                }
+                                ListHeader(modifier = Modifier.padding(titlePaddingValues)) {
+                                    Text(
+                                        text = title,
+                                        textAlign = TextAlign.Center,
+                                        modifier = modifier
+                                    )
+                                }
+                            }
+                        }
+                        if (subtitle != null) {
+                            item {
+                                var modifier: Modifier =
+                                    Modifier.align(Alignment.Center).padding(subTitlePaddingValues)
+                                if (subtitleTestTag != null) {
+                                    modifier = modifier.testTag(subtitleTestTag)
+                                }
+                                AnnotatedText(
+                                    text = subtitle,
+                                    style =
+                                        MaterialTheme.typography.body2.copy(
+                                            color = MaterialTheme.colors.onSurfaceVariant
+                                        ),
+                                    modifier = modifier,
+                                    shouldCapitalize = true
+                                )
+                            }
+                        }
+
+                        content()
+                    }
+                    RequestFocusOnResume(focusRequester = focusRequester)
+                }
+            }
+        }
+    }
+}
+
+private fun ScalingLazyListScope.staticItem() {
+    /*
+    This empty item helps to ensure accurate scroll offset calculation. If auto centering is enabled
+    initial item's(first item for us) center matches the center of the screen. Scroll offset is 0 at
+    that point.
+
+    if auto centering is not enabled, initial item will start at the top of the screen with the
+    scroll offset equal to ScreenHeight/2 - scrollContentTopPadding - firstItemHeight/2.
+
+    We need to this offset value to properly move time text.That is the scroll-away offset of the
+    Time Text is equal to the scroll offset of the list at initial position.
+
+    It is easier to calculate if we know the values of ScreenHeight, ScrollContentTopPadding and
+    FirstItem's height. ScreenHeight and ScrollContentPadding are constants but height of the
+    FirstItem depends on the content. Instead of measuring the height, we can simplify the
+    calculation with an empty item with 0dp height.
+    */
+    item {}
+}
+
+@Composable
+private fun RequestFocusOnResume(focusRequester: FocusRequester) {
+    val lifecycleOwner = LocalLifecycleOwner.current
+    LaunchedEffect(Unit) {
+        lifecycleOwner.repeatOnLifecycle(state = Lifecycle.State.RESUMED) {
+            focusRequester.requestFocus()
+        }
+    }
+}
+
+internal fun dismiss(activity: Activity) {
+    if (activity is FragmentActivity) {
+        if (!activity.supportFragmentManager.popBackStackImmediate()) {
+            activity.finish()
+        }
+    } else {
+        activity.finish()
+    }
+}
+
+internal fun getBackStackEntryCount(activity: Activity): Int {
+    return if (activity is FragmentActivity) {
+        activity.supportFragmentManager.primaryNavigationFragment
+            ?.childFragmentManager
+            ?.backStackEntryCount ?: 0
+    } else {
+        0
+    }
+}
+
+internal fun Context.findActivity(): Activity {
+    var context = this
+    while (context is ContextWrapper) {
+        if (context is Activity) return context
+        context = context.baseContext
+    }
+    throw IllegalStateException("The screen should be called in the context of an Activity")
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ToggleChip.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ToggleChip.kt
new file mode 100644
index 0000000..bb1979c
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ToggleChip.kt
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.BoxScope
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.compositeOver
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.role
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.stateDescription
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.wear.compose.material.ChipDefaults
+import androidx.wear.compose.material.ContentAlpha
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.ToggleChip
+import androidx.wear.compose.material.ToggleChipColors
+import androidx.wear.compose.material.ToggleChipDefaults
+import androidx.wear.compose.material.contentColorFor
+import com.android.healthconnect.controller.R
+
+/**
+ * This component is an alternative to [ToggleChip], providing the following:
+ * - a convenient way of providing a label and a secondary label;
+ * - a convenient way of choosing the toggle control;
+ * - a convenient way of providing an icon and setting the icon to be mirrored in RTL mode;
+ */
+@Composable
+fun ToggleChip(
+    checked: Boolean,
+    onCheckedChanged: (Boolean) -> Unit,
+    label: String,
+    labelMaxLine: Int? = null,
+    toggleControl: ToggleChipToggleControl,
+    modifier: Modifier = Modifier,
+    icon: Any? = null,
+    iconColor: Color = Color.Unspecified,
+    iconRtlMode: IconRtlMode = IconRtlMode.Default,
+    secondaryLabel: String? = null,
+    secondaryLabelMaxLine: Int? = null,
+    colors: ToggleChipColors = ToggleChipDefaults.toggleChipColors(),
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
+) {
+    val hasSecondaryLabel = secondaryLabel != null
+
+    val labelParam: (@Composable RowScope.() -> Unit) = {
+        Text(
+            text = label,
+            modifier = Modifier.fillMaxWidth(),
+            textAlign = TextAlign.Start,
+            overflow = TextOverflow.Ellipsis,
+            maxLines = labelMaxLine ?: if (hasSecondaryLabel) 1 else 2,
+            style = MaterialTheme.typography.button
+        )
+    }
+
+    val secondaryLabelParam: (@Composable RowScope.() -> Unit)? =
+        secondaryLabel?.let {
+            {
+                Text(
+                    text = secondaryLabel,
+                    overflow = TextOverflow.Ellipsis,
+                    maxLines = secondaryLabelMaxLine ?: 1,
+                    style = MaterialTheme.typography.caption2
+                )
+            }
+        }
+
+    val toggleControlParam: (@Composable () -> Unit) = {
+        Icon(
+            imageVector =
+                when (toggleControl) {
+                    ToggleChipToggleControl.Switch -> ToggleChipDefaults.switchIcon(checked)
+                    ToggleChipToggleControl.Radio -> ToggleChipDefaults.radioIcon(checked)
+                    ToggleChipToggleControl.Checkbox -> ToggleChipDefaults.checkboxIcon(checked)
+                },
+            contentDescription = null,
+            // This potentially be removed once this issue is addressed:
+            // https://issuetracker.google.com/issues/287087138
+            rtlMode =
+                if (toggleControl == ToggleChipToggleControl.Switch) {
+                    IconRtlMode.Mirrored
+                } else {
+                    IconRtlMode.Default
+                }
+        )
+    }
+
+    val iconParam: (@Composable BoxScope.() -> Unit)? =
+        icon?.let {
+            {
+                Row {
+                    Icon(
+                        icon = icon,
+                        tint = iconColor,
+                        contentDescription = null,
+                        modifier = Modifier.size(ChipDefaults.IconSize).clip(CircleShape),
+                        rtlMode = iconRtlMode
+                    )
+                }
+            }
+        }
+
+    val semanticsRole =
+        when (toggleControl) {
+            ToggleChipToggleControl.Switch -> Role.Switch
+            ToggleChipToggleControl.Radio -> Role.RadioButton
+            ToggleChipToggleControl.Checkbox -> Role.Checkbox
+        }
+
+    val stateDescriptionSemantics =
+        stringResource(
+            if (checked) {
+                R.string.on
+            } else {
+                R.string.off
+            }
+        )
+    ToggleChip(
+        checked = checked,
+        onCheckedChange = onCheckedChanged,
+        label = labelParam,
+        toggleControl = toggleControlParam,
+        modifier =
+            modifier.fillMaxWidth().semantics {
+                role = semanticsRole
+                stateDescription = stateDescriptionSemantics
+            },
+        appIcon = iconParam,
+        secondaryLabel = secondaryLabelParam,
+        colors = colors,
+        enabled = enabled,
+        interactionSource = interactionSource
+    )
+}
+
+/**
+ * ToggleChipColors that disabled alpha is applied based on [ToggleChipDefaults.toggleChipColors()].
+ * It is used for a ToggleChip which would like to respond to click events, meanwhile it seems
+ * disabled.
+ */
+@Composable
+fun toggleChipDisabledColors(): ToggleChipColors {
+    val checkedStartBackgroundColor =
+        MaterialTheme.colors.surface.copy(alpha = 0f).compositeOver(MaterialTheme.colors.surface)
+    val checkedEndBackgroundColor =
+        MaterialTheme.colors.primary.copy(alpha = 0.5f).compositeOver(MaterialTheme.colors.surface)
+    val checkedContentColor = MaterialTheme.colors.onSurface
+    val checkedSecondaryContentColor = MaterialTheme.colors.onSurfaceVariant
+    val checkedToggleControlColor = MaterialTheme.colors.secondary
+    val uncheckedStartBackgroundColor = MaterialTheme.colors.surface
+    val uncheckedEndBackgroundColor = uncheckedStartBackgroundColor
+    val uncheckedContentColor = contentColorFor(checkedEndBackgroundColor)
+    val uncheckedSecondaryContentColor = uncheckedContentColor
+    val uncheckedToggleControlColor = uncheckedContentColor
+
+    return ToggleChipDefaults.toggleChipColors(
+        checkedStartBackgroundColor =
+            checkedStartBackgroundColor.copy(alpha = ContentAlpha.disabled),
+        checkedEndBackgroundColor = checkedEndBackgroundColor.copy(alpha = ContentAlpha.disabled),
+        checkedContentColor = checkedContentColor.copy(alpha = ContentAlpha.disabled),
+        checkedSecondaryContentColor =
+            checkedSecondaryContentColor.copy(alpha = ContentAlpha.disabled),
+        checkedToggleControlColor = checkedToggleControlColor.copy(alpha = ContentAlpha.disabled),
+        uncheckedStartBackgroundColor =
+            uncheckedStartBackgroundColor.copy(alpha = ContentAlpha.disabled),
+        uncheckedEndBackgroundColor =
+            uncheckedEndBackgroundColor.copy(alpha = ContentAlpha.disabled),
+        uncheckedContentColor = uncheckedContentColor.copy(alpha = ContentAlpha.disabled),
+        uncheckedSecondaryContentColor =
+            uncheckedSecondaryContentColor.copy(alpha = ContentAlpha.disabled),
+        uncheckedToggleControlColor =
+            uncheckedToggleControlColor.copy(alpha = ContentAlpha.disabled)
+    )
+}
+
+/**
+ * ToggleChipColors that theme background color is applied based on
+ * [ToggleChipDefaults.toggleChipColors()]. It is used for a ToggleChip having the same background
+ * color of the screen.
+ */
+@Composable
+fun toggleChipBackgroundColors(): ToggleChipColors {
+    val checkedStartBackgroundColor =
+        MaterialTheme.colors.background
+            .copy(alpha = 0f)
+            .compositeOver(MaterialTheme.colors.background)
+    val checkedEndBackgroundColor =
+        MaterialTheme.colors.primary
+            .copy(alpha = 0.5f)
+            .compositeOver(MaterialTheme.colors.background)
+    val checkedContentColor = MaterialTheme.colors.onBackground
+    val checkedSecondaryContentColor = MaterialTheme.colors.onSurfaceVariant
+    val checkedToggleControlColor = MaterialTheme.colors.secondary
+    val uncheckedStartBackgroundColor = MaterialTheme.colors.background
+    val uncheckedEndBackgroundColor = uncheckedStartBackgroundColor
+    val uncheckedContentColor = contentColorFor(checkedEndBackgroundColor)
+    val uncheckedSecondaryContentColor = uncheckedContentColor
+    val uncheckedToggleControlColor = uncheckedContentColor
+
+    return ToggleChipDefaults.toggleChipColors(
+        checkedStartBackgroundColor = checkedStartBackgroundColor,
+        checkedEndBackgroundColor = checkedEndBackgroundColor,
+        checkedContentColor = checkedContentColor,
+        checkedSecondaryContentColor = checkedSecondaryContentColor,
+        checkedToggleControlColor = checkedToggleControlColor,
+        uncheckedStartBackgroundColor = uncheckedStartBackgroundColor,
+        uncheckedEndBackgroundColor = uncheckedEndBackgroundColor,
+        uncheckedContentColor = uncheckedContentColor,
+        uncheckedSecondaryContentColor = uncheckedSecondaryContentColor,
+        uncheckedToggleControlColor = uncheckedToggleControlColor
+    )
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ToggleChipToggleControl.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ToggleChipToggleControl.kt
new file mode 100644
index 0000000..3b596d9
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/ToggleChipToggleControl.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements
+
+public enum class ToggleChipToggleControl {
+    Switch,
+    Radio,
+    Checkbox
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/layout/ScalingLazyColumnDefaults.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/layout/ScalingLazyColumnDefaults.kt
new file mode 100644
index 0000000..469ffed
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/layout/ScalingLazyColumnDefaults.kt
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("ObjectLiteralToLambda")
+
+package com.android.healthconnect.controller.permissions.request.wear.elements.layout
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.times
+import androidx.compose.ui.util.lerp
+import androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults
+import androidx.wear.compose.foundation.lazy.ScalingLazyListAnchorType
+import androidx.wear.compose.foundation.lazy.ScalingParams
+import androidx.wear.compose.material.ChipDefaults
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.ScalingLazyColumnState.RotaryMode
+import kotlin.math.sqrt
+
+// This file's content is copied from ScalingLazyColumnDefaults.kt from Horologist (go/horologist),
+// remove it once after wear compose supports large screen dialogs.
+
+/** Default layouts for ScalingLazyColumnState, based on UX guidance. */
+object ScalingLazyColumnDefaults {
+
+    /**
+     * Creates a Responsive layout for ScalingLazyColumn. The first and last items will scroll just
+     * onto screen at full size, assuming rounded corners of a Chip.
+     *
+     * @param firstItemIsFullWidth set to false if the first item is small enough to fit at the top,
+     *   however it may be scaled.
+     * @param additionalPaddingAtBottom additional padding at end of content to avoid problem items
+     *   clipping
+     * @param verticalArrangement the ScalingLazyColumn verticalArrangement.
+     * @param horizontalPaddingPercent the amount of horizontal padding as a percent.
+     * @param rotaryMode the rotary handling, such as Fling or Snap.
+     * @param hapticsEnabled whether haptics are enabled.
+     * @param reverseLayout whether to start at the bottom.
+     * @param userScrollEnabled whether to allow user to scroll.
+     */
+    //    @Deprecated("Replaced by rememberResponsiveColumnState")
+
+    fun responsive(
+        firstItemIsFullWidth: Boolean = true,
+        additionalPaddingAtBottom: Dp = 10.dp,
+        verticalArrangement: Arrangement.Vertical =
+            Arrangement.spacedBy(
+                space = 4.dp,
+                alignment = Alignment.Top,
+            ),
+        horizontalPaddingPercent: Float = 0.052f,
+        rotaryMode: RotaryMode? = RotaryMode.Scroll,
+        hapticsEnabled: Boolean = true,
+        reverseLayout: Boolean = false,
+        userScrollEnabled: Boolean = true,
+    ): ScalingLazyColumnState.Factory {
+        return object : ScalingLazyColumnState.Factory {
+            @Composable
+            override fun create(): ScalingLazyColumnState {
+                val density = LocalDensity.current
+                val configuration = LocalConfiguration.current
+                val screenWidthDp = configuration.screenWidthDp.toFloat()
+                val screenHeightDp = configuration.screenHeightDp.toFloat()
+
+                return remember {
+                    val padding = screenWidthDp * horizontalPaddingPercent
+                    val topPaddingDp: Dp =
+                        if (firstItemIsFullWidth && configuration.isScreenRound) {
+                            calculateVerticalOffsetForChip(screenWidthDp, horizontalPaddingPercent)
+                        } else {
+                            32.dp
+                        }
+                    val bottomPaddingDp: Dp =
+                        if (configuration.isScreenRound) {
+                            calculateVerticalOffsetForChip(
+                                screenWidthDp,
+                                horizontalPaddingPercent,
+                            ) + additionalPaddingAtBottom
+                        } else {
+                            0.dp
+                        }
+                    val contentPadding =
+                        PaddingValues(
+                            start = padding.dp,
+                            end = padding.dp,
+                            top = topPaddingDp,
+                            bottom = bottomPaddingDp,
+                        )
+
+                    val scalingParams = responsiveScalingParams(screenWidthDp)
+
+                    val screenHeightPx = with(density) { screenHeightDp.dp.roundToPx() }
+                    val topPaddingPx = with(density) { topPaddingDp.roundToPx() }
+                    val topScreenOffsetPx = screenHeightPx / 2 - topPaddingPx
+
+                    val initialScrollPosition =
+                        ScalingLazyColumnState.ScrollPosition(
+                            index = 0,
+                            offsetPx = topScreenOffsetPx,
+                        )
+                    ScalingLazyColumnState(
+                        initialScrollPosition = initialScrollPosition,
+                        autoCentering = null,
+                        anchorType = ScalingLazyListAnchorType.ItemStart,
+                        rotaryMode = rotaryMode,
+                        verticalArrangement = verticalArrangement,
+                        horizontalAlignment = Alignment.CenterHorizontally,
+                        contentPadding = contentPadding,
+                        scalingParams = scalingParams,
+                        hapticsEnabled = hapticsEnabled,
+                        reverseLayout = reverseLayout,
+                        userScrollEnabled = userScrollEnabled,
+                    )
+                }
+            }
+        }
+    }
+
+    internal fun calculateVerticalOffsetForChip(
+        viewportDiameter: Float,
+        horizontalPaddingPercent: Float,
+    ): Dp {
+        val childViewHeight: Float = ChipDefaults.Height.value
+        val childViewWidth: Float = viewportDiameter * (1.0f - (2f * horizontalPaddingPercent))
+        val radius = viewportDiameter / 2f
+        return (radius -
+                sqrt(
+                    (radius - childViewHeight + childViewWidth * 0.5f) *
+                        (radius - childViewWidth * 0.5f),
+                ) -
+                childViewHeight * 0.5f)
+            .dp
+    }
+
+    fun responsiveScalingParams(screenWidthDp: Float): ScalingParams {
+        val sizeRatio = ((screenWidthDp - 192) / (233 - 192).toFloat()).coerceIn(0f, 1.5f)
+        val presetRatio = 0f
+
+        val minElementHeight = lerp(0.2f, 0.157f, sizeRatio)
+        val maxElementHeight = lerp(0.6f, 0.472f, sizeRatio).coerceAtLeast(minElementHeight)
+        val minTransitionArea = lerp(0.35f, lerp(0.35f, 0.393f, presetRatio), sizeRatio)
+        val maxTransitionArea = lerp(0.55f, lerp(0.55f, 0.593f, presetRatio), sizeRatio)
+
+        val scalingParams =
+            ScalingLazyColumnDefaults.scalingParams(
+                minElementHeight = minElementHeight,
+                maxElementHeight = maxElementHeight,
+                minTransitionArea = minTransitionArea,
+                maxTransitionArea = maxTransitionArea,
+            )
+        return scalingParams
+    }
+
+    internal val Padding12Pct = 0.1248f
+    internal val Padding16Pct = 0.1664f
+    internal val Padding20Pct = 0.2083f
+    internal val Padding21Pct = 0.2188f
+    internal val Padding31Pct = 0.3646f
+
+    enum class ItemType(
+        val topPaddingDp: Float,
+        val bottomPaddingDp: Float,
+        val paddingCorrection: Dp = 0.dp,
+    ) {
+        Card(Padding21Pct, Padding31Pct),
+        Chip(Padding21Pct, Padding31Pct),
+        CompactChip(
+            topPaddingDp = Padding12Pct,
+            bottomPaddingDp = Padding20Pct,
+            paddingCorrection = (-8).dp,
+        ),
+        Icon(Padding12Pct, Padding21Pct),
+        MultiButton(Padding21Pct, Padding20Pct),
+        SingleButton(Padding12Pct, Padding20Pct),
+        Text(Padding21Pct, Padding31Pct),
+        Unspecified(0f, 0f),
+    }
+
+    @Composable
+    fun padding(
+        first: ItemType = ItemType.Unspecified,
+        last: ItemType = ItemType.Unspecified,
+        horizontalPercent: Float = 0.052f,
+    ): @Composable () -> PaddingValues {
+        val configuration = LocalConfiguration.current
+        val screenWidthDp = configuration.screenWidthDp.toFloat()
+        val screenHeightDp = configuration.screenHeightDp.toFloat()
+
+        return {
+            val height = screenHeightDp.dp
+            val horizontalPadding = screenWidthDp.dp * horizontalPercent
+
+            val topPadding =
+                if (first != ItemType.Unspecified) {
+                    first.topPaddingDp * height + first.paddingCorrection
+                } else {
+                    if (configuration.isScreenRound) {
+                        calculateVerticalOffsetForChip(screenWidthDp, horizontalPercent)
+                    } else {
+                        32.dp
+                    }
+                }
+
+            val bottomPadding =
+                if (last != ItemType.Unspecified) {
+                    last.bottomPaddingDp * height + first.paddingCorrection
+                } else {
+                    if (configuration.isScreenRound) {
+                        calculateVerticalOffsetForChip(
+                            screenWidthDp,
+                            horizontalPercent,
+                        ) + 10.dp
+                    } else {
+                        0.dp
+                    }
+                }
+
+            PaddingValues(
+                top = topPadding,
+                bottom = bottomPadding,
+                start = horizontalPadding,
+                end = horizontalPadding,
+            )
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/layout/ScalingLazyColumnState.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/layout/ScalingLazyColumnState.kt
new file mode 100644
index 0000000..bb9467d
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/layout/ScalingLazyColumnState.kt
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("ObjectLiteralToLambda")
+@file:OptIn(ExperimentalWearFoundationApi::class)
+
+package com.android.healthconnect.controller.permissions.request.wear.elements.layout
+
+import androidx.compose.foundation.MutatePriority
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.ScrollScope
+import androidx.compose.foundation.gestures.ScrollableDefaults
+import androidx.compose.foundation.gestures.ScrollableState
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.foundation.ExperimentalWearFoundationApi
+import androidx.wear.compose.foundation.lazy.AutoCenteringParams
+import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
+import androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults as WearScalingLazyColumnDefaults
+import androidx.wear.compose.foundation.lazy.ScalingLazyListAnchorType
+import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
+import androidx.wear.compose.foundation.lazy.ScalingLazyListState
+import androidx.wear.compose.foundation.lazy.ScalingParams
+import androidx.wear.compose.foundation.rememberActiveFocusRequester
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.ScalingLazyColumnDefaults.responsiveScalingParams
+import com.android.healthconnect.controller.permissions.request.wear.elements.layout.ScalingLazyColumnState.RotaryMode
+import com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput.rememberDisabledHaptic
+import com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput.rememberRotaryHapticHandler
+import com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput.rotaryWithScroll
+import com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput.rotaryWithSnap
+import com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput.toRotaryScrollAdapter
+
+// This file is a copy of ScalingLazyColumnState.kt from Horologist (go/horologist),
+// remove it once after wear compose supports large screen dialogs.
+
+/**
+ * A Config and State object wrapping up all configuration for a [ScalingLazyColumn]. This allows
+ * defaults such as [ScalingLazyColumnDefaults.responsive].
+ */
+class ScalingLazyColumnState(
+    val initialScrollPosition: ScrollPosition = ScrollPosition(1, 0),
+    val autoCentering: AutoCenteringParams? =
+        AutoCenteringParams(
+            initialScrollPosition.index,
+            initialScrollPosition.offsetPx,
+        ),
+    val anchorType: ScalingLazyListAnchorType = ScalingLazyListAnchorType.ItemCenter,
+    val contentPadding: PaddingValues = PaddingValues(horizontal = 10.dp),
+    val rotaryMode: RotaryMode? = RotaryMode.Scroll,
+    val reverseLayout: Boolean = false,
+    val verticalArrangement: Arrangement.Vertical =
+        Arrangement.spacedBy(
+            space = 4.dp,
+            alignment = if (!reverseLayout) Alignment.Top else Alignment.Bottom,
+        ),
+    val horizontalAlignment: Alignment.Horizontal = Alignment.CenterHorizontally,
+    val flingBehavior: FlingBehavior? = null,
+    val userScrollEnabled: Boolean = true,
+    val scalingParams: ScalingParams = WearScalingLazyColumnDefaults.scalingParams(),
+    val hapticsEnabled: Boolean = true,
+) : ScrollableState {
+    private var _state: ScalingLazyListState? = null
+    var state: ScalingLazyListState
+        get() {
+            if (_state == null) {
+                _state =
+                    ScalingLazyListState(
+                        initialScrollPosition.index,
+                        initialScrollPosition.offsetPx,
+                    )
+            }
+            return _state!!
+        }
+        set(value) {
+            _state = value
+        }
+
+    override val canScrollBackward: Boolean
+        get() = state.canScrollBackward
+
+    override val canScrollForward: Boolean
+        get() = state.canScrollForward
+
+    override val isScrollInProgress: Boolean
+        get() = state.isScrollInProgress
+
+    override fun dispatchRawDelta(delta: Float): Float = state.dispatchRawDelta(delta)
+
+    override suspend fun scroll(
+        scrollPriority: MutatePriority,
+        block: suspend ScrollScope.() -> Unit,
+    ) {
+        state.scroll(scrollPriority, block)
+    }
+
+    sealed interface RotaryMode {
+        data object Snap : RotaryMode
+
+        data object Scroll : RotaryMode
+    }
+
+    data class ScrollPosition(
+        val index: Int,
+        val offsetPx: Int,
+    )
+
+    fun interface Factory {
+        @Composable fun create(): ScalingLazyColumnState
+    }
+}
+
+// @Deprecated("Replaced by rememberResponsiveColumnState")
+@Composable
+fun rememberColumnState(
+    factory: ScalingLazyColumnState.Factory = ScalingLazyColumnDefaults.responsive(),
+): ScalingLazyColumnState {
+    val columnState = factory.create()
+
+    columnState.state = rememberSaveable(saver = ScalingLazyListState.Saver) { columnState.state }
+
+    return columnState
+}
+
+@Composable
+fun rememberResponsiveColumnState(
+    contentPadding: @Composable () -> PaddingValues =
+        ScalingLazyColumnDefaults.padding(
+            first = ScalingLazyColumnDefaults.ItemType.Unspecified,
+            last = ScalingLazyColumnDefaults.ItemType.Unspecified,
+        ),
+    verticalArrangement: Arrangement.Vertical =
+        Arrangement.spacedBy(
+            space = 4.dp,
+            alignment = Alignment.Top,
+        ),
+    rotaryMode: RotaryMode? = RotaryMode.Scroll,
+    hapticsEnabled: Boolean = true,
+    reverseLayout: Boolean = false,
+    userScrollEnabled: Boolean = true,
+): ScalingLazyColumnState {
+    val density = LocalDensity.current
+    val configuration = LocalConfiguration.current
+    val screenWidthDp = configuration.screenWidthDp.toFloat()
+    val screenHeightDp = configuration.screenHeightDp.toFloat()
+
+    val scalingParams = responsiveScalingParams(screenWidthDp)
+
+    val contentPaddingCalculated = contentPadding()
+
+    val screenHeightPx = with(density) { screenHeightDp.dp.roundToPx() }
+    val topPaddingPx = with(density) { contentPaddingCalculated.calculateTopPadding().roundToPx() }
+    val topScreenOffsetPx = screenHeightPx / 2 - topPaddingPx
+
+    val initialScrollPosition =
+        ScalingLazyColumnState.ScrollPosition(
+            index = 0,
+            offsetPx = topScreenOffsetPx,
+        )
+
+    val columnState =
+        ScalingLazyColumnState(
+            initialScrollPosition = initialScrollPosition,
+            autoCentering = null,
+            anchorType = ScalingLazyListAnchorType.ItemStart,
+            rotaryMode = rotaryMode,
+            verticalArrangement = verticalArrangement,
+            horizontalAlignment = Alignment.CenterHorizontally,
+            contentPadding = contentPaddingCalculated,
+            scalingParams = scalingParams,
+            hapticsEnabled = hapticsEnabled,
+            reverseLayout = reverseLayout,
+            userScrollEnabled = userScrollEnabled,
+        )
+
+    columnState.state = rememberSaveable(saver = ScalingLazyListState.Saver) { columnState.state }
+
+    return columnState
+}
+
+@Composable
+fun ScalingLazyColumn(
+    columnState: ScalingLazyColumnState,
+    modifier: Modifier = Modifier,
+    content: ScalingLazyListScope.() -> Unit,
+) {
+    val focusRequester = rememberActiveFocusRequester()
+
+    val rotaryHaptics =
+        if (columnState.hapticsEnabled) {
+            rememberRotaryHapticHandler(columnState.state)
+        } else {
+            rememberDisabledHaptic()
+        }
+
+    val modifierWithRotary =
+        when (columnState.rotaryMode) {
+            RotaryMode.Snap ->
+                modifier.rotaryWithSnap(
+                    focusRequester = focusRequester,
+                    rotaryScrollAdapter = columnState.state.toRotaryScrollAdapter(),
+                    reverseDirection = columnState.reverseLayout,
+                    rotaryHaptics = rotaryHaptics,
+                )
+            RotaryMode.Scroll ->
+                modifier.rotaryWithScroll(
+                    focusRequester = focusRequester,
+                    scrollableState = columnState.state,
+                    reverseDirection = columnState.reverseLayout,
+                    rotaryHaptics = rotaryHaptics,
+                )
+            else -> modifier
+        }
+
+    ScalingLazyColumn(
+        modifier = modifierWithRotary.fillMaxSize(),
+        state = columnState.state,
+        contentPadding = columnState.contentPadding,
+        reverseLayout = columnState.reverseLayout,
+        verticalArrangement = columnState.verticalArrangement,
+        horizontalAlignment = columnState.horizontalAlignment,
+        flingBehavior = columnState.flingBehavior ?: ScrollableDefaults.flingBehavior(),
+        userScrollEnabled = columnState.userScrollEnabled,
+        scalingParams = columnState.scalingParams,
+        anchorType = columnState.anchorType,
+        autoCentering = columnState.autoCentering,
+        content = content,
+    )
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/Haptics.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/Haptics.kt
new file mode 100644
index 0000000..2384912
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/Haptics.kt
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput
+
+import android.os.Build
+import android.view.View
+import androidx.compose.foundation.gestures.ScrollableState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalView
+import kotlin.math.abs
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.channels.BufferOverflow
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.conflate
+import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.receiveAsFlow
+import kotlinx.coroutines.withContext
+
+// This file is a copy of Haptics.kt from Horologist (go/horologist),
+// remove it once Wear Compose 1.4 is landed (b/325560444).
+
+private const val DEBUG = false
+
+/** Debug logging that can be enabled. */
+private inline fun debugLog(generateMsg: () -> String) {
+    if (DEBUG) {
+        println("RotaryHaptics: ${generateMsg()}")
+    }
+}
+
+/**
+ * Throttling events within specified timeframe. Only first and last events will be received. For a
+ * flow emitting elements 1 to 30, with a 100ms delay between them:
+ * ```
+ * val flow = flow {
+ *     for (i in 1..30) {
+ *         delay(100)
+ *         emit(i)
+ *     }
+ * }
+ * ```
+ *
+ * With timeframe=1000 only those integers will be received: 1, 10, 20, 30 .
+ */
+internal fun <T> Flow<T>.throttleLatest(timeframe: Long): Flow<T> = flow {
+    conflate().collect {
+        emit(it)
+        delay(timeframe)
+    }
+}
+
+/** Handles haptics for rotary usage */
+interface RotaryHapticHandler {
+
+    /** Handles haptics when scroll is used */
+    fun handleScrollHaptic(scrollDelta: Float)
+
+    /** Handles haptics when scroll with snap is used */
+    fun handleSnapHaptic(scrollDelta: Float)
+}
+
+/**
+ * Default implementation of [RotaryHapticHandler]. It handles haptic feedback based on the
+ * [scrollableState], scrolled pixels and [hapticsThresholdPx]. Haptic is not fired in this class,
+ * instead it's sent to [hapticsChannel] where it'll performed later.
+ *
+ * @param scrollableState Haptic performed based on this state
+ * @param hapticsChannel Channel to which haptic events will be sent
+ * @param hapticsThresholdPx A scroll threshold after which haptic is produced.
+ */
+class DefaultRotaryHapticHandler(
+    private val scrollableState: ScrollableState,
+    private val hapticsChannel: Channel<RotaryHapticsType>,
+    private val hapticsThresholdPx: Long = 50,
+) : RotaryHapticHandler {
+
+    private var overscrollHapticTriggered = false
+    private var currScrollPosition = 0f
+    private var prevHapticsPosition = 0f
+
+    override fun handleScrollHaptic(scrollDelta: Float) {
+        if (
+            (scrollDelta > 0 && !scrollableState.canScrollForward) ||
+                (scrollDelta < 0 && !scrollableState.canScrollBackward)
+        ) {
+            if (!overscrollHapticTriggered) {
+                trySendHaptic(RotaryHapticsType.ScrollLimit)
+                overscrollHapticTriggered = true
+            }
+        } else {
+            overscrollHapticTriggered = false
+            currScrollPosition += scrollDelta
+            val diff = abs(currScrollPosition - prevHapticsPosition)
+
+            if (diff >= hapticsThresholdPx) {
+                trySendHaptic(RotaryHapticsType.ScrollTick)
+                prevHapticsPosition = currScrollPosition
+            }
+        }
+    }
+
+    override fun handleSnapHaptic(scrollDelta: Float) {
+        if (
+            (scrollDelta > 0 && !scrollableState.canScrollForward) ||
+                (scrollDelta < 0 && !scrollableState.canScrollBackward)
+        ) {
+            if (!overscrollHapticTriggered) {
+                trySendHaptic(RotaryHapticsType.ScrollLimit)
+                overscrollHapticTriggered = true
+            }
+        } else {
+            overscrollHapticTriggered = false
+            trySendHaptic(RotaryHapticsType.ScrollItemFocus)
+        }
+    }
+
+    private fun trySendHaptic(rotaryHapticsType: RotaryHapticsType) {
+        // Ok to ignore the ChannelResult because we default to capacity = 2 and DROP_OLDEST
+        @Suppress("UNUSED_VARIABLE") val unused = hapticsChannel.trySend(rotaryHapticsType)
+    }
+}
+
+/** Interface for Rotary haptic feedback */
+interface RotaryHapticFeedback {
+    fun performHapticFeedback(type: RotaryHapticsType)
+}
+
+/** Rotary haptic types */
+@JvmInline
+value class RotaryHapticsType(private val type: Int) {
+    companion object {
+        /**
+         * A scroll ticking haptic. Similar to texture haptic - performed each time when a
+         * scrollable content is scrolled by a certain distance
+         */
+        val ScrollTick: RotaryHapticsType = RotaryHapticsType(1)
+
+        /**
+         * An item focus (snap) haptic. Performed when a scrollable content is snapped to a specific
+         * item.
+         */
+        val ScrollItemFocus: RotaryHapticsType = RotaryHapticsType(2)
+
+        /**
+         * A limit(overscroll) haptic. Performed when a list reaches the limit (start or end) and
+         * can't scroll further
+         */
+        val ScrollLimit: RotaryHapticsType = RotaryHapticsType(3)
+    }
+}
+
+/** Remember disabled haptics handler */
+@Composable
+fun rememberDisabledHaptic(): RotaryHapticHandler = remember {
+    object : RotaryHapticHandler {
+
+        override fun handleScrollHaptic(scrollDelta: Float) {
+            // Do nothing
+        }
+
+        override fun handleSnapHaptic(scrollDelta: Float) {
+            // Do nothing
+        }
+    }
+}
+
+/**
+ * Remember rotary haptic handler.
+ *
+ * @param scrollableState A scrollableState, used to determine whether the end of the scrollable was
+ *   reached or not.
+ * @param throttleThresholdMs Throttling events within specified timeframe. Only first and last
+ *   events will be received. Check [throttleLatest] for more info.
+ * @param hapticsThresholdPx A scroll threshold after which haptic is produced.
+ * @param hapticsChannel Channel to which haptic events will be sent
+ * @param rotaryHaptics Interface for Rotary haptic feedback which performs haptics
+ */
+@Composable
+fun rememberRotaryHapticHandler(
+    scrollableState: ScrollableState,
+    throttleThresholdMs: Long = 30,
+    hapticsThresholdPx: Long = 50,
+    hapticsChannel: Channel<RotaryHapticsType> = rememberHapticChannel(),
+    rotaryHaptics: RotaryHapticFeedback = rememberDefaultRotaryHapticFeedback(),
+): RotaryHapticHandler {
+    return remember(scrollableState, hapticsChannel, rotaryHaptics) {
+            DefaultRotaryHapticHandler(scrollableState, hapticsChannel, hapticsThresholdPx)
+        }
+        .apply {
+            LaunchedEffect(hapticsChannel) {
+                hapticsChannel.receiveAsFlow().throttleLatest(throttleThresholdMs).collect {
+                    hapticType ->
+                    // 'withContext' launches performHapticFeedback in a separate thread,
+                    // as otherwise it produces a visible lag (b/219776664)
+                    val currentTime = System.currentTimeMillis()
+                    debugLog { "Haptics started" }
+                    withContext(Dispatchers.Default) {
+                        debugLog {
+                            "Performing haptics, delay: " +
+                                "${System.currentTimeMillis() - currentTime}"
+                        }
+                        rotaryHaptics.performHapticFeedback(hapticType)
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+private fun rememberHapticChannel() = remember {
+    Channel<RotaryHapticsType>(
+        capacity = 2,
+        onBufferOverflow = BufferOverflow.DROP_OLDEST,
+    )
+}
+
+@Composable
+public fun rememberDefaultRotaryHapticFeedback(): RotaryHapticFeedback =
+    LocalView.current.let { view -> remember { findDeviceSpecificHapticFeedback(view) } }
+
+internal fun findDeviceSpecificHapticFeedback(view: View): RotaryHapticFeedback =
+    if (isSamsungWatch()) {
+        SamsungWatchHapticFeedback(view)
+    } else {
+        DefaultRotaryHapticFeedback(view)
+    }
+
+/** Default Rotary implementation for [RotaryHapticFeedback] */
+class DefaultRotaryHapticFeedback(private val view: View) : RotaryHapticFeedback {
+
+    override fun performHapticFeedback(
+        type: RotaryHapticsType,
+    ) {
+        when (type) {
+            RotaryHapticsType.ScrollItemFocus -> {
+                view.performHapticFeedback(SCROLL_ITEM_FOCUS)
+            }
+            RotaryHapticsType.ScrollTick -> {
+                view.performHapticFeedback(SCROLL_TICK)
+            }
+            RotaryHapticsType.ScrollLimit -> {
+                view.performHapticFeedback(SCROLL_LIMIT)
+            }
+        }
+    }
+
+    private companion object {
+        // Hidden constants from HapticFeedbackConstants
+        const val SCROLL_TICK: Int = 18
+        const val SCROLL_ITEM_FOCUS: Int = 19
+        const val SCROLL_LIMIT: Int = 20
+    }
+}
+
+/** Implementation of [RotaryHapticFeedback] for Samsung devices */
+private class SamsungWatchHapticFeedback(private val view: View) : RotaryHapticFeedback {
+    override fun performHapticFeedback(
+        type: RotaryHapticsType,
+    ) {
+        when (type) {
+            RotaryHapticsType.ScrollItemFocus -> {
+                view.performHapticFeedback(102)
+            }
+            RotaryHapticsType.ScrollTick -> {
+                view.performHapticFeedback(102)
+            }
+            RotaryHapticsType.ScrollLimit -> {
+                view.performHapticFeedback(50107)
+            }
+        }
+    }
+}
+
+private fun isSamsungWatch(): Boolean = Build.MANUFACTURER.contains("Samsung", ignoreCase = true)
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/Rotary.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/Rotary.kt
new file mode 100644
index 0000000..03f135d
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/Rotary.kt
@@ -0,0 +1,1232 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput
+
+import android.view.ViewConfiguration
+import androidx.compose.animation.core.AnimationState
+import androidx.compose.animation.core.CubicBezierEasing
+import androidx.compose.animation.core.Easing
+import androidx.compose.animation.core.FastOutSlowInEasing
+import androidx.compose.animation.core.SpringSpec
+import androidx.compose.animation.core.animateTo
+import androidx.compose.animation.core.copy
+import androidx.compose.animation.core.spring
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.MutatePriority
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.ScrollableDefaults
+import androidx.compose.foundation.gestures.ScrollableState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.snapshots.Snapshot
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.rotary.RotaryInputModifierNode
+import androidx.compose.ui.input.rotary.RotaryScrollEvent
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.util.fastSumBy
+import androidx.compose.ui.util.lerp
+import androidx.wear.compose.foundation.ExperimentalWearFoundationApi
+import androidx.wear.compose.foundation.lazy.ScalingLazyListState
+import androidx.wear.compose.foundation.rememberActiveFocusRequester
+import kotlin.math.abs
+import kotlin.math.absoluteValue
+import kotlin.math.sign
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.receiveAsFlow
+import kotlinx.coroutines.flow.transformLatest
+import kotlinx.coroutines.launch
+
+// This file is a copy of Rotary.kt from Horologist (go/horologist),
+// remove it once Wear Compose 1.4 is landed (b/325560444).
+
+/**
+ * A modifier which connects rotary events with scrollable. This modifier supports scroll with
+ * fling.
+ *
+ * @param scrollableState Scrollable state which will be scrolled while receiving rotary events
+ * @param focusRequester Requests the focus for rotary input. By default comes from
+ *   [rememberActiveFocusRequester], which is used with [HierarchicalFocusCoordinator]
+ * @param flingBehavior Logic describing fling behavior. If null fling will not happen.
+ * @param rotaryHaptics Class which will handle haptic feedback
+ * @param reverseDirection Reverse the direction of scrolling. Should be aligned with Scrollable
+ *   `reverseDirection` parameter
+ */
+@OptIn(ExperimentalWearFoundationApi::class)
+@Suppress("ComposableModifierFactory")
+@Composable
+fun Modifier.rotaryWithScroll(
+    scrollableState: ScrollableState,
+    focusRequester: FocusRequester = rememberActiveFocusRequester(),
+    flingBehavior: FlingBehavior? = ScrollableDefaults.flingBehavior(),
+    rotaryHaptics: RotaryHapticHandler = rememberRotaryHapticHandler(scrollableState),
+    reverseDirection: Boolean = false,
+): Modifier =
+    rotaryHandler(
+            rotaryScrollHandler =
+                RotaryDefaults.rememberFlingHandler(scrollableState, flingBehavior),
+            reverseDirection = reverseDirection,
+            rotaryHaptics = rotaryHaptics,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "rotaryWithFling"
+                    properties["scrollableState"] = scrollableState
+                    properties["focusRequester"] = focusRequester
+                    properties["flingBehavior"] = flingBehavior
+                    properties["rotaryHaptics"] = rotaryHaptics
+                    properties["reverseDirection"] = reverseDirection
+                },
+        )
+        .focusRequester(focusRequester)
+        .focusable()
+
+/**
+ * A modifier which connects rotary events with scrollable. This modifier supports snap.
+ *
+ * @param focusRequester Requests the focus for rotary input. By default comes from
+ *   [rememberActiveFocusRequester], which is used with [HierarchicalFocusCoordinator]
+ * @param rotaryScrollAdapter A connection between scrollable objects and rotary events
+ * @param rotaryHaptics Class which will handle haptic feedback
+ * @param reverseDirection Reverse the direction of scrolling. Should be aligned with Scrollable
+ *   `reverseDirection` parameter
+ */
+@OptIn(ExperimentalWearFoundationApi::class)
+@Suppress("ComposableModifierFactory")
+@Composable
+fun Modifier.rotaryWithSnap(
+    rotaryScrollAdapter: RotaryScrollAdapter,
+    focusRequester: FocusRequester = rememberActiveFocusRequester(),
+    snapParameters: SnapParameters = RotaryDefaults.snapParametersDefault,
+    rotaryHaptics: RotaryHapticHandler =
+        rememberRotaryHapticHandler(rotaryScrollAdapter.scrollableState),
+    reverseDirection: Boolean = false,
+): Modifier =
+    rotaryHandler(
+            rotaryScrollHandler =
+                RotaryDefaults.rememberSnapHandler(rotaryScrollAdapter, snapParameters),
+            reverseDirection = reverseDirection,
+            rotaryHaptics = rotaryHaptics,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "rotaryWithFling"
+                    properties["rotaryScrollAdapter"] = rotaryScrollAdapter
+                    properties["focusRequester"] = focusRequester
+                    properties["snapParameters"] = snapParameters
+                    properties["rotaryHaptics"] = rotaryHaptics
+                    properties["reverseDirection"] = reverseDirection
+                },
+        )
+        .focusRequester(focusRequester)
+        .focusable()
+
+/** An extension function for creating [RotaryScrollAdapter] from [ScalingLazyListState] */
+@Composable
+fun ScalingLazyListState.toRotaryScrollAdapter(): RotaryScrollAdapter =
+    remember(this) { ScalingLazyColumnRotaryScrollAdapter(this) }
+
+/** An implementation of rotary scroll adapter for [ScalingLazyColumn] */
+class ScalingLazyColumnRotaryScrollAdapter(
+    override val scrollableState: ScalingLazyListState,
+) : RotaryScrollAdapter {
+
+    /** Calculates an average height of an item by taking an average from visible items height. */
+    override fun averageItemSize(): Float {
+        val visibleItems = scrollableState.layoutInfo.visibleItemsInfo
+        return (visibleItems.fastSumBy { it.unadjustedSize } / visibleItems.size).toFloat()
+    }
+
+    /** Current (centred) item index */
+    override fun currentItemIndex(): Int = scrollableState.centerItemIndex
+
+    /** An offset from the item centre */
+    override fun currentItemOffset(): Float = scrollableState.centerItemScrollOffset.toFloat()
+
+    /** The total count of items in ScalingLazyColumn */
+    override fun totalItemsCount(): Int = scrollableState.layoutInfo.totalItemsCount
+}
+
+/** An adapter which connects scrollableState to Rotary */
+interface RotaryScrollAdapter {
+
+    /** A scrollable state. Used for performing scroll when Rotary events received */
+    val scrollableState: ScrollableState
+
+    /** Average size of an item. Used for estimating the scrollable distance */
+    fun averageItemSize(): Float
+
+    /** A current item index. Used for scrolling */
+    fun currentItemIndex(): Int
+
+    /** An offset from the centre or the border of the current item. */
+    fun currentItemOffset(): Float
+
+    /** The total count of items in [scrollableState] */
+    fun totalItemsCount(): Int
+}
+
+/** Defaults for rotary modifiers */
+object RotaryDefaults {
+
+    /** Returns default [SnapParameters] */
+    val snapParametersDefault: SnapParameters =
+        SnapParameters(
+            snapOffset = 0,
+            thresholdDivider = 1.5f,
+            resistanceFactor = 3f,
+        )
+
+    /** Returns whether the input is Low-res (a bezel) or high-res(a crown/rsb). */
+    @Composable
+    fun isLowResInput(): Boolean =
+        LocalContext.current.packageManager.hasSystemFeature(
+            "android.hardware.rotaryencoder.lowres"
+        )
+
+    /**
+     * Handles scroll with fling.
+     *
+     * @param scrollableState Scrollable state which will be scrolled while receiving rotary events
+     * @param flingBehavior Logic describing Fling behavior. If null - fling will not happen
+     * @param isLowRes Whether the input is Low-res (a bezel) or high-res(a crown/rsb)
+     */
+    @Composable
+    internal fun rememberFlingHandler(
+        scrollableState: ScrollableState,
+        flingBehavior: FlingBehavior? = null,
+        isLowRes: Boolean = isLowResInput(),
+    ): RotaryScrollHandler {
+        val viewConfiguration = ViewConfiguration.get(LocalContext.current)
+
+        return remember(scrollableState, flingBehavior, isLowRes) {
+            // Remove unnecessary recompositions by disabling tracking of changes inside of
+            // this block. This algorithm properly reads all updated values and
+            // don't need recomposition when those values change.
+            Snapshot.withoutReadObservation {
+                debugLog { "isLowRes : $isLowRes" }
+                fun rotaryFlingBehavior() =
+                    flingBehavior?.run {
+                        RotaryFlingBehavior(
+                            scrollableState,
+                            flingBehavior,
+                            viewConfiguration,
+                            flingTimeframe =
+                                if (isLowRes) lowResFlingTimeframe else highResFlingTimeframe,
+                        )
+                    }
+
+                fun scrollBehavior() = RotaryScrollBehavior(scrollableState)
+
+                if (isLowRes) {
+                    LowResRotaryScrollHandler(
+                        rotaryFlingBehaviorFactory = { rotaryFlingBehavior() },
+                        scrollBehaviorFactory = { scrollBehavior() },
+                    )
+                } else {
+                    HighResRotaryScrollHandler(
+                        rotaryFlingBehaviorFactory = { rotaryFlingBehavior() },
+                        scrollBehaviorFactory = { scrollBehavior() },
+                    )
+                }
+            }
+        }
+    }
+
+    /**
+     * Handles scroll with snap
+     *
+     * @param rotaryScrollAdapter A connection between scrollable objects and rotary events
+     * @param snapParameters Snap parameters
+     */
+    @Composable
+    internal fun rememberSnapHandler(
+        rotaryScrollAdapter: RotaryScrollAdapter,
+        snapParameters: SnapParameters = snapParametersDefault,
+        isLowRes: Boolean = isLowResInput(),
+    ): RotaryScrollHandler {
+        return remember(rotaryScrollAdapter, snapParameters) {
+            // Remove unnecessary recompositions by disabling tracking of changes inside of
+            // this block. This algorithm properly reads all updated values and
+            // don't need recomposition when those values change.
+            Snapshot.withoutReadObservation {
+                debugLog { "isLowRes : $isLowRes" }
+                if (isLowRes) {
+                    LowResSnapHandler(
+                        snapBehaviourFactory = {
+                            RotarySnapBehavior(rotaryScrollAdapter, snapParameters)
+                        },
+                    )
+                } else {
+                    HighResSnapHandler(
+                        resistanceFactor = snapParameters.resistanceFactor,
+                        thresholdBehaviorFactory = {
+                            ThresholdBehavior(
+                                rotaryScrollAdapter,
+                                snapParameters.thresholdDivider,
+                            )
+                        },
+                        snapBehaviourFactory = {
+                            RotarySnapBehavior(rotaryScrollAdapter, snapParameters)
+                        },
+                        scrollBehaviourFactory = {
+                            RotaryScrollBehavior(rotaryScrollAdapter.scrollableState)
+                        },
+                    )
+                }
+            }
+        }
+    }
+
+    private val lowResFlingTimeframe: Long = 100L
+    private val highResFlingTimeframe: Long = 30L
+}
+
+/**
+ * Parameters used for snapping
+ *
+ * @param snapOffset an optional offset to be applied when snapping the item. After the snap the
+ *   snapped items offset will be [snapOffset].
+ */
+class SnapParameters(
+    val snapOffset: Int,
+    val thresholdDivider: Float,
+    val resistanceFactor: Float,
+) {
+    /** Returns a snapping offset in [Dp] */
+    @Composable
+    fun snapOffsetDp(): Dp {
+        return with(LocalDensity.current) { snapOffset.toDp() }
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || this::class != other::class) return false
+
+        other as SnapParameters
+
+        if (snapOffset != other.snapOffset) return false
+        if (thresholdDivider != other.thresholdDivider) return false
+        if (resistanceFactor != other.resistanceFactor) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = snapOffset
+        result = 31 * result + thresholdDivider.hashCode()
+        result = 31 * result + resistanceFactor.hashCode()
+        return result
+    }
+}
+
+/** An interface for handling scroll events */
+internal interface RotaryScrollHandler {
+    /**
+     * Handles scrolling events
+     *
+     * @param coroutineScope A scope for performing async actions
+     * @param event A scrollable event from rotary input, containing scrollable delta and timestamp
+     * @param rotaryHaptics
+     */
+    suspend fun handleScrollEvent(
+        coroutineScope: CoroutineScope,
+        event: TimestampedDelta,
+        rotaryHaptics: RotaryHapticHandler,
+    )
+}
+
+/**
+ * Class responsible for Fling behaviour with rotary. It tracks and produces the fling when
+ * necessary
+ */
+internal class RotaryFlingBehavior(
+    private val scrollableState: ScrollableState,
+    private val flingBehavior: FlingBehavior,
+    viewConfiguration: ViewConfiguration,
+    private val flingTimeframe: Long,
+) {
+
+    // A time range during which the fling is valid.
+    // For simplicity it's twice as long as [flingTimeframe]
+    private val timeRangeToFling = flingTimeframe * 2
+
+    //  A default fling factor for making fling slower
+    private val flingScaleFactor = 0.7f
+
+    private var previousVelocity = 0f
+
+    private val rotaryVelocityTracker = RotaryVelocityTracker()
+
+    private val minFlingSpeed = viewConfiguration.scaledMinimumFlingVelocity.toFloat()
+    private val maxFlingSpeed = viewConfiguration.scaledMaximumFlingVelocity.toFloat()
+    private var latestEventTimestamp: Long = 0
+
+    private var flingVelocity: Float = 0f
+    private var flingTimestamp: Long = 0
+
+    /** Starts a new fling tracking session with specified timestamp */
+    fun startFlingTracking(timestamp: Long) {
+        rotaryVelocityTracker.start(timestamp)
+        latestEventTimestamp = timestamp
+        previousVelocity = 0f
+    }
+
+    /** Observing new event within a fling tracking session with new timestamp and delta */
+    fun observeEvent(timestamp: Long, delta: Float) {
+        rotaryVelocityTracker.move(timestamp, delta)
+        latestEventTimestamp = timestamp
+    }
+
+    /** Performing fling if necessary and calling [beforeFling] lambda before it is triggered */
+    suspend fun trackFling(beforeFling: () -> Unit) {
+        val currentVelocity = rotaryVelocityTracker.velocity
+        debugLog { "currentVelocity: $currentVelocity" }
+
+        if (abs(currentVelocity) >= abs(previousVelocity)) {
+            flingTimestamp = latestEventTimestamp
+            flingVelocity = currentVelocity * flingScaleFactor
+        }
+        previousVelocity = currentVelocity
+
+        // Waiting for a fixed amount of time before checking the fling
+        delay(flingTimeframe)
+
+        // For making a fling 2 criteria should be met:
+        // 1) no more than
+        // `rangeToFling` ms should pass between last fling detection
+        // and the time of last motion event
+        // 2) flingVelocity should exceed the minFlingSpeed
+        debugLog {
+            "Check fling:  flingVelocity: $flingVelocity " +
+                "minFlingSpeed: $minFlingSpeed, maxFlingSpeed: $maxFlingSpeed"
+        }
+        if (
+            latestEventTimestamp - flingTimestamp < timeRangeToFling &&
+                abs(flingVelocity) > minFlingSpeed
+        ) {
+            // Stops scrollAnimationCoroutine because a fling will be performed
+            beforeFling()
+            val velocity = flingVelocity.coerceIn(-maxFlingSpeed, maxFlingSpeed)
+            scrollableState.scroll(MutatePriority.UserInput) {
+                with(flingBehavior) {
+                    debugLog { "Flinging with velocity $velocity" }
+                    performFling(velocity)
+                }
+            }
+        }
+    }
+}
+
+/**
+ * A rotary event object which contains a [timestamp] of the rotary event and a scrolled [delta].
+ */
+internal data class TimestampedDelta(val timestamp: Long, val delta: Float)
+
+/**
+ * This class does a smooth animation when the scroll by N pixels is done. This animation works well
+ * on Rsb(high-res) and Bezel(low-res) devices.
+ */
+internal class RotaryScrollBehavior(
+    private val scrollableState: ScrollableState,
+) {
+    private var sequentialAnimation = false
+    private var scrollAnimation = AnimationState(0f)
+    private var prevPosition = 0f
+
+    /** Handles scroll event to [targetValue] */
+    suspend fun handleEvent(targetValue: Float) {
+        scrollableState.scroll(MutatePriority.UserInput) {
+            debugLog { "ScrollAnimation value before start: ${scrollAnimation.value}" }
+
+            scrollAnimation.animateTo(
+                targetValue,
+                animationSpec = spring(),
+                sequentialAnimation = sequentialAnimation,
+            ) {
+                val delta = value - prevPosition
+                debugLog { "Animated by $delta, value: $value" }
+                scrollBy(delta)
+                prevPosition = value
+                sequentialAnimation = value != this.targetValue
+            }
+        }
+    }
+}
+
+/**
+ * A helper class for snapping with rotary. Uses animateScrollToItem method for snapping to the Nth
+ * item.
+ */
+internal class RotarySnapBehavior(
+    private val rotaryScrollAdapter: RotaryScrollAdapter,
+    private val snapParameters: SnapParameters,
+) {
+    private var snapTarget: Int = rotaryScrollAdapter.currentItemIndex()
+    private var sequentialSnap: Boolean = false
+
+    private var anim = AnimationState(0f)
+    private var expectedDistance = 0f
+
+    private val defaultStiffness = 200f
+    private var snapTargetUpdated = true
+
+    /**
+     * Preparing snapping. This method should be called before [snapToTargetItem] is called.
+     *
+     * Snapping is done for current + [moveForElements] items.
+     *
+     * If [sequentialSnap] is true, items are summed up together. For example, if
+     * [prepareSnapForItems] is called with [moveForElements] = 2, 3, 5 -> then the snapping will
+     * happen to current + 10 items
+     *
+     * If [sequentialSnap] is false, then [moveForElements] are not summed up together.
+     */
+    fun prepareSnapForItems(moveForElements: Int, sequentialSnap: Boolean) {
+        this.sequentialSnap = sequentialSnap
+        if (sequentialSnap) {
+            snapTarget += moveForElements
+        } else {
+            snapTarget = rotaryScrollAdapter.currentItemIndex() + moveForElements
+        }
+        snapTargetUpdated = true
+        snapTarget = snapTarget.coerceIn(0 until rotaryScrollAdapter.totalItemsCount())
+    }
+
+    /** Performs snapping to the closest item. */
+    suspend fun snapToClosestItem() {
+        // Snapping to the closest item by using performFling method with 0 speed
+        rotaryScrollAdapter.scrollableState.scroll(MutatePriority.UserInput) {
+            debugLog { "snap to closest item" }
+            var prevPosition = 0f
+            AnimationState(0f).animateTo(
+                targetValue = -rotaryScrollAdapter.currentItemOffset(),
+                animationSpec = tween(durationMillis = 100, easing = FastOutSlowInEasing),
+            ) {
+                val animDelta = value - prevPosition
+                scrollBy(animDelta)
+                prevPosition = value
+            }
+            snapTarget = rotaryScrollAdapter.currentItemIndex()
+        }
+    }
+
+    /** Returns true if top edge was reached */
+    fun topEdgeReached(): Boolean = snapTarget <= 0
+
+    /** Returns true if bottom edge was reached */
+    fun bottomEdgeReached(): Boolean = snapTarget >= rotaryScrollAdapter.totalItemsCount() - 1
+
+    /** Performs snapping to the specified in [prepareSnapForItems] element */
+    suspend fun snapToTargetItem() {
+        if (sequentialSnap) {
+            anim = anim.copy(0f)
+        } else {
+            anim = AnimationState(0f)
+        }
+        rotaryScrollAdapter.scrollableState.scroll(MutatePriority.UserInput) {
+            // If snapTargetUpdated is true - then the target was updated so we
+            // need to do snap again
+            while (snapTargetUpdated) {
+                snapTargetUpdated = false
+                var latestCenterItem: Int
+                var continueFirstScroll = true
+                debugLog { "snapTarget $snapTarget" }
+                while (continueFirstScroll) {
+                    latestCenterItem = rotaryScrollAdapter.currentItemIndex()
+                    anim = anim.copy(0f)
+                    expectedDistance = expectedDistanceTo(snapTarget, snapParameters.snapOffset)
+                    debugLog {
+                        "expectedDistance = $expectedDistance, " +
+                            "scrollableState.centerItemScrollOffset " +
+                            "${rotaryScrollAdapter.currentItemOffset()}"
+                    }
+                    continueFirstScroll = false
+                    var prevPosition = 0f
+
+                    anim.animateTo(
+                        expectedDistance,
+                        animationSpec =
+                            SpringSpec(
+                                stiffness = defaultStiffness,
+                                visibilityThreshold = 0.1f,
+                            ),
+                        sequentialAnimation = (anim.velocity != 0f),
+                    ) {
+                        val animDelta = value - prevPosition
+                        debugLog {
+                            "First animation, value:$value, velocity:$velocity, " +
+                                "animDelta:$animDelta"
+                        }
+
+                        // Exit animation if snap target was updated
+                        if (snapTargetUpdated) cancelAnimation()
+
+                        scrollBy(animDelta)
+                        prevPosition = value
+
+                        if (latestCenterItem != rotaryScrollAdapter.currentItemIndex()) {
+                            continueFirstScroll = true
+                            cancelAnimation()
+                            return@animateTo
+                        }
+
+                        debugLog { "centerItemIndex =  ${rotaryScrollAdapter.currentItemIndex()}" }
+                        if (rotaryScrollAdapter.currentItemIndex() == snapTarget) {
+                            debugLog { "Target is visible. Cancelling first animation" }
+                            debugLog {
+                                "scrollableState.centerItemScrollOffset " +
+                                    "${rotaryScrollAdapter.currentItemOffset()}"
+                            }
+                            expectedDistance = -rotaryScrollAdapter.currentItemOffset()
+                            continueFirstScroll = false
+                            cancelAnimation()
+                            return@animateTo
+                        }
+                    }
+                }
+                // Exit animation if snap target was updated
+                if (snapTargetUpdated) continue
+
+                anim = anim.copy(0f)
+                var prevPosition = 0f
+                anim.animateTo(
+                    expectedDistance,
+                    animationSpec =
+                        SpringSpec(
+                            stiffness = defaultStiffness,
+                            visibilityThreshold = 0.1f,
+                        ),
+                    sequentialAnimation = (anim.velocity != 0f),
+                ) {
+                    // Exit animation if snap target was updated
+                    if (snapTargetUpdated) cancelAnimation()
+
+                    val animDelta = value - prevPosition
+                    debugLog { "Final animation. velocity:$velocity, animDelta:$animDelta" }
+                    scrollBy(animDelta)
+                    prevPosition = value
+                }
+            }
+        }
+    }
+
+    private fun expectedDistanceTo(index: Int, targetScrollOffset: Int): Float {
+        val averageSize = rotaryScrollAdapter.averageItemSize()
+        val indexesDiff = index - rotaryScrollAdapter.currentItemIndex()
+        debugLog { "Average size $averageSize" }
+        return (averageSize * indexesDiff) + targetScrollOffset -
+            rotaryScrollAdapter.currentItemOffset()
+    }
+}
+
+/**
+ * A modifier which handles rotary events. It accepts ScrollHandler as the input - a class where
+ * main logic about how scroll should be handled is lying
+ */
+internal fun Modifier.rotaryHandler(
+    rotaryScrollHandler: RotaryScrollHandler,
+    reverseDirection: Boolean,
+    rotaryHaptics: RotaryHapticHandler,
+    inspectorInfo: InspectorInfo.() -> Unit,
+): Modifier =
+    this then
+        RotaryHandlerElement(
+            rotaryScrollHandler,
+            reverseDirection,
+            rotaryHaptics,
+            inspectorInfo,
+        )
+
+/**
+ * Batching requests for scrolling events. This function combines all events together (except first)
+ * within specified timeframe. Should help with performance on high-res devices.
+ */
+@OptIn(ExperimentalCoroutinesApi::class)
+internal fun Flow<TimestampedDelta>.batchRequestsWithinTimeframe(
+    timeframe: Long
+): Flow<TimestampedDelta> {
+    var delta = 0f
+    var lastTimestamp = -timeframe
+    return if (timeframe == 0L) {
+        this
+    } else {
+        this.transformLatest {
+            delta += it.delta
+            debugLog { "Batching requests. delta:$delta" }
+            if (lastTimestamp + timeframe <= it.timestamp) {
+                lastTimestamp = it.timestamp
+                debugLog { "No events before, delta= $delta" }
+                emit(TimestampedDelta(it.timestamp, delta))
+            } else {
+                delay(timeframe)
+                debugLog { "After delay, delta= $delta" }
+                if (delta > 0f) {
+                    emit(TimestampedDelta(it.timestamp, delta))
+                }
+            }
+            delta = 0f
+        }
+    }
+}
+
+/**
+ * A scroll handler for RSB(high-res) without snapping and with or without fling A list is scrolled
+ * by the number of pixels received from the rotary device.
+ *
+ * This class is a little bit different from LowResScrollHandler class - it has a filtering for
+ * events which are coming with wrong sign ( this happens to rsb devices, especially at the end of
+ * the scroll)
+ *
+ * This scroll handler supports fling. It can be set with [RotaryFlingBehavior].
+ */
+internal class HighResRotaryScrollHandler(
+    private val rotaryFlingBehaviorFactory: () -> RotaryFlingBehavior?,
+    private val scrollBehaviorFactory: () -> RotaryScrollBehavior,
+    private val hapticsThreshold: Long = 50,
+) : RotaryScrollHandler {
+
+    // This constant is specific for high-res devices. Because that input values
+    // can sometimes come with different sign, we have to filter them in this threshold
+    private val gestureThresholdTime = 200L
+    private var scrollJob: Job = CompletableDeferred<Unit>()
+    private var flingJob: Job = CompletableDeferred<Unit>()
+
+    private var previousScrollEventTime = 0L
+    private var rotaryScrollDistance = 0f
+
+    private var rotaryFlingBehavior: RotaryFlingBehavior? = rotaryFlingBehaviorFactory()
+    private var scrollBehavior: RotaryScrollBehavior = scrollBehaviorFactory()
+
+    override suspend fun handleScrollEvent(
+        coroutineScope: CoroutineScope,
+        event: TimestampedDelta,
+        rotaryHaptics: RotaryHapticHandler,
+    ) {
+        val time = event.timestamp
+        val isOppositeScrollValue = isOppositeValueAfterScroll(event.delta)
+
+        if (isNewScrollEvent(time)) {
+            debugLog { "New scroll event" }
+            resetTracking(time)
+            rotaryScrollDistance = event.delta
+        } else {
+            // Due to the physics of Rotary side button, some events might come
+            // with an opposite axis value - either at the start or at the end of the motion.
+            // We don't want to use these values for fling calculations.
+            if (!isOppositeScrollValue) {
+                rotaryFlingBehavior?.observeEvent(event.timestamp, event.delta)
+            } else {
+                debugLog { "Opposite value after scroll :${event.delta}" }
+            }
+            rotaryScrollDistance += event.delta
+        }
+
+        scrollJob.cancel()
+
+        rotaryHaptics.handleScrollHaptic(event.delta)
+        debugLog { "Rotary scroll distance: $rotaryScrollDistance" }
+
+        previousScrollEventTime = time
+        scrollJob = coroutineScope.async { scrollBehavior.handleEvent(rotaryScrollDistance) }
+
+        if (rotaryFlingBehavior != null) {
+            flingJob.cancel()
+            flingJob =
+                coroutineScope.async {
+                    rotaryFlingBehavior?.trackFling(
+                        beforeFling = {
+                            debugLog { "Calling before fling section" }
+                            scrollJob.cancel()
+                            scrollBehavior = scrollBehaviorFactory()
+                        }
+                    )
+                }
+        }
+    }
+
+    private fun isOppositeValueAfterScroll(delta: Float): Boolean =
+        rotaryScrollDistance * delta < 0f && (abs(delta) < abs(rotaryScrollDistance))
+
+    private fun isNewScrollEvent(timestamp: Long): Boolean {
+        val timeDelta = timestamp - previousScrollEventTime
+        return previousScrollEventTime == 0L || timeDelta > gestureThresholdTime
+    }
+
+    private fun resetTracking(timestamp: Long) {
+        scrollBehavior = scrollBehaviorFactory()
+        rotaryFlingBehavior = rotaryFlingBehaviorFactory()
+        rotaryFlingBehavior?.startFlingTracking(timestamp)
+    }
+}
+
+/**
+ * A scroll handler for Bezel(low-res) without snapping. This scroll handler supports fling. It can
+ * be set with RotaryFlingBehavior.
+ */
+internal class LowResRotaryScrollHandler(
+    private val rotaryFlingBehaviorFactory: () -> RotaryFlingBehavior?,
+    private val scrollBehaviorFactory: () -> RotaryScrollBehavior,
+) : RotaryScrollHandler {
+
+    private val gestureThresholdTime = 200L
+    private var previousScrollEventTime = 0L
+    private var rotaryScrollDistance = 0f
+
+    private var scrollJob: Job = CompletableDeferred<Unit>()
+    private var flingJob: Job = CompletableDeferred<Unit>()
+
+    private var rotaryFlingBehavior: RotaryFlingBehavior? = rotaryFlingBehaviorFactory()
+    private var scrollBehavior: RotaryScrollBehavior = scrollBehaviorFactory()
+
+    override suspend fun handleScrollEvent(
+        coroutineScope: CoroutineScope,
+        event: TimestampedDelta,
+        rotaryHaptics: RotaryHapticHandler,
+    ) {
+        val time = event.timestamp
+
+        if (isNewScrollEvent(time)) {
+            resetTracking(time)
+            rotaryScrollDistance = event.delta
+        } else {
+            rotaryFlingBehavior?.observeEvent(event.timestamp, event.delta)
+            rotaryScrollDistance += event.delta
+        }
+
+        scrollJob.cancel()
+        flingJob.cancel()
+
+        rotaryHaptics.handleScrollHaptic(event.delta)
+        debugLog { "Rotary scroll distance: $rotaryScrollDistance" }
+
+        previousScrollEventTime = time
+        scrollJob = coroutineScope.async { scrollBehavior.handleEvent(rotaryScrollDistance) }
+
+        flingJob =
+            coroutineScope.async {
+                rotaryFlingBehavior?.trackFling(
+                    beforeFling = {
+                        debugLog { "Calling before fling section" }
+                        scrollJob.cancel()
+                        scrollBehavior = scrollBehaviorFactory()
+                    },
+                )
+            }
+    }
+
+    private fun isNewScrollEvent(timestamp: Long): Boolean {
+        val timeDelta = timestamp - previousScrollEventTime
+        return previousScrollEventTime == 0L || timeDelta > gestureThresholdTime
+    }
+
+    private fun resetTracking(timestamp: Long) {
+        scrollBehavior = scrollBehaviorFactory()
+        debugLog { "Velocity tracker reset" }
+        rotaryFlingBehavior = rotaryFlingBehaviorFactory()
+        rotaryFlingBehavior?.startFlingTracking(timestamp)
+    }
+}
+
+/**
+ * A scroll handler for RSB(high-res) with snapping and without fling Snapping happens after a
+ * threshold is reached ( set in [RotarySnapBehavior])
+ *
+ * This scroll handler doesn't support fling.
+ */
+internal class HighResSnapHandler(
+    private val resistanceFactor: Float,
+    private val thresholdBehaviorFactory: () -> ThresholdBehavior,
+    private val snapBehaviourFactory: () -> RotarySnapBehavior,
+    private val scrollBehaviourFactory: () -> RotaryScrollBehavior,
+) : RotaryScrollHandler {
+    private val gestureThresholdTime = 200L
+    private val snapDelay = 100L
+    private val maxSnapsPerEvent = 2
+
+    private var scrollJob: Job = CompletableDeferred<Unit>()
+    private var snapJob: Job = CompletableDeferred<Unit>()
+
+    private var previousScrollEventTime = 0L
+    private var snapAccumulator = 0f
+    private var rotaryScrollDistance = 0f
+    private var scrollInProgress = false
+
+    private var snapBehaviour = snapBehaviourFactory()
+    private var scrollBehaviour = scrollBehaviourFactory()
+    private var thresholdBehavior = thresholdBehaviorFactory()
+
+    private val scrollEasing: Easing = CubicBezierEasing(0.0f, 0.0f, 0.5f, 1.0f)
+
+    override suspend fun handleScrollEvent(
+        coroutineScope: CoroutineScope,
+        event: TimestampedDelta,
+        rotaryHaptics: RotaryHapticHandler,
+    ) {
+        val time = event.timestamp
+
+        if (isNewScrollEvent(time)) {
+            debugLog { "New scroll event" }
+            resetTracking()
+            snapJob.cancel()
+            snapBehaviour = snapBehaviourFactory()
+            scrollBehaviour = scrollBehaviourFactory()
+            thresholdBehavior = thresholdBehaviorFactory()
+            thresholdBehavior.startThresholdTracking(time)
+            snapAccumulator = 0f
+            rotaryScrollDistance = 0f
+        }
+
+        if (!isOppositeValueAfterScroll(event.delta)) {
+            thresholdBehavior.observeEvent(event.timestamp, event.delta)
+        } else {
+            debugLog { "Opposite value after scroll :${event.delta}" }
+        }
+
+        thresholdBehavior.applySmoothing()
+        val snapThreshold = thresholdBehavior.snapThreshold()
+
+        snapAccumulator += event.delta
+        if (!snapJob.isActive) {
+            val resistanceCoeff =
+                1 - scrollEasing.transform(rotaryScrollDistance.absoluteValue / snapThreshold)
+            rotaryScrollDistance += event.delta * resistanceCoeff
+        }
+
+        debugLog { "Snap accumulator: $snapAccumulator" }
+        debugLog { "Rotary scroll distance: $rotaryScrollDistance" }
+
+        debugLog { "snapThreshold: $snapThreshold" }
+        previousScrollEventTime = time
+
+        if (abs(snapAccumulator) > snapThreshold) {
+            scrollInProgress = false
+            scrollBehaviour = scrollBehaviourFactory()
+            scrollJob.cancel()
+
+            val snapDistance =
+                (snapAccumulator / snapThreshold)
+                    .toInt()
+                    .coerceIn(-maxSnapsPerEvent..maxSnapsPerEvent)
+            snapAccumulator -= snapThreshold * snapDistance
+            val sequentialSnap = snapJob.isActive
+
+            debugLog {
+                "Snap threshold reached: snapDistance:$snapDistance, " +
+                    "sequentialSnap: $sequentialSnap, " +
+                    "snap accumulator remaining: $snapAccumulator"
+            }
+            if (
+                (!snapBehaviour.topEdgeReached() && snapDistance < 0) ||
+                    (!snapBehaviour.bottomEdgeReached() && snapDistance > 0)
+            ) {
+                rotaryHaptics.handleSnapHaptic(event.delta)
+            }
+
+            snapBehaviour.prepareSnapForItems(snapDistance, sequentialSnap)
+            if (!snapJob.isActive) {
+                snapJob.cancel()
+                snapJob =
+                    coroutineScope.async {
+                        debugLog { "Snap started" }
+                        try {
+                            snapBehaviour.snapToTargetItem()
+                        } finally {
+                            debugLog { "Snap called finally" }
+                        }
+                    }
+            }
+            rotaryScrollDistance = 0f
+        } else {
+            if (!snapJob.isActive) {
+                scrollJob.cancel()
+                debugLog { "Scrolling for $rotaryScrollDistance/$resistanceFactor px" }
+                scrollJob =
+                    coroutineScope.async {
+                        scrollBehaviour.handleEvent(rotaryScrollDistance / resistanceFactor)
+                    }
+                delay(snapDelay)
+                scrollInProgress = false
+                scrollBehaviour = scrollBehaviourFactory()
+                rotaryScrollDistance = 0f
+                snapAccumulator = 0f
+                snapBehaviour.prepareSnapForItems(0, false)
+
+                snapJob.cancel()
+                snapJob = coroutineScope.async { snapBehaviour.snapToClosestItem() }
+            }
+        }
+    }
+
+    private fun isOppositeValueAfterScroll(delta: Float): Boolean =
+        sign(rotaryScrollDistance) * sign(delta) == -1f && (abs(delta) < abs(rotaryScrollDistance))
+
+    private fun isNewScrollEvent(timestamp: Long): Boolean {
+        val timeDelta = timestamp - previousScrollEventTime
+        return previousScrollEventTime == 0L || timeDelta > gestureThresholdTime
+    }
+
+    private fun resetTracking() {
+        scrollInProgress = true
+    }
+}
+
+/**
+ * A scroll handler for RSB(high-res) with snapping and without fling Snapping happens after a
+ * threshold is reached ( set in [RotarySnapBehavior])
+ *
+ * This scroll handler doesn't support fling.
+ */
+internal class LowResSnapHandler(
+    private val snapBehaviourFactory: () -> RotarySnapBehavior,
+) : RotaryScrollHandler {
+    private val gestureThresholdTime = 200L
+
+    private var snapJob: Job = CompletableDeferred<Unit>()
+
+    private var previousScrollEventTime = 0L
+    private var snapAccumulator = 0f
+    private var scrollInProgress = false
+
+    private var snapBehaviour = snapBehaviourFactory()
+
+    override suspend fun handleScrollEvent(
+        coroutineScope: CoroutineScope,
+        event: TimestampedDelta,
+        rotaryHaptics: RotaryHapticHandler,
+    ) {
+        val time = event.timestamp
+
+        if (isNewScrollEvent(time)) {
+            debugLog { "New scroll event" }
+            resetTracking()
+            snapJob.cancel()
+            snapBehaviour = snapBehaviourFactory()
+            snapAccumulator = 0f
+        }
+
+        snapAccumulator += event.delta
+
+        debugLog { "Snap accumulator: $snapAccumulator" }
+
+        previousScrollEventTime = time
+
+        if (abs(snapAccumulator) > 1f) {
+            scrollInProgress = false
+
+            val snapDistance = sign(snapAccumulator).toInt()
+            rotaryHaptics.handleSnapHaptic(event.delta)
+            val sequentialSnap = snapJob.isActive
+            debugLog {
+                "Snap threshold reached: snapDistance:$snapDistance, " +
+                    "sequentialSnap: $sequentialSnap, " +
+                    "snap accumulator: $snapAccumulator"
+            }
+
+            snapBehaviour.prepareSnapForItems(snapDistance, sequentialSnap)
+            if (!snapJob.isActive) {
+                snapJob.cancel()
+                snapJob =
+                    coroutineScope.async {
+                        debugLog { "Snap started" }
+                        try {
+                            snapBehaviour.snapToTargetItem()
+                        } finally {
+                            debugLog { "Snap called finally" }
+                        }
+                    }
+            }
+            snapAccumulator = 0f
+        }
+    }
+
+    private fun isNewScrollEvent(timestamp: Long): Boolean {
+        val timeDelta = timestamp - previousScrollEventTime
+        return previousScrollEventTime == 0L || timeDelta > gestureThresholdTime
+    }
+
+    private fun resetTracking() {
+        scrollInProgress = true
+    }
+}
+
+internal class ThresholdBehavior(
+    private val rotaryScrollAdapter: RotaryScrollAdapter,
+    private val thresholdDivider: Float,
+    private val minVelocity: Float = 300f,
+    private val maxVelocity: Float = 3000f,
+    private val smoothingConstant: Float = 0.4f,
+) {
+    private val thresholdDividerEasing: Easing = CubicBezierEasing(0.5f, 0.0f, 0.5f, 1.0f)
+
+    private val rotaryVelocityTracker = RotaryVelocityTracker()
+
+    private var smoothedVelocity = 0f
+
+    fun startThresholdTracking(time: Long) {
+        rotaryVelocityTracker.start(time)
+        smoothedVelocity = 0f
+    }
+
+    fun observeEvent(timestamp: Long, delta: Float) {
+        rotaryVelocityTracker.move(timestamp, delta)
+    }
+
+    fun applySmoothing() {
+        if (rotaryVelocityTracker.velocity != 0.0f) {
+            // smooth the velocity
+            smoothedVelocity =
+                exponentialSmoothing(
+                    currentVelocity = rotaryVelocityTracker.velocity.absoluteValue,
+                    prevVelocity = smoothedVelocity,
+                    smoothingConstant = smoothingConstant,
+                )
+        }
+        debugLog { "rotaryVelocityTracker velocity: ${rotaryVelocityTracker.velocity}" }
+        debugLog { "SmoothedVelocity: $smoothedVelocity" }
+    }
+
+    fun snapThreshold(): Float {
+        val thresholdDividerFraction =
+            thresholdDividerEasing.transform(
+                inverseLerp(
+                    minVelocity,
+                    maxVelocity,
+                    smoothedVelocity,
+                ),
+            )
+        return rotaryScrollAdapter.averageItemSize() /
+            lerp(
+                1f,
+                thresholdDivider,
+                thresholdDividerFraction,
+            )
+    }
+
+    private fun exponentialSmoothing(
+        currentVelocity: Float,
+        prevVelocity: Float,
+        smoothingConstant: Float,
+    ): Float = smoothingConstant * currentVelocity + (1 - smoothingConstant) * prevVelocity
+}
+
+private data class RotaryHandlerElement(
+    private val rotaryScrollHandler: RotaryScrollHandler,
+    private val reverseDirection: Boolean,
+    private val rotaryHaptics: RotaryHapticHandler,
+    private val inspectorInfo: InspectorInfo.() -> Unit,
+) : ModifierNodeElement<RotaryInputNode>() {
+    override fun create(): RotaryInputNode =
+        RotaryInputNode(
+            rotaryScrollHandler,
+            reverseDirection,
+            rotaryHaptics,
+        )
+
+    override fun update(node: RotaryInputNode) {
+        debugLog { "Update launched!" }
+        node.rotaryScrollHandler = rotaryScrollHandler
+        node.reverseDirection = reverseDirection
+        node.rotaryHaptics = rotaryHaptics
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        inspectorInfo()
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || this::class != other::class) return false
+
+        other as RotaryHandlerElement
+
+        if (rotaryScrollHandler != other.rotaryScrollHandler) return false
+        if (reverseDirection != other.reverseDirection) return false
+        if (rotaryHaptics != other.rotaryHaptics) return false
+        if (inspectorInfo != other.inspectorInfo) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = rotaryScrollHandler.hashCode()
+        result = 31 * result + reverseDirection.hashCode()
+        result = 31 * result + rotaryHaptics.hashCode()
+        result = 31 * result + inspectorInfo.hashCode()
+        return result
+    }
+}
+
+private class RotaryInputNode(
+    var rotaryScrollHandler: RotaryScrollHandler,
+    var reverseDirection: Boolean,
+    var rotaryHaptics: RotaryHapticHandler,
+) : RotaryInputModifierNode, Modifier.Node() {
+
+    val channel = Channel<TimestampedDelta>(capacity = Channel.CONFLATED)
+    val flow = channel.receiveAsFlow()
+
+    override fun onAttach() {
+        coroutineScope.launch {
+            flow.collectLatest {
+                debugLog {
+                    "Scroll event received: " + "delta:${it.delta}, timestamp:${it.timestamp}"
+                }
+                rotaryScrollHandler.handleScrollEvent(this, it, rotaryHaptics)
+            }
+        }
+    }
+
+    override fun onRotaryScrollEvent(event: RotaryScrollEvent): Boolean = false
+
+    override fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
+        debugLog { "onPreRotaryScrollEvent" }
+        channel.trySend(
+            TimestampedDelta(
+                event.uptimeMillis,
+                event.verticalScrollPixels * if (reverseDirection) -1f else 1f,
+            ),
+        )
+        return true
+    }
+}
+
+private fun inverseLerp(start: Float, stop: Float, value: Float): Float {
+    return ((value - start) / (stop - start)).coerceIn(0f, 1f)
+}
+
+/** Debug logging that can be enabled. */
+private const val DEBUG = false
+
+private inline fun debugLog(generateMsg: () -> String) {
+    if (DEBUG) {
+        println("RotaryScroll: ${generateMsg()}")
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/RotaryVelocityTracker.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/RotaryVelocityTracker.kt
new file mode 100644
index 0000000..2f528ad
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/elements/rotaryinput/RotaryVelocityTracker.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.healthconnect.controller.permissions.request.wear.elements.rotaryinput
+
+import androidx.compose.ui.input.pointer.util.VelocityTracker1D
+
+// This file is a copy of RotaryVelocityTracker.kt from Horologist (go/horologist),
+// remove it once Wear Compose 1.4 is landed (b/325560444).
+
+/** A wrapper around VelocityTracker1D to provide support for rotary input. */
+class RotaryVelocityTracker {
+    private var velocityTracker: VelocityTracker1D = VelocityTracker1D(true)
+
+    /** Retrieve the last computed velocity. */
+    val velocity: Float
+        get() = velocityTracker.calculateVelocity()
+
+    /** Start tracking motion. */
+    fun start(currentTime: Long) {
+        velocityTracker.resetTracking()
+        velocityTracker.addDataPoint(currentTime, 0f)
+    }
+
+    /** Continue tracking motion as the input rotates. */
+    fun move(currentTime: Long, delta: Float) {
+        velocityTracker.addDataPoint(currentTime, delta)
+    }
+
+    /** Stop tracking motion. */
+    fun end() {
+        velocityTracker.resetTracking()
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/ResourceHelper.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/ResourceHelper.kt
new file mode 100644
index 0000000..ed20bfe
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/ResourceHelper.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+import android.content.Context
+import androidx.annotation.ColorRes
+import androidx.annotation.DimenRes
+import androidx.annotation.DoNotInline
+import androidx.annotation.StringRes
+import androidx.compose.ui.graphics.Color
+
+internal object ResourceHelper {
+    @DoNotInline
+    fun getColor(context: Context, @ColorRes id: Int): Color? {
+        return try {
+            val colorInt = context.resources.getColor(id, context.theme)
+            Color(colorInt)
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    @DoNotInline
+    fun getString(context: Context, @StringRes id: Int): String? {
+        return try {
+            context.resources.getString(id)
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    @DoNotInline
+    fun getDimen(context: Context, @DimenRes id: Int): Float? {
+        return try {
+            context.resources.getDimension(id)
+        } catch (e: Exception) {
+            null
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3ColorScheme.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3ColorScheme.kt
new file mode 100644
index 0000000..990f9bb
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3ColorScheme.kt
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+import android.content.Context
+import android.os.Build
+import androidx.annotation.ColorRes
+import androidx.annotation.RequiresApi
+import androidx.compose.ui.graphics.Color
+import androidx.wear.compose.material3.ColorScheme
+
+/**
+ * Creates a dynamic color maps that can be overlaid. In wear we only support dark theme for the
+ * time being. If the device supports dynamic color generation these resources are updated with the
+ * generated colors
+ */
+internal object WearComposeMaterial3ColorScheme {
+
+    private fun Color.updatedColor(context: Context, @ColorRes colorRes: Int): Color {
+        return ResourceHelper.getColor(context, colorRes) ?: this
+    }
+
+    @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+    fun dynamicColorScheme(context: Context): ColorScheme {
+        val defaultColorScheme = ColorScheme()
+        return ColorScheme(
+            primary =
+                defaultColorScheme.primary.updatedColor(
+                    context,
+                    android.R.color.system_primary_fixed,
+                ),
+            primaryDim =
+                defaultColorScheme.primaryDim.updatedColor(
+                    context,
+                    android.R.color.system_primary_fixed_dim,
+                ),
+            primaryContainer =
+                defaultColorScheme.primaryContainer.updatedColor(
+                    context,
+                    android.R.color.system_primary_container_dark,
+                ),
+            onPrimary =
+                defaultColorScheme.onPrimary.updatedColor(
+                    context,
+                    android.R.color.system_on_primary_fixed,
+                ),
+            onPrimaryContainer =
+                defaultColorScheme.onPrimaryContainer.updatedColor(
+                    context,
+                    android.R.color.system_on_primary_container_dark,
+                ),
+            secondary =
+                defaultColorScheme.secondary.updatedColor(
+                    context,
+                    android.R.color.system_secondary_fixed,
+                ),
+            secondaryDim =
+                defaultColorScheme.secondaryDim.updatedColor(
+                    context,
+                    android.R.color.system_secondary_fixed_dim,
+                ),
+            secondaryContainer =
+                defaultColorScheme.secondaryContainer.updatedColor(
+                    context,
+                    android.R.color.system_secondary_container_dark,
+                ),
+            onSecondary =
+                defaultColorScheme.onSecondary.updatedColor(
+                    context,
+                    android.R.color.system_on_secondary_fixed,
+                ),
+            onSecondaryContainer =
+                defaultColorScheme.onSecondaryContainer.updatedColor(
+                    context,
+                    android.R.color.system_on_secondary_container_dark,
+                ),
+            tertiary =
+                defaultColorScheme.tertiary.updatedColor(
+                    context,
+                    android.R.color.system_tertiary_fixed,
+                ),
+            tertiaryDim =
+                defaultColorScheme.tertiaryDim.updatedColor(
+                    context,
+                    android.R.color.system_tertiary_fixed_dim,
+                ),
+            tertiaryContainer =
+                defaultColorScheme.tertiaryContainer.updatedColor(
+                    context,
+                    android.R.color.system_tertiary_container_dark,
+                ),
+            onTertiary =
+                defaultColorScheme.onTertiary.updatedColor(
+                    context,
+                    android.R.color.system_on_tertiary_fixed,
+                ),
+            onTertiaryContainer =
+                defaultColorScheme.onTertiaryContainer.updatedColor(
+                    context,
+                    android.R.color.system_on_tertiary_container_dark,
+                ),
+            surfaceContainerLow =
+                defaultColorScheme.surfaceContainerLow.updatedColor(
+                    context,
+                    android.R.color.system_surface_container_low_dark,
+                ),
+            surfaceContainer =
+                defaultColorScheme.surfaceContainer.updatedColor(
+                    context,
+                    android.R.color.system_surface_container_dark,
+                ),
+            surfaceContainerHigh =
+                defaultColorScheme.surfaceContainerHigh.updatedColor(
+                    context,
+                    android.R.color.system_surface_container_high_dark,
+                ),
+            onSurface =
+                defaultColorScheme.onSurface.updatedColor(
+                    context,
+                    android.R.color.system_on_surface_dark,
+                ),
+            onSurfaceVariant =
+                defaultColorScheme.onSurfaceVariant.updatedColor(
+                    context,
+                    android.R.color.system_on_surface_variant_dark,
+                ),
+            outline =
+                defaultColorScheme.outline.updatedColor(
+                    context,
+                    android.R.color.system_outline_dark,
+                ),
+            outlineVariant =
+                defaultColorScheme.outlineVariant.updatedColor(
+                    context,
+                    android.R.color.system_outline_variant_dark,
+                ),
+            background =
+                defaultColorScheme.background.updatedColor(
+                    context,
+                    android.R.color.system_background_dark,
+                ),
+            onBackground =
+                defaultColorScheme.onBackground.updatedColor(
+                    context,
+                    android.R.color.system_on_background_dark,
+                ),
+            error =
+                defaultColorScheme.error.updatedColor(context, android.R.color.system_error_dark),
+            onError =
+                defaultColorScheme.onError.updatedColor(
+                    context,
+                    android.R.color.system_on_error_dark,
+                ),
+            errorContainer =
+                defaultColorScheme.errorContainer.updatedColor(
+                    context,
+                    android.R.color.system_error_container_dark,
+                ),
+            onErrorContainer =
+                defaultColorScheme.onErrorContainer.updatedColor(
+                    context,
+                    android.R.color.system_on_error_container_dark,
+                ),
+        )
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3Shapes.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3Shapes.kt
new file mode 100644
index 0000000..095ed74
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3Shapes.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+import android.content.Context
+import androidx.annotation.DimenRes
+import androidx.compose.foundation.shape.CornerBasedShape
+import androidx.compose.foundation.shape.CornerSize
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material3.Shapes
+import com.android.healthconnect.controller.R
+
+// TODO(b/324928718): Use system defined symbols.
+internal object WearComposeMaterial3Shapes {
+    private fun CornerBasedShape.updatedShape(
+        context: Context,
+        @DimenRes cornerSizeRes: Int,
+    ): CornerBasedShape {
+        val size = ResourceHelper.getDimen(context, cornerSizeRes)?.dp ?: return this
+        return copy(CornerSize(size))
+    }
+
+    fun dynamicShapes(context: Context): Shapes {
+        val defaultShapes = Shapes()
+        return Shapes(
+            extraLarge =
+                defaultShapes.extraLarge.updatedShape(
+                    context,
+                    R.dimen.wear_compose_material3_shape_corner_extra_large_size,
+                ),
+            large =
+                defaultShapes.large.updatedShape(
+                    context,
+                    R.dimen.wear_compose_material3_shape_corner_large_size,
+                ),
+            medium =
+                defaultShapes.medium.updatedShape(
+                    context,
+                    R.dimen.wear_compose_material3_shape_corner_medium_size,
+                ),
+            small =
+                defaultShapes.small.updatedShape(
+                    context,
+                    R.dimen.wear_compose_material3_shape_corner_small_size,
+                ),
+            extraSmall =
+                defaultShapes.extraSmall.updatedShape(
+                    context,
+                    R.dimen.wear_compose_material3_shape_corner_extra_small_size,
+                ),
+        )
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3TypeScaleTokens.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3TypeScaleTokens.kt
new file mode 100644
index 0000000..dbaad4b
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3TypeScaleTokens.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+/*
+ * These values are retrieved from https://carbon.googleplex.com/wear-m3/pages and
+ * modified by UX.
+ * These values are internal to material3 library. We copied them to support flex font families
+ * Do not edit directly. Copy paste from compose material library.
+ */
+
+internal object WearComposeMaterial3TypeScaleTokens {
+    val ArcLargeRoundness = 100.0f
+    val ArcLargeWeight = 600.0f
+    val ArcLargeWidth = 100.0f
+
+    val ArcMediumRoundness = 100.0f
+    val ArcMediumWeight = 600.0f
+    val ArcMediumWidth = 90.0f
+
+    val ArcSmallRoundness = 100.0f
+    val ArcSmallWeight = 550.0f
+    val ArcSmallWidth = 90.0f
+
+    val BodyExtraSmallRoundness = 100.0f
+    val BodyExtraSmallWeight = 500.0f
+    val BodyExtraSmallWidth = 84.0f
+
+    val BodyLargeRoundness = 100.0f
+    val BodyLargeWeight = 450.0f
+    val BodyLargeWidth = 90.0f
+
+    val BodyMediumRoundness = 100.0f
+    val BodyMediumWeight = 450.0f
+    val BodyMediumWidth = 90.0f
+
+    val BodySmallRoundness = 100.0f
+    val BodySmallWeight = 500.0f
+    val BodySmallWidth = 86.0f
+
+    val DisplayLargeRoundness = 100.0f
+    val DisplayLargeWeight = 450.0f
+    val DisplayLargeWidth = 100.0f
+
+    val DisplayMediumRoundness = 100.0f
+    val DisplayMediumWeight = 500.0f
+    val DisplayMediumWidth = 100.0f
+
+    val DisplaySmallRoundness = 100.0f
+    val DisplaySmallWeight = 500.0f
+    val DisplaySmallWidth = 100.0f
+
+    val LabelLargeRoundness = 100.0f
+    val LabelLargeWeight = 500.0f
+    val LabelLargeWidth = 100.0f
+
+    val LabelMediumRoundness = 100.0f
+    val LabelMediumWeight = 500.0f
+    val LabelMediumWidth = 90.0f
+
+    val LabelSmallRoundness = 100.0f
+    val LabelSmallWeight = 500.0f
+    val LabelSmallWidth = 84.0f
+
+    val NumeralExtraLargeRoundness = 100.0f
+    val NumeralExtraLargeWeight = 550.0f
+    val NumeralExtraLargeWidth = 100.0f
+
+    val NumeralExtraSmallRoundness = 100.0f
+    val NumeralExtraSmallWeight = 550.0f
+    val NumeralExtraSmallWidth = 100.0f
+
+    val NumeralLargeRoundness = 100.0f
+    val NumeralLargeWeight = 600.0f
+    val NumeralLargeWidth = 100.0f
+
+    val NumeralMediumRoundness = 100.0f
+    val NumeralMediumWidth = 100.0f
+    val NumeralMediumWeight = 600.0f
+
+    val NumeralSmallRoundness = 100.0f
+    val NumeralSmallWeight = 600.0f
+    val NumeralSmallWidth = 100.0f
+
+    val TitleLargeRoundness = 100.0f
+    val TitleLargeWeight = 500.0f
+    val TitleLargeWidth = 100.0f
+
+    val TitleMediumRoundness = 100.0f
+    val TitleMediumWeight = 550.0f
+    val TitleMediumWidth = 100.0f
+
+    val TitleSmallRoundness = 100.0f
+    val TitleSmallWeight = 550.0f
+    val TitleSmallWidth = 100.0f
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3Typography.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3Typography.kt
new file mode 100644
index 0000000..6a54edb
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3Typography.kt
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+import android.content.Context
+import androidx.annotation.DimenRes
+import androidx.annotation.StringRes
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.DeviceFontFamilyName
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontVariation
+import androidx.compose.ui.unit.sp
+import androidx.wear.compose.material3.Typography
+import com.android.healthconnect.controller.R
+
+internal object WearComposeMaterial3Typography {
+
+    private const val DEVICE_DEFAULT_FLEX_FONT_TYPE = "font-family-flex-device-default"
+
+    fun fontFamily(
+        context: Context,
+        @StringRes id: Int,
+        variationSettings: FontVariation.Settings? = null,
+    ): FontFamily {
+        val typefaceName = ResourceHelper.getString(context, id) ?: DEVICE_DEFAULT_FLEX_FONT_TYPE
+
+        val font =
+            if (variationSettings != null) {
+                Font(
+                    familyName = DeviceFontFamilyName(typefaceName),
+                    variationSettings = variationSettings,
+                )
+            } else {
+                Font(familyName = DeviceFontFamilyName(typefaceName))
+            }
+        return FontFamily(font)
+    }
+
+    private fun TextStyle.updatedTextStyle(
+        context: Context,
+        @StringRes fontRes: Int,
+        variationSettings: FontVariation.Settings? = null,
+        @DimenRes fontSizeRes: Int,
+    ): TextStyle {
+
+        val fontFamily =
+            fontFamily(context = context, id = fontRes, variationSettings = variationSettings)
+        val fontSize = ResourceHelper.getDimen(context = context, id = fontSizeRes)?.sp ?: fontSize
+
+        return copy(fontFamily = fontFamily, fontSize = fontSize)
+    }
+
+    fun dynamicTypography(context: Context): Typography {
+        val defaultTypography = Typography()
+        return Typography(
+            arcLarge =
+                defaultTypography.arcLarge.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_arc_large_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_arc_large_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.ArcLargeVariationSettings,
+                ),
+            arcMedium =
+                defaultTypography.arcMedium.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_arc_medium_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_arc_medium_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.ArcMediumVariationSettings,
+                ),
+            arcSmall =
+                defaultTypography.arcSmall.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_arc_small_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_arc_small_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.ArcSmallVariationSettings,
+                ),
+            bodyLarge =
+                defaultTypography.bodyLarge.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_body_large_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_body_large_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.BodyLargeVariationSettings,
+                ),
+            bodyMedium =
+                defaultTypography.bodyMedium.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_body_medium_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_body_medium_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.BodyMediumVariationSettings,
+                ),
+            bodySmall =
+                defaultTypography.bodySmall.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_body_small_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_body_small_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.BodySmallVariationSettings,
+                ),
+            bodyExtraSmall =
+                defaultTypography.bodyExtraSmall.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_body_extra_small_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_body_extra_small_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.BodyExtraSmallVariationSettings,
+                ),
+            displayLarge =
+                defaultTypography.displayLarge.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_display_large_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_display_large_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.DisplayLargeVariationSettings,
+                ),
+            displayMedium =
+                defaultTypography.displayMedium.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_display_medium_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_display_medium_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.DisplayMediumVariationSettings,
+                ),
+            displaySmall =
+                defaultTypography.displaySmall.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_display_small_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_display_small_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.DisplaySmallVariationSettings,
+                ),
+            labelLarge =
+                defaultTypography.labelLarge.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_label_large_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_label_large_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.LabelLargeVariationSettings,
+                ),
+            labelMedium =
+                defaultTypography.labelMedium.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_label_medium_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_label_medium_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.LabelMediumVariationSettings,
+                ),
+            labelSmall =
+                defaultTypography.labelSmall.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_label_small_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_label_small_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.LabelSmallVariationSettings,
+                ),
+            numeralExtraLarge =
+                defaultTypography.numeralExtraLarge.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_numeral_extra_large_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_numeral_extra_large_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.NumeralExtraLargeVariationSettings,
+                ),
+            numeralLarge =
+                defaultTypography.numeralLarge.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_numeral_large_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_numeral_large_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.NumeralLargeVariationSettings,
+                ),
+            numeralMedium =
+                defaultTypography.numeralMedium.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_numeral_medium_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_numeral_medium_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.NumeralMediumVariationSettings,
+                ),
+            numeralSmall =
+                defaultTypography.numeralSmall.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_numeral_small_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_numeral_small_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.NumeralSmallVariationSettings,
+                ),
+            numeralExtraSmall =
+                defaultTypography.numeralExtraSmall.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_numeral_extra_small_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_numeral_extra_small_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.NumeralExtraSmallVariationSettings,
+                ),
+            titleLarge =
+                defaultTypography.titleLarge.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_title_large_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_title_large_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.TitleLargeVariationSettings,
+                ),
+            titleMedium =
+                defaultTypography.titleMedium.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_title_medium_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_title_medium_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.TitleMediumVariationSettings,
+                ),
+            titleSmall =
+                defaultTypography.titleSmall.updatedTextStyle(
+                    context = context,
+                    fontRes = R.string.wear_compose_material3_title_small_font_family,
+                    fontSizeRes = R.dimen.wear_compose_material3_title_small_font_size,
+                    variationSettings =
+                        WearComposeMaterial3VariableFontTokens.TitleSmallVariationSettings,
+                ),
+        )
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3VariableFontTokens.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3VariableFontTokens.kt
new file mode 100644
index 0000000..cc20c96
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearComposeMaterial3VariableFontTokens.kt
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+import androidx.compose.ui.text.font.FontVariation
+
+internal object WearComposeMaterial3VariableFontTokens {
+    val ArcLargeVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.ArcLargeRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.ArcLargeWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.ArcLargeWeight),
+        )
+    val ArcMediumVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.ArcMediumRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.ArcMediumWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.ArcMediumWeight),
+        )
+    val ArcSmallVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.ArcSmallRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.ArcSmallWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.ArcSmallWeight),
+        )
+    val BodyExtraSmallVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.BodyExtraSmallRoundness,
+            ),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.BodyExtraSmallWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.BodyExtraSmallWeight),
+        )
+    val BodyLargeVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.BodyLargeRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.BodyLargeWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.BodyLargeWeight),
+        )
+    val BodyMediumVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.BodyMediumRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.BodyMediumWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.BodyMediumWeight),
+        )
+    val BodySmallVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.BodySmallRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.BodySmallWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.BodySmallWeight),
+        )
+    val DisplayLargeVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.DisplayLargeRoundness,
+            ),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.DisplayLargeWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.DisplayLargeWeight),
+        )
+    val DisplayMediumVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.DisplayMediumRoundness,
+            ),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.DisplayMediumWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.DisplayMediumWeight),
+        )
+    val DisplaySmallVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.DisplaySmallRoundness,
+            ),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.DisplaySmallWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.DisplaySmallWeight),
+        )
+    val LabelLargeVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.LabelLargeRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.LabelLargeWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.LabelLargeWeight),
+        )
+    val LabelMediumVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.LabelMediumRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.LabelMediumWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.LabelMediumWeight),
+        )
+    val LabelSmallVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.LabelSmallRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.LabelSmallWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.LabelSmallWeight),
+        )
+    val NumeralExtraLargeVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.NumeralExtraLargeRoundness,
+            ),
+            FontVariation.Setting(
+                "wdth",
+                WearComposeMaterial3TypeScaleTokens.NumeralExtraLargeWidth,
+            ),
+            FontVariation.Setting(
+                "wght",
+                WearComposeMaterial3TypeScaleTokens.NumeralExtraLargeWeight,
+            ),
+        )
+    val NumeralExtraSmallVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.NumeralExtraSmallRoundness,
+            ),
+            FontVariation.Setting(
+                "wdth",
+                WearComposeMaterial3TypeScaleTokens.NumeralExtraSmallWidth,
+            ),
+            FontVariation.Setting(
+                "wght",
+                WearComposeMaterial3TypeScaleTokens.NumeralExtraSmallWeight,
+            ),
+        )
+    val NumeralLargeVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.NumeralLargeRoundness,
+            ),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.NumeralLargeWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.NumeralLargeWeight),
+        )
+    val NumeralMediumVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.NumeralMediumRoundness,
+            ),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.NumeralMediumWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.NumeralMediumWeight),
+        )
+    val NumeralSmallVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting(
+                "ROND",
+                WearComposeMaterial3TypeScaleTokens.NumeralSmallRoundness,
+            ),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.NumeralSmallWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.NumeralSmallWeight),
+        )
+    val TitleLargeVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.TitleLargeRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.TitleLargeWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.TitleLargeWeight),
+        )
+    val TitleMediumVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.TitleMediumRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.TitleMediumWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.TitleMediumWeight),
+        )
+    val TitleSmallVariationSettings =
+        FontVariation.Settings(
+            FontVariation.Setting("ROND", WearComposeMaterial3TypeScaleTokens.TitleSmallRoundness),
+            FontVariation.Setting("wdth", WearComposeMaterial3TypeScaleTokens.TitleSmallWidth),
+            FontVariation.Setting("wght", WearComposeMaterial3TypeScaleTokens.TitleSmallWeight),
+        )
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearOverlayableMaterial3Theme.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearOverlayableMaterial3Theme.kt
new file mode 100644
index 0000000..2d6c6d6
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearOverlayableMaterial3Theme.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+import android.os.Build
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.platform.LocalContext
+import androidx.wear.compose.material3.MaterialTheme
+
+/** The Material 3 Theme Wrapper for Supporting RRO. */
+@Composable
+fun WearOverlayableMaterial3Theme(content: @Composable () -> Unit) {
+    val context = LocalContext.current
+    if (Build.VERSION.SDK_INT >= 36) {
+        MaterialTheme(
+            colorScheme = WearComposeMaterial3ColorScheme.dynamicColorScheme(context),
+            typography = WearComposeMaterial3Typography.dynamicTypography(context),
+            shapes = WearComposeMaterial3Shapes.dynamicShapes(context),
+            content = content,
+        )
+    } else {
+        MaterialTheme(content = content)
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearPermissionTheme.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearPermissionTheme.kt
new file mode 100644
index 0000000..9b21e3a
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearPermissionTheme.kt
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+import android.content.Context
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.annotation.StringRes
+import androidx.annotation.VisibleForTesting
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.font.DeviceFontFamilyName
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.wear.compose.material.Colors
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Typography
+import com.android.healthconnect.controller.R
+
+/** The Material 2.5 Theme Wrapper for Supporting RRO. */
+@Composable
+fun WearPermissionTheme(content: @Composable () -> Unit) {
+    val context = LocalContext.current
+    val colors =
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            overlayColors(context)
+                .copy(error = MaterialTheme.colors.error, onError = MaterialTheme.colors.onError)
+        } else {
+            MaterialTheme.colors
+        }
+    MaterialTheme(colors = colors, typography = deviceDefaultTypography(context), content = content)
+}
+
+/**
+ * Creates a dynamic color maps that can be overlaid. 100 - Lightest shade; 0 - Darkest Shade; In
+ * wear we only support dark theme for the time being. Thus the fill colors and variants are dark
+ * and anything on top is light. We will use this custom redirection until wear compose material
+ * supports color scheming.
+ *
+ * The mapping is best case match on wear material color tokens from
+ * /android/clockwork/common/wearable/wearmaterial/color/res/values/color-tokens.xml
+ *
+ * @param context The context required to get system resource data.
+ */
+@RequiresApi(Build.VERSION_CODES.S)
+@VisibleForTesting
+internal fun overlayColors(context: Context): Colors {
+    val tonalPalette = dynamicTonalPalette(context)
+    return Colors(
+        background = Color.Black,
+        onBackground = Color.White,
+        primary = tonalPalette.primary90,
+        primaryVariant = tonalPalette.primary80,
+        onPrimary = tonalPalette.primary10,
+        secondary = tonalPalette.tertiary90,
+        secondaryVariant = tonalPalette.tertiary60,
+        onSecondary = tonalPalette.tertiary10,
+        surface = tonalPalette.neutral20,
+        onSurface = tonalPalette.neutral95,
+        onSurfaceVariant = tonalPalette.neutralVariant80,
+    )
+}
+
+private fun fontFamily(context: Context, @StringRes id: Int): FontFamily {
+    val typefaceName = context.resources.getString(id)
+    val font = Font(familyName = DeviceFontFamilyName(typefaceName))
+    return FontFamily(font)
+}
+
+/*
+ Only customizes font family. The material 3 roles to 2.5 are mapped to the best case matching of
+ google3/java/com/google/android/wearable/libraries/compose/theme/GoogleMaterialTheme.kt
+*/
+internal fun deviceDefaultTypography(context: Context): Typography {
+    val defaultTypography = Typography()
+    return Typography(
+        display1 =
+            defaultTypography.display1.copy(
+                fontFamily =
+                    fontFamily(context, R.string.wear_material_compose_display_1_font_family)
+            ),
+        display2 =
+            defaultTypography.display2.copy(
+                fontFamily =
+                    fontFamily(context, R.string.wear_material_compose_display_2_font_family)
+            ),
+        display3 =
+            defaultTypography.display3.copy(
+                fontFamily =
+                    fontFamily(context, R.string.wear_material_compose_display_3_font_family)
+            ),
+        title1 =
+            defaultTypography.title1.copy(
+                fontFamily = fontFamily(context, R.string.wear_material_compose_title_1_font_family)
+            ),
+        title2 =
+            defaultTypography.title2.copy(
+                fontFamily = fontFamily(context, R.string.wear_material_compose_title_2_font_family)
+            ),
+        title3 =
+            defaultTypography.title3.copy(
+                fontFamily = fontFamily(context, R.string.wear_material_compose_title_3_font_family)
+            ),
+        body1 =
+            defaultTypography.body1.copy(
+                fontFamily = fontFamily(context, R.string.wear_material_compose_body_1_font_family)
+            ),
+        body2 =
+            defaultTypography.body2.copy(
+                fontFamily = fontFamily(context, R.string.wear_material_compose_body_2_font_family)
+            ),
+        button =
+            defaultTypography.button.copy(
+                fontFamily = fontFamily(context, R.string.wear_material_compose_button_font_family)
+            ),
+        caption1 =
+            defaultTypography.caption1.copy(
+                fontFamily =
+                    fontFamily(context, R.string.wear_material_compose_caption_1_font_family)
+            ),
+        caption2 =
+            defaultTypography.caption2.copy(
+                fontFamily =
+                    fontFamily(context, R.string.wear_material_compose_caption_2_font_family)
+            ),
+        caption3 =
+            defaultTypography.caption3.copy(
+                fontFamily =
+                    fontFamily(context, R.string.wear_material_compose_caption_3_font_family)
+            ),
+    )
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearPermissionTonalPalette.kt b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearPermissionTonalPalette.kt
new file mode 100644
index 0000000..a92bfb0
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/permissions/request/wear/theme/WearPermissionTonalPalette.kt
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("unused")
+
+package com.android.healthconnect.controller.permissions.request.wear.theme
+
+import android.R
+import android.content.Context
+import android.os.Build
+import androidx.annotation.ColorRes
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Tonal Palette structure in Material.
+ *
+ * A tonal palette is comprised of 5 tonal ranges. Each tonal range includes the 13 stops, or tonal
+ * swatches.
+ *
+ * Tonal range names are:
+ * - Neutral (N)
+ * - Neutral variant (NV)
+ * - Primary (P)
+ * - Secondary (S)
+ * - Tertiary (T)
+ */
+internal class WearPermissionTonalPalette(
+    // The neutral tonal range.
+    val neutral100: Color,
+    val neutral99: Color,
+    val neutral95: Color,
+    val neutral90: Color,
+    val neutral80: Color,
+    val neutral70: Color,
+    val neutral60: Color,
+    val neutral50: Color,
+    val neutral40: Color,
+    val neutral30: Color,
+    val neutral20: Color,
+    val neutral10: Color,
+    val neutral0: Color,
+
+    // The neutral variant tonal range, sometimes called "neutral 2"
+    val neutralVariant100: Color,
+    val neutralVariant99: Color,
+    val neutralVariant95: Color,
+    val neutralVariant90: Color,
+    val neutralVariant80: Color,
+    val neutralVariant70: Color,
+    val neutralVariant60: Color,
+    val neutralVariant50: Color,
+    val neutralVariant40: Color,
+    val neutralVariant30: Color,
+    val neutralVariant20: Color,
+    val neutralVariant10: Color,
+    val neutralVariant0: Color,
+
+    // The primary tonal range, also known as accent 1
+    val primary100: Color,
+    val primary99: Color,
+    val primary95: Color,
+    val primary90: Color,
+    val primary80: Color,
+    val primary70: Color,
+    val primary60: Color,
+    val primary50: Color,
+    val primary40: Color,
+    val primary30: Color,
+    val primary20: Color,
+    val primary10: Color,
+    val primary0: Color,
+
+    // The Secondary tonal range, also know as accent 2
+    val secondary100: Color,
+    val secondary99: Color,
+    val secondary95: Color,
+    val secondary90: Color,
+    val secondary80: Color,
+    val secondary70: Color,
+    val secondary60: Color,
+    val secondary50: Color,
+    val secondary40: Color,
+    val secondary30: Color,
+    val secondary20: Color,
+    val secondary10: Color,
+    val secondary0: Color,
+
+    // The tertiary tonal range, also known as accent 3
+    val tertiary100: Color,
+    val tertiary99: Color,
+    val tertiary95: Color,
+    val tertiary90: Color,
+    val tertiary80: Color,
+    val tertiary70: Color,
+    val tertiary60: Color,
+    val tertiary50: Color,
+    val tertiary40: Color,
+    val tertiary30: Color,
+    val tertiary20: Color,
+    val tertiary10: Color,
+    val tertiary0: Color,
+)
+/** Dynamic colors for wear compose material to support resource overlay. */
+@RequiresApi(Build.VERSION_CODES.S)
+// TODO: once we have proper support for this on Wear 6+, we will do something similar to
+// https://source.corp.google.com/h/android/platform/superproject/+/androidx-main:frameworks/support/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.android.kt;l=307-362?q=dynamicTonalPalette&sq=repo:android%2Fplatform%2Fsuperproject%20b:androidx-main
+// Tracking Bug: b/270720571
+internal fun dynamicTonalPalette(context: Context) =
+    WearPermissionTonalPalette(
+        // The neutral tonal range from the generated dynamic color palette.
+        neutral100 = ColorResourceHelper.getColor(context, R.color.system_neutral1_0),
+        neutral99 = ColorResourceHelper.getColor(context, R.color.system_neutral1_10),
+        neutral95 = ColorResourceHelper.getColor(context, R.color.system_neutral1_50),
+        neutral90 = ColorResourceHelper.getColor(context, R.color.system_neutral1_100),
+        neutral80 = ColorResourceHelper.getColor(context, R.color.system_neutral1_200),
+        neutral70 = ColorResourceHelper.getColor(context, R.color.system_neutral1_300),
+        neutral60 = ColorResourceHelper.getColor(context, R.color.system_neutral1_400),
+        neutral50 = ColorResourceHelper.getColor(context, R.color.system_neutral1_500),
+        neutral40 = ColorResourceHelper.getColor(context, R.color.system_neutral1_600),
+        neutral30 = ColorResourceHelper.getColor(context, R.color.system_neutral1_700),
+        neutral20 = ColorResourceHelper.getColor(context, R.color.system_neutral1_800),
+        neutral10 = ColorResourceHelper.getColor(context, R.color.system_neutral1_900),
+        neutral0 = ColorResourceHelper.getColor(context, R.color.system_neutral1_1000),
+
+        // The neutral variant tonal range, sometimes called "neutral 2",  from the
+        // generated dynamic color palette.
+        neutralVariant100 = ColorResourceHelper.getColor(context, R.color.system_neutral2_0),
+        neutralVariant99 = ColorResourceHelper.getColor(context, R.color.system_neutral2_10),
+        neutralVariant95 = ColorResourceHelper.getColor(context, R.color.system_neutral2_50),
+        neutralVariant90 = ColorResourceHelper.getColor(context, R.color.system_neutral2_100),
+        neutralVariant80 = ColorResourceHelper.getColor(context, R.color.system_neutral2_200),
+        neutralVariant70 = ColorResourceHelper.getColor(context, R.color.system_neutral2_300),
+        neutralVariant60 = ColorResourceHelper.getColor(context, R.color.system_neutral2_400),
+        neutralVariant50 = ColorResourceHelper.getColor(context, R.color.system_neutral2_500),
+        neutralVariant40 = ColorResourceHelper.getColor(context, R.color.system_neutral2_600),
+        neutralVariant30 = ColorResourceHelper.getColor(context, R.color.system_neutral2_700),
+        neutralVariant20 = ColorResourceHelper.getColor(context, R.color.system_neutral2_800),
+        neutralVariant10 = ColorResourceHelper.getColor(context, R.color.system_neutral2_900),
+        neutralVariant0 = ColorResourceHelper.getColor(context, R.color.system_neutral2_1000),
+
+        // The primary tonal range from the generated dynamic color palette.
+        primary100 = ColorResourceHelper.getColor(context, R.color.system_accent1_0),
+        primary99 = ColorResourceHelper.getColor(context, R.color.system_accent1_10),
+        primary95 = ColorResourceHelper.getColor(context, R.color.system_accent1_50),
+        primary90 = ColorResourceHelper.getColor(context, R.color.system_accent1_100),
+        primary80 = ColorResourceHelper.getColor(context, R.color.system_accent1_200),
+        primary70 = ColorResourceHelper.getColor(context, R.color.system_accent1_300),
+        primary60 = ColorResourceHelper.getColor(context, R.color.system_accent1_400),
+        primary50 = ColorResourceHelper.getColor(context, R.color.system_accent1_500),
+        primary40 = ColorResourceHelper.getColor(context, R.color.system_accent1_600),
+        primary30 = ColorResourceHelper.getColor(context, R.color.system_accent1_700),
+        primary20 = ColorResourceHelper.getColor(context, R.color.system_accent1_800),
+        primary10 = ColorResourceHelper.getColor(context, R.color.system_accent1_900),
+        primary0 = ColorResourceHelper.getColor(context, R.color.system_accent1_1000),
+
+        // The secondary tonal range from the generated dynamic color palette.
+        secondary100 = ColorResourceHelper.getColor(context, R.color.system_accent2_0),
+        secondary99 = ColorResourceHelper.getColor(context, R.color.system_accent2_10),
+        secondary95 = ColorResourceHelper.getColor(context, R.color.system_accent2_50),
+        secondary90 = ColorResourceHelper.getColor(context, R.color.system_accent2_100),
+        secondary80 = ColorResourceHelper.getColor(context, R.color.system_accent2_200),
+        secondary70 = ColorResourceHelper.getColor(context, R.color.system_accent2_300),
+        secondary60 = ColorResourceHelper.getColor(context, R.color.system_accent2_400),
+        secondary50 = ColorResourceHelper.getColor(context, R.color.system_accent2_500),
+        secondary40 = ColorResourceHelper.getColor(context, R.color.system_accent2_600),
+        secondary30 = ColorResourceHelper.getColor(context, R.color.system_accent2_700),
+        secondary20 = ColorResourceHelper.getColor(context, R.color.system_accent2_800),
+        secondary10 = ColorResourceHelper.getColor(context, R.color.system_accent2_900),
+        secondary0 = ColorResourceHelper.getColor(context, R.color.system_accent2_1000),
+
+        // The tertiary tonal range from the generated dynamic color palette.
+        tertiary100 = ColorResourceHelper.getColor(context, R.color.system_accent3_0),
+        tertiary99 = ColorResourceHelper.getColor(context, R.color.system_accent3_10),
+        tertiary95 = ColorResourceHelper.getColor(context, R.color.system_accent3_50),
+        tertiary90 = ColorResourceHelper.getColor(context, R.color.system_accent3_100),
+        tertiary80 = ColorResourceHelper.getColor(context, R.color.system_accent3_200),
+        tertiary70 = ColorResourceHelper.getColor(context, R.color.system_accent3_300),
+        tertiary60 = ColorResourceHelper.getColor(context, R.color.system_accent3_400),
+        tertiary50 = ColorResourceHelper.getColor(context, R.color.system_accent3_500),
+        tertiary40 = ColorResourceHelper.getColor(context, R.color.system_accent3_600),
+        tertiary30 = ColorResourceHelper.getColor(context, R.color.system_accent3_700),
+        tertiary20 = ColorResourceHelper.getColor(context, R.color.system_accent3_800),
+        tertiary10 = ColorResourceHelper.getColor(context, R.color.system_accent3_900),
+        tertiary0 = ColorResourceHelper.getColor(context, R.color.system_accent3_1000),
+    )
+
+private object ColorResourceHelper {
+    @DoNotInline
+    fun getColor(context: Context, @ColorRes id: Int): Color {
+        return Color(context.resources.getColor(id, context.theme))
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/shared/DisconnectAllAppPermissionsDialogFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/shared/DisconnectAllAppPermissionsDialogFragment.kt
deleted file mode 100644
index 8980396..0000000
--- a/apk/src/com/android/healthconnect/controller/permissions/shared/DisconnectAllAppPermissionsDialogFragment.kt
+++ /dev/null
@@ -1,166 +0,0 @@
-/**
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.android.healthconnect.controller.permissions.shared
-
-import android.app.Dialog
-import android.os.Bundle
-import android.view.View
-import android.widget.CheckBox
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.core.os.bundleOf
-import androidx.fragment.app.DialogFragment
-import androidx.fragment.app.activityViewModels
-import androidx.fragment.app.setFragmentResult
-import com.android.healthconnect.controller.R
-import com.android.healthconnect.controller.permissions.additionalaccess.AdditionalAccessViewModel
-import com.android.healthconnect.controller.shared.dialog.AlertDialogBuilder
-import com.android.healthconnect.controller.utils.AttributeResolver
-import com.android.healthconnect.controller.utils.logging.DisconnectAppDialogElement
-import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
-import dagger.hilt.android.AndroidEntryPoint
-import javax.inject.Inject
-
-/**
- * A Dialog Fragment to get confirmation from user for revoking all fitness and medical permissions
- * of an app.
- */
-@AndroidEntryPoint(DialogFragment::class)
-class DisconnectAllAppPermissionsDialogFragment() :
-    Hilt_DisconnectAllAppPermissionsDialogFragment() {
-    private val viewModel: AdditionalAccessViewModel by activityViewModels()
-
-    constructor(appName: String, showCheckbox: Boolean = true) : this() {
-        this.appName = appName
-        this.showCheckbox = showCheckbox
-    }
-
-    companion object {
-        const val TAG = "DisconnectAllAppPermissionsDialogFragment"
-        const val DISCONNECT_CANCELED_EVENT = "DISCONNECT_ALL_PERMISSIONS_CANCELED_EVENT"
-        const val DISCONNECT_EVENT = "DISCONNECT_ALL_PERMISSIONS_EVENT"
-        const val KEY_DELETE_DATA = "KEY_DELETE_DATA"
-        const val KEY_APP_NAME = "KEY_APP_NAME"
-        const val KEY_INCLUDE_BACKGROUND_READ = "KEY_INCLUDE_BACKGROUND_READ"
-        const val KEY_INCLUDE_HISTORY_READ = "KEY_INCLUDE_HISTORY_READ"
-        const val KEY_SHOW_CHECKBOX = "KEY_SHOW_CHECKBOX"
-    }
-
-    lateinit var appName: String
-    private var showCheckbox: Boolean = true
-    private var includeBackgroundRead: Boolean = false
-    private var includeHistoryRead: Boolean = false
-    @Inject lateinit var logger: HealthConnectLogger
-
-    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
-        if (savedInstanceState != null) {
-            appName =
-                savedInstanceState.getString(
-                    DisconnectHealthPermissionsDialogFragment.KEY_APP_NAME,
-                    "",
-                )
-            includeBackgroundRead =
-                savedInstanceState.getBoolean(KEY_INCLUDE_BACKGROUND_READ, false)
-            includeHistoryRead = savedInstanceState.getBoolean(KEY_INCLUDE_HISTORY_READ, false)
-            showCheckbox = savedInstanceState.getBoolean(KEY_SHOW_CHECKBOX, false)
-        }
-        val additionalPermissionsState =
-            viewModel.additionalAccessState.value ?: AdditionalAccessViewModel.State()
-        includeHistoryRead = additionalPermissionsState.historyReadUIState.isDeclared
-        includeBackgroundRead = additionalPermissionsState.backgroundReadUIState.isDeclared
-
-        val body = layoutInflater.inflate(R.layout.dialog_message_with_checkbox, null)
-        body.findViewById<TextView>(R.id.dialog_message).apply {
-            text =
-                if (includeBackgroundRead && includeHistoryRead) {
-                    getString(
-                        R.string.disconnect_all_health_and_additional_permissions_dialog_message,
-                        appName,
-                    )
-                } else if (includeBackgroundRead) {
-                    getString(
-                        R.string.disconnect_all_health_and_background_permissions_dialog_message,
-                        appName,
-                    )
-                } else if (includeHistoryRead) {
-                    getString(
-                        R.string.disconnect_all_health_and_historical_permissions_dialog_message,
-                        appName,
-                    )
-                } else {
-                    getString(
-                        R.string.disconnect_all_health_no_additional_permissions_dialog_message,
-                        appName,
-                    )
-                }
-        }
-        body.findViewById<TextView>(R.id.dialog_title).apply {
-            text = getString(R.string.disconnect_all_health_permissions_title)
-        }
-        val iconView = body.findViewById(R.id.dialog_icon) as ImageView
-        val iconDrawable =
-            AttributeResolver.getNullableDrawable(body.context, R.attr.disconnectIcon)
-        iconDrawable?.let {
-            iconView.setImageDrawable(it)
-            iconView.visibility = View.VISIBLE
-        }
-        val checkBox =
-            body.findViewById<CheckBox>(R.id.dialog_checkbox).apply {
-                if (!showCheckbox) {
-                    visibility = View.GONE
-                    return@apply
-                }
-                text =
-                    getString(R.string.disconnect_all_health_permissions_dialog_checkbox, appName)
-            }
-        checkBox.setOnCheckedChangeListener { _, _ ->
-            logger.logInteraction(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
-        }
-
-        val dialog =
-            AlertDialogBuilder(this, DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
-                .setView(body)
-                .setNeutralButton(
-                    android.R.string.cancel,
-                    DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON,
-                ) { _, _ ->
-                    setFragmentResult(DISCONNECT_CANCELED_EVENT, bundleOf())
-                }
-                .setPositiveButton(
-                    R.string.permissions_disconnect_dialog_disconnect,
-                    DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON,
-                ) { _, _ ->
-                    setFragmentResult(
-                        DISCONNECT_EVENT,
-                        bundleOf(KEY_DELETE_DATA to checkBox.isChecked),
-                    )
-                }
-                .setAdditionalLogging {
-                    logger.logImpression(
-                        DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX
-                    )
-                }
-                .create()
-        dialog.setCanceledOnTouchOutside(false)
-        return dialog
-    }
-
-    override fun onSaveInstanceState(outState: Bundle) {
-        super.onSaveInstanceState(outState)
-        outState.putString(KEY_APP_NAME, appName)
-        outState.putBoolean(KEY_INCLUDE_BACKGROUND_READ, includeBackgroundRead)
-        outState.putBoolean(KEY_INCLUDE_HISTORY_READ, includeHistoryRead)
-        outState.putBoolean(KEY_SHOW_CHECKBOX, showCheckbox)
-    }
-}
diff --git a/apk/src/com/android/healthconnect/controller/permissions/shared/DisconnectHealthPermissionsDialogFragment.kt b/apk/src/com/android/healthconnect/controller/permissions/shared/DisconnectHealthPermissionsDialogFragment.kt
index 74bd12e..801781a 100644
--- a/apk/src/com/android/healthconnect/controller/permissions/shared/DisconnectHealthPermissionsDialogFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/permissions/shared/DisconnectHealthPermissionsDialogFragment.kt
@@ -20,12 +20,11 @@
 import android.widget.ImageView
 import android.widget.TextView
 import androidx.core.os.bundleOf
-import androidx.core.view.isVisible
 import androidx.fragment.app.DialogFragment
 import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.setFragmentResult
 import com.android.healthconnect.controller.R
-import com.android.healthconnect.controller.permissions.additionalaccess.AdditionalAccessViewModel
+import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel
 import com.android.healthconnect.controller.shared.dialog.AlertDialogBuilder
 import com.android.healthconnect.controller.utils.AttributeResolver
 import com.android.healthconnect.controller.utils.logging.DisconnectAppDialogElement
@@ -34,18 +33,23 @@
 import javax.inject.Inject
 
 /**
- * A Dialog Fragment to get confirmation from user for revoking all fitness or medical permissions
- * of an app.
+ * A Dialog Fragment to get confirmation from user for revoking all fitness, medical, or health
+ * permissions of an app.
  */
 @AndroidEntryPoint(DialogFragment::class)
 class DisconnectHealthPermissionsDialogFragment() :
     Hilt_DisconnectHealthPermissionsDialogFragment() {
 
-    private val viewModel: AdditionalAccessViewModel by activityViewModels()
+    private val appPermissionViewModel: AppPermissionViewModel by activityViewModels()
 
-    constructor(appName: String, enableDeleteData: Boolean = true) : this() {
+    constructor(
+        appName: String,
+        enableDeleteData: Boolean = true,
+        disconnectType: DisconnectType = DisconnectType.ALL,
+    ) : this() {
         this.appName = appName
         this.enableDeleteData = enableDeleteData
+        this.disconnectType = disconnectType
     }
 
     companion object {
@@ -57,12 +61,16 @@
         const val KEY_ENABLE_DELETE_DATA = "KEY_ENABLE_DELETE_DATA"
         const val KEY_INCLUDE_BACKGROUND_READ = "KEY_INCLUDE_BACKGROUND_READ"
         const val KEY_INCLUDE_HISTORY_READ = "KEY_INCLUDE_HISTORY_READ"
+        const val KEY_DISCONNECT_TYPE = "KEY_INCLUDE_DISCONNECT_TYPE"
+        const val KEY_HAS_MEDICAL_PERMISSIONS = "KEY_HAS_MEDICAL_PERMISSIONS"
     }
 
     lateinit var appName: String
     private var enableDeleteData: Boolean = true
     private var includeBackgroundRead: Boolean = false
     private var includeHistoryRead: Boolean = false
+    private var disconnectType: DisconnectType = DisconnectType.FITNESS
+    private var hasMedicalPermissions: Boolean = false
 
     @Inject lateinit var logger: HealthConnectLogger
 
@@ -74,29 +82,49 @@
             includeBackgroundRead =
                 savedInstanceState.getBoolean(KEY_INCLUDE_BACKGROUND_READ, false)
             includeHistoryRead = savedInstanceState.getBoolean(KEY_INCLUDE_HISTORY_READ, false)
+
+            disconnectType =
+                DisconnectType.valueOf(
+                    savedInstanceState.getString(KEY_DISCONNECT_TYPE, DisconnectType.FITNESS.name)
+                )
+
+            hasMedicalPermissions =
+                savedInstanceState.getBoolean(KEY_HAS_MEDICAL_PERMISSIONS, false)
         }
 
-        val additionalPermissionsState =
-            viewModel.additionalAccessState.value ?: AdditionalAccessViewModel.State()
-        includeHistoryRead = additionalPermissionsState.historyReadUIState.isDeclared
-        includeBackgroundRead = additionalPermissionsState.backgroundReadUIState.isDeclared
+        includeHistoryRead =
+            when (disconnectType) {
+                DisconnectType.FITNESS -> {
+                    appPermissionViewModel.revokeFitnessShouldIncludePastData()
+                }
+                DisconnectType.MEDICAL -> {
+                    appPermissionViewModel.revokeMedicalShouldIncludePastData()
+                }
+                else -> {
+                    appPermissionViewModel.revokeAllShouldIncludePastData()
+                }
+            }
+
+        includeBackgroundRead =
+            when (disconnectType) {
+                DisconnectType.FITNESS -> {
+                    appPermissionViewModel.revokeFitnessShouldIncludeBackground()
+                }
+                DisconnectType.MEDICAL -> {
+                    appPermissionViewModel.revokeMedicalShouldIncludeBackground()
+                }
+                DisconnectType.ALL -> {
+                    appPermissionViewModel.revokeAllShouldIncludeBackground()
+                }
+            }
+
+        hasMedicalPermissions =
+            appPermissionViewModel.medicalPermissions.value.orEmpty().isNotEmpty()
 
         val body = layoutInflater.inflate(R.layout.dialog_message_with_checkbox, null)
-        body.findViewById<TextView>(R.id.dialog_message).apply {
-            text =
-                if (includeBackgroundRead && includeHistoryRead) {
-                    getString(R.string.permissions_disconnect_dialog_message_combined, appName)
-                } else if (includeBackgroundRead) {
-                    getString(R.string.permissions_disconnect_dialog_message_background, appName)
-                } else if (includeHistoryRead) {
-                    getString(R.string.permissions_disconnect_dialog_message_history, appName)
-                } else {
-                    getString(R.string.permissions_disconnect_dialog_message, appName)
-                }
-        }
-        body.findViewById<TextView>(R.id.dialog_title).apply {
-            text = getString(R.string.permissions_disconnect_dialog_title)
-        }
+        body.findViewById<TextView>(R.id.dialog_message).apply { text = buildMessage() }
+
+        body.findViewById<TextView>(R.id.dialog_title).apply { text = buildTitle() }
         val iconView = body.findViewById(R.id.dialog_icon) as ImageView
         val iconDrawable =
             AttributeResolver.getNullableDrawable(body.context, R.attr.disconnectIcon)
@@ -106,8 +134,8 @@
         }
         val checkBox =
             body.findViewById<CheckBox>(R.id.dialog_checkbox).apply {
-                text = getString(R.string.permissions_disconnect_dialog_checkbox, appName)
-                isVisible = enableDeleteData
+                text = buildCheckboxText()
+                visibility = if (enableDeleteData) View.VISIBLE else View.GONE
             }
         checkBox.setOnCheckedChangeListener { _, _ ->
             logger.logInteraction(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
@@ -141,11 +169,136 @@
         return dialog
     }
 
+    private fun buildMessage(): String {
+        return when (disconnectType) {
+            DisconnectType.FITNESS -> {
+                if (hasMedicalPermissions) {
+                    getDisconnectMessageForFitnessOrMedicalPermissions()
+                } else {
+                    getDisconnectMessageForFitnessWithoutMedicalPermissions()
+                }
+            }
+            DisconnectType.MEDICAL -> {
+                getDisconnectMessageForFitnessOrMedicalPermissions()
+            }
+            DisconnectType.ALL -> {
+                getDisconnectMessageForAllPermissions()
+            }
+        }
+    }
+
+    private fun getDisconnectMessageForFitnessOrMedicalPermissions(): String {
+        return if (includeBackgroundRead && includeHistoryRead) {
+            getString(
+                R.string
+                    .disconnect_all_fitness_or_medical_and_additional_permissions_dialog_message,
+                appName,
+            )
+        } else if (includeBackgroundRead) {
+            getString(
+                R.string
+                    .disconnect_all_fitness_or_medical_and_background_permissions_dialog_message,
+                appName,
+            )
+        } else if (includeHistoryRead) {
+            getString(
+                R.string
+                    .disconnect_all_fitness_or_medical_and_historical_permissions_dialog_message,
+                appName,
+            )
+        } else {
+            getString(
+                R.string.disconnect_all_fitness_or_medical_no_additional_permissions_dialog_message,
+                appName,
+            )
+        }
+    }
+
+    private fun getDisconnectMessageForFitnessWithoutMedicalPermissions(): String {
+        return if (includeBackgroundRead && includeHistoryRead) {
+            getString(R.string.permissions_disconnect_dialog_message_combined, appName)
+        } else if (includeBackgroundRead) {
+            getString(R.string.permissions_disconnect_dialog_message_background, appName)
+        } else if (includeHistoryRead) {
+            getString(R.string.permissions_disconnect_dialog_message_history, appName)
+        } else {
+            getString(R.string.permissions_disconnect_dialog_message, appName)
+        }
+    }
+
+    private fun getDisconnectMessageForAllPermissions(): String {
+        return if (includeBackgroundRead && includeHistoryRead) {
+            getString(
+                R.string.disconnect_all_health_and_additional_permissions_dialog_message,
+                appName,
+            )
+        } else if (includeBackgroundRead) {
+            getString(
+                R.string.disconnect_all_health_and_background_permissions_dialog_message,
+                appName,
+            )
+        } else if (includeHistoryRead) {
+            getString(
+                R.string.disconnect_all_health_and_historical_permissions_dialog_message,
+                appName,
+            )
+        } else {
+            getString(
+                R.string.disconnect_all_health_no_additional_permissions_dialog_message,
+                appName,
+            )
+        }
+    }
+
+    private fun buildTitle(): String {
+        return when (disconnectType) {
+            DisconnectType.FITNESS -> {
+                if (hasMedicalPermissions) {
+                    getString(R.string.disconnect_all_fitness_permissions_title)
+                } else {
+                    getString(R.string.permissions_disconnect_dialog_title)
+                }
+            }
+            DisconnectType.MEDICAL -> {
+                getString(R.string.disconnect_all_medical_permissions_title)
+            }
+            DisconnectType.ALL -> {
+                getString(R.string.disconnect_all_health_permissions_title)
+            }
+        }
+    }
+
+    private fun buildCheckboxText(): String {
+        return when (disconnectType) {
+            DisconnectType.FITNESS -> {
+                if (hasMedicalPermissions) {
+                    getString(R.string.disconnect_all_fitness_permissions_dialog_checkbox, appName)
+                } else {
+                    getString(R.string.permissions_disconnect_dialog_checkbox, appName)
+                }
+            }
+            DisconnectType.MEDICAL -> {
+                getString(R.string.disconnect_all_medical_permissions_dialog_checkbox, appName)
+            }
+            DisconnectType.ALL -> {
+                getString(R.string.disconnect_all_health_permissions_dialog_checkbox, appName)
+            }
+        }
+    }
+
     override fun onSaveInstanceState(outState: Bundle) {
         super.onSaveInstanceState(outState)
         outState.putString(KEY_APP_NAME, appName)
         outState.putBoolean(KEY_ENABLE_DELETE_DATA, enableDeleteData)
         outState.putBoolean(KEY_INCLUDE_BACKGROUND_READ, includeBackgroundRead)
         outState.putBoolean(KEY_INCLUDE_HISTORY_READ, includeHistoryRead)
+        outState.putString(KEY_DISCONNECT_TYPE, disconnectType.name)
+        outState.putBoolean(KEY_HAS_MEDICAL_PERMISSIONS, hasMedicalPermissions)
+    }
+
+    enum class DisconnectType {
+        MEDICAL,
+        FITNESS,
+        ALL,
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/recentaccess/RecentAccessPreference.kt b/apk/src/com/android/healthconnect/controller/recentaccess/RecentAccessPreference.kt
index f76a347..430c443 100644
--- a/apk/src/com/android/healthconnect/controller/recentaccess/RecentAccessPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/recentaccess/RecentAccessPreference.kt
@@ -26,23 +26,18 @@
 import com.android.healthconnect.controller.permissions.connectedapps.ComparablePreference
 import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.utils.TimeSource
+import com.android.healthconnect.controller.utils.formatRecentAccessTime
 import com.android.healthconnect.controller.utils.logging.RecentAccessElement
-import java.time.Instant
-import java.time.LocalTime
-import java.time.ZoneId
-import java.time.format.DateTimeFormatter
-import java.util.Locale
 
 /** Custom preference for displaying Recent access apps, including dash lines for timeline views. */
-class RecentAccessPreference
-constructor(
+class RecentAccessPreference(
     context: Context,
     private val recentAccessEntry: RecentAccessEntry,
     private val timeSource: TimeSource,
     private val showCategories: Boolean,
 ) : HealthPreference(context), ComparablePreference {
 
-    private val separator: String by lazy { context.getString(R.string.data_type_separator) }
+    private val separator: String by lazy { context.getString(R.string.separator) }
 
     init {
         layoutResource = R.layout.widget_recent_access_timeline
@@ -76,7 +71,8 @@
         }
 
         val accessTime = holder.findViewById(R.id.time) as TextView
-        val formattedTime = formatTime(recentAccessEntry.instantTime)
+        val formattedTime =
+            formatRecentAccessTime(recentAccessEntry.instantTime, timeSource, context)
         accessTime.text = formattedTime
         accessTime.contentDescription =
             context.getString(R.string.recent_access_time_content_descritption, formattedTime)
@@ -118,17 +114,4 @@
 
         return sortedList
     }
-
-    private fun formatTime(instant: Instant): String {
-        val localTime: LocalTime = instant.atZone(ZoneId.systemDefault()).toLocalTime()
-        return if (timeSource.is24Hour(context)) {
-            localTime.format(DateTimeFormatter.ofPattern("HH:mm"))
-        } else {
-            if (Locale.getDefault() == Locale.KOREA || Locale.getDefault() == Locale.KOREAN) {
-                localTime.format(DateTimeFormatter.ofPattern("a h:mm"))
-            } else {
-                localTime.format(DateTimeFormatter.ofPattern("h:mm a"))
-            }
-        }
-    }
 }
diff --git a/apk/src/com/android/healthconnect/controller/recentaccess/RecentAccessViewModel.kt b/apk/src/com/android/healthconnect/controller/recentaccess/RecentAccessViewModel.kt
index 2c7a1ea..15cdf91 100644
--- a/apk/src/com/android/healthconnect/controller/recentaccess/RecentAccessViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/recentaccess/RecentAccessViewModel.kt
@@ -31,7 +31,7 @@
 import com.android.healthconnect.controller.shared.safelyDataTypeToCategory
 import com.android.healthconnect.controller.utils.TimeSource
 import com.android.healthconnect.controller.utils.postValueIfUpdated
-import com.android.healthfitness.flags.Flags.personalHealthRecord
+import com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled
 import dagger.hilt.android.lifecycle.HiltViewModel
 import java.time.Duration
 import java.time.Instant
@@ -229,7 +229,7 @@
             accessLog.recordTypes.mapNotNull { safelyDataTypeToCategory(it)?.uppercaseTitle() }
         )
 
-        if (personalHealthRecord() && accessLog.medicalResourceTypes.isNotEmpty()) {
+        if (isPersonalHealthRecordEnabled() && accessLog.medicalResourceTypes.isNotEmpty()) {
             accessedData.add(R.string.medical_permissions)
         }
     }
diff --git a/apk/src/com/android/healthconnect/controller/route/RouteRequestActivity.kt b/apk/src/com/android/healthconnect/controller/route/RouteRequestActivity.kt
index bd32eac..d2cf562 100644
--- a/apk/src/com/android/healthconnect/controller/route/RouteRequestActivity.kt
+++ b/apk/src/com/android/healthconnect/controller/route/RouteRequestActivity.kt
@@ -22,8 +22,6 @@
 import android.health.connect.datatypes.ExerciseRoute
 import android.os.Bundle
 import android.util.Log
-import android.view.View.GONE
-import android.view.View.VISIBLE
 import android.view.WindowManager
 import android.widget.Button
 import android.widget.LinearLayout
@@ -46,7 +44,6 @@
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.shared.dialog.AlertDialogBuilder
 import com.android.healthconnect.controller.shared.map.MapView
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import com.android.healthconnect.controller.utils.boldAppName
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
@@ -65,8 +62,6 @@
 
     @Inject lateinit var appInfoReader: AppInfoReader
 
-    @Inject lateinit var featureUtils: FeatureUtils
-
     @VisibleForTesting var dialog: AlertDialog? = null
 
     @VisibleForTesting lateinit var infoDialog: AlertDialog
@@ -87,7 +82,8 @@
         super.onCreate(savedInstanceState)
         // This flag ensures a non system app cannot show an overlay on Health Connect. b/313425281
         window.addSystemFlags(
-            WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
+            WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
+        )
         if (sessionIdExtra == null || callingPackage == null) {
             Log.e(TAG, "Invalid Intent Extras, finishing.")
             finishCancelled()
@@ -124,9 +120,11 @@
     }
 
     private fun setupRequestDialog(data: SessionWithAttribution?, callingPackage: String) {
-        if (data == null ||
-            data.session.route == null ||
-            data.session.route?.routeLocations.isNullOrEmpty()) {
+        if (
+            data == null ||
+                data.session.route == null ||
+                data.session.route?.routeLocations.isNullOrEmpty()
+        ) {
             Log.e(TAG, "No route or empty route, finishing.")
             finishCancelled()
             return
@@ -135,8 +133,10 @@
         val session = data.session
         val route = session.route!!
 
-        if (session.metadata.dataOrigin.packageName == callingPackage &&
-            viewModel.isRouteReadOrWritePermissionGranted(callingPackage)) {
+        if (
+            session.metadata.dataOrigin.packageName == callingPackage &&
+                viewModel.isRouteReadOrWritePermissionGranted(callingPackage)
+        ) {
             finishWithResult(route)
             return
         }
@@ -161,11 +161,14 @@
             applicationContext.getString(
                 R.string.date_owner_format,
                 LocalDateTimeFormatter(applicationContext).formatLongDate(session.startTime),
-                data.appInfo.appName)
+                data.appInfo.appName,
+            )
         val sessionTitle =
             if (session.title.isNullOrBlank())
                 ExerciseSessionFormatter.Companion.getExerciseType(
-                    applicationContext, session.exerciseType)
+                    applicationContext,
+                    session.exerciseType,
+                )
             else session.title
 
         val view = layoutInflater.inflate(R.layout.route_request_dialog, null)
@@ -178,7 +181,8 @@
 
         view.findViewById<LinearLayout>(R.id.more_info).setOnClickListener {
             healthConnectLogger.logInteraction(
-                RouteRequestElement.EXERCISE_ROUTE_DIALOG_INFORMATION_BUTTON)
+                RouteRequestElement.EXERCISE_ROUTE_DIALOG_INFORMATION_BUTTON
+            )
             dialog?.hide()
             setupInfoDialog()
             infoDialog.show()
@@ -186,7 +190,8 @@
 
         view.findViewById<Button>(R.id.route_dont_allow_button).setOnClickListener {
             healthConnectLogger.logInteraction(
-                RouteRequestElement.EXERCISE_ROUTE_DIALOG_DONT_ALLOW_BUTTON)
+                RouteRequestElement.EXERCISE_ROUTE_DIALOG_DONT_ALLOW_BUTTON
+            )
             finishCancelled()
         }
 
@@ -194,23 +199,16 @@
 
         allowAllButton.setOnClickListener {
             healthConnectLogger.logInteraction(
-                RouteRequestElement.EXERCISE_ROUTE_DIALOG_ALWAYS_ALLOW_BUTTON)
+                RouteRequestElement.EXERCISE_ROUTE_DIALOG_ALWAYS_ALLOW_BUTTON
+            )
             viewModel.grantReadRoutesPermission(callingPackage)
             finishWithResult(route)
         }
 
-        val shouldShowAllowAllRoutesButton = featureUtils.isExerciseRouteReadAllEnabled()
-
-        allowAllButton.visibility =
-            if (shouldShowAllowAllRoutesButton) {
-                VISIBLE
-            } else {
-                GONE
-            }
-
         view.findViewById<Button>(R.id.route_allow_button).setOnClickListener {
             healthConnectLogger.logInteraction(
-                RouteRequestElement.EXERCISE_ROUTE_DIALOG_ALLOW_BUTTON)
+                RouteRequestElement.EXERCISE_ROUTE_DIALOG_ALLOW_BUTTON
+            )
             finishWithResult(route)
         }
 
@@ -222,13 +220,17 @@
                 .setCancelable(false)
                 .setAdditionalLogging {
                     healthConnectLogger.logImpression(
-                        RouteRequestElement.EXERCISE_ROUTE_DIALOG_ROUTE_VIEW)
+                        RouteRequestElement.EXERCISE_ROUTE_DIALOG_ROUTE_VIEW
+                    )
                     healthConnectLogger.logImpression(
-                        RouteRequestElement.EXERCISE_ROUTE_DIALOG_ALLOW_BUTTON)
+                        RouteRequestElement.EXERCISE_ROUTE_DIALOG_ALLOW_BUTTON
+                    )
                     healthConnectLogger.logImpression(
-                        RouteRequestElement.EXERCISE_ROUTE_DIALOG_DONT_ALLOW_BUTTON)
+                        RouteRequestElement.EXERCISE_ROUTE_DIALOG_DONT_ALLOW_BUTTON
+                    )
                     healthConnectLogger.logImpression(
-                        RouteRequestElement.EXERCISE_ROUTE_DIALOG_INFORMATION_BUTTON)
+                        RouteRequestElement.EXERCISE_ROUTE_DIALOG_INFORMATION_BUTTON
+                    )
                 }
                 .create()
         if (shouldShowDialog()) {
@@ -244,7 +246,8 @@
                     MigrationUiState.COMPLETE,
                     MigrationUiState.COMPLETE_IDLE,
                     MigrationUiState.ALLOWED_MIGRATOR_DISABLED,
-                    MigrationUiState.ALLOWED_ERROR)
+                    MigrationUiState.ALLOWED_ERROR,
+                )
 
     private fun setupInfoDialog() {
         val view = layoutInflater.inflate(R.layout.route_sharing_info_dialog, null)
@@ -254,9 +257,10 @@
                 .setCustomTitle(getString(R.string.request_route_info_header_title))
                 .setNegativeButton(
                     R.string.back_button,
-                    RouteRequestElement.EXERCISE_ROUTE_EDUCATION_DIALOG_BACK_BUTTON) { _, _ ->
-                        dialog?.show()
-                    }
+                    RouteRequestElement.EXERCISE_ROUTE_EDUCATION_DIALOG_BACK_BUTTON,
+                ) { _, _ ->
+                    dialog?.show()
+                }
                 .setView(view)
                 .setCancelable(false)
                 .create()
@@ -271,21 +275,30 @@
             showMigrationInProgressDialog(
                 this,
                 applicationContext.getString(
-                    R.string.migration_in_progress_permissions_dialog_content, requester)) { _, _ ->
-                    finish()
-                }
-        } else if (migrationUiState in
-            listOf(
-                MigrationUiState.ALLOWED_PAUSED,
-                MigrationUiState.ALLOWED_NOT_STARTED,
-                MigrationUiState.MODULE_UPGRADE_REQUIRED,
-                MigrationUiState.APP_UPGRADE_REQUIRED)) {
+                    R.string.migration_in_progress_permissions_dialog_content,
+                    requester,
+                ),
+            ) { _, _ ->
+                finish()
+            }
+        } else if (
+            migrationUiState in
+                listOf(
+                    MigrationUiState.ALLOWED_PAUSED,
+                    MigrationUiState.ALLOWED_NOT_STARTED,
+                    MigrationUiState.MODULE_UPGRADE_REQUIRED,
+                    MigrationUiState.APP_UPGRADE_REQUIRED,
+                )
+        ) {
             showMigrationPendingDialog(
                 this,
                 applicationContext.getString(
-                    R.string.migration_pending_permissions_dialog_content, requester),
+                    R.string.migration_pending_permissions_dialog_content,
+                    requester,
+                ),
                 positiveButtonAction = { _, _ -> dialog?.show() },
-                negativeButtonAction = { _, _ -> finishCancelled() })
+                negativeButtonAction = { _, _ -> finishCancelled() },
+            )
         } else if (migrationUiState == MigrationUiState.COMPLETE) {
             maybeShowWhatsNewDialog(this) { _, _ -> dialog?.show() }
         } else {
diff --git a/apk/src/com/android/healthconnect/controller/safetycenter/HealthConnectSafetySource.kt b/apk/src/com/android/healthconnect/controller/safetycenter/HealthConnectSafetySource.kt
index 6b8ede8..ecc9ab1 100644
--- a/apk/src/com/android/healthconnect/controller/safetycenter/HealthConnectSafetySource.kt
+++ b/apk/src/com/android/healthconnect/controller/safetycenter/HealthConnectSafetySource.kt
@@ -27,25 +27,16 @@
 import android.safetycenter.SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED
 import android.safetycenter.SafetySourceStatus
 import com.android.healthconnect.controller.R
-import com.android.healthconnect.controller.utils.FeatureUtils
 import javax.inject.Inject
 
 class HealthConnectSafetySource
 @Inject
-constructor(
-    private val featureUtils: FeatureUtils,
-    private val safetyCenterManagerWrapper: SafetyCenterManagerWrapper
-) {
+constructor(private val safetyCenterManagerWrapper: SafetyCenterManagerWrapper) {
 
     fun setSafetySourceData(context: Context, safetyEvent: SafetyEvent) {
         if (!safetyCenterManagerWrapper.isEnabled(context)) {
             return
         }
-        if (!featureUtils.isEntryPointsEnabled()) {
-            safetyCenterManagerWrapper.setSafetySourceData(
-                context, HEALTH_CONNECT_SOURCE_ID, null, safetyEvent)
-            return
-        }
 
         val safetySourceData =
             SafetySourceData.Builder()
@@ -53,19 +44,26 @@
                     SafetySourceStatus.Builder(
                             context.getString(R.string.app_label),
                             context.getString(R.string.health_connect_summary),
-                            SEVERITY_LEVEL_UNSPECIFIED)
+                            SEVERITY_LEVEL_UNSPECIFIED,
+                        )
                         .setPendingIntent(
                             PendingIntent.getActivity(
                                 context,
                                 /* requestCode= */ 0,
                                 Intent(HealthConnectManager.ACTION_HEALTH_HOME_SETTINGS),
-                                FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE))
-                        .build(),
+                                FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE,
+                            )
+                        )
+                        .build()
                 )
                 .build()
 
         safetyCenterManagerWrapper.setSafetySourceData(
-            context, HEALTH_CONNECT_SOURCE_ID, safetySourceData, safetyEvent)
+            context,
+            HEALTH_CONNECT_SOURCE_ID,
+            safetySourceData,
+            safetyEvent,
+        )
     }
 
     /** Companion object for [HealthConnectPrivacySource]. */
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionConfirmationDialogFragment.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionConfirmationDialogFragment.kt
index 5819219..a6eb887 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionConfirmationDialogFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionConfirmationDialogFragment.kt
@@ -18,6 +18,7 @@
 import android.app.Dialog
 import android.os.Bundle
 import android.view.View
+import android.widget.CheckBox
 import android.widget.ImageView
 import android.widget.TextView
 import androidx.fragment.app.DialogFragment
@@ -45,6 +46,7 @@
         val title: TextView = view.findViewById(R.id.dialog_title)
         val message: TextView = view.findViewById(R.id.dialog_custom_message)
         val icon: ImageView = view.findViewById(R.id.dialog_icon)
+        val checkbox: CheckBox = view.findViewById(R.id.dialog_checkbox)
         val iconDrawable = AttributeResolver.getNullableDrawable(view.context, R.attr.deleteIcon)
 
         title.text = buildTitle()
@@ -54,6 +56,8 @@
             icon.visibility = View.VISIBLE
         }
 
+        setupCheckbox(checkbox)
+
         val alertDialogBuilder =
             AlertDialogBuilder(
                     this,
@@ -65,6 +69,7 @@
                     // TODO: create new log elements for new IA dialogs
                     DeletionDialogConfirmationElement.DELETION_DIALOG_CONFIRMATION_DELETE_BUTTON,
                 ) { _, _ ->
+                    viewModel.removePermissions = checkbox.isChecked
                     setFragmentResult(CONFIRMATION_KEY, Bundle())
                 }
                 .setNeutralButton(
@@ -75,6 +80,22 @@
         return alertDialogBuilder.create()
     }
 
+    private fun setupCheckbox(checkBox: CheckBox) {
+        val deletionType = viewModel.getDeletionType()
+        if (deletionType is DeletionType.DeleteHealthPermissionTypesFromApp) {
+            if (deletionType.healthPermissionTypes.size == deletionType.totalPermissionTypes) {
+                checkBox.visibility = View.VISIBLE
+            } else {
+                checkBox.visibility = View.GONE
+            }
+            val appName = deletionType.appName
+            checkBox.text =
+                getString(R.string.confirming_question_app_remove_all_permissions, appName)
+        } else {
+            checkBox.visibility = View.GONE
+        }
+    }
+
     private fun buildTitle(): String {
         return when (val deletionType = viewModel.getDeletionType()) {
             is DeletionType.DeleteHealthPermissionTypes ->
@@ -145,12 +166,82 @@
                 }
             }
             is DeletionType.DeleteEntriesFromApp -> {
-                // TODO
-                ""
+                val deletionMapSize = deletionType.idsToDataTypes.size
+                val appName = deletionType.appName
+                if (deletionMapSize == 1) {
+                    return getString(
+                        R.string.one_app_entry_selected_deletion_confirmation_dialog,
+                        appName,
+                    )
+                }
+                val selectedPeriod = deletionType.period
+                val startTime = deletionType.startTime
+                val displayString =
+                    formatDateTimeForTimePeriod(
+                        startTime,
+                        selectedPeriod,
+                        LocalDateTimeFormatter(requireContext()),
+                        timeSource,
+                        false,
+                    )
+
+                if (selectedPeriod == DateNavigationPeriod.PERIOD_DAY) {
+                    if (deletionMapSize < deletionType.totalEntries) {
+                        getString(
+                            R.string.some_app_entries_selected_day_deletion_confirmation_dialog,
+                            appName,
+                            displayString,
+                        )
+                    } else {
+                        getString(
+                            R.string.all_app_entries_selected_day_deletion_confirmation_dialog,
+                            appName,
+                            displayString,
+                        )
+                    }
+                } else if (selectedPeriod == DateNavigationPeriod.PERIOD_WEEK) {
+                    if (deletionMapSize < deletionType.totalEntries) {
+                        getString(
+                            R.string.some_app_entries_selected_week_deletion_confirmation_dialog,
+                            appName,
+                            displayString,
+                        )
+                    } else {
+                        getString(
+                            R.string.all_app_entries_selected_week_deletion_confirmation_dialog,
+                            appName,
+                            displayString,
+                        )
+                    }
+                } else {
+                    if (deletionMapSize < deletionType.totalEntries) {
+                        getString(
+                            R.string.some_app_entries_selected_month_deletion_confirmation_dialog,
+                            appName,
+                            displayString,
+                        )
+                    } else {
+                        getString(
+                            R.string.all_app_entries_selected_month_deletion_confirmation_dialog,
+                            appName,
+                            displayString,
+                        )
+                    }
+                }
             }
             is DeletionType.DeleteAppData -> {
-                // TODO
-                ""
+                val appName = deletionType.appName
+                getString(R.string.all_app_data_selected_deletion_confirmation_dialog, appName)
+            }
+            is DeletionType.DeleteInactiveAppData -> {
+                val appName = deletionType.appName
+                val healthPermissionType =
+                    getString(deletionType.healthPermissionType.lowerCaseLabel())
+                getString(
+                    R.string.inactive_app_data_selected_deletion_confirmation_dialog,
+                    healthPermissionType,
+                    appName,
+                )
             }
         }
     }
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionDataViewModelHelper.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionDataViewModelHelper.kt
new file mode 100644
index 0000000..2887739
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionDataViewModelHelper.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.selectabledeletion
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import com.android.healthconnect.controller.permissions.data.HealthPermissionType
+
+/** A base class for the shared functionality of [AllDataViewModel] and [AppDataViewModel] */
+abstract class DeletionDataViewModel : ViewModel() {
+
+    private val _setOfPermissionTypesToBeDeleted = MutableLiveData<Set<HealthPermissionType>>()
+
+    val setOfPermissionTypesToBeDeleted: LiveData<Set<HealthPermissionType>>
+        get() = _setOfPermissionTypesToBeDeleted
+
+    private val _deletionScreenState = MutableLiveData<DeletionScreenState>()
+    val deletionScreenState: LiveData<DeletionScreenState>
+        get() = _deletionScreenState
+
+    protected var numOfPermissionTypes: Int = 0
+    private val _allPermissionTypesSelected = MutableLiveData<Boolean>()
+    val allPermissionTypesSelected: LiveData<Boolean>
+        get() = _allPermissionTypesSelected
+
+    fun resetDeletionSet() {
+        _setOfPermissionTypesToBeDeleted.value = emptySet()
+    }
+
+    fun addToDeletionSet(permissionType: HealthPermissionType) {
+        val deleteSet = _setOfPermissionTypesToBeDeleted.value.orEmpty().toMutableSet()
+        deleteSet.add(permissionType)
+        _setOfPermissionTypesToBeDeleted.value = deleteSet.toSet()
+        if (numOfPermissionTypes == deleteSet.size) {
+            _allPermissionTypesSelected.postValue(true)
+        }
+        _deletionScreenState.value = DeletionScreenState.DELETE
+    }
+
+    fun removeFromDeletionSet(permissionType: HealthPermissionType) {
+        val deleteSet = _setOfPermissionTypesToBeDeleted.value.orEmpty().toMutableSet()
+        deleteSet.remove(permissionType)
+        _setOfPermissionTypesToBeDeleted.value = deleteSet.toSet()
+        if (numOfPermissionTypes != deleteSet.size) {
+            _allPermissionTypesSelected.postValue(false)
+        }
+        _deletionScreenState.value = DeletionScreenState.DELETE
+    }
+
+    fun setDeletionScreenStateValue(screenState: DeletionScreenState) {
+        if (screenState == DeletionScreenState.VIEW) {
+            resetDeletionSet()
+        }
+        _deletionScreenState.value = screenState
+    }
+
+    fun getDeletionScreenStateValue(): DeletionScreenState {
+        return _deletionScreenState.value ?: DeletionScreenState.VIEW
+    }
+
+    fun getTheNumOfPermissionTypes(): Int = numOfPermissionTypes
+
+    enum class DeletionScreenState {
+        VIEW,
+        DELETE,
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionFragment.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionFragment.kt
index 4cba026..826950f 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionFragment.kt
@@ -23,7 +23,6 @@
 import androidx.fragment.app.activityViewModels
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.deletion.FailedDialogFragment
-import com.android.healthconnect.controller.deletion.SuccessDialogFragment
 import com.android.healthconnect.controller.selectabledeletion.DeletionConstants.CONFIRMATION_KEY
 import com.android.healthconnect.controller.selectabledeletion.DeletionConstants.START_DELETION_KEY
 import com.android.healthconnect.controller.selectabledeletion.DeletionConstants.TRY_AGAIN_EVENT
@@ -58,7 +57,6 @@
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-
         viewModel.deletionProgress.observe(viewLifecycleOwner) { deletion ->
             when (deletion) {
                 DeletionViewModel.DeletionProgress.NOT_STARTED -> {
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionPermissionTypesPreference.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionPermissionTypesPreference.kt
index b8752f4..bca1b85 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionPermissionTypesPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionPermissionTypesPreference.kt
@@ -27,25 +27,23 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.permissions.connectedapps.ComparablePreference
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
-import com.android.healthconnect.controller.shared.preference.HealthPreference
 import com.android.healthconnect.controller.utils.logging.ElementName
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import dagger.hilt.android.EntryPointAccessors
 
 /** Custom preference for displaying checkboxes where the user can delete their data */
-class DeletionPermissionTypesPreference(context: Context) :
-    Preference(context), ComparablePreference {
-    private var checkboxButtonListener: OnClickListener? = null
-
+class DeletionPermissionTypesPreference(
+    context: Context,
+    private val viewModel: DeletionDataViewModel,
+    private val onPreferenceClickListener: OnPreferenceClickListener,
+) : Preference(context), ComparablePreference {
     private var logger: HealthConnectLogger
 
-    private var isShowCheckbox: Boolean = false
-    private var widgetFrame: ViewGroup? = null
-    private var checkBox: CheckBox? = null
+    private var showCheckbox: Boolean = false
     private var isChecked: Boolean = false
-    private lateinit var mHealthPermissionType: HealthPermissionType
 
+    private lateinit var mHealthPermissionType: HealthPermissionType
     private lateinit var logNameNoCheckbox: ElementName
     private lateinit var logNameCheckbox: ElementName
 
@@ -63,18 +61,20 @@
 
     override fun onBindViewHolder(holder: PreferenceViewHolder) {
         super.onBindViewHolder(holder)
-        widgetFrame = holder.findViewById(android.R.id.widget_frame) as ViewGroup?
-        showCheckbox(isShowCheckbox)
+        val widgetFrame = holder.findViewById(android.R.id.widget_frame) as ViewGroup
+        widgetFrame.contentDescription = getUpdatedContentDescription(isChecked)
 
-        checkBox = holder.findViewById(R.id.checkbox_button) as CheckBox
+        val checkBox = holder.findViewById(R.id.checkbox_button) as CheckBox
+        showOrHideCheckbox(showCheckbox, widgetFrame)
 
-        checkBox?.isChecked = this.isChecked
+        checkBox.isChecked = this.isChecked
 
-        checkBox?.contentDescription = context.getString(mHealthPermissionType.upperCaseLabel())
+        checkBox.contentDescription = context.getString(mHealthPermissionType.upperCaseLabel())
 
-        checkBox?.setOnClickListener(checkboxButtonListener)
+        checkBox.setOnClickListener(getCheckboxClickListenerWrapper(widgetFrame))
+        setOnPreferenceClickListener(checkBox, widgetFrame)
 
-        val widgetFrameParent: ViewGroup? = widgetFrame?.parent as ViewGroup?
+        val widgetFrameParent: ViewGroup? = widgetFrame.parent as ViewGroup?
         widgetFrameParent?.setPaddingRelative(
             widgetFrameParent.paddingStart,
             widgetFrameParent.paddingTop,
@@ -83,32 +83,40 @@
         )
     }
 
+    private fun getCheckboxClickListenerWrapper(widgetFrame: ViewGroup) = OnClickListener {
+        isChecked = !isChecked
+        widgetFrame.contentDescription = getUpdatedContentDescription(isChecked)
+        onDeletionMethod()
+        logger.logInteraction(logNameCheckbox)
+    }
+
+    private fun onDeletionMethod() {
+        if (mHealthPermissionType !in viewModel.setOfPermissionTypesToBeDeleted.value.orEmpty()) {
+            viewModel.addToDeletionSet(mHealthPermissionType)
+        } else {
+            viewModel.removeFromDeletionSet(mHealthPermissionType)
+        }
+    }
+
     /** Set a click listener to check the checkbox */
-    fun setOnPreferenceClickListener(
-        method: () -> Unit,
-        onPreferenceClickListener: OnPreferenceClickListener,
-    ) {
-        val clickListener = OnPreferenceClickListener {
-            if (isShowCheckbox) {
-                checkBox?.toggle()
-                // Set local variable to current value of whether checkBox is checked
-                isChecked = checkBox?.isChecked ?: false
-                method()
+    private fun setOnPreferenceClickListener(checkBox: CheckBox, widgetFrame: ViewGroup) {
+        val clickListenerWrapper = OnPreferenceClickListener {
+            if (showCheckbox) {
+                // If we are in deletion mode, clicking on the preference should check the checkbox
+                checkBox.toggle()
+                isChecked = checkBox.isChecked
+                widgetFrame.contentDescription = getUpdatedContentDescription(isChecked)
+                onDeletionMethod()
                 logger.logInteraction(logNameCheckbox)
             } else {
+                // Otherwise, invoke the normal click listener
                 onPreferenceClickListener.onPreferenceClick(it)
                 logger.logInteraction(logNameNoCheckbox)
             }
             true
         }
 
-        checkboxButtonListener = OnClickListener {
-            isChecked = !isChecked
-            method()
-            logger.logInteraction(logNameCheckbox)
-        }
-
-        super.setOnPreferenceClickListener(clickListener)
+        super.setOnPreferenceClickListener(clickListenerWrapper)
     }
 
     fun setHealthPermissionType(healthPermissionType: HealthPermissionType) {
@@ -119,30 +127,18 @@
         return mHealthPermissionType
     }
 
-    /** Display or hide checkbox */
-    fun showCheckbox(isShowCheckbox: Boolean) {
-        setShowCheckbox(isShowCheckbox)
-        widgetFrame?.visibility = if (isShowCheckbox) VISIBLE else GONE
-        widgetFrame?.tag = if (isShowCheckbox) "checkbox" else ""
-
-        if (isShowCheckbox) {
-            logger.logImpression(logNameCheckbox)
-        } else {
-            logger.logImpression(logNameNoCheckbox)
-        }
-    }
-
     fun setIsChecked(isChecked: Boolean) {
         this.isChecked = isChecked
-        checkBox?.isChecked = isChecked
+        notifyChanged()
     }
 
     fun getIsChecked(): Boolean {
         return isChecked
     }
 
-    fun setShowCheckbox(isShowCheckbox: Boolean) {
-        this.isShowCheckbox = isShowCheckbox
+    fun setShowCheckbox(showCheckbox: Boolean) {
+        this.showCheckbox = showCheckbox
+        notifyChanged()
     }
 
     fun setLogNameNoCheckbox(logName: ElementName) {
@@ -153,12 +149,31 @@
         logNameCheckbox = logName
     }
 
+    private fun showOrHideCheckbox(showCheckbox: Boolean, widgetFrame: ViewGroup) {
+        widgetFrame.visibility = if (showCheckbox) VISIBLE else GONE
+        widgetFrame.tag = if (showCheckbox) "checkbox" else ""
+
+        if (showCheckbox) {
+            logger.logImpression(logNameCheckbox)
+        } else {
+            logger.logImpression(logNameNoCheckbox)
+        }
+    }
+
+    private fun getUpdatedContentDescription(isChecked: Boolean): String {
+        return if (isChecked) {
+            context.getString(R.string.a11y_checked)
+        } else {
+            context.getString(R.string.a11y_unchecked)
+        }
+    }
+
     override fun hasSameContents(preference: Preference): Boolean {
-        return preference is HealthPreference &&
+        return preference is DeletionPermissionTypesPreference &&
             this.title == preference.title &&
             this.summary == preference.summary &&
             this.icon == preference.icon &&
-            this.isEnabled == preference.isEnabled
+            this.isChecked == preference.isChecked
     }
 
     override fun isSameItem(preference: Preference): Boolean {
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionType.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionType.kt
index ca9155d..74f07fa 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionType.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionType.kt
@@ -32,7 +32,9 @@
         val totalPermissionTypes: Int,
         val packageName: String,
         val appName: String,
-    ) : DeletionType()
+    ) : DeletionType() {
+        fun toDeleteAppData(): DeleteAppData = DeleteAppData(packageName, appName)
+    }
 
     data class DeleteEntries(
         val idsToDataTypes: Map<String, DataType>,
@@ -44,7 +46,28 @@
     data class DeleteEntriesFromApp(
         val idsToDataTypes: Map<String, DataType>,
         val packageName: String,
-    ) : DeletionType()
+        val appName: String,
+        val totalEntries: Int,
+        val period: DateNavigationPeriod,
+        val startTime: Instant,
+    ) : DeletionType() {
+        fun toDeleteEntries(): DeleteEntries =
+            DeleteEntries(idsToDataTypes, totalEntries, period, startTime)
+    }
 
-    data class DeleteAppData(val packageName: String) : DeletionType()
+    data class DeleteInactiveAppData(
+        val packageName: String,
+        val appName: String,
+        val healthPermissionType: HealthPermissionType,
+    ) : DeletionType() {
+        fun toDeleteHealthPermissionTypesFromApp(): DeleteHealthPermissionTypesFromApp =
+            DeleteHealthPermissionTypesFromApp(
+                healthPermissionTypes = setOf(healthPermissionType),
+                totalPermissionTypes = 1,
+                packageName = packageName,
+                appName = appName,
+            )
+    }
+
+    data class DeleteAppData(val packageName: String, val appName: String) : DeletionType()
 }
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionViewModel.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionViewModel.kt
index ede8b95..f7d8263 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/DeletionViewModel.kt
@@ -20,29 +20,37 @@
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
+import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteAppData
 import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteEntries
+import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteEntriesFromApp
 import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteHealthPermissionTypes
+import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteHealthPermissionTypesFromApp
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAppDataUseCase
 import com.android.healthconnect.controller.selectabledeletion.api.DeleteEntriesUseCase
-import com.android.healthconnect.controller.selectabledeletion.api.DeleteFitnessPermissionTypesFromAppUseCase
+import com.android.healthconnect.controller.selectabledeletion.api.DeletePermissionTypesFromAppUseCase
 import com.android.healthconnect.controller.selectabledeletion.api.DeletePermissionTypesUseCase
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
+import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 
 @HiltViewModel
 class DeletionViewModel
 @Inject
 constructor(
+    private val deleteAppDataUseCase: DeleteAppDataUseCase,
     private val deletePermissionTypesUseCase: DeletePermissionTypesUseCase,
     private val deleteEntriesUseCase: DeleteEntriesUseCase,
-    private val deleteFitnessPermissionTypesFromAppUseCase:
-        DeleteFitnessPermissionTypesFromAppUseCase,
+    private val deletePermissionTypesFromAppUseCase: DeletePermissionTypesFromAppUseCase,
 ) : ViewModel() {
 
     companion object {
         private const val TAG = "DeletionViewModel"
     }
 
+    // Artificial delay for reloads, to give enough time for the deletion task to end
+    private val defaultDelay = 2000L
+
     private lateinit var deletionType: DeletionType
 
     private var _permissionTypesReloadNeeded = MutableLiveData(false)
@@ -51,6 +59,12 @@
 
     private var _entriesReloadNeeded = MutableLiveData(false)
 
+    private var _appEntriesReloadNeeded = MutableLiveData(false)
+
+    private var _connectedAppsReloadNeeded = MutableLiveData(false)
+
+    private var _inactiveAppsReloadNeeded = MutableLiveData(false)
+
     private var _deletionProgress = MutableLiveData(DeletionProgress.NOT_STARTED)
 
     val deletionProgress: LiveData<DeletionProgress>
@@ -65,46 +79,82 @@
     val appPermissionTypesReloadNeeded: LiveData<Boolean>
         get() = _appPermissionTypesReloadNeeded
 
+    val appEntriesReloadNeeded: LiveData<Boolean>
+        get() = _appEntriesReloadNeeded
+
+    val connectedAppsReloadNeeded: LiveData<Boolean>
+        get() = _connectedAppsReloadNeeded
+
+    val inactiveAppsReloadNeeded: LiveData<Boolean>
+        get() = _inactiveAppsReloadNeeded
+
+    var removePermissions = false
+
     fun delete() {
         viewModelScope.launch {
-            _deletionProgress.value = (DeletionProgress.STARTED)
-
+            _deletionProgress.postValue(DeletionProgress.STARTED)
             try {
-                _deletionProgress.value = (DeletionProgress.PROGRESS_INDICATOR_CAN_START)
+                _deletionProgress.postValue(DeletionProgress.PROGRESS_INDICATOR_CAN_START)
 
                 when (deletionType) {
                     is DeleteHealthPermissionTypes -> {
                         deletePermissionTypesUseCase.invoke(
                             deletionType as DeleteHealthPermissionTypes
                         )
+                        delay(defaultDelay)
                         _permissionTypesReloadNeeded.postValue(true)
                     }
                     is DeleteEntries -> {
                         deleteEntriesUseCase.invoke(deletionType as DeleteEntries)
+                        delay(defaultDelay)
                         _entriesReloadNeeded.postValue(true)
                     }
-                    is DeletionType.DeleteHealthPermissionTypesFromApp -> {
-                        deleteFitnessPermissionTypesFromAppUseCase.invoke(
-                            deletionType as DeletionType.DeleteHealthPermissionTypesFromApp
+                    is DeleteHealthPermissionTypesFromApp -> {
+                        deletePermissionTypesFromAppUseCase.invoke(
+                            deletionType as DeleteHealthPermissionTypesFromApp,
+                            removePermissions,
                         )
+                        delay(defaultDelay)
                         _appPermissionTypesReloadNeeded.postValue(true)
                     }
-                    else -> {
-                        // do nothing
+                    is DeleteEntriesFromApp -> {
+                        deleteEntriesUseCase.invoke(
+                            (deletionType as DeleteEntriesFromApp).toDeleteEntries()
+                        )
+                        delay(defaultDelay)
+                        _appEntriesReloadNeeded.postValue(true)
+                    }
+                    is DeleteAppData -> {
+                        deleteAppDataUseCase.invoke((deletionType as DeleteAppData))
+                        delay(defaultDelay)
+                        _connectedAppsReloadNeeded.postValue(true)
+                    }
+                    is DeletionType.DeleteInactiveAppData -> {
+                        deletePermissionTypesFromAppUseCase.invoke(
+                            (deletionType as DeletionType.DeleteInactiveAppData)
+                                .toDeleteHealthPermissionTypesFromApp(),
+                            removePermissions = false,
+                        )
+                        delay(defaultDelay)
+                        _inactiveAppsReloadNeeded.postValue(true)
                     }
                 }
-
-                _deletionProgress.value = (DeletionProgress.COMPLETED)
+                _deletionProgress.postValue(DeletionProgress.COMPLETED)
             } catch (error: Exception) {
                 Log.e(TAG, "Failed to delete data", error)
-
-                _deletionProgress.value = (DeletionProgress.FAILED)
+                _deletionProgress.postValue(DeletionProgress.FAILED)
             } finally {
-                _deletionProgress.value = (DeletionProgress.PROGRESS_INDICATOR_CAN_END)
+                // delay to ensure that the success/failed dialog has been shown
+                delay(1000)
+                _deletionProgress.postValue(DeletionProgress.PROGRESS_INDICATOR_CAN_END)
             }
         }
     }
 
+    fun resetInactiveAppsReloadNeeded() {
+        _inactiveAppsReloadNeeded.postValue(false)
+    }
+
     fun resetPermissionTypesReloadNeeded() {
         _permissionTypesReloadNeeded.postValue(false)
     }
@@ -121,6 +171,10 @@
         _appPermissionTypesReloadNeeded.postValue(false)
     }
 
+    fun resetAppEntriesReloadNeeded() {
+        _appEntriesReloadNeeded.postValue(false)
+    }
+
     fun getDeletionType(): DeletionType {
         return deletionType
     }
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/SelectAllCheckboxPreference.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/SelectAllCheckboxPreference.kt
index fea4399..69463b0 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/SelectAllCheckboxPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/SelectAllCheckboxPreference.kt
@@ -25,7 +25,7 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.shared.preference.HealthPreference
 
- /** Custom preference that displays a checkbox and allows the user to select all items */
+/** Custom preference that displays a checkbox and allows the user to select all items */
 class SelectAllCheckboxPreference
 @JvmOverloads
 constructor(context: Context, attrs: AttributeSet? = null) : HealthPreference(context, attrs) {
@@ -33,20 +33,19 @@
     private var widgetFrame: ViewGroup? = null
     private var checkBox: CheckBox? = null
     private var checkboxButtonListener: OnClickListener? = null
-    private var onPreferenceClickListener : OnPreferenceClickListener? = null
+    private var onPreferenceClickListener: OnPreferenceClickListener? = null
     private var isChecked: Boolean = false
 
-
     init {
         widgetLayoutResource = R.layout.widget_checkbox
         isSelectable = true
-
     }
 
     override fun onBindViewHolder(holder: PreferenceViewHolder) {
         super.onBindViewHolder(holder)
         widgetFrame = holder.findViewById(android.R.id.widget_frame) as ViewGroup?
         widgetFrame?.tag = "checkbox"
+        widgetFrame?.contentDescription = getUpdatedContentDescription(isChecked)
 
         checkBox = holder.findViewById(R.id.checkbox_button) as CheckBox
 
@@ -56,30 +55,29 @@
 
         val widgetFrameParent: ViewGroup? = widgetFrame?.parent as ViewGroup?
         widgetFrameParent?.setPaddingRelative(
-                widgetFrameParent.paddingStart,
-                widgetFrameParent.paddingTop,
-                /* end = */ 0,
-                widgetFrameParent.paddingBottom)
-
+            widgetFrameParent.paddingStart,
+            widgetFrameParent.paddingTop,
+            /* end = */ 0,
+            widgetFrameParent.paddingBottom,
+        )
     }
 
-    fun setOnPreferenceClickListenerWithCheckbox(
-            method: () -> Unit
-    ) {
+    fun setOnPreferenceClickListenerWithCheckbox(method: () -> Unit) {
         val clickListener = OnPreferenceClickListener {
-
             checkBox?.toggle()
             setIsChecked(checkBox?.isChecked ?: false)
+            widgetFrame?.contentDescription = getUpdatedContentDescription(isChecked)
             method()
             true
         }
 
         checkboxButtonListener = OnClickListener {
             setIsChecked(checkBox?.isChecked ?: false)
+            widgetFrame?.contentDescription = getUpdatedContentDescription(isChecked)
             method()
         }
 
-        if(onPreferenceClickListener == null){
+        if (onPreferenceClickListener == null) {
             onPreferenceClickListener = clickListener
         }
 
@@ -87,22 +85,29 @@
         notifyChanged()
     }
 
-    fun removeOnPreferenceClickListener(){
-        if(checkboxButtonListener != null){
+    fun removeOnPreferenceClickListener() {
+        if (checkboxButtonListener != null) {
             checkboxButtonListener = null
         }
 
-        if(onPreferenceClickListener != null){
+        if (onPreferenceClickListener != null) {
             onPreferenceClickListener = null
         }
     }
 
-    fun setIsChecked(checked: Boolean){
+    fun setIsChecked(checked: Boolean) {
         isChecked = checked
     }
 
-    fun getIsChecked():Boolean {
+    fun getIsChecked(): Boolean {
         return isChecked
     }
 
-}
\ No newline at end of file
+    private fun getUpdatedContentDescription(isChecked: Boolean): String {
+        return if (isChecked) {
+            context.getString(R.string.a11y_checked)
+        } else {
+            context.getString(R.string.a11y_unchecked)
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/SuccessDialogFragment.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/SuccessDialogFragment.kt
new file mode 100644
index 0000000..546cb9c
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/SuccessDialogFragment.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.selectabledeletion
+
+import android.app.Dialog
+import android.os.Bundle
+import androidx.fragment.app.DialogFragment
+import androidx.fragment.app.activityViewModels
+import androidx.navigation.fragment.findNavController
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.shared.dialog.AlertDialogBuilder
+import com.android.healthconnect.controller.utils.logging.SuccessDialogElement
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * A deletion {@link DialogFragment} notifying user about a successful deletion.
+ *
+ * <p> Does not show the See connected apps negative button if the Connected Apps fragment is
+ * already in the stack.
+ */
+@AndroidEntryPoint(DialogFragment::class)
+class SuccessDialogFragment : Hilt_SuccessDialogFragment() {
+
+    private val viewModel: DeletionViewModel by activityViewModels()
+
+    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+        // Get the navigation action depending on the deletion type
+        val deletionType = viewModel.getDeletionType()
+        val navAction =
+            when (deletionType) {
+                is DeletionType.DeleteHealthPermissionTypes -> {
+                    R.id.action_allDataFragment_to_connectedApps
+                }
+                is DeletionType.DeleteEntries,
+                is DeletionType.DeleteInactiveAppData -> {
+                    R.id.action_entriesAndAccess_to_connectedApps
+                }
+                // Connected Apps fragment is already in the stack, no need to navigate.
+                is DeletionType.DeleteEntriesFromApp,
+                is DeletionType.DeleteHealthPermissionTypesFromApp,
+                is DeletionType.DeleteAppData -> {
+                    null
+                }
+            }
+
+        val dialogBuilder =
+            AlertDialogBuilder(this, SuccessDialogElement.DELETION_DIALOG_SUCCESS_CONTAINER)
+                .setIcon(R.attr.successIcon)
+                .setTitle(R.string.delete_dialog_success_title)
+                .setMessage(R.string.delete_dialog_success_message)
+                .setPositiveButton(
+                    R.string.delete_dialog_success_got_it_button,
+                    SuccessDialogElement.DELETION_DIALOG_SUCCESS_DONE_BUTTON,
+                )
+
+        navAction?.let {
+            dialogBuilder.setNegativeButton(
+                R.string.delete_dialog_see_connected_apps_button,
+                SuccessDialogElement.DELETION_DIALOG_SUCCESS_SEE_CONNECTED_APPS_BUTTON,
+                onClickListener = { _, _ ->
+                    this.dismiss()
+                    findNavController().navigate(it)
+                },
+            )
+        }
+        return dialogBuilder.create()
+    }
+
+    companion object {
+        const val TAG = "SuccessDialogFragment"
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllDataUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllDataUseCase.kt
index 753c122..359230b 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllDataUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllDataUseCase.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
  * in compliance with the License. You may obtain a copy of the License at
@@ -15,12 +15,12 @@
  */
 package com.android.healthconnect.controller.selectabledeletion.api
 
-import android.health.connect.DeleteUsingFiltersRequest
-import android.health.connect.HealthConnectManager
 import com.android.healthconnect.controller.service.IoDispatcher
+import com.android.healthfitness.flags.Flags.personalHealthRecord
 import javax.inject.Inject
 import javax.inject.Singleton
 import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.async
 import kotlinx.coroutines.withContext
 
 /** Use case to delete all records stored in Health Connect without any filter. */
@@ -28,12 +28,19 @@
 class DeleteAllDataUseCase
 @Inject
 constructor(
-    private val healthConnectManager: HealthConnectManager,
-    @IoDispatcher private val dispatcher: CoroutineDispatcher
+    private val deleteAllFitnessDataUseCase: DeleteAllFitnessDataUseCase,
+    private val deleteAllMedicalDataUseCase: DeleteAllMedicalDataUseCase,
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
 ) {
     suspend fun invoke() =
         withContext(dispatcher) {
-            healthConnectManager.deleteRecords(
-                DeleteUsingFiltersRequest.Builder().build(), Runnable::run) {}
+            val deleteFitnessData = async { deleteAllFitnessDataUseCase.invoke() }
+            val deleteMedicalData = async {
+                if (personalHealthRecord()) {
+                    deleteAllMedicalDataUseCase.invoke()
+                }
+            }
+            deleteFitnessData.await()
+            deleteMedicalData.await()
         }
 }
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllFitnessDataUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllFitnessDataUseCase.kt
new file mode 100644
index 0000000..627dc29
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllFitnessDataUseCase.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.selectabledeletion.api
+
+import android.health.connect.DeleteUsingFiltersRequest
+import android.health.connect.HealthConnectManager
+import com.android.healthconnect.controller.service.IoDispatcher
+import javax.inject.Inject
+import javax.inject.Singleton
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+/** Use case to delete all fitness records stored in Health Connect without any filter. */
+@Singleton
+class DeleteAllFitnessDataUseCase
+@Inject
+constructor(
+    private val healthConnectManager: HealthConnectManager,
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
+) {
+    suspend fun invoke() =
+        withContext(dispatcher) {
+            healthConnectManager.deleteRecords(
+                DeleteUsingFiltersRequest.Builder().build(),
+                Runnable::run,
+            ) {}
+        }
+}
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllMedicalDataUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllMedicalDataUseCase.kt
new file mode 100644
index 0000000..6a73874
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAllMedicalDataUseCase.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.selectabledeletion.api
+
+import android.health.connect.HealthConnectManager
+import com.android.healthconnect.controller.service.IoDispatcher
+import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
+import javax.inject.Inject
+import javax.inject.Singleton
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+/**
+ * Use case to delete all [MedicalDataSource]s and corresponding [MedicalResource]s stored in Health
+ * Connect.
+ */
+@Singleton
+class DeleteAllMedicalDataUseCase
+@Inject
+constructor(
+    private val healthConnectManager: HealthConnectManager,
+    private val healthPermissionReader: HealthPermissionReader,
+    private val medicalDataSourceReader: MedicalDataSourceReader,
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
+) {
+    suspend fun invoke() =
+        withContext(dispatcher) {
+            healthPermissionReader
+                .getAppsWithMedicalPermissions()
+                .flatMap { medicalDataSourceReader.fromPackageName(it) }
+                .forEach { dataSource ->
+                    healthConnectManager.deleteMedicalDataSourceWithData(
+                        dataSource.id,
+                        Runnable::run,
+                    ) {}
+                }
+        }
+}
\ No newline at end of file
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAppDataUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAppDataUseCase.kt
index c045723..269461c 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAppDataUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteAppDataUseCase.kt
@@ -21,9 +21,12 @@
 import com.android.healthconnect.controller.permissions.api.RevokeAllHealthPermissionsUseCase
 import com.android.healthconnect.controller.selectabledeletion.DeletionType
 import com.android.healthconnect.controller.service.IoDispatcher
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
+import com.android.healthfitness.flags.Flags.personalHealthRecord
 import javax.inject.Inject
 import javax.inject.Singleton
 import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.async
 import kotlinx.coroutines.withContext
 
 /** Use case to delete all records written by a given app. */
@@ -32,6 +35,7 @@
 @Inject
 constructor(
     private val healthConnectManager: HealthConnectManager,
+    private val medicalDataSourceReader: MedicalDataSourceReader,
     private val revokeAllHealthPermissionsUseCase: RevokeAllHealthPermissionsUseCase,
     @IoDispatcher private val dispatcher: CoroutineDispatcher,
 ) {
@@ -39,16 +43,35 @@
         deleteAppData: DeletionType.DeleteAppData,
         removePermissions: Boolean = false,
     ) {
-        val deleteRequest = DeleteUsingFiltersRequest.Builder()
-        deleteRequest.addDataOrigin(
-            DataOrigin.Builder().setPackageName(deleteAppData.packageName).build()
-        )
+        val packageName = deleteAppData.packageName
+
         withContext(dispatcher) {
-            healthConnectManager.deleteRecords(deleteRequest.build(), Runnable::run) {}
+            val deleteFitnessData = async {
+                val deleteFitnessRequest = deleteUsingFilterRequest(packageName)
+                healthConnectManager.deleteRecords(deleteFitnessRequest, Runnable::run) {}
+            }
+            val deleteMedicalData = async {
+                if (personalHealthRecord()) {
+                    val medicalDataSources = medicalDataSourceReader.fromPackageName(packageName)
+                    medicalDataSources.forEach {
+                        healthConnectManager.deleteMedicalDataSourceWithData(
+                            it.id,
+                            Runnable::run,
+                        ) {}
+                    }
+                }
+            }
+            deleteFitnessData.await()
+            deleteMedicalData.await()
 
             if (removePermissions) {
                 revokeAllHealthPermissionsUseCase.invoke(deleteAppData.packageName)
             }
         }
     }
+
+    private fun deleteUsingFilterRequest(packageName: String): DeleteUsingFiltersRequest =
+        DeleteUsingFiltersRequest.Builder()
+            .addDataOrigin(DataOrigin.Builder().setPackageName(packageName).build())
+            .build()
 }
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteEntriesUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteEntriesUseCase.kt
index c9c436d..ab45946 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteEntriesUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteEntriesUseCase.kt
@@ -32,11 +32,12 @@
     private val healthConnectManager: HealthConnectManager,
     @IoDispatcher private val dispatcher: CoroutineDispatcher,
 ) {
+    // TODO (b/369108829) Optimise deletion based on selected data and date ranges
     suspend fun invoke(deleteEntries: DeleteEntries) =
         withContext(dispatcher) {
             val recordIdFilters =
                 deleteEntries.idsToDataTypes.entries.map { (id, dataType) ->
-                    RecordIdFilter.fromId(dataType.recordClass, id)
+                    RecordIdFilter.fromId(dataType.java, id)
                 }
 
             healthConnectManager.deleteRecords(recordIdFilters, Runnable::run) {}
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteFitnessPermissionTypesFromAppUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteFitnessPermissionTypesFromAppUseCase.kt
index c08e703..80804e0 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteFitnessPermissionTypesFromAppUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteFitnessPermissionTypesFromAppUseCase.kt
@@ -28,8 +28,8 @@
 import kotlinx.coroutines.withContext
 
 /**
- * Use case to delete all records from the given permission type (e.g. Steps) written by a given
- * app.
+ * Use case to delete all fitness records from the given permission type (e.g. Steps) written by a
+ * given app.
  */
 @Singleton
 class DeleteFitnessPermissionTypesFromAppUseCase
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteFitnessPermissionTypesUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteFitnessPermissionTypesUseCase.kt
index c34c61b..4be1a56 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteFitnessPermissionTypesUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteFitnessPermissionTypesUseCase.kt
@@ -26,7 +26,7 @@
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.withContext
 
-/** Use case to delete all records from the given permission type (e.g. Steps). */
+/** Use case to delete all fitness records from the given permission type (e.g. Steps). */
 @Singleton
 class DeleteFitnessPermissionTypesUseCase
 @Inject
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteMedicalPermissionTypesFromAppUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteMedicalPermissionTypesFromAppUseCase.kt
new file mode 100644
index 0000000..c71a55b
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteMedicalPermissionTypesFromAppUseCase.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.selectabledeletion.api
+
+import android.health.connect.DeleteMedicalResourcesRequest
+import android.health.connect.HealthConnectManager
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.permissions.data.toMedicalResourceType
+import com.android.healthconnect.controller.selectabledeletion.DeletionType
+import com.android.healthconnect.controller.service.IoDispatcher
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
+import javax.inject.Inject
+import javax.inject.Singleton
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+/**
+ * Use case to delete all medical resources the given medical permission type (e.g. Immunization)
+ * written by a given app.
+ */
+@Singleton
+class DeleteMedicalPermissionTypesFromAppUseCase
+@Inject
+constructor(
+    private val healthConnectManager: HealthConnectManager,
+    private val medicalDataSourceReader: MedicalDataSourceReader,
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
+) {
+
+    suspend operator fun invoke(
+        deletePermissionTypesFromApp: DeletionType.DeleteHealthPermissionTypesFromApp
+    ) {
+        val deleteRequest = DeleteMedicalResourcesRequest.Builder()
+
+        deletePermissionTypesFromApp.healthPermissionTypes
+            .filterIsInstance<MedicalPermissionType>()
+            .map { permissionType ->
+                deleteRequest.addMedicalResourceType(toMedicalResourceType(permissionType))
+            }
+
+        val medicalDataSources =
+            medicalDataSourceReader.fromPackageName(deletePermissionTypesFromApp.packageName)
+        medicalDataSources.forEach { deleteRequest.addDataSourceId(it.id) }
+
+        withContext(dispatcher) {
+            healthConnectManager.deleteMedicalResources(deleteRequest.build(), Runnable::run) {}
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteMedicalPermissionTypesUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteMedicalPermissionTypesUseCase.kt
index 91bbe24..441caa0 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteMedicalPermissionTypesUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeleteMedicalPermissionTypesUseCase.kt
@@ -37,7 +37,6 @@
 
     suspend operator fun invoke(deletePermissionTypes: DeleteHealthPermissionTypes) {
         val deleteRequest = DeleteMedicalResourcesRequest.Builder()
-
         deletePermissionTypes.healthPermissionTypes.filterIsInstance<MedicalPermissionType>().map {
             permissionType ->
             deleteRequest.addMedicalResourceType(toMedicalResourceType(permissionType))
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeletePermissionTypesFromAppUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeletePermissionTypesFromAppUseCase.kt
new file mode 100644
index 0000000..88c5834
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeletePermissionTypesFromAppUseCase.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.selectabledeletion.api
+
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteHealthPermissionTypesFromApp
+import com.android.healthconnect.controller.service.IoDispatcher
+import javax.inject.Inject
+import javax.inject.Singleton
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.async
+import kotlinx.coroutines.withContext
+
+/**
+ * Use case to delete all fitness and medical resources from the given permission types written by a
+ * given app.
+ */
+@Singleton
+class DeletePermissionTypesFromAppUseCase
+@Inject
+constructor(
+    private val deleteFitnessPermissionTypesFromAppUseCase:
+        DeleteFitnessPermissionTypesFromAppUseCase,
+    private val deleteMedicalPermissionTypesFromAppUseCase:
+        DeleteMedicalPermissionTypesFromAppUseCase,
+    private val deleteAppDataUseCase: DeleteAppDataUseCase,
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
+) {
+
+    suspend operator fun invoke(
+        deletePermissionTypes: DeleteHealthPermissionTypesFromApp,
+        removePermissions: Boolean = false,
+    ) {
+        if (
+            deletePermissionTypes.healthPermissionTypes.size ==
+                deletePermissionTypes.totalPermissionTypes
+        ) {
+            deleteAppDataUseCase.invoke(deletePermissionTypes.toDeleteAppData(), removePermissions)
+            return
+        }
+
+        withContext(dispatcher) {
+            val deleteFitness = async { maybeDeleteFitnessData(deletePermissionTypes) }
+            val deleteMedical = async { maybeDeleteMedicalData(deletePermissionTypes) }
+            deleteFitness.await()
+            deleteMedical.await()
+        }
+    }
+
+    private suspend fun maybeDeleteFitnessData(
+        deletionRequest: DeleteHealthPermissionTypesFromApp
+    ) {
+        val isFitnessDataEmpty =
+            deletionRequest.healthPermissionTypes
+                .filterIsInstance<FitnessPermissionType>()
+                .isEmpty()
+        if (isFitnessDataEmpty) {
+            return
+        }
+        deleteFitnessPermissionTypesFromAppUseCase.invoke(deletionRequest)
+    }
+
+    private suspend fun maybeDeleteMedicalData(
+        deletionRequest: DeleteHealthPermissionTypesFromApp
+    ) {
+        val isMedicalDataEmpty =
+            deletionRequest.healthPermissionTypes
+                .filterIsInstance<MedicalPermissionType>()
+                .isEmpty()
+        if (isMedicalDataEmpty) {
+            return
+        }
+        deleteMedicalPermissionTypesFromAppUseCase.invoke(deletionRequest)
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeletePermissionTypesUseCase.kt b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeletePermissionTypesUseCase.kt
index c27bc87..9809047 100644
--- a/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeletePermissionTypesUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/selectabledeletion/api/DeletePermissionTypesUseCase.kt
@@ -25,7 +25,7 @@
 import kotlinx.coroutines.async
 import kotlinx.coroutines.withContext
 
-/** Use case to delete all medical resources from the given permission type (e.g. Immunization). */
+/** Use case to delete all fitness and medical resources from the given permission types. */
 @Singleton
 class DeletePermissionTypesUseCase
 @Inject
diff --git a/apk/src/com/android/healthconnect/controller/service/UseCaseModule.kt b/apk/src/com/android/healthconnect/controller/service/UseCaseModule.kt
index db7aca0..60d047a 100644
--- a/apk/src/com/android/healthconnect/controller/service/UseCaseModule.kt
+++ b/apk/src/com/android/healthconnect/controller/service/UseCaseModule.kt
@@ -33,7 +33,6 @@
 import com.android.healthconnect.controller.data.entries.api.LoadMedicalEntriesUseCase
 import com.android.healthconnect.controller.data.entries.api.LoadMenstruationDataUseCase
 import com.android.healthconnect.controller.dataentries.formatters.DistanceFormatter
-import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.formatters.SleepSessionFormatter
 import com.android.healthconnect.controller.dataentries.formatters.StepsFormatter
 import com.android.healthconnect.controller.dataentries.formatters.TotalCaloriesBurnedFormatter
@@ -180,14 +179,9 @@
     @Provides
     fun providesLoadMenstruationDataUseCase(
         @IoDispatcher dispatcher: CoroutineDispatcher,
-        menstruationPeriodFormatter: MenstruationPeriodFormatter,
         loadEntriesHelper: LoadEntriesHelper,
     ): ILoadMenstruationDataUseCase {
-        return LoadMenstruationDataUseCase(
-            loadEntriesHelper,
-            menstruationPeriodFormatter,
-            dispatcher,
-        )
+        return LoadMenstruationDataUseCase(loadEntriesHelper, dispatcher)
     }
 
     @Provides
diff --git a/apk/src/com/android/healthconnect/controller/shared/Constants.kt b/apk/src/com/android/healthconnect/controller/shared/Constants.kt
index 54ccdf8..5c5c4bc 100644
--- a/apk/src/com/android/healthconnect/controller/shared/Constants.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/Constants.kt
@@ -36,4 +36,8 @@
     const val START_USING_HC_BANNER_SEEN = "start_using_hc_seen"
     const val CONNECT_MORE_APPS_BANNER_SEEN = "connect_more_apps_seen"
     const val SEE_MORE_COMPATIBLE_APPS_BANNER_SEEN = "see_more_apps_seen"
+
+    // Lock screen banners
+    const val LOCK_SCREEN_BANNER_SEEN_FITNESS = "lock_screen_banner_seen_fitness"
+    const val LOCK_SCREEN_BANNER_SEEN_MEDICAL = "lock_screen_banner_seen_medical"
 }
diff --git a/apk/src/com/android/healthconnect/controller/shared/DataType.kt b/apk/src/com/android/healthconnect/controller/shared/DataType.kt
index da27b10..c9bc026 100644
--- a/apk/src/com/android/healthconnect/controller/shared/DataType.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/DataType.kt
@@ -57,47 +57,67 @@
 import android.health.connect.datatypes.Vo2MaxRecord
 import android.health.connect.datatypes.WeightRecord
 import android.health.connect.datatypes.WheelchairPushesRecord
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings
+import com.android.healthfitness.flags.Flags
+import kotlin.reflect.KClass
 
-enum class DataType(val recordClass: Class<out Record>) {
-    ACTIVE_CALORIES_BURNED(ActiveCaloriesBurnedRecord::class.java),
-    BASAL_METABOLIC_RATE(BasalMetabolicRateRecord::class.java),
-    DISTANCE(DistanceRecord::class.java),
-    HEART_RATE(HeartRateRecord::class.java),
-    POWER(PowerRecord::class.java),
-    SPEED(SpeedRecord::class.java),
-    STEPS(StepsRecord::class.java),
-    STEPS_CADENCE(StepsCadenceRecord::class.java),
-    TOTAL_CALORIES_BURNED(TotalCaloriesBurnedRecord::class.java),
-    HEIGHT(HeightRecord::class.java),
-    BODY_FAT(BodyFatRecord::class.java),
-    OXYGEN_SATURATION(OxygenSaturationRecord::class.java),
-    BODY_TEMPERATURE(BodyTemperatureRecord::class.java),
-    BASAL_BODY_TEMPERATURE(BasalBodyTemperatureRecord::class.java),
-    WHEELCHAIR_PUSHES(WheelchairPushesRecord::class.java),
-    RESTING_HEART_RATE(RestingHeartRateRecord::class.java),
-    RESPIRATORY_RATE(RespiratoryRateRecord::class.java),
-    HYDRATION(HydrationRecord::class.java),
-    FLOORS_CLIMBED(FloorsClimbedRecord::class.java),
-    ELEVATION_GAINED(ElevationGainedRecord::class.java),
-    BONE_MASS(BoneMassRecord::class.java),
-    LEAN_BODY_MASS(LeanBodyMassRecord::class.java),
-    WEIGHT(WeightRecord::class.java),
-    BLOOD_GLUCOSE(BloodGlucoseRecord::class.java),
-    NUTRITION(NutritionRecord::class.java),
-    BLOOD_PRESSURE(BloodPressureRecord::class.java),
-    VO2_MAX(Vo2MaxRecord::class.java),
-    CYCLE_PEDALING_CADENCE(CyclingPedalingCadenceRecord::class.java),
-    CERVICAL_MUCUS(CervicalMucusRecord::class.java),
-    SEXUAL_ACTIVITY(SexualActivityRecord::class.java),
-    OVULATION_TEST(OvulationTestRecord::class.java),
-    MENSTRUATION_FLOW(MenstruationFlowRecord::class.java),
-    MENSTRUATION_PERIOD(MenstruationPeriodRecord::class.java),
-    SLEEP(SleepSessionRecord::class.java),
-    EXERCISE(ExerciseSessionRecord::class.java),
-    BODY_WATER_MASS(BodyWaterMassRecord::class.java),
-    INTERMENSTRUAL_BLEEDING(IntermenstrualBleedingRecord::class.java),
-    HEART_RATE_VARIABILITY(HeartRateVariabilityRmssdRecord::class.java),
-    SKIN_TEMPERATURE(SkinTemperatureRecord::class.java),
-    PLANNED_EXERCISE(PlannedExerciseSessionRecord::class.java),
-    MINDFULNESS_SESSION(MindfulnessSessionRecord::class.java),
+typealias DataType = KClass<out Record>
+
+fun getDataTypeForClassName(classSimpleName: String): DataType {
+    return SUPPORTED_DATA_TYPES.first { it.java.simpleName == classSimpleName }
+}
+
+private val SUPPORTED_DATA_TYPES =
+    if (Flags.healthConnectMappings()) getSupportedDataTypes()
+    else
+        listOf(
+            ActiveCaloriesBurnedRecord::class,
+            BasalMetabolicRateRecord::class,
+            DistanceRecord::class,
+            HeartRateRecord::class,
+            PowerRecord::class,
+            SpeedRecord::class,
+            StepsRecord::class,
+            StepsCadenceRecord::class,
+            TotalCaloriesBurnedRecord::class,
+            HeightRecord::class,
+            BodyFatRecord::class,
+            OxygenSaturationRecord::class,
+            BodyTemperatureRecord::class,
+            BasalBodyTemperatureRecord::class,
+            WheelchairPushesRecord::class,
+            RestingHeartRateRecord::class,
+            RespiratoryRateRecord::class,
+            HydrationRecord::class,
+            FloorsClimbedRecord::class,
+            ElevationGainedRecord::class,
+            BoneMassRecord::class,
+            LeanBodyMassRecord::class,
+            WeightRecord::class,
+            BloodGlucoseRecord::class,
+            NutritionRecord::class,
+            BloodPressureRecord::class,
+            Vo2MaxRecord::class,
+            CyclingPedalingCadenceRecord::class,
+            CervicalMucusRecord::class,
+            SexualActivityRecord::class,
+            OvulationTestRecord::class,
+            MenstruationFlowRecord::class,
+            MenstruationPeriodRecord::class,
+            SleepSessionRecord::class,
+            ExerciseSessionRecord::class,
+            BodyWaterMassRecord::class,
+            IntermenstrualBleedingRecord::class,
+            HeartRateVariabilityRmssdRecord::class,
+            SkinTemperatureRecord::class,
+            PlannedExerciseSessionRecord::class,
+            MindfulnessSessionRecord::class,
+        )
+
+private fun getSupportedDataTypes(): List<DataType> {
+    return HealthConnectMappings.getInstance()
+        .recordIdToExternalRecordClassMap
+        .values
+        .map { it.kotlin }
+        .toList()
 }
diff --git a/apk/src/com/android/healthconnect/controller/shared/HealthDataCategoryExtensions.kt b/apk/src/com/android/healthconnect/controller/shared/HealthDataCategoryExtensions.kt
index 96e21ee..ae2daca 100644
--- a/apk/src/com/android/healthconnect/controller/shared/HealthDataCategoryExtensions.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/HealthDataCategoryExtensions.kt
@@ -18,11 +18,13 @@
 import android.content.Context
 import android.graphics.drawable.Drawable
 import android.health.connect.HealthDataCategory
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings
 import androidx.annotation.StringRes
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.permissions.data.fromHealthPermissionCategory
 import com.android.healthconnect.controller.shared.CategoriesMappers.ACTIVITY_PERMISSION_GROUPS
 import com.android.healthconnect.controller.shared.CategoriesMappers.BODY_MEASUREMENTS_PERMISSION_GROUPS
 import com.android.healthconnect.controller.shared.CategoriesMappers.CYCLE_TRACKING_PERMISSION_GROUPS
@@ -37,7 +39,47 @@
     /** Additional category for medical permission types. */
     const val MEDICAL = 1000
 
+    private val DATA_CATEGORY_TO_HEALTH_PERMISSION_TYPE_MAP =
+        createDataCategoryToHealthPermissionTypeMap()
+
+    private fun createDataCategoryToHealthPermissionTypeMap():
+        Map<Int, List<HealthPermissionType>> {
+
+        if (!Flags.healthConnectMappings()) {
+            return emptyMap()
+        }
+
+        val specialCases =
+            mapOf(
+                HealthDataCategory.ACTIVITY to listOf(FitnessPermissionType.EXERCISE_ROUTE),
+                MEDICAL to MedicalPermissionType.entries,
+            )
+
+        val healthConnectMappings = HealthConnectMappings.getInstance()
+
+        return healthConnectMappings.allRecordTypeIdentifiers
+            .map { recordTypeId ->
+                healthConnectMappings.getRecordCategoryForRecordType(recordTypeId) to
+                    healthConnectMappings.getHealthPermissionCategoryForRecordType(recordTypeId)
+            }
+            .groupBy({ it.first }, { fromHealthPermissionCategory(it.second) })
+            .toMutableMap()
+            .apply { specialCases.forEach { merge(it.key, it.value) { a, b -> a + b } } }
+            .mapValues { it.value.distinct() }
+            .toMap()
+    }
+
     fun @receiver:HealthDataCategoryInt Int.healthPermissionTypes(): List<HealthPermissionType> {
+        if (!Flags.healthConnectMappings()) {
+            return this.healthPermissionTypesLegacy()
+        }
+
+        return DATA_CATEGORY_TO_HEALTH_PERMISSION_TYPE_MAP[this]
+            ?: throw IllegalArgumentException("Category $this is not supported.")
+    }
+
+    private fun @receiver:HealthDataCategoryInt Int.healthPermissionTypesLegacy():
+        List<HealthPermissionType> {
         return when (this) {
             HealthDataCategory.ACTIVITY -> ACTIVITY_PERMISSION_GROUPS
             HealthDataCategory.BODY_MEASUREMENTS -> BODY_MEASUREMENTS_PERMISSION_GROUPS
@@ -183,6 +225,10 @@
  * Allows code being unit tested with different flag values.
  */
 fun getAllFitnessDataCategories() =
+    if (Flags.healthConnectMappings()) HealthConnectMappings.getInstance().allHealthDataCategories
+    else getAllFitnessDataCategoriesLegacy()
+
+fun getAllFitnessDataCategoriesLegacy() =
     listOfNotNull(
         HealthDataCategory.ACTIVITY,
         HealthDataCategory.BODY_MEASUREMENTS,
diff --git a/apk/src/com/android/healthconnect/controller/shared/HealthPermissionReader.kt b/apk/src/com/android/healthconnect/controller/shared/HealthPermissionReader.kt
index 9242c05..6e5c4c0 100644
--- a/apk/src/com/android/healthconnect/controller/shared/HealthPermissionReader.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/HealthPermissionReader.kt
@@ -15,17 +15,26 @@
  */
 package com.android.healthconnect.controller.shared
 
+import android.app.AppOpsManager
 import android.content.Context
 import android.content.Intent
+import android.content.pm.PackageInfo
 import android.content.pm.PackageManager
 import android.content.pm.PackageManager.NameNotFoundException
 import android.content.pm.PackageManager.PackageInfoFlags
 import android.content.pm.PackageManager.ResolveInfoFlags
 import android.health.connect.HealthConnectManager
 import android.health.connect.HealthPermissions
+import android.os.Process
+import com.android.healthconnect.controller.permissions.api.GetHealthPermissionsFlagsUseCase
 import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isAdditionalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isFitnessReadPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalReadPermission
 import com.android.healthconnect.controller.shared.app.AppPermissionsType
-import com.android.healthconnect.controller.utils.FeatureUtils
+import com.android.healthfitness.flags.AconfigFlagHelper
+import com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled
 import com.android.healthfitness.flags.Flags
 import com.google.common.annotations.VisibleForTesting
 import dagger.hilt.android.qualifiers.ApplicationContext
@@ -41,47 +50,59 @@
 @Inject
 constructor(
     @ApplicationContext private val context: Context,
-    private val featureUtils: FeatureUtils,
+    private val getHealthPermissionsFlagsUseCase: GetHealthPermissionsFlagsUseCase,
 ) {
 
     companion object {
+        private const val HEALTH_PERMISSION_GROUP = "android.permission-group.HEALTH"
         private const val RESOLVE_INFO_FLAG: Long = PackageManager.MATCH_ALL.toLong()
         private const val PACKAGE_INFO_PERMISSIONS_FLAG: Long =
             PackageManager.GET_PERMISSIONS.toLong()
-        private val sessionTypePermissions =
-            listOf(
-                HealthPermissions.READ_EXERCISE,
-                HealthPermissions.WRITE_EXERCISE,
-                HealthPermissions.READ_SLEEP,
-                HealthPermissions.WRITE_SLEEP,
-            )
-
-        private val backgroundReadPermission =
-            listOf(HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND)
-
-        private val historyReadPermission = listOf(HealthPermissions.READ_HEALTH_DATA_HISTORY)
-
-        /** Special health permissions that don't represent health data types. */
-        private val additionalPermissions =
-            setOf(
-                HealthPermissions.READ_EXERCISE_ROUTES,
-                HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND,
-                HealthPermissions.READ_HEALTH_DATA_HISTORY,
-            )
 
         private val medicalPermissions =
             setOf(
                 HealthPermissions.WRITE_MEDICAL_DATA,
-                HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE,
-                HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION,
+                HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
                 HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS,
                 HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS,
+                HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS,
+                HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS,
                 HealthPermissions.READ_MEDICAL_DATA_PREGNANCY,
-                HealthPermissions.READ_MEDICAL_DATA_PROBLEMS,
                 HealthPermissions.READ_MEDICAL_DATA_PROCEDURES,
                 HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY,
+                HealthPermissions.READ_MEDICAL_DATA_VACCINES,
+                HealthPermissions.READ_MEDICAL_DATA_VISITS,
                 HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS,
             )
+
+        /**
+         * Determines if an app's permission group is user-sensitive. If an app is not user
+         * sensitive, then it is considered a system app, and hidden in the UI by default.
+         *
+         * This logic is copied from PermissionController/AppPermGroupUiInfoLiveData because we want
+         * to achieve consistent numbers as showed in Settings->PermissionManager.
+         *
+         * @param permFlags the permission flags corresponding to the permissions requested by a
+         *   given app
+         * @param packageFlags flag of
+         *   [android.R.styleable#AndroidManifestUsesPermission&lt;uses-permission&gt;] tag included
+         *   under &lt;manifest&gt
+         * @return Whether or not this package requests a user sensitive permission
+         */
+        private fun isUserSensitive(permFlags: Int?, packageFlags: Int?): Boolean {
+            if (permFlags == null || packageFlags == null) {
+                return true
+            }
+            val granted =
+                packageFlags and PackageInfo.REQUESTED_PERMISSION_GRANTED != 0 &&
+                    permFlags and PackageManager.FLAG_PERMISSION_REVOKED_COMPAT == 0
+            return if (granted) {
+                permFlags and PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED != 0
+            } else {
+                permFlags and PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED != 0
+            }
+        }
     }
 
     /**
@@ -89,6 +110,14 @@
      * (additional or data type).
      */
     fun getAppsWithHealthPermissions(): List<String> {
+        if (
+            context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH) &&
+                Flags.replaceBodySensorPermissionEnabled()
+        ) {
+            // On Wear, do not depend on intent filter, instead, query apps by requested permissions
+            // and filter out system apps.
+            return getPackagesRequestingSystemHealthPermissions()
+        }
         return try {
             appsWithDeclaredIntent().filter { getValidHealthPermissions(it).isNotEmpty() }
         } catch (e: Exception) {
@@ -96,6 +125,66 @@
         }
     }
 
+    /**
+     * Identifies apps that have system health permissions requested.
+     *
+     * This function queries all apps and search for non-system apps that have requested at least
+     * one health permissions. This function does not rely on health rationale intent filter. The
+     * processing time of this function will be longer than the intent filter approach.
+     *
+     * @return a list of app package names that have requested at least one health permission and
+     *   that are not system apps
+     */
+    private fun getPackagesRequestingSystemHealthPermissions(): List<String> {
+        val packages =
+            context.packageManager.getInstalledPackagesAsUser(
+                PackageManager.GET_PERMISSIONS,
+                Process.myUserHandle().getIdentifier(),
+            )
+        val healthApps = mutableListOf<String>()
+        val systemHealthPermissions = getSystemHealthPermissions()
+
+        for (info in packages) {
+            val packageName = info.packageName
+            val requestedPermissions = info.requestedPermissions ?: continue
+
+            // Create a subset of requestedPermissions, where only system health permissions are
+            // included. This is because HealthConnect service enforceValidHealthPermissions before
+            // getPermissionFlags, and we're only interested in system health permissions in
+            // displaying wear UI.
+            val requestedSystemHealthPermissions =
+                requestedPermissions
+                    .withIndex()
+                    .filter { (_, permissionName) ->
+                        systemHealthPermissions.contains(permissionName)
+                    }
+                    .associate { (index, permissionName) -> index to permissionName }
+            if (requestedSystemHealthPermissions.isEmpty()) {
+                continue
+            }
+
+            // Only display non-system apps who are considered user-sensitive for health permission
+            // group. Use permission flags to determine whether an app is user-sensitive.
+            // This is a HealthConnect service call to get permission flags.
+            val allPermFlags =
+                getHealthPermissionsFlagsUseCase(
+                    packageName,
+                    requestedSystemHealthPermissions.values.toList(),
+                )
+            if (
+                requestedSystemHealthPermissions.any { (index, permissionName) ->
+                    isUserSensitive(
+                        allPermFlags[permissionName],
+                        info.requestedPermissionsFlags?.getOrNull(index),
+                    )
+                }
+            ) {
+                healthApps.add(packageName)
+            }
+        }
+        return healthApps
+    }
+
     fun getAppsWithFitnessPermissions(): List<String> {
         return try {
             appsWithDeclaredIntent().filter {
@@ -151,16 +240,63 @@
         }
     }
 
-    /** Returns a list of health permissions declared by an app that can be rendered in our UI. */
+    /**
+     * Returns a list of health permissions declared by an app that can be rendered in our UI. This
+     * also filters out invalid additional permissions.
+     */
     fun getValidHealthPermissions(packageName: String): List<HealthPermission> {
         return try {
             val permissions = getDeclaredHealthPermissions(packageName)
-            permissions.mapNotNull { permission -> parsePermission(permission) }
+            val declaredPermissions =
+                permissions.mapNotNull { permission -> parsePermission(permission) }
+            if (isPersonalHealthRecordEnabled()) {
+                maybeFilterOutAdditionalIfNotValid(declaredPermissions)
+            } else {
+                declaredPermissions
+            }
         } catch (e: NameNotFoundException) {
             emptyList()
         }
     }
 
+    /**
+     * Filers out invalid additional permissions. READ_HEALTH_DATA_HISTORY is valid if at least one
+     * FITNESS READ permission is declared. READ_HEALTH_DATA_IN_BACKGROUND is valid if at least one
+     * HEALTH READ permission is declared.
+     */
+    @VisibleForTesting
+    fun maybeFilterOutAdditionalIfNotValid(
+        declaredPermissions: List<HealthPermission>
+    ): List<HealthPermission> {
+        val historyReadDeclared =
+            declaredPermissions.filterIsInstance<AdditionalPermission>().any {
+                it == AdditionalPermission.READ_HEALTH_DATA_HISTORY
+            }
+        val backgroundReadDeclared =
+            declaredPermissions.filterIsInstance<AdditionalPermission>().any {
+                it == AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND
+            }
+        val atLeastOneFitnessReadDeclared = declaredPermissions.any { isFitnessReadPermission(it) }
+        val atLeastOneMedicalReadDeclared = declaredPermissions.any { isMedicalReadPermission(it) }
+        val atLeastOneHealthReadDeclared =
+            atLeastOneFitnessReadDeclared || atLeastOneMedicalReadDeclared
+
+        var result = declaredPermissions.toMutableList()
+        if (historyReadDeclared && !atLeastOneFitnessReadDeclared) {
+            result =
+                result
+                    .filterNot { it == AdditionalPermission.READ_HEALTH_DATA_HISTORY }
+                    .toMutableList()
+        }
+        if (backgroundReadDeclared && !atLeastOneHealthReadDeclared) {
+            result =
+                result
+                    .filterNot { it == AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND }
+                    .toMutableList()
+        }
+        return result.toList()
+    }
+
     /** Returns a list of health permissions that are declared by an app. */
     fun getDeclaredHealthPermissions(packageName: String): List<String> {
         return try {
@@ -196,9 +332,21 @@
         }
     }
 
+    /**
+     * When PHR flag is on, returns valid additional permissions that we can display in our UI. An
+     * additional permission is valid if the correct read permissions are declared.
+     *
+     * When PHR flag is off, returns additional permissions that are declared.
+     */
     fun getAdditionalPermissions(packageName: String): List<String> {
-        return getDeclaredHealthPermissions(packageName).filter { perm ->
-            isAdditionalPermission(perm) && !shouldHidePermission(perm)
+        return if (isPersonalHealthRecordEnabled()) {
+            getValidHealthPermissions(packageName)
+                .map { it.toString() }
+                .filter { perm -> isAdditionalPermission(perm) && !shouldHidePermission(perm) }
+        } else {
+            getDeclaredHealthPermissions(packageName).filter { perm ->
+                isAdditionalPermission(perm) && !shouldHidePermission(perm)
+            }
         }
     }
 
@@ -235,69 +383,34 @@
     @VisibleForTesting
     fun getHealthPermissions(): List<String> {
         val permissions =
-            context.packageManager
-                .queryPermissionsByGroup("android.permission-group.HEALTH", 0)
-                .map { permissionInfo -> permissionInfo.name }
+            context.packageManager.queryPermissionsByGroup(HEALTH_PERMISSION_GROUP, 0).map {
+                permissionInfo ->
+                permissionInfo.name
+            }
         return permissions.filterNot { permission -> shouldHidePermission(permission) }
     }
 
-    fun isAdditionalPermission(permission: String): Boolean {
-        return additionalPermissions.contains(permission)
-    }
-
-    fun isMedicalPermission(permission: String): Boolean {
-        return medicalPermissions.contains(permission)
-    }
-
-    fun isFitnessPermission(permission: String): Boolean {
-        return !isAdditionalPermission(permission) && !isMedicalPermission(permission)
+    /** Returns a list of all system health permissions in the HEALTH permission group. */
+    fun getSystemHealthPermissions(): List<String> {
+        val permissions =
+            context.packageManager
+                .queryPermissionsByGroup(HEALTH_PERMISSION_GROUP, 0)
+                .map { permissionInfo -> permissionInfo.name }
+                .filter { permissionName ->
+                    val appOp = AppOpsManager.permissionToOp(permissionName)
+                    appOp != null && !appOp.equals(AppOpsManager.OPSTR_READ_WRITE_HEALTH_DATA)
+                }
+        return permissions
     }
 
     fun shouldHidePermission(permission: String): Boolean {
-        return shouldHideSessionTypes(permission) ||
-            shouldHideBackgroundReadPermission(permission) ||
-            shouldHideSkinTemperaturePermissions(permission) ||
-            shouldHidePlannedExercisePermissions(permission) ||
-            shouldHideMindfulnessSessionPermissions(permission) ||
-            shouldHideHistoryReadPermission(permission) ||
-            shouldHideMedicalPermission(permission)
-    }
-
-    private fun shouldHideSkinTemperaturePermissions(permission: String): Boolean {
-        return (permission == HealthPermissions.READ_SKIN_TEMPERATURE ||
-            permission == HealthPermissions.WRITE_SKIN_TEMPERATURE) &&
-            !featureUtils.isSkinTemperatureEnabled()
-    }
-
-    private fun shouldHidePlannedExercisePermissions(permission: String): Boolean {
-        return (permission == HealthPermissions.READ_PLANNED_EXERCISE ||
-            permission == HealthPermissions.WRITE_PLANNED_EXERCISE) &&
-            !featureUtils.isPlannedExerciseEnabled()
-    }
-
-    private fun shouldHideMindfulnessSessionPermissions(permission: String): Boolean {
-        if (Flags.mindfulness()) {
-            return false
+        return when (permission) {
+            in medicalPermissions -> !isPersonalHealthRecordEnabled()
+            HealthPermissions.READ_ACTIVITY_INTENSITY,
+            HealthPermissions.WRITE_ACTIVITY_INTENSITY ->
+                !AconfigFlagHelper.isActivityIntensityEnabled()
+            else -> false
         }
-
-        return permission == HealthPermissions.READ_MINDFULNESS ||
-            permission == HealthPermissions.WRITE_MINDFULNESS
-    }
-
-    private fun shouldHideSessionTypes(permission: String): Boolean {
-        return permission in sessionTypePermissions && !featureUtils.isSessionTypesEnabled()
-    }
-
-    private fun shouldHideBackgroundReadPermission(permission: String): Boolean {
-        return permission in backgroundReadPermission && !featureUtils.isBackgroundReadEnabled()
-    }
-
-    private fun shouldHideHistoryReadPermission(permission: String): Boolean {
-        return permission in historyReadPermission && !featureUtils.isHistoryReadEnabled()
-    }
-
-    private fun shouldHideMedicalPermission(permission: String): Boolean {
-        return permission in medicalPermissions && !featureUtils.isPersonalHealthRecordEnabled()
     }
 
     private fun getRationaleIntent(packageName: String? = null): Intent {
diff --git a/apk/src/com/android/healthconnect/controller/shared/HealthPermissionToDatatypeMapper.kt b/apk/src/com/android/healthconnect/controller/shared/HealthPermissionToDatatypeMapper.kt
index 725c145..faff2e7 100644
--- a/apk/src/com/android/healthconnect/controller/shared/HealthPermissionToDatatypeMapper.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/HealthPermissionToDatatypeMapper.kt
@@ -57,6 +57,7 @@
 import android.health.connect.datatypes.Vo2MaxRecord
 import android.health.connect.datatypes.WeightRecord
 import android.health.connect.datatypes.WheelchairPushesRecord
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.ACTIVE_CALORIES_BURNED
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BASAL_BODY_TEMPERATURE
@@ -96,50 +97,60 @@
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.VO2_MAX
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.WEIGHT
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.WHEELCHAIR_PUSHES
+import com.android.healthconnect.controller.permissions.data.fromHealthPermissionCategory
+import com.android.healthfitness.flags.Flags
 
 object HealthPermissionToDatatypeMapper {
     private val map =
-        mapOf(
-            STEPS to listOf(StepsRecord::class.java, StepsCadenceRecord::class.java),
-            HEART_RATE to listOf(HeartRateRecord::class.java),
-            BASAL_METABOLIC_RATE to listOf(BasalMetabolicRateRecord::class.java),
-            SPEED to listOf(SpeedRecord::class.java),
-            DISTANCE to listOf(DistanceRecord::class.java),
-            POWER to listOf(PowerRecord::class.java),
-            ACTIVE_CALORIES_BURNED to listOf(ActiveCaloriesBurnedRecord::class.java),
-            TOTAL_CALORIES_BURNED to listOf(TotalCaloriesBurnedRecord::class.java),
-            HEIGHT to listOf(HeightRecord::class.java),
-            BODY_FAT to listOf(BodyFatRecord::class.java),
-            OXYGEN_SATURATION to listOf(OxygenSaturationRecord::class.java),
-            BODY_TEMPERATURE to listOf(BodyTemperatureRecord::class.java),
-            BASAL_BODY_TEMPERATURE to listOf(BasalBodyTemperatureRecord::class.java),
-            WHEELCHAIR_PUSHES to listOf(WheelchairPushesRecord::class.java),
-            RESTING_HEART_RATE to listOf(RestingHeartRateRecord::class.java),
-            RESPIRATORY_RATE to listOf(RespiratoryRateRecord::class.java),
-            HYDRATION to listOf(HydrationRecord::class.java),
-            FLOORS_CLIMBED to listOf(FloorsClimbedRecord::class.java),
-            ELEVATION_GAINED to listOf(ElevationGainedRecord::class.java),
-            BONE_MASS to listOf(BoneMassRecord::class.java),
-            LEAN_BODY_MASS to listOf(LeanBodyMassRecord::class.java),
-            WEIGHT to listOf(WeightRecord::class.java),
-            BLOOD_GLUCOSE to listOf(BloodGlucoseRecord::class.java),
-            NUTRITION to listOf(NutritionRecord::class.java),
-            BLOOD_PRESSURE to listOf(BloodPressureRecord::class.java),
-            VO2_MAX to listOf(Vo2MaxRecord::class.java),
-            EXERCISE to
-                listOf(ExerciseSessionRecord::class.java, CyclingPedalingCadenceRecord::class.java),
-            CERVICAL_MUCUS to listOf(CervicalMucusRecord::class.java),
-            SEXUAL_ACTIVITY to listOf(SexualActivityRecord::class.java),
-            OVULATION_TEST to listOf(OvulationTestRecord::class.java),
-            MENSTRUATION to
-                listOf(MenstruationFlowRecord::class.java, MenstruationPeriodRecord::class.java),
-            SLEEP to listOf(SleepSessionRecord::class.java),
-            BODY_WATER_MASS to listOf(BodyWaterMassRecord::class.java),
-            INTERMENSTRUAL_BLEEDING to listOf(IntermenstrualBleedingRecord::class.java),
-            HEART_RATE_VARIABILITY to listOf(HeartRateVariabilityRmssdRecord::class.java),
-            SKIN_TEMPERATURE to listOf(SkinTemperatureRecord::class.java),
-            PLANNED_EXERCISE to listOf(PlannedExerciseSessionRecord::class.java),
-            MINDFULNESS to listOf(MindfulnessSessionRecord::class.java),
+        if (Flags.healthConnectMappings()) createMap()
+        else
+            mapOf(
+                STEPS to listOf(StepsRecord::class.java, StepsCadenceRecord::class.java),
+                HEART_RATE to listOf(HeartRateRecord::class.java),
+                BASAL_METABOLIC_RATE to listOf(BasalMetabolicRateRecord::class.java),
+                SPEED to listOf(SpeedRecord::class.java),
+                DISTANCE to listOf(DistanceRecord::class.java),
+                POWER to listOf(PowerRecord::class.java),
+                ACTIVE_CALORIES_BURNED to listOf(ActiveCaloriesBurnedRecord::class.java),
+                TOTAL_CALORIES_BURNED to listOf(TotalCaloriesBurnedRecord::class.java),
+                HEIGHT to listOf(HeightRecord::class.java),
+                BODY_FAT to listOf(BodyFatRecord::class.java),
+                OXYGEN_SATURATION to listOf(OxygenSaturationRecord::class.java),
+                BODY_TEMPERATURE to listOf(BodyTemperatureRecord::class.java),
+                BASAL_BODY_TEMPERATURE to listOf(BasalBodyTemperatureRecord::class.java),
+                WHEELCHAIR_PUSHES to listOf(WheelchairPushesRecord::class.java),
+                RESTING_HEART_RATE to listOf(RestingHeartRateRecord::class.java),
+                RESPIRATORY_RATE to listOf(RespiratoryRateRecord::class.java),
+                HYDRATION to listOf(HydrationRecord::class.java),
+                FLOORS_CLIMBED to listOf(FloorsClimbedRecord::class.java),
+                ELEVATION_GAINED to listOf(ElevationGainedRecord::class.java),
+                BONE_MASS to listOf(BoneMassRecord::class.java),
+                LEAN_BODY_MASS to listOf(LeanBodyMassRecord::class.java),
+                WEIGHT to listOf(WeightRecord::class.java),
+                BLOOD_GLUCOSE to listOf(BloodGlucoseRecord::class.java),
+                NUTRITION to listOf(NutritionRecord::class.java),
+                BLOOD_PRESSURE to listOf(BloodPressureRecord::class.java),
+                VO2_MAX to listOf(Vo2MaxRecord::class.java),
+                EXERCISE to
+                        listOf(
+                            ExerciseSessionRecord::class.java,
+                            CyclingPedalingCadenceRecord::class.java,
+                        ),
+                CERVICAL_MUCUS to listOf(CervicalMucusRecord::class.java),
+                SEXUAL_ACTIVITY to listOf(SexualActivityRecord::class.java),
+                OVULATION_TEST to listOf(OvulationTestRecord::class.java),
+                MENSTRUATION to
+                        listOf(
+                            MenstruationFlowRecord::class.java,
+                            MenstruationPeriodRecord::class.java,
+                        ),
+                SLEEP to listOf(SleepSessionRecord::class.java),
+                BODY_WATER_MASS to listOf(BodyWaterMassRecord::class.java),
+                INTERMENSTRUAL_BLEEDING to listOf(IntermenstrualBleedingRecord::class.java),
+                HEART_RATE_VARIABILITY to listOf(HeartRateVariabilityRmssdRecord::class.java),
+                SKIN_TEMPERATURE to listOf(SkinTemperatureRecord::class.java),
+                PLANNED_EXERCISE to listOf(PlannedExerciseSessionRecord::class.java),
+                MINDFULNESS to listOf(MindfulnessSessionRecord::class.java),
             )
 
     fun getDataTypes(permissionType: FitnessPermissionType): List<Class<out Record>> {
@@ -149,4 +160,16 @@
     fun getAllDataTypes(): Map<FitnessPermissionType, List<Class<out Record>>> {
         return map
     }
+
+    private fun createMap(): Map<FitnessPermissionType, List<Class<out Record>>> {
+        val healthConnectMappings = HealthConnectMappings.getInstance()
+
+        return healthConnectMappings.allRecordTypeIdentifiers
+            .map { recordTypeId ->
+                fromHealthPermissionCategory(
+                    healthConnectMappings.getHealthPermissionCategoryForRecordType(recordTypeId)
+                ) to healthConnectMappings.recordIdToExternalRecordClassMap[recordTypeId]!!
+            }
+            .groupBy({ it.first as FitnessPermissionType }, { it.second })
+    }
 }
diff --git a/apk/src/com/android/healthconnect/controller/shared/app/AppMetadata.kt b/apk/src/com/android/healthconnect/controller/shared/app/AppMetadata.kt
index ce959dd..dd5c082 100644
--- a/apk/src/com/android/healthconnect/controller/shared/app/AppMetadata.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/app/AppMetadata.kt
@@ -18,4 +18,23 @@
 import android.graphics.drawable.Drawable
 
 /** Represents an app being displayed in Health Connect. */
-data class AppMetadata(val packageName: String, val appName: String, val icon: Drawable?)
+data class AppMetadata(val packageName: String, val appName: String, val icon: Drawable?) {
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (this.javaClass != other?.javaClass) return false
+
+        other as AppMetadata
+
+        if (packageName != other.packageName) return false
+        if (appName != other.appName) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = packageName.hashCode()
+        result = 31 * result + appName.hashCode()
+        return result
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/shared/app/GetContributorAppInfoUseCase.kt b/apk/src/com/android/healthconnect/controller/shared/app/GetContributorAppInfoUseCase.kt
index eea18e0..bd514f2 100644
--- a/apk/src/com/android/healthconnect/controller/shared/app/GetContributorAppInfoUseCase.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/app/GetContributorAppInfoUseCase.kt
@@ -15,22 +15,6 @@
  *
  *
  */
-
-/**
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * ```
- *      http://www.apache.org/licenses/LICENSE-2.0
- * ```
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
 package com.android.healthconnect.controller.shared.app
 
 import android.content.Context
@@ -56,7 +40,7 @@
 constructor(
     private val healthConnectManager: HealthConnectManager,
     @ApplicationContext private val context: Context,
-    @IoDispatcher private val dispatcher: CoroutineDispatcher
+    @IoDispatcher private val dispatcher: CoroutineDispatcher,
 ) : IGetContributorAppInfoUseCase {
     companion object {
         private const val TAG = "GetContributorAppInfo"
@@ -68,7 +52,9 @@
                 val appInfoList =
                     suspendCancellableCoroutine<ApplicationInfoResponse> { continuation ->
                             healthConnectManager.getContributorApplicationsInfo(
-                                Runnable::run, continuation.asOutcomeReceiver())
+                                Runnable::run,
+                                continuation.asOutcomeReceiver(),
+                            )
                         }
                         .applicationInfoList
                 appInfoList.associate { it.packageName to toAppMetadata(it) }
@@ -84,7 +70,8 @@
             appName =
                 appInfo.name
                     ?: appInfo.packageName, // default to package name if appInfo name is null
-            icon = getIcon(appInfo.icon))
+            icon = getIcon(appInfo.icon),
+        )
     }
 
     private fun getIcon(bitmap: Bitmap?): Drawable? {
diff --git a/apk/src/com/android/healthconnect/controller/shared/inactiveapp/InactiveAppPreference.kt b/apk/src/com/android/healthconnect/controller/shared/inactiveapp/InactiveAppPreference.kt
index 272a704..152f307 100644
--- a/apk/src/com/android/healthconnect/controller/shared/inactiveapp/InactiveAppPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/inactiveapp/InactiveAppPreference.kt
@@ -30,7 +30,7 @@
 import dagger.hilt.android.EntryPointAccessors
 
 /** Custom preference for displaying an inactive app. */
-class InactiveAppPreference constructor(context: Context) : AppPreference(context) {
+class InactiveAppPreference(context: Context) : AppPreference(context) {
     private var deleteButtonListener: OnClickListener? = null
 
     private var logger: HealthConnectLogger
@@ -41,7 +41,9 @@
         isSelectable = false
         val hiltEntryPoint =
             EntryPointAccessors.fromApplication(
-                context.applicationContext, HealthConnectLoggerEntryPoint::class.java)
+                context.applicationContext,
+                HealthConnectLoggerEntryPoint::class.java,
+            )
         logger = hiltEntryPoint.logger()
     }
 
@@ -63,7 +65,8 @@
             widgetFrameParent.paddingStart,
             widgetFrameParent.paddingTop,
             /* end = */ 0,
-            widgetFrameParent.paddingBottom)
+            widgetFrameParent.paddingBottom,
+        )
     }
 
     /** Sets the listener for delete button click. */
diff --git a/apk/src/com/android/healthconnect/controller/shared/preference/AggregationDataCard.kt b/apk/src/com/android/healthconnect/controller/shared/preference/AggregationDataCard.kt
index 93dab8d..180a5a7 100644
--- a/apk/src/com/android/healthconnect/controller/shared/preference/AggregationDataCard.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/preference/AggregationDataCard.kt
@@ -28,6 +28,7 @@
 import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
 import com.android.healthconnect.controller.utils.SystemTimeSource
 import com.android.healthconnect.controller.utils.TimeSource
+import com.android.healthconnect.controller.utils.isLessThanOneYearAgo
 import com.android.healthconnect.controller.utils.toLocalTime
 import java.time.Instant
 import java.time.LocalTime
@@ -40,7 +41,7 @@
     attrs: AttributeSet? = null,
     cardType: CardTypeEnum,
     cardInfo: AggregationCardInfo,
-    private val timeSource: TimeSource = SystemTimeSource
+    private val timeSource: TimeSource = SystemTimeSource,
 ) : LinearLayout(context, attrs) {
     private val dateFormatter = LocalDateTimeFormatter(context)
 
@@ -70,48 +71,89 @@
                 R.id.card_title_number,
                 ConstraintSet.START,
                 ConstraintSet.PARENT_ID,
-                ConstraintSet.START)
+                ConstraintSet.START,
+            )
             constraintSet.connect(
                 R.id.card_title_number,
                 ConstraintSet.TOP,
                 ConstraintSet.PARENT_ID,
-                ConstraintSet.TOP)
+                ConstraintSet.TOP,
+            )
             constraintSet.connect(
-                R.id.card_title_number, ConstraintSet.BOTTOM, R.id.card_date, ConstraintSet.TOP)
+                R.id.card_title_number,
+                ConstraintSet.BOTTOM,
+                R.id.card_date,
+                ConstraintSet.TOP,
+            )
 
             constraintSet.connect(
-                R.id.card_date, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START)
+                R.id.card_date,
+                ConstraintSet.START,
+                ConstraintSet.PARENT_ID,
+                ConstraintSet.START,
+            )
             constraintSet.connect(
-                R.id.card_date, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM)
+                R.id.card_date,
+                ConstraintSet.BOTTOM,
+                ConstraintSet.PARENT_ID,
+                ConstraintSet.BOTTOM,
+            )
             constraintSet.connect(
-                R.id.card_date, ConstraintSet.TOP, R.id.card_title_number, ConstraintSet.BOTTOM)
+                R.id.card_date,
+                ConstraintSet.TOP,
+                R.id.card_title_number,
+                ConstraintSet.BOTTOM,
+            )
         } else {
             constraintSet.connect(
                 R.id.card_title_number,
                 ConstraintSet.START,
                 ConstraintSet.PARENT_ID,
-                ConstraintSet.START)
+                ConstraintSet.START,
+            )
             constraintSet.connect(
                 R.id.card_title_number,
                 ConstraintSet.TOP,
                 ConstraintSet.PARENT_ID,
-                ConstraintSet.TOP)
+                ConstraintSet.TOP,
+            )
             constraintSet.connect(
                 R.id.card_title_number,
                 ConstraintSet.BOTTOM,
                 ConstraintSet.PARENT_ID,
-                ConstraintSet.BOTTOM)
+                ConstraintSet.BOTTOM,
+            )
             constraintSet.connect(
-                R.id.card_title_number, ConstraintSet.END, R.id.card_date, ConstraintSet.START)
+                R.id.card_title_number,
+                ConstraintSet.END,
+                R.id.card_date,
+                ConstraintSet.START,
+            )
 
             constraintSet.connect(
-                R.id.card_date, ConstraintSet.START, R.id.card_title_number, ConstraintSet.END)
+                R.id.card_date,
+                ConstraintSet.START,
+                R.id.card_title_number,
+                ConstraintSet.END,
+            )
             constraintSet.connect(
-                R.id.card_date, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END)
+                R.id.card_date,
+                ConstraintSet.END,
+                ConstraintSet.PARENT_ID,
+                ConstraintSet.END,
+            )
             constraintSet.connect(
-                R.id.card_date, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP)
+                R.id.card_date,
+                ConstraintSet.TOP,
+                ConstraintSet.PARENT_ID,
+                ConstraintSet.TOP,
+            )
             constraintSet.connect(
-                R.id.card_date, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM)
+                R.id.card_date,
+                ConstraintSet.BOTTOM,
+                ConstraintSet.PARENT_ID,
+                ConstraintSet.BOTTOM,
+            )
 
             constraintSet.createHorizontalChain(
                 ConstraintSet.PARENT_ID,
@@ -120,7 +162,8 @@
                 ConstraintSet.RIGHT,
                 intArrayOf(R.id.card_title_number, R.id.card_date),
                 null,
-                ConstraintSet.CHAIN_SPREAD_INSIDE)
+                ConstraintSet.CHAIN_SPREAD_INSIDE,
+            )
 
             constraintSet.constrainedWidth(R.id.card_title_number, true)
             constraintSet.constrainedWidth(R.id.card_date, true)
@@ -129,17 +172,6 @@
         constraintSet.applyTo(titleAndDateContainer)
     }
 
-    private fun isLessThanOneYearAgo(instant: Instant): Boolean {
-        val oneYearAgo =
-            timeSource
-                .currentLocalDateTime()
-                .minusYears(1)
-                .toLocalDate()
-                .atStartOfDay(timeSource.deviceZoneOffset())
-                .toInstant()
-        return instant.isAfter(oneYearAgo)
-    }
-
     private fun formatDateText(startDate: Instant, endDate: Instant?): String {
         return if (endDate != null) {
             var localEndDate: Instant = endDate
@@ -150,14 +182,17 @@
                 localEndDate = endDate.plusMillis(1)
             }
             // display date range
-            if (isLessThanOneYearAgo(startDate) && isLessThanOneYearAgo(localEndDate)) {
+            if (
+                startDate.isLessThanOneYearAgo(timeSource) &&
+                    startDate.isLessThanOneYearAgo(timeSource)
+            ) {
                 dateFormatter.formatDateRangeWithoutYear(startDate, localEndDate)
             } else {
                 dateFormatter.formatDateRangeWithYear(startDate, localEndDate)
             }
         } else {
             // display only one date
-            if (isLessThanOneYearAgo(startDate)) {
+            if (startDate.isLessThanOneYearAgo(timeSource)) {
                 dateFormatter.formatShortDate(startDate)
             } else {
                 dateFormatter.formatLongDate(startDate)
@@ -167,6 +202,6 @@
 
     enum class CardTypeEnum {
         SMALL_CARD,
-        LARGE_CARD
+        LARGE_CARD,
     }
 }
diff --git a/apk/src/com/android/healthconnect/controller/shared/preference/HealthMainSwitchPreference.kt b/apk/src/com/android/healthconnect/controller/shared/preference/HealthMainSwitchPreference.kt
index 5ebf204..bd55315 100644
--- a/apk/src/com/android/healthconnect/controller/shared/preference/HealthMainSwitchPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/preference/HealthMainSwitchPreference.kt
@@ -19,7 +19,6 @@
 import android.util.AttributeSet
 import android.widget.CompoundButton.OnCheckedChangeListener
 import com.android.healthconnect.controller.utils.logging.ElementName
-import com.android.healthconnect.controller.utils.logging.ErrorPageElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import com.android.healthconnect.controller.utils.logging.UnknownGenericElement
diff --git a/apk/src/com/android/healthconnect/controller/shared/preference/HealthPreferenceFragment.kt b/apk/src/com/android/healthconnect/controller/shared/preference/HealthPreferenceFragment.kt
index 2e925e1..0c49a85 100644
--- a/apk/src/com/android/healthconnect/controller/shared/preference/HealthPreferenceFragment.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/preference/HealthPreferenceFragment.kt
@@ -25,7 +25,6 @@
 import android.view.animation.AnimationUtils.loadAnimation
 import android.widget.TextView
 import androidx.annotation.StringRes
-import androidx.preference.PreferenceFragmentCompat
 import androidx.preference.PreferenceScreen
 import androidx.recyclerview.widget.RecyclerView
 import com.android.healthconnect.controller.R
@@ -35,11 +34,12 @@
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.logging.ToolbarElement
 import com.android.healthconnect.controller.utils.setupSharedMenu
+import com.android.settingslib.widget.SettingsBasePreferenceFragment
 import com.google.android.material.appbar.AppBarLayout
 import dagger.hilt.android.EntryPointAccessors
 
 /** A base fragment that represents a page in Health Connect. */
-abstract class HealthPreferenceFragment : PreferenceFragmentCompat() {
+abstract class HealthPreferenceFragment : SettingsBasePreferenceFragment() {
 
     private lateinit var logger: HealthConnectLogger
     private lateinit var loadingView: View
@@ -57,8 +57,9 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         setupLogger()
         super.onCreate(savedInstanceState)
-        val appBarLayout = requireActivity().findViewById<AppBarLayout>(
-            com.android.settingslib.collapsingtoolbar.R.id.app_bar)
+        val appBarLayout =
+            requireActivity()
+                .findViewById<AppBarLayout>(com.android.settingslib.collapsingtoolbar.R.id.app_bar)
         appBarLayout?.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES
         appBarLayout?.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
     }
@@ -72,7 +73,7 @@
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
-        savedInstanceState: Bundle?
+        savedInstanceState: Bundle?,
     ): View {
         logger.setPageId(pageName)
         val rootView =
@@ -138,7 +139,9 @@
         if (animate) {
             val animation: Animation =
                 loadAnimation(
-                    context, if (shown) android.R.anim.fade_in else android.R.anim.fade_out)
+                    context,
+                    if (shown) android.R.anim.fade_in else android.R.anim.fade_out,
+                )
             if (shown) {
                 view.visibility = View.VISIBLE
             } else {
@@ -151,7 +154,8 @@
                         override fun onAnimationEnd(animation: Animation) {
                             view.visibility = View.INVISIBLE
                         }
-                    })
+                    }
+                )
             }
             view.startAnimation(animation)
         } else {
@@ -163,7 +167,9 @@
     private fun setupLogger() {
         val hiltEntryPoint =
             EntryPointAccessors.fromApplication(
-                requireContext().applicationContext, HealthConnectLoggerEntryPoint::class.java)
+                requireContext().applicationContext,
+                HealthConnectLoggerEntryPoint::class.java,
+            )
         logger = hiltEntryPoint.logger()
         logger.setPageId(pageName)
     }
diff --git a/apk/src/com/android/healthconnect/controller/shared/preference/HealthSwitchPreference.kt b/apk/src/com/android/healthconnect/controller/shared/preference/HealthSwitchPreference.kt
index 124d10a..ea4569a 100644
--- a/apk/src/com/android/healthconnect/controller/shared/preference/HealthSwitchPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/preference/HealthSwitchPreference.kt
@@ -18,19 +18,19 @@
 import android.content.Context
 import android.util.AttributeSet
 import androidx.preference.Preference.OnPreferenceChangeListener
-import androidx.preference.SwitchPreference
+import androidx.preference.SwitchPreferenceCompat
 import com.android.healthconnect.controller.utils.logging.ElementName
-import com.android.healthconnect.controller.utils.logging.ErrorPageElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.HealthConnectLoggerEntryPoint
 import com.android.healthconnect.controller.utils.logging.UIAction
 import com.android.healthconnect.controller.utils.logging.UnknownGenericElement
 import dagger.hilt.android.EntryPointAccessors
 
-/** A [SwitchPreference] that allows logging. */
+/** A [SwitchPreferenceCompat] that allows logging. */
 open class HealthSwitchPreference
 @JvmOverloads
-constructor(context: Context, attrs: AttributeSet? = null) : SwitchPreference(context, attrs) {
+constructor(context: Context, attrs: AttributeSet? = null) :
+    SwitchPreferenceCompat(context, attrs) {
 
     private var logger: HealthConnectLogger
     var logNameActive: ElementName = UnknownGenericElement.UNKNOWN_SWITCH_ACTIVE_PREFERENCE
@@ -40,7 +40,9 @@
     init {
         val hiltEntryPoint =
             EntryPointAccessors.fromApplication(
-                context.applicationContext, HealthConnectLoggerEntryPoint::class.java)
+                context.applicationContext,
+                HealthConnectLoggerEntryPoint::class.java,
+            )
         logger = hiltEntryPoint.logger()
     }
 
diff --git a/apk/src/com/android/healthconnect/controller/shared/preference/HeaderPreference.kt b/apk/src/com/android/healthconnect/controller/shared/preference/LegacyTopIntroPreference.kt
similarity index 76%
rename from apk/src/com/android/healthconnect/controller/shared/preference/HeaderPreference.kt
rename to apk/src/com/android/healthconnect/controller/shared/preference/LegacyTopIntroPreference.kt
index 3f4dea9..9a5e219 100644
--- a/apk/src/com/android/healthconnect/controller/shared/preference/HeaderPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/preference/LegacyTopIntroPreference.kt
@@ -19,15 +19,13 @@
 import android.view.View
 import android.view.View.OnClickListener
 import android.widget.TextView
-import androidx.fragment.app.FragmentActivity
 import androidx.preference.Preference
 import androidx.preference.PreferenceViewHolder
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.utils.convertTextViewIntoLink
 
-/** Custom preference for the headers containing a link. */
-class HeaderPreference constructor(context: Context) :
-    Preference(context) {
+/** Custom preference for the headers containing a link on U and below. From V, TopIntroPreference supports link, see [topIntroPreference]. */
+internal class LegacyTopIntroPreference constructor(context: Context) : Preference(context) {
 
     private lateinit var headerTitle: TextView
     private lateinit var headerLink: TextView
@@ -41,15 +39,15 @@
         isSelectable = false
     }
 
-    fun setHeaderText(headerText: String) {
+    fun setTitle(headerText: String) {
         this.headerText = headerText
     }
 
-    fun setHeaderLinkText(headerLinkText: String) {
+    fun setLearnMoreText(headerLinkText: String) {
         this.headerLinkText = headerLinkText
     }
 
-    fun setHeaderLinkAction(onClickListener: OnClickListener) {
+    fun setLearnMoreAction(onClickListener: OnClickListener) {
         this.linkAction = onClickListener
     }
 
@@ -62,7 +60,13 @@
         headerLink = holder.findViewById(R.id.header_link) as TextView
         if (headerLinkText != null) {
             headerLink.visibility = View.VISIBLE
-            convertTextViewIntoLink(headerLink, headerLinkText, 0, headerLinkText!!.length, linkAction)
+            convertTextViewIntoLink(
+                headerLink,
+                headerLinkText,
+                0,
+                headerLinkText!!.length,
+                linkAction,
+            )
         } else {
             headerLink.visibility = View.GONE
         }
diff --git a/apk/src/com/android/healthconnect/controller/shared/preference/NoDataPreference.kt b/apk/src/com/android/healthconnect/controller/shared/preference/NoDataPreference.kt
index b040a6f..63a8a5e 100644
--- a/apk/src/com/android/healthconnect/controller/shared/preference/NoDataPreference.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/preference/NoDataPreference.kt
@@ -3,7 +3,6 @@
 import android.content.Context
 import android.util.AttributeSet
 import androidx.preference.Preference
-import androidx.preference.PreferenceViewHolder
 import com.android.healthconnect.controller.R
 
 /** Custom preference for displaying no search result. */
@@ -11,16 +10,13 @@
 @JvmOverloads
 constructor(
     context: Context,
-    attrs: AttributeSet? = null
-) : Preference(context, attrs) {
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = androidx.preference.R.attr.preferenceStyle,
+) : Preference(context, attrs, defStyleAttr) {
 
     init {
-        layoutResource = R.layout.widget_no_data
         key = "no_data_preference"
+        setSummary(R.string.no_data)
         isSelectable = false
     }
-
-    override fun onBindViewHolder(holder: PreferenceViewHolder) {
-        super.onBindViewHolder(holder)
-    }
 }
diff --git a/apk/src/com/android/healthconnect/controller/shared/preference/PreferenceHelper.kt b/apk/src/com/android/healthconnect/controller/shared/preference/PreferenceHelper.kt
new file mode 100644
index 0000000..bba798e
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/shared/preference/PreferenceHelper.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.shared.preference
+
+import android.content.Context
+import android.os.Build
+import android.view.View.OnClickListener
+import androidx.preference.Preference
+import com.android.settingslib.widget.SettingsThemeHelper
+import com.android.settingslib.widget.TopIntroPreference
+
+fun topIntroPreference(
+    context: Context,
+    preferenceKey: String? = null,
+    preferenceTitle: String? = null,
+    learnMoreText: String? = null,
+    learnMoreAction: OnClickListener? = null,
+    preferenceOrder: Int = 0,
+): Preference {
+    // TODO(b/378469065): Remove isExpressive check once TopIntroPreference is fixed. At the moment
+    // it does not display the learn more link when expressive theming is off.
+    return if (
+        Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM &&
+            SettingsThemeHelper.isExpressiveTheme(context)
+    ) {
+        TopIntroPreference(context).apply {
+            preferenceKey?.let { key = it }
+            preferenceTitle?.let { title = it }
+            learnMoreText?.let { setLearnMoreText(it) }
+            learnMoreAction?.let { setLearnMoreAction(it) }
+            order = preferenceOrder
+        }
+    } else {
+        LegacyTopIntroPreference(context).apply {
+            preferenceKey?.let { key = it }
+            preferenceTitle?.let { setTitle(it) }
+            learnMoreText?.let { setLearnMoreText(it) }
+            learnMoreAction?.let { setLearnMoreAction(it) }
+            order = preferenceOrder
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/shared/preference/WarningPreference.kt b/apk/src/com/android/healthconnect/controller/shared/preference/WarningPreference.kt
new file mode 100644
index 0000000..8325514
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/shared/preference/WarningPreference.kt
@@ -0,0 +1,46 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.shared.preference
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.TextView
+import androidx.preference.Preference
+import androidx.preference.PreferenceViewHolder
+import com.android.healthconnect.controller.R
+
+class WarningPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
+    Preference(context, attrs) {
+
+    private lateinit var title: String
+
+    init {
+        layoutResource = R.layout.widget_warning_preference
+        isSelectable = false
+        // TODO (b/342159144) add logging
+    }
+
+    fun setTitle(title: String) {
+        this.title = title
+    }
+
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
+        super.onBindViewHolder(holder)
+
+        val preferenceText = holder.findViewById(R.id.title) as TextView
+        preferenceText.text = title
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/shared/recyclerview/DeletionViewBinder.kt b/apk/src/com/android/healthconnect/controller/shared/recyclerview/DeletionViewBinder.kt
index 757d81a..4182255 100644
--- a/apk/src/com/android/healthconnect/controller/shared/recyclerview/DeletionViewBinder.kt
+++ b/apk/src/com/android/healthconnect/controller/shared/recyclerview/DeletionViewBinder.kt
@@ -13,9 +13,38 @@
  */
 package com.android.healthconnect.controller.shared.recyclerview
 
+import android.content.res.Resources
 import android.view.View
+import com.android.healthconnect.controller.R
 
 interface DeletionViewBinder<T, V : View> : ViewBinder<T, V> {
     /** Populate a view with data. */
-    fun bind(view: View, data: T, index: Int, isDeletionState: Boolean = false, isChecked: Boolean = false)
-}
\ No newline at end of file
+    fun bind(
+        view: View,
+        data: T,
+        index: Int,
+        isDeletionState: Boolean = false,
+        isChecked: Boolean = false,
+    )
+
+    /**
+     * Content description which includes the information about the checked state of the checkbox
+     */
+    fun getUpdatedContentDescription(
+        resources: Resources,
+        a11yTitle: String,
+        isDeletionState: Boolean,
+        isChecked: Boolean,
+    ): String {
+        val separator = resources.getString(R.string.separator)
+        val checkedState =
+            if (isDeletionState) {
+                if (isChecked) {
+                    separator + resources.getString(R.string.a11y_checked)
+                } else {
+                    separator + resources.getString(R.string.a11y_unchecked)
+                }
+            } else ""
+        return a11yTitle + checkedState
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/utils/DeviceInfoUtils.kt b/apk/src/com/android/healthconnect/controller/utils/DeviceInfoUtils.kt
index 17b5f45..70fcb53 100644
--- a/apk/src/com/android/healthconnect/controller/utils/DeviceInfoUtils.kt
+++ b/apk/src/com/android/healthconnect/controller/utils/DeviceInfoUtils.kt
@@ -12,6 +12,7 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.permissions.shared.HelpAndFeedbackFragment.Companion.FEEDBACK_INTENT_RESULT_CODE
 import com.android.healthconnect.controller.permissions.shared.HelpAndFeedbackFragment.Companion.USER_INITIATED_FEEDBACK_BUCKET_ID
+import com.android.healthfitness.flags.Flags
 import com.android.settingslib.HelpUtils
 import dagger.Module
 import dagger.Provides
@@ -35,6 +36,8 @@
     fun openSendFeedbackActivity(activity: FragmentActivity)
 
     fun isIntentHandlerAvailable(context: Context, intent: Intent): Boolean
+
+    fun isOnWatch(context: Context): Boolean
 }
 
 class DeviceInfoUtilsImpl @Inject constructor() : DeviceInfoUtils {
@@ -102,10 +105,16 @@
         return isHardwareSupported(context) && !isProfile(context)
     }
 
+    override fun isOnWatch(context: Context): Boolean {
+        val pm: PackageManager = context.packageManager
+        return pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
+    }
+
     private fun isHardwareSupported(context: Context): Boolean {
         val pm: PackageManager = context.packageManager
+        val disabledOnWatch = isOnWatch(context) && !Flags.replaceBodySensorPermissionEnabled()
         return (!pm.hasSystemFeature(PackageManager.FEATURE_EMBEDDED) &&
-            !pm.hasSystemFeature(PackageManager.FEATURE_WATCH) &&
+            !disabledOnWatch &&
             !pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK) &&
             !pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE))
     }
diff --git a/apk/src/com/android/healthconnect/controller/utils/FeatureUtils.kt b/apk/src/com/android/healthconnect/controller/utils/FeatureUtils.kt
deleted file mode 100644
index b72955b..0000000
--- a/apk/src/com/android/healthconnect/controller/utils/FeatureUtils.kt
+++ /dev/null
@@ -1,156 +0,0 @@
-package com.android.healthconnect.controller.utils
-
-import android.content.Context
-import android.provider.DeviceConfig
-import com.android.healthfitness.flags.AconfigFlagHelper
-import com.android.healthfitness.flags.Flags
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.android.qualifiers.ApplicationContext
-import dagger.hilt.components.SingletonComponent
-import javax.inject.Singleton
-
-interface FeatureUtils {
-    fun isSessionTypesEnabled(): Boolean
-
-    fun isExerciseRouteReadAllEnabled(): Boolean
-
-    fun isEntryPointsEnabled(): Boolean
-
-    fun isNewInformationArchitectureEnabled(): Boolean
-
-    fun isBackgroundReadEnabled(): Boolean
-
-    fun isHistoryReadEnabled(): Boolean
-
-    fun isSkinTemperatureEnabled(): Boolean
-
-    fun isPlannedExerciseEnabled(): Boolean
-
-    fun isPersonalHealthRecordEnabled(): Boolean
-}
-
-class FeatureUtilsImpl(context: Context) : FeatureUtils, DeviceConfig.OnPropertiesChangedListener {
-
-    companion object {
-        private const val HEALTH_FITNESS_FLAGS_NAMESPACE = DeviceConfig.NAMESPACE_HEALTH_FITNESS
-        private const val PROPERTY_EXERCISE_ROUTE_READ_ALL_ENABLED =
-            "exercise_routes_read_all_enable"
-        private const val PROPERTY_SESSIONS_TYPE_ENABLED = "session_types_enable"
-        private const val PROPERTY_ENTRY_POINTS_ENABLED = "entry_points_enable"
-    }
-
-    private val lock = Any()
-
-    init {
-        DeviceConfig.addOnPropertiesChangedListener(
-            HEALTH_FITNESS_FLAGS_NAMESPACE,
-            context.mainExecutor,
-            this,
-        )
-    }
-
-    private var isSessionTypesEnabled =
-        DeviceConfig.getBoolean(
-            HEALTH_FITNESS_FLAGS_NAMESPACE,
-            PROPERTY_SESSIONS_TYPE_ENABLED,
-            true,
-        )
-
-    private var isExerciseRouteReadAllEnabled = true
-
-    private var isEntryPointsEnabled =
-        DeviceConfig.getBoolean(HEALTH_FITNESS_FLAGS_NAMESPACE, PROPERTY_ENTRY_POINTS_ENABLED, true)
-
-    private var isNewInformationArchitectureEnabled = Flags.newInformationArchitecture()
-
-    private var isPersonalHealthRecordEnabled = AconfigFlagHelper.isPersonalHealthRecordEnabled()
-
-    override fun isNewInformationArchitectureEnabled(): Boolean {
-        synchronized(lock) {
-            return isNewInformationArchitectureEnabled
-        }
-    }
-
-    override fun isSessionTypesEnabled(): Boolean {
-        synchronized(lock) {
-            return isSessionTypesEnabled
-        }
-    }
-
-    override fun isExerciseRouteReadAllEnabled(): Boolean {
-        synchronized(lock) {
-            return isExerciseRouteReadAllEnabled
-        }
-    }
-
-    override fun isEntryPointsEnabled(): Boolean {
-        synchronized(lock) {
-            return isEntryPointsEnabled
-        }
-    }
-
-    override fun isBackgroundReadEnabled(): Boolean {
-        synchronized(lock) {
-            return true
-        }
-    }
-
-    override fun isHistoryReadEnabled(): Boolean {
-        synchronized(lock) {
-            return true
-        }
-    }
-
-    override fun isPlannedExerciseEnabled(): Boolean {
-        synchronized(lock) {
-            return true
-        }
-    }
-
-    override fun isSkinTemperatureEnabled(): Boolean {
-        synchronized(lock) {
-            return true
-        }
-    }
-
-    override fun isPersonalHealthRecordEnabled(): Boolean {
-        synchronized(lock) {
-            return isPersonalHealthRecordEnabled
-        }
-    }
-
-    override fun onPropertiesChanged(properties: DeviceConfig.Properties) {
-        synchronized(lock) {
-            if (!properties.namespace.equals(HEALTH_FITNESS_FLAGS_NAMESPACE)) {
-                return
-            }
-
-            for (name in properties.keyset) {
-                when (name) {
-                    PROPERTY_EXERCISE_ROUTE_READ_ALL_ENABLED -> {
-                        isExerciseRouteReadAllEnabled =
-                            properties.getBoolean(PROPERTY_EXERCISE_ROUTE_READ_ALL_ENABLED, true)
-                    }
-                    PROPERTY_SESSIONS_TYPE_ENABLED ->
-                        isSessionTypesEnabled =
-                            properties.getBoolean(PROPERTY_SESSIONS_TYPE_ENABLED, true)
-                    PROPERTY_ENTRY_POINTS_ENABLED ->
-                        isEntryPointsEnabled =
-                            properties.getBoolean(PROPERTY_ENTRY_POINTS_ENABLED, true)
-                }
-            }
-        }
-    }
-}
-
-@Module
-@InstallIn(SingletonComponent::class)
-class FeaturesModule {
-    @Provides
-    @Singleton
-    fun providesFeatureUtils(@ApplicationContext context: Context): FeatureUtils {
-        return FeatureUtilsImpl(context)
-    }
-}
diff --git a/apk/src/com/android/healthconnect/controller/utils/KeyguardManagerUtil.kt b/apk/src/com/android/healthconnect/controller/utils/KeyguardManagerUtil.kt
new file mode 100644
index 0000000..eec0813
--- /dev/null
+++ b/apk/src/com/android/healthconnect/controller/utils/KeyguardManagerUtil.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.utils
+
+import android.app.KeyguardManager
+import android.content.Context
+import dagger.hilt.android.qualifiers.ApplicationContext
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class KeyguardManagerUtil @Inject constructor() {
+
+    fun isDeviceSecure(@ApplicationContext context: Context): Boolean? {
+        val keyguardManager =
+            context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager? ?: return null
+        return keyguardManager.isDeviceSecure
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/utils/LocalDateTimeFormatter.kt b/apk/src/com/android/healthconnect/controller/utils/LocalDateTimeFormatter.kt
index cfe3e17..ec36fa8 100644
--- a/apk/src/com/android/healthconnect/controller/utils/LocalDateTimeFormatter.kt
+++ b/apk/src/com/android/healthconnect/controller/utils/LocalDateTimeFormatter.kt
@@ -16,7 +16,10 @@
 package com.android.healthconnect.controller.utils
 
 import android.content.Context
-import android.text.format.DateFormat.*
+import android.text.format.DateFormat.getBestDateTimePattern
+import android.text.format.DateFormat.getLongDateFormat
+import android.text.format.DateFormat.getTimeFormat
+import android.text.format.DateFormat.is24HourFormat
 import android.text.format.DateUtils
 import com.android.healthconnect.controller.R
 import dagger.hilt.android.qualifiers.ApplicationContext
diff --git a/apk/src/com/android/healthconnect/controller/utils/TimeExtensions.kt b/apk/src/com/android/healthconnect/controller/utils/TimeExtensions.kt
index 036630e..f14614b 100644
--- a/apk/src/com/android/healthconnect/controller/utils/TimeExtensions.kt
+++ b/apk/src/com/android/healthconnect/controller/utils/TimeExtensions.kt
@@ -94,6 +94,17 @@
     return localDate1.isAfter(localDate2.plusDays(1)) || localDate1 == localDate2.plusDays(1)
 }
 
+fun Instant.isLessThanOneYearAgo(timeSource: TimeSource): Boolean {
+    val oneYearAgo =
+        timeSource
+            .currentLocalDateTime()
+            .minusYears(1)
+            .toLocalDate()
+            .atStartOfDay(timeSource.deviceZoneOffset())
+            .toInstant()
+    return this.isAfter(oneYearAgo)
+}
+
 fun LocalDate.toInstantAtStartOfDay(): Instant {
     return this.atStartOfDay(ZoneId.systemDefault()).toInstant()
 }
diff --git a/apk/src/com/android/healthconnect/controller/utils/TimeUtils.kt b/apk/src/com/android/healthconnect/controller/utils/TimeUtils.kt
index b248715..e4e5f20 100644
--- a/apk/src/com/android/healthconnect/controller/utils/TimeUtils.kt
+++ b/apk/src/com/android/healthconnect/controller/utils/TimeUtils.kt
@@ -15,15 +15,62 @@
  */
 package com.android.healthconnect.controller.utils
 
+import android.content.Context
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod.PERIOD_DAY
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod.PERIOD_MONTH
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod.PERIOD_WEEK
+import java.time.DayOfWeek
 import java.time.Instant
+import java.time.LocalTime
 import java.time.Period
+import java.time.ZoneId
+import java.time.format.DateTimeFormatter
+import java.util.Locale
+
+/**
+ * Returns the localized instant start time of a period: Day: start of day Week: start of Monday of
+ * that week Month: start of the first day of the month
+ */
+fun getPeriodStartDate(selectedDate: Instant, period: DateNavigationPeriod): Instant {
+    return when (period) {
+        PERIOD_DAY -> {
+            selectedDate
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate()
+                .atStartOfDay(ZoneId.systemDefault())
+                .toInstant()
+        }
+
+        PERIOD_WEEK -> {
+            val dayOfWeek: DayOfWeek =
+                selectedDate.atZone(ZoneId.systemDefault()).toLocalDate().dayOfWeek
+            val dayOfWeekOffset: Int = dayOfWeek.value - 1
+            selectedDate
+                .atZone(ZoneId.systemDefault())
+                .minus(Period.ofDays(dayOfWeekOffset))
+                .toLocalDate()
+                .atStartOfDay(ZoneId.systemDefault())
+                .toInstant()
+        }
+
+        PERIOD_MONTH -> {
+            val dayOfMonth = selectedDate.atZone(ZoneId.systemDefault()).toLocalDate().dayOfMonth
+            val dayOfMonthOffset: Int = dayOfMonth - 1
+            selectedDate
+                .atZone(ZoneId.systemDefault())
+                .minus(Period.ofDays(dayOfMonthOffset))
+                .toLocalDate()
+                .atStartOfDay(ZoneId.systemDefault())
+                .toInstant()
+        }
+    }
+}
 
 /**
  * Formats [startTime] and [period] as follows:
+ * * Ensures startTime is at the localized start of the current period
+ * * * e.g. for week, it will always be on the Monday of the selected week
  * * Day (if useWeekday): "Sun, Aug 20" or "Mon, Aug 20, 2022"
  * * Day (if not useWeekday): "Aug 20" or "Aug 20, 2022"
  * * Week: "Aug 21-27" or "Aug 21-27, 2022"
@@ -36,41 +83,53 @@
     timeSource: TimeSource,
     useWeekday: Boolean = true,
 ): String {
+    val modifiedStartDate = getPeriodStartDate(startTime, period)
+
     if (
-        areInSameYear(startTime, Instant.ofEpochMilli(timeSource.currentTimeMillis()), timeSource)
+        areInSameYear(
+            modifiedStartDate,
+            Instant.ofEpochMilli(timeSource.currentTimeMillis()),
+            timeSource,
+        )
     ) {
         return when (period) {
             PERIOD_DAY -> {
                 if (useWeekday) {
-                    dateFormatter.formatWeekdayDateWithoutYear(startTime)
+                    dateFormatter.formatWeekdayDateWithoutYear(modifiedStartDate)
                 } else {
-                    dateFormatter.formatShortDateWithoutYear(startTime)
+                    dateFormatter.formatShortDateWithoutYear(modifiedStartDate)
                 }
             }
             PERIOD_WEEK -> {
                 dateFormatter.formatDateRangeWithoutYear(
-                    startTime,
-                    startTime.plus(Period.ofWeeks(1)),
+                    modifiedStartDate,
+                    modifiedStartDate
+                        .plus(Period.ofWeeks(1))
+                        .minusMillis(1), // to ensure we are always showing Mon-Sun
                 )
             }
             PERIOD_MONTH -> {
-                dateFormatter.formatMonthWithoutYear(startTime)
+                dateFormatter.formatMonthWithoutYear(modifiedStartDate)
             }
         }
     }
+
     return when (period) {
         PERIOD_DAY -> {
             if (useWeekday) {
-                dateFormatter.formatWeekdayDateWithYear(startTime)
+                dateFormatter.formatWeekdayDateWithYear(modifiedStartDate)
             } else {
-                dateFormatter.formatShortDateWithYear(startTime)
+                dateFormatter.formatShortDateWithYear(modifiedStartDate)
             }
         }
         PERIOD_WEEK -> {
-            dateFormatter.formatDateRangeWithYear(startTime, startTime.plus(Period.ofWeeks(1)))
+            dateFormatter.formatDateRangeWithYear(
+                modifiedStartDate,
+                modifiedStartDate.plus(Period.ofWeeks(1)).minusMillis(1),
+            )
         }
         PERIOD_MONTH -> {
-            dateFormatter.formatMonthWithYear(startTime)
+            dateFormatter.formatMonthWithYear(modifiedStartDate)
         }
     }
 }
@@ -81,3 +140,17 @@
     val year2 = instant2.atZone(timeSource.deviceZoneOffset()).toLocalDate().year
     return year1 == year2
 }
+
+/** Formats an [Instant] to a time in the local time format of the device, e.g. 13:45 or 9:25am. */
+fun formatRecentAccessTime(instant: Instant, timeSource: TimeSource, context: Context): String {
+    val localTime: LocalTime = instant.atZone(ZoneId.systemDefault()).toLocalTime()
+    return if (timeSource.is24Hour(context)) {
+        localTime.format(DateTimeFormatter.ofPattern("HH:mm"))
+    } else {
+        if (Locale.getDefault() == Locale.KOREA || Locale.getDefault() == Locale.KOREAN) {
+            localTime.format(DateTimeFormatter.ofPattern("a h:mm"))
+        } else {
+            localTime.format(DateTimeFormatter.ofPattern("h:mm a"))
+        }
+    }
+}
diff --git a/apk/src/com/android/healthconnect/controller/utils/logging/HealthConnectLogger.kt b/apk/src/com/android/healthconnect/controller/utils/logging/HealthConnectLogger.kt
index 23fdcee..4d27838 100644
--- a/apk/src/com/android/healthconnect/controller/utils/logging/HealthConnectLogger.kt
+++ b/apk/src/com/android/healthconnect/controller/utils/logging/HealthConnectLogger.kt
@@ -15,8 +15,9 @@
  */
 package com.android.healthconnect.controller.utils.logging
 
-import android.util.Log
+import androidx.annotation.VisibleForTesting
 import com.android.healthconnect.controller.HealthFitnessUiStatsLog.*
+import com.android.healthfitness.flags.Flags.personalHealthRecordUiTelemetry
 import dagger.hilt.EntryPoint
 import dagger.hilt.InstallIn
 import dagger.hilt.components.SingletonComponent
@@ -27,15 +28,37 @@
 @Singleton
 class HealthConnectLogger @Inject constructor() {
 
+    companion object {
+        private val phrElements =
+            setOf(
+                OnboardingElement.ONBOARDING_MESSAGE_WITH_PHR,
+                HomePageElement.BROWSE_HEALTH_RECORDS_BUTTON,
+                CombinedAppAccessElement.FITNESS_PERMISSIONS_BUTTON,
+                CombinedAppAccessElement.MEDICAL_PERMISSIONS_BUTTON,
+                CombinedAppAccessElement.REMOVE_ALL_PERMISSIONS_BUTTON,
+                HomePageElement.LOCK_SCREEN_BANNER,
+                HomePageElement.LOCK_SCREEN_BANNER_BUTTON,
+                HomePageElement.LOCK_SCREEN_BANNER_DISMISS_BUTTON,
+                RawFhirPageElement.RAW_FHIR_RESOURCE,
+                MedicalWritePermissionPageElement.ALLOW_WRITE_HEALTH_RECORDS_BUTTON,
+                MedicalWritePermissionPageElement.CANCEL_WRITE_HEALTH_RECORDS_BUTTON,
+            )
+    }
+
     private var pageName = PageName.UNKNOWN_PAGE
 
     /**
      * Sets the page ID which will be used for all impressions and interaction logging on this page.
      */
     fun setPageId(pageName: PageName) {
+        if (isGuardedByPhrFlag(pageName)) {
+            return
+        }
         this.pageName = pageName
     }
 
+    @VisibleForTesting fun getPageId(): PageName = pageName
+
     /** Logs the impression of a page. */
     fun logPageImpression() {
         write(HEALTH_CONNECT_UI_IMPRESSION, pageName.impressionId)
@@ -43,13 +66,30 @@
 
     /** Logs the impression of an element. */
     fun logImpression(element: ElementName) {
+        if (isGuardedByPhrFlag(element)) {
+            return
+        }
         write(HEALTH_CONNECT_UI_IMPRESSION, pageName.impressionId, element.impressionId)
     }
 
     /** Logs the interaction with an element. */
     fun logInteraction(element: ElementName, action: UIAction = UIAction.ACTION_CLICK) {
+        if (isGuardedByPhrFlag(element)) {
+            return
+        }
         write(
-            HEALTH_CONNECT_UI_INTERACTION, pageName.interactionId, element.interactionId, action.id)
+            HEALTH_CONNECT_UI_INTERACTION,
+            pageName.interactionId,
+            element.interactionId,
+            action.id,
+        )
+    }
+
+    private fun isGuardedByPhrFlag(pageName: PageName) =
+        pageName.isPhrPage() && !personalHealthRecordUiTelemetry()
+
+    private fun isGuardedByPhrFlag(elementName: ElementName): Boolean {
+        return phrElements.contains(elementName) && !personalHealthRecordUiTelemetry()
     }
 }
 
@@ -58,138 +98,237 @@
     ACTION_CLICK(HEALTH_CONNECT_UI_INTERACTION__ACTION__ACTION_CLICK),
     ACTION_TOGGLE_ON(HEALTH_CONNECT_UI_INTERACTION__ACTION__ACTION_TOGGLE_ON),
     ACTION_TOGGLE_OFF(HEALTH_CONNECT_UI_INTERACTION__ACTION__ACTION_TOGGLE_OFF),
-    ACTION_UNKNOWN(HEALTH_CONNECT_UI_INTERACTION__ACTION__ACTION_UNKNOWN)
+    ACTION_UNKNOWN(HEALTH_CONNECT_UI_INTERACTION__ACTION__ACTION_UNKNOWN),
 }
 
 /** Enum class for PageName. Each loggable fragment in the application should define a page name. */
 enum class PageName(val impressionId: Int, val interactionId: Int) {
     HOME_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__HOME_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__HOME_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__HOME_PAGE,
+    ),
     ONBOARDING_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__ONBOARDING_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__ONBOARDING_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__ONBOARDING_PAGE,
+    ),
     RECENT_ACCESS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__RECENT_ACCESS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__RECENT_ACCESS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__RECENT_ACCESS_PAGE,
+    ),
     APP_PERMISSIONS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__APP_PERMISSIONS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_PERMISSIONS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_PERMISSIONS_PAGE,
+    ),
     // TODO (b/270965648) not needed
     APP_PERMISSIONS_EMPTY_STATE_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__APP_PERMISSIONS_EMPTY_STATE_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_PERMISSIONS_EMPTY_STATE_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_PERMISSIONS_EMPTY_STATE_PAGE,
+    ),
     HELP_AND_FEEDBACK_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__HELP_AND_FEEDBACK_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__HELP_AND_FEEDBACK_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__HELP_AND_FEEDBACK_PAGE,
+    ),
     CATEGORIES_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__CATEGORIES_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__CATEGORIES_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__CATEGORIES_PAGE,
+    ),
     AUTO_DELETE_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__AUTO_DELETE_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__AUTO_DELETE_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__AUTO_DELETE_PAGE,
+    ),
     PERMISSION_TYPES_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__PERMISSION_TYPES_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__PERMISSION_TYPES_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__PERMISSION_TYPES_PAGE,
+    ),
     DATA_ACCESS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__DATA_ACCESS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__DATA_ACCESS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__DATA_ACCESS_PAGE,
+    ),
     DATA_ENTRIES_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__DATA_ENTRIES_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__DATA_ENTRIES_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__DATA_ENTRIES_PAGE,
+    ),
     ENTRY_DETAILS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__ENTRY_DETAILS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__ENTRY_DETAILS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__ENTRY_DETAILS_PAGE,
+    ),
     APP_ACCESS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__APP_ACCESS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_ACCESS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_ACCESS_PAGE,
+    ),
     UNITS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__UNITS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__UNITS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__UNITS_PAGE,
+    ),
     ALL_CATEGORIES_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__ALL_CATEGORIES_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__ALL_CATEGORIES_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__ALL_CATEGORIES_PAGE,
+    ),
     REQUEST_PERMISSIONS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__REQUEST_PERMISSIONS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_PERMISSIONS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_PERMISSIONS_PAGE,
+    ),
     REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE,
+    ),
     REQUEST_BACKGROUND_READ_PERMISSION_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__REQUEST_BACKGROUND_READ_PERMISSION_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_BACKGROUND_READ_PERMISSION_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_BACKGROUND_READ_PERMISSION_PAGE,
+    ),
     REQUEST_HISTORY_READ_PERMISSION_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__REQUEST_HISTORY_READ_PERMISSION_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_HISTORY_READ_PERMISSION_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_HISTORY_READ_PERMISSION_PAGE,
+    ),
     MANAGE_PERMISSIONS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__MANAGE_PERMISSIONS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__MANAGE_PERMISSIONS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__MANAGE_PERMISSIONS_PAGE,
+    ),
     SETTINGS_MANAGE_PERMISSIONS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__SETTINGS_MANAGE_PERMISSIONS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__SETTINGS_MANAGE_PERMISSIONS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__SETTINGS_MANAGE_PERMISSIONS_PAGE,
+    ),
     MIGRATION_IN_PROGRESS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__MIGRATION_IN_PROGRESS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__MIGRATION_IN_PROGRESS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__MIGRATION_IN_PROGRESS_PAGE,
+    ),
     MIGRATION_APP_UPDATE_NEEDED_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__MIGRATION_APP_UPDATE_NEEDED_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__MIGRATION_APP_UPDATE_NEEDED_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__MIGRATION_APP_UPDATE_NEEDED_PAGE,
+    ),
     MIGRATION_MODULE_UPDATE_NEEDED_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__MIGRATION_MODULE_UPDATE_NEEDED_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__MIGRATION_MODULE_UPDATE_NEEDED_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__MIGRATION_MODULE_UPDATE_NEEDED_PAGE,
+    ),
     MIGRATION_PAUSED_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__MIGRATION_PAUSED_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__MIGRATION_PAUSED_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__MIGRATION_PAUSED_PAGE,
+    ),
     MANAGE_DATA_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__MANAGE_DATA_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__MANAGE_DATA_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__MANAGE_DATA_PAGE,
+    ),
     DATA_SOURCES_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__DATA_SOURCES_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__DATA_SOURCES_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__DATA_SOURCES_PAGE,
+    ),
     ADD_AN_APP_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__ADD_AN_APP_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__ADD_AN_APP_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__ADD_AN_APP_PAGE,
+    ),
     ADDITIONAL_ACCESS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__ADDITIONAL_ACCESS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__ADDITIONAL_ACCESS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__ADDITIONAL_ACCESS_PAGE,
+    ),
     DATA_RESTORE_IN_PROGRESS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__DATA_RESTORE_IN_PROGRESS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__DATA_RESTORE_IN_PROGRESS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__DATA_RESTORE_IN_PROGRESS_PAGE,
+    ),
     SEARCH_APPS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__SEARCH_APPS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__SEARCH_APPS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__SEARCH_APPS_PAGE,
+    ),
     BACKUP_AND_RESTORE_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__BACKUP_AND_RESTORE_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__BACKUP_AND_RESTORE_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__BACKUP_AND_RESTORE_PAGE,
+    ),
     EXPORT_FREQUENCY_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__EXPORT_FREQUENCY_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__EXPORT_FREQUENCY_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__EXPORT_FREQUENCY_PAGE,
+    ),
     EXPORT_DESTINATION_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__EXPORT_DESTINATION_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__EXPORT_DESTINATION_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__EXPORT_DESTINATION_PAGE,
+    ),
     IMPORT_SOURCE_LOCATION_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__IMPORT_SOURCE_LOCATION_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__IMPORT_SOURCE_LOCATION_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__IMPORT_SOURCE_LOCATION_PAGE,
+    ),
     EXPORT_SETTINGS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__EXPORT_SETTINGS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__EXPORT_SETTINGS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__EXPORT_SETTINGS_PAGE,
+    ),
     ALL_DATA_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__ALL_DATA_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__ALL_DATA_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__ALL_DATA_PAGE,
+    ),
     TAB_ENTRIES_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__TAB_ENTRIES_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__TAB_ENTRIES_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__TAB_ENTRIES_PAGE,
+    ),
     TAB_ACCESS_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__TAB_ACCESS_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__TAB_ACCESS_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__TAB_ACCESS_PAGE,
+    ),
     APP_DATA_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__APP_DATA_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_DATA_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_DATA_PAGE,
+    ),
     APP_ENTRIES_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__APP_ENTRIES_PAGE,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_ENTRIES_PAGE),
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__APP_ENTRIES_PAGE,
+    ),
+    ALL_MEDICAL_DATA_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__ALL_MEDICAL_DATA_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__ALL_MEDICAL_DATA_PAGE,
+    ),
+    TAB_MEDICAL_ENTRIES_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__TAB_MEDICAL_ENTRIES_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__TAB_MEDICAL_ENTRIES_PAGE,
+    ),
+    TAB_MEDICAL_ACCESS_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__TAB_MEDICAL_ACCESS_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__TAB_MEDICAL_ACCESS_PAGE,
+    ),
+    RAW_FHIR_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__RAW_FHIR_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__RAW_FHIR_PAGE,
+    ),
+    REQUEST_MEDICAL_PERMISSIONS_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__REQUEST_MEDICAL_PERMISSIONS_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_MEDICAL_PERMISSIONS_PAGE,
+    ),
+    COMBINED_APP_ACCESS_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__COMBINED_APP_ACCESS_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__COMBINED_APP_ACCESS_PAGE,
+    ),
+    MEDICAL_APP_ACCESS_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__MEDICAL_APP_ACCESS_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__MEDICAL_APP_ACCESS_PAGE,
+    ),
+    SETTINGS_MANAGE_COMBINED_APP_PERMISSIONS_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__SETTINGS_MANAGE_COMBINED_APP_PERMISSIONS_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__SETTINGS_MANAGE_COMBINED_APP_PERMISSIONS_PAGE,
+    ),
+    SETTINGS_MANAGE_MEDICAL_APP_PERMISSIONS_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__SETTINGS_MANAGE_MEDICAL_APP_PERMISSIONS_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__SETTINGS_MANAGE_MEDICAL_APP_PERMISSIONS_PAGE,
+    ),
+    REQUEST_WRITE_MEDICAL_PERMISSION_PAGE(
+        HEALTH_CONNECT_UI_IMPRESSION__PAGE__REQUEST_WRITE_MEDICAL_PERMISSION_PAGE,
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__REQUEST_WRITE_MEDICAL_PERMISSION_PAGE,
+    ),
     UNKNOWN_PAGE(
         HEALTH_CONNECT_UI_IMPRESSION__PAGE__PAGE_UNKNOWN,
-        HEALTH_CONNECT_UI_INTERACTION__PAGE__PAGE_UNKNOWN)
+        HEALTH_CONNECT_UI_INTERACTION__PAGE__PAGE_UNKNOWN,
+    );
+
+    fun isPhrPage(): Boolean {
+        val phrPages =
+            setOf(
+                ALL_MEDICAL_DATA_PAGE,
+                TAB_MEDICAL_ENTRIES_PAGE,
+                TAB_MEDICAL_ACCESS_PAGE,
+                RAW_FHIR_PAGE,
+                REQUEST_MEDICAL_PERMISSIONS_PAGE,
+                COMBINED_APP_ACCESS_PAGE,
+                MEDICAL_APP_ACCESS_PAGE,
+                SETTINGS_MANAGE_COMBINED_APP_PERMISSIONS_PAGE,
+                SETTINGS_MANAGE_MEDICAL_APP_PERMISSIONS_PAGE,
+                REQUEST_WRITE_MEDICAL_PERMISSION_PAGE,
+            )
+        return phrPages.contains(this)
+    }
 }
 
 /** Common interface for loggable elements. */
@@ -203,25 +342,48 @@
     ElementName {
     APP_PERMISSIONS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__APP_PERMISSIONS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__APP_PERMISSIONS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__APP_PERMISSIONS_BUTTON,
+    ),
     DATA_AND_ACCESS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_AND_ACCESS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_AND_ACCESS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_AND_ACCESS_BUTTON,
+    ),
     SEE_ALL_RECENT_ACCESS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SEE_ALL_RECENT_ACCESS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_ALL_RECENT_ACCESS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_ALL_RECENT_ACCESS_BUTTON,
+    ),
     MANAGE_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MANAGE_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MANAGE_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MANAGE_DATA_BUTTON,
+    ),
     EXPORT_ERROR_BANNER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_ERROR_BANNER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_ERROR_BANNER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_ERROR_BANNER,
+    ),
     EXPORT_ERROR_BANNER_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_ERROR_BANNER_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_ERROR_BANNER_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_ERROR_BANNER_BUTTON,
+    ),
     BROWSE_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__BROWSE_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BROWSE_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BROWSE_DATA_BUTTON,
+    ),
+    BROWSE_HEALTH_RECORDS_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__BROWSE_HEALTH_RECORDS_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BROWSE_HEALTH_RECORDS_BUTTON,
+    ),
+    LOCK_SCREEN_BANNER(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__LOCK_SCREEN_BANNER,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__LOCK_SCREEN_BANNER,
+    ),
+    LOCK_SCREEN_BANNER_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__LOCK_SCREEN_BANNER_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__LOCK_SCREEN_BANNER_BUTTON,
+    ),
+    LOCK_SCREEN_BANNER_DISMISS_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__LOCK_SCREEN_BANNER_DISMISS_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__LOCK_SCREEN_BANNER_DISMISS_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Onboarding page. */
@@ -229,10 +391,16 @@
     ElementName {
     ONBOARDING_COMPLETED_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ONBOARDING_COMPLETED_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ONBOARDING_COMPLETED_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ONBOARDING_COMPLETED_BUTTON,
+    ),
     ONBOARDING_GO_BACK_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ONBOARDING_GO_BACK_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ONBOARDING_GO_BACK_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ONBOARDING_GO_BACK_BUTTON,
+    ),
+    ONBOARDING_MESSAGE_WITH_PHR(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ONBOARDING_MESSAGE_WITH_PHR,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ONBOARDING_MESSAGE_WITH_PHR,
+    ),
 }
 
 /** Loggable elements in the Recent Access page. */
@@ -240,10 +408,12 @@
     ElementName {
     RECENT_ACCESS_ENTRY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__RECENT_ACCESS_ENTRY,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__RECENT_ACCESS_ENTRY),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__RECENT_ACCESS_ENTRY,
+    ),
     MANAGE_PERMISSIONS_FAB(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MANAGE_PERMISSIONS_FLOATING_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MANAGE_PERMISSIONS_FLOATING_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MANAGE_PERMISSIONS_FLOATING_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Manage Data page. */
@@ -251,19 +421,24 @@
     ElementName {
     AUTO_DELETE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_BUTTON,
+    ),
     BACKUP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__BACKUP_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BACKUP_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BACKUP_DATA_BUTTON,
+    ),
     DATA_SOURCES_AND_PRIORITY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_SOURCES_AND_PRIORITY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_SOURCES_AND_PRIORITY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_SOURCES_AND_PRIORITY_BUTTON,
+    ),
     SET_UNITS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SET_UNITS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SET_UNITS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SET_UNITS_BUTTON,
+    ),
     BACKUP_AND_RESTORE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__BACKUP_AND_RESTORE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BACKUP_AND_RESTORE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BACKUP_AND_RESTORE_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Category and All categories pages. */
@@ -271,13 +446,16 @@
     ElementName {
     CATEGORY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CATEGORY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CATEGORY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CATEGORY_BUTTON,
+    ),
     SEE_ALL_CATEGORIES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SEE_ALL_CATEGORIES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_ALL_CATEGORIES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_ALL_CATEGORIES_BUTTON,
+    ),
     DELETE_ALL_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETE_ALL_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_ALL_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_ALL_DATA_BUTTON,
+    ),
 }
 
 /** Loggable elements in the App Permissions and Settings App Permission pages. */
@@ -285,37 +463,48 @@
     ElementName {
     SEARCH_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SEARCH_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEARCH_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEARCH_BUTTON,
+    ),
     CONNECTED_APP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CONNECTED_APP_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CONNECTED_APP_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CONNECTED_APP_BUTTON,
+    ),
     NOT_CONNECTED_APP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__NOT_CONNECTED_APP_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__NOT_CONNECTED_APP_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__NOT_CONNECTED_APP_BUTTON,
+    ),
     INACTIVE_APP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__INACTIVE_APP_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__INACTIVE_APP_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__INACTIVE_APP_BUTTON,
+    ),
     INACTIVE_APP_DELETE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__INACTIVE_APP_DELETE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__INACTIVE_APP_DELETE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__INACTIVE_APP_DELETE_BUTTON,
+    ),
     NEEDS_UPDATE_APP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_APP_BUTTON,
-        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_APP_BUTTON),
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_APP_BUTTON,
+    ),
     REMOVE_ALL_APPS_PERMISSIONS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__REMOVE_ALL_APPS_PERMISSIONS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REMOVE_ALL_APPS_PERMISSIONS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REMOVE_ALL_APPS_PERMISSIONS_BUTTON,
+    ),
     HELP_AND_FEEDBACK_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__HELP_AND_FEEDBACK_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__HELP_AND_FEEDBACK_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__HELP_AND_FEEDBACK_BUTTON,
+    ),
     CHECK_FOR_UPDATES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CHECK_FOR_UPDATES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHECK_FOR_UPDATES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHECK_FOR_UPDATES_BUTTON,
+    ),
     SEE_ALL_COMPATIBLE_APPS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SEE_ALL_COMPATIBLE_APPS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_ALL_COMPATIBLE_APPS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_ALL_COMPATIBLE_APPS_BUTTON,
+    ),
     SEND_FEEDBACK_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SEND_FEEDBACK_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEND_FEEDBACK_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEND_FEEDBACK_BUTTON,
+    ),
 }
 
 /** Loggable elements in the App Access page. */
@@ -323,28 +512,36 @@
     ElementName {
     ALLOW_ALL_PERMISSIONS_SWITCH_ACTIVE(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_ALL_PERMISSIONS_SWITCH_ACTIVE,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_ALL_PERMISSIONS_SWITCH_ACTIVE),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_ALL_PERMISSIONS_SWITCH_ACTIVE,
+    ),
     ALLOW_ALL_PERMISSIONS_SWITCH_INACTIVE(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_ALL_PERMISSIONS_SWITCH_INACTIVE,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_ALL_PERMISSIONS_SWITCH_INACTIVE),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_ALL_PERMISSIONS_SWITCH_INACTIVE,
+    ),
     PERMISSION_SWITCH_ACTIVE(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PERMISSION_SWITCH_ACTIVE,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_SWITCH_ACTIVE),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_SWITCH_ACTIVE,
+    ),
     PERMISSION_SWITCH_INACTIVE(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PERMISSION_SWITCH_INACTIVE,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_SWITCH_INACTIVE),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_SWITCH_INACTIVE,
+    ),
     DELETE_APP_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETE_APP_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_APP_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_APP_DATA_BUTTON,
+    ),
     PRIVACY_POLICY_LINK(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PRIVACY_POLICY_LINK,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PRIVACY_POLICY_LINK),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PRIVACY_POLICY_LINK,
+    ),
     ADDITIONAL_ACCESS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ADDITIONAL_ACCESS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ADDITIONAL_ACCESS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ADDITIONAL_ACCESS_BUTTON,
+    ),
     SEE_APP_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SEE_APP_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_APP_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_APP_DATA_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Permission types page. */
@@ -352,16 +549,20 @@
     ElementName {
     APP_FILTER_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__APP_FILTER_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__APP_FILTER_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__APP_FILTER_BUTTON,
+    ),
     PERMISSION_TYPE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PERMISSION_TYPE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_TYPE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_TYPE_BUTTON,
+    ),
     DELETE_CATEGORY_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETE_CATEGORY_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_CATEGORY_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_CATEGORY_DATA_BUTTON,
+    ),
     DATA_SOURCES_AND_PRIORITY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_SOURCES_AND_PRIORITY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_SOURCES_AND_PRIORITY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_SOURCES_AND_PRIORITY_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Data access page. */
@@ -369,16 +570,20 @@
     ElementName {
     DATA_ACCESS_APP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_ACCESS_APP_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_ACCESS_APP_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_ACCESS_APP_BUTTON,
+    ),
     DATA_ACCESS_INACTIVE_APP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_ACCESS_INACTIVE_APP_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_ACCESS_INACTIVE_APP_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_ACCESS_INACTIVE_APP_BUTTON,
+    ),
     SEE_ALL_ENTRIES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SEE_ALL_ENTRIES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_ALL_ENTRIES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SEE_ALL_ENTRIES_BUTTON,
+    ),
     DELETE_THIS_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETE_THIS_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_THIS_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_THIS_DATA_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Data entries page. */
@@ -386,34 +591,44 @@
     ElementName {
     AGGREGATION_DATA_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AGGREGATION_DATA_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AGGREGATION_DATA_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AGGREGATION_DATA_VIEW,
+    ),
     DATA_ENTRY_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_ENTRY_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_ENTRY_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_ENTRY_VIEW,
+    ),
     DATA_ENTRY_DELETE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_ENTRY_DELETE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_ENTRY_DELETE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_ENTRY_DELETE_BUTTON,
+    ),
     EXERCISE_SESSION_ENTRY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_SESSION_ENTRY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_SESSION_ENTRY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_SESSION_ENTRY_BUTTON,
+    ),
     EXERCISE_SESSION_MAP_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_SESSION_MAP_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_SESSION_MAP_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_SESSION_MAP_VIEW,
+    ),
     SLEEP_SESSION_ENTRY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SLEEP_SESSION_ENTRY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SLEEP_SESSION_ENTRY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SLEEP_SESSION_ENTRY_BUTTON,
+    ),
     NEXT_DAY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__NEXT_DAY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__NEXT_DAY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__NEXT_DAY_BUTTON,
+    ),
     PREVIOUS_DAY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PREVIOUS_DAY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PREVIOUS_DAY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PREVIOUS_DAY_BUTTON,
+    ),
     SELECT_DATE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SELECT_DATE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SELECT_DATE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SELECT_DATE_BUTTON,
+    ),
     PLANNED_EXERCISE_SESSION_ENTRY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PLANNED_EXERCISE_SESSION_ENTRY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PLANNED_EXERCISE_SESSION_ENTRY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PLANNED_EXERCISE_SESSION_ENTRY_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Entry details page. */
@@ -421,28 +636,36 @@
     ElementName {
     SESSION_DETAIL_ENTRY_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SESSION_DETAIL_ENTRY_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SESSION_DETAIL_ENTRY_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SESSION_DETAIL_ENTRY_VIEW,
+    ),
     SESSION_DETAIL_HEADER_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SESSION_DETAIL_HEADER_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SESSION_DETAIL_HEADER_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SESSION_DETAIL_HEADER_VIEW,
+    ),
     REVERSE_SESSION_DETAIL_ENTRY_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__REVERSE_SESSION_DETAIL_ENTRY_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REVERSE_SESSION_DETAIL_ENTRY_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REVERSE_SESSION_DETAIL_ENTRY_VIEW,
+    ),
     FORMATTED_SECTION_TITLE_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__FORMATTED_SECTION_TITLE_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FORMATTED_SECTION_TITLE_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FORMATTED_SECTION_TITLE_VIEW,
+    ),
     FORMATTED_SECTION_CONTENT_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__FORMATTED_SECTION_CONTENT_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FORMATTED_SECTION_CONTENT_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FORMATTED_SECTION_CONTENT_VIEW,
+    ),
     PLANNED_EXERCISE_BLOCK_ENTRY_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PLANNED_EXERCISE_BLOCK_ENTRY_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PLANNED_EXERCISE_BLOCK_ENTRY_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PLANNED_EXERCISE_BLOCK_ENTRY_VIEW,
+    ),
     PLANNED_EXERCISE_STEP_ENTRY_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PLANNED_EXERCISE_STEP_ENTRY_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PLANNED_EXERCISE_STEP_ENTRY_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PLANNED_EXERCISE_STEP_ENTRY_VIEW,
+    ),
     EXERCISE_PERFORMANCE_GOAL_ENTRY_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_PERFORMANCE_GOAL_ENTRY_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_PERFORMANCE_GOAL_ENTRY_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_PERFORMANCE_GOAL_ENTRY_VIEW,
+    ),
 }
 
 /** Loggable elements in the Units page. */
@@ -451,63 +674,81 @@
     // Units
     CHANGE_UNITS_HEIGHT_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CHANGE_UNITS_HEIGHT_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_HEIGHT_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_HEIGHT_BUTTON,
+    ),
     CHANGE_UNITS_WEIGHT_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CHANGE_UNITS_WEIGHT_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_WEIGHT_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_WEIGHT_BUTTON,
+    ),
     CHANGE_UNITS_DISTANCE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CHANGE_UNITS_DISTANCE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_DISTANCE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_DISTANCE_BUTTON,
+    ),
     CHANGE_UNITS_ENERGY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CHANGE_UNITS_ENERGY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_ENERGY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_ENERGY_BUTTON,
+    ),
     CHANGE_UNITS_TEMPERATURE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CHANGE_UNITS_TEMPERATURE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_TEMPERATURE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CHANGE_UNITS_TEMPERATURE_BUTTON,
+    ),
     CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_BUTTON,
+    ),
     // Height
     CENTIMETERS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CENTIMETERS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CENTIMETERS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CENTIMETERS_BUTTON,
+    ),
     FEET_AND_INCHES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__FEET_AND_INCHES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FEET_AND_INCHES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FEET_AND_INCHES_BUTTON,
+    ),
     // Weight
     KILOGRAMS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__KILOGRAMS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__KILOGRAMS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__KILOGRAMS_BUTTON,
+    ),
     POUNDS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__POUNDS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__POUNDS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__POUNDS_BUTTON,
+    ),
     STONES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__STONES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__STONES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__STONES_BUTTON,
+    ),
     // Distance
     KILOMETERS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__KILOMETERS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__KILOMETERS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__KILOMETERS_BUTTON,
+    ),
     MILES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MILES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MILES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MILES_BUTTON,
+    ),
     // Energy
     CALORIES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CALORIES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CALORIES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CALORIES_BUTTON,
+    ),
     KILOJOULES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__KILOJOULES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__KILOJOULES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__KILOJOULES_BUTTON,
+    ),
     // Temperature
     CELSIUS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CELSIUS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CELSIUS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CELSIUS_BUTTON,
+    ),
     FAHRENHEIT_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__FAHRENHEIT_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FAHRENHEIT_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FAHRENHEIT_BUTTON,
+    ),
     KELVIN_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__KELVIN_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__KELVIN_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__KELVIN_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Auto delete page. */
@@ -515,92 +756,112 @@
     ElementName {
     AUTO_DELETE_3_MONTHS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_THREE_MONTHS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_THREE_MONTHS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_THREE_MONTHS_BUTTON,
+    ),
     AUTO_DELETE_18_MONTHS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_EIGHTEEN_MONTHS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_EIGHTEEN_MONTHS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_EIGHTEEN_MONTHS_BUTTON,
+    ),
     AUTO_DELETE_NEVER_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_NEVER_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_NEVER_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_NEVER_BUTTON,
+    ),
 
     // Auto-delete dialog
     AUTO_DELETE_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_DIALOG_CONTAINER,
+    ),
     AUTO_DELETE_DIALOG_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_DIALOG_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_DIALOG_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_DIALOG_CANCEL_BUTTON,
+    ),
     AUTO_DELETE_DIALOG_CONFIRM_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_DIALOG_CONFIRM_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_DIALOG_CONFIRM_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_DIALOG_CONFIRM_BUTTON,
+    ),
     AUTO_DELETE_CONFIRMATION_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_CONFIRMATION_DIALOG_CONTAINER,
         HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_CONFIRMATION_DIALOG_CONTAINER,
     ),
     AUTO_DELETE_CONFIRMATION_DIALOG_DONE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__AUTO_DELETE_CONFIRMATION_DIALOG_DONE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_CONFIRMATION_DIALOG_DONE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__AUTO_DELETE_CONFIRMATION_DIALOG_DONE_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Disconnect app dialog. */
 enum class DisconnectAppDialogElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     DISCONNECT_APP_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISCONNECT_APP_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_APP_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_APP_DIALOG_CONTAINER,
+    ),
     DISCONNECT_APP_DIALOG_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISCONNECT_APP_DIALOG_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_APP_DIALOG_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_APP_DIALOG_CANCEL_BUTTON,
+    ),
     DISCONNECT_APP_DIALOG_CONFIRM_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISCONNECT_APP_DIALOG_CONFIRM_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_APP_DIALOG_CONFIRM_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_APP_DIALOG_CONFIRM_BUTTON,
+    ),
     DISCONNECT_APP_DIALOG_DELETE_CHECKBOX(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISCONNECT_APP_DIALOG_DELETE_CHECKBOX,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_APP_DIALOG_DELETE_CHECKBOX),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_APP_DIALOG_DELETE_CHECKBOX,
+    ),
 }
 
 /** Loggable elements in the Disconnect all apps dialog. */
 enum class DisconnectAllAppsDialogElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     DISCONNECT_ALL_APPS_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_CONTAINER,
+    ),
     DISCONNECT_ALL_APPS_DIALOG_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_CANCEL_BUTTON,
+    ),
     DISCONNECT_ALL_APPS_DIALOG_REMOVE_ALL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_REMOVE_ALL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_REMOVE_ALL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISCONNECT_ALL_APPS_DIALOG_REMOVE_ALL_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Deletion dialog time range picker dialog. */
 enum class DeletionDialogTimeRangeElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     // Deletion time range dialog
     DELETION_DIALOG_TIME_RANGE_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_TIME_RANGE_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_CONTAINER,
+    ),
     DELETION_DIALOG_TIME_RANGE_LAST_24_HOURS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_24_HOURS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_24_HOURS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_24_HOURS_BUTTON,
+    ),
     DELETION_DIALOG_TIME_RANGE_LAST_7_DAYS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_7_DAYS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_7_DAYS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_7_DAYS_BUTTON,
+    ),
     DELETION_DIALOG_TIME_RANGE_LAST_30_DAYS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_30_DAYS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_30_DAYS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_LAST_30_DAYS_BUTTON,
+    ),
     DELETION_DIALOG_TIME_RANGE_ALL_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_TIME_RANGE_ALL_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_ALL_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_ALL_DATA_BUTTON,
+    ),
     DELETION_DIALOG_TIME_RANGE_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_TIME_RANGE_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_CANCEL_BUTTON,
+    ),
     DELETION_DIALOG_TIME_RANGE_NEXT_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_TIME_RANGE_NEXT_BUTTON,
         HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_TIME_RANGE_NEXT_BUTTON,
@@ -610,23 +871,28 @@
 /** Loggable elements in the Deletion dialog confirmation dialog. */
 enum class DeletionDialogConfirmationElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     DELETION_DIALOG_CONFIRMATION_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_CONFIRMATION_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_CONTAINER,
+    ),
     DELETION_DIALOG_CONFIRMATION_GO_BACK_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_CONFIRMATION_GO_BACK_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_GO_BACK_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_GO_BACK_BUTTON,
+    ),
     DELETION_DIALOG_CONFIRMATION_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_CONFIRMATION_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_CANCEL_BUTTON,
+    ),
     DELETION_DIALOG_CONFIRMATION_DELETE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_CONFIRMATION_DELETE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_DELETE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_DELETE_BUTTON,
+    ),
     DELETION_DIALOG_CONFIRMATION_REMOVE_APP_PERMISSIONS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_CONFIRMATION_REMOVE_APP_PERMISSIONS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_REMOVE_APP_PERMISSIONS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_CONFIRMATION_REMOVE_APP_PERMISSIONS_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Progress dialog. */
@@ -634,7 +900,8 @@
     ElementName {
     DELETION_DIALOG_IN_PROGRESS_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_IN_PROGRESS_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_IN_PROGRESS_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_IN_PROGRESS_CONTAINER,
+    )
 }
 
 /** Loggable elements in the Success dialog. */
@@ -642,13 +909,16 @@
     ElementName {
     DELETION_DIALOG_SUCCESS_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_SUCCESS_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_SUCCESS_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_SUCCESS_CONTAINER,
+    ),
     DELETION_DIALOG_SUCCESS_DONE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_SUCCESS_DONE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_SUCCESS_DONE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_SUCCESS_DONE_BUTTON,
+    ),
     DELETION_DIALOG_SUCCESS_SEE_CONNECTED_APPS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SUCCESS_DELETION_DIALOG_SEE_CONNECTED_APPS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SUCCESS_DELETION_DIALOG_SEE_CONNECTED_APPS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SUCCESS_DELETION_DIALOG_SEE_CONNECTED_APPS_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Failed dialog. */
@@ -656,13 +926,16 @@
     ElementName {
     DELETION_DIALOG_ERROR_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_ERROR_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_ERROR_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_ERROR_CONTAINER,
+    ),
     DELETION_DIALOG_ERROR_CLOSE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_ERROR_CLOSE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_ERROR_CLOSE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_ERROR_CLOSE_BUTTON,
+    ),
     DELETION_DIALOG_ERROR_TRY_AGAIN_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETION_DIALOG_ERROR_TRY_AGAIN_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_ERROR_TRY_AGAIN_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETION_DIALOG_ERROR_TRY_AGAIN_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Request and Manage permissions pages. */
@@ -670,109 +943,135 @@
     ElementName {
     ALLOW_PERMISSIONS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_PERMISSIONS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_PERMISSIONS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_PERMISSIONS_BUTTON,
+    ),
     CANCEL_PERMISSIONS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CANCEL_PERMISSIONS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_PERMISSIONS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_PERMISSIONS_BUTTON,
+    ),
     ALLOW_ALL_SWITCH(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_ALL_SWITCH,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_ALL_SWITCH),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_ALL_SWITCH,
+    ),
     PERMISSION_SWITCH(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PERMISSION_SWITCH,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_SWITCH),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_SWITCH,
+    ),
     APP_RATIONALE_LINK(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__APP_RATIONALE_LINK,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__APP_RATIONALE_LINK),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__APP_RATIONALE_LINK,
+    ),
 }
 
 /** Loggable elements in the Request Combined Additional Permissions page. */
 enum class RequestCombinedAdditionalPermissionsElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON,
+    ),
     CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON,
+    ),
     BACKGROUND_READ_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__BACKGROUND_READ_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BACKGROUND_READ_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BACKGROUND_READ_BUTTON,
+    ),
     HISTORY_READ_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__HISTORY_READ_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__HISTORY_READ_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__HISTORY_READ_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Request Background Read permission page. */
 enum class RequestBackgroundReadPermissionElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     ALLOW_BACKGROUND_READ_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_BACKGROUND_READ_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_BACKGROUND_READ_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_BACKGROUND_READ_BUTTON,
+    ),
     CANCEL_BACKGROUND_READ_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CANCEL_BACKGROUND_READ_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_BACKGROUND_READ_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_BACKGROUND_READ_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Request History Read permission page. */
 enum class RequestHistoryReadPermissionElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     ALLOW_HISTORY_READ_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_HISTORY_READ_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_HISTORY_READ_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_HISTORY_READ_BUTTON,
+    ),
     CANCEL_HISTORY_READ_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CANCEL_HISTORY_READ_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_HISTORY_READ_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_HISTORY_READ_BUTTON,
+    ),
 }
 
 enum class AdditionalAccessElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     EXERCISE_ROUTES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTES_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_BUTTON,
+    ),
     HISTORY_READ_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_HISTORY_READ_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_HISTORY_READ_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_HISTORY_READ_BUTTON,
+    ),
     BACKGROUND_READ_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__BACKGROUND_READ_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BACKGROUND_READ_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__BACKGROUND_READ_BUTTON,
+    ),
     EXERCISE_ROUTES_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTES_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_DIALOG_CONTAINER,
+    ),
     EXERCISE_ROUTES_ALLOW_ALL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTES_DIALOG_ALLOW_ALL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_DIALOG_ALLOW_ALL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_DIALOG_ALLOW_ALL_BUTTON,
+    ),
     EXERCISE_ROUTES_ASK_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTES_DIALOG_ASK_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_DIALOG_ASK_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_DIALOG_ASK_BUTTON,
+    ),
     EXERCISE_ROUTES_DIALOG_DENY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTES_DIALOG_DENY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_DIALOG_DENY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTES_DIALOG_DENY_BUTTON,
+    ),
     ENABLE_EXERCISE_PERMISSION_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_CONTAINER,
+    ),
     ENABLE_EXERCISE_PERMISSION_DIALOG_POSITIVE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_POSITIVE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_POSITIVE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_POSITIVE_BUTTON,
+    ),
     ENABLE_EXERCISE_PERMISSION_DIALOG_NEGATIVE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_NEGATIVE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_NEGATIVE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENABLE_EXERCISE_PERMISSION_DIALOG_NEGATIVE_BUTTON,
+    ),
     DISABLE_EXERCISE_PERMISSION_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_CONTAINER,
+    ),
     DISABLE_EXERCISE_PERMISSION_DIALOG_POSITIVE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_POSITIVE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_POSITIVE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_POSITIVE_BUTTON,
+    ),
     DISABLE_EXERCISE_PERMISSION_DIALOG_NEGATIVE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_NEGATIVE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_NEGATIVE_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DISABLE_EXERCISE_PERMISSION_DIALOG_NEGATIVE_BUTTON,
+    ),
 }
 
 /** Loggable elements in the toolbar. */
@@ -781,30 +1080,38 @@
     // Represents main menu
     TOOLBAR_SETTINGS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__TOOLBAR_SETTINGS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__TOOLBAR_SETTINGS_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__TOOLBAR_SETTINGS_BUTTON,
+    ),
     TOOLBAR_HELP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__TOOLBAR_HELP_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__TOOLBAR_HELP_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__TOOLBAR_HELP_BUTTON,
+    ),
     // TODO update
     TOOLBAR_UNITS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_BUTTON,
+    ),
     // TODO not sure if this will be needed
     TOOLBAR_OPEN_SOURCE_LICENSE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__TOOLBAR_OPEN_SOURCE_LICENSE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__TOOLBAR_OPEN_SOURCE_LICENSE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__TOOLBAR_OPEN_SOURCE_LICENSE_BUTTON,
+    ),
     TOOLBAR_DATA_SOURCES_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_SOURCES_MENU_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_SOURCES_MENU_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_SOURCES_MENU_BUTTON,
+    ),
     TOOLBAR_ENTER_DELETION_STATE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ENTER_DELETION_STATE_MENU_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENTER_DELETION_STATE_MENU_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENTER_DELETION_STATE_MENU_BUTTON,
+    ),
     TOOLBAR_EXIT_DELETION_STATE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXIT_DELETION_STATE_MENU_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXIT_DELETION_STATE_MENU_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXIT_DELETION_STATE_MENU_BUTTON,
+    ),
     TOOLBAR_DELETE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DELETE_MENU_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_MENU_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DELETE_MENU_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Entry details page. */
@@ -812,74 +1119,96 @@
     ElementName {
     MIGRATION_UPDATE_NEEDED_UPDATE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_UPDATE_NEEDED_UPDATE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_UPDATE_NEEDED_UPDATE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_UPDATE_NEEDED_UPDATE_BUTTON,
+    ),
     MIGRATION_UPDATE_NEEDED_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_UPDATE_NEEDED_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_UPDATE_NEEDED_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_UPDATE_NEEDED_CANCEL_BUTTON,
+    ),
     MIGRATION_PAUSED_CONTINUE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_PAUSED_CONTINUE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_PAUSED_CONTINUE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_PAUSED_CONTINUE_BUTTON,
+    ),
     MIGRATION_DONE_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_DONE_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_DONE_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_DONE_DIALOG_CONTAINER,
+    ),
     MIGRATION_DONE_DIALOG_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_DONE_DIALOG_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_DONE_DIALOG_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_DONE_DIALOG_BUTTON,
+    ),
     MIGRATION_IN_PROGRESS_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_IN_PROGRESS_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_IN_PROGRESS_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_IN_PROGRESS_DIALOG_CONTAINER,
+    ),
     MIGRATION_IN_PROGRESS_DIALOG_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_IN_PROGRESS_DIALOG_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_IN_PROGRESS_DIALOG_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_IN_PROGRESS_DIALOG_BUTTON,
+    ),
     MIGRATION_PENDING_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_PENDING_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_PENDING_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_PENDING_DIALOG_CONTAINER,
+    ),
     MIGRATION_PENDING_DIALOG_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_PENDING_DIALOG_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_PENDING_DIALOG_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_PENDING_DIALOG_CANCEL_BUTTON,
+    ),
     MIGRATION_PENDING_DIALOG_CONTINUE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_PENDING_DIALOG_CONTINUE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_PENDING_DIALOG_CONTINUE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_PENDING_DIALOG_CONTINUE_BUTTON,
+    ),
     MIGRATION_NOT_COMPLETE_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_NOT_COMPLETE_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_NOT_COMPLETE_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_NOT_COMPLETE_DIALOG_CONTAINER,
+    ),
     MIGRATION_NOT_COMPLETE_DIALOG_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_NOT_COMPLETE_DIALOG_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_NOT_COMPLETE_DIALOG_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_NOT_COMPLETE_DIALOG_BUTTON,
+    ),
     MIGRATION_RESUME_BANNER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_RESUME_BANNER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_RESUME_BANNER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_RESUME_BANNER,
+    ),
     MIGRATION_RESUME_BANNER_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_RESUME_BANNER_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_RESUME_BANNER_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_RESUME_BANNER_BUTTON,
+    ),
     MIGRATION_APP_UPDATE_BANNER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_BANNER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_APP_UPDATE_BANNER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_APP_UPDATE_BANNER,
+    ),
     MIGRATION_APP_UPDATE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_APP_UPDATE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_APP_UPDATE_BUTTON,
+    ),
     MIGRATION_APP_UPDATE_LEARN_MORE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_LEARN_MORE_BUTTON,
-        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_LEARN_MORE_BUTTON),
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_LEARN_MORE_BUTTON,
+    ),
     MIGRATION_APP_UPDATE_BANNER_DISMISS_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MIGRATION_APP_UPDATE_DISMISS_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_APP_UPDATE_DISMISS_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MIGRATION_APP_UPDATE_DISMISS_BUTTON,
+    ),
 }
 
 enum class DataRestoreElement(override val impressionId: Int, override val interactionId: Int) :
     ElementName {
     RESTORE_IN_PROGRESS_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_RESTORE_IN_PROGRESS_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_RESTORE_IN_PROGRESS_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_RESTORE_IN_PROGRESS_DIALOG_CONTAINER,
+    ),
     RESTORE_IN_PROGRESS_DIALOG_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_RESTORE_IN_PROGRESS_DIALOG_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_RESTORE_IN_PROGRESS_DIALOG_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_RESTORE_IN_PROGRESS_DIALOG_BUTTON,
+    ),
     RESTORE_PENDING_BANNER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_RESTORE_UPDATE_NEEDED_BANNER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_RESTORE_UPDATE_NEEDED_BANNER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_RESTORE_UPDATE_NEEDED_BANNER,
+    ),
     RESTORE_PENDING_BANNER_UPDATE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_RESTORE_UPDATE_NEEDED_BANNER_UPDATE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_RESTORE_UPDATE_NEEDED_BANNER_UPDATE_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_RESTORE_UPDATE_NEEDED_BANNER_UPDATE_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Data sources page. */
@@ -887,25 +1216,32 @@
     ElementName {
     DATA_TYPE_SPINNER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_TYPE_SPINNER_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_TYPE_SPINNER_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_TYPE_SPINNER_BUTTON,
+    ),
     DATA_TOTALS_CARD(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATA_TOTALS_CARD,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_TOTALS_CARD),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATA_TOTALS_CARD,
+    ),
     APP_SOURCE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__APP_SOURCE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__APP_SOURCE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__APP_SOURCE_BUTTON,
+    ),
     ADD_AN_APP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ADD_AN_APP_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ADD_AN_APP_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ADD_AN_APP_BUTTON,
+    ),
     EDIT_SOURCE_LIST_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EDIT_SOURCE_LIST_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EDIT_SOURCE_LIST_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EDIT_SOURCE_LIST_BUTTON,
+    ),
     REORDER_APP_SOURCE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__REORDER_APP_SOURCE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REORDER_APP_SOURCE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REORDER_APP_SOURCE_BUTTON,
+    ),
     REMOVE_APP_SOURCE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__REMOVE_APP_SOURCE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REMOVE_APP_SOURCE_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REMOVE_APP_SOURCE_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Add an app page. */
@@ -913,66 +1249,83 @@
     ElementName {
     POTENTIAL_PRIORITY_APP_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__POTENTIAL_PRIORITY_APP_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__POTENTIAL_PRIORITY_APP_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__POTENTIAL_PRIORITY_APP_BUTTON,
+    )
 }
 
 enum class RouteRequestElement(override val impressionId: Int, override val interactionId: Int) :
     ElementName {
     EXERCISE_ROUTE_REQUEST_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTE_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_CONTAINER,
+    ),
     EXERCISE_ROUTE_DIALOG_INFORMATION_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTE_DIALOG_INFORMATION_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_INFORMATION_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_INFORMATION_BUTTON,
+    ),
     EXERCISE_ROUTE_DIALOG_ROUTE_VIEW(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTE_DIALOG_ROUTE_VIEW,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_ROUTE_VIEW),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_ROUTE_VIEW,
+    ),
     EXERCISE_ROUTE_DIALOG_ALLOW_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTE_DIALOG_ALLOW_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_ALLOW_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_ALLOW_BUTTON,
+    ),
     EXERCISE_ROUTE_DIALOG_ALWAYS_ALLOW_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTE_DIALOG_ALWAYS_ALLOW_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_ALWAYS_ALLOW_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_ALWAYS_ALLOW_BUTTON,
+    ),
     EXERCISE_ROUTE_DIALOG_DONT_ALLOW_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTE_DIALOG_DONT_ALLOW_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_DONT_ALLOW_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_DIALOG_DONT_ALLOW_BUTTON,
+    ),
     EXERCISE_ROUTE_EDUCATION_DIALOG_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTE_EDUCATION_DIALOG_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_EDUCATION_DIALOG_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_EDUCATION_DIALOG_CONTAINER,
+    ),
     EXERCISE_ROUTE_EDUCATION_DIALOG_BACK_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXERCISE_ROUTE_EDUCATION_DIALOG_BACK_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_EDUCATION_DIALOG_BACK_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXERCISE_ROUTE_EDUCATION_DIALOG_BACK_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Backup and restore page */
 enum class BackupAndRestoreElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     SCHEDULED_EXPORT_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SCHEDULED_EXPORT_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SCHEDULED_EXPORT_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SCHEDULED_EXPORT_BUTTON,
+    ),
     RESTORE_DATA_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__RESTORE_DATA_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__RESTORE_DATA_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__RESTORE_DATA_BUTTON,
+    ),
     IMPORT_GENERAL_ERROR_BANNER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_GENERAL_ERROR_BANNER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_GENERAL_ERROR_BANNER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_GENERAL_ERROR_BANNER,
+    ),
     IMPORT_GENERAL_ERROR_BANNER_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_GENERAL_ERROR_BANNER_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_GENERAL_ERROR_BANNER_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_GENERAL_ERROR_BANNER_BUTTON,
+    ),
     IMPORT_VERSION_MISMATCH_ERROR_BANNER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_VERSION_MISMATCH_ERROR_BANNER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_VERSION_MISMATCH_ERROR_BANNER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_VERSION_MISMATCH_ERROR_BANNER,
+    ),
     IMPORT_VERSION_MISMATCH_ERROR_BANNER_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_VERSION_MISMATCH_ERROR_BANNER_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_VERSION_MISMATCH_ERROR_BANNER_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_VERSION_MISMATCH_ERROR_BANNER_BUTTON,
+    ),
     IMPORT_WRONG_FILE_ERROR_BANNER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_WRONG_FILE_ERROR_BANNER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_WRONG_FILE_ERROR_BANNER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_WRONG_FILE_ERROR_BANNER,
+    ),
     IMPORT_WRONG_FILE_ERROR_BANNER_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_WRONG_FILE_ERROR_BANNER_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_WRONG_FILE_ERROR_BANNER_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_WRONG_FILE_ERROR_BANNER_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Export frequency page */
@@ -980,32 +1333,39 @@
     ElementName {
     EXPORT_FREQUENCY_DAILY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_FREQUENCY_DAILY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_DAILY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_DAILY_BUTTON,
+    ),
     EXPORT_FREQUENCY_WEEKLY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_FREQUENCY_WEEKLY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_WEEKLY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_WEEKLY_BUTTON,
+    ),
     EXPORT_FREQUENCY_MONTHLY_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_FREQUENCY_MONTHLY_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_MONTHLY_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_MONTHLY_BUTTON,
+    ),
     EXPORT_FREQUENCY_BACK_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_FREQUENCY_BACK_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_BACK_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_BACK_BUTTON,
+    ),
     EXPORT_FREQUENCY_NEXT_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_FREQUENCY_NEXT_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_NEXT_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_NEXT_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Export destination page */
 enum class ExportDestinationElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     EXPORT_DESTINATION_BACK_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_DESTINATION_BACK_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_DESTINATION_BACK_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_DESTINATION_BACK_BUTTON,
+    ),
     EXPORT_DESTINATION_NEXT_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_FREQUENCY_NEXT_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_NEXT_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_FREQUENCY_NEXT_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Scheduled export fragment page */
@@ -1013,80 +1373,140 @@
     ElementName {
     EXPORT_CONTROL_SWITCH_ON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_CONTROL_SWITCH_ON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_CONTROL_SWITCH_ON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_CONTROL_SWITCH_ON,
+    ),
     EXPORT_CONTROL_SWITCH_OFF(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_CONTROL_SWITCH_OFF,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_CONTROL_SWITCH_OFF),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_CONTROL_SWITCH_OFF,
+    ),
     EXPORT_SETTINGS_FREQUENCY_DAILY(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_DAILY,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_DAILY),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_DAILY,
+    ),
     EXPORT_SETTINGS_FREQUENCY_WEEKLY(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_WEEKLY,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_WEEKLY),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_WEEKLY,
+    ),
     EXPORT_SETTINGS_FREQUENCY_MONTHLY(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_MONTHLY,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_MONTHLY)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__EXPORT_SETTINGS_FREQUENCY_MONTHLY,
+    ),
 }
 
 /** Loggable elements in the Import source location page */
 enum class ImportSourceLocationElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     IMPORT_SOURCE_LOCATION_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_SOURCE_LOCATION_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_SOURCE_LOCATION_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_SOURCE_LOCATION_CANCEL_BUTTON,
+    ),
     IMPORT_SOURCE_LOCATION_NEXT_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_SOURCE_LOCATION_NEXT_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_SOURCE_LOCATION_NEXT_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_SOURCE_LOCATION_NEXT_BUTTON,
+    ),
 }
 
 /** Loggable elements in the Import confirmation dialog page */
 enum class ImportConfirmationDialogElement(
     override val impressionId: Int,
-    override val interactionId: Int
+    override val interactionId: Int,
 ) : ElementName {
     IMPORT_CONFIRMATION_CANCEL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_CONFIRMATION_CANCEL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_CONFIRMATION_CANCEL_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_CONFIRMATION_CANCEL_BUTTON,
+    ),
     IMPORT_CONFIRMATION_DONE_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_CONFIRMATION_DONE_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_CONFIRMATION_DONE_BUTTON),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_CONFIRMATION_DONE_BUTTON,
+    ),
     IMPORT_CONFIRMATION_CONTAINER(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__IMPORT_CONFIRMATION_CONTAINER,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_CONFIRMATION_CONTAINER),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__IMPORT_CONFIRMATION_CONTAINER,
+    ),
 }
 
 enum class AllDataElement(override val impressionId: Int, override val interactionId: Int) :
     ElementName {
     PERMISSION_TYPE_BUTTON_WITH_CHECKBOX(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PERMISSION_TYPE_BUTTON_WITH_CHECKBOX,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_TYPE_BUTTON_WITH_CHECKBOX),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_TYPE_BUTTON_WITH_CHECKBOX,
+    ),
     PERMISSION_TYPE_BUTTON_NO_CHECKBOX(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__PERMISSION_TYPE_BUTTON_NO_CHECKBOX,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_TYPE_BUTTON_NO_CHECKBOX),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__PERMISSION_TYPE_BUTTON_NO_CHECKBOX,
+    ),
     SELECT_ALL_BUTTON(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__SELECT_ALL_BUTTON,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SELECT_ALL_BUTTON)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__SELECT_ALL_BUTTON,
+    ),
 }
 
 enum class AllEntriesElement(override val impressionId: Int, override val interactionId: Int) :
     ElementName {
     ENTRY_BUTTON_WITH_CHECKBOX(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ENTRY_BUTTON_WITH_CHECKBOX,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENTRY_BUTTON_WITH_CHECKBOX),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENTRY_BUTTON_WITH_CHECKBOX,
+    ),
     ENTRY_BUTTON_NO_CHECKBOX(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ENTRY_BUTTON_NO_CHECKBOX,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENTRY_BUTTON_NO_CHECKBOX),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ENTRY_BUTTON_NO_CHECKBOX,
+    ),
     DATE_VIEW_SPINNER_DAY(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATE_VIEW_SPINNER_DAY,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATE_VIEW_SPINNER_DAY),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATE_VIEW_SPINNER_DAY,
+    ),
     DATE_VIEW_SPINNER_WEEK(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATE_VIEW_SPINNER_WEEK,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATE_VIEW_SPINNER_WEEK),
-    DATE_VIEW_SPINNER_YEAR(
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATE_VIEW_SPINNER_WEEK,
+    ),
+    DATE_VIEW_SPINNER_MONTH(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__DATE_VIEW_SPINNER_YEAR,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATE_VIEW_SPINNER_YEAR),
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__DATE_VIEW_SPINNER_YEAR,
+    ),
+}
+
+enum class CombinedAppAccessElement(
+    override val impressionId: Int,
+    override val interactionId: Int,
+) : ElementName {
+    FITNESS_PERMISSIONS_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__FITNESS_PERMISSIONS_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__FITNESS_PERMISSIONS_BUTTON,
+    ),
+    MEDICAL_PERMISSIONS_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__MEDICAL_PERMISSIONS_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__MEDICAL_PERMISSIONS_BUTTON,
+    ),
+    REMOVE_ALL_PERMISSIONS_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__REMOVE_ALL_PERMISSIONS_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__REMOVE_ALL_PERMISSIONS_BUTTON,
+    ),
+}
+
+/** Loggable elements belonging to the RawFhirPage. */
+enum class RawFhirPageElement(override val impressionId: Int, override val interactionId: Int) :
+    ElementName {
+    RAW_FHIR_RESOURCE(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__RAW_FHIR_RESOURCE,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__RAW_FHIR_RESOURCE,
+    )
+}
+
+/** Loggable elements belonging to MedicalWritePermissionFragment elements. */
+enum class MedicalWritePermissionPageElement(
+    override val impressionId: Int,
+    override val interactionId: Int,
+) : ElementName {
+    ALLOW_WRITE_HEALTH_RECORDS_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ALLOW_WRITE_HEALTH_RECORDS_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ALLOW_WRITE_HEALTH_RECORDS_BUTTON,
+    ),
+    CANCEL_WRITE_HEALTH_RECORDS_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__CANCEL_WRITE_HEALTH_RECORDS_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__CANCEL_WRITE_HEALTH_RECORDS_BUTTON,
+    ),
 }
 
 /** Loggable elements belonging to the error page, and the unknown element. */
@@ -1094,53 +1514,54 @@
     ElementName {
     UNKNOWN_ELEMENT(
         HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__ELEMENT_UNKNOWN,
-        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ELEMENT_UNKNOWN)
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__ELEMENT_UNKNOWN,
+    )
 }
 
 /** Loggable elements belonging to any page with unknown elements. */
 enum class UnknownGenericElement(override val impressionId: Int, override val interactionId: Int) :
     ElementName {
-        UNKNOWN_BANNER(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_BANNER,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_BANNER
-        ),
-        UNKNOWN_BANNER_BUTTON(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_BANNER_BUTTON,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_BANNER_BUTTON
-        ),
-        UNKNOWN_HEALTH_PREFERENCE(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_HEALTH_PREFERENCE,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_HEALTH_PREFERENCE
-        ),
-        UNKNOWN_DIALOG(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_DIALOG,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_DIALOG
-        ),
-        UNKNOWN_DIALOG_POSITIVE_BUTTON(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_DIALOG_POSITIVE_BUTTON,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_DIALOG_POSITIVE_BUTTON
-        ),
-        UNKNOWN_DIALOG_NEGATIVE_BUTTON(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_DIALOG_NEGATIVE_BUTTON,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_DIALOG_NEGATIVE_BUTTON
-        ),
-        UNKNOWN_DIALOG_NEUTRAL_BUTTON(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_DIALOG_NEUTRAL_BUTTON,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_DIALOG_NEUTRAL_BUTTON
-        ),
-        UNKNOWN_SWITCH_ACTIVE_PREFERENCE(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_SWITCH_ACTIVE_PREFERENCE,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_SWITCH_ACTIVE_PREFERENCE
-        ),
-        UNKNOWN_SWITCH_INACTIVE_PREFERENCE(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_SWITCH_INACTIVE_PREFERENCE,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_SWITCH_INACTIVE_PREFERENCE
-        ),
-        UNKNOWN_BUTTON(
-            HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_BUTTON,
-            HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_BUTTON
-        )
-    }
+    UNKNOWN_BANNER(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_BANNER,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_BANNER,
+    ),
+    UNKNOWN_BANNER_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_BANNER_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_BANNER_BUTTON,
+    ),
+    UNKNOWN_HEALTH_PREFERENCE(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_HEALTH_PREFERENCE,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_HEALTH_PREFERENCE,
+    ),
+    UNKNOWN_DIALOG(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_DIALOG,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_DIALOG,
+    ),
+    UNKNOWN_DIALOG_POSITIVE_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_DIALOG_POSITIVE_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_DIALOG_POSITIVE_BUTTON,
+    ),
+    UNKNOWN_DIALOG_NEGATIVE_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_DIALOG_NEGATIVE_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_DIALOG_NEGATIVE_BUTTON,
+    ),
+    UNKNOWN_DIALOG_NEUTRAL_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_DIALOG_NEUTRAL_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_DIALOG_NEUTRAL_BUTTON,
+    ),
+    UNKNOWN_SWITCH_ACTIVE_PREFERENCE(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_SWITCH_ACTIVE_PREFERENCE,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_SWITCH_ACTIVE_PREFERENCE,
+    ),
+    UNKNOWN_SWITCH_INACTIVE_PREFERENCE(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_SWITCH_INACTIVE_PREFERENCE,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_SWITCH_INACTIVE_PREFERENCE,
+    ),
+    UNKNOWN_BUTTON(
+        HEALTH_CONNECT_UI_IMPRESSION__ELEMENT__UNKNOWN_BUTTON,
+        HEALTH_CONNECT_UI_INTERACTION__ELEMENT__UNKNOWN_BUTTON,
+    ),
+}
 
 @EntryPoint
 @InstallIn(SingletonComponent::class)
diff --git a/apk/tests/Android.bp b/apk/tests/Android.bp
index 11d5fe3..b192c0f 100644
--- a/apk/tests/Android.bp
+++ b/apk/tests/Android.bp
@@ -77,6 +77,8 @@
         ":UnsupportedTestApp",
         ":OldPermissionsTestApp",
         ":MedicalPermissionsTestApp",
+        ":HealthConnectUITestApp6",
+        ":HealthConnectUITestApp7",
     ],
     test_config_template: "AndroidTestTemplate.xml",
     visibility: ["//visibility:private"],
@@ -101,6 +103,7 @@
         "HealthConnectLibrary",
         "hilt_android_testing",
         "mockito-target-minus-junit4",
+        "mockito-kotlin2",
     ],
     libs: [
         "android.test.mock.stubs",
@@ -336,6 +339,7 @@
     instrumentation_target_package: "com.android.healthconnect.controller.tests.extras",
 }
 
+// For development only, not used in *TS.
 android_test {
     name: "HealthConnectControllerUITests",
     srcs: [
@@ -351,6 +355,9 @@
         "HealthConnectMigrationApis",
         "HealthConnectExportApis",
     ],
+    test_suites: [
+        "general-tests",
+    ],
     package_name: "com.android.healthconnect.controller.tests",
     instrumentation_target_package: "com.android.healthconnect.controller.tests",
 }
diff --git a/apk/tests/AndroidTestTemplate.xml b/apk/tests/AndroidTestTemplate.xml
index 9a90e14..28764be 100644
--- a/apk/tests/AndroidTestTemplate.xml
+++ b/apk/tests/AndroidTestTemplate.xml
@@ -32,6 +32,15 @@
     <option name="test-file-name" value="UnsupportedTestApp.apk"/>
     <option name="test-file-name" value="OldPermissionsTestApp.apk"/>
     <option name="test-file-name" value="MedicalPermissionsTestApp.apk"/>
+    <option name="test-file-name" value="HealthConnectUITestApp6.apk"/>
+    <option name="test-file-name" value="HealthConnectUITestApp7.apk"/>
+  </target_preparer>
+  <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+    <!-- Reset display and font -->
+    <option name="run-command" value="settings put system font_scale 0.85" />
+    <option name="run-command" value="wm density reset" />
+    <!-- disable DeprecatedAbi warning -->
+    <option name="run-command" value="setprop debug.wm.disable_deprecated_abi_dialog 1" />
   </target_preparer>
   <test class="com.android.tradefed.testtype.AndroidJUnitTest">
     <option name="runner" value="com.android.healthconnect.controller.tests.HiltTestRunner"/>
diff --git a/apk/tests/MedicalPermissionsTestApp/AndroidManifest.xml b/apk/tests/MedicalPermissionsTestApp/AndroidManifest.xml
index 518b6ed..c3c3aa1 100644
--- a/apk/tests/MedicalPermissionsTestApp/AndroidManifest.xml
+++ b/apk/tests/MedicalPermissionsTestApp/AndroidManifest.xml
@@ -19,14 +19,17 @@
 
     <!-- Health-related permissions. -->
     <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROBLEMS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
     <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
     <uses-permission android:name="android.permission.MANAGE_HEALTH_DATA"/>
diff --git a/apk/tests/TestApp/AndroidManifest.xml b/apk/tests/TestApp/AndroidManifest.xml
index db30739..f003d48 100644
--- a/apk/tests/TestApp/AndroidManifest.xml
+++ b/apk/tests/TestApp/AndroidManifest.xml
@@ -32,14 +32,17 @@
     <uses-permission android:name="android.permission.health.WRITE_PLANNED_EXERCISE"/>
     <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"/>
     <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_HISTORY"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
-    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROBLEMS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
     <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
     <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
     <uses-permission android:name="android.permission.MANAGE_HEALTH_DATA"/>
diff --git a/apk/tests/TestApp2/AndroidManifest.xml b/apk/tests/TestApp2/AndroidManifest.xml
index 9811624..1883716 100644
--- a/apk/tests/TestApp2/AndroidManifest.xml
+++ b/apk/tests/TestApp2/AndroidManifest.xml
@@ -20,8 +20,24 @@
     <!-- Health-related permissions. -->
     <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
     <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
-        <uses-permission android:name="android.permission-group.HEALTH"/>
+    <uses-permission android:name="android.permission.health.READ_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.READ_SLEEP"/>
+    <uses-permission android:name="android.permission.health.WRITE_SLEEP"/>
+    <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_STEPS"/>
+    <uses-permission android:name="android.permission.health.WRITE_STEPS"/>
+    <uses-permission android:name="android.permission.health.READ_EXERCISE_ROUTES"/>
+    <uses-permission android:name="android.permission.health.WRITE_EXERCISE_ROUTE"/>
+    <uses-permission android:name="android.permission.health.READ_SKIN_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.WRITE_SKIN_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.READ_PLANNED_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.WRITE_PLANNED_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"/>
+    <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_HISTORY"/>
     <uses-permission android:name="android.permission.MANAGE_HEALTH_DATA"/>
+    <uses-permission android:name="android.permission-group.HEALTH"/>
 
     <application
         android:label="Health Connect test app 2">
diff --git a/apk/tests/WearLegacyTestApp/Android.bp b/apk/tests/WearLegacyTestApp/Android.bp
new file mode 100644
index 0000000..c4e5c46
--- /dev/null
+++ b/apk/tests/WearLegacyTestApp/Android.bp
@@ -0,0 +1,46 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+filegroup {
+    name: "healthconnect-ui-testapp6-srcs",
+    srcs: [
+        "src/**/*.java",
+    ],
+    visibility: [
+        "//packages/modules/HealthFitness:__subpackages__",
+    ],
+}
+
+android_test_helper_app {
+    name: "HealthConnectUITestApp6",
+
+    libs: [
+        "android.test.base.stubs.system",
+        "android.test.runner.stubs.system",
+    ],
+
+    srcs: [":healthconnect-ui-testapp6-srcs"],
+
+    test_suites: [
+        "device-tests",
+        "general-tests",
+    ],
+
+    target_sdk_version: "34",
+    min_sdk_version: "34",
+}
diff --git a/apk/tests/WearLegacyTestApp/AndroidManifest.xml b/apk/tests/WearLegacyTestApp/AndroidManifest.xml
new file mode 100644
index 0000000..a29b524
--- /dev/null
+++ b/apk/tests/WearLegacyTestApp/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.healthconnect.controller.test.app6">
+
+  <!-- Will split to health-related permission READ_HEART_RATE on SDK Baklava. -->
+  <uses-permission android:name="android.permission.BODY_SENSORS"/>
+
+  <application
+      android:label="Wear Legacy Test App">
+    <uses-library android:name="android.test.runner"/>
+
+    <activity android:name=".MainActivity"
+        android:label="MainActivity"
+        android:exported="true">
+      <intent-filter>
+        <action android:name="android.intent.action.MAIN"/>
+        <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST"/>
+      </intent-filter>
+    </activity>
+  </application>
+</manifest>
diff --git a/apk/tests/WearLegacyTestApp/src/android/healthconnect/controller/test/app6/MainActivity.java b/apk/tests/WearLegacyTestApp/src/android/healthconnect/controller/test/app6/MainActivity.java
new file mode 100644
index 0000000..92bafe5
--- /dev/null
+++ b/apk/tests/WearLegacyTestApp/src/android/healthconnect/controller/test/app6/MainActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.controller.test.app6;
+
+import android.app.Activity;
+import android.health.connect.HealthConnectManager;
+
+/**
+ * This app is used as an external package to test system api {@link HealthConnectManager}
+ * permission-related APIs.
+ */
+public class MainActivity extends Activity {}
diff --git a/apk/tests/WearTestApp/Android.bp b/apk/tests/WearTestApp/Android.bp
new file mode 100644
index 0000000..4575057
--- /dev/null
+++ b/apk/tests/WearTestApp/Android.bp
@@ -0,0 +1,46 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+filegroup {
+    name: "healthconnect-ui-testapp7-srcs",
+    srcs: [
+        "src/**/*.java",
+    ],
+    visibility: [
+        "//packages/modules/HealthFitness:__subpackages__",
+    ],
+}
+
+android_test_helper_app {
+    name: "HealthConnectUITestApp7",
+
+    libs: [
+        "android.test.base.stubs.system",
+        "android.test.runner.stubs.system",
+    ],
+
+    srcs: [":healthconnect-ui-testapp7-srcs"],
+
+    test_suites: [
+        "device-tests",
+        "general-tests",
+    ],
+
+    target_sdk_version: "36",
+    min_sdk_version: "34",
+}
diff --git a/apk/tests/WearTestApp/AndroidManifest.xml b/apk/tests/WearTestApp/AndroidManifest.xml
new file mode 100644
index 0000000..369e734
--- /dev/null
+++ b/apk/tests/WearTestApp/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.healthconnect.controller.test.app7">
+
+  <!-- Health-related permissions. -->
+  <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
+
+  <application
+      android:label="Wear Test App">
+    <uses-library android:name="android.test.runner"/>
+
+    <activity android:name=".MainActivity"
+        android:label="MainActivity"
+        android:exported="true">
+      <intent-filter>
+        <action android:name="android.intent.action.MAIN"/>
+        <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST"/>
+      </intent-filter>
+    </activity>
+  </application>
+</manifest>
diff --git a/apk/tests/WearTestApp/src/android/healthconnect/controller/test/app7/MainActivity.java b/apk/tests/WearTestApp/src/android/healthconnect/controller/test/app7/MainActivity.java
new file mode 100644
index 0000000..0449068
--- /dev/null
+++ b/apk/tests/WearTestApp/src/android/healthconnect/controller/test/app7/MainActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.controller.test.app7;
+
+import android.app.Activity;
+import android.health.connect.HealthConnectManager;
+
+/**
+ * This app is used as an external package to test system api {@link HealthConnectManager}
+ * permission-related APIs.
+ */
+public class MainActivity extends Activity {}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt
index 84c97d0..801f6c4 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt
@@ -26,20 +26,19 @@
 import com.android.healthconnect.controller.shared.Constants
 import com.android.healthconnect.controller.tests.utils.NOW
 import com.android.healthconnect.controller.tests.utils.showOnboarding
-import com.android.healthconnect.controller.tests.utils.whenever
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runTest
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
-@OptIn(ExperimentalCoroutinesApi::class)
 class MainActivityTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
@@ -49,6 +48,8 @@
     @BindValue
     val exportStatusViewModel: ExportStatusViewModel =
         Mockito.mock(ExportStatusViewModel::class.java)
+    @BindValue
+    val healthConnectLogger: HealthConnectLogger = Mockito.mock(HealthConnectLogger::class.java)
 
     private lateinit var context: Context
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/autodelete/AutoDeleteFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/autodelete/AutoDeleteFragmentTest.kt
index 7975eae..a512044 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/autodelete/AutoDeleteFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/autodelete/AutoDeleteFragmentTest.kt
@@ -46,6 +46,7 @@
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class AutoDeleteFragmentTest {
@@ -68,16 +69,20 @@
     @Test
     @Throws(java.lang.Exception::class)
     fun autoDeleteFragment_isDisplayed() {
-        Mockito.`when`(viewModel.storedAutoDeleteRange).then {
+        whenever(viewModel.storedAutoDeleteRange).then {
             MutableLiveData(
                 AutoDeleteViewModel.AutoDeleteState.WithData(
-                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER))
+                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER
+                )
+            )
         }
         launchFragment<AutoDeleteFragment>(Bundle())
 
         onView(
                 withText(
-                    "Control how long your data is stored in Health\u00A0Connect by scheduling it to delete after a set time"))
+                    "Control how long your data is stored in Health\u00A0Connect by scheduling it to delete after a set time"
+                )
+            )
             .check(matches(isDisplayed()))
         // Need to provide id as well, otherwise both TextView and TextLinkView are found.
         onView(allOf(withText("Learn more about auto-delete"), withId(R.id.header_link)))
@@ -88,7 +93,9 @@
         onView(withText("Never")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "When you change these settings, Health\u00A0Connect deletes existing data to reflect your new preferences"))
+                    "When you change these settings, Health\u00A0Connect deletes existing data to reflect your new preferences"
+                )
+            )
             .check(matches(isDisplayed()))
 
         verify(healthConnectLogger, atLeast(1)).setPageId(PageName.AUTO_DELETE_PAGE)
@@ -101,15 +108,17 @@
     @Test
     @Throws(java.lang.Exception::class)
     fun autoDelete_checkDefaultRange_defaultRange() {
-        Mockito.`when`(viewModel.storedAutoDeleteRange).then {
+        whenever(viewModel.storedAutoDeleteRange).then {
             MutableLiveData(
                 AutoDeleteViewModel.AutoDeleteState.WithData(
-                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER))
+                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER
+                )
+            )
         }
-        Mockito.`when`(viewModel.newAutoDeleteRange).then {
+        whenever(viewModel.newAutoDeleteRange).then {
             MutableLiveData(AutoDeleteRange.AUTO_DELETE_RANGE_THREE_MONTHS)
         }
-        Mockito.`when`(viewModel.oldAutoDeleteRange).then {
+        whenever(viewModel.oldAutoDeleteRange).then {
             MutableLiveData(AutoDeleteRange.AUTO_DELETE_RANGE_NEVER)
         }
         launchFragment<AutoDeleteFragment>(Bundle())
@@ -119,15 +128,17 @@
     @Test
     @Throws(java.lang.Exception::class)
     fun autoDelete_setRangeTo3Months_saveChanges() {
-        Mockito.`when`(viewModel.storedAutoDeleteRange).then {
+        whenever(viewModel.storedAutoDeleteRange).then {
             MutableLiveData(
                 AutoDeleteViewModel.AutoDeleteState.WithData(
-                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER))
+                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER
+                )
+            )
         }
-        Mockito.`when`(viewModel.newAutoDeleteRange).then {
+        whenever(viewModel.newAutoDeleteRange).then {
             MutableLiveData(AutoDeleteRange.AUTO_DELETE_RANGE_THREE_MONTHS)
         }
-        Mockito.`when`(viewModel.oldAutoDeleteRange).then {
+        whenever(viewModel.oldAutoDeleteRange).then {
             MutableLiveData(AutoDeleteRange.AUTO_DELETE_RANGE_NEVER)
         }
         launchFragment<AutoDeleteFragment>(Bundle())
@@ -138,7 +149,9 @@
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "This also deletes data older than 3 months from Health\u00A0Connect.\n\nIf you want to completely delete the data from your connected apps, check each app where your data may be saved."))
+                    "This also deletes data older than 3 months from Health\u00A0Connect.\n\nIf you want to completely delete the data from your connected apps, check each app where your data may be saved."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Set auto-delete")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -160,15 +173,17 @@
     @Test
     @Throws(java.lang.Exception::class)
     fun autoDelete_setRangeTo18Months_saveChanges() {
-        Mockito.`when`(viewModel.storedAutoDeleteRange).then {
+        whenever(viewModel.storedAutoDeleteRange).then {
             MutableLiveData(
                 AutoDeleteViewModel.AutoDeleteState.WithData(
-                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER))
+                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER
+                )
+            )
         }
-        Mockito.`when`(viewModel.newAutoDeleteRange).then {
+        whenever(viewModel.newAutoDeleteRange).then {
             MutableLiveData(AutoDeleteRange.AUTO_DELETE_RANGE_EIGHTEEN_MONTHS)
         }
-        Mockito.`when`(viewModel.oldAutoDeleteRange).then {
+        whenever(viewModel.oldAutoDeleteRange).then {
             MutableLiveData(AutoDeleteRange.AUTO_DELETE_RANGE_NEVER)
         }
         launchFragment<AutoDeleteFragment>(Bundle())
@@ -179,7 +194,9 @@
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "This also deletes data older than 18 months from Health\u00A0Connect.\n\nIf you want to completely delete the data from your connected apps, check each app where your data may be saved."))
+                    "This also deletes data older than 18 months from Health\u00A0Connect.\n\nIf you want to completely delete the data from your connected apps, check each app where your data may be saved."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Set auto-delete")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -200,10 +217,12 @@
 
     @Test
     fun autoDeleteFragment_learnMoreButton_isClickable() {
-        Mockito.`when`(viewModel.storedAutoDeleteRange).then {
+        whenever(viewModel.storedAutoDeleteRange).then {
             MutableLiveData(
                 AutoDeleteViewModel.AutoDeleteState.WithData(
-                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER))
+                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER
+                )
+            )
         }
         launchFragment<AutoDeleteFragment>(Bundle())
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/autodelete/api/UpdateAutoDeleteUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/autodelete/api/UpdateAutoDeleteUseCaseTest.kt
index 203096b..7212128 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/autodelete/api/UpdateAutoDeleteUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/autodelete/api/UpdateAutoDeleteUseCaseTest.kt
@@ -20,7 +20,6 @@
 import android.os.OutcomeReceiver
 import com.android.healthconnect.controller.autodelete.api.UpdateAutoDeleteUseCase
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -40,6 +39,7 @@
 import org.mockito.kotlin.doAnswer
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @HiltAndroidTest
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/backuprestore/BackupAndRestoreSettingsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/backuprestore/BackupAndRestoreSettingsFragmentTest.kt
index eb4e24d..a8af45e 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/backuprestore/BackupAndRestoreSettingsFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/backuprestore/BackupAndRestoreSettingsFragmentTest.kt
@@ -66,7 +66,6 @@
 import com.android.healthconnect.controller.tests.utils.TestTimeSource
 import com.android.healthconnect.controller.tests.utils.di.FakeDeviceInfoUtils
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
 import com.android.healthconnect.controller.utils.DeviceInfoUtilsModule
 import com.android.healthconnect.controller.utils.ToastManager
@@ -101,6 +100,7 @@
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @HiltAndroidTest
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/categories/HealthDataAllCategoriesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/categories/HealthDataAllCategoriesFragmentTest.kt
index 1a10891..25c007d 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/categories/HealthDataAllCategoriesFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/categories/HealthDataAllCategoriesFragmentTest.kt
@@ -43,7 +43,6 @@
 import com.android.healthconnect.controller.categories.HealthDataCategoryViewModel.CategoriesFragmentState.Loading
 import com.android.healthconnect.controller.categories.HealthDataCategoryViewModel.CategoriesFragmentState.WithData
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.CategoriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -62,6 +61,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 /** List of all Health data categories. */
 private val HEALTH_DATA_ALL_CATEGORIES =
@@ -140,7 +140,10 @@
                 WithData(
                     listOf(
                         HealthCategoryUiState(category = ACTIVITY, hasData = false),
-                        HealthCategoryUiState(category = BODY_MEASUREMENTS, hasData = true))))
+                        HealthCategoryUiState(category = BODY_MEASUREMENTS, hasData = true),
+                    )
+                )
+            )
         }
         launchFragment<HealthDataAllCategoriesFragment>(Bundle())
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/categories/HealthDataCategoriesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/categories/HealthDataCategoriesFragmentTest.kt
index a94bed5..891407e 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/categories/HealthDataCategoriesFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/categories/HealthDataCategoriesFragmentTest.kt
@@ -38,8 +38,6 @@
 import com.android.healthconnect.controller.categories.HealthDataCategoryViewModel.CategoriesFragmentState.WithData
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.logging.CategoriesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -47,7 +45,6 @@
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
-import javax.inject.Inject
 import org.hamcrest.Matchers.not
 import org.junit.After
 import org.junit.Before
@@ -59,6 +56,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 /** List of all Health data categories. */
 private val HEALTH_DATA_ALL_CATEGORIES =
@@ -75,7 +73,6 @@
 class HealthDataCategoriesFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
     private lateinit var context: Context
     private lateinit var navHostController: TestNavHostController
 
@@ -191,11 +188,15 @@
             listOf(
                 HealthCategoryUiState(category = HealthDataCategory.ACTIVITY, hasData = false),
                 HealthCategoryUiState(
-                    category = HealthDataCategory.BODY_MEASUREMENTS, hasData = false),
+                    category = HealthDataCategory.BODY_MEASUREMENTS,
+                    hasData = false,
+                ),
                 HealthCategoryUiState(category = HealthDataCategory.SLEEP, hasData = false),
                 HealthCategoryUiState(category = HealthDataCategory.VITALS, hasData = false),
                 HealthCategoryUiState(
-                    category = HealthDataCategory.CYCLE_TRACKING, hasData = false),
+                    category = HealthDataCategory.CYCLE_TRACKING,
+                    hasData = false,
+                ),
                 HealthCategoryUiState(category = HealthDataCategory.NUTRITION, hasData = false),
             )
         whenever(viewModel.categoriesData).then {
@@ -212,11 +213,15 @@
             listOf(
                 HealthCategoryUiState(category = HealthDataCategory.ACTIVITY, hasData = false),
                 HealthCategoryUiState(
-                    category = HealthDataCategory.BODY_MEASUREMENTS, hasData = false),
+                    category = HealthDataCategory.BODY_MEASUREMENTS,
+                    hasData = false,
+                ),
                 HealthCategoryUiState(category = HealthDataCategory.SLEEP, hasData = false),
                 HealthCategoryUiState(category = HealthDataCategory.VITALS, hasData = false),
                 HealthCategoryUiState(
-                    category = HealthDataCategory.CYCLE_TRACKING, hasData = false),
+                    category = HealthDataCategory.CYCLE_TRACKING,
+                    hasData = false,
+                ),
                 HealthCategoryUiState(category = HealthDataCategory.NUTRITION, hasData = false),
             )
         whenever(viewModel.categoriesData).then {
@@ -245,7 +250,9 @@
             listOf(
                 HealthCategoryUiState(category = HealthDataCategory.ACTIVITY, hasData = true),
                 HealthCategoryUiState(
-                    category = HealthDataCategory.BODY_MEASUREMENTS, hasData = true),
+                    category = HealthDataCategory.BODY_MEASUREMENTS,
+                    hasData = true,
+                ),
                 HealthCategoryUiState(category = HealthDataCategory.SLEEP, hasData = true),
                 HealthCategoryUiState(category = HealthDataCategory.VITALS, hasData = true),
                 HealthCategoryUiState(category = HealthDataCategory.CYCLE_TRACKING, hasData = true),
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/DataManagementActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/DataManagementActivityTest.kt
index c6a4e25..0fcc647 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/DataManagementActivityTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/DataManagementActivityTest.kt
@@ -41,8 +41,8 @@
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.DataRestoreUiState
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.MigrationUiState
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel
 import com.android.healthconnect.controller.tests.utils.showOnboarding
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
@@ -54,6 +54,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class DataManagementActivityTest {
@@ -84,18 +85,29 @@
         showOnboarding(context, show = false)
         whenever(categoryViewModel.categoriesData).then {
             MutableLiveData<HealthDataCategoryViewModel.CategoriesFragmentState>(
-                HealthDataCategoryViewModel.CategoriesFragmentState.WithData(emptyList()))
+                HealthDataCategoryViewModel.CategoriesFragmentState.WithData(emptyList())
+            )
         }
         whenever(allDataViewModel.allData).then {
             MutableLiveData<AllDataViewModel.AllDataState>(
                 AllDataViewModel.AllDataState.WithData(
                     listOf(
                         PermissionTypesPerCategory(
-                            HealthDataCategory.ACTIVITY, listOf(FitnessPermissionType.STEPS)))))
+                            HealthDataCategory.ACTIVITY,
+                            listOf(FitnessPermissionType.STEPS),
+                        )
+                    )
+                )
+            )
         }
         whenever(allDataViewModel.setOfPermissionTypesToBeDeleted).then {
             MutableLiveData<Set<FitnessPermissionType>>(emptySet())
         }
+        whenever(allDataViewModel.deletionScreenState).then {
+            MutableLiveData(DeletionDataViewModel.DeletionScreenState.VIEW)
+        }
+        whenever(allDataViewModel.getDeletionScreenStateValue())
+            .thenReturn(DeletionDataViewModel.DeletionScreenState.VIEW)
     }
 
     @Test
@@ -105,7 +117,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -113,7 +126,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val startActivityIntent = Intent(context, DataManagementActivity::class.java)
 
@@ -130,7 +146,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -138,7 +155,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         val startActivityIntent = Intent(context, DataManagementActivity::class.java)
@@ -155,7 +175,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IN_PROGRESS,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -163,7 +184,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IN_PROGRESS,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         val startActivityIntent = Intent(context, DataManagementActivity::class.java)
@@ -180,7 +204,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -188,7 +213,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         val startActivityIntent = Intent(context, DataManagementActivity::class.java)
@@ -205,7 +233,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.COMPLETE,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -213,7 +242,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.COMPLETE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         val startActivityIntent = Intent(context, DataManagementActivity::class.java)
@@ -223,7 +255,9 @@
         onView(withText("What's new")).inRoot(RootMatchers.isDialog()).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "You can now access Health Connect directly from your settings. Uninstall the Health Connect app any time to free up storage space."))
+                    "You can now access Health Connect directly from your settings. Uninstall the Health Connect app any time to free up storage space."
+                )
+            )
             .inRoot(RootMatchers.isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(RootMatchers.isDialog()).check(matches(isDisplayed()))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/access/AccessFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/access/AccessFragmentTest.kt
index 7c92e2c..c625944 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/access/AccessFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/access/AccessFragmentTest.kt
@@ -44,17 +44,27 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
-import com.android.healthconnect.controller.tests.utils.whenever
+import com.android.healthconnect.controller.tests.utils.toggleAnimation
+import com.android.healthconnect.controller.utils.logging.DataAccessElement
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import java.util.Locale
 import org.hamcrest.Matchers.not
+import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.atLeast
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.reset
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class AccessFragmentTest {
@@ -64,15 +74,23 @@
     @BindValue val viewModel: AccessViewModel = Mockito.mock(AccessViewModel::class.java)
     private lateinit var navHostController: TestNavHostController
     private lateinit var context: Context
+    @BindValue val healthConnectLogger: HealthConnectLogger = mock()
 
     @Before
     fun setup() {
         hiltRule.inject()
+        toggleAnimation(false)
         context = InstrumentationRegistry.getInstrumentation().context
         navHostController = TestNavHostController(context)
         context.setLocale(Locale.US)
     }
 
+    @After
+    fun tearDown() {
+        toggleAnimation(true)
+        reset(healthConnectLogger)
+    }
+
     @Test
     fun dataAccessFragment_noSections_noneDisplayed() {
         whenever(viewModel.appMetadataMap).then {
@@ -110,6 +128,44 @@
     }
 
     @Test
+    fun fitnessAccessFragment_logFitnessImpression() {
+        val map =
+            mapOf(
+                AppAccessState.Read to
+                    listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
+                AppAccessState.Write to emptyList(),
+                AppAccessState.Inactive to emptyList(),
+            )
+        whenever(viewModel.appMetadataMap).then {
+            MutableLiveData<AccessScreenState>(WithData(map))
+        }
+        launchFragment<AccessFragment>(distanceBundle)
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.TAB_ACCESS_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+        verify(healthConnectLogger).logImpression(DataAccessElement.DATA_ACCESS_APP_BUTTON)
+    }
+
+    @Test
+    fun medicalAccessFragment_logMedicalImpression() {
+        val map =
+            mapOf(
+                AppAccessState.Read to
+                    listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
+                AppAccessState.Write to emptyList(),
+                AppAccessState.Inactive to emptyList(),
+            )
+        whenever(viewModel.appMetadataMap).then {
+            MutableLiveData<AccessScreenState>(WithData(map))
+        }
+        launchFragment<AccessFragment>(immunizationBundle)
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.TAB_MEDICAL_ACCESS_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+        verify(healthConnectLogger).logImpression(DataAccessElement.DATA_ACCESS_APP_BUTTON)
+    }
+
+    @Test
     fun dataAccessFragment_readSection_isDisplayed() {
         val map =
             mapOf(
@@ -158,6 +214,8 @@
                 )
             )
             .check(doesNotExist())
+        verify(healthConnectLogger, times(2))
+            .logImpression(DataAccessElement.DATA_ACCESS_APP_BUTTON)
     }
 
     @Test
@@ -183,6 +241,7 @@
                 )
             )
             .check(matches(isDisplayed()))
+        verify(healthConnectLogger).logImpression(DataAccessElement.DATA_ACCESS_INACTIVE_APP_BUTTON)
     }
 
     @Test
@@ -304,8 +363,8 @@
         }
         launchFragment<AccessFragment>(immunizationBundle)
 
-        onView(withText("Can read immunization")).check(matches(isDisplayed()))
-        onView(withText("Can write immunization")).check(doesNotExist())
+        onView(withText("Can read vaccines")).check(matches(isDisplayed()))
+        onView(withText("Can write vaccines")).check(doesNotExist())
         onView(withText("Inactive apps")).check(doesNotExist())
         onView(
                 withText(
@@ -350,7 +409,7 @@
     private val immunizationBundle: Bundle
         get() {
             val bundle = Bundle()
-            bundle.putString(PERMISSION_TYPE_NAME_KEY, MedicalPermissionType.IMMUNIZATION.name)
+            bundle.putString(PERMISSION_TYPE_NAME_KEY, MedicalPermissionType.VACCINES.name)
             return bundle
         }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/access/AccessViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/access/AccessViewModelTest.kt
index c8cb4ce..6f6db2a 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/access/AccessViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/access/AccessViewModelTest.kt
@@ -101,7 +101,7 @@
 
         val testObserver = TestObserver<AccessViewModel.AccessScreenState>()
         viewModel.appMetadataMap.observeForever(testObserver)
-        viewModel.loadAppMetaDataMap(MedicalPermissionType.IMMUNIZATION)
+        viewModel.loadAppMetaDataMap(MedicalPermissionType.VACCINES)
         advanceUntilIdle()
 
         assertThat(testObserver.getLastValue())
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/access/LoadAccessUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/access/LoadAccessUseCaseTest.kt
index 5a59295..139a681 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/access/LoadAccessUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/access/LoadAccessUseCaseTest.kt
@@ -15,12 +15,15 @@
  */
 package com.android.healthconnect.controller.tests.data.access
 
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import com.android.healthconnect.controller.data.access.AppAccessState
 import com.android.healthconnect.controller.data.access.ILoadAccessUseCase
 import com.android.healthconnect.controller.data.access.LoadAccessUseCase
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
 import com.android.healthconnect.controller.shared.HealthPermissionReader
@@ -28,21 +31,16 @@
 import com.android.healthconnect.controller.shared.app.AppPermissionsType.COMBINED_PERMISSIONS
 import com.android.healthconnect.controller.shared.app.AppPermissionsType.FITNESS_PERMISSIONS_ONLY
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
-import com.android.healthconnect.controller.tests.utils.MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP
 import com.android.healthconnect.controller.tests.utils.TEST_APP_2
-import com.android.healthconnect.controller.tests.utils.TEST_APP_3
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME_2
-import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME_3
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_2
-import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_3
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
 import com.android.healthconnect.controller.tests.utils.di.FakeGetGrantedHealthPermissionsUseCase
 import com.android.healthconnect.controller.tests.utils.di.FakeLoadFitnessTypeContributorAppsUseCase
 import com.android.healthconnect.controller.tests.utils.di.FakeLoadMedicalTypeContributorAppsUseCase
-import com.android.healthconnect.controller.utils.FeatureUtils
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -60,17 +58,17 @@
 class LoadAccessUseCaseTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
+
     private lateinit var useCase: ILoadAccessUseCase
     private val fakeLoadFitnessTypeContributorAppsUseCase =
         FakeLoadFitnessTypeContributorAppsUseCase()
     private val fakeLoadMedicalTypeContributorAppsUseCase =
-            FakeLoadMedicalTypeContributorAppsUseCase()
-    private val fakeGetGrantedHealthPermissionsUseCase =
-        FakeGetGrantedHealthPermissionsUseCase()
+        FakeLoadMedicalTypeContributorAppsUseCase()
+    private val fakeGetGrantedHealthPermissionsUseCase = FakeGetGrantedHealthPermissionsUseCase()
 
     @Inject lateinit var appInfoReader: AppInfoReader
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
 
     @Before
     fun setup() {
@@ -83,7 +81,8 @@
                 fakeGetGrantedHealthPermissionsUseCase,
                 healthPermissionReader,
                 appInfoReader,
-                Dispatchers.Main)
+                Dispatchers.Main,
+            )
     }
 
     @Test
@@ -96,36 +95,39 @@
     }
 
     @Test
-    fun fitnessContributingApps_writeSteps_returnsCorrectApps() = runTest {
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun fitnessContributingApps_noMedical_writeSteps_returnsCorrectApps() = runTest {
         fakeLoadFitnessTypeContributorAppsUseCase.updateList(listOf(TEST_APP, TEST_APP_2))
         val writeSteps =
             FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.WRITE).toString()
-        fakeGetGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME, listOf(writeSteps))
+        fakeGetGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME, listOf(writeSteps))
 
         val actual = (useCase.invoke(FitnessPermissionType.STEPS) as UseCaseResults.Success).data
 
         assertThat(actual[AppAccessState.Write]).isNotNull()
         assertThat(actual[AppAccessState.Write]!!.size).isEqualTo(1)
-        assertThat(actual[AppAccessState.Write]!![0].appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(actual[AppAccessState.Write]!![0].appMetadata.packageName)
+            .isEqualTo(TEST_APP_PACKAGE_NAME)
         assertThat(actual[AppAccessState.Write]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME)
-        assertThat(actual[AppAccessState.Write]!![0].appPermissionsType).isEqualTo(FITNESS_PERMISSIONS_ONLY)
+        assertThat(actual[AppAccessState.Write]!![0].appPermissionsType)
+            .isEqualTo(FITNESS_PERMISSIONS_ONLY)
         assertThat(actual[AppAccessState.Read]).isNotNull()
         assertThat(actual[AppAccessState.Read]!!.size).isEqualTo(0)
         assertThat(actual[AppAccessState.Inactive]).isNotNull()
         assertThat(actual[AppAccessState.Inactive]!!.size).isEqualTo(1)
         assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.packageName)
             .isEqualTo(TEST_APP_PACKAGE_NAME_2)
-        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME_2)
+        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME_2)
     }
 
     @Test
-    fun fitnessContributingApps_readSteps_returnsCorrectApps() = runTest {
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun fitnessContributingApps_no_medical_readSteps_returnsCorrectApps() = runTest {
         fakeLoadFitnessTypeContributorAppsUseCase.updateList(listOf(TEST_APP, TEST_APP_2))
         val writeSteps =
-                FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.READ).toString()
-        fakeGetGrantedHealthPermissionsUseCase.updateData(
-                TEST_APP_PACKAGE_NAME, listOf(writeSteps))
+            FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.READ).toString()
+        fakeGetGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME, listOf(writeSteps))
 
         val actual = (useCase.invoke(FitnessPermissionType.STEPS) as UseCaseResults.Success).data
 
@@ -133,116 +135,137 @@
         assertThat(actual[AppAccessState.Write]!!.size).isEqualTo(0)
         assertThat(actual[AppAccessState.Read]).isNotNull()
         assertThat(actual[AppAccessState.Read]!!.size).isEqualTo(1)
-        assertThat(actual[AppAccessState.Read]!![0].appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(actual[AppAccessState.Read]!![0].appMetadata.packageName)
+            .isEqualTo(TEST_APP_PACKAGE_NAME)
         assertThat(actual[AppAccessState.Read]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME)
-        assertThat(actual[AppAccessState.Read]!![0].appPermissionsType).isEqualTo(FITNESS_PERMISSIONS_ONLY)
+        assertThat(actual[AppAccessState.Read]!![0].appPermissionsType)
+            .isEqualTo(FITNESS_PERMISSIONS_ONLY)
         assertThat(actual[AppAccessState.Inactive]).isNotNull()
         assertThat(actual[AppAccessState.Inactive]!!.size).isEqualTo(1)
         assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.packageName)
-                .isEqualTo(TEST_APP_PACKAGE_NAME_2)
-        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME_2)
+            .isEqualTo(TEST_APP_PACKAGE_NAME_2)
+        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME_2)
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun medicalPermissionsEnabled_returnsCorrectApps() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-
         fakeLoadFitnessTypeContributorAppsUseCase.updateList(listOf(TEST_APP, TEST_APP_2))
         val writeSteps =
             FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.WRITE).toString()
-        fakeGetGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME, listOf(writeSteps))
+        fakeGetGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME, listOf(writeSteps))
 
         val actual = (useCase.invoke(FitnessPermissionType.STEPS) as UseCaseResults.Success).data
 
         assertThat(actual[AppAccessState.Write]).isNotNull()
         assertThat(actual[AppAccessState.Write]!!.size).isEqualTo(1)
-        assertThat(actual[AppAccessState.Write]!![0].appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(actual[AppAccessState.Write]!![0].appMetadata.packageName)
+            .isEqualTo(TEST_APP_PACKAGE_NAME)
         assertThat(actual[AppAccessState.Write]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME)
-        assertThat(actual[AppAccessState.Write]!![0].appPermissionsType).isEqualTo(COMBINED_PERMISSIONS)
+        assertThat(actual[AppAccessState.Write]!![0].appPermissionsType)
+            .isEqualTo(COMBINED_PERMISSIONS)
         assertThat(actual[AppAccessState.Read]).isNotNull()
         assertThat(actual[AppAccessState.Read]!!.size).isEqualTo(0)
         assertThat(actual[AppAccessState.Inactive]).isNotNull()
         assertThat(actual[AppAccessState.Inactive]!!.size).isEqualTo(1)
         assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.packageName)
             .isEqualTo(TEST_APP_PACKAGE_NAME_2)
-        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME_2)
+        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME_2)
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun medicalData_readImmunization_returnsCorrectApps() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
         fakeLoadFitnessTypeContributorAppsUseCase.updateList(listOf(TEST_APP_2))
         fakeLoadMedicalTypeContributorAppsUseCase.updateList(listOf(TEST_APP))
         val steps =
-                FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.WRITE).toString()
+            FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.WRITE).toString()
         val immunization =
-                HealthPermission.MedicalPermission(MedicalPermissionType.IMMUNIZATION).toString()
+            HealthPermission.MedicalPermission(MedicalPermissionType.VACCINES).toString()
         fakeGetGrantedHealthPermissionsUseCase.updateData(
-                TEST_APP_PACKAGE_NAME, listOf(steps, immunization))
+            TEST_APP_PACKAGE_NAME,
+            listOf(steps, immunization),
+        )
 
-        val actual = (useCase.invoke(MedicalPermissionType.IMMUNIZATION) as UseCaseResults.Success).data
+        val actual =
+            (useCase.invoke(MedicalPermissionType.VACCINES) as UseCaseResults.Success).data
 
         assertThat(actual[AppAccessState.Write]).isNotNull()
         assertThat(actual[AppAccessState.Write]!!.size).isEqualTo(0)
         assertThat(actual[AppAccessState.Read]).isNotNull()
         assertThat(actual[AppAccessState.Read]!!.size).isEqualTo(1)
-        assertThat(actual[AppAccessState.Read]!![0].appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(actual[AppAccessState.Read]!![0].appMetadata.packageName)
+            .isEqualTo(TEST_APP_PACKAGE_NAME)
         assertThat(actual[AppAccessState.Read]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME)
-        assertThat(actual[AppAccessState.Read]!![0].appPermissionsType).isEqualTo(COMBINED_PERMISSIONS)
+        assertThat(actual[AppAccessState.Read]!![0].appPermissionsType)
+            .isEqualTo(COMBINED_PERMISSIONS)
         assertThat(actual[AppAccessState.Inactive]).isNotNull()
         assertThat(actual[AppAccessState.Inactive]!!.size).isEqualTo(0)
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun medicalData_immunizationAndAllMedicalData_returnsCorrectApps() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
         fakeLoadFitnessTypeContributorAppsUseCase.updateList(listOf(TEST_APP_2))
         fakeLoadMedicalTypeContributorAppsUseCase.updateList(listOf(TEST_APP))
         val steps =
-                FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.WRITE).toString()
+            FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.WRITE).toString()
         val immunization =
-                HealthPermission.MedicalPermission(MedicalPermissionType.IMMUNIZATION).toString()
+            HealthPermission.MedicalPermission(MedicalPermissionType.VACCINES).toString()
         val allMedicalData =
-                HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA).toString()
+            HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA).toString()
         fakeGetGrantedHealthPermissionsUseCase.updateData(
-                TEST_APP_PACKAGE_NAME, listOf(steps, immunization, allMedicalData))
+            TEST_APP_PACKAGE_NAME,
+            listOf(steps, immunization, allMedicalData),
+        )
 
-        val actual = (useCase.invoke(MedicalPermissionType.IMMUNIZATION) as UseCaseResults.Success).data
+        val actual =
+            (useCase.invoke(MedicalPermissionType.VACCINES) as UseCaseResults.Success).data
 
         assertThat(actual[AppAccessState.Write]).isNotNull()
         assertThat(actual[AppAccessState.Write]!!.size).isEqualTo(1)
-        assertThat(actual[AppAccessState.Write]!![0].appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(actual[AppAccessState.Write]!![0].appMetadata.packageName)
+            .isEqualTo(TEST_APP_PACKAGE_NAME)
         assertThat(actual[AppAccessState.Write]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME)
-        assertThat(actual[AppAccessState.Write]!![0].appPermissionsType).isEqualTo(COMBINED_PERMISSIONS)
+        assertThat(actual[AppAccessState.Write]!![0].appPermissionsType)
+            .isEqualTo(COMBINED_PERMISSIONS)
         assertThat(actual[AppAccessState.Read]).isNotNull()
         assertThat(actual[AppAccessState.Read]!!.size).isEqualTo(1)
-        assertThat(actual[AppAccessState.Read]!![0].appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(actual[AppAccessState.Read]!![0].appMetadata.packageName)
+            .isEqualTo(TEST_APP_PACKAGE_NAME)
         assertThat(actual[AppAccessState.Read]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME)
-        assertThat(actual[AppAccessState.Read]!![0].appPermissionsType).isEqualTo(COMBINED_PERMISSIONS)
+        assertThat(actual[AppAccessState.Read]!![0].appPermissionsType)
+            .isEqualTo(COMBINED_PERMISSIONS)
         assertThat(actual[AppAccessState.Inactive]).isNotNull()
         assertThat(actual[AppAccessState.Inactive]!!.size).isEqualTo(0)
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun medicalData_writeAllMedicalData_returnsCorrectApps() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
         fakeLoadFitnessTypeContributorAppsUseCase.updateList(listOf(TEST_APP_2))
         fakeLoadMedicalTypeContributorAppsUseCase.updateList(listOf(TEST_APP))
         val steps =
-                FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.WRITE).toString()
+            FitnessPermission(FitnessPermissionType.STEPS, PermissionsAccessType.WRITE).toString()
         val allMedicalData =
-                HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA).toString()
+            HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA).toString()
         fakeGetGrantedHealthPermissionsUseCase.updateData(
-                TEST_APP_PACKAGE_NAME, listOf(steps, allMedicalData))
+            TEST_APP_PACKAGE_NAME,
+            listOf(steps, allMedicalData),
+        )
 
-        val actual = (useCase.invoke(MedicalPermissionType.ALL_MEDICAL_DATA) as UseCaseResults.Success).data
+        val actual =
+            (useCase.invoke(MedicalPermissionType.ALL_MEDICAL_DATA) as UseCaseResults.Success).data
 
         assertThat(actual[AppAccessState.Write]).isNotNull()
         assertThat(actual[AppAccessState.Write]!!.size).isEqualTo(1)
-        assertThat(actual[AppAccessState.Write]!![0].appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(actual[AppAccessState.Write]!![0].appMetadata.packageName)
+            .isEqualTo(TEST_APP_PACKAGE_NAME)
         assertThat(actual[AppAccessState.Write]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME)
-        assertThat(actual[AppAccessState.Write]!![0].appPermissionsType).isEqualTo(COMBINED_PERMISSIONS)
+        assertThat(actual[AppAccessState.Write]!![0].appPermissionsType)
+            .isEqualTo(COMBINED_PERMISSIONS)
         assertThat(actual[AppAccessState.Read]).isNotNull()
         assertThat(actual[AppAccessState.Read]!!.size).isEqualTo(0)
         assertThat(actual[AppAccessState.Inactive]).isNotNull()
@@ -250,12 +273,13 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun medicalData_immunizationInactive_returnsCorrectApps() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
         fakeLoadFitnessTypeContributorAppsUseCase.updateList(listOf(TEST_APP_2))
         fakeLoadMedicalTypeContributorAppsUseCase.updateList(listOf(TEST_APP))
 
-        val actual = (useCase.invoke(MedicalPermissionType.IMMUNIZATION) as UseCaseResults.Success).data
+        val actual =
+            (useCase.invoke(MedicalPermissionType.VACCINES) as UseCaseResults.Success).data
 
         assertThat(actual[AppAccessState.Write]).isNotNull()
         assertThat(actual[AppAccessState.Write]!!.size).isEqualTo(0)
@@ -263,7 +287,9 @@
         assertThat(actual[AppAccessState.Read]!!.size).isEqualTo(0)
         assertThat(actual[AppAccessState.Inactive]).isNotNull()
         assertThat(actual[AppAccessState.Inactive]!!.size).isEqualTo(1)
-        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
-        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.appName).isEqualTo(TEST_APP_NAME)
+        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.packageName)
+            .isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(actual[AppAccessState.Inactive]!![0].appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME)
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/access/LoadMedicalTypeContributorAppsUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/access/LoadMedicalTypeContributorAppsUseCaseTest.kt
index 44207da..0512f15 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/access/LoadMedicalTypeContributorAppsUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/access/LoadMedicalTypeContributorAppsUseCaseTest.kt
@@ -17,11 +17,19 @@
 
 import android.content.Context
 import android.health.connect.HealthConnectManager
+import android.health.connect.MedicalResourceTypeInfo
+import android.health.connect.datatypes.MedicalResource
+import android.os.OutcomeReceiver
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.access.LoadMedicalTypeContributorAppsUseCase
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_2
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE_2
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE_DIFFERENT_APP
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -31,8 +39,10 @@
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+import org.mockito.ArgumentMatchers
 import org.mockito.Mockito
 import org.mockito.MockitoAnnotations
+import org.mockito.invocation.InvocationOnMock
 
 @HiltAndroidTest
 class LoadMedicalTypeContributorAppsUseCaseTest {
@@ -43,7 +53,7 @@
     private val healthConnectManager: HealthConnectManager =
         Mockito.mock(HealthConnectManager::class.java)
     private lateinit var loadMedicalTypeContributorAppsUseCase:
-            LoadMedicalTypeContributorAppsUseCase
+        LoadMedicalTypeContributorAppsUseCase
 
     @Inject lateinit var appInfoReader: AppInfoReader
 
@@ -54,20 +64,75 @@
         hiltRule.inject()
         loadMedicalTypeContributorAppsUseCase =
             LoadMedicalTypeContributorAppsUseCase(
-                appInfoReader, healthConnectManager, Dispatchers.Main)
+                appInfoReader,
+                healthConnectManager,
+                Dispatchers.Main,
+            )
     }
 
     @Test
-    fun immunization_returnsEmptyMap() = runTest {
-        val result = loadMedicalTypeContributorAppsUseCase.invoke(MedicalPermissionType.IMMUNIZATION)
+    fun whenNoData_returnsEmptyMap() = runTest {
+        Mockito.doAnswer(prepareAnswer(listOf()))
+            .`when`(healthConnectManager)
+            .queryAllMedicalResourceTypeInfos(ArgumentMatchers.any(), ArgumentMatchers.any())
+        val result =
+            loadMedicalTypeContributorAppsUseCase.invoke(MedicalPermissionType.VACCINES)
         val expected = listOf<AppMetadata>()
         assertThat(result).isEqualTo(expected)
     }
 
     @Test
-    fun allMedicalData_returnsEmptyMap() = runTest {
-        val result = loadMedicalTypeContributorAppsUseCase.invoke(MedicalPermissionType.ALL_MEDICAL_DATA)
-        val expected = listOf<AppMetadata>()
-        assertThat(result).isEqualTo(expected)
+    fun whenOneContributingPackage_returnsCorrectApp() = runTest {
+        val medicalResourceTypeInfos =
+            listOf(
+                MedicalResourceTypeInfo(
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
+                    setOf(TEST_MEDICAL_DATA_SOURCE, TEST_MEDICAL_DATA_SOURCE_2),
+                ),
+                MedicalResourceTypeInfo(
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS,
+                    setOf(TEST_MEDICAL_DATA_SOURCE_2, TEST_MEDICAL_DATA_SOURCE_DIFFERENT_APP),
+                ),
+            )
+        Mockito.doAnswer(prepareAnswer(medicalResourceTypeInfos))
+            .`when`(healthConnectManager)
+            .queryAllMedicalResourceTypeInfos(ArgumentMatchers.any(), ArgumentMatchers.any())
+        val result =
+            loadMedicalTypeContributorAppsUseCase.invoke(MedicalPermissionType.VACCINES)
+        assertThat(result.size).isEqualTo(1)
+        assertThat(result[0].packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+    }
+
+    @Test
+    fun whenMultipleContributingPackages_returnsCorrectApps() = runTest {
+        val medicalResourceTypeInfos =
+            listOf(
+                MedicalResourceTypeInfo(
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
+                    setOf(TEST_MEDICAL_DATA_SOURCE, TEST_MEDICAL_DATA_SOURCE_2),
+                ),
+                MedicalResourceTypeInfo(
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS,
+                    setOf(TEST_MEDICAL_DATA_SOURCE_2, TEST_MEDICAL_DATA_SOURCE_DIFFERENT_APP),
+                ),
+            )
+        Mockito.doAnswer(prepareAnswer(medicalResourceTypeInfos))
+            .`when`(healthConnectManager)
+            .queryAllMedicalResourceTypeInfos(ArgumentMatchers.any(), ArgumentMatchers.any())
+        val result = loadMedicalTypeContributorAppsUseCase.invoke(MedicalPermissionType.MEDICATIONS)
+        assertThat(result.size).isEqualTo(2)
+        assertThat(result[0].packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(result[1].packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+    }
+
+    private fun prepareAnswer(
+        medicalResourceTypeInfos: List<MedicalResourceTypeInfo>
+    ): (InvocationOnMock) -> List<MedicalResourceTypeInfo> {
+        val answer = { args: InvocationOnMock ->
+            val receiver = args.arguments[1] as OutcomeReceiver<Any?, *>
+            receiver.onResult(medicalResourceTypeInfos)
+            medicalResourceTypeInfos
+        }
+        return answer
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/alldata/AllDataFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/alldata/AllDataFragmentTest.kt
index f5dc1c5..f29dc87 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/alldata/AllDataFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/alldata/AllDataFragmentTest.kt
@@ -43,13 +43,13 @@
 import com.android.healthconnect.controller.data.alldata.AllDataFragment
 import com.android.healthconnect.controller.data.alldata.AllDataFragment.Companion.IS_BROWSE_MEDICAL_DATA_SCREEN
 import com.android.healthconnect.controller.data.alldata.AllDataViewModel
-import com.android.healthconnect.controller.data.alldata.AllDataViewModel.AllDataDeletionScreenState.DELETE
-import com.android.healthconnect.controller.data.appdata.AppDataUseCase
+import com.android.healthconnect.controller.data.appdata.AllDataUseCase
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
-import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.ALLERGY_INTOLERANCE
-import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.IMMUNIZATION
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.ALLERGIES_INTOLERANCES
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.VACCINES
 import com.android.healthconnect.controller.permissions.data.toMedicalResourceType
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState.DELETE
 import com.android.healthconnect.controller.selectabledeletion.DeletionPermissionTypesPreference
 import com.android.healthconnect.controller.selectabledeletion.SelectAllCheckboxPreference
 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.fromFitnessPermissionType
@@ -96,11 +96,12 @@
 class AllDataFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
+
     var manager: HealthConnectManager = Mockito.mock(HealthConnectManager::class.java)
 
-    private val appDataUseCase: AppDataUseCase = AppDataUseCase(manager, Dispatchers.Main)
+    private val allDataUseCase: AllDataUseCase = AllDataUseCase(manager, Dispatchers.Main)
 
-    @BindValue val allDataViewModel: AllDataViewModel = AllDataViewModel(appDataUseCase)
+    @BindValue val allDataViewModel: AllDataViewModel = AllDataViewModel(allDataUseCase)
     @BindValue val healthConnectLogger: HealthConnectLogger = mock()
     private lateinit var navHostController: TestNavHostController
     private lateinit var context: Context
@@ -143,15 +144,26 @@
     }
 
     @Test
+    fun populatedMedicalData_pageImpressionLogged() {
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
+
+        launchMedicalAllDataFragment()
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.ALL_MEDICAL_DATA_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+    }
+
+    @Test
     fun medicalDataPresent_populatedDataTypesDisplayed() {
-        mockData(listOf(IMMUNIZATION, ALLERGY_INTOLERANCE), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
 
         launchMedicalAllDataFragment()
 
         onView(withText("Allergies")).check(matches(isDisplayed()))
-        onView(withText("Immunization")).check(matches(isDisplayed()))
+        onView(withText("Vaccines")).check(matches(isDisplayed()))
         onView(withText("Distance")).check(doesNotExist())
         onView(withText("No data")).check(doesNotExist())
+        onView(withText("Select all")).check(doesNotExist())
     }
 
     @Test
@@ -161,7 +173,47 @@
         launchFragment<AllDataFragment>()
 
         onView(withText("No data")).check(matches(isDisplayed()))
-        onView(withText("Data from apps with access to Health Connect will show here"))
+        onView(withText("Data from apps with access to Health\u00A0Connect will show here"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "This includes all the health records synced to and added to Health\u00A0Connect. This might not be your full medical record and does not include a medical description of your health records."
+                )
+            )
+            .check(doesNotExist())
+    }
+
+    @Test
+    fun whenFitnessDataTypesDisplayed_topIntroNotShown() {
+        mockData(
+            listOf(
+                FitnessPermissionType.STEPS,
+                FitnessPermissionType.HEART_RATE,
+                FitnessPermissionType.BASAL_BODY_TEMPERATURE,
+            )
+        )
+
+        launchFragment<AllDataFragment>()
+
+        onView(
+                withText(
+                    "This includes all the health records synced to and added to Health\u00A0Connect. This might not be your full medical record and does not include a medical description of your health records."
+                )
+            )
+            .check(doesNotExist())
+    }
+
+    @Test
+    fun whenMedicalDataTypesDisplayed_topIntroShown() {
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
+
+        launchMedicalAllDataFragment()
+
+        onView(
+                withText(
+                    "This includes all the health records synced to and added to Health\u00A0Connect. This might not be your full medical record and does not include a medical description of your health records."
+                )
+            )
             .check(matches(isDisplayed()))
     }
 
@@ -184,16 +236,17 @@
 
     @Test
     fun navigatesToMedicalAllEntries() {
-        mockData(listOf(IMMUNIZATION), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES), setOf(TEST_MEDICAL_DATA_SOURCE))
 
         launchFragment<AllDataFragment>(bundleOf(IS_BROWSE_MEDICAL_DATA_SCREEN to true)) {
             navHostController.setGraph(R.navigation.medical_data_nav_graph)
             Navigation.setViewNavController(this.requireView(), navHostController)
         }
 
-        onView(withText("Immunization")).check(matches(isDisplayed()))
-        onView(withText("Immunization")).perform(click())
-        // TODO(b/342159144): Test interaction log.
+        onView(withText("Vaccines")).check(matches(isDisplayed()))
+        onView(withText("Vaccines")).perform(click())
+        verify(healthConnectLogger)
+            .logInteraction(AllDataElement.PERMISSION_TYPE_BUTTON_NO_CHECKBOX)
         assertThat(navHostController.currentDestination?.id)
             .isEqualTo(R.id.entriesAndAccessFragment)
     }
@@ -222,10 +275,10 @@
 
     @Test
     fun triggerDeletionState_medicalData_showsCheckboxes() {
-        mockData(listOf(IMMUNIZATION, ALLERGY_INTOLERANCE), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
         val scenario = launchMedicalAllDataFragment()
         assertCheckboxNotShown("Allergies")
-        assertCheckboxNotShown("Immunization")
+        assertCheckboxNotShown("Vaccines")
 
         scenario.onActivity { activity ->
             val fragment = activity.supportFragmentManager.findFragmentByTag("")
@@ -233,7 +286,7 @@
         }
 
         assertCheckboxShown("Allergies")
-        assertCheckboxShown("Immunization")
+        assertCheckboxShown("Vaccines")
         verify(healthConnectLogger).logImpression(AllDataElement.SELECT_ALL_BUTTON)
         verify(healthConnectLogger, atLeast(2))
             .logImpression(AllDataElement.PERMISSION_TYPE_BUTTON_WITH_CHECKBOX)
@@ -261,7 +314,7 @@
 
     @Test
     fun inDeletionState_medicalData_checkedItemsAddedToDeleteSet() {
-        mockData(listOf(IMMUNIZATION, ALLERGY_INTOLERANCE), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
 
         val scenario = launchMedicalAllDataFragment()
         scenario.onActivity { activity ->
@@ -269,13 +322,13 @@
             (fragment as AllDataFragment).triggerDeletionState(DELETE)
         }
 
-        onView(withText("Immunization")).perform(click())
+        onView(withText("Vaccines")).perform(click())
         onIdle()
         assertThat(allDataViewModel.setOfPermissionTypesToBeDeleted.value)
-            .containsExactlyElementsIn(setOf(IMMUNIZATION))
+            .containsExactlyElementsIn(setOf(VACCINES))
         verify(healthConnectLogger)
             .logInteraction(AllDataElement.PERMISSION_TYPE_BUTTON_WITH_CHECKBOX)
-        onView(withText("Immunization")).perform(click())
+        onView(withText("Vaccines")).perform(click())
         assertThat(allDataViewModel.setOfPermissionTypesToBeDeleted.value).isEmpty()
     }
 
@@ -339,11 +392,17 @@
         }
 
         assertCheckboxShown("Select all")
+        onView(
+                withText(
+                    "This includes all the health records synced to and added to Health\u00A0Connect. This might not be your full medical record and does not include a medical description of your health records."
+                )
+            )
+            .check(doesNotExist())
     }
 
     @Test
     fun triggerDeletionState_medicalData_displaysSelectAllButton() {
-        mockData(listOf(IMMUNIZATION, ALLERGY_INTOLERANCE), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
         val scenario = launchMedicalAllDataFragment()
 
         scenario.onActivity { activity ->
@@ -377,7 +436,7 @@
 
     @Test
     fun inDeletionState_medicalData_onSelectAllChecked_allPermissionTypesChecked() = runTest {
-        mockData(listOf(IMMUNIZATION, ALLERGY_INTOLERANCE), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
 
         val scenario = launchMedicalAllDataFragment()
         scenario.onActivity { activity ->
@@ -390,7 +449,7 @@
         assertCheckboxShown("Select all")
         onView(withText("Select all")).perform(click())
         assertThat(allDataViewModel.setOfPermissionTypesToBeDeleted.value)
-            .containsExactlyElementsIn(setOf(IMMUNIZATION, ALLERGY_INTOLERANCE))
+            .containsExactlyElementsIn(setOf(VACCINES, ALLERGIES_INTOLERANCES))
         verify(healthConnectLogger).logInteraction(AllDataElement.SELECT_ALL_BUTTON)
     }
 
@@ -418,7 +477,7 @@
 
     @Test
     fun inDeletionState_medicalData_onSelectAllUnchecked_allPermissionTypesUnChecked() = runTest {
-        mockData(listOf(IMMUNIZATION, ALLERGY_INTOLERANCE), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
 
         val scenario = launchMedicalAllDataFragment()
         scenario.onActivity { activity ->
@@ -431,7 +490,7 @@
         assertCheckboxShown("Select all")
         onView(withText("Select all")).perform(click())
         assertThat(allDataViewModel.setOfPermissionTypesToBeDeleted.value)
-            .containsExactlyElementsIn(setOf(IMMUNIZATION, ALLERGY_INTOLERANCE))
+            .containsExactlyElementsIn(setOf(VACCINES, ALLERGIES_INTOLERANCES))
         onView(withText("Select all")).perform(click())
         assertThat(allDataViewModel.setOfPermissionTypesToBeDeleted.value).isEmpty()
     }
@@ -461,7 +520,7 @@
 
     @Test
     fun inDeletionState_medicalData_allPermissionTypesChecked_selectAllShouldBeChecked() {
-        mockData(listOf(IMMUNIZATION, ALLERGY_INTOLERANCE), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
 
         val scenario = launchMedicalAllDataFragment()
         scenario.onActivity { activity ->
@@ -470,9 +529,9 @@
         }
 
         assertCheckboxShown("Allergies")
-        assertCheckboxShown("Immunization")
+        assertCheckboxShown("Vaccines")
         onView(withText("Allergies")).perform(click())
-        onView(withText("Immunization")).perform(click())
+        onView(withText("Vaccines")).perform(click())
         scenario.onActivity { activity ->
             val fragment = activity.supportFragmentManager.findFragmentByTag("") as AllDataFragment
             val selectAllCheckboxPreference =
@@ -508,7 +567,7 @@
 
     @Test
     fun inDeletionState_medicalData_selectAllChecked_oneUnchecked_selectAllUnchecked() = runTest {
-        mockData(listOf(IMMUNIZATION, ALLERGY_INTOLERANCE), setOf(TEST_MEDICAL_DATA_SOURCE))
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
 
         val scenario = launchMedicalAllDataFragment()
         scenario.onActivity { activity ->
@@ -566,6 +625,56 @@
         }
         assertCheckboxShown("Distance")
         assertCheckboxShown("Heart rate")
+        onView(
+                withText(
+                    "This includes all the health records synced to and added to Health\u00A0Connect. This might not be your full medical record and does not include a medical description of your health records."
+                )
+            )
+            .check(doesNotExist())
+    }
+
+    @Test
+    fun inDeletionState_medicalData_checkboxesRemainOnOrientationChange() = runTest {
+        mockData(listOf(VACCINES, ALLERGIES_INTOLERANCES), setOf(TEST_MEDICAL_DATA_SOURCE))
+
+        val scenario = launchMedicalAllDataFragment()
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AllDataFragment).triggerDeletionState(DELETE)
+        }
+
+        advanceUntilIdle()
+
+        assertCheckboxShown("Select all")
+        onView(withText("Select all")).perform(click())
+
+        scenario.recreate()
+
+        onView(withText("Select all")).perform(scrollTo())
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("") as AllDataFragment
+            val selectAllCheckboxPreference =
+                fragment.preferenceScreen.findPreference("key_select_all")
+                    as SelectAllCheckboxPreference?
+            assertThat(selectAllCheckboxPreference?.getIsChecked()).isTrue()
+            fragment.preferenceScreen.children.forEach { preference ->
+                if (preference is PreferenceCategory) {
+                    preference.children.forEach { permissionTypePreference ->
+                        if (permissionTypePreference is DeletionPermissionTypesPreference) {
+                            assertThat(permissionTypePreference.getIsChecked()).isTrue()
+                        }
+                    }
+                }
+            }
+        }
+        assertCheckboxShown("Allergies")
+        assertCheckboxShown("Vaccines")
+        onView(
+                withText(
+                    "This includes all the health records synced to and added to Health\u00A0Connect. This might not be your full medical record and does not include a medical description of your health records."
+                )
+            )
+            .check(doesNotExist())
     }
 
     private fun assertCheckboxShown(title: String, tag: String = "checkbox") {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/alldata/AllDataViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/alldata/AllDataViewModelTest.kt
index 7a2f883..3fcf1d8 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/alldata/AllDataViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/alldata/AllDataViewModelTest.kt
@@ -22,18 +22,19 @@
 import android.health.connect.MedicalResourceTypeInfo
 import android.health.connect.RecordTypeInfoResponse
 import android.health.connect.datatypes.HeartRateRecord
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
 import android.health.connect.datatypes.Record
 import android.health.connect.datatypes.StepsRecord
 import android.health.connect.datatypes.WeightRecord
 import android.os.OutcomeReceiver
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.alldata.AllDataViewModel
-import com.android.healthconnect.controller.data.appdata.AppDataUseCase
+import com.android.healthconnect.controller.data.appdata.AllDataUseCase
 import com.android.healthconnect.controller.data.appdata.PermissionTypesPerCategory
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel
 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.MEDICAL
 import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
@@ -86,7 +87,7 @@
         context.setLocale(Locale.US)
         hiltRule.inject()
         Dispatchers.setMain(testDispatcher)
-        viewModel = AllDataViewModel(AppDataUseCase(manager, Dispatchers.Main))
+        viewModel = AllDataViewModel(AllDataUseCase(manager, Dispatchers.Main))
     }
 
     @After
@@ -184,8 +185,11 @@
         doAnswer(
                 prepareAnswer(
                     listOf(
-                        MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, setOf()),
-                        MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE, setOf()),
+                        MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, setOf()),
+                        MedicalResourceTypeInfo(
+                            MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                            setOf(),
+                        ),
                     )
                 )
             )
@@ -207,10 +211,10 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(TEST_MEDICAL_DATA_SOURCE),
                 ),
-                MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE, setOf()),
+                MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES, setOf()),
             )
         doAnswer(prepareAnswer(medicalResourceTypeResources))
             .`when`(manager)
@@ -222,51 +226,16 @@
         advanceUntilIdle()
 
         val expected =
-            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.IMMUNIZATION)))
+            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.VACCINES)))
         assertThat(testObserver.getLastValue())
             .isEqualTo(AllDataViewModel.AllDataState.WithData(expected))
     }
 
     @Test
-    fun isAnyMedicalData_noMedicalData_returnsFalse() = runTest {
-        doAnswer(prepareAnswer(emptyMap()))
-            .`when`(manager)
-            .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
-
-        val testObserver = TestObserver<Boolean>()
-        viewModel.isAnyMedicalData.observeForever(testObserver)
-        viewModel.loadAllMedicalData()
-        advanceUntilIdle()
-
-        assertThat(testObserver.getLastValue()).isEqualTo(false)
-    }
-
-    @Test
-    fun isAnyMedicalData_hasMedicalData_returnsTrue() = runTest {
-        val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
-            listOf(
-                MedicalResourceTypeInfo(
-                    MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                    setOf(TEST_MEDICAL_DATA_SOURCE),
-                )
-            )
-        doAnswer(prepareAnswer(medicalResourceTypeResources))
-            .`when`(manager)
-            .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
-
-        val testObserver = TestObserver<Boolean>()
-        viewModel.isAnyMedicalData.observeForever(testObserver)
-        viewModel.loadAllMedicalData()
-        advanceUntilIdle()
-
-        assertThat(testObserver.getLastValue()).isEqualTo(true)
-    }
-
-    @Test
     fun addToDeleteSet_updatesDeleteSetCorrectly() = runTest {
         assertThat(viewModel.setOfPermissionTypesToBeDeleted.value.orEmpty()).isEmpty()
 
-        viewModel.addToDeleteSet(FitnessPermissionType.DISTANCE)
+        viewModel.addToDeletionSet(FitnessPermissionType.DISTANCE)
 
         assertThat(viewModel.setOfPermissionTypesToBeDeleted.value)
             .containsExactly(FitnessPermissionType.DISTANCE)
@@ -274,35 +243,35 @@
 
     @Test
     fun removeFromDeleteSet_updatesDeleteSetCorrectly() {
-        viewModel.addToDeleteSet(FitnessPermissionType.DISTANCE)
-        viewModel.addToDeleteSet(FitnessPermissionType.MENSTRUATION)
-        viewModel.removeFromDeleteSet(FitnessPermissionType.DISTANCE)
+        viewModel.addToDeletionSet(FitnessPermissionType.DISTANCE)
+        viewModel.addToDeletionSet(FitnessPermissionType.MENSTRUATION)
+        viewModel.removeFromDeletionSet(FitnessPermissionType.DISTANCE)
 
         assertThat(viewModel.setOfPermissionTypesToBeDeleted.value)
             .containsExactly(FitnessPermissionType.MENSTRUATION)
     }
 
     @Test
-    fun setScreenState_setsCorrectly() {
-        viewModel.setScreenState(AllDataViewModel.AllDataDeletionScreenState.DELETE)
+    fun setDeletionScreenState_setsCorrectly() {
+        viewModel.setDeletionScreenStateValue(DeletionDataViewModel.DeletionScreenState.DELETE)
 
-        assertThat(viewModel.getScreenState())
-            .isEqualTo(AllDataViewModel.AllDataDeletionScreenState.DELETE)
+        assertThat(viewModel.getDeletionScreenStateValue())
+            .isEqualTo(DeletionDataViewModel.DeletionScreenState.DELETE)
     }
 
     @Test
-    fun getScreenState_getsCorrectValue() {
-        viewModel.setScreenState(AllDataViewModel.AllDataDeletionScreenState.VIEW)
+    fun getDeletionScreenState_getsCorrectValue() {
+        viewModel.setDeletionScreenStateValue(DeletionDataViewModel.DeletionScreenState.VIEW)
 
-        assertThat(viewModel.getScreenState())
-            .isEqualTo(AllDataViewModel.AllDataDeletionScreenState.VIEW)
+        assertThat(viewModel.getDeletionScreenStateValue())
+            .isEqualTo(DeletionDataViewModel.DeletionScreenState.VIEW)
     }
 
     @Test
     fun resetDeleteSet_emptiesDeleteSet() {
-        viewModel.addToDeleteSet(FitnessPermissionType.MENSTRUATION)
-        viewModel.addToDeleteSet(FitnessPermissionType.DISTANCE)
-        viewModel.resetDeleteSet()
+        viewModel.addToDeletionSet(FitnessPermissionType.MENSTRUATION)
+        viewModel.addToDeletionSet(FitnessPermissionType.DISTANCE)
+        viewModel.resetDeletionSet()
 
         assertThat(viewModel.setOfPermissionTypesToBeDeleted.value).isEmpty()
     }
@@ -340,7 +309,7 @@
         viewModel.loadAllFitnessData()
         advanceUntilIdle()
 
-        assertThat(viewModel.getNumOfPermissionTypes()).isEqualTo(3)
+        assertThat(viewModel.getTheNumOfPermissionTypes()).isEqualTo(3)
     }
 
     private fun prepareAnswer(
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AllDataUseCaseTest.kt
similarity index 74%
rename from apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataUseCaseTest.kt
rename to apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AllDataUseCaseTest.kt
index 9624775..94a2ebd 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AllDataUseCaseTest.kt
@@ -28,7 +28,7 @@
 import android.health.connect.datatypes.WeightRecord
 import android.os.OutcomeReceiver
 import androidx.test.platform.app.InstrumentationRegistry
-import com.android.healthconnect.controller.data.appdata.AppDataUseCase
+import com.android.healthconnect.controller.data.appdata.AllDataUseCase
 import com.android.healthconnect.controller.data.appdata.PermissionTypesPerCategory
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
@@ -57,14 +57,14 @@
 import org.mockito.invocation.InvocationOnMock
 
 @HiltAndroidTest
-class AppDataUseCaseTest {
+class AllDataUseCaseTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
 
     private lateinit var context: Context
     private val healthConnectManager: HealthConnectManager =
         Mockito.mock(HealthConnectManager::class.java)
-    private lateinit var appDataUseCase: AppDataUseCase
+    private lateinit var allDataUseCase: AllDataUseCase
 
     @Inject lateinit var appInfoReader: AppInfoReader
 
@@ -73,7 +73,7 @@
         MockitoAnnotations.initMocks(this)
         context = InstrumentationRegistry.getInstrumentation().context
         hiltRule.inject()
-        appDataUseCase = AppDataUseCase(healthConnectManager, Dispatchers.Main)
+        allDataUseCase = AllDataUseCase(healthConnectManager, Dispatchers.Main)
     }
 
     @Test
@@ -126,7 +126,7 @@
                     },
                 )
             )
-        assertThat(appDataUseCase.loadFitnessAppData(TEST_APP_PACKAGE_NAME)).isEqualTo(expected)
+        assertThat(allDataUseCase.loadFitnessAppData(TEST_APP_PACKAGE_NAME)).isEqualTo(expected)
     }
 
     @Test
@@ -182,7 +182,7 @@
                     },
                 )
             )
-        assertThat(appDataUseCase.loadAllFitnessData()).isEqualTo(expected)
+        assertThat(allDataUseCase.loadAllFitnessData()).isEqualTo(expected)
     }
 
     @Test
@@ -194,21 +194,19 @@
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
+        val actual = allDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
         assertThat(actual).isEqualTo(Success(listOf<PermissionTypesPerCategory>()))
     }
 
     @Test
     fun loadMedicalAppData_noData_returnEmptyList() = runTest {
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
-            listOf(
-                MedicalResourceTypeInfo(MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION, setOf())
-            )
+            listOf(MedicalResourceTypeInfo(MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES, setOf()))
         Mockito.doAnswer(prepareAnswer(medicalResourceTypeResources))
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
+        val actual = allDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
         assertThat(actual).isEqualTo(Success(listOf<PermissionTypesPerCategory>()))
     }
 
@@ -217,7 +215,7 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(TEST_MEDICAL_DATA_SOURCE),
                 )
             )
@@ -225,9 +223,9 @@
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
+        val actual = allDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
         val expected =
-            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.IMMUNIZATION)))
+            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.VACCINES)))
         assertThat(actual).isEqualTo(Success(expected))
     }
 
@@ -236,7 +234,7 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(
                         TEST_MEDICAL_DATA_SOURCE,
                         TEST_MEDICAL_DATA_SOURCE_2,
@@ -248,9 +246,9 @@
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
+        val actual = allDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
         val expected =
-            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.IMMUNIZATION)))
+            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.VACCINES)))
         assertThat(actual).isEqualTo(Success(expected))
     }
 
@@ -259,7 +257,7 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(TEST_MEDICAL_DATA_SOURCE_DIFFERENT_APP),
                 )
             )
@@ -267,7 +265,7 @@
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
+        val actual = allDataUseCase.loadMedicalAppData(TEST_APP_PACKAGE_NAME)
         assertThat(actual).isEqualTo(Success(listOf<PermissionTypesPerCategory>()))
     }
 
@@ -280,21 +278,19 @@
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadAllMedicalData()
+        val actual = allDataUseCase.loadAllMedicalData()
         assertThat(actual).isEqualTo(Success(listOf<MedicalPermissionType>()))
     }
 
     @Test
     fun loadAllMedicalAppData_noData_returnEmptyList() = runTest {
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
-            listOf(
-                MedicalResourceTypeInfo(MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION, setOf())
-            )
+            listOf(MedicalResourceTypeInfo(MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES, setOf()))
         Mockito.doAnswer(prepareAnswer(medicalResourceTypeResources))
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadAllMedicalData()
+        val actual = allDataUseCase.loadAllMedicalData()
         assertThat(actual).isEqualTo(Success(listOf<MedicalPermissionType>()))
     }
 
@@ -303,7 +299,7 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(TEST_MEDICAL_DATA_SOURCE),
                 )
             )
@@ -311,9 +307,9 @@
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadAllMedicalData()
+        val actual = allDataUseCase.loadAllMedicalData()
         val expected =
-            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.IMMUNIZATION)))
+            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.VACCINES)))
         assertThat(actual).isEqualTo(Success(expected))
     }
 
@@ -322,7 +318,7 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(
                         TEST_MEDICAL_DATA_SOURCE,
                         TEST_MEDICAL_DATA_SOURCE_2,
@@ -334,12 +330,94 @@
             .`when`(healthConnectManager)
             .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
 
-        val actual = appDataUseCase.loadAllMedicalData()
+        val actual = allDataUseCase.loadAllMedicalData()
         val expected =
-            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.IMMUNIZATION)))
+            listOf(PermissionTypesPerCategory(MEDICAL, listOf(MedicalPermissionType.VACCINES)))
         assertThat(actual).isEqualTo(Success(expected))
     }
 
+    @Test
+    fun loadHasAnyFitnessData_noData_returnsFalse() = runTest {
+        val recordTypeInfoMap: Map<Class<out Record>, RecordTypeInfoResponse> =
+            mapOf(
+                StepsRecord::class.java to
+                    RecordTypeInfoResponse(
+                        HealthPermissionCategory.STEPS,
+                        HealthDataCategory.ACTIVITY,
+                        listOf(),
+                    ),
+                WeightRecord::class.java to
+                    RecordTypeInfoResponse(
+                        HealthPermissionCategory.WEIGHT,
+                        HealthDataCategory.BODY_MEASUREMENTS,
+                        listOf(),
+                    ),
+            )
+        Mockito.doAnswer(prepareAnswer(recordTypeInfoMap))
+            .`when`(healthConnectManager)
+            .queryAllRecordTypesInfo(Matchers.any(), Matchers.any())
+
+        assertThat(allDataUseCase.loadHasAnyFitnessData()).isEqualTo(Success(false))
+    }
+
+    @Test
+    fun loadHasAnyFitnessData_someData_returnsTrue() = runTest {
+        val recordTypeInfoMap: Map<Class<out Record>, RecordTypeInfoResponse> =
+            mapOf(
+                StepsRecord::class.java to
+                    RecordTypeInfoResponse(
+                        HealthPermissionCategory.STEPS,
+                        HealthDataCategory.ACTIVITY,
+                        listOf(getDataOrigin(TEST_APP_PACKAGE_NAME)),
+                    ),
+                WeightRecord::class.java to
+                    RecordTypeInfoResponse(
+                        HealthPermissionCategory.WEIGHT,
+                        HealthDataCategory.BODY_MEASUREMENTS,
+                        listOf(getDataOrigin(TEST_APP_PACKAGE_NAME)),
+                    ),
+            )
+        Mockito.doAnswer(prepareAnswer(recordTypeInfoMap))
+            .`when`(healthConnectManager)
+            .queryAllRecordTypesInfo(Matchers.any(), Matchers.any())
+
+        assertThat(allDataUseCase.loadHasAnyFitnessData()).isEqualTo(Success(true))
+    }
+
+    @Test
+    fun loadHasAnyMedicalAppData_noData_returnFalse() = runTest {
+        val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
+            listOf(
+                MedicalResourceTypeInfo(
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
+                    setOf(),
+                )
+            )
+        Mockito.doAnswer(prepareAnswer(medicalResourceTypeResources))
+            .`when`(healthConnectManager)
+            .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
+
+        val actual = allDataUseCase.loadHasAnyMedicalData()
+        assertThat(actual).isEqualTo(Success(false))
+    }
+
+    @Test
+    fun loadHasAnyMedicalAppData_hasData_returnTrue() = runTest {
+        val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
+            listOf(
+                MedicalResourceTypeInfo(
+                    MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
+                    setOf(TEST_MEDICAL_DATA_SOURCE),
+                )
+            )
+        Mockito.doAnswer(prepareAnswer(medicalResourceTypeResources))
+            .`when`(healthConnectManager)
+            .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
+
+        val actual = allDataUseCase.loadHasAnyMedicalData()
+        assertThat(actual).isEqualTo(Success(true))
+    }
+
     private fun prepareAnswer(
         map: Map<Class<out Record>, RecordTypeInfoResponse>
     ): (InvocationOnMock) -> Map<Class<out Record>, RecordTypeInfoResponse> {
@@ -354,12 +432,12 @@
     }
 
     private fun prepareAnswer(
-        MedicalResourceTypeInfo: List<MedicalResourceTypeInfo>
+        medicalResourceTypeInfos: List<MedicalResourceTypeInfo>
     ): (InvocationOnMock) -> List<MedicalResourceTypeInfo> {
         val answer = { args: InvocationOnMock ->
             val receiver = args.arguments[1] as OutcomeReceiver<Any?, *>
-            receiver.onResult(MedicalResourceTypeInfo)
-            MedicalResourceTypeInfo
+            receiver.onResult(medicalResourceTypeInfos)
+            medicalResourceTypeInfos
         }
         return answer
     }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataFragmentTest.kt
index 787cc91..9836534 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataFragmentTest.kt
@@ -21,7 +21,6 @@
 import android.health.connect.RecordTypeInfoResponse
 import android.health.connect.datatypes.Record
 import android.os.OutcomeReceiver
-import android.platform.test.annotations.DisableFlags
 import androidx.core.os.bundleOf
 import androidx.preference.PreferenceCategory
 import androidx.test.espresso.Espresso.onIdle
@@ -33,14 +32,14 @@
 import androidx.test.espresso.matcher.ViewMatchers
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.withText
+import com.android.healthconnect.controller.data.appdata.AllDataUseCase
 import com.android.healthconnect.controller.data.appdata.AppDataFragment
-import com.android.healthconnect.controller.data.appdata.AppDataUseCase
 import com.android.healthconnect.controller.data.appdata.AppDataViewModel
-import com.android.healthconnect.controller.data.appdata.AppDataViewModel.AppDataDeletionScreenState.DELETE
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.toMedicalResourceType
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState.DELETE
 import com.android.healthconnect.controller.selectabledeletion.DeletionPermissionTypesPreference
 import com.android.healthconnect.controller.selectabledeletion.SelectAllCheckboxPreference
 import com.android.healthconnect.controller.shared.Constants
@@ -56,7 +55,6 @@
 import com.android.healthconnect.controller.tests.utils.getDataOrigin
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -95,8 +93,8 @@
     fun setup() {
         hiltRule.inject()
         Dispatchers.setMain(testDispatcher)
-        val appDataUseCase = AppDataUseCase(manager, Dispatchers.Main)
-        appDataViewModel = AppDataViewModel(appInfoReader, appDataUseCase)
+        val allDataUseCase = AllDataUseCase(manager, Dispatchers.Main)
+        appDataViewModel = AppDataViewModel(appInfoReader, allDataUseCase)
         toggleAnimation(false)
     }
 
@@ -118,7 +116,7 @@
         )
 
         onView(withText("No data")).check(matches(isDisplayed()))
-        onView(withText("Data from apps with access to Health Connect will show here"))
+        onView(withText("Data from Health Connect test app will show here"))
             .check(matches(isDisplayed()))
     }
 
@@ -154,7 +152,9 @@
         onView(withText("Sleep")).check(doesNotExist())
         onView(withText("Vitals")).check(doesNotExist())
         onView(withText("Health records")).check(doesNotExist())
-        onView(withText("Immunizations")).check(doesNotExist())
+        onView(withText("Vaccines")).check(doesNotExist())
+        onView(withText("No data")).check(doesNotExist())
+        onView(withText("Data from Health Connect test app will show here")).check(doesNotExist())
     }
 
     @Test
@@ -163,7 +163,7 @@
             listOf(
                 FitnessPermissionType.DISTANCE,
                 FitnessPermissionType.EXERCISE,
-                MedicalPermissionType.IMMUNIZATION,
+                MedicalPermissionType.VACCINES,
             )
         )
 
@@ -179,16 +179,18 @@
         onView(withText("Exercise")).check(matches(isDisplayed()))
 
         onView(withText("Health records")).perform(scrollTo()).check(matches(isDisplayed()))
-        onView(withText("Immunization")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("Vaccines")).perform(scrollTo()).check(matches(isDisplayed()))
 
         onView(withText("Steps")).check(doesNotExist())
         onView(withText("Body measurements")).check(doesNotExist())
         onView(withText("Cycle tracking")).check(doesNotExist())
+        onView(withText("No data")).check(doesNotExist())
+        onView(withText("Data from Health Connect test app will show here")).check(doesNotExist())
     }
 
     @Test
     fun medicalDataOnly_populatedDataTypesDisplayed() = runTest {
-        mockData(listOf(MedicalPermissionType.IMMUNIZATION))
+        mockData(listOf(MedicalPermissionType.VACCINES))
         launchFragment<AppDataFragment>(
             bundleOf(
                 Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
@@ -200,14 +202,13 @@
         onView(withText("Distance")).check(doesNotExist())
 
         onView(withText("Health records")).perform(scrollTo()).check(matches(isDisplayed()))
-        onView(withText("Immunization")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("Vaccines")).perform(scrollTo()).check(matches(isDisplayed()))
 
         onView(withText("Body measurements")).check(doesNotExist())
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
     @Test
-    fun triggerDeletionState_showsCheckboxes() = runTest {
+    fun inDeletionState_showsCheckboxes() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.STEPS))
 
         val scenario =
@@ -230,7 +231,41 @@
         assertCheckboxShown("Steps")
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun inDeletionState_withMedicalData_showsCheckboxes() {
+        mockData(
+            listOf(
+                FitnessPermissionType.DISTANCE,
+                FitnessPermissionType.STEPS,
+                MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                MedicalPermissionType.VACCINES,
+            )
+        )
+
+        val scenario =
+            launchFragment<AppDataFragment>(
+                bundleOf(
+                    Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+
+        assertCheckboxNotShown("Distance")
+        assertCheckboxNotShown("Steps")
+        assertCheckboxNotShown("Allergies")
+        assertCheckboxNotShown("Vaccines")
+
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppDataFragment).triggerDeletionState(DELETE)
+        }
+
+        assertCheckboxShown("Allergies")
+        assertCheckboxShown("Vaccines")
+        assertCheckboxShown("Distance")
+        assertCheckboxShown("Steps")
+    }
+
     @Test
     fun inDeletionState_checkedItemsAddedToDeleteSet() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.STEPS))
@@ -255,7 +290,37 @@
         assertThat(appDataViewModel.setOfPermissionTypesToBeDeleted.value).isEmpty()
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun inDeletionState_withMedicalData_checkedItemsAddedToDeleteSet() {
+        mockData(
+            listOf(
+                FitnessPermissionType.DISTANCE,
+                FitnessPermissionType.STEPS,
+                MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                MedicalPermissionType.VACCINES,
+            )
+        )
+
+        val scenario =
+            launchFragment<AppDataFragment>(
+                bundleOf(
+                    Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppDataFragment).triggerDeletionState(DELETE)
+        }
+
+        onView(withText("Vaccines")).perform(click())
+        onIdle()
+        assertThat(appDataViewModel.setOfPermissionTypesToBeDeleted.value)
+            .containsExactlyElementsIn(setOf(MedicalPermissionType.VACCINES))
+        onView(withText("Vaccines")).perform(click())
+        assertThat(appDataViewModel.setOfPermissionTypesToBeDeleted.value).isEmpty()
+    }
+
     @Test
     fun inDeletionState_checkboxesRemainOnOrientationChange() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.STEPS))
@@ -306,9 +371,72 @@
         assertCheckboxShown("Steps")
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
     @Test
-    fun triggerDeletionState_displaysSelectAllButton() = runTest {
+    fun inDeletionState_withMedicalData_checkboxesRemainOnOrientationChange() = runTest {
+        mockData(
+            listOf(
+                FitnessPermissionType.DISTANCE,
+                FitnessPermissionType.STEPS,
+                MedicalPermissionType.PREGNANCY,
+            )
+        )
+
+        val scenario =
+            launchFragment<AppDataFragment>(
+                bundleOf(
+                    Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppDataFragment).triggerDeletionState(DELETE)
+        }
+
+        assertCheckboxShown("Distance")
+        assertCheckboxShown("Steps")
+        assertCheckboxShown("Pregnancy")
+        onView(withText("Distance")).perform(click())
+        onView(withText("Pregnancy")).perform(scrollTo()).perform(click())
+
+        scenario.recreate()
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+            val fitnessCategoryPreference =
+                fragment.preferenceScreen.findPreference("key_permission_types")
+                    as PreferenceCategory?
+            fitnessCategoryPreference?.children?.forEach { preference ->
+                if (preference is PreferenceCategory) {
+                    preference.children.forEach { permissionTypePreference ->
+                        if (permissionTypePreference is DeletionPermissionTypesPreference) {
+                            if (
+                                permissionTypePreference.getHealthPermissionType() ==
+                                    FitnessPermissionType.DISTANCE
+                            ) {
+                                assertThat(permissionTypePreference.getIsChecked()).isTrue()
+                            } else if (
+                                permissionTypePreference.getHealthPermissionType() ==
+                                    FitnessPermissionType.STEPS
+                            ) {
+                                assertThat(permissionTypePreference.getIsChecked()).isFalse()
+                            } else if (
+                                permissionTypePreference.getHealthPermissionType() ==
+                                    MedicalPermissionType.PREGNANCY
+                            ) {
+                                assertThat(permissionTypePreference.getIsChecked()).isTrue()
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        assertCheckboxShown("Distance")
+        assertCheckboxShown("Steps")
+        assertCheckboxShown("Pregnancy")
+    }
+
+    @Test
+    fun inDeletionState_displaysSelectAllButton() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.STEPS))
 
         val scenario =
@@ -326,7 +454,32 @@
         assertCheckboxShown("Select all")
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun inDeletionState_withMedicalData_displaysSelectAllButton() = runTest {
+        mockData(
+            listOf(
+                FitnessPermissionType.DISTANCE,
+                FitnessPermissionType.STEPS,
+                MedicalPermissionType.SOCIAL_HISTORY,
+                MedicalPermissionType.PROCEDURES,
+            )
+        )
+
+        val scenario =
+            launchFragment<AppDataFragment>(
+                bundleOf(
+                    Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppDataFragment).triggerDeletionState(DELETE)
+        }
+
+        assertCheckboxShown("Select all")
+    }
+
     @Test
     fun inDeletionState_onSelectAllChecked_allPermissionTypesChecked() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.STEPS))
@@ -398,7 +551,93 @@
             )
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun inDeletionState_withMedicalData_onSelectAllChecked_allPermissionTypesChecked() = runTest {
+        mockData(
+            listOf(
+                FitnessPermissionType.DISTANCE,
+                FitnessPermissionType.STEPS,
+                MedicalPermissionType.VITAL_SIGNS,
+                MedicalPermissionType.LABORATORY_RESULTS,
+            )
+        )
+        val scenario =
+            launchFragment<AppDataFragment>(
+                bundleOf(
+                    Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+            fragment.triggerDeletionState(DELETE)
+            val permissionTypesGroupPreference =
+                fragment.preferenceScreen.findPreference("key_permission_types")
+                    as EmptyPreferenceCategory?
+
+            permissionTypesGroupPreference?.children?.forEach { preference ->
+                if (preference is PreferenceCategory) {
+                    preference.children.forEach { permissionTypePreference ->
+                        if (permissionTypePreference is DeletionPermissionTypesPreference) {
+                            if (
+                                permissionTypePreference.getHealthPermissionType() in
+                                    listOf(
+                                        FitnessPermissionType.DISTANCE,
+                                        FitnessPermissionType.STEPS,
+                                        MedicalPermissionType.VITAL_SIGNS,
+                                        MedicalPermissionType.LABORATORY_RESULTS,
+                                    )
+                            ) {
+                                assertThat(permissionTypePreference.getIsChecked()).isFalse()
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        assertCheckboxShown("Select all")
+        onView(withText("Select all")).perform(click())
+        advanceUntilIdle()
+
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+            val permissionTypesGroupPreference =
+                fragment.preferenceScreen.findPreference("key_permission_types")
+                    as EmptyPreferenceCategory?
+
+            permissionTypesGroupPreference?.children?.forEach { preference ->
+                if (preference is PreferenceCategory) {
+                    preference.children.forEach { permissionTypePreference ->
+                        if (permissionTypePreference is DeletionPermissionTypesPreference) {
+                            if (
+                                permissionTypePreference.getHealthPermissionType() in
+                                    listOf(
+                                        FitnessPermissionType.DISTANCE,
+                                        FitnessPermissionType.STEPS,
+                                        MedicalPermissionType.VITAL_SIGNS,
+                                        MedicalPermissionType.LABORATORY_RESULTS,
+                                    )
+                            ) {
+                                assertThat(permissionTypePreference.getIsChecked()).isTrue()
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        assertThat(appDataViewModel.setOfPermissionTypesToBeDeleted.value)
+            .containsExactlyElementsIn(
+                setOf(
+                    FitnessPermissionType.DISTANCE,
+                    FitnessPermissionType.STEPS,
+                    MedicalPermissionType.LABORATORY_RESULTS,
+                    MedicalPermissionType.VITAL_SIGNS,
+                )
+            )
+    }
+
     @Test
     fun inDeletionState_onSelectAllUnchecked_allPermissionTypesUnchecked() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.STEPS))
@@ -448,7 +687,72 @@
         assertThat(appDataViewModel.setOfPermissionTypesToBeDeleted.value).isEmpty()
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun inDeletionState_withMedicalData_onSelectAllUnchecked_allPermissionTypesUnchecked() =
+        runTest {
+            mockData(
+                listOf(
+                    FitnessPermissionType.DISTANCE,
+                    FitnessPermissionType.STEPS,
+                    MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                    MedicalPermissionType.VACCINES,
+                )
+            )
+            val scenario =
+                launchFragment<AppDataFragment>(
+                    bundleOf(
+                        Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                        Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                    )
+                )
+            scenario.onActivity { activity ->
+                val fragment =
+                    activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+                fragment.triggerDeletionState(DELETE)
+            }
+            assertCheckboxShown("Select all")
+            onView(withText("Select all")).perform(click())
+            assertThat(appDataViewModel.setOfPermissionTypesToBeDeleted.value)
+                .containsExactlyElementsIn(
+                    setOf(
+                        FitnessPermissionType.DISTANCE,
+                        FitnessPermissionType.STEPS,
+                        MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                        MedicalPermissionType.VACCINES,
+                    )
+                )
+            onView(withText("Select all")).perform(click())
+
+            scenario.onActivity { activity ->
+                val fragment =
+                    activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+                val permissionTypesGroupPreference =
+                    fragment.preferenceScreen.findPreference("key_permission_types")
+                        as EmptyPreferenceCategory?
+
+                permissionTypesGroupPreference?.children?.forEach { preference ->
+                    if (preference is PreferenceCategory) {
+                        preference.children.forEach { permissionTypePreference ->
+                            if (permissionTypePreference is DeletionPermissionTypesPreference) {
+                                if (
+                                    permissionTypePreference.getHealthPermissionType() in
+                                        listOf(
+                                            FitnessPermissionType.DISTANCE,
+                                            FitnessPermissionType.STEPS,
+                                            MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                                            MedicalPermissionType.VACCINES,
+                                        )
+                                ) {
+                                    assertThat(permissionTypePreference.getIsChecked()).isFalse()
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            assertThat(appDataViewModel.setOfPermissionTypesToBeDeleted.value).isEmpty()
+        }
+
     @Test
     fun inDeletionState_selectAllChecked_checkboxesRemainOnOrientationChange() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.STEPS))
@@ -490,7 +794,59 @@
         assertCheckboxShown("Steps")
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun inDeletionState_withMedicalData_selectAllChecked_checkboxesRemainOnOrientationChange() =
+        runTest {
+            mockData(
+                listOf(
+                    FitnessPermissionType.DISTANCE,
+                    FitnessPermissionType.STEPS,
+                    MedicalPermissionType.VITAL_SIGNS,
+                    MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                )
+            )
+
+            val scenario =
+                launchFragment<AppDataFragment>(
+                    bundleOf(
+                        Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                        Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                    )
+                )
+            scenario.onActivity { activity ->
+                val fragment =
+                    activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+                fragment.triggerDeletionState(DELETE)
+            }
+
+            assertCheckboxShown("Select all")
+            onView(withText("Select all")).perform(click())
+
+            scenario.recreate()
+            onView(withText("Select all")).perform(scrollTo())
+            scenario.onActivity { activity ->
+                val fragment =
+                    activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+                val selectAllCheckboxPreference =
+                    fragment.preferenceScreen.findPreference("key_select_all")
+                        as SelectAllCheckboxPreference?
+                assertThat(selectAllCheckboxPreference?.getIsChecked()).isTrue()
+                fragment.preferenceScreen.children.forEach { preference ->
+                    if (preference is PreferenceCategory) {
+                        preference.children.forEach { permissionTypePreference ->
+                            if (permissionTypePreference is DeletionPermissionTypesPreference) {
+                                assertThat(permissionTypePreference.getIsChecked()).isTrue()
+                            }
+                        }
+                    }
+                }
+            }
+            assertCheckboxShown("Distance")
+            assertCheckboxShown("Steps")
+            assertCheckboxShown("Allergies")
+            assertCheckboxShown("Vital signs")
+        }
+
     @Test
     fun inDeletionState_selectAllChecked_oneUnchecked_selectAllUnchecked() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.MENSTRUATION))
@@ -519,7 +875,43 @@
         }
     }
 
-    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun inDeletionState_withMedicalData_selectAllChecked_oneUnchecked_selectAllUnchecked() =
+        runTest {
+            mockData(
+                listOf(
+                    FitnessPermissionType.DISTANCE,
+                    FitnessPermissionType.MENSTRUATION,
+                    MedicalPermissionType.PREGNANCY,
+                )
+            )
+
+            val scenario =
+                launchFragment<AppDataFragment>(
+                    bundleOf(
+                        Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                        Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                    )
+                )
+            scenario.onActivity { activity ->
+                val fragment =
+                    activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+                fragment.triggerDeletionState(DELETE)
+            }
+            advanceUntilIdle()
+            assertCheckboxShown("Select all")
+            onView(withText("Select all")).perform(click())
+            onView(withText("Pregnancy")).perform(click())
+            scenario.onActivity { activity ->
+                val fragment =
+                    activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+                val selectAllCheckboxPreference =
+                    fragment.preferenceScreen.findPreference("key_select_all")
+                        as SelectAllCheckboxPreference?
+                assertThat(selectAllCheckboxPreference?.getIsChecked()).isFalse()
+            }
+        }
+
     @Test
     fun inDeletionState_allPermissionTypesChecked_selectAllShouldBeChecked() = runTest {
         mockData(listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.MENSTRUATION))
@@ -550,6 +942,47 @@
         }
     }
 
+    @Test
+    fun inDeletionState_withMedicalData_allPermissionTypesChecked_selectAllShouldBeChecked() =
+        runTest {
+            mockData(
+                listOf(
+                    FitnessPermissionType.DISTANCE,
+                    FitnessPermissionType.MENSTRUATION,
+                    MedicalPermissionType.SOCIAL_HISTORY,
+                )
+            )
+
+            val scenario =
+                launchFragment<AppDataFragment>(
+                    bundleOf(
+                        Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                        Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                    )
+                )
+            scenario.onActivity { activity ->
+                val fragment =
+                    activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+                fragment.triggerDeletionState(DELETE)
+            }
+            advanceUntilIdle()
+
+            assertCheckboxShown("Distance")
+            assertCheckboxShown("Menstruation")
+            assertCheckboxShown("Social history")
+            onView(withText("Distance")).perform(click())
+            onView(withText("Menstruation")).perform(scrollTo()).perform(click())
+            onView(withText("Social history")).perform(scrollTo()).perform(click())
+            scenario.onActivity { activity ->
+                val fragment =
+                    activity.supportFragmentManager.findFragmentByTag("") as AppDataFragment
+                val selectAllCheckboxPreference =
+                    fragment.preferenceScreen.findPreference("key_select_all")
+                        as SelectAllCheckboxPreference?
+                assertThat(selectAllCheckboxPreference?.getIsChecked()).isTrue()
+            }
+        }
+
     private fun mockData(permissionTypesList: List<HealthPermissionType>) {
         val recordTypeInfoMap =
             permissionTypesList.filterIsInstance<FitnessPermissionType>().associate {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataViewModelTest.kt
index 5f78661..525feb4 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/appdata/AppDataViewModelTest.kt
@@ -22,17 +22,19 @@
 import android.health.connect.MedicalResourceTypeInfo
 import android.health.connect.RecordTypeInfoResponse
 import android.health.connect.datatypes.HeartRateRecord
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
 import android.health.connect.datatypes.Record
 import android.health.connect.datatypes.StepsRecord
 import android.health.connect.datatypes.WeightRecord
 import android.os.OutcomeReceiver
 import androidx.test.platform.app.InstrumentationRegistry
-import com.android.healthconnect.controller.data.appdata.AppDataUseCase
+import com.android.healthconnect.controller.data.appdata.AllDataUseCase
 import com.android.healthconnect.controller.data.appdata.AppDataViewModel
 import com.android.healthconnect.controller.data.appdata.PermissionTypesPerCategory
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
-import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.IMMUNIZATION
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.VACCINES
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState.DELETE
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel.DeletionScreenState.VIEW
 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.MEDICAL
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
@@ -89,7 +91,7 @@
         context.setLocale(Locale.US)
         hiltRule.inject()
         Dispatchers.setMain(testDispatcher)
-        viewModel = AppDataViewModel(appInfoReader, AppDataUseCase(manager, Dispatchers.Main))
+        viewModel = AppDataViewModel(appInfoReader, AllDataUseCase(manager, Dispatchers.Main))
     }
 
     @After
@@ -208,7 +210,7 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(TEST_MEDICAL_DATA_SOURCE),
                 )
             )
@@ -241,7 +243,7 @@
                 PermissionTypesPerCategory(HealthDataCategory.WELLNESS, listOf()).takeIf {
                     Flags.mindfulness()
                 },
-                PermissionTypesPerCategory(MEDICAL, listOf(IMMUNIZATION)),
+                PermissionTypesPerCategory(MEDICAL, listOf(VACCINES)),
             )
         assertThat(testObserver.getLastValue())
             .isEqualTo(AppDataViewModel.AppDataState.WithData(expected))
@@ -253,7 +255,7 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(TEST_MEDICAL_DATA_SOURCE),
                 )
             )
@@ -277,7 +279,7 @@
                 PermissionTypesPerCategory(HealthDataCategory.WELLNESS, listOf()).takeIf {
                     Flags.mindfulness()
                 },
-                PermissionTypesPerCategory(MEDICAL, listOf(IMMUNIZATION)),
+                PermissionTypesPerCategory(MEDICAL, listOf(VACCINES)),
             )
         assertThat(testObserver.getLastValue())
             .isEqualTo(AppDataViewModel.AppDataState.WithData(expected))
@@ -289,7 +291,7 @@
         val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
             listOf(
                 MedicalResourceTypeInfo(
-                    MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MEDICAL_RESOURCE_TYPE_VACCINES,
                     setOf(TEST_MEDICAL_DATA_SOURCE_DIFFERENT_APP),
                 )
             )
@@ -339,19 +341,17 @@
     }
 
     @Test
-    fun setDeletionState_setsCorrectly() {
-        viewModel.setDeletionState(AppDataViewModel.AppDataDeletionScreenState.DELETE)
+    fun setDeletionScreenState_setsCorrectly() {
+        viewModel.setDeletionScreenStateValue(DELETE)
 
-        assertThat(viewModel.getDeletionState())
-            .isEqualTo(AppDataViewModel.AppDataDeletionScreenState.DELETE)
+        assertThat(viewModel.getDeletionScreenStateValue()).isEqualTo(DELETE)
     }
 
     @Test
-    fun getDeletionState_getsCorrectValue() {
-        viewModel.setDeletionState(AppDataViewModel.AppDataDeletionScreenState.VIEW)
+    fun getDeletionScreenState_getsCorrectValue() {
+        viewModel.setDeletionScreenStateValue(VIEW)
 
-        assertThat(viewModel.getDeletionState())
-            .isEqualTo(AppDataViewModel.AppDataDeletionScreenState.VIEW)
+        assertThat(viewModel.getDeletionScreenStateValue()).isEqualTo(VIEW)
     }
 
     @Test
@@ -464,7 +464,7 @@
         viewModel.loadAppData(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
-        assertThat(viewModel.getNumOfPermissionTypes()).isEqualTo(3)
+        assertThat(viewModel.getTheNumOfPermissionTypes()).isEqualTo(3)
     }
 
     private fun prepareAnswer(
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/AllEntriesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/AllEntriesFragmentTest.kt
index 18d23ee..7d5bd55 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/AllEntriesFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/AllEntriesFragmentTest.kt
@@ -16,6 +16,11 @@
 package com.android.healthconnect.controller.tests.data.entries
 
 import android.content.Context
+import android.health.connect.datatypes.ExerciseSessionRecord
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.PlannedExerciseSessionRecord
+import android.health.connect.datatypes.SleepSessionRecord
+import android.health.connect.datatypes.StepsRecord
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MutableLiveData
 import androidx.test.espresso.Espresso.onIdle
@@ -45,7 +50,6 @@
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.SLEEP
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.STEPS
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
@@ -54,7 +58,12 @@
 import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION_3
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
+import com.android.healthconnect.controller.tests.utils.toggleAnimation
 import com.android.healthconnect.controller.tests.utils.withIndex
+import com.android.healthconnect.controller.utils.logging.AllEntriesElement
+import com.android.healthconnect.controller.utils.logging.DataEntriesElement
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -62,11 +71,17 @@
 import java.util.Locale
 import java.util.TimeZone
 import kotlinx.coroutines.test.runTest
+import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.atLeast
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.reset
+import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class AllEntriesFragmentTest {
@@ -75,19 +90,21 @@
 
     @BindValue val viewModel: EntriesViewModel = Mockito.mock(EntriesViewModel::class.java)
 
+    @BindValue val healthConnectLogger: HealthConnectLogger = mock()
+
     private lateinit var context: Context
 
     @Before
     fun setup() {
         hiltRule.inject()
+        toggleAnimation(false)
         context = InstrumentationRegistry.getInstrumentation().context
         context.setLocale(Locale.UK)
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
 
-        Mockito.`when`(viewModel.currentSelectedDate).thenReturn(MutableLiveData())
-        Mockito.`when`(viewModel.period)
-            .thenReturn(MutableLiveData(DateNavigationPeriod.PERIOD_DAY))
-        Mockito.`when`(viewModel.appInfo)
+        whenever(viewModel.currentSelectedDate).thenReturn(MutableLiveData())
+        whenever(viewModel.period).thenReturn(MutableLiveData(DateNavigationPeriod.PERIOD_DAY))
+        whenever(viewModel.appInfo)
             .thenReturn(
                 MutableLiveData(
                     AppMetadata(
@@ -97,26 +114,57 @@
                     )
                 )
             )
-        Mockito.`when`(viewModel.screenState)
+        whenever(viewModel.screenState)
             .thenReturn(MutableLiveData(EntriesViewModel.EntriesDeletionScreenState.VIEW))
-        Mockito.`when`(viewModel.mapOfEntriesToBeDeleted).thenReturn(MutableLiveData())
-        Mockito.`when`(viewModel.allEntriesSelected).thenReturn(MutableLiveData(false))
+        whenever(viewModel.mapOfEntriesToBeDeleted).thenReturn(MutableLiveData())
+        whenever(viewModel.allEntriesSelected).thenReturn(MutableLiveData(false))
+    }
+
+    @After
+    fun tearDown() {
+        toggleAnimation(true)
+        reset(healthConnectLogger)
     }
 
     @Test
     fun showsDateNavigationPreference() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
-        Mockito.`when`(viewModel.getEntriesList())
-            .thenReturn((FORMATTED_STEPS_LIST.toMutableList()))
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn((FORMATTED_STEPS_LIST.toMutableList()))
 
         launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
 
         onView(withId(R.id.date_picker_spinner)).check(matches(isDisplayed()))
+        verify(healthConnectLogger, atLeast(1))
+            .logImpression(AllEntriesElement.DATE_VIEW_SPINNER_DAY)
+        verify(healthConnectLogger).logImpression(DataEntriesElement.PREVIOUS_DAY_BUTTON)
+        verify(healthConnectLogger).logImpression(DataEntriesElement.NEXT_DAY_BUTTON)
+    }
+
+    @Test
+    fun fitnessData_logsFitnessPageImpression() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(Empty))
+
+        launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.TAB_ENTRIES_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+    }
+
+    @Test
+    fun medicalData_logsMedicalPageImpression() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(Empty))
+
+        launchFragment<AllEntriesFragment>(
+            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.VACCINES.name)
+        )
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.TAB_MEDICAL_ENTRIES_PAGE)
+        verify(healthConnectLogger).logPageImpression()
     }
 
     @Test
     fun whenNoData_showsNoData() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(Empty))
+        whenever(viewModel.entries).thenReturn(MutableLiveData(Empty))
 
         launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
 
@@ -125,7 +173,7 @@
 
     @Test
     fun whenError_showsErrorView() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(LoadingFailed))
+        whenever(viewModel.entries).thenReturn(MutableLiveData(LoadingFailed))
 
         launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
 
@@ -134,7 +182,7 @@
 
     @Test
     fun whenLoading_showsLoading() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(Loading))
+        whenever(viewModel.entries).thenReturn(MutableLiveData(Loading))
 
         launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
 
@@ -143,46 +191,48 @@
 
     @Test
     fun withSleepData_showsListOfEntries() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_SLEEP_LIST)))
-        Mockito.`when`(viewModel.getEntriesList()).thenReturn(FORMATTED_SLEEP_LIST.toMutableList())
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_SLEEP_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_SLEEP_LIST.toMutableList())
 
         launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to SLEEP.name))
 
         onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
         onView(withText("7 hours")).check(matches(isDisplayed()))
+
+        verify(healthConnectLogger).logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
     }
 
     @Test
     fun withHeartRateData_showsListOfEntries() {
-        Mockito.`when`(viewModel.entries)
-            .thenReturn(MutableLiveData(With(FORMATTED_HEART_RATE_LIST)))
-        Mockito.`when`(viewModel.getEntriesList())
-            .thenReturn(FORMATTED_HEART_RATE_LIST.toMutableList())
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_HEART_RATE_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_HEART_RATE_LIST.toMutableList())
 
         launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to HEART_RATE.name))
 
         onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
         onView(withText("128 - 140 bpm")).check(matches(isDisplayed()))
+        verify(healthConnectLogger).logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
     }
 
     @Test
     fun withExerciseData_showsListOfEntries() {
-        Mockito.`when`(viewModel.entries)
+        whenever(viewModel.entries)
             .thenReturn(MutableLiveData(With(FORMATTED_EXERCISE_SESSION_LIST)))
-        Mockito.`when`(viewModel.getEntriesList())
+        whenever(viewModel.getEntriesList())
             .thenReturn(FORMATTED_EXERCISE_SESSION_LIST.toMutableList())
 
         launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to EXERCISE.name))
 
         onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
         onView(withText("Biking")).check(matches(isDisplayed()))
+        verify(healthConnectLogger).logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
     }
 
     @Test
     fun withPlannedExerciseData_showsListOfEntries() {
-        Mockito.`when`(viewModel.entries)
+        whenever(viewModel.entries)
             .thenReturn(MutableLiveData(With(FORMATTED_PLANNED_EXERCISE_LIST)))
-        Mockito.`when`(viewModel.getEntriesList())
+        whenever(viewModel.getEntriesList())
             .thenReturn(FORMATTED_PLANNED_EXERCISE_LIST.toMutableList())
 
         launchFragment<AllEntriesFragment>(
@@ -191,12 +241,13 @@
 
         onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
         onView(withText("Workout")).check(matches(isDisplayed()))
+        verify(healthConnectLogger).logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
     }
 
     @Test
     fun withStepsData_showsListOfEntries() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
-        Mockito.`when`(viewModel.getEntriesList())
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.getEntriesList())
             .thenReturn(FORMATTED_PLANNED_EXERCISE_LIST.toMutableList())
 
         launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
@@ -205,12 +256,14 @@
         onView(withText("12 steps")).check(matches(isDisplayed()))
         onView(withText("8:06 - 8:06")).check(matches(isDisplayed()))
         onView(withText("15 steps")).check(matches(isDisplayed()))
+        verify(healthConnectLogger, times(2))
+            .logImpression(AllEntriesElement.ENTRY_BUTTON_NO_CHECKBOX)
     }
 
     @Test
     fun showsData_onOrientationChange() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
-        Mockito.`when`(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
 
         val scenario =
             launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
@@ -231,10 +284,10 @@
 
     @Test
     fun whenNoMedicalData_showsNoData() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(Empty))
+        whenever(viewModel.entries).thenReturn(MutableLiveData(Empty))
 
         launchFragment<AllEntriesFragment>(
-            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.IMMUNIZATION.name)
+            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.VACCINES.name)
         )
 
         onView(withId(R.id.no_data_view)).check(matches(isDisplayed()))
@@ -242,10 +295,10 @@
 
     @Test
     fun whenMedicalError_showsErrorView() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(LoadingFailed))
+        whenever(viewModel.entries).thenReturn(MutableLiveData(LoadingFailed))
 
         launchFragment<AllEntriesFragment>(
-            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.IMMUNIZATION.name)
+            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.VACCINES.name)
         )
 
         onView(withId(R.id.error_view)).check(matches(isDisplayed()))
@@ -253,10 +306,10 @@
 
     @Test
     fun whenMedicalLoading_showsLoading() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(Loading))
+        whenever(viewModel.entries).thenReturn(MutableLiveData(Loading))
 
         launchFragment<AllEntriesFragment>(
-            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.IMMUNIZATION.name)
+            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.VACCINES.name)
         )
 
         onView(withId(R.id.loading)).check(matches(isDisplayed()))
@@ -264,13 +317,11 @@
 
     @Test
     fun withMedicalData_showsListOfEntries() {
-        Mockito.`when`(viewModel.entries)
-            .thenReturn(MutableLiveData(With(FORMATTED_IMMUNIZATION_LIST)))
-        Mockito.`when`(viewModel.getEntriesList())
-            .thenReturn(FORMATTED_IMMUNIZATION_LIST.toMutableList())
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_IMMUNIZATION_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_IMMUNIZATION_LIST.toMutableList())
 
         launchFragment<AllEntriesFragment>(
-            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.IMMUNIZATION.name)
+            bundleOf(PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.VACCINES.name)
         )
 
         onView(withText("02 May 2023 • Health Connect Toolbox")).check(matches(isDisplayed()))
@@ -280,8 +331,8 @@
 
     @Test
     fun triggerDeletion_showsCheckboxes() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
-        Mockito.`when`(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
 
         val scenario =
             launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
@@ -297,10 +348,10 @@
 
     @Test
     fun inDeletion_checkboxesRemainOnOrientationChange() = runTest {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
-        Mockito.`when`(viewModel.screenState)
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.screenState)
             .thenReturn(MutableLiveData(EntriesViewModel.EntriesDeletionScreenState.DELETE))
-        Mockito.`when`(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
 
         val scenario =
             launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
@@ -321,9 +372,9 @@
 
     @Test
     fun inDeletion_checkedItemsAddedToDeleteSet() {
-        Mockito.`when`(viewModel.entries)
+        whenever(viewModel.entries)
             .thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST_WITH_AGGREGATION)))
-        Mockito.`when`(viewModel.getEntriesList())
+        whenever(viewModel.getEntriesList())
             .thenReturn(FORMATTED_STEPS_LIST_WITH_AGGREGATION.toMutableList())
 
         val scenario =
@@ -337,14 +388,14 @@
 
         onView(withText("12 steps")).perform(click())
         onIdle()
-        verify(viewModel).addToDeleteMap("test_id", DataType.STEPS)
+        verify(viewModel).addToDeleteMap("test_id", StepsRecord::class)
     }
 
     @Test
     fun triggerDeletion_displaysSelectAll() {
-        Mockito.`when`(viewModel.entries)
+        whenever(viewModel.entries)
             .thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST_WITH_AGGREGATION)))
-        Mockito.`when`(viewModel.getEntriesList())
+        whenever(viewModel.getEntriesList())
             .thenReturn(FORMATTED_STEPS_LIST_WITH_AGGREGATION.toMutableList())
 
         val scenario =
@@ -362,9 +413,9 @@
 
     @Test
     fun inDeletion_selectAllChecked_allEntriesChecked() {
-        Mockito.`when`(viewModel.entries)
+        whenever(viewModel.entries)
             .thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST_WITH_AGGREGATION)))
-        Mockito.`when`(viewModel.getEntriesList())
+        whenever(viewModel.getEntriesList())
             .thenReturn(FORMATTED_STEPS_LIST_WITH_AGGREGATION.toMutableList())
 
         val scenario =
@@ -378,21 +429,23 @@
 
         onView(withText("Select all")).perform(click())
         onIdle()
-        verify(viewModel).addToDeleteMap("test_id", DataType.STEPS)
-        verify(viewModel).addToDeleteMap("test_id_2", DataType.STEPS)
+        verify(viewModel).addToDeleteMap("test_id", StepsRecord::class)
+        verify(viewModel).addToDeleteMap("test_id_2", StepsRecord::class)
     }
 
     @Test
     fun inDeletion_selectAllUnchecked_allEntriesUnchecked() {
-        Mockito.`when`(viewModel.entries)
+        whenever(viewModel.entries)
             .thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST_WITH_AGGREGATION)))
-        Mockito.`when`(viewModel.getEntriesList())
+        whenever(viewModel.getEntriesList())
             .thenReturn(FORMATTED_STEPS_LIST_WITH_AGGREGATION.toMutableList())
-        Mockito.`when`(viewModel.mapOfEntriesToBeDeleted)
+        whenever(viewModel.mapOfEntriesToBeDeleted)
             .thenReturn(
-                MutableLiveData(mapOf("test_id" to DataType.STEPS, "test_id_2" to DataType.STEPS))
+                MutableLiveData(
+                    mapOf("test_id" to StepsRecord::class, "test_id_2" to StepsRecord::class)
+                )
             )
-        Mockito.`when`(viewModel.allEntriesSelected).thenReturn(MutableLiveData(true))
+        whenever(viewModel.allEntriesSelected).thenReturn(MutableLiveData(true))
 
         val scenario =
             launchFragment<AllEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
@@ -418,7 +471,7 @@
             headerA11y = "from 7:06 to 7:06",
             title = "12 steps",
             titleA11y = "12 steps",
-            dataType = DataType.STEPS,
+            dataType = StepsRecord::class,
         ),
         FormattedDataEntry(
             uuid = "test_id_2",
@@ -426,7 +479,7 @@
             headerA11y = "from 8:06 to 8:06",
             title = "15 steps",
             titleA11y = "15 steps",
-            dataType = DataType.STEPS,
+            dataType = StepsRecord::class,
         ),
     )
 
@@ -438,7 +491,7 @@
             headerA11y = "from 7:06 to 7:06",
             title = "7 hours",
             titleA11y = "7 hours",
-            dataType = DataType.SLEEP,
+            dataType = SleepSessionRecord::class,
             notes = "",
         )
     )
@@ -450,7 +503,7 @@
             headerA11y = "from 7:06 to 7:06",
             title = "128 - 140 bpm",
             titleA11y = "128 - 140 bpm",
-            dataType = DataType.HEART_RATE,
+            dataType = HeartRateRecord::class,
         )
     )
 private val FORMATTED_PLANNED_EXERCISE_LIST =
@@ -461,7 +514,7 @@
             headerA11y = "from 7:06 to 7:06",
             title = "Workout",
             titleA11y = "Workout",
-            dataType = DataType.PLANNED_EXERCISE,
+            dataType = PlannedExerciseSessionRecord::class,
             notes = "",
         )
     )
@@ -473,7 +526,7 @@
             headerA11y = "from 7:06 to 7:06",
             title = "Biking",
             titleA11y = "Biking",
-            dataType = DataType.EXERCISE,
+            dataType = ExerciseSessionRecord::class,
             notes = "",
         )
     )
@@ -516,7 +569,7 @@
             headerA11y = "from 7:06 to 7:06",
             title = "12 steps",
             titleA11y = "12 steps",
-            dataType = DataType.STEPS,
+            dataType = StepsRecord::class,
         ),
         FormattedDataEntry(
             uuid = "test_id_2",
@@ -524,6 +577,6 @@
             headerA11y = "from 8:06 to 8:06",
             title = "15 steps",
             titleA11y = "15 steps",
-            dataType = DataType.STEPS,
+            dataType = StepsRecord::class,
         ),
     )
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/AppEntriesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/AppEntriesFragmentTest.kt
index b390aad..a0799c1 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/AppEntriesFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/AppEntriesFragmentTest.kt
@@ -16,9 +16,20 @@
 package com.android.healthconnect.controller.tests.data.entries
 
 import android.content.Context
+import android.content.Intent.EXTRA_PACKAGE_NAME
+import android.health.connect.datatypes.ExerciseSessionRecord
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.PlannedExerciseSessionRecord
+import android.health.connect.datatypes.SleepSessionRecord
+import android.health.connect.datatypes.StepsRecord
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MutableLiveData
+import androidx.navigation.Navigation
+import androidx.navigation.testing.TestNavHostController
+import androidx.test.espresso.Espresso.onIdle
 import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.action.ViewActions.scrollTo
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -32,25 +43,40 @@
 import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesFragmentState.Loading
 import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesFragmentState.LoadingFailed
 import com.android.healthconnect.controller.data.entries.EntriesViewModel.EntriesFragmentState.With
+import com.android.healthconnect.controller.data.entries.FormattedEntry
+import com.android.healthconnect.controller.data.entries.FormattedEntry.FormattedAggregation
 import com.android.healthconnect.controller.data.entries.FormattedEntry.FormattedDataEntry
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.EXERCISE
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.HEART_RATE
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.PLANNED_EXERCISE
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.SLEEP
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.STEPS
-import com.android.healthconnect.controller.shared.DataType
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.shared.Constants
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION_2
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION_3
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
+import com.android.healthconnect.controller.tests.utils.withIndex
+import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import java.time.ZoneId
 import java.util.Locale
 import java.util.TimeZone
+import kotlinx.coroutines.test.runTest
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class AppEntriesFragmentTest {
@@ -60,6 +86,7 @@
     @BindValue val viewModel: EntriesViewModel = Mockito.mock(EntriesViewModel::class.java)
 
     private lateinit var context: Context
+    private lateinit var navHostController: TestNavHostController
 
     @Before
     fun setup() {
@@ -67,11 +94,11 @@
         context = InstrumentationRegistry.getInstrumentation().context
         context.setLocale(Locale.UK)
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
+        navHostController = TestNavHostController(context)
 
-        Mockito.`when`(viewModel.currentSelectedDate).thenReturn(MutableLiveData())
-        Mockito.`when`(viewModel.period)
-            .thenReturn(MutableLiveData(DateNavigationPeriod.PERIOD_DAY))
-        Mockito.`when`(viewModel.appInfo)
+        whenever(viewModel.currentSelectedDate).thenReturn(MutableLiveData())
+        whenever(viewModel.period).thenReturn(MutableLiveData(DateNavigationPeriod.PERIOD_DAY))
+        whenever(viewModel.appInfo)
             .thenReturn(
                 MutableLiveData(
                     AppMetadata(
@@ -81,56 +108,444 @@
                     )
                 )
             )
-        Mockito.`when`(viewModel.mapOfEntriesToBeDeleted).thenReturn(MutableLiveData())
+        whenever(viewModel.mapOfEntriesToBeDeleted).thenReturn(MutableLiveData())
+        whenever(viewModel.screenState)
+            .thenReturn(MutableLiveData(EntriesViewModel.EntriesDeletionScreenState.VIEW))
+        whenever(viewModel.mapOfEntriesToBeDeleted).thenReturn(MutableLiveData())
+        whenever(viewModel.allEntriesSelected).thenReturn(MutableLiveData(false))
     }
 
     @Test
-    fun appEntriesInit_showsDateNavigationPreference() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(With(emptyList())))
+    fun showsDateNavigationPreference() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(emptyList())))
 
-        launchFragment<AppEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
 
         onView(withId(R.id.date_picker_spinner)).check(matches(isDisplayed()))
     }
 
     @Test
-    fun appEntriesInit_noData_showsNoData() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(Empty))
+    fun whenNoData_showsNoData() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(Empty))
 
-        launchFragment<AppEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
 
         onView(withId(R.id.no_data_view)).check(matches(isDisplayed()))
     }
 
     @Test
-    fun appEntriesInit_error_showsNoData() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(LoadingFailed))
+    fun whenError_showsErrorView() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(LoadingFailed))
 
-        launchFragment<AppEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
 
         onView(withId(R.id.error_view)).check(matches(isDisplayed()))
     }
 
     @Test
-    fun appEntriesInit_loading_showsLoading() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(Loading))
+    fun whenLoading_showsLoading() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(Loading))
 
-        launchFragment<AppEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
 
         onView(withId(R.id.loading)).check(matches(isDisplayed()))
     }
 
     @Test
-    fun appEntriesInit_withData_showsListOfEntries() {
-        Mockito.`when`(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+    fun withSleepData_showsListOfEntries() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_SLEEP_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_SLEEP_LIST.toMutableList())
 
-        launchFragment<AppEntriesFragment>(bundleOf(PERMISSION_TYPE_NAME_KEY to STEPS.name))
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to SLEEP.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
+
+        onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
+        onView(withText("7 hours")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun withHeartRateData_showsListOfEntries() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_HEART_RATE_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_HEART_RATE_LIST.toMutableList())
+
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to HEART_RATE.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
+
+        onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
+        onView(withText("128 - 140 bpm")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun withExerciseData_showsListOfEntries() {
+        whenever(viewModel.entries)
+            .thenReturn(MutableLiveData(With(FORMATTED_EXERCISE_SESSION_LIST)))
+        whenever(viewModel.getEntriesList())
+            .thenReturn(FORMATTED_EXERCISE_SESSION_LIST.toMutableList())
+
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to EXERCISE.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
+
+        onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
+        onView(withText("Biking")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun withPlannedExerciseData_showsListOfEntries() {
+        whenever(viewModel.entries)
+            .thenReturn(MutableLiveData(With(FORMATTED_PLANNED_EXERCISE_LIST)))
+        whenever(viewModel.getEntriesList())
+            .thenReturn(FORMATTED_PLANNED_EXERCISE_LIST.toMutableList())
+
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to PLANNED_EXERCISE.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
+
+        onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
+        onView(withText("Workout")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun withStepsData_showsListOfEntries() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.getEntriesList())
+            .thenReturn(FORMATTED_PLANNED_EXERCISE_LIST.toMutableList())
+
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
 
         onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
         onView(withText("12 steps")).check(matches(isDisplayed()))
         onView(withText("8:06 - 8:06")).check(matches(isDisplayed()))
         onView(withText("15 steps")).check(matches(isDisplayed()))
     }
+
+    @Test
+    fun withMedicalData_showsListOfEntries() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_IMMUNIZATION_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_IMMUNIZATION_LIST.toMutableList())
+
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.VACCINES.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
+
+        onView(withText("Covid vaccine 1")).check(matches(isDisplayed()))
+        onView(withText("Covid vaccine 2")).check(matches(isDisplayed()))
+        onView(withText("Covid vaccine 3")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun showsData_onOrientationChange() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
+
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+
+        onView(withText("7:06 - 7:06")).check(matches(isDisplayed()))
+        onView(withText("12 steps")).check(matches(isDisplayed()))
+        onView(withText("8:06 - 8:06")).check(matches(isDisplayed()))
+        onView(withText("15 steps")).check(matches(isDisplayed()))
+
+        scenario.recreate()
+
+        onIdle()
+        onView(withText("7:06 - 7:06")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("12 steps")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("8:06 - 8:06")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("15 steps")).perform(scrollTo()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun inDeletion_showsCheckboxes() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
+
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+
+        onView(withIndex(withId(R.id.item_checkbox_button), 1)).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun inDeletion_checkboxesRemainOnOrientationChange() = runTest {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.screenState)
+            .thenReturn(MutableLiveData(EntriesViewModel.EntriesDeletionScreenState.DELETE))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_STEPS_LIST.toMutableList())
+
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+
+        onView(withIndex(withId(R.id.item_checkbox_button), 1)).check(matches(isDisplayed()))
+
+        scenario.recreate()
+
+        onIdle()
+        onView(withIndex(withId(R.id.item_checkbox_button), 0)).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun inDeletion_checkedItemsAddedToDeleteSet() {
+        whenever(viewModel.entries)
+            .thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST_WITH_AGGREGATION)))
+        whenever(viewModel.getEntriesList())
+            .thenReturn(FORMATTED_STEPS_LIST_WITH_AGGREGATION.toMutableList())
+
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+
+        onView(withText("12 steps")).perform(click())
+        onIdle()
+        verify(viewModel).addToDeleteMap("test_id", StepsRecord::class)
+    }
+
+    @Test
+    fun triggerDeletion_displaysSelectAll() {
+        whenever(viewModel.entries)
+            .thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST_WITH_AGGREGATION)))
+        whenever(viewModel.getEntriesList())
+            .thenReturn(FORMATTED_STEPS_LIST_WITH_AGGREGATION.toMutableList())
+
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+
+        onIdle()
+        onView(withIndex(withText("Select all"), 0)).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun inDeletion_selectAllChecked_allEntriesChecked() {
+        whenever(viewModel.entries)
+            .thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST_WITH_AGGREGATION)))
+        whenever(viewModel.getEntriesList())
+            .thenReturn(FORMATTED_STEPS_LIST_WITH_AGGREGATION.toMutableList())
+
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+
+        onView(withText("Select all")).perform(click())
+        onIdle()
+        verify(viewModel).addToDeleteMap("test_id", StepsRecord::class)
+        verify(viewModel).addToDeleteMap("test_id_2", StepsRecord::class)
+    }
+
+    @Test
+    fun inDeletion_selectAllUnchecked_allEntriesUnchecked() {
+        whenever(viewModel.entries)
+            .thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST_WITH_AGGREGATION)))
+        whenever(viewModel.getEntriesList())
+            .thenReturn(FORMATTED_STEPS_LIST_WITH_AGGREGATION.toMutableList())
+        whenever(viewModel.mapOfEntriesToBeDeleted)
+            .thenReturn(
+                MutableLiveData(
+                    mapOf("test_id" to StepsRecord::class, "test_id_2" to StepsRecord::class)
+                )
+            )
+        whenever(viewModel.allEntriesSelected).thenReturn(MutableLiveData(true))
+
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+
+        onView(withText("Select all")).perform(click())
+        onIdle()
+        verify(viewModel).removeFromDeleteMap("test_id")
+        verify(viewModel).removeFromDeleteMap("test_id_2")
+    }
+
+    @Test
+    fun clickOnFitnessPermission_notClickable() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.getEntriesList())
+            .thenReturn(FORMATTED_PLANNED_EXERCISE_LIST.toMutableList())
+
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        ) {
+            navHostController.setGraph(R.navigation.app_data_nav_graph)
+            navHostController.setCurrentDestination(R.id.appEntriesFragment)
+            Navigation.setViewNavController(this.requireView(), navHostController)
+        }
+        onView(withText("12 steps")).perform(click())
+
+        assertThat(navHostController.currentDestination?.id).isEqualTo(R.id.appEntriesFragment)
+    }
+
+    @Test
+    fun clickOnFitnessPermission_navigateToEntryDetailsFragment() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_SLEEP_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_SLEEP_LIST.toMutableList())
+
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to SLEEP.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        ) {
+            navHostController.setGraph(R.navigation.app_data_nav_graph)
+            navHostController.setCurrentDestination(R.id.appEntriesFragment)
+            Navigation.setViewNavController(this.requireView(), navHostController)
+        }
+        onView(withText("7 hours")).perform(click())
+
+        assertThat(navHostController.currentDestination?.id)
+            .isEqualTo(R.id.dataEntryDetailsFragment)
+    }
+
+    @Test
+    fun clickOnMedicalPermission_navigateToRawFhir() {
+        whenever(viewModel.entries).thenReturn(MutableLiveData(With(FORMATTED_IMMUNIZATION_LIST)))
+        whenever(viewModel.getEntriesList()).thenReturn(FORMATTED_IMMUNIZATION_LIST.toMutableList())
+
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to MedicalPermissionType.VACCINES.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        ) {
+            navHostController.setGraph(R.navigation.app_data_nav_graph)
+            navHostController.setCurrentDestination(R.id.appEntriesFragment)
+            Navigation.setViewNavController(this.requireView(), navHostController)
+        }
+        onView(withText("Covid vaccine 2")).perform(click())
+
+        assertThat(navHostController.currentDestination?.id).isEqualTo(R.id.rawFhirFragment)
+    }
 }
 
 private val FORMATTED_STEPS_LIST =
@@ -141,14 +556,112 @@
             headerA11y = "from 7:06 to 7:06",
             title = "12 steps",
             titleA11y = "12 steps",
-            dataType = DataType.STEPS,
+            dataType = StepsRecord::class,
         ),
         FormattedDataEntry(
-            uuid = "test_id",
+            uuid = "test_id_2",
             header = "8:06 - 8:06",
             headerA11y = "from 8:06 to 8:06",
             title = "15 steps",
             titleA11y = "15 steps",
-            dataType = DataType.STEPS,
+            dataType = StepsRecord::class,
+        ),
+    )
+
+private val FORMATTED_SLEEP_LIST =
+    listOf(
+        FormattedEntry.SleepSessionEntry(
+            uuid = "test_id",
+            header = "7:06 - 7:06",
+            headerA11y = "from 7:06 to 7:06",
+            title = "7 hours",
+            titleA11y = "7 hours",
+            dataType = SleepSessionRecord::class,
+            notes = "",
+        )
+    )
+private val FORMATTED_HEART_RATE_LIST =
+    listOf(
+        FormattedEntry.SeriesDataEntry(
+            uuid = "test_id",
+            header = "7:06 - 7:06",
+            headerA11y = "from 7:06 to 7:06",
+            title = "128 - 140 bpm",
+            titleA11y = "128 - 140 bpm",
+            dataType = HeartRateRecord::class,
+        )
+    )
+private val FORMATTED_PLANNED_EXERCISE_LIST =
+    listOf(
+        FormattedEntry.PlannedExerciseSessionEntry(
+            uuid = "test_id",
+            header = "7:06 - 7:06",
+            headerA11y = "from 7:06 to 7:06",
+            title = "Workout",
+            titleA11y = "Workout",
+            dataType = PlannedExerciseSessionRecord::class,
+            notes = "",
+        )
+    )
+private val FORMATTED_EXERCISE_SESSION_LIST =
+    listOf(
+        FormattedEntry.ExerciseSessionEntry(
+            uuid = "test_id",
+            header = "7:06 - 7:06",
+            headerA11y = "from 7:06 to 7:06",
+            title = "Biking",
+            titleA11y = "Biking",
+            dataType = ExerciseSessionRecord::class,
+            notes = "",
+        )
+    )
+
+private val FORMATTED_STEPS_LIST_WITH_AGGREGATION =
+    listOf(
+        FormattedAggregation(
+            aggregation = "27",
+            aggregationA11y = "27",
+            contributingApps = TEST_APP_NAME,
+        ),
+        FormattedDataEntry(
+            uuid = "test_id",
+            header = "7:06 - 7:06",
+            headerA11y = "from 7:06 to 7:06",
+            title = "12 steps",
+            titleA11y = "12 steps",
+            dataType = StepsRecord::class,
+        ),
+        FormattedDataEntry(
+            uuid = "test_id_2",
+            header = "8:06 - 8:06",
+            headerA11y = "from 8:06 to 8:06",
+            title = "15 steps",
+            titleA11y = "15 steps",
+            dataType = StepsRecord::class,
+        ),
+    )
+
+private val FORMATTED_IMMUNIZATION_LIST =
+    listOf(
+        FormattedEntry.FormattedMedicalDataEntry(
+            header = "My Hospital",
+            headerA11y = "My Hospital",
+            title = "Covid vaccine 1",
+            titleA11y = "important vaccination",
+            medicalResourceId = TEST_MEDICAL_RESOURCE_IMMUNIZATION.id,
+        ),
+        FormattedEntry.FormattedMedicalDataEntry(
+            header = "My Hospital",
+            headerA11y = "My Hospital",
+            title = "Covid vaccine 2",
+            titleA11y = "important vaccination",
+            medicalResourceId = TEST_MEDICAL_RESOURCE_IMMUNIZATION_2.id,
+        ),
+        FormattedEntry.FormattedMedicalDataEntry(
+            header = "My Hospital 2",
+            headerA11y = "My Hospital 2",
+            title = "Covid vaccine 3",
+            titleA11y = "important vaccination",
+            medicalResourceId = TEST_MEDICAL_RESOURCE_IMMUNIZATION_3.id,
         ),
     )
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/EntriesViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/EntriesViewModelTest.kt
index 9ea819e..570ef63 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/EntriesViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/EntriesViewModelTest.kt
@@ -16,13 +16,14 @@
 package com.android.healthconnect.controller.tests.data.entries
 
 import android.content.Context
+import android.health.connect.datatypes.MenstruationPeriodRecord
+import android.health.connect.datatypes.StepsRecord
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.entries.EntriesViewModel
 import com.android.healthconnect.controller.data.entries.FormattedEntry
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
 import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION
@@ -69,7 +70,7 @@
                 headerA11y = "from 7:06 to 7:06",
                 title = "12 steps",
                 titleA11y = "12 steps",
-                dataType = DataType.STEPS,
+                dataType = StepsRecord::class,
             )
         private val FORMATTED_STEPS_2 =
             FormattedEntry.FormattedDataEntry(
@@ -78,7 +79,7 @@
                 headerA11y = "from 8:06 to 8:06",
                 title = "15 steps",
                 titleA11y = "15 steps",
-                dataType = DataType.STEPS,
+                dataType = StepsRecord::class,
             )
         private val FORMATTED_MENSTRUATION_PERIOD =
             FormattedEntry.FormattedDataEntry(
@@ -87,7 +88,7 @@
                 headerA11y = "from 8:06 to 8:06",
                 title = "15 steps",
                 titleA11y = "15 steps",
-                dataType = DataType.MENSTRUATION_PERIOD,
+                dataType = MenstruationPeriodRecord::class,
             )
         private val FORMATTED_IMMUNIZATION =
             FormattedEntry.FormattedMedicalDataEntry(
@@ -200,7 +201,7 @@
         val testObserver = TestObserver<EntriesViewModel.EntriesFragmentState>()
         viewModel.entries.observeForever(testObserver)
         viewModel.loadEntries(
-            MedicalPermissionType.IMMUNIZATION,
+            MedicalPermissionType.VACCINES,
             Instant.ofEpochMilli(timeSource.currentTimeMillis()),
             DateNavigationPeriod.PERIOD_WEEK,
         )
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/MockedAllEntriesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/MockedAllEntriesFragmentTest.kt
index 4470563..964b5a4 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/MockedAllEntriesFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/MockedAllEntriesFragmentTest.kt
@@ -30,12 +30,7 @@
 import androidx.test.espresso.action.ViewActions.click
 import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
-import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
-import androidx.test.espresso.matcher.ViewMatchers.isChecked
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
-import androidx.test.espresso.matcher.ViewMatchers.isNotChecked
-import androidx.test.espresso.matcher.ViewMatchers.withId
-import androidx.test.espresso.matcher.ViewMatchers.withTagValue
 import androidx.test.espresso.matcher.ViewMatchers.withText
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.data.appdata.AppDataFragment.Companion.PERMISSION_TYPE_NAME_KEY
@@ -49,7 +44,9 @@
 import com.android.healthconnect.controller.service.MainDispatcher
 import com.android.healthconnect.controller.tests.utils.CoroutineTestRule
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.atPosition
+import com.android.healthconnect.controller.tests.utils.assertCheckboxChecked
+import com.android.healthconnect.controller.tests.utils.assertCheckboxNotChecked
+import com.android.healthconnect.controller.tests.utils.assertCheckboxNotShown
 import com.android.healthconnect.controller.tests.utils.forDataType
 import com.android.healthconnect.controller.tests.utils.getMetaDataWithUniqueIds
 import com.android.healthconnect.controller.tests.utils.getStepsRecordWithUniqueIds
@@ -70,8 +67,6 @@
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.advanceUntilIdle
 import kotlinx.coroutines.test.runTest
-import org.hamcrest.Matchers.allOf
-import org.hamcrest.Matchers.`is`
 import org.hamcrest.Matchers.not
 import org.junit.Before
 import org.junit.Rule
@@ -93,6 +88,7 @@
             .atStartOfDay()
             .atZone(ZoneId.systemDefault())
             .toInstant()
+    private val recyclerViewId = R.id.data_entries_list
 
     @Before
     fun setup() {
@@ -113,10 +109,10 @@
         onView(withText("60 steps")).check(matches(isDisplayed()))
         onView(withText("Select all")).check(doesNotExist())
 
-        assertCheckboxNotShown("10 steps", 1)
-        assertCheckboxNotShown("20 steps", 2)
-        assertCheckboxNotShown("30 steps", 3)
-        assertCheckboxNotShown("15.2 steps/min", 4)
+        assertCheckboxNotShown(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotShown(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotShown(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotShown(recyclerViewId, "15.2 steps/min", 4)
     }
 
     @Test
@@ -136,10 +132,10 @@
         onView(withText("Select all")).check(matches(isDisplayed()))
         onView(withText("60 steps")).check(doesNotExist())
 
-        assertCheckboxNotChecked("10 steps", 1)
-        assertCheckboxNotChecked("20 steps", 2)
-        assertCheckboxNotChecked("30 steps", 3)
-        assertCheckboxNotChecked("15.2 steps/min", 4)
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
     }
 
     @Test
@@ -159,24 +155,24 @@
         onView(withText("Select all")).check(matches(isDisplayed()))
         onView(withText("60 steps")).check(doesNotExist())
 
-        assertCheckboxNotChecked("10 steps", 1)
-        assertCheckboxNotChecked("20 steps", 2)
-        assertCheckboxNotChecked("30 steps", 3)
-        assertCheckboxNotChecked("15.2 steps/min", 4)
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
 
         onView(withText("10 steps")).perform(click())
 
-        assertCheckboxChecked("10 steps", 1)
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
 
         scenario.recreate()
         advanceUntilIdle()
         onView(withText("Select all")).check(matches(isDisplayed()))
         onView(withText("60 steps")).check(doesNotExist())
 
-        assertCheckboxChecked("10 steps", 1)
-        assertCheckboxNotChecked("20 steps", 2)
-        assertCheckboxNotChecked("30 steps", 3)
-        assertCheckboxNotChecked("15.2 steps/min", 4)
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
     }
 
     @Test
@@ -196,10 +192,10 @@
         onView(withText("Select all")).check(matches(isDisplayed()))
         onView(withText("60 steps")).check(doesNotExist())
 
-        assertCheckboxNotChecked("10 steps", 1)
-        assertCheckboxNotChecked("20 steps", 2)
-        assertCheckboxNotChecked("30 steps", 3)
-        assertCheckboxNotChecked("15.2 steps/min", 4)
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
 
         onView(withText("10 steps")).perform(click())
         onView(withText("20 steps")).perform(click())
@@ -207,7 +203,7 @@
         onView(withText("15.2 steps/min")).perform(click())
 
         // assert select all checked
-        assertCheckboxChecked("Select all", 0)
+        assertCheckboxChecked(recyclerViewId, "Select all", 0)
     }
 
     @Test
@@ -227,23 +223,23 @@
         onView(withText("Select all")).check(matches(isDisplayed()))
         onView(withText("60 steps")).check(doesNotExist())
 
-        assertCheckboxNotChecked("10 steps", 1)
-        assertCheckboxNotChecked("20 steps", 2)
-        assertCheckboxNotChecked("30 steps", 3)
-        assertCheckboxNotChecked("15.2 steps/min", 4)
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
 
         onView(withText("Select all")).perform(click())
 
-        assertCheckboxChecked("10 steps", 1)
-        assertCheckboxChecked("20 steps", 2)
-        assertCheckboxChecked("30 steps", 3)
-        assertCheckboxChecked("15.2 steps/min", 4)
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxChecked(recyclerViewId, "15.2 steps/min", 4)
 
-        assertCheckboxChecked("Select all", 0)
+        assertCheckboxChecked(recyclerViewId, "Select all", 0)
 
         onView(withText("10 steps")).perform(click())
 
-        assertCheckboxNotChecked("Select all", 0)
+        assertCheckboxNotChecked(recyclerViewId, "Select all", 0)
     }
 
     @Test
@@ -263,17 +259,17 @@
         onView(withText("Select all")).check(matches(isDisplayed()))
         onView(withText("60 steps")).check(doesNotExist())
 
-        assertCheckboxNotChecked("10 steps", 1)
-        assertCheckboxNotChecked("20 steps", 2)
-        assertCheckboxNotChecked("30 steps", 3)
-        assertCheckboxNotChecked("15.2 steps/min", 4)
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
 
         onView(withText("Select all")).perform(click())
 
-        assertCheckboxChecked("10 steps", 1)
-        assertCheckboxChecked("20 steps", 2)
-        assertCheckboxChecked("30 steps", 3)
-        assertCheckboxChecked("15.2 steps/min", 4)
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxChecked(recyclerViewId, "15.2 steps/min", 4)
     }
 
     @Test
@@ -293,24 +289,24 @@
         onView(withText("Select all")).check(matches(isDisplayed()))
         onView(withText("60 steps")).check(doesNotExist())
 
-        assertCheckboxNotChecked("10 steps", 1)
-        assertCheckboxNotChecked("20 steps", 2)
-        assertCheckboxNotChecked("30 steps", 3)
-        assertCheckboxNotChecked("15.2 steps/min", 4)
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
 
         onView(withText("Select all")).perform(click())
 
-        assertCheckboxChecked("10 steps", 1)
-        assertCheckboxChecked("20 steps", 2)
-        assertCheckboxChecked("30 steps", 3)
-        assertCheckboxChecked("15.2 steps/min", 4)
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxChecked(recyclerViewId, "15.2 steps/min", 4)
 
         onView(withText("Select all")).perform(click())
 
-        assertCheckboxNotChecked("10 steps", 1)
-        assertCheckboxNotChecked("20 steps", 2)
-        assertCheckboxNotChecked("30 steps", 3)
-        assertCheckboxNotChecked("15.2 steps/min", 4)
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
     }
 
     private fun mockData() {
@@ -387,68 +383,6 @@
             .build()
     }
 
-    private fun assertCheckboxShown(title: String, position: Int, tag: String = "checkbox") {
-        onView(withId(R.id.data_entries_list))
-            .check(
-                matches(
-                    atPosition(
-                        position,
-                        allOf(
-                            hasDescendant(withText(title)),
-                            hasDescendant(withTagValue(`is`(tag))),
-                        ),
-                    )
-                )
-            )
-    }
-
-    private fun assertCheckboxChecked(title: String, position: Int, tag: String = "checkbox") {
-        onView(withId(R.id.data_entries_list))
-            .check(
-                matches(
-                    atPosition(
-                        position,
-                        allOf(
-                            hasDescendant(withText(title)),
-                            hasDescendant(withTagValue(`is`(tag))),
-                            hasDescendant(isChecked()),
-                        ),
-                    )
-                )
-            )
-    }
-
-    private fun assertCheckboxNotShown(title: String, position: Int, tag: String = "checkbox") {
-        onView(withId(R.id.data_entries_list))
-            .check(
-                matches(
-                    atPosition(
-                        position,
-                        allOf(
-                            hasDescendant(withText(title)),
-                            not(hasDescendant(withTagValue(`is`(tag)))),
-                        ),
-                    )
-                )
-            )
-    }
-
-    private fun assertCheckboxNotChecked(title: String, position: Int, tag: String = "checkbox") {
-        onView(withId(R.id.data_entries_list))
-            .check(
-                matches(
-                    atPosition(
-                        position,
-                        allOf(
-                            hasDescendant(withText(title)),
-                            hasDescendant(withTagValue(`is`(tag))),
-                            hasDescendant(isNotChecked()),
-                        ),
-                    )
-                )
-            )
-    }
-
     @Module
     @InstallIn(SingletonComponent::class)
     object TestCoroutineModule {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/MockedAppEntriesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/MockedAppEntriesFragmentTest.kt
new file mode 100644
index 0000000..d149f69
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/MockedAppEntriesFragmentTest.kt
@@ -0,0 +1,444 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.tests.data.entries
+
+import android.content.Intent.EXTRA_PACKAGE_NAME
+import android.health.connect.AggregateRecordsResponse
+import android.health.connect.AggregateResult
+import android.health.connect.HealthConnectManager
+import android.health.connect.ReadRecordsRequestUsingFilters
+import android.health.connect.ReadRecordsResponse
+import android.health.connect.datatypes.AggregationType
+import android.health.connect.datatypes.Record
+import android.health.connect.datatypes.StepsCadenceRecord
+import android.health.connect.datatypes.StepsRecord
+import android.os.OutcomeReceiver
+import androidx.core.os.bundleOf
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.data.appdata.AppDataFragment.Companion.PERMISSION_TYPE_NAME_KEY
+import com.android.healthconnect.controller.data.entries.AppEntriesFragment
+import com.android.healthconnect.controller.data.entries.EntriesViewModel
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.STEPS
+import com.android.healthconnect.controller.service.DefaultDispatcher
+import com.android.healthconnect.controller.service.DispatcherModule
+import com.android.healthconnect.controller.service.HealthManagerModule
+import com.android.healthconnect.controller.service.IoDispatcher
+import com.android.healthconnect.controller.service.MainDispatcher
+import com.android.healthconnect.controller.shared.Constants
+import com.android.healthconnect.controller.tests.utils.CoroutineTestRule
+import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.assertCheckboxChecked
+import com.android.healthconnect.controller.tests.utils.assertCheckboxNotChecked
+import com.android.healthconnect.controller.tests.utils.assertCheckboxNotShown
+import com.android.healthconnect.controller.tests.utils.forDataType
+import com.android.healthconnect.controller.tests.utils.getMetaDataWithUniqueIds
+import com.android.healthconnect.controller.tests.utils.getStepsRecordWithUniqueIds
+import com.android.healthconnect.controller.tests.utils.launchFragment
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.testing.BindValue
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import dagger.hilt.android.testing.UninstallModules
+import dagger.hilt.components.SingletonComponent
+import java.time.Instant
+import java.time.LocalDate
+import java.time.ZoneId
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.advanceUntilIdle
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.ArgumentMatchers
+import org.mockito.Mockito
+import org.mockito.invocation.InvocationOnMock
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@UninstallModules(HealthManagerModule::class, DispatcherModule::class)
+@HiltAndroidTest
+class MockedAppEntriesFragmentTest {
+    @get:Rule val coroutineTestRule = CoroutineTestRule()
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+    @BindValue val manager: HealthConnectManager = Mockito.mock(HealthConnectManager::class.java)
+    private val NOW: Instant =
+        LocalDate.now(ZoneId.systemDefault())
+            .atStartOfDay()
+            .atZone(ZoneId.systemDefault())
+            .toInstant()
+
+    private val recyclerViewId = R.id.data_entries_list
+
+    @Before
+    fun setup() {
+        hiltRule.inject()
+    }
+
+    @Test
+    fun fragmentDisplaysCorrectly() = runTest {
+        mockData()
+        launchFragment<AppEntriesFragment>(
+            bundleOf(
+                PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
+
+        advanceUntilIdle()
+
+        onView(withText("10 steps")).check(matches(isDisplayed()))
+        onView(withText("20 steps")).check(matches(isDisplayed()))
+        onView(withText("30 steps")).check(matches(isDisplayed()))
+        onView(withText("15.2 steps/min")).check(matches(isDisplayed()))
+
+        onView(withText("60 steps")).check(matches(isDisplayed()))
+        onView(withText("Select all")).check(doesNotExist())
+
+        assertCheckboxNotShown(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotShown(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotShown(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotShown(recyclerViewId, "15.2 steps/min", 4)
+    }
+
+    @Test
+    fun toggleDeletion_hidesAggregation_showsSelectAll_showsCheckboxes() = runTest {
+        mockData()
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        advanceUntilIdle()
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+        advanceUntilIdle()
+
+        onView(withText("Select all")).check(matches(isDisplayed()))
+        onView(withText("60 steps")).check(doesNotExist())
+
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
+    }
+
+    @Test
+    fun inDeletion_screenStateRemainsOnOrientationChange() = runTest {
+        mockData()
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        advanceUntilIdle()
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+        advanceUntilIdle()
+
+        onView(withText("Select all")).check(matches(isDisplayed()))
+        onView(withText("60 steps")).check(doesNotExist())
+
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
+
+        onView(withText("10 steps")).perform(click())
+
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+
+        scenario.recreate()
+        advanceUntilIdle()
+        onView(withText("Select all")).check(matches(isDisplayed()))
+        onView(withText("60 steps")).check(doesNotExist())
+
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
+    }
+
+    @Test
+    fun inDeletion_whenAllCheckboxesChecked_selectAllChecked() = runTest {
+        mockData()
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        advanceUntilIdle()
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+        advanceUntilIdle()
+
+        onView(withText("Select all")).check(matches(isDisplayed()))
+        onView(withText("60 steps")).check(doesNotExist())
+
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
+
+        onView(withText("10 steps")).perform(click())
+        onView(withText("20 steps")).perform(click())
+        onView(withText("30 steps")).perform(click())
+        onView(withText("15.2 steps/min")).perform(click())
+
+        // assert select all checked
+        assertCheckboxChecked(recyclerViewId, "Select all", 0)
+    }
+
+    @Test
+    fun inDeletion_whenOneCheckboxUnchecked_selectAllUnchecked() = runTest {
+        mockData()
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        advanceUntilIdle()
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+        advanceUntilIdle()
+
+        onView(withText("Select all")).check(matches(isDisplayed()))
+        onView(withText("60 steps")).check(doesNotExist())
+
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
+
+        onView(withText("Select all")).perform(click())
+
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxChecked(recyclerViewId, "15.2 steps/min", 4)
+
+        assertCheckboxChecked(recyclerViewId, "Select all", 0)
+
+        onView(withText("10 steps")).perform(click())
+
+        assertCheckboxNotChecked(recyclerViewId, "Select all", 0)
+    }
+
+    @Test
+    fun inDeletion_whenSelectAllChecked_allCheckboxesChecked() = runTest {
+        mockData()
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        advanceUntilIdle()
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+        advanceUntilIdle()
+
+        onView(withText("Select all")).check(matches(isDisplayed()))
+        onView(withText("60 steps")).check(doesNotExist())
+
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
+
+        onView(withText("Select all")).perform(click())
+
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxChecked(recyclerViewId, "15.2 steps/min", 4)
+    }
+
+    @Test
+    fun inDeletion_whenSelectAllUnchecked_allCheckboxesUnchecked() = runTest {
+        mockData()
+        val scenario =
+            launchFragment<AppEntriesFragment>(
+                bundleOf(
+                    PERMISSION_TYPE_NAME_KEY to STEPS.name,
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
+        advanceUntilIdle()
+        scenario.onActivity { activity ->
+            val fragment = activity.supportFragmentManager.findFragmentByTag("")
+            (fragment as AppEntriesFragment).triggerDeletionState(
+                EntriesViewModel.EntriesDeletionScreenState.DELETE
+            )
+        }
+        advanceUntilIdle()
+
+        onView(withText("Select all")).check(matches(isDisplayed()))
+        onView(withText("60 steps")).check(doesNotExist())
+
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
+
+        onView(withText("Select all")).perform(click())
+
+        assertCheckboxChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxChecked(recyclerViewId, "15.2 steps/min", 4)
+
+        onView(withText("Select all")).perform(click())
+
+        assertCheckboxNotChecked(recyclerViewId, "10 steps", 1)
+        assertCheckboxNotChecked(recyclerViewId, "20 steps", 2)
+        assertCheckboxNotChecked(recyclerViewId, "30 steps", 3)
+        assertCheckboxNotChecked(recyclerViewId, "15.2 steps/min", 4)
+    }
+
+    private fun mockData() {
+        val stepsRecordsList =
+            listOf(
+                getStepsRecordWithUniqueIds(10, NOW),
+                getStepsRecordWithUniqueIds(20, NOW),
+                getStepsRecordWithUniqueIds(30, NOW),
+            )
+        Mockito.doAnswer(prepareRecordsAnswer(stepsRecordsList))
+            .`when`(manager)
+            .readRecords(
+                ArgumentMatchers.argThat<ReadRecordsRequestUsingFilters<Record>> { request ->
+                    request.forDataType(dataType = StepsRecord::class.java)
+                },
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+
+        Mockito.doAnswer(prepareRecordsAnswer(listOf(getStepsCadence(listOf(10.3, 20.1)))))
+            .`when`(manager)
+            .readRecords(
+                ArgumentMatchers.argThat<ReadRecordsRequestUsingFilters<Record>> { request ->
+                    request.forDataType(dataType = StepsCadenceRecord::class.java)
+                },
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+
+        Mockito.doAnswer(prepareStepsAggregationAnswer())
+            .`when`(manager)
+            .aggregate<Long>(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())
+    }
+
+    private fun prepareRecordsAnswer(records: List<Record>): (InvocationOnMock) -> Nothing? {
+        val answer = { args: InvocationOnMock ->
+            val receiver = args.arguments[2] as OutcomeReceiver<ReadRecordsResponse<Record>, *>
+            receiver.onResult(ReadRecordsResponse(records, -1))
+            null
+        }
+        return answer
+    }
+
+    private fun prepareStepsAggregationAnswer():
+        (InvocationOnMock) -> AggregateRecordsResponse<Long> {
+        val answer = { args: InvocationOnMock ->
+            val receiver = args.arguments[2] as OutcomeReceiver<AggregateRecordsResponse<Long>, *>
+            receiver.onResult(getStepsAggregationResponse())
+            getStepsAggregationResponse()
+        }
+        return answer
+    }
+
+    private fun getStepsAggregationResponse(): AggregateRecordsResponse<Long> {
+        val aggregationResult = AggregateResult<Long>(60)
+        aggregationResult.setDataOrigins(listOf(TEST_APP_PACKAGE_NAME))
+        return AggregateRecordsResponse<Long>(
+            mapOf(
+                AggregationType.AggregationTypeIdentifier.STEPS_RECORD_COUNT_TOTAL to
+                    aggregationResult
+            )
+        )
+    }
+
+    private fun getStepsCadence(samples: List<Double>): StepsCadenceRecord {
+        return StepsCadenceRecord.Builder(
+                getMetaDataWithUniqueIds(),
+                NOW,
+                NOW.plusSeconds(samples.size.toLong() + 1),
+                samples.map { rate ->
+                    StepsCadenceRecord.StepsCadenceRecordSample(rate, NOW.plusSeconds(1))
+                },
+            )
+            .build()
+    }
+
+    @Module
+    @InstallIn(SingletonComponent::class)
+    object TestCoroutineModule {
+        @DefaultDispatcher
+        @Provides
+        fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Main
+
+        @IoDispatcher @Provides fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.Main
+
+        @MainDispatcher
+        @Provides
+        fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadDataEntriesUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadDataEntriesUseCaseTest.kt
index 52cf4cd..fbde372 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadDataEntriesUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadDataEntriesUseCaseTest.kt
@@ -29,8 +29,10 @@
 import com.android.healthconnect.controller.data.entries.api.LoadDataEntriesUseCase
 import com.android.healthconnect.controller.data.entries.api.LoadEntriesHelper
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
+import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.formatters.shared.HealthDataEntryFormatter
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
 import com.android.healthconnect.controller.tests.utils.forDataType
 import com.android.healthconnect.controller.tests.utils.getStepsRecord
@@ -62,6 +64,8 @@
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
     @Inject lateinit var healthDataEntryFormatter: HealthDataEntryFormatter
+    @Inject lateinit var menstruationPeriodFormatter: MenstruationPeriodFormatter
+    @Inject lateinit var dataSourceReader: MedicalDataSourceReader
     private val healthConnectManager: HealthConnectManager =
         Mockito.mock(HealthConnectManager::class.java)
 
@@ -76,7 +80,13 @@
         context.setLocale(Locale.US)
         hiltRule.inject()
         loadEntriesHelper =
-            LoadEntriesHelper(context, healthDataEntryFormatter, healthConnectManager)
+            LoadEntriesHelper(
+                context,
+                healthDataEntryFormatter,
+                menstruationPeriodFormatter,
+                healthConnectManager,
+                dataSourceReader,
+            )
         loadDataEntriesUseCase = LoadDataEntriesUseCase(Dispatchers.Main, loadEntriesHelper)
     }
 
@@ -89,7 +99,8 @@
                 packageName = null,
                 displayedStartTime = stepsDate.toInstantAtStartOfDay(),
                 period = DateNavigationPeriod.PERIOD_DAY,
-                showDataOrigin = true)
+                showDataOrigin = true,
+            )
 
         val stepsRecord = getStepsRecord(100, stepsDate.randomInstant())
 
@@ -100,7 +111,8 @@
                     request.forDataType(dataType = StepsRecord::class.java)
                 },
                 ArgumentMatchers.any(),
-                ArgumentMatchers.any())
+                ArgumentMatchers.any(),
+            )
 
         Mockito.doAnswer(prepareRecordsAnswer(listOf()))
             .`when`(healthConnectManager)
@@ -109,7 +121,8 @@
                     request.forDataType(dataType = StepsCadenceRecord::class.java)
                 },
                 ArgumentMatchers.any(),
-                ArgumentMatchers.any())
+                ArgumentMatchers.any(),
+            )
 
         val expectedFormattedEntry =
             healthDataEntryFormatter.format(stepsRecord, showDataOrigin = true)
@@ -126,7 +139,10 @@
         Mockito.doAnswer(prepareFailureAnswer())
             .`when`(healthConnectManager)
             .readRecords<StepsRecord>(
-                ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
 
         val input =
             LoadDataEntriesInput(
@@ -134,7 +150,8 @@
                 packageName = null,
                 displayedStartTime = sleepDate.toInstantAtStartOfDay(),
                 period = DateNavigationPeriod.PERIOD_DAY,
-                showDataOrigin = true)
+                showDataOrigin = true,
+            )
 
         val result = loadDataEntriesUseCase.invoke(input)
         assertThat(result is UseCaseResults.Failed).isTrue()
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadEntriesHelperUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadEntriesHelperUseCaseTest.kt
index 4509cb1..082fcbe 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadEntriesHelperUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadEntriesHelperUseCaseTest.kt
@@ -28,7 +28,8 @@
 import android.health.connect.datatypes.FloorsClimbedRecord
 import android.health.connect.datatypes.HydrationRecord
 import android.health.connect.datatypes.IntermenstrualBleedingRecord
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+import android.health.connect.datatypes.MedicalDataSource
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
 import android.health.connect.datatypes.OxygenSaturationRecord
 import android.health.connect.datatypes.Record
 import android.health.connect.datatypes.SleepSessionRecord
@@ -43,9 +44,11 @@
 import com.android.healthconnect.controller.data.entries.api.LoadEntriesHelper
 import com.android.healthconnect.controller.data.entries.api.LoadMedicalEntriesInput
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
+import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.formatters.shared.HealthDataEntryFormatter
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
 import com.android.healthconnect.controller.tests.utils.BODYTEMPERATURE_MONTH
 import com.android.healthconnect.controller.tests.utils.BODYWATERMASS_WEEK
 import com.android.healthconnect.controller.tests.utils.DISTANCE_STARTDATE_1500
@@ -65,6 +68,10 @@
 import com.android.healthconnect.controller.tests.utils.SLEEP_WEEK_33H15
 import com.android.healthconnect.controller.tests.utils.SLEEP_WEEK_9H15
 import com.android.healthconnect.controller.tests.utils.START_TIME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_DATASOURCE_ID
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE_2
 import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION
 import com.android.healthconnect.controller.tests.utils.TestTimeSource
 import com.android.healthconnect.controller.tests.utils.WEIGHT_DAY_100
@@ -97,7 +104,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers
+import org.mockito.ArgumentMatchers.any
 import org.mockito.Captor
 import org.mockito.Mockito
 import org.mockito.MockitoAnnotations
@@ -117,6 +124,8 @@
         Mockito.mock(HealthConnectManager::class.java)
 
     @Inject lateinit var healthDataEntryFormatter: HealthDataEntryFormatter
+    @Inject lateinit var menstruationPeriodFormatter: MenstruationPeriodFormatter
+    @Inject lateinit var dataSourceReader: MedicalDataSourceReader
 
     private lateinit var context: Context
     private lateinit var loadEntriesHelper: LoadEntriesHelper
@@ -152,7 +161,14 @@
         context = InstrumentationRegistry.getInstrumentation().context
         context.setLocale(Locale.US)
         loadEntriesHelper =
-            LoadEntriesHelper(context, healthDataEntryFormatter, healthConnectManager, timeSource)
+            LoadEntriesHelper(
+                context,
+                healthDataEntryFormatter,
+                menstruationPeriodFormatter,
+                healthConnectManager,
+                dataSourceReader,
+                timeSource,
+            )
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
     }
 
@@ -488,13 +504,41 @@
     }
 
     @Test
-    fun readMedicalResources_immunization() = runTest {
-        val input = setupReadMedicalResourceTest(MedicalPermissionType.IMMUNIZATION)
+    fun readMedicalResources_allImmunization() = runTest {
+        val input = setupReadMedicalResourceTest(MedicalPermissionType.VACCINES)
         val actual = loadEntriesHelper.readMedicalRecords(input)
 
         assertArgumentRequestCaptorValidity(immunizationCaptor)
         assertThat(actual.size).isEqualTo(1)
-        assertThat(actual[0].dataSourceId).isEqualTo("123")
+        assertThat(actual[0].dataSourceId).isEqualTo(TEST_DATASOURCE_ID)
+    }
+
+    @Test
+    fun readMedicalResources_immunizationFromApp() = runTest {
+        Mockito.doAnswer(
+                prepareDataSourceAnswer(
+                    listOf(TEST_MEDICAL_DATA_SOURCE, TEST_MEDICAL_DATA_SOURCE_2)
+                )
+            )
+            .`when`(healthConnectManager)
+            .getMedicalDataSources(any<List<String>>(), any(), any())
+
+        val input =
+            setupReadMedicalResourceTest(MedicalPermissionType.VACCINES, TEST_APP_PACKAGE_NAME)
+        val actual = loadEntriesHelper.readMedicalRecords(input)
+
+        assertArgumentRequestCaptorValidity(immunizationCaptor)
+        assertThat(actual.size).isEqualTo(1)
+        assertThat(actual[0].dataSourceId).isEqualTo(TEST_DATASOURCE_ID)
+    }
+
+    private fun prepareDataSourceAnswer(
+        medicalDataSourcesResponse: List<MedicalDataSource>
+    ): (InvocationOnMock) -> Unit {
+        return { args: InvocationOnMock ->
+            val receiver = args.arguments[2] as OutcomeReceiver<List<MedicalDataSource>, *>
+            receiver.onResult(medicalDataSourcesResponse)
+        }
     }
 
     private fun prepareDistanceAnswer(): (InvocationOnMock) -> ReadRecordsResponse<DistanceRecord> {
@@ -729,11 +773,12 @@
         return ReadMedicalResourcesResponse(
             listOf(TEST_MEDICAL_RESOURCE_IMMUNIZATION),
             "nextPageToken",
+            1,
         )
     }
 
     private fun getEmptyMedicalResource(): ReadMedicalResourcesResponse {
-        return ReadMedicalResourcesResponse(listOf(), "nextPageToken")
+        return ReadMedicalResourcesResponse(listOf(), "nextPageToken", 1)
     }
 
     private fun setupReadRecordTest(
@@ -777,11 +822,7 @@
 
         mockitoStubber
             .`when`(healthConnectManager)
-            .readRecords(
-                ArgumentMatchers.any(ReadRecordsRequestUsingFilters::class.java),
-                ArgumentMatchers.any(),
-                ArgumentMatchers.any(),
-            )
+            .readRecords(any(ReadRecordsRequestUsingFilters::class.java), any(), any())
 
         return Pair(input, timeRangeFilter)
     }
@@ -793,7 +834,7 @@
         wantedInvocationCount: Int = 1,
     ) {
         Mockito.verify(healthConnectManager, Mockito.times(wantedInvocationCount))
-            .readRecords(requestCaptor.capture(), ArgumentMatchers.any(), ArgumentMatchers.any())
+            .readRecords(requestCaptor.capture(), any(), any())
         assertThat(requestCaptor.value.recordType).isEqualTo(recordType)
         assertThat((requestCaptor.value.timeRangeFilter as TimeInstantRangeFilter).startTime)
             .isEqualTo(timeRangeFilter.startTime)
@@ -804,18 +845,19 @@
     }
 
     private fun setupReadMedicalResourceTest(
-        permissionType: MedicalPermissionType
+        permissionType: MedicalPermissionType,
+        packageName: String? = null,
     ): LoadMedicalEntriesInput {
         val input =
             LoadMedicalEntriesInput(
-                packageName = null,
+                packageName = packageName,
                 showDataOrigin = true,
                 medicalPermissionType = permissionType,
             )
 
         val mockitoStubber: Stubber =
             when (permissionType) {
-                MedicalPermissionType.IMMUNIZATION -> Mockito.doAnswer(prepareImmunizationAnswer())
+                MedicalPermissionType.VACCINES -> Mockito.doAnswer(prepareImmunizationAnswer())
                 MedicalPermissionType.ALL_MEDICAL_DATA ->
                     Mockito.doAnswer(prepareEmptyMedicalAnswer())
                 else ->
@@ -826,11 +868,7 @@
 
         mockitoStubber
             .`when`(healthConnectManager)
-            .readMedicalResources(
-                ArgumentMatchers.any(ReadMedicalResourcesInitialRequest::class.java),
-                ArgumentMatchers.any(),
-                ArgumentMatchers.any(),
-            )
+            .readMedicalResources(any(ReadMedicalResourcesInitialRequest::class.java), any(), any())
 
         return input
     }
@@ -840,12 +878,8 @@
         wantedInvocationCount: Int = 1,
     ) {
         Mockito.verify(healthConnectManager, Mockito.times(wantedInvocationCount))
-            .readMedicalResources(
-                requestCaptor.capture(),
-                ArgumentMatchers.any(),
-                ArgumentMatchers.any(),
-            )
+            .readMedicalResources(requestCaptor.capture(), any(), any())
         assertThat(requestCaptor.value.medicalResourceType)
-            .isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+            .isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES)
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadMedicalEntriesUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadMedicalEntriesUseCaseTest.kt
index 451c8e3..03f91e1 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadMedicalEntriesUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadMedicalEntriesUseCaseTest.kt
@@ -25,9 +25,11 @@
 import com.android.healthconnect.controller.data.entries.api.LoadEntriesHelper
 import com.android.healthconnect.controller.data.entries.api.LoadMedicalEntriesInput
 import com.android.healthconnect.controller.data.entries.api.LoadMedicalEntriesUseCase
+import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.formatters.medical.MedicalEntryFormatter
 import com.android.healthconnect.controller.dataentries.formatters.shared.HealthDataEntryFormatter
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
 import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION
 import com.android.healthconnect.controller.tests.utils.setLocale
@@ -61,6 +63,8 @@
     private lateinit var medicalEntryFormatter: MedicalEntryFormatter
 
     @Inject lateinit var healthDataEntryFormatter: HealthDataEntryFormatter
+    @Inject lateinit var menstruationPeriodFormatter: MenstruationPeriodFormatter
+    @Inject lateinit var dataSourceReader: MedicalDataSourceReader
 
     private val healthConnectManager: HealthConnectManager =
         Mockito.mock(HealthConnectManager::class.java)
@@ -72,7 +76,13 @@
         context.setLocale(Locale.US)
         hiltRule.inject()
         loadEntriesHelper =
-            LoadEntriesHelper(context, healthDataEntryFormatter, healthConnectManager)
+            LoadEntriesHelper(
+                context,
+                healthDataEntryFormatter,
+                menstruationPeriodFormatter,
+                healthConnectManager,
+                dataSourceReader,
+            )
         loadMedicalEntriesUseCase =
             LoadMedicalEntriesUseCase(Dispatchers.Main, medicalEntryFormatter, loadEntriesHelper)
     }
@@ -81,12 +91,12 @@
     fun invoke_noData_returnsEmptyList() = runTest {
         val input =
             LoadMedicalEntriesInput(
-                medicalPermissionType = MedicalPermissionType.IMMUNIZATION,
+                medicalPermissionType = MedicalPermissionType.VACCINES,
                 packageName = null,
                 showDataOrigin = true,
             )
         val readMedicalResourcesResponse =
-            ReadMedicalResourcesResponse(emptyList(), "nextPageToken")
+            ReadMedicalResourcesResponse(emptyList(), "nextPageToken", 1)
         Mockito.doAnswer(prepareAnswer(readMedicalResourcesResponse))
             .`when`(healthConnectManager)
             .readMedicalResources(
@@ -105,7 +115,7 @@
     fun invoke_returnsFormattedData() = runTest {
         val input =
             LoadMedicalEntriesInput(
-                medicalPermissionType = MedicalPermissionType.IMMUNIZATION,
+                medicalPermissionType = MedicalPermissionType.VACCINES,
                 packageName = null,
                 showDataOrigin = true,
             )
@@ -113,6 +123,7 @@
             ReadMedicalResourcesResponse(
                 listOf(TEST_MEDICAL_RESOURCE_IMMUNIZATION),
                 "nextPageToken",
+                2,
             )
         Mockito.doAnswer(prepareAnswer(readMedicalResourcesResponse))
             .`when`(healthConnectManager)
@@ -126,7 +137,7 @@
         assertThat(result is UseCaseResults.Success).isTrue()
         assertThat((result as UseCaseResults.Success).data)
             .containsExactlyElementsIn(
-                listOf<FormattedEntry.FormattedMedicalDataEntry>(
+                listOf(
                     FormattedEntry.FormattedMedicalDataEntry(
                         header = "02 May 2023 • Health Connect Toolbox",
                         headerA11y = "02 May 2023 • Health Connect Toolbox",
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadMenstruationDataUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadMenstruationDataUseCaseTest.kt
new file mode 100644
index 0000000..2cae2e2
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/api/LoadMenstruationDataUseCaseTest.kt
@@ -0,0 +1,433 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package com.android.healthconnect.controller.tests.data.entries.api
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import android.health.connect.ReadRecordsRequestUsingFilters
+import android.health.connect.ReadRecordsResponse
+import android.health.connect.datatypes.MenstruationFlowRecord
+import android.health.connect.datatypes.MenstruationPeriodRecord
+import android.health.connect.datatypes.Record
+import android.os.OutcomeReceiver
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.healthconnect.controller.data.entries.FormattedEntry
+import com.android.healthconnect.controller.data.entries.api.LoadEntriesHelper
+import com.android.healthconnect.controller.data.entries.api.LoadMenstruationDataInput
+import com.android.healthconnect.controller.data.entries.api.LoadMenstruationDataUseCase
+import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
+import com.android.healthconnect.controller.service.HealthManagerModule
+import com.android.healthconnect.controller.shared.usecase.UseCaseResults
+import com.android.healthconnect.controller.tests.utils.NOW
+import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.forDataType
+import com.android.healthconnect.controller.tests.utils.getMetaData
+import com.android.healthconnect.controller.tests.utils.setLocale
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.testing.BindValue
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import dagger.hilt.android.testing.UninstallModules
+import java.time.Duration.ofDays
+import java.time.ZoneId
+import java.util.Locale
+import java.util.TimeZone
+import javax.inject.Inject
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.ArgumentMatchers
+import org.mockito.Mockito
+import org.mockito.MockitoAnnotations
+import org.mockito.invocation.InvocationOnMock
+
+@HiltAndroidTest
+@UninstallModules(HealthManagerModule::class)
+class LoadMenstruationDataUseCaseTest {
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    private lateinit var context: Context
+    private lateinit var loadMenstruationDataUseCase: LoadMenstruationDataUseCase
+
+    @Inject lateinit var loadEntriesHelper: LoadEntriesHelper
+
+    @BindValue
+    val healthConnectManager: HealthConnectManager = Mockito.mock(HealthConnectManager::class.java)
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        context = InstrumentationRegistry.getInstrumentation().context
+        context.setLocale(Locale.US)
+        hiltRule.inject()
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
+        loadMenstruationDataUseCase =
+            LoadMenstruationDataUseCase(loadEntriesHelper, Dispatchers.Main)
+    }
+
+    @Test
+    fun invoke_noData_returnsEmptyList() = runTest {
+        Mockito.doAnswer(prepareRecordsAnswer(listOf()))
+            .`when`(healthConnectManager)
+            .readRecords<MenstruationFlowRecord>(
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+
+        Mockito.doAnswer(prepareRecordsAnswer(listOf()))
+            .`when`(healthConnectManager)
+            .readRecords<MenstruationPeriodRecord>(
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+
+        val input =
+            LoadMenstruationDataInput(
+                packageName = TEST_APP_PACKAGE_NAME,
+                displayedStartTime = NOW,
+                period = DateNavigationPeriod.PERIOD_MONTH,
+                showDataOrigin = true,
+            )
+
+        val result = loadMenstruationDataUseCase.invoke(input)
+        assertThat(result is UseCaseResults.Success).isTrue()
+        assertThat((result as UseCaseResults.Success).data).isEmpty()
+    }
+
+    @Test
+    fun invoke_periodDay_returnsFormattedData() = runTest {
+        val menstruationPeriodRecords =
+            listOf(
+                MenstruationPeriodRecord.Builder(getMetaData(), NOW, NOW.plus(ofDays(5))).build(),
+                MenstruationPeriodRecord.Builder(
+                        getMetaData(),
+                        NOW.minus(ofDays(1)),
+                        NOW.plus(ofDays(2)),
+                    )
+                    .build(),
+            )
+        val menstruationFlowRecords =
+            listOf(
+                MenstruationFlowRecord.Builder(
+                        getMetaData(),
+                        NOW,
+                        MenstruationFlowRecord.MenstruationFlowType.FLOW_HEAVY,
+                    )
+                    .build()
+            )
+        Mockito.doAnswer(prepareRecordsAnswer(menstruationPeriodRecords))
+            .`when`(healthConnectManager)
+            .readRecords(
+                ArgumentMatchers.argThat<ReadRecordsRequestUsingFilters<Record>> { request ->
+                    request.forDataType(dataType = MenstruationPeriodRecord::class.java)
+                },
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+        Mockito.doAnswer(prepareRecordsAnswer(menstruationFlowRecords))
+            .`when`(healthConnectManager)
+            .readRecords(
+                ArgumentMatchers.argThat<ReadRecordsRequestUsingFilters<Record>> { request ->
+                    request.forDataType(dataType = MenstruationFlowRecord::class.java)
+                },
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+
+        val input =
+            LoadMenstruationDataInput(
+                packageName = TEST_APP_PACKAGE_NAME,
+                displayedStartTime = NOW,
+                period = DateNavigationPeriod.PERIOD_DAY,
+                showDataOrigin = true,
+            )
+
+        val result = loadMenstruationDataUseCase.invoke(input)
+        assertThat(result is UseCaseResults.Success).isTrue()
+        assertThat((result as UseCaseResults.Success).data)
+            .containsExactlyElementsIn(
+                listOf(
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = TEST_APP_NAME,
+                        headerA11y = TEST_APP_NAME,
+                        title = "Period day 1 of 6",
+                        titleA11y = "Period day 1 of 6",
+                        dataType = MenstruationPeriodRecord::class,
+                        startTime = NOW,
+                        endTime = NOW.plus(ofDays(5)),
+                    ),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = TEST_APP_NAME,
+                        headerA11y = TEST_APP_NAME,
+                        title = "Period day 2 of 4",
+                        titleA11y = "Period day 2 of 4",
+                        dataType = MenstruationPeriodRecord::class,
+                        startTime = NOW.minus(ofDays(1)),
+                        endTime = NOW.plus(ofDays(2)),
+                    ),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "7:06 AM • $TEST_APP_NAME",
+                        headerA11y = "7:06 AM • $TEST_APP_NAME",
+                        title = "Heavy flow",
+                        titleA11y = "Heavy flow",
+                        dataType = MenstruationFlowRecord::class,
+                    ),
+                )
+            )
+    }
+
+    @Test
+    fun invoke_periodWeek_returnsFormattedData() = runTest {
+        // NOW is on a Thursday
+        val menstruationPeriodRecords =
+            listOf(
+                MenstruationPeriodRecord.Builder(getMetaData(), NOW, NOW.plus(ofDays(5))).build(),
+                MenstruationPeriodRecord.Builder(
+                        getMetaData(),
+                        NOW.minus(ofDays(1)),
+                        NOW.plus(ofDays(2)),
+                    )
+                    .build(),
+            )
+        val menstruationFlowRecords =
+            listOf(
+                MenstruationFlowRecord.Builder(
+                        getMetaData(),
+                        NOW,
+                        MenstruationFlowRecord.MenstruationFlowType.FLOW_HEAVY,
+                    )
+                    .build(),
+                MenstruationFlowRecord.Builder(
+                        getMetaData(),
+                        NOW.minus(ofDays(2)),
+                        MenstruationFlowRecord.MenstruationFlowType.FLOW_LIGHT,
+                    )
+                    .build(),
+            )
+        Mockito.doAnswer(prepareRecordsAnswer(menstruationPeriodRecords))
+            .`when`(healthConnectManager)
+            .readRecords(
+                ArgumentMatchers.argThat<ReadRecordsRequestUsingFilters<Record>> { request ->
+                    request.forDataType(dataType = MenstruationPeriodRecord::class.java)
+                },
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+        Mockito.doAnswer(prepareRecordsAnswer(menstruationFlowRecords))
+            .`when`(healthConnectManager)
+            .readRecords(
+                ArgumentMatchers.argThat<ReadRecordsRequestUsingFilters<Record>> { request ->
+                    request.forDataType(dataType = MenstruationFlowRecord::class.java)
+                },
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+
+        val input =
+            LoadMenstruationDataInput(
+                packageName = TEST_APP_PACKAGE_NAME,
+                displayedStartTime = NOW,
+                period = DateNavigationPeriod.PERIOD_WEEK,
+                showDataOrigin = true,
+            )
+
+        val result = loadMenstruationDataUseCase.invoke(input)
+        assertThat(result is UseCaseResults.Success).isTrue()
+        assertThat((result as UseCaseResults.Success).data)
+            .containsExactlyElementsIn(
+                listOf(
+                    FormattedEntry.EntryDateSectionHeader(date = "Today"),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "Oct 20 – 25 • $TEST_APP_NAME",
+                        headerA11y = "Oct 20 – 25 • $TEST_APP_NAME",
+                        title = "Period (6 days)",
+                        titleA11y = "Period (6 days)",
+                        dataType = MenstruationPeriodRecord::class,
+                        startTime = NOW,
+                        endTime = NOW.plus(ofDays(5)),
+                    ),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "7:06 AM • $TEST_APP_NAME",
+                        headerA11y = "7:06 AM • $TEST_APP_NAME",
+                        title = "Heavy flow",
+                        titleA11y = "Heavy flow",
+                        dataType = MenstruationFlowRecord::class,
+                    ),
+                    FormattedEntry.EntryDateSectionHeader(date = "Yesterday"),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "Oct 19 – 22 • $TEST_APP_NAME",
+                        headerA11y = "Oct 19 – 22 • $TEST_APP_NAME",
+                        title = "Period (4 days)",
+                        titleA11y = "Period (4 days)",
+                        dataType = MenstruationPeriodRecord::class,
+                        startTime = NOW.minus(ofDays(1)),
+                        endTime = NOW.plus(ofDays(2)),
+                    ),
+                    FormattedEntry.EntryDateSectionHeader(date = "October 18, 2022"),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "7:06 AM • $TEST_APP_NAME",
+                        headerA11y = "7:06 AM • $TEST_APP_NAME",
+                        title = "Light flow",
+                        titleA11y = "Light flow",
+                        dataType = MenstruationFlowRecord::class,
+                    ),
+                )
+            )
+    }
+
+    @Test
+    fun invoke_periodMonth_returnsFormattedData() = runTest {
+        val menstruationPeriodRecords =
+            listOf(
+                MenstruationPeriodRecord.Builder(getMetaData(), NOW, NOW.plus(ofDays(5))).build(),
+                MenstruationPeriodRecord.Builder(
+                        getMetaData(),
+                        NOW.minus(ofDays(1)),
+                        NOW.plus(ofDays(2)),
+                    )
+                    .build(),
+                MenstruationPeriodRecord.Builder(
+                        getMetaData(),
+                        NOW.minus(ofDays(10)),
+                        NOW.minus(ofDays(10)),
+                    )
+                    .build(),
+            )
+        val menstruationFlowRecords =
+            listOf(
+                MenstruationFlowRecord.Builder(
+                        getMetaData(),
+                        NOW,
+                        MenstruationFlowRecord.MenstruationFlowType.FLOW_HEAVY,
+                    )
+                    .build(),
+                MenstruationFlowRecord.Builder(
+                        getMetaData(),
+                        NOW.minus(ofDays(2)),
+                        MenstruationFlowRecord.MenstruationFlowType.FLOW_LIGHT,
+                    )
+                    .build(),
+            )
+        Mockito.doAnswer(prepareRecordsAnswer(menstruationPeriodRecords))
+            .`when`(healthConnectManager)
+            .readRecords(
+                ArgumentMatchers.argThat<ReadRecordsRequestUsingFilters<Record>> { request ->
+                    request.forDataType(dataType = MenstruationPeriodRecord::class.java)
+                },
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+        Mockito.doAnswer(prepareRecordsAnswer(menstruationFlowRecords))
+            .`when`(healthConnectManager)
+            .readRecords(
+                ArgumentMatchers.argThat<ReadRecordsRequestUsingFilters<Record>> { request ->
+                    request.forDataType(dataType = MenstruationFlowRecord::class.java)
+                },
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
+
+        val input =
+            LoadMenstruationDataInput(
+                packageName = TEST_APP_PACKAGE_NAME,
+                displayedStartTime = NOW,
+                period = DateNavigationPeriod.PERIOD_WEEK,
+                showDataOrigin = true,
+            )
+
+        val result = loadMenstruationDataUseCase.invoke(input)
+        assertThat(result is UseCaseResults.Success).isTrue()
+        assertThat((result as UseCaseResults.Success).data)
+            .containsExactlyElementsIn(
+                listOf(
+                    FormattedEntry.EntryDateSectionHeader(date = "Today"),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "Oct 20 – 25 • $TEST_APP_NAME",
+                        headerA11y = "Oct 20 – 25 • $TEST_APP_NAME",
+                        title = "Period (6 days)",
+                        titleA11y = "Period (6 days)",
+                        dataType = MenstruationPeriodRecord::class,
+                        startTime = NOW,
+                        endTime = NOW.plus(ofDays(5)),
+                    ),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "7:06 AM • $TEST_APP_NAME",
+                        headerA11y = "7:06 AM • $TEST_APP_NAME",
+                        title = "Heavy flow",
+                        titleA11y = "Heavy flow",
+                        dataType = MenstruationFlowRecord::class,
+                    ),
+                    FormattedEntry.EntryDateSectionHeader(date = "Yesterday"),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "Oct 19 – 22 • $TEST_APP_NAME",
+                        headerA11y = "Oct 19 – 22 • $TEST_APP_NAME",
+                        title = "Period (4 days)",
+                        titleA11y = "Period (4 days)",
+                        dataType = MenstruationPeriodRecord::class,
+                        startTime = NOW.minus(ofDays(1)),
+                        endTime = NOW.plus(ofDays(2)),
+                    ),
+                    FormattedEntry.EntryDateSectionHeader(date = "October 18, 2022"),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "7:06 AM • $TEST_APP_NAME",
+                        headerA11y = "7:06 AM • $TEST_APP_NAME",
+                        title = "Light flow",
+                        titleA11y = "Light flow",
+                        dataType = MenstruationFlowRecord::class,
+                    ),
+                    FormattedEntry.EntryDateSectionHeader(date = "October 10, 2022"),
+                    FormattedEntry.FormattedDataEntry(
+                        uuid = "test_id",
+                        header = "October 10 • $TEST_APP_NAME",
+                        headerA11y = "October 10 • $TEST_APP_NAME",
+                        title = "Period (1 day)",
+                        titleA11y = "Period (1 day)",
+                        dataType = MenstruationPeriodRecord::class,
+                        startTime = NOW.minus(ofDays(10)),
+                        endTime = NOW.minus(ofDays(10)),
+                    ),
+                )
+            )
+    }
+
+    private fun prepareRecordsAnswer(records: List<Record>): (InvocationOnMock) -> Nothing? {
+        val answer = { args: InvocationOnMock ->
+            val receiver = args.arguments[2] as OutcomeReceiver<ReadRecordsResponse<Record>, *>
+            receiver.onResult(ReadRecordsResponse(records, -1))
+            null
+        }
+        return answer
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/datenavigation/DateNavigationViewTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/datenavigation/DateNavigationViewTest.kt
index d20e2f9..ae653dd 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/datenavigation/DateNavigationViewTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entries/datenavigation/DateNavigationViewTest.kt
@@ -16,7 +16,6 @@
 package com.android.healthconnect.controller.tests.data.entries.datenavigation
 
 import android.content.Context
-import android.view.View
 import android.view.View.GONE
 import android.view.View.VISIBLE
 import android.widget.ImageButton
@@ -35,7 +34,9 @@
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import java.time.Duration
+import java.time.ZoneId
 import java.util.Locale
+import java.util.TimeZone
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -68,6 +69,8 @@
         datePickerSpinner = dateNavigationView.findViewById(R.id.date_picker_spinner) as Spinner
         previousDayButton = dateNavigationView.findViewById(R.id.navigation_previous_day)
         nextDayButton = dateNavigationView.findViewById(R.id.navigation_next_day)
+        (timeSource as TestTimeSource).setNow(NOW)
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
     }
 
     @Test
@@ -202,13 +205,21 @@
 
     @Test
     fun initDateNavigationPreference_nextNavigationDisabled() {
-        assertThat(nextDayButton.visibility).isEqualTo(View.VISIBLE)
+        assertThat(nextDayButton.visibility).isEqualTo(VISIBLE)
         assertThat(nextDayButton.isEnabled).isEqualTo(false)
     }
 
     @Test
+    fun initDateNavigationPreference_whenTrainingPlans_nextNavigationEnabled() {
+        dateNavigationView.setDate(NOW.plus(Duration.ofDays(1)))
+        dateNavigationView.setMaxDate(null)
+        assertThat(nextDayButton.visibility).isEqualTo(VISIBLE)
+        assertThat(nextDayButton.isEnabled).isEqualTo(true)
+    }
+
+    @Test
     fun initDateNavigationPreference_prevNavigationEnabled() {
-        assertThat(previousDayButton.visibility).isEqualTo(View.VISIBLE)
+        assertThat(previousDayButton.visibility).isEqualTo(VISIBLE)
         assertThat(previousDayButton.isEnabled).isEqualTo(true)
     }
 
@@ -253,7 +264,7 @@
     }
 
     @Test
-    fun disableDateNavigationView_disablesCorrectly(){
+    fun disableDateNavigationView_disablesCorrectly() {
         dateNavigationView.setDate(NOW.minus(Duration.ofDays(1)))
         dateNavigationView.disableDateNavigationView(isEnabled = false, text = "Yesterday")
 
@@ -267,7 +278,10 @@
     private fun assertSpinnerView(expected: String) {
         val textView: TextView =
             datePickerSpinner.adapter.getView(
-                datePickerSpinner.selectedItemPosition, null, datePickerSpinner) as TextView
+                datePickerSpinner.selectedItemPosition,
+                null,
+                datePickerSpinner,
+            ) as TextView
         assertThat(textView.text).isEqualTo(expected)
     }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/entriesandaccess/EntriesAndAccessFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/entriesandaccess/EntriesAndAccessFragmentTest.kt
index 4a60a8b..9678f5a 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/entriesandaccess/EntriesAndAccessFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/entriesandaccess/EntriesAndAccessFragmentTest.kt
@@ -23,7 +23,7 @@
 import com.android.healthconnect.controller.data.appdata.AppDataFragment.Companion.PERMISSION_TYPE_NAME_KEY
 import com.android.healthconnect.controller.data.entriesandaccess.EntriesAndAccessFragment
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.STEPS
-import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.IMMUNIZATION
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.VACCINES
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -51,7 +51,7 @@
     @Test
     fun entriesAndAccessInit_medicalData_showsTabs() {
         launchFragment<EntriesAndAccessFragment>(
-            bundleOf(PERMISSION_TYPE_NAME_KEY to IMMUNIZATION.name))
+            bundleOf(PERMISSION_TYPE_NAME_KEY to VACCINES.name))
 
         onView(withText("Entries")).check(matches(isDisplayed()))
         onView(withText("Access")).check(matches(isDisplayed()))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirFormatterTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirFormatterTest.kt
index 7a59e0a..8ebc1dc 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirFormatterTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirFormatterTest.kt
@@ -124,9 +124,28 @@
         assertThat(rawFhirFormatter.format(TEST_FHIR_RESOURCE_IMMUNIZATION))
             .isEqualTo(
                 "{\n" +
-                    "    \"resourceType\": \"Immunization\",\n" +
-                    "    \"id\": \"Immunization_1\"\n" +
-                    "}"
+                        "    \"resourceType\": \"Immunization\",\n" +
+                        "    \"id\": \"immunization-1\",\n" +
+                        "    \"status\": \"completed\",\n" +
+                        "    \"vaccineCode\": {\n" +
+                        "        \"coding\": [\n" +
+                        "            {\n" +
+                        "                \"system\": \"http://hl7.org/fhir/sid/cvx\",\n" +
+                        "                \"code\": \"115\"\n" +
+                        "            },\n" +
+                        "            {\n" +
+                        "                \"system\": \"http://hl7.org/fhir/sid/ndc\",\n" +
+                        "                \"code\": \"58160-842-11\"\n" +
+                        "            }\n" +
+                        "        ],\n" +
+                        "        \"text\": \"Tdap\"\n" +
+                        "    },\n" +
+                        "    \"patient\": {\n" +
+                        "        \"reference\": \"Patient/patient_1\",\n" +
+                        "        \"display\": \"Example, Anne\"\n" +
+                        "    },\n" +
+                        "    \"occurrenceDateTime\": \"2018-05-21\"\n" +
+                        "}"
             )
     }
 
@@ -136,7 +155,7 @@
             .isEqualTo(
                 "{\n" +
                     "    \"resourceType\": \"Immunization\",\n" +
-                    "    \"id\": \"immunization_1\",\n" +
+                    "    \"id\": \"immunization-1\",\n" +
                     "    \"status\": \"completed\",\n" +
                     "    \"vaccineCode\": {\n" +
                     "        \"coding\": [\n" +
@@ -233,7 +252,7 @@
     fun contentDescription_smallImmunization_formatCorrectly() {
         assertThat(rawFhirFormatter.fhirContentDescription(TEST_FHIR_RESOURCE_IMMUNIZATION))
             .isEqualTo(
-                "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: Immunization_1.Closed bracket."
+                "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: immunization-1. Field status Value: completed. Field vaccineCode ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/cvx.     Field code Value    : 115.    Closed bracket.Detailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/ndc.     Field code Value    : 58160-842-11.    Closed bracket.   Field text Value  : Tdap.  Closed bracket. Field patient ValueDetailed source code:   Open bracket.   Field reference Value  : Patient/patient_1.   Field display Value  : Example, Anne.  Closed bracket. Field occurrenceDateTime Value: 2018-05-21.Closed bracket."
             )
     }
 
@@ -241,7 +260,7 @@
     fun contentDescription_longImmunization_formatCorrectly() {
         assertThat(rawFhirFormatter.fhirContentDescription(TEST_FHIR_RESOURCE_IMMUNIZATION_LONG))
             .isEqualTo(
-                "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: immunization_1. Field status Value: completed. Field vaccineCode ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/cvx.     Field code Value    : 115.    Closed bracket.Detailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/ndc.     Field code Value    : 58160-842-11.    Closed bracket.   Field text Value  : Tdap.  Closed bracket. Field patient ValueDetailed source code:   Open bracket.   Field reference Value  : Patient/patient_1.   Field display Value  : Example, Anne.  Closed bracket. Field encounter ValueDetailed source code:   Open bracket.   Field reference Value  : Encounter/encounter_unk.   Field display Value  : GP Visit.  Closed bracket. Field occurrenceDateTime Value: 2018-05-21. Field primarySource Value: true. Field manufacturer ValueDetailed source code:   Open bracket.   Field display Value  : Sanofi Pasteur.  Closed bracket. Field lotNumber Value: 1. Field site ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-ActSite.     Field code Value    : LA.     Field display Value    : Left Arm.    Closed bracket.   Field text Value  : Left Arm.  Closed bracket. Field route ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration.     Field code Value    : IM.     Field display Value    : Injection, intramuscular.    Closed bracket.   Field text Value  : Injection, intramuscular.  Closed bracket. Field doseQuantity ValueDetailed source code:   Open bracket.   Field value Value  : 0.5.   Field unit Value  : mL.  Closed bracket. Field performer ValueDetailed source code:   Open bracket.   Field function ValueDetailed source code:     Open bracket.     Field coding ValueDetailed source code:       Open bracket.       Field system Value      : http://terminology.hl7.org/CodeSystem/v2-0443.       Field code Value      : AP.       Field display Value      : Administering Provider.      Closed bracket.     Field text Value    : Administering Provider.    Closed bracket.   Field actor ValueDetailed source code:     Open bracket.     Field reference Value    : Practitioner/practitioner_1.     Field type Value    : Practitioner.     Field display Value    : Dr Maria Hernandez.    Closed bracket.  Closed bracket.Closed bracket."
+                "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: immunization-1. Field status Value: completed. Field vaccineCode ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/cvx.     Field code Value    : 115.    Closed bracket.Detailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/ndc.     Field code Value    : 58160-842-11.    Closed bracket.   Field text Value  : Tdap.  Closed bracket. Field patient ValueDetailed source code:   Open bracket.   Field reference Value  : Patient/patient_1.   Field display Value  : Example, Anne.  Closed bracket. Field encounter ValueDetailed source code:   Open bracket.   Field reference Value  : Encounter/encounter_unk.   Field display Value  : GP Visit.  Closed bracket. Field occurrenceDateTime Value: 2018-05-21. Field primarySource Value: true. Field manufacturer ValueDetailed source code:   Open bracket.   Field display Value  : Sanofi Pasteur.  Closed bracket. Field lotNumber Value: 1. Field site ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-ActSite.     Field code Value    : LA.     Field display Value    : Left Arm.    Closed bracket.   Field text Value  : Left Arm.  Closed bracket. Field route ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration.     Field code Value    : IM.     Field display Value    : Injection, intramuscular.    Closed bracket.   Field text Value  : Injection, intramuscular.  Closed bracket. Field doseQuantity ValueDetailed source code:   Open bracket.   Field value Value  : 0.5.   Field unit Value  : mL.  Closed bracket. Field performer ValueDetailed source code:   Open bracket.   Field function ValueDetailed source code:     Open bracket.     Field coding ValueDetailed source code:       Open bracket.       Field system Value      : http://terminology.hl7.org/CodeSystem/v2-0443.       Field code Value      : AP.       Field display Value      : Administering Provider.      Closed bracket.     Field text Value    : Administering Provider.    Closed bracket.   Field actor ValueDetailed source code:     Open bracket.     Field reference Value    : Practitioner/practitioner_1.     Field type Value    : Practitioner.     Field display Value    : Dr Maria Hernandez.    Closed bracket.  Closed bracket.Closed bracket."
             )
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirFragmentTest.kt
index 5338642..643b242 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirFragmentTest.kt
@@ -15,7 +15,6 @@
  */
 package com.android.healthconnect.controller.tests.data.rawfhir
 
-import android.health.connect.HealthConnectManager
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MutableLiveData
 import androidx.test.espresso.Espresso.onView
@@ -34,33 +33,125 @@
 import com.android.healthconnect.controller.data.rawfhir.RawFhirViewModel.RawFhirState.WithData
 import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION
 import com.android.healthconnect.controller.tests.utils.launchFragment
+import com.android.healthconnect.controller.tests.utils.toggleAnimation
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthconnect.controller.utils.logging.RawFhirPageElement
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
-import kotlinx.coroutines.ExperimentalCoroutinesApi
+import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
-import org.mockito.Mockito
+import org.mockito.Mockito.atLeast
 import org.mockito.Mockito.mock
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.whenever
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @HiltAndroidTest
 class RawFhirFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
-    var manager: HealthConnectManager = mock(HealthConnectManager::class.java)
 
     @BindValue val viewModel: RawFhirViewModel = mock(RawFhirViewModel::class.java)
+    @BindValue val healthConnectLogger: HealthConnectLogger = mock(HealthConnectLogger::class.java)
+
+    private val fhirResource =
+        "{\n" +
+            "    \"resourceType\": \"Immunization\",\n" +
+            "    \"id\": \"immunization_1\",\n" +
+            "    \"status\": \"completed\",\n" +
+            "    \"vaccineCode\": {\n" +
+            "        \"coding\": [\n" +
+            "            {\n" +
+            "                \"system\": \"http://hl7.org/fhir/sid/cvx\",\n" +
+            "                \"code\": \"115\"\n" +
+            "            },\n" +
+            "            {\n" +
+            "                \"system\": \"http://hl7.org/fhir/sid/ndc\",\n" +
+            "                \"code\": \"58160-842-11\"\n" +
+            "            }\n" +
+            "        ],\n" +
+            "        \"text\": \"Tdap\"\n" +
+            "    },\n" +
+            "    \"patient\": {\n" +
+            "        \"reference\": \"Patient/patient_1\",\n" +
+            "        \"display\": \"Example, Anne\"\n" +
+            "    },\n" +
+            "    \"encounter\": {\n" +
+            "        \"reference\": \"Encounter/encounter_unk\",\n" +
+            "        \"display\": \"GP Visit\"\n" +
+            "    },\n" +
+            "    \"occurrenceDateTime\": \"2018-05-21\",\n" +
+            "    \"primarySource\": true,\n" +
+            "    \"manufacturer\": {\n" +
+            "        \"display\": \"Sanofi Pasteur\"\n" +
+            "    },\n" +
+            "    \"lotNumber\": \"1\",\n" +
+            "    \"site\": {\n" +
+            "        \"coding\": [\n" +
+            "            {\n" +
+            "                \"system\": \"http://terminology.hl7.org/CodeSystem/v3-ActSite\",\n" +
+            "                \"code\": \"LA\",\n" +
+            "                \"display\": \"Left Arm\"\n" +
+            "            }\n" +
+            "        ],\n" +
+            "        \"text\": \"Left Arm\"\n" +
+            "    },\n" +
+            "    \"route\": {\n" +
+            "        \"coding\": [\n" +
+            "            {\n" +
+            "                \"system\": \"http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration\",\n" +
+            "                \"code\": \"IM\",\n" +
+            "                \"display\": \"Injection, intramuscular\"\n" +
+            "            }\n" +
+            "        ],\n" +
+            "        \"text\": \"Injection, intramuscular\"\n" +
+            "    },\n" +
+            "    \"doseQuantity\": {\n" +
+            "        \"value\": 0.5,\n" +
+            "        \"unit\": \"mL\"\n" +
+            "    },\n" +
+            "    \"performer\": [\n" +
+            "        {\n" +
+            "            \"function\": {\n" +
+            "                \"coding\": [\n" +
+            "                    {\n" +
+            "                        \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0443\",\n" +
+            "                        \"code\": \"AP\",\n" +
+            "                        \"display\": \"Administering Provider\"\n" +
+            "                    }\n" +
+            "                ],\n" +
+            "                \"text\": \"Administering Provider\"\n" +
+            "            },\n" +
+            "            \"actor\": {\n" +
+            "                \"reference\": \"Practitioner/practitioner_1\",\n" +
+            "                \"type\": \"Practitioner\",\n" +
+            "                \"display\": \"Dr Maria Hernandez\"\n" +
+            "            }\n" +
+            "        }\n" +
+            "    ]\n" +
+            "}"
+    private val contentDescription =
+        "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: immunization_1. Field status Value: completed. Field vaccineCode ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/cvx.     Field code Value    : 115.    Closed bracket.Detailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/ndc.     Field code Value    : 58160-842-11.    Closed bracket.   Field text Value  : Tdap.  Closed bracket. Field patient ValueDetailed source code:   Open bracket.   Field reference Value  : Patient/patient_1.   Field display Value  : Example, Anne.  Closed bracket. Field encounter ValueDetailed source code:   Open bracket.   Field reference Value  : Encounter/encounter_unk.   Field display Value  : GP Visit.  Closed bracket. Field occurrenceDateTime Value: 2018-05-21. Field primarySource Value: true. Field manufacturer ValueDetailed source code:   Open bracket.   Field display Value  : Sanofi Pasteur.  Closed bracket. Field lotNumber Value: 1. Field site ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-ActSite.     Field code Value    : LA.     Field display Value    : Left Arm.    Closed bracket.   Field text Value  : Left Arm.  Closed bracket. Field route ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration.     Field code Value    : IM.     Field display Value    : Injection, intramuscular.    Closed bracket.   Field text Value  : Injection, intramuscular.  Closed bracket. Field doseQuantity ValueDetailed source code:   Open bracket.   Field value Value  : 0.5.   Field unit Value  : mL.  Closed bracket. Field performer ValueDetailed source code:   Open bracket.   Field function ValueDetailed source code:     Open bracket.     Field coding ValueDetailed source code:       Open bracket.       Field system Value      : http://terminology.hl7.org/CodeSystem/v2-0443.       Field code Value      : AP.       Field display Value      : Administering Provider.      Closed bracket.     Field text Value    : Administering Provider.    Closed bracket.   Field actor ValueDetailed source code:     Open bracket.     Field reference Value    : Practitioner/practitioner_1.     Field type Value    : Practitioner.     Field display Value    : Dr Maria Hernandez.    Closed bracket.  Closed bracket.Closed bracket."
 
     @Before
     fun setup() {
         hiltRule.inject()
+        toggleAnimation(false)
+    }
+
+    @After
+    fun tearDown() {
+        toggleAnimation(true)
+        reset(healthConnectLogger)
     }
 
     @Test
     fun error_errorMessageDisplayed() {
-        Mockito.`when`(viewModel.rawFhir).then { MutableLiveData(Error) }
+        whenever(viewModel.rawFhir).then { MutableLiveData(Error) }
 
         launchFragment<RawFhirFragment>(
             bundleOf(
@@ -69,12 +160,11 @@
         )
 
         onView(withText("Something went wrong. Please try again.")).check(matches(isDisplayed()))
-        // onView(ViewMatchers.withId(R.id.loading)).check(doesNotExist())
     }
 
     @Test
     fun loading_loadingDisplayed() {
-        Mockito.`when`(viewModel.rawFhir).then { MutableLiveData(Loading) }
+        whenever(viewModel.rawFhir).then { MutableLiveData(Loading) }
 
         launchFragment<RawFhirFragment>(
             bundleOf(
@@ -83,96 +173,34 @@
         )
 
         onView(ViewMatchers.withId(R.id.loading)).check(matches(isDisplayed()))
-        // onView(withText("Something went wrong. Please try again.")).check(doesNotExist())
         onView(withSubstring("resourceType")).check(doesNotExist())
     }
 
     @Test
     fun fhirResourcePresent_displaysFhirResource() {
-        val fhir =
-            "{\n" +
-                "    \"resourceType\": \"Immunization\",\n" +
-                "    \"id\": \"immunization_1\",\n" +
-                "    \"status\": \"completed\",\n" +
-                "    \"vaccineCode\": {\n" +
-                "        \"coding\": [\n" +
-                "            {\n" +
-                "                \"system\": \"http://hl7.org/fhir/sid/cvx\",\n" +
-                "                \"code\": \"115\"\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"system\": \"http://hl7.org/fhir/sid/ndc\",\n" +
-                "                \"code\": \"58160-842-11\"\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"text\": \"Tdap\"\n" +
-                "    },\n" +
-                "    \"patient\": {\n" +
-                "        \"reference\": \"Patient/patient_1\",\n" +
-                "        \"display\": \"Example, Anne\"\n" +
-                "    },\n" +
-                "    \"encounter\": {\n" +
-                "        \"reference\": \"Encounter/encounter_unk\",\n" +
-                "        \"display\": \"GP Visit\"\n" +
-                "    },\n" +
-                "    \"occurrenceDateTime\": \"2018-05-21\",\n" +
-                "    \"primarySource\": true,\n" +
-                "    \"manufacturer\": {\n" +
-                "        \"display\": \"Sanofi Pasteur\"\n" +
-                "    },\n" +
-                "    \"lotNumber\": \"1\",\n" +
-                "    \"site\": {\n" +
-                "        \"coding\": [\n" +
-                "            {\n" +
-                "                \"system\": \"http://terminology.hl7.org/CodeSystem/v3-ActSite\",\n" +
-                "                \"code\": \"LA\",\n" +
-                "                \"display\": \"Left Arm\"\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"text\": \"Left Arm\"\n" +
-                "    },\n" +
-                "    \"route\": {\n" +
-                "        \"coding\": [\n" +
-                "            {\n" +
-                "                \"system\": \"http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration\",\n" +
-                "                \"code\": \"IM\",\n" +
-                "                \"display\": \"Injection, intramuscular\"\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"text\": \"Injection, intramuscular\"\n" +
-                "    },\n" +
-                "    \"doseQuantity\": {\n" +
-                "        \"value\": 0.5,\n" +
-                "        \"unit\": \"mL\"\n" +
-                "    },\n" +
-                "    \"performer\": [\n" +
-                "        {\n" +
-                "            \"function\": {\n" +
-                "                \"coding\": [\n" +
-                "                    {\n" +
-                "                        \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0443\",\n" +
-                "                        \"code\": \"AP\",\n" +
-                "                        \"display\": \"Administering Provider\"\n" +
-                "                    }\n" +
-                "                ],\n" +
-                "                \"text\": \"Administering Provider\"\n" +
-                "            },\n" +
-                "            \"actor\": {\n" +
-                "                \"reference\": \"Practitioner/practitioner_1\",\n" +
-                "                \"type\": \"Practitioner\",\n" +
-                "                \"display\": \"Dr Maria Hernandez\"\n" +
-                "            }\n" +
-                "        }\n" +
-                "    ]\n" +
-                "}"
-        val contentDescription =
-            "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: immunization_1. Field status Value: completed. Field vaccineCode ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/cvx.     Field code Value    : 115.    Closed bracket.Detailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/ndc.     Field code Value    : 58160-842-11.    Closed bracket.   Field text Value  : Tdap.  Closed bracket. Field patient ValueDetailed source code:   Open bracket.   Field reference Value  : Patient/patient_1.   Field display Value  : Example, Anne.  Closed bracket. Field encounter ValueDetailed source code:   Open bracket.   Field reference Value  : Encounter/encounter_unk.   Field display Value  : GP Visit.  Closed bracket. Field occurrenceDateTime Value: 2018-05-21. Field primarySource Value: true. Field manufacturer ValueDetailed source code:   Open bracket.   Field display Value  : Sanofi Pasteur.  Closed bracket. Field lotNumber Value: 1. Field site ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-ActSite.     Field code Value    : LA.     Field display Value    : Left Arm.    Closed bracket.   Field text Value  : Left Arm.  Closed bracket. Field route ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration.     Field code Value    : IM.     Field display Value    : Injection, intramuscular.    Closed bracket.   Field text Value  : Injection, intramuscular.  Closed bracket. Field doseQuantity ValueDetailed source code:   Open bracket.   Field value Value  : 0.5.   Field unit Value  : mL.  Closed bracket. Field performer ValueDetailed source code:   Open bracket.   Field function ValueDetailed source code:     Open bracket.     Field coding ValueDetailed source code:       Open bracket.       Field system Value      : http://terminology.hl7.org/CodeSystem/v2-0443.       Field code Value      : AP.       Field display Value      : Administering Provider.      Closed bracket.     Field text Value    : Administering Provider.    Closed bracket.   Field actor ValueDetailed source code:     Open bracket.     Field reference Value    : Practitioner/practitioner_1.     Field type Value    : Practitioner.     Field display Value    : Dr Maria Hernandez.    Closed bracket.  Closed bracket.Closed bracket."
-        Mockito.`when`(viewModel.rawFhir).then {
+        launchFragmentWithData()
+
+        onView(withText(fhirResource)).check(matches(isDisplayed()))
+        onView(withContentDescription(contentDescription)).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun logPageImpression() {
+        launchFragmentWithData()
+
+        onView(withText(fhirResource)).check(matches(isDisplayed()))
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.RAW_FHIR_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+        verify(healthConnectLogger).logImpression(RawFhirPageElement.RAW_FHIR_RESOURCE)
+    }
+
+    private fun launchFragmentWithData() {
+        whenever(viewModel.rawFhir).then {
             MutableLiveData(
                 WithData(
                     listOf(
                         RawFhirViewModel.FormattedFhir(
-                            fhir = fhir,
+                            fhir = fhirResource,
                             fhirContentDescription = contentDescription,
                         )
                     )
@@ -185,7 +213,5 @@
                 RawFhirFragment.MEDICAL_RESOURCE_ID_KEY to TEST_MEDICAL_RESOURCE_IMMUNIZATION.id
             )
         )
-        onView(withText(fhir)).check(matches(isDisplayed()))
-        onView(withContentDescription(contentDescription)).check(matches(isDisplayed()))
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirUseCaseTest.kt
index a031ec7..770d0f8 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirUseCaseTest.kt
@@ -25,6 +25,7 @@
 import com.android.healthconnect.controller.data.rawfhir.RawFhirUseCase
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
 import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
+import com.android.healthconnect.controller.tests.utils.TEST_DATASOURCE_ID
 import com.android.healthconnect.controller.tests.utils.TEST_FHIR_RESOURCE_IMMUNIZATION
 import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION
 import com.android.healthconnect.controller.tests.utils.setLocale
@@ -94,7 +95,7 @@
         assertThat((result as UseCaseResults.Failed).exception is IllegalStateException).isTrue()
         assertThat((result.exception as IllegalStateException).message)
             .isEqualTo(
-                "No FHIR resource found for given MedicalResourceId{dataSourceId=123,fhirResourceType=1,fhirResourceId=Immunization1}"
+                "No FHIR resource found for given MedicalResourceId{dataSourceId=$TEST_DATASOURCE_ID,fhirResourceType=1,fhirResourceId=Immunization1}"
             )
     }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirViewModelTest.kt
index 313e273..c50fe32 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/data/rawfhir/RawFhirViewModelTest.kt
@@ -123,12 +123,31 @@
             listOf(
                 RawFhirViewModel.FormattedFhir(
                     fhir =
-                        "{\n" +
+                    "{\n" +
                             "    \"resourceType\": \"Immunization\",\n" +
-                            "    \"id\": \"Immunization_1\"\n" +
+                            "    \"id\": \"immunization-1\",\n" +
+                            "    \"status\": \"completed\",\n" +
+                            "    \"vaccineCode\": {\n" +
+                            "        \"coding\": [\n" +
+                            "            {\n" +
+                            "                \"system\": \"http://hl7.org/fhir/sid/cvx\",\n" +
+                            "                \"code\": \"115\"\n" +
+                            "            },\n" +
+                            "            {\n" +
+                            "                \"system\": \"http://hl7.org/fhir/sid/ndc\",\n" +
+                            "                \"code\": \"58160-842-11\"\n" +
+                            "            }\n" +
+                            "        ],\n" +
+                            "        \"text\": \"Tdap\"\n" +
+                            "    },\n" +
+                            "    \"patient\": {\n" +
+                            "        \"reference\": \"Patient/patient_1\",\n" +
+                            "        \"display\": \"Example, Anne\"\n" +
+                            "    },\n" +
+                            "    \"occurrenceDateTime\": \"2018-05-21\"\n" +
                             "}",
                     fhirContentDescription =
-                        "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: Immunization_1.Closed bracket.",
+                        "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: immunization-1. Field status Value: completed. Field vaccineCode ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/cvx.     Field code Value    : 115.    Closed bracket.Detailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/ndc.     Field code Value    : 58160-842-11.    Closed bracket.   Field text Value  : Tdap.  Closed bracket. Field patient ValueDetailed source code:   Open bracket.   Field reference Value  : Patient/patient_1.   Field display Value  : Example, Anne.  Closed bracket. Field occurrenceDateTime Value: 2018-05-21.Closed bracket.",
                 )
             )
         assertThat(testObserver.getLastValue())
@@ -158,7 +177,7 @@
                     fhir =
                         "{\n" +
                             "    \"resourceType\": \"Immunization\",\n" +
-                            "    \"id\": \"immunization_1\",\n" +
+                            "    \"id\": \"immunization-1\",\n" +
                             "    \"status\": \"completed\",\n" +
                             "    \"vaccineCode\": {\n" +
                             "        \"coding\": [\n" +
@@ -232,7 +251,7 @@
                             "    ]\n" +
                             "}",
                     fhirContentDescription =
-                        "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: immunization_1. Field status Value: completed. Field vaccineCode ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/cvx.     Field code Value    : 115.    Closed bracket.Detailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/ndc.     Field code Value    : 58160-842-11.    Closed bracket.   Field text Value  : Tdap.  Closed bracket. Field patient ValueDetailed source code:   Open bracket.   Field reference Value  : Patient/patient_1.   Field display Value  : Example, Anne.  Closed bracket. Field encounter ValueDetailed source code:   Open bracket.   Field reference Value  : Encounter/encounter_unk.   Field display Value  : GP Visit.  Closed bracket. Field occurrenceDateTime Value: 2018-05-21. Field primarySource Value: true. Field manufacturer ValueDetailed source code:   Open bracket.   Field display Value  : Sanofi Pasteur.  Closed bracket. Field lotNumber Value: 1. Field site ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-ActSite.     Field code Value    : LA.     Field display Value    : Left Arm.    Closed bracket.   Field text Value  : Left Arm.  Closed bracket. Field route ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration.     Field code Value    : IM.     Field display Value    : Injection, intramuscular.    Closed bracket.   Field text Value  : Injection, intramuscular.  Closed bracket. Field doseQuantity ValueDetailed source code:   Open bracket.   Field value Value  : 0.5.   Field unit Value  : mL.  Closed bracket. Field performer ValueDetailed source code:   Open bracket.   Field function ValueDetailed source code:     Open bracket.     Field coding ValueDetailed source code:       Open bracket.       Field system Value      : http://terminology.hl7.org/CodeSystem/v2-0443.       Field code Value      : AP.       Field display Value      : Administering Provider.      Closed bracket.     Field text Value    : Administering Provider.    Closed bracket.   Field actor ValueDetailed source code:     Open bracket.     Field reference Value    : Practitioner/practitioner_1.     Field type Value    : Practitioner.     Field display Value    : Dr Maria Hernandez.    Closed bracket.  Closed bracket.Closed bracket.",
+                        "Detailed source code: Open bracket. Field resourceType Value: Immunization. Field id Value: immunization-1. Field status Value: completed. Field vaccineCode ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/cvx.     Field code Value    : 115.    Closed bracket.Detailed source code:     Open bracket.     Field system Value    : http://hl7.org/fhir/sid/ndc.     Field code Value    : 58160-842-11.    Closed bracket.   Field text Value  : Tdap.  Closed bracket. Field patient ValueDetailed source code:   Open bracket.   Field reference Value  : Patient/patient_1.   Field display Value  : Example, Anne.  Closed bracket. Field encounter ValueDetailed source code:   Open bracket.   Field reference Value  : Encounter/encounter_unk.   Field display Value  : GP Visit.  Closed bracket. Field occurrenceDateTime Value: 2018-05-21. Field primarySource Value: true. Field manufacturer ValueDetailed source code:   Open bracket.   Field display Value  : Sanofi Pasteur.  Closed bracket. Field lotNumber Value: 1. Field site ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-ActSite.     Field code Value    : LA.     Field display Value    : Left Arm.    Closed bracket.   Field text Value  : Left Arm.  Closed bracket. Field route ValueDetailed source code:   Open bracket.   Field coding ValueDetailed source code:     Open bracket.     Field system Value    : http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration.     Field code Value    : IM.     Field display Value    : Injection, intramuscular.    Closed bracket.   Field text Value  : Injection, intramuscular.  Closed bracket. Field doseQuantity ValueDetailed source code:   Open bracket.   Field value Value  : 0.5.   Field unit Value  : mL.  Closed bracket. Field performer ValueDetailed source code:   Open bracket.   Field function ValueDetailed source code:     Open bracket.     Field coding ValueDetailed source code:       Open bracket.       Field system Value      : http://terminology.hl7.org/CodeSystem/v2-0443.       Field code Value      : AP.       Field display Value      : Administering Provider.      Closed bracket.     Field text Value    : Administering Provider.    Closed bracket.   Field actor ValueDetailed source code:     Open bracket.     Field reference Value    : Practitioner/practitioner_1.     Field type Value    : Practitioner.     Field display Value    : Dr Maria Hernandez.    Closed bracket.  Closed bracket.Closed bracket.",
                 )
             )
         assertThat(testObserver.getLastValue())
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataaccess/HealthDataAccessFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataaccess/HealthDataAccessFragmentTest.kt
index bd98837..0119b8c 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataaccess/HealthDataAccessFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataaccess/HealthDataAccessFragmentTest.kt
@@ -35,7 +35,6 @@
 import com.android.healthconnect.controller.permissiontypes.HealthPermissionTypesFragment.Companion.PERMISSION_TYPE_KEY
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.DataAccessElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -53,6 +52,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class HealthDataAccessFragmentTest {
@@ -84,7 +84,9 @@
         onView(withText("Inactive apps")).check(doesNotExist())
         onView(
                 withText(
-                    "These apps can no longer read or write distance, but still have data stored in Health\u00A0Connect"))
+                    "These apps can no longer read or write distance, but still have data stored in Health\u00A0Connect"
+                )
+            )
             .check(doesNotExist())
         onView(withText("Manage data")).check(matches(isDisplayed()))
         onView(withText("See all entries")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -95,9 +97,11 @@
     fun dataAccessFragment_readSection_isDisplayed() {
         val map =
             mapOf(
-                AppAccessState.Read to listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
+                AppAccessState.Read to
+                    listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
                 AppAccessState.Write to emptyList(),
-                AppAccessState.Inactive to emptyList())
+                AppAccessState.Inactive to emptyList(),
+            )
         whenever(viewModel.appMetadataMap).then {
             MutableLiveData<AccessScreenState>(WithData(map))
         }
@@ -108,7 +112,9 @@
         onView(withText("Inactive apps")).check(doesNotExist())
         onView(
                 withText(
-                    "These apps can no longer read or write distance, but still have data stored in Health\u00A0Connect"))
+                    "These apps can no longer read or write distance, but still have data stored in Health\u00A0Connect"
+                )
+            )
             .check(doesNotExist())
         onView(withText("Manage data")).check(matches(isDisplayed()))
         onView(withText("See all entries")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -119,9 +125,12 @@
     fun dataAccessFragment_readAndWriteSections_isDisplayed() {
         val map =
             mapOf(
-                AppAccessState.Read to listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
-                AppAccessState.Write to listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
-                AppAccessState.Inactive to emptyList())
+                AppAccessState.Read to
+                    listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
+                AppAccessState.Write to
+                    listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
+                AppAccessState.Inactive to emptyList(),
+            )
         whenever(viewModel.appMetadataMap).then {
             MutableLiveData<AccessScreenState>(WithData(map))
         }
@@ -132,7 +141,9 @@
         onView(withText("Inactive apps")).check(doesNotExist())
         onView(
                 withText(
-                    "These apps can no longer read or write distance, but still have data stored in Health\u00A0Connect"))
+                    "These apps can no longer read or write distance, but still have data stored in Health\u00A0Connect"
+                )
+            )
             .check(doesNotExist())
         onView(withText("Manage data")).check(matches(isDisplayed()))
         onView(withText("See all entries")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -152,7 +163,9 @@
             mapOf(
                 AppAccessState.Read to emptyList(),
                 AppAccessState.Write to emptyList(),
-                AppAccessState.Inactive to listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))))
+                AppAccessState.Inactive to
+                    listOf(AppAccessMetadata(AppMetadata("package1", "appName1", null))),
+            )
         whenever(viewModel.appMetadataMap).then {
             MutableLiveData<AccessScreenState>(WithData(map))
         }
@@ -163,7 +176,9 @@
         onView(withText("Inactive apps")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "These apps can no longer read or write distance, but still have data stored in Health\u00A0Connect"))
+                    "These apps can no longer read or write distance, but still have data stored in Health\u00A0Connect"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Manage data")).check(matches(isDisplayed()))
         onView(withText("See all entries")).perform(scrollTo()).check(matches(isDisplayed()))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/DataEntriesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/DataEntriesFragmentTest.kt
index 76ea760..869a6e1 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/DataEntriesFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/DataEntriesFragmentTest.kt
@@ -16,6 +16,8 @@
 package com.android.healthconnect.controller.tests.dataentries
 
 import android.content.Context
+import android.health.connect.datatypes.PlannedExerciseSessionRecord
+import android.health.connect.datatypes.StepsRecord
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MutableLiveData
 import androidx.test.espresso.Espresso.onView
@@ -37,7 +39,6 @@
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.PLANNED_EXERCISE
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.STEPS
 import com.android.healthconnect.controller.permissiontypes.HealthPermissionTypesFragment.Companion.PERMISSION_TYPE_KEY
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.withIndex
@@ -60,6 +61,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class DataEntriesFragmentTest {
@@ -69,6 +71,7 @@
     @BindValue
     val viewModel: DataEntriesFragmentViewModel =
         Mockito.mock(DataEntriesFragmentViewModel::class.java)
+
     @BindValue val healthConnectLogger: HealthConnectLogger = mock()
 
     private lateinit var context: Context
@@ -80,7 +83,7 @@
         context.setLocale(Locale.UK)
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
 
-        Mockito.`when`(viewModel.currentSelectedDate).thenReturn(MutableLiveData())
+        whenever(viewModel.currentSelectedDate).thenReturn(MutableLiveData())
     }
 
     @After
@@ -90,7 +93,7 @@
 
     @Test
     fun dataEntriesInit_showsDateNavigationPreference() {
-        Mockito.`when`(viewModel.dataEntries).thenReturn(MutableLiveData(WithData(emptyList())))
+        whenever(viewModel.dataEntries).thenReturn(MutableLiveData(WithData(emptyList())))
 
         launchFragment<DataEntriesFragment>(bundleOf(PERMISSION_TYPE_KEY to STEPS))
 
@@ -104,7 +107,7 @@
 
     @Test
     fun dataEntriesInit_noData_showsNoData() {
-        Mockito.`when`(viewModel.dataEntries).thenReturn(MutableLiveData(Empty))
+        whenever(viewModel.dataEntries).thenReturn(MutableLiveData(Empty))
 
         launchFragment<DataEntriesFragment>(bundleOf(PERMISSION_TYPE_KEY to STEPS))
 
@@ -113,7 +116,7 @@
 
     @Test
     fun dataEntriesInit_error_showsNoData() {
-        Mockito.`when`(viewModel.dataEntries).thenReturn(MutableLiveData(LoadingFailed))
+        whenever(viewModel.dataEntries).thenReturn(MutableLiveData(LoadingFailed))
 
         launchFragment<DataEntriesFragment>(bundleOf(PERMISSION_TYPE_KEY to STEPS))
 
@@ -122,7 +125,7 @@
 
     @Test
     fun dataEntriesInit_loading_showsLoading() {
-        Mockito.`when`(viewModel.dataEntries).thenReturn(MutableLiveData(Loading))
+        whenever(viewModel.dataEntries).thenReturn(MutableLiveData(Loading))
 
         launchFragment<DataEntriesFragment>(bundleOf(PERMISSION_TYPE_KEY to STEPS))
 
@@ -131,8 +134,7 @@
 
     @Test
     fun dataEntriesInit_withData_showsListOfEntries() {
-        Mockito.`when`(viewModel.dataEntries)
-            .thenReturn(MutableLiveData(WithData(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.dataEntries).thenReturn(MutableLiveData(WithData(FORMATTED_STEPS_LIST)))
 
         launchFragment<DataEntriesFragment>(bundleOf(PERMISSION_TYPE_KEY to STEPS))
 
@@ -150,7 +152,7 @@
 
     @Test
     fun dataEntriesInit_withPlannedExerciseData_showsListOfPlannedExerciseEntries() {
-        Mockito.`when`(viewModel.dataEntries)
+        whenever(viewModel.dataEntries)
             .thenReturn(MutableLiveData(WithData(FORMATTED_PLANNED_EXERCISE_LIST)))
 
         launchFragment<DataEntriesFragment>(bundleOf(PERMISSION_TYPE_KEY to PLANNED_EXERCISE))
@@ -167,8 +169,7 @@
 
     @Test
     fun dataEntries_withData_showsDeleteAction() {
-        Mockito.`when`(viewModel.dataEntries)
-            .thenReturn(MutableLiveData(WithData(FORMATTED_STEPS_LIST)))
+        whenever(viewModel.dataEntries).thenReturn(MutableLiveData(WithData(FORMATTED_STEPS_LIST)))
 
         launchFragment<DataEntriesFragment>(bundleOf(PERMISSION_TYPE_KEY to STEPS))
 
@@ -184,18 +185,22 @@
             headerA11y = "from 7:06 to 7:06 • TEST_APP_NAME",
             title = "12 steps",
             titleA11y = "12 steps",
-            dataType = DataType.STEPS),
+            dataType = StepsRecord::class,
+        ),
         FormattedDataEntry(
             uuid = "test_id",
             header = "8:06 - 8:06 • TEST_APP_NAME",
             headerA11y = "from 8:06 to 8:06 • TES   T_APP_NAME",
             title = "15 steps",
             titleA11y = "15 steps",
-            dataType = DataType.STEPS),
+            dataType = StepsRecord::class,
+        ),
         FormattedAggregation(
             aggregation = "127 steps",
             aggregationA11y = "127 steps",
-            contributingApps = "TEST_APP_NAME, TEST_APP_NAME_2"))
+            contributingApps = "TEST_APP_NAME, TEST_APP_NAME_2",
+        ),
+    )
 
 private val FORMATTED_PLANNED_EXERCISE_LIST =
     listOf(
@@ -206,7 +211,8 @@
             title = "Running • Morning Run",
             titleA11y = "Running • Morning Run",
             notes = "Daily morning run.",
-            dataType = DataType.PLANNED_EXERCISE),
+            dataType = PlannedExerciseSessionRecord::class,
+        ),
         PlannedExerciseSessionEntry(
             uuid = "test_id",
             header = "4:00 PM - 5:00 PM • TEST_APP_NAME",
@@ -214,4 +220,6 @@
             title = "Swimming • Freestyle Technique Bootcamp",
             titleA11y = "Swimming • Freestyle Technique Bootcamp",
             notes = "A weekly swimming training plan.",
-            dataType = DataType.PLANNED_EXERCISE))
+            dataType = PlannedExerciseSessionRecord::class,
+        ),
+    )
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/ActivityIntensityFormatterTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/ActivityIntensityFormatterTest.kt
new file mode 100644
index 0000000..3148f62
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/ActivityIntensityFormatterTest.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package com.android.healthconnect.controller.tests.dataentries.formatters
+
+import android.content.Context
+import android.health.connect.datatypes.ActivityIntensityRecord
+import android.health.connect.datatypes.Metadata
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.healthconnect.controller.data.entries.FormattedEntry
+import com.android.healthconnect.controller.dataentries.formatters.ActivityIntensityFormatter
+import com.android.healthconnect.controller.tests.utils.ClearTimeFormatRule
+import com.android.healthconnect.controller.tests.utils.NOW
+import com.android.healthconnect.controller.tests.utils.getMetaData
+import com.android.healthconnect.controller.tests.utils.setLocale
+import com.android.healthfitness.flags.Flags
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import java.time.Duration
+import java.time.Instant
+import java.time.ZoneId
+import java.time.ZoneOffset
+import java.util.Locale
+import java.util.TimeZone
+import javax.inject.Inject
+import kotlinx.coroutines.runBlocking
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@RequiresFlagsEnabled(
+    Flags.FLAG_ACTIVITY_INTENSITY,
+    Flags.FLAG_ACTIVITY_INTENSITY_DB,
+    Flags.FLAG_HEALTH_CONNECT_MAPPINGS,
+)
+@HiltAndroidTest
+class ActivityIntensityFormatterTest {
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    @get:Rule val clearTimeFormatRule = ClearTimeFormatRule()
+
+    @Inject lateinit var formatter: ActivityIntensityFormatter
+    private lateinit var context: Context
+
+    @Before
+    fun setup() {
+        context = InstrumentationRegistry.getInstrumentation().context
+        context.setLocale(Locale.UK)
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
+
+        hiltRule.inject()
+    }
+
+    @Test
+    fun format_moderate() = runBlocking {
+        val startTime = Instant.parse("2022-10-20T07:06:05.432Z")
+        val record =
+            ActivityIntensityRecord.Builder(
+                    Metadata.Builder().build(),
+                    startTime,
+                    startTime.plus(Duration.ofMinutes(16).plusSeconds(40)),
+                    ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE,
+                )
+                .build()
+
+        assertThat(formatter.format(record, "com.app.name"))
+            .isEqualTo(
+                FormattedEntry.FormattedDataEntry(
+                    uuid = "",
+                    header = "07:06 - 07:22 • com.app.name",
+                    headerA11y = "from 07:06 to 07:22 • com.app.name",
+                    title = "Moderate",
+                    titleA11y = "Moderate",
+                    dataType = ActivityIntensityRecord::class,
+                )
+            )
+    }
+
+    @Test
+    fun format_vigorous() = runBlocking {
+        val record =
+            ActivityIntensityRecord.Builder(
+                    getMetaData(),
+                    NOW,
+                    NOW.plus(Duration.ofMinutes(16).plusSeconds(40)),
+                    ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS,
+                )
+                .setStartZoneOffset(ZoneOffset.ofHours(1))
+                .setEndZoneOffset(ZoneOffset.ofHours(2))
+                .build()
+
+        assertThat(formatter.format(record, "com.app.name"))
+            .isEqualTo(
+                FormattedEntry.FormattedDataEntry(
+                    uuid = "test_id",
+                    header = "07:06 - 07:22 • com.app.name",
+                    headerA11y = "from 07:06 to 07:22 • com.app.name",
+                    title = "Vigorous",
+                    titleA11y = "Vigorous",
+                    dataType = ActivityIntensityRecord::class,
+                )
+            )
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/ExerciseSessionFormatterTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/ExerciseSessionFormatterTest.kt
index 08c2854..c43fb20 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/ExerciseSessionFormatterTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/ExerciseSessionFormatterTest.kt
@@ -25,6 +25,7 @@
 import android.health.connect.datatypes.ExerciseSessionRecord
 import android.health.connect.datatypes.ExerciseSessionType.EXERCISE_SESSION_TYPE_BIKING
 import android.health.connect.datatypes.ExerciseSessionType.EXERCISE_SESSION_TYPE_OTHER_WORKOUT
+import android.health.connect.datatypes.ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING
 import android.health.connect.datatypes.units.Length
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.entries.FormattedEntry
@@ -50,9 +51,11 @@
 @HiltAndroidTest
 class ExerciseSessionFormatterTest {
     @get:Rule val hiltRule = HiltAndroidRule(this)
+
     @get:Rule val clearTimeFormatRule = ClearTimeFormatRule()
 
     @Inject lateinit var formatter: ExerciseSessionFormatter
+
     @Inject lateinit var unitPreferences: UnitPreferences
     private lateinit var context: Context
 
@@ -68,19 +71,20 @@
     @Test
     fun formatValue() = runBlocking {
         assertThat(formatter.formatValue(getRecord(type = EXERCISE_SESSION_TYPE_BIKING)))
-            .isEqualTo("16 m, Cycling")
+            .isEqualTo("Cycling • 16 m")
     }
 
     @Test
     fun formatA11yValue() = runBlocking {
-        assertThat(formatter.formatA11yValue(getRecord(type = EXERCISE_SESSION_TYPE_BIKING)))
-            .isEqualTo("16 minutes, Cycling")
+        assertThat(formatter.formatA11yValue(getRecord(type = EXERCISE_SESSION_TYPE_RUNNING)))
+            .isEqualTo("Running • 16 minutes")
     }
 
     @Test
     fun formatNotes() = runBlocking {
         assertThat(
-                formatter.getNotes(getRecord(type = EXERCISE_SESSION_TYPE_BIKING, note = "notes")))
+                formatter.getNotes(getRecord(type = EXERCISE_SESSION_TYPE_BIKING, note = "notes"))
+            )
             .isEqualTo("notes")
     }
 
@@ -91,16 +95,21 @@
             buildList<ExerciseSegment> {
                 add(
                     ExerciseSegment.Builder(
-                            NOW, NOW.plusSeconds(500), EXERCISE_SEGMENT_TYPE_JUMPING_JACK)
+                            NOW,
+                            NOW.plusSeconds(500),
+                            EXERCISE_SEGMENT_TYPE_JUMPING_JACK,
+                        )
                         .setRepetitionsCount(2)
-                        .build())
+                        .build()
+                )
             }
         val laps =
             buildList<ExerciseLap> {
                 add(
                     ExerciseLap.Builder(NOW, NOW.plusSeconds(500))
                         .setLength(Length.fromMeters(20.0))
-                        .build())
+                        .build()
+                )
             }
         val record =
             getRecord(type = EXERCISE_SESSION_TYPE_OTHER_WORKOUT, segments = segments, laps = laps)
@@ -113,15 +122,18 @@
                         header = "07:06 - 07:14",
                         headerA11y = "from 07:06 to 07:14",
                         title = "Jumping jack: 2 reps",
-                        titleA11y = "Jumping jack: 2 repetitions"),
+                        titleA11y = "Jumping jack: 2 repetitions",
+                    ),
                     FormattedEntry.SessionHeader("Laps"),
                     FormattedEntry.FormattedSessionDetail(
                         uuid = record.metadata.id,
                         header = "07:06 - 07:14",
                         headerA11y = "from 07:06 to 07:14",
                         title = "0.02 km",
-                        titleA11y = "0.02 kilometres"),
-                ))
+                        titleA11y = "0.02 kilometres",
+                    ),
+                )
+            )
     }
 
     private fun getRecord(
@@ -129,7 +141,7 @@
         title: String? = null,
         note: String? = null,
         laps: List<ExerciseLap> = emptyList(),
-        segments: List<ExerciseSegment> = emptyList()
+        segments: List<ExerciseSegment> = emptyList(),
     ): ExerciseSessionRecord {
         return ExerciseSessionRecord.Builder(getMetaData(), NOW, NOW.plusSeconds(1000), type)
             .setNotes(note)
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/HealthDataEntryFormatterTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/HealthDataEntryFormatterTest.kt
index 2499802..e5b5c01 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/HealthDataEntryFormatterTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/HealthDataEntryFormatterTest.kt
@@ -16,12 +16,15 @@
 package com.android.healthconnect.controller.tests.dataentries.formatters
 
 import android.content.Context
+import android.health.connect.datatypes.BasalMetabolicRateRecord
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.PlannedExerciseSessionRecord
+import android.health.connect.datatypes.StepsRecord
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.entries.FormattedEntry
 import com.android.healthconnect.controller.data.entries.FormattedEntry.FormattedDataEntry
 import com.android.healthconnect.controller.data.entries.FormattedEntry.SeriesDataEntry
 import com.android.healthconnect.controller.dataentries.formatters.shared.HealthDataEntryFormatter
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.tests.utils.ClearTimeFormatRule
 import com.android.healthconnect.controller.tests.utils.getBasalMetabolicRateRecord
 import com.android.healthconnect.controller.tests.utils.getHeartRateRecord
@@ -71,7 +74,9 @@
                         headerA11y = "from 07:06 to 07:06 • Health Connect test app",
                         title = "80 bpm - 100 bpm",
                         titleA11y = "from 80 beats per minute to 100 beats per minute",
-                        dataType = DataType.HEART_RATE))
+                        dataType = HeartRateRecord::class,
+                    )
+                )
         }
     }
 
@@ -87,7 +92,9 @@
                         headerA11y = "from 07:06 to 07:06 • Health Connect test app",
                         title = "12 steps",
                         titleA11y = "12 steps",
-                        dataType = DataType.STEPS))
+                        dataType = StepsRecord::class,
+                    )
+                )
         }
     }
 
@@ -103,7 +110,9 @@
                     headerA11y = "07:06 • Health Connect test app",
                     title = "1,548 cal",
                     titleA11y = "1,548 calories",
-                    dataType = DataType.BASAL_METABOLIC_RATE))
+                    dataType = BasalMetabolicRateRecord::class,
+                )
+            )
     }
 
     @Test
@@ -118,8 +127,10 @@
                         headerA11y = "from 07:06 to 08:06 • Health Connect test app",
                         title = "Running • Morning Run",
                         titleA11y = "Running • Morning Run",
-                        dataType = DataType.PLANNED_EXERCISE,
-                        notes = "Morning quick run by the park"))
+                        dataType = PlannedExerciseSessionRecord::class,
+                        notes = "Morning quick run by the park",
+                    )
+                )
         }
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MenstruationFlowFormatterTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MenstruationFlowFormatterTest.kt
index 617f7dc..e8c135c 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MenstruationFlowFormatterTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MenstruationFlowFormatterTest.kt
@@ -20,6 +20,7 @@
 import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.FLOW_HEAVY
 import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.FLOW_LIGHT
 import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.FLOW_MEDIUM
+import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.FLOW_UNKNOWN
 import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType.MenstruationFlowTypes
 import android.health.connect.datatypes.Vo2MaxRecord.Vo2MaxMeasurementMethod.*
 import androidx.test.platform.app.InstrumentationRegistry
@@ -79,9 +80,14 @@
         assertThat(formatter.formatValue(record, preferences)).isEqualTo("Light flow")
     }
 
-    private fun getRecord(
-        @MenstruationFlowTypes type: Int,
-    ): MenstruationFlowRecord {
+    @Test
+    fun formatValue_unknown_showsAppearance() = runBlocking {
+        val record = getRecord(type = FLOW_UNKNOWN)
+
+        assertThat(formatter.formatValue(record, preferences)).isEqualTo("Unknown flow")
+    }
+
+    private fun getRecord(@MenstruationFlowTypes type: Int): MenstruationFlowRecord {
         return MenstruationFlowRecord.Builder(getMetaData(), NOW, type).build()
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MenstruationPeriodFormatterTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MenstruationPeriodFormatterTest.kt
index 0cdc5ee..641e8b0 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MenstruationPeriodFormatterTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MenstruationPeriodFormatterTest.kt
@@ -22,9 +22,9 @@
 import android.health.connect.datatypes.MenstruationPeriodRecord
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.entries.FormattedEntry
+import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.units.UnitPreferences
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.tests.utils.NOW
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.getMetaData
@@ -60,13 +60,13 @@
     }
 
     @Test
-    fun format_dayOne_formatsMenstruationPeriod() = runBlocking {
+    fun formatForDay_dayOne_formatsMenstruationPeriod() = runBlocking {
         val start = NOW
         val end = NOW.plus(ofDays(5))
         val day = NOW
         val record = MenstruationPeriodRecord.Builder(getMetaData(), start, end).build()
 
-        assertThat(formatter.format(day, record))
+        assertThat(formatter.format(day, record, period = DateNavigationPeriod.PERIOD_DAY))
             .isEqualTo(
                 FormattedEntry.FormattedDataEntry(
                     uuid = record.metadata.id,
@@ -74,18 +74,20 @@
                     headerA11y = TEST_APP_NAME,
                     title = "Period day 1 of 6",
                     titleA11y = "Period day 1 of 6",
-                    dataType = DataType.MENSTRUATION_PERIOD,
+                    dataType = MenstruationPeriodRecord::class,
                     startTime = start,
-                    endTime = end))
+                    endTime = end,
+                )
+            )
     }
 
     @Test
-    fun format_lastDay_formatsMenstruationPeriod() = runBlocking {
+    fun formatForDay_lastDay_formatsMenstruationPeriod() = runBlocking {
         val start = NOW
         val end = NOW.plus(ofDays(5))
         val record = MenstruationPeriodRecord.Builder(getMetaData(), start, end).build()
 
-        assertThat(formatter.format(end, record))
+        assertThat(formatter.format(end, record, DateNavigationPeriod.PERIOD_DAY))
             .isEqualTo(
                 FormattedEntry.FormattedDataEntry(
                     uuid = record.metadata.id,
@@ -93,8 +95,66 @@
                     headerA11y = TEST_APP_NAME,
                     title = "Period day 6 of 6",
                     titleA11y = "Period day 6 of 6",
-                    dataType = DataType.MENSTRUATION_PERIOD,
+                    dataType = MenstruationPeriodRecord::class,
                     startTime = start,
-                    endTime = end))
+                    endTime = end,
+                )
+            )
+    }
+
+    @Test
+    fun formatForWeek_formatsMenstruationPeriod() = runBlocking {
+        val start = NOW
+        val end = NOW.plus(ofDays(5))
+        val record = MenstruationPeriodRecord.Builder(getMetaData(), start, end).build()
+        val header = "Oct 20 – 25 • $TEST_APP_NAME"
+        assertThat(
+                formatter.format(
+                    end,
+                    record,
+                    DateNavigationPeriod.PERIOD_WEEK,
+                    showDataOrigin = true,
+                )
+            )
+            .isEqualTo(
+                FormattedEntry.FormattedDataEntry(
+                    uuid = record.metadata.id,
+                    header = header,
+                    headerA11y = header,
+                    title = "Period (6 days)",
+                    titleA11y = "Period (6 days)",
+                    dataType = MenstruationPeriodRecord::class,
+                    startTime = start,
+                    endTime = end,
+                )
+            )
+    }
+
+    @Test
+    fun formatForMonth_formatsMenstruationPeriod() = runBlocking {
+        val start = NOW
+        val end = NOW.plus(ofDays(0))
+        val record = MenstruationPeriodRecord.Builder(getMetaData(), start, end).build()
+        val header = "October 20 • $TEST_APP_NAME"
+        assertThat(
+                formatter.format(
+                    end,
+                    record,
+                    DateNavigationPeriod.PERIOD_MONTH,
+                    showDataOrigin = true,
+                )
+            )
+            .isEqualTo(
+                FormattedEntry.FormattedDataEntry(
+                    uuid = record.metadata.id,
+                    header = header,
+                    headerA11y = header,
+                    title = "Period (1 day)",
+                    titleA11y = "Period (1 day)",
+                    dataType = MenstruationPeriodRecord::class,
+                    startTime = start,
+                    endTime = end,
+                )
+            )
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MindfulnessSessionFormatterTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MindfulnessSessionFormatterTest.kt
index f5c271b..0e23996 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MindfulnessSessionFormatterTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/MindfulnessSessionFormatterTest.kt
@@ -26,7 +26,6 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.entries.FormattedEntry
 import com.android.healthconnect.controller.dataentries.formatters.MindfulnessSessionFormatter
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.tests.utils.ClearTimeFormatRule
 import com.android.healthconnect.controller.tests.utils.NOW
 import com.android.healthconnect.controller.tests.utils.getMetaData
@@ -51,7 +50,9 @@
 @HiltAndroidTest
 class MindfulnessSessionFormatterTest {
     @get:Rule val setFlagsRule = SetFlagsRule()
+
     @get:Rule val hiltRule = HiltAndroidRule(this)
+
     @get:Rule val clearTimeFormatRule = ClearTimeFormatRule()
 
     @Inject lateinit var formatter: MindfulnessSessionFormatter
@@ -84,9 +85,9 @@
                     uuid = "",
                     header = "07:06 - 07:22 • com.app.name",
                     headerA11y = "from 07:06 to 07:22 • com.app.name",
-                    title = "16 m, Unknown type",
-                    titleA11y = "16 minutes, Unknown type",
-                    dataType = DataType.MINDFULNESS_SESSION,
+                    title = "Unknown type • 16 m",
+                    titleA11y = "Unknown type • 16 minutes",
+                    dataType = MindfulnessSessionRecord::class,
                     notes = null,
                     route = null,
                     isClickable = false,
@@ -115,9 +116,9 @@
                     uuid = "test_id",
                     header = "07:06 - 07:22 • com.app.name",
                     headerA11y = "from 07:06 to 07:22 • com.app.name",
-                    title = "foo-title, Meditation",
-                    titleA11y = "foo-title, Meditation",
-                    dataType = DataType.MINDFULNESS_SESSION,
+                    title = "Meditation • foo-title",
+                    titleA11y = "Meditation • foo-title",
+                    dataType = MindfulnessSessionRecord::class,
                     notes = "foo-notes",
                     route = null,
                     isClickable = false,
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/medical/DisplayNameExtractorTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/medical/DisplayNameExtractorTest.kt
index 330b7b4..d5db8e4 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/medical/DisplayNameExtractorTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/medical/DisplayNameExtractorTest.kt
@@ -149,6 +149,63 @@
         assertEquals("Asthma", displayNameExtractor.getDisplayName(json))
     }
 
+    // Procedure tests
+    @Test
+    fun procedure_withoutCodeField() {
+        val json =
+            """{
+            "resourceType": "Procedure"
+        }"""
+        assertEquals("Unknown Resource", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun procedure_withEmptyCodeField() {
+        val json =
+            """{
+            "resourceType": "Procedure",
+            "code": {}
+        }"""
+        assertEquals("Unknown Resource", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun procedure_withCodeText() {
+        val json =
+            """{
+            "resourceType": "Procedure",
+            "code": {"text": "Excision of appendix"}
+        }"""
+        assertEquals("Excision of appendix", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun procedure_withCodingSystemSnomed() {
+        val json =
+            """{
+            "resourceType": "Procedure",
+            "code": {
+                "coding": [{"system": "http://snomed.info/sct", "display": "Excision of appendix"}]
+            }
+        }"""
+        assertEquals("Excision of appendix", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun procedure_withMultipleCodings() {
+        val json =
+            """{
+            "resourceType": "Procedure",
+            "code": {
+                "coding": [
+                    {"system": "http://other.system", "display": "Appendicectomy"},
+                    {"system": "http://snomed.info/sct", "display": "Excision of appendix"}
+                ]
+            }
+        }"""
+        assertEquals("Excision of appendix", displayNameExtractor.getDisplayName(json))
+    }
+
     // Encounter tests
     @Test
     fun encounter_withoutClassOrServiceType() {
@@ -175,23 +232,33 @@
         val json =
             """{
             "resourceType": "Encounter",
-            "class": {"text": "Inpatient"},
+            "class": {"display": "Inpatient"},
             "serviceType": {"text": "Cardiology"}
         }"""
         assertEquals("Inpatient - Cardiology", displayNameExtractor.getDisplayName(json))
     }
 
     @Test
-    fun encounter_withClassCodingAndServiceTypeCoding() {
+    fun encounter_withClassAndServiceTypeCoding() {
         val json =
             """{
             "resourceType": "Encounter",
-            "class": {"coding": [{"display": "Outpatient"}]},
+            "class": {"display": "Outpatient"},
             "serviceType": {"coding": [{"display": "Radiology"}]}
         }"""
         assertEquals("Outpatient - Radiology", displayNameExtractor.getDisplayName(json))
     }
 
+    @Test
+    fun encounter_withClassWithoutServiceType() {
+        val json =
+            """{
+            "resourceType": "Encounter",
+            "class": {"display": "Outpatient"}
+        }"""
+        assertEquals("Outpatient", displayNameExtractor.getDisplayName(json))
+    }
+
     // Immunization tests
     @Test
     fun immunization_withoutVaccineCodeField() {
@@ -234,6 +301,36 @@
         assertEquals("Influenza", displayNameExtractor.getDisplayName(json))
     }
 
+    @Test
+    fun immunization_withCVXAndSnomedCoding() {
+        val json =
+            """{
+            "resourceType": "Immunization",
+            "vaccineCode": {
+                "coding": [
+                    {"system": "http://snomed.info/sct", "display": "Influenza vaccine"},
+                    {"system": "http://hl7.org/fhir/sid/cvx", "display": "Influenza"}
+                ]
+            }
+        }"""
+        assertEquals("Influenza", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun immunization_withSnomedAndOtherCoding() {
+        val json =
+            """{
+            "resourceType": "Immunization",
+            "vaccineCode": {
+                "coding": [
+                    {"system": "http://other.system", "display": "Other Vaccine"},
+                    {"system": "http://snomed.info/sct", "display": "Influenza vaccine"}
+                ]
+            }
+        }"""
+        assertEquals("Influenza vaccine", displayNameExtractor.getDisplayName(json))
+    }
+
     // Location tests
     @Test
     fun location_withoutNameOrAliasField() {
@@ -316,6 +413,31 @@
         assertEquals("Ibuprofen", displayNameExtractor.getDisplayName(json))
     }
 
+    @Test
+    fun medicationRequest_withMedicationReferenceText() {
+        val json =
+            """{
+            "resourceType": "MedicationRequest",
+            "medicationReference": {
+                "reference": "medication-1",
+                "display": "Azithromycin 250mg"
+            }
+        }"""
+        assertEquals("Azithromycin 250mg", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun medicationRequest_withMedicationReferenceReferenceOnly() {
+        val json =
+            """{
+            "resourceType": "MedicationRequest",
+            "medicationReference": {
+                "reference": "medication-1"
+            }
+        }"""
+        assertEquals("Unknown Resource", displayNameExtractor.getDisplayName(json))
+    }
+
     // Medication tests
     @Test
     fun medication_withoutCodeField() {
@@ -401,4 +523,163 @@
         }"""
         assertEquals("Blood Pressure", displayNameExtractor.getDisplayName(json))
     }
-}
+
+    // Patient tests
+    @Test
+    fun patient_withoutNameField() {
+        val json =
+            """{
+            "resourceType": "Patient"
+        }"""
+        assertEquals("Unknown Resource", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun patient_withEmptyNameField() {
+        val json =
+            """{
+            "resourceType": "Patient",
+            "name": []
+        }"""
+        assertEquals("Unknown Resource", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun patient_withNameText() {
+        val json =
+            """{
+            "resourceType": "Patient",
+            "name": [
+                {"use": "maiden","text": "Anne Onymous"},
+                {"use": "usual", "text": "Anne Example"}
+            ]
+        }"""
+        assertEquals("Anne Example", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun patient_withNameFamilyAndGiven() {
+        val json =
+            """{
+            "resourceType": "Patient",
+            "name": [{
+                "family": "Example",
+                "given": ["Anne", "Other"]
+            }]
+        }"""
+        assertEquals("Anne Example", displayNameExtractor.getDisplayName(json))
+    }
+
+    // Practitioner tests
+    @Test
+    fun practitioner_withoutNameField() {
+        val json =
+            """{
+            "resourceType": "Practitioner"
+        }"""
+        assertEquals("Unknown Resource", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun practitioner_withEmptyNameField() {
+        val json =
+            """{
+            "resourceType": "Practitioner",
+            "name": []
+        }"""
+        assertEquals("Unknown Resource", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun practitioner_withNameText() {
+        val json =
+            """{
+            "resourceType": "Practitioner",
+            "name": [
+                {"use": "old","text": "M Hernandez"},
+                {"use": "usual", "text": "Dr Maria Hernandez"}
+            ]
+        }"""
+        assertEquals("Dr Maria Hernandez", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun practitioner_withNamePrefixFamilyAndGiven() {
+        val json =
+            """{
+            "resourceType": "Practitioner",
+            "name": [{
+                "family": "Hernandez",
+                "given": ["Maria"],
+                "prefix": ["Dr"]
+            }]
+        }"""
+        assertEquals("Dr Maria Hernandez", displayNameExtractor.getDisplayName(json))
+    }
+
+    // PractitionerRole tests
+    @Test
+    fun practitionerRole_withoutCodeOrSpecialty() {
+        val json =
+            """{
+            "resourceType": "PractitionerRole"
+        }"""
+        assertEquals("Unknown Resource", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun practitionerRole_withCodeWithoutSpecialty() {
+        val json =
+            """{
+            "resourceType": "PractitionerRole",
+            "code": [{
+                "coding": [{
+                    "system": "http://terminology.hl7.org/CodeSystem/practitioner-role",
+                    "code": "doctor",
+                    "display": "Doctor"
+                }]
+            }]
+        }"""
+        assertEquals("Doctor", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun practitionerRole_withSpecialtyWithoutCode() {
+        val json =
+            """{
+            "resourceType": "PractitionerRole",
+            "specialty": [{
+                "coding": [{
+                    "system": "http://snomed.info/sct",
+                    "code": "394583002",
+                    "display": "Endocrinology"
+                }]
+            }]
+        }"""
+        assertEquals("Endocrinology", displayNameExtractor.getDisplayName(json))
+    }
+
+    @Test
+    fun practitionerRole_withCodeAndSpecialty() {
+        val json =
+            """{
+            "resourceType": "PractitionerRole",
+            "code": [{
+                "coding": [{
+                    "system": "http://terminology.hl7.org/CodeSystem/practitioner-role",
+                    "code": "doctor",
+                    "display": "Doctor"
+                }]
+            }],
+            "specialty": [{
+                "coding": [{
+                    "system": "http://snomed.info/sct",
+                    "code": "394583002",
+                    "display": "Endocrinology"
+                }]
+            }]
+        }"""
+        assertEquals("Doctor - Endocrinology", displayNameExtractor.getDisplayName(json))
+    }
+
+}
\ No newline at end of file
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/medical/MedicalEntryFormatterTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/medical/MedicalEntryFormatterTest.kt
index 7e820da..849b102 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/medical/MedicalEntryFormatterTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/medical/MedicalEntryFormatterTest.kt
@@ -25,7 +25,6 @@
 import com.android.healthconnect.controller.tests.utils.CoroutineTestRule
 import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE
 import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_RESOURCE_IMMUNIZATION_LONG
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -37,6 +36,7 @@
 import org.junit.Test
 import org.mockito.Mockito
 import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class MedicalEntryFormatterTest {
@@ -82,8 +82,8 @@
         assertThat(result)
             .isEqualTo(
                 FormattedEntry.FormattedMedicalDataEntry(
-                    header = "App A Data Source • Health Connect test app",
-                    headerA11y = "App A Data Source • Health Connect test app",
+                    header = "Health Connect test app • App A Data Source",
+                    headerA11y = "Health Connect test app • App A Data Source",
                     title = "Tdap",
                     titleA11y = "Tdap",
                     medicalResourceId = TEST_MEDICAL_RESOURCE_IMMUNIZATION_LONG.id,
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/shared/FormattersIntegrationTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/shared/FormattersIntegrationTest.kt
index 5a24c53..7d62757 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/shared/FormattersIntegrationTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/dataentries/formatters/shared/FormattersIntegrationTest.kt
@@ -18,37 +18,38 @@
 
 package com.android.healthconnect.controller.tests.dataentries.formatters.shared
 
-import android.health.connect.internal.datatypes.utils.RecordMapper
-import android.platform.test.annotations.DisableFlags
-import android.platform.test.annotations.EnableFlags
-import android.platform.test.flag.junit.SetFlagsRule
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.fromHealthPermissionCategory
 import com.android.healthconnect.controller.shared.HealthPermissionToDatatypeMapper
-import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
 import org.junit.Test
 
 class FormattersIntegrationTest {
 
-    @JvmField @Rule val mSetFlagsRule = SetFlagsRule()
-
-    @EnableFlags(Flags.FLAG_MINDFULNESS)
     @Test
     fun allRecordsHaveFormatters() {
-        val recordClasses =
-            RecordMapper.getInstance().recordIdToExternalRecordClassMap.values.sortedBy { it.name }
-        val supportedUIRecords =
-            HealthPermissionToDatatypeMapper.getAllDataTypes().values.flatten().sortedBy { it.name }
-        assertThat(recordClasses).isEqualTo(supportedUIRecords)
-    }
+        val healthConnectMappings = HealthConnectMappings()
+        val frameworkRecordClasses = healthConnectMappings.recordIdToExternalRecordClassMap.values
+        val controllerRecordClasses =
+            HealthPermissionToDatatypeMapper.getAllDataTypes().values.flatten()
 
-    @DisableFlags(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun allRecordsHaveFormatters_exceptUnreleasedDataTypes() {
-        val recordClasses =
-            RecordMapper.getInstance().recordIdToExternalRecordClassMap.values.sortedBy { it.name }
-        val supportedUIRecords =
-            HealthPermissionToDatatypeMapper.getAllDataTypes().values.flatten().sortedBy { it.name }
-        assertThat(recordClasses).isEqualTo(supportedUIRecords)
+        assertThat(controllerRecordClasses).containsExactlyElementsIn(frameworkRecordClasses)
+
+        for (recordTypeId in healthConnectMappings.allRecordTypeIdentifiers) {
+            val permissionCategory =
+                healthConnectMappings.getHealthPermissionCategoryForRecordType(recordTypeId)
+            val fitnessPermissionType =
+                fromHealthPermissionCategory(permissionCategory) as FitnessPermissionType
+            val expectedRecordClass =
+                healthConnectMappings.recordIdToExternalRecordClassMap[recordTypeId]!!
+
+            assertThat(HealthPermissionToDatatypeMapper.getAllDataTypes())
+                .containsKey(fitnessPermissionType)
+            assertThat(HealthPermissionToDatatypeMapper.getAllDataTypes()[fitnessPermissionType]!!)
+                .contains(expectedRecordClass)
+            assertThat(HealthPermissionToDatatypeMapper.getDataTypes(fitnessPermissionType))
+                .contains(expectedRecordClass)
+        }
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/AddAnAppFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/AddAnAppFragmentTest.kt
index 09316a0..dcfb211 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/AddAnAppFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/AddAnAppFragmentTest.kt
@@ -38,7 +38,6 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME_2
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME_3
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.AddAnAppElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
@@ -57,6 +56,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class AddAnAppFragmentTest {
@@ -85,7 +85,11 @@
                     priorityListState = PriorityListState.WithData(true, listOf()),
                     potentialAppSourcesState =
                         PotentialAppSourcesState.WithData(
-                            true, listOf(TEST_APP, TEST_APP_2, TEST_APP_3))))
+                            true,
+                            listOf(TEST_APP, TEST_APP_2, TEST_APP_3),
+                        ),
+                )
+            )
         }
 
         launchFragment<AddAnAppFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
@@ -106,7 +110,9 @@
             MutableLiveData(
                 DataSourcesInfo(
                     priorityListState = PriorityListState.WithData(true, listOf()),
-                    potentialAppSourcesState = PotentialAppSourcesState.Loading(true)))
+                    potentialAppSourcesState = PotentialAppSourcesState.Loading(true),
+                )
+            )
         }
 
         launchFragment<AddAnAppFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
@@ -120,7 +126,9 @@
             MutableLiveData(
                 DataSourcesInfo(
                     priorityListState = PriorityListState.WithData(true, listOf()),
-                    potentialAppSourcesState = PotentialAppSourcesState.LoadingFailed(true)))
+                    potentialAppSourcesState = PotentialAppSourcesState.LoadingFailed(true),
+                )
+            )
         }
 
         launchFragment<AddAnAppFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
@@ -137,7 +145,11 @@
                     priorityListState = PriorityListState.WithData(true, listOf()),
                     potentialAppSourcesState =
                         PotentialAppSourcesState.WithData(
-                            true, listOf(TEST_APP, TEST_APP_2, TEST_APP_3))))
+                            true,
+                            listOf(TEST_APP, TEST_APP_2, TEST_APP_3),
+                        ),
+                )
+            )
         }
 
         launchFragment<AddAnAppFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/DataSourcesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/DataSourcesFragmentTest.kt
index 4e6a634..c96619d 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/DataSourcesFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/DataSourcesFragmentTest.kt
@@ -53,7 +53,6 @@
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.DataSourcesElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -78,6 +77,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @UninstallModules(AppUtilsModule::class)
 @HiltAndroidTest
@@ -123,8 +123,16 @@
                                 AggregationCardInfo(
                                     FitnessPermissionType.STEPS,
                                     FormattedEntry.FormattedAggregation(
-                                        "1234 steps", "1234 steps", "TestApp"),
-                                    Instant.parse("2022-10-19T07:06:05.432Z"))))))
+                                        "1234 steps",
+                                        "1234 steps",
+                                        "TestApp",
+                                    ),
+                                    Instant.parse("2022-10-19T07:06:05.432Z"),
+                                )
+                            ),
+                        ),
+                )
+            )
         }
 
         whenever(dataSourcesViewModel.getEditedPriorityList())
@@ -137,8 +145,15 @@
                         AggregationCardInfo(
                             FitnessPermissionType.STEPS,
                             FormattedEntry.FormattedAggregation(
-                                "1234 steps", "1234 steps", "TestApp"),
-                            Instant.parse("2022-10-19T07:06:05.432Z")))))
+                                "1234 steps",
+                                "1234 steps",
+                                "TestApp",
+                            ),
+                            Instant.parse("2022-10-19T07:06:05.432Z"),
+                        )
+                    ),
+                )
+            )
         }
         launchFragment<DataSourcesFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
 
@@ -159,7 +174,9 @@
                     priorityListState =
                         PriorityListState.WithData(true, listOf(TEST_APP, TEST_APP_2)),
                     potentialAppSourcesState = PotentialAppSourcesState.WithData(true, listOf()),
-                    aggregationCardsState = AggregationCardsState.WithData(true, listOf())))
+                    aggregationCardsState = AggregationCardsState.WithData(true, listOf()),
+                )
+            )
         }
         whenever(dataSourcesViewModel.getEditedPriorityList()).then { listOf(TEST_APP, TEST_APP_2) }
         whenever(dataSourcesViewModel.updatedAggregationCardsData).then {
@@ -176,7 +193,9 @@
                 withText(
                     "Add app sources to the list to see how the data " +
                         "totals can change. Removing an app from this list will stop it " +
-                        "from contributing to totals, but it will still have write permissions."))
+                        "from contributing to totals, but it will still have write permissions."
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(R.id.linear_layout_recycle_view))
@@ -184,8 +203,10 @@
                 matches(
                     atPosition(
                         0,
-                        allOf(
-                            hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))))))
+                        allOf(hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))),
+                    )
+                )
+            )
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
                 matches(
@@ -193,7 +214,11 @@
                         1,
                         allOf(
                             hasDescendant(withText("2")),
-                            hasDescendant(withText(TEST_APP_NAME_2))))))
+                            hasDescendant(withText(TEST_APP_NAME_2)),
+                        ),
+                    )
+                )
+            )
 
         verify(healthConnectLogger, atLeast(1)).setPageId(PageName.DATA_SOURCES_PAGE)
         verify(healthConnectLogger, atLeast(1)).logPageImpression()
@@ -214,8 +239,16 @@
                                 AggregationCardInfo(
                                     FitnessPermissionType.STEPS,
                                     FormattedEntry.FormattedAggregation(
-                                        "1234 steps", "1234 steps", "TestApp"),
-                                    Instant.parse("2022-10-19T07:06:05.432Z"))))))
+                                        "1234 steps",
+                                        "1234 steps",
+                                        "TestApp",
+                                    ),
+                                    Instant.parse("2022-10-19T07:06:05.432Z"),
+                                )
+                            ),
+                        ),
+                )
+            )
         }
 
         whenever(dataSourcesViewModel.getEditedPriorityList())
@@ -228,8 +261,15 @@
                         AggregationCardInfo(
                             FitnessPermissionType.STEPS,
                             FormattedEntry.FormattedAggregation(
-                                "1234 steps", "1234 steps", "TestApp"),
-                            Instant.parse("2022-10-19T07:06:05.432Z")))))
+                                "1234 steps",
+                                "1234 steps",
+                                "TestApp",
+                            ),
+                            Instant.parse("2022-10-19T07:06:05.432Z"),
+                        )
+                    ),
+                )
+            )
         }
         launchFragment<DataSourcesFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
 
@@ -243,7 +283,9 @@
                 withText(
                     "Add app sources to the list to see how the data " +
                         "totals can change. Removing an app from this list will stop it " +
-                        "from contributing to totals, but it will still have write permissions."))
+                        "from contributing to totals, but it will still have write permissions."
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(R.id.linear_layout_recycle_view))
@@ -251,8 +293,10 @@
                 matches(
                     atPosition(
                         0,
-                        allOf(
-                            hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))))))
+                        allOf(hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))),
+                    )
+                )
+            )
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
                 matches(
@@ -260,7 +304,11 @@
                         1,
                         allOf(
                             hasDescendant(withText("2")),
-                            hasDescendant(withText(TEST_APP_NAME_2))))))
+                            hasDescendant(withText(TEST_APP_NAME_2)),
+                        ),
+                    )
+                )
+            )
     }
 
     @Test
@@ -278,8 +326,16 @@
                                 AggregationCardInfo(
                                     FitnessPermissionType.STEPS,
                                     FormattedEntry.FormattedAggregation(
-                                        "1234 steps", "1234 steps", "TestApp"),
-                                    Instant.parse("2020-10-19T07:06:05.432Z"))))))
+                                        "1234 steps",
+                                        "1234 steps",
+                                        "TestApp",
+                                    ),
+                                    Instant.parse("2020-10-19T07:06:05.432Z"),
+                                )
+                            ),
+                        ),
+                )
+            )
         }
 
         whenever(dataSourcesViewModel.getEditedPriorityList())
@@ -292,8 +348,15 @@
                         AggregationCardInfo(
                             FitnessPermissionType.STEPS,
                             FormattedEntry.FormattedAggregation(
-                                "1234 steps", "1234 steps", "TestApp"),
-                            Instant.parse("2020-10-19T07:06:05.432Z")))))
+                                "1234 steps",
+                                "1234 steps",
+                                "TestApp",
+                            ),
+                            Instant.parse("2020-10-19T07:06:05.432Z"),
+                        )
+                    ),
+                )
+            )
         }
         launchFragment<DataSourcesFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
         onView(withText("Data totals")).check(matches(isDisplayed()))
@@ -317,9 +380,17 @@
                                 AggregationCardInfo(
                                     FitnessPermissionType.SLEEP,
                                     FormattedEntry.FormattedAggregation(
-                                        "11h 5m", "11h 5m", "TestApp"),
+                                        "11h 5m",
+                                        "11h 5m",
+                                        "TestApp",
+                                    ),
                                     Instant.parse("2022-10-18T21:00:00.00Z"),
-                                    Instant.parse("2022-10-19T08:05:00.00Z"))))))
+                                    Instant.parse("2022-10-19T08:05:00.00Z"),
+                                )
+                            ),
+                        ),
+                )
+            )
         }
 
         whenever(dataSourcesViewModel.getEditedPriorityList())
@@ -333,7 +404,11 @@
                             FitnessPermissionType.SLEEP,
                             FormattedEntry.FormattedAggregation("11h 5m", "11h 5m", "TestApp"),
                             Instant.parse("2022-10-18T21:00:00.00Z"),
-                            Instant.parse("2022-10-19T08:05:00.00Z")))))
+                            Instant.parse("2022-10-19T08:05:00.00Z"),
+                        )
+                    ),
+                )
+            )
         }
 
         launchFragment<DataSourcesFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.SLEEP))
@@ -348,7 +423,9 @@
                 withText(
                     "Add app sources to the list to see how the data " +
                         "totals can change. Removing an app from this list will stop it " +
-                        "from contributing to totals, but it will still have write permissions."))
+                        "from contributing to totals, but it will still have write permissions."
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(R.id.linear_layout_recycle_view))
@@ -356,8 +433,10 @@
                 matches(
                     atPosition(
                         0,
-                        allOf(
-                            hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))))))
+                        allOf(hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))),
+                    )
+                )
+            )
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
                 matches(
@@ -365,7 +444,11 @@
                         1,
                         allOf(
                             hasDescendant(withText("2")),
-                            hasDescendant(withText(TEST_APP_NAME_2))))))
+                            hasDescendant(withText(TEST_APP_NAME_2)),
+                        ),
+                    )
+                )
+            )
     }
 
     @Test
@@ -384,9 +467,17 @@
                                 AggregationCardInfo(
                                     FitnessPermissionType.SLEEP,
                                     FormattedEntry.FormattedAggregation(
-                                        "11h 5m", "11h 5m", "TestApp"),
+                                        "11h 5m",
+                                        "11h 5m",
+                                        "TestApp",
+                                    ),
                                     Instant.parse("2020-10-18T21:00:00.00Z"),
-                                    Instant.parse("2020-10-19T08:05:00.00Z"))))))
+                                    Instant.parse("2020-10-19T08:05:00.00Z"),
+                                )
+                            ),
+                        ),
+                )
+            )
         }
 
         whenever(dataSourcesViewModel.getEditedPriorityList())
@@ -400,7 +491,11 @@
                             FitnessPermissionType.SLEEP,
                             FormattedEntry.FormattedAggregation("11h 5m", "11h 5m", "TestApp"),
                             Instant.parse("2020-10-18T21:00:00.00Z"),
-                            Instant.parse("2020-10-19T08:05:00.00Z")))))
+                            Instant.parse("2020-10-19T08:05:00.00Z"),
+                        )
+                    ),
+                )
+            )
         }
 
         launchFragment<DataSourcesFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.SLEEP))
@@ -415,7 +510,9 @@
                 withText(
                     "Add app sources to the list to see how the data " +
                         "totals can change. Removing an app from this list will stop it " +
-                        "from contributing to totals, but it will still have write permissions."))
+                        "from contributing to totals, but it will still have write permissions."
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(R.id.linear_layout_recycle_view))
@@ -423,8 +520,10 @@
                 matches(
                     atPosition(
                         0,
-                        allOf(
-                            hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))))))
+                        allOf(hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))),
+                    )
+                )
+            )
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
                 matches(
@@ -432,7 +531,11 @@
                         1,
                         allOf(
                             hasDescendant(withText("2")),
-                            hasDescendant(withText(TEST_APP_NAME_2))))))
+                            hasDescendant(withText(TEST_APP_NAME_2)),
+                        ),
+                    )
+                )
+            )
     }
 
     @Test
@@ -451,9 +554,17 @@
                                 AggregationCardInfo(
                                     FitnessPermissionType.SLEEP,
                                     FormattedEntry.FormattedAggregation(
-                                        "11h 5m", "11h 5m", "TestApp"),
+                                        "11h 5m",
+                                        "11h 5m",
+                                        "TestApp",
+                                    ),
                                     Instant.parse("2020-12-31T21:00:00.00Z"),
-                                    Instant.parse("2021-01-01T08:05:00.00Z"))))))
+                                    Instant.parse("2021-01-01T08:05:00.00Z"),
+                                )
+                            ),
+                        ),
+                )
+            )
         }
 
         whenever(dataSourcesViewModel.getEditedPriorityList())
@@ -467,7 +578,11 @@
                             FitnessPermissionType.SLEEP,
                             FormattedEntry.FormattedAggregation("11h 5m", "11h 5m", "TestApp"),
                             Instant.parse("2020-12-31T21:00:00.00Z"),
-                            Instant.parse("2021-01-01T08:05:00.00Z")))))
+                            Instant.parse("2021-01-01T08:05:00.00Z"),
+                        )
+                    ),
+                )
+            )
         }
 
         launchFragment<DataSourcesFragment>(bundleOf(CATEGORY_KEY to HealthDataCategory.SLEEP))
@@ -482,7 +597,9 @@
                 withText(
                     "Add app sources to the list to see how the data " +
                         "totals can change. Removing an app from this list will stop it " +
-                        "from contributing to totals, but it will still have write permissions."))
+                        "from contributing to totals, but it will still have write permissions."
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(R.id.linear_layout_recycle_view))
@@ -490,8 +607,10 @@
                 matches(
                     atPosition(
                         0,
-                        allOf(
-                            hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))))))
+                        allOf(hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))),
+                    )
+                )
+            )
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
                 matches(
@@ -499,7 +618,11 @@
                         1,
                         allOf(
                             hasDescendant(withText("2")),
-                            hasDescendant(withText(TEST_APP_NAME_2))))))
+                            hasDescendant(withText(TEST_APP_NAME_2)),
+                        ),
+                    )
+                )
+            )
     }
 
     @Test
@@ -509,7 +632,9 @@
                 DataSourcesAndAggregationsInfo(
                     priorityListState = PriorityListState.WithData(true, listOf()),
                     potentialAppSourcesState = PotentialAppSourcesState.WithData(true, listOf()),
-                    aggregationCardsState = AggregationCardsState.WithData(true, listOf())))
+                    aggregationCardsState = AggregationCardsState.WithData(true, listOf()),
+                )
+            )
         }
         whenever(dataSourcesViewModel.updatedAggregationCardsData).then {
             MutableLiveData(AggregationCardsState.WithData(true, listOf()))
@@ -520,7 +645,9 @@
         onView(withText("No app sources")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Once you give app permissions to write activity data, sources will show here."))
+                    "Once you give app permissions to write activity data, sources will show here."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("How sources & prioritization work")).check(matches(isDisplayed()))
     }
@@ -534,7 +661,9 @@
                         PriorityListState.WithData(true, listOf(TEST_APP, TEST_APP_2)),
                     potentialAppSourcesState =
                         PotentialAppSourcesState.WithData(true, listOf(TEST_APP_3)),
-                    aggregationCardsState = AggregationCardsState.WithData(true, listOf())))
+                    aggregationCardsState = AggregationCardsState.WithData(true, listOf()),
+                )
+            )
         }
         whenever(dataSourcesViewModel.getEditedPriorityList())
             .thenReturn(listOf(TEST_APP, TEST_APP_2))
@@ -552,7 +681,9 @@
                 withText(
                     "Add app sources to the list to see how the data " +
                         "totals can change. Removing an app from this list will stop it " +
-                        "from contributing to totals, but it will still have write permissions."))
+                        "from contributing to totals, but it will still have write permissions."
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(R.id.linear_layout_recycle_view))
@@ -560,8 +691,10 @@
                 matches(
                     atPosition(
                         0,
-                        allOf(
-                            hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))))))
+                        allOf(hasDescendant(withText("1")), hasDescendant(withText(TEST_APP_NAME))),
+                    )
+                )
+            )
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
                 matches(
@@ -569,7 +702,11 @@
                         1,
                         allOf(
                             hasDescendant(withText("2")),
-                            hasDescendant(withText(TEST_APP_NAME_2))))))
+                            hasDescendant(withText(TEST_APP_NAME_2)),
+                        ),
+                    )
+                )
+            )
     }
 
     @Test
@@ -580,7 +717,9 @@
                     priorityListState =
                         PriorityListState.WithData(true, listOf(TEST_APP, TEST_APP_2)),
                     potentialAppSourcesState = PotentialAppSourcesState.WithData(true, listOf()),
-                    aggregationCardsState = AggregationCardsState.WithData(true, listOf())))
+                    aggregationCardsState = AggregationCardsState.WithData(true, listOf()),
+                )
+            )
         }
         whenever(dataSourcesViewModel.getEditedPriorityList()).then { listOf(TEST_APP, TEST_APP_2) }
         whenever(dataSourcesViewModel.updatedAggregationCardsData).then {
@@ -598,7 +737,9 @@
                 withText(
                     "Add app sources to the list to see how the data " +
                         "totals can change. Removing an app from this list will stop it " +
-                        "from contributing to totals, but it will still have write permissions."))
+                        "from contributing to totals, but it will still have write permissions."
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(R.id.linear_layout_recycle_view))
@@ -609,7 +750,11 @@
                         allOf(
                             hasDescendant(withText("1")),
                             hasDescendant(withText(TEST_APP_NAME)),
-                            hasDescendant(withText("Device default"))))))
+                            hasDescendant(withText("Device default")),
+                        ),
+                    )
+                )
+            )
 
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
@@ -619,7 +764,11 @@
                         allOf(
                             hasDescendant(withText("2")),
                             hasDescendant(withText(TEST_APP_NAME_2)),
-                            hasDescendant(not(withText("Device default")))))))
+                            hasDescendant(not(withText("Device default"))),
+                        ),
+                    )
+                )
+            )
     }
 
     @Test
@@ -630,7 +779,9 @@
                     priorityListState =
                         PriorityListState.WithData(true, listOf(TEST_APP, TEST_APP_2)),
                     potentialAppSourcesState = PotentialAppSourcesState.WithData(true, listOf()),
-                    aggregationCardsState = AggregationCardsState.Loading(true)))
+                    aggregationCardsState = AggregationCardsState.Loading(true),
+                )
+            )
         }
 
         whenever(dataSourcesViewModel.getEditedPriorityList())
@@ -650,7 +801,9 @@
                 DataSourcesAndAggregationsInfo(
                     priorityListState = PriorityListState.LoadingFailed(true),
                     potentialAppSourcesState = PotentialAppSourcesState.WithData(true, listOf()),
-                    aggregationCardsState = AggregationCardsState.WithData(true, listOf())))
+                    aggregationCardsState = AggregationCardsState.WithData(true, listOf()),
+                )
+            )
         }
 
         whenever(dataSourcesViewModel.getEditedPriorityList())
@@ -672,7 +825,9 @@
                     priorityListState =
                         PriorityListState.WithData(true, listOf(TEST_APP, TEST_APP_2)),
                     potentialAppSourcesState = PotentialAppSourcesState.WithData(true, listOf()),
-                    aggregationCardsState = AggregationCardsState.WithData(true, listOf())))
+                    aggregationCardsState = AggregationCardsState.WithData(true, listOf()),
+                )
+            )
         }
         whenever(dataSourcesViewModel.getEditedPriorityList()).then { listOf(TEST_APP, TEST_APP_2) }
         whenever(dataSourcesViewModel.updatedAggregationCardsData).then {
@@ -681,7 +836,8 @@
         (appUtils as FakeAppUtils).setDefaultApp(TEST_APP_PACKAGE_NAME)
         val scenario =
             launchFragment<DataSourcesFragment>(
-                bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
+                bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY)
+            )
         onIdle()
 
         scenario.onActivity { activity ->
@@ -697,7 +853,11 @@
                         allOf(
                             hasDescendant(withText("1")),
                             hasDescendant(withText(TEST_APP_NAME)),
-                            hasDescendant(withTagValue(`is`("edit_mode")))))))
+                            hasDescendant(withTagValue(`is`("edit_mode"))),
+                        ),
+                    )
+                )
+            )
 
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
@@ -707,7 +867,11 @@
                         allOf(
                             hasDescendant(withText("2")),
                             hasDescendant(withText(TEST_APP_NAME_2)),
-                            hasDescendant(withTagValue(`is`("edit_mode")))))))
+                            hasDescendant(withTagValue(`is`("edit_mode"))),
+                        ),
+                    )
+                )
+            )
     }
 
     @Test
@@ -718,7 +882,9 @@
                     priorityListState =
                         PriorityListState.WithData(true, listOf(TEST_APP, TEST_APP_2)),
                     potentialAppSourcesState = PotentialAppSourcesState.WithData(true, listOf()),
-                    aggregationCardsState = AggregationCardsState.WithData(true, listOf())))
+                    aggregationCardsState = AggregationCardsState.WithData(true, listOf()),
+                )
+            )
         }
         whenever(dataSourcesViewModel.getEditedPriorityList()).then { listOf(TEST_APP, TEST_APP_2) }
         whenever(dataSourcesViewModel.updatedAggregationCardsData).then {
@@ -728,7 +894,8 @@
         (appUtils as FakeAppUtils).setDefaultApp(TEST_APP_PACKAGE_NAME)
         val scenario =
             launchFragment<DataSourcesFragment>(
-                bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY))
+                bundleOf(CATEGORY_KEY to HealthDataCategory.ACTIVITY)
+            )
         onIdle()
 
         scenario.onActivity { activity ->
@@ -744,7 +911,11 @@
                         allOf(
                             hasDescendant(withText("1")),
                             hasDescendant(withText(TEST_APP_NAME)),
-                            hasDescendant(withTagValue(`is`("edit_mode")))))))
+                            hasDescendant(withTagValue(`is`("edit_mode"))),
+                        ),
+                    )
+                )
+            )
 
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
@@ -754,7 +925,11 @@
                         allOf(
                             hasDescendant(withText("2")),
                             hasDescendant(withText(TEST_APP_NAME_2)),
-                            hasDescendant(withTagValue(`is`("edit_mode")))))))
+                            hasDescendant(withTagValue(`is`("edit_mode"))),
+                        ),
+                    )
+                )
+            )
 
         onView(withId(com.android.settingslib.widget.spinner.R.id.spinner)).perform(click())
         onView(withText("Sleep")).perform(click())
@@ -767,7 +942,11 @@
                         allOf(
                             hasDescendant(withText("1")),
                             hasDescendant(withText(TEST_APP_NAME)),
-                            hasDescendant(withTagValue(`is`("drag_mode")))))))
+                            hasDescendant(withTagValue(`is`("drag_mode"))),
+                        ),
+                    )
+                )
+            )
 
         onView(withId(R.id.linear_layout_recycle_view))
             .check(
@@ -777,6 +956,10 @@
                         allOf(
                             hasDescendant(withText("2")),
                             hasDescendant(withText(TEST_APP_NAME_2)),
-                            hasDescendant(withTagValue(`is`("drag_mode")))))))
+                            hasDescendant(withTagValue(`is`("drag_mode"))),
+                        ),
+                    )
+                )
+            )
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadLastDateWithPriorityDataUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadLastDateWithPriorityDataUseCaseTest.kt
index a003dcc..104a10d 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadLastDateWithPriorityDataUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadLastDateWithPriorityDataUseCaseTest.kt
@@ -11,10 +11,12 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.entries.api.LoadEntriesHelper
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
+import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.formatters.shared.HealthDataEntryFormatter
 import com.android.healthconnect.controller.datasources.api.LoadLastDateWithPriorityDataUseCase
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.shared.HealthPermissionToDatatypeMapper
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
 import com.android.healthconnect.controller.tests.utils.CoroutineTestRule
 import com.android.healthconnect.controller.tests.utils.TEST_APP
@@ -70,6 +72,8 @@
     private val timeSource = TestTimeSource
 
     @Inject lateinit var healthDataEntryFormatter: HealthDataEntryFormatter
+    @Inject lateinit var menstruationPeriodFormatter: MenstruationPeriodFormatter
+    @Inject lateinit var dataSourceReader: MedicalDataSourceReader
 
     @Before
     fun setup() {
@@ -78,14 +82,21 @@
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
         hiltRule.inject()
         loadEntriesHelper =
-            LoadEntriesHelper(context, healthDataEntryFormatter, healthConnectManager)
+            LoadEntriesHelper(
+                context,
+                healthDataEntryFormatter,
+                menstruationPeriodFormatter,
+                healthConnectManager,
+                dataSourceReader,
+            )
         loadLastDateWithPriorityDataUseCase =
             LoadLastDateWithPriorityDataUseCase(
                 healthConnectManager,
                 loadEntriesHelper,
                 loadPriorityListUseCase,
                 timeSource,
-                Dispatchers.Main)
+                Dispatchers.Main,
+            )
     }
 
     @After
@@ -115,7 +126,8 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = timeSource.currentLocalDateTime().toLocalDate().minusMonths(1),
-            numRecords = 0)
+            numRecords = 0,
+        )
 
         val result = loadLastDateWithPriorityDataUseCase.invoke(FitnessPermissionType.STEPS)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -134,7 +146,8 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = queryDate,
-            numRecords = 1)
+            numRecords = 1,
+        )
 
         val result = loadLastDateWithPriorityDataUseCase.invoke(FitnessPermissionType.STEPS)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -154,7 +167,8 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = dateWithData,
-            numRecords = 0)
+            numRecords = 0,
+        )
 
         val result = loadLastDateWithPriorityDataUseCase.invoke(FitnessPermissionType.STEPS)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -172,12 +186,14 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = dateWithData,
-            numRecords = 2)
+            numRecords = 2,
+        )
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = timeSource.currentLocalDateTime().toLocalDate().minusMonths(1),
-            numRecords = 0)
+            numRecords = 0,
+        )
 
         mockQueryActivityDatesAnswer(listOf(dateWithData))
 
@@ -206,7 +222,8 @@
                 LocalDate.of(2023, 11, 4),
                 // Future date with data, not included because we only
                 // query for data within the last 30 days
-                LocalDate.of(2024, 11, 2))
+                LocalDate.of(2024, 11, 2),
+            )
 
         mockQueryActivityDatesAnswer(activityDates)
         val minDateWithin1Month = LocalDate.of(2023, 11, 1)
@@ -215,25 +232,29 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = LocalDate.of(2023, 10, 1),
-            recordDates = listOf(LocalDate.of(2023, 10, 1)))
+            recordDates = listOf(LocalDate.of(2023, 10, 1)),
+        )
 
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = minDateWithin1Month,
-            numRecords = 2)
+            numRecords = 2,
+        )
 
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = minDateWithin1Month,
-            recordDates = listOf(LocalDate.of(2023, 11, 1)))
+            recordDates = listOf(LocalDate.of(2023, 11, 1)),
+        )
 
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_3,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = minDateWithin1Month,
-            recordDates = listOf(LocalDate.of(2023, 11, 1), LocalDate.of(2023, 11, 2)))
+            recordDates = listOf(LocalDate.of(2023, 11, 1), LocalDate.of(2023, 11, 2)),
+        )
 
         val result = loadLastDateWithPriorityDataUseCase.invoke(FitnessPermissionType.STEPS)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -255,24 +276,29 @@
                 LocalDate.of(2023, 11, 1),
                 LocalDate.of(2023, 11, 2),
                 // In the future
-                LocalDate.of(2024, 11, 12)))
+                LocalDate.of(2024, 11, 12),
+            )
+        )
         val minDateWithin1Month = LocalDate.of(2023, 11, 1)
 
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = minDateWithin1Month,
-            numRecords = 0)
+            numRecords = 0,
+        )
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = minDateWithin1Month,
-            numRecords = 1)
+            numRecords = 1,
+        )
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_3,
             fitnessPermissionType = FitnessPermissionType.STEPS,
             queryDate = minDateWithin1Month,
-            recordDates = listOf(LocalDate.of(2023, 11, 1), LocalDate.of(2023, 11, 2)))
+            recordDates = listOf(LocalDate.of(2023, 11, 1), LocalDate.of(2023, 11, 2)),
+        )
 
         val result = loadLastDateWithPriorityDataUseCase.invoke(FitnessPermissionType.STEPS)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -301,7 +327,9 @@
                 // Too old
                 LocalDate.of(2021, 8, 12),
                 // Too old
-                LocalDate.of(2023, 7, 2)))
+                LocalDate.of(2023, 7, 2),
+            )
+        )
 
         val minDateWithin1Month = LocalDate.of(2023, 9, 26)
 
@@ -309,17 +337,20 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
-            numRecords = 0)
+            numRecords = 0,
+        )
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
-            numRecords = 1)
+            numRecords = 1,
+        )
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_3,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
-            recordDates = listOf(LocalDate.of(2023, 10, 12), minDateWithin1Month))
+            recordDates = listOf(LocalDate.of(2023, 10, 12), minDateWithin1Month),
+        )
 
         val result = loadLastDateWithPriorityDataUseCase.invoke(fitnessPermissionType)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -345,7 +376,9 @@
                 // Too old
                 LocalDate.of(2021, 9, 13),
                 // Too old
-                LocalDate.of(2023, 8, 2)))
+                LocalDate.of(2023, 8, 2),
+            )
+        )
 
         val minDateWithin1Month = LocalDate.of(2023, 10, 1)
 
@@ -353,20 +386,23 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
-            numRecords = 1)
+            numRecords = 1,
+        )
 
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
             recordDates =
-                listOf(LocalDate.of(2023, 10, 12), LocalDate.of(2023, 10, 14), minDateWithin1Month))
+                listOf(LocalDate.of(2023, 10, 12), LocalDate.of(2023, 10, 14), minDateWithin1Month),
+        )
 
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_3,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
-            numRecords = 1)
+            numRecords = 1,
+        )
 
         val result = loadLastDateWithPriorityDataUseCase.invoke(fitnessPermissionType)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -392,7 +428,9 @@
                 // Too old
                 LocalDate.of(2021, 9, 13),
                 // Too old
-                LocalDate.of(2023, 8, 2)))
+                LocalDate.of(2023, 8, 2),
+            )
+        )
 
         val minDateWithin1Month = LocalDate.of(2023, 10, 1)
 
@@ -400,20 +438,23 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
-            numRecords = 1)
+            numRecords = 1,
+        )
 
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
             recordDates =
-                listOf(LocalDate.of(2023, 10, 12), LocalDate.of(2023, 10, 14), minDateWithin1Month))
+                listOf(LocalDate.of(2023, 10, 12), LocalDate.of(2023, 10, 14), minDateWithin1Month),
+        )
 
         mockReadRecordsResult(
             packageName = TEST_APP_PACKAGE_NAME_3,
             fitnessPermissionType = fitnessPermissionType,
             queryDate = minDateWithin1Month,
-            numRecords = 1)
+            numRecords = 1,
+        )
 
         val result = loadLastDateWithPriorityDataUseCase.invoke(fitnessPermissionType)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -466,23 +507,28 @@
         packageName: String,
         fitnessPermissionType: FitnessPermissionType,
         queryDate: LocalDate,
-        numRecords: Int
+        numRecords: Int,
     ) {
         mockReadRecordsResult(
-            packageName, fitnessPermissionType, queryDate, List(numRecords) { queryDate })
+            packageName,
+            fitnessPermissionType,
+            queryDate,
+            List(numRecords) { queryDate },
+        )
     }
 
     private fun mockReadRecordsResult(
         packageName: String,
         fitnessPermissionType: FitnessPermissionType,
         queryDate: LocalDate,
-        recordDates: List<LocalDate>
+        recordDates: List<LocalDate>,
     ) {
         val timeFilterRange =
             loadEntriesHelper.getTimeFilter(
                 queryDate.toInstantAtStartOfDay(),
                 DateNavigationPeriod.PERIOD_MONTH,
-                endTimeExclusive = true)
+                endTimeExclusive = true,
+            )
         val dataTypes = HealthPermissionToDatatypeMapper.getDataTypes(fitnessPermissionType)
         val records =
             recordDates.map { date -> getRandomRecord(fitnessPermissionType, date) }.toList()
@@ -497,7 +543,8 @@
                             request.forDataType(dataType)
                     },
                     ArgumentMatchers.any(),
-                    ArgumentMatchers.any())
+                    ArgumentMatchers.any(),
+                )
         }
     }
 
@@ -505,14 +552,20 @@
         Mockito.doAnswer(prepareActivityDatesAnswer(datesList))
             .`when`(healthConnectManager)
             .queryActivityDates(
-                ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
     }
 
     private fun mockQueryActivityDatesError() {
         Mockito.doAnswer(prepareFailureAnswer())
             .`when`(healthConnectManager)
             .queryActivityDates(
-                ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+                ArgumentMatchers.any(),
+            )
     }
 
     private fun prepareActivityDatesAnswer(
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadPotentialPriorityListUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadPotentialPriorityListUseCaseTest.kt
index 1656d30..c25f557 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadPotentialPriorityListUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadPotentialPriorityListUseCaseTest.kt
@@ -28,8 +28,8 @@
 import com.android.healthconnect.controller.datasources.api.LoadPotentialPriorityListUseCase
 import com.android.healthconnect.controller.permissions.api.GetGrantedHealthPermissionsUseCase
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
 import com.android.healthconnect.controller.permissiontypes.api.LoadPriorityListUseCase
 import com.android.healthconnect.controller.shared.HealthPermissionReader
@@ -38,7 +38,6 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_2
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_3
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -53,6 +52,7 @@
 import org.mockito.Matchers.any
 import org.mockito.Mockito
 import org.mockito.invocation.InvocationOnMock
+import org.mockito.kotlin.whenever
 
 @ExperimentalCoroutinesApi
 @HiltAndroidTest
@@ -87,7 +87,8 @@
                 healthPermissionReader,
                 getGrantedHealthPermissionsUseCase,
                 loadPriorityListUseCase,
-                Dispatchers.Main)
+                Dispatchers.Main,
+            )
     }
 
     @Test
@@ -120,25 +121,32 @@
     fun getAppsWithWritePermission_forActivity_returnsAppsForActivity() = runTest {
         whenever(healthPermissionReader.getAppsWithFitnessPermissions())
             .thenReturn(
-                listOf(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2, TEST_APP_PACKAGE_NAME_3))
+                listOf(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2, TEST_APP_PACKAGE_NAME_3)
+            )
 
         whenever(healthPermissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
             .thenReturn(
                 listOf(
                     FitnessPermission(FitnessPermissionType.DISTANCE, PermissionsAccessType.WRITE)
-                        .toString()))
+                        .toString()
+                )
+            )
 
         whenever(healthPermissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME_2))
             .thenReturn(
                 listOf(
                     FitnessPermission(FitnessPermissionType.SLEEP, PermissionsAccessType.WRITE)
-                        .toString()))
+                        .toString()
+                )
+            )
 
         whenever(healthPermissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME_3))
             .thenReturn(
                 listOf(
                     FitnessPermission(FitnessPermissionType.HEART_RATE, PermissionsAccessType.READ)
-                        .toString()))
+                        .toString()
+                )
+            )
 
         val result =
             loadPotentialPriorityListUseCase.getAppsWithWritePermission(HealthDataCategory.ACTIVITY)
@@ -152,24 +160,31 @@
     fun getAppsWithWritePermission_forSleep_returnsAppsForSleep() = runTest {
         whenever(healthPermissionReader.getAppsWithFitnessPermissions())
             .thenReturn(
-                listOf(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2, TEST_APP_PACKAGE_NAME_3))
+                listOf(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2, TEST_APP_PACKAGE_NAME_3)
+            )
         whenever(healthPermissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
             .thenReturn(
                 listOf(
                     FitnessPermission(FitnessPermissionType.SLEEP, PermissionsAccessType.READ)
-                        .toString()))
+                        .toString()
+                )
+            )
 
         whenever(healthPermissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME_2))
             .thenReturn(
                 listOf(
                     FitnessPermission(FitnessPermissionType.SLEEP, PermissionsAccessType.WRITE)
-                        .toString()))
+                        .toString()
+                )
+            )
 
         whenever(healthPermissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME_3))
             .thenReturn(
                 listOf(
                     FitnessPermission(FitnessPermissionType.HEART_RATE, PermissionsAccessType.READ)
-                        .toString()))
+                        .toString()
+                )
+            )
 
         val result =
             loadPotentialPriorityListUseCase.getAppsWithWritePermission(HealthDataCategory.SLEEP)
@@ -184,22 +199,26 @@
             RecordTypeInfoResponse(
                 FitnessPermissionType.STEPS.category,
                 HealthDataCategory.ACTIVITY,
-                listOf(getDataOriginTestApp()))
+                listOf(getDataOriginTestApp()),
+            )
         map[DistanceRecord::class.java] =
             RecordTypeInfoResponse(
                 FitnessPermissionType.DISTANCE.category,
                 HealthDataCategory.ACTIVITY,
-                listOf(getDataOriginTestApp2()))
+                listOf(getDataOriginTestApp2()),
+            )
         map[HeartRateRecord::class.java] =
             RecordTypeInfoResponse(
                 FitnessPermissionType.HEART_RATE.category,
                 HealthDataCategory.VITALS,
-                listOf(getDataOriginTestApp3()))
+                listOf(getDataOriginTestApp3()),
+            )
         map[SleepSessionRecord::class.java] =
             RecordTypeInfoResponse(
                 FitnessPermissionType.SLEEP.category,
                 HealthDataCategory.SLEEP,
-                listOf(getDataOriginTestApp2()))
+                listOf(getDataOriginTestApp2()),
+            )
         return map
     }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadPriorityEntriesUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadPriorityEntriesUseCaseTest.kt
index 0ff8521..9c404fb 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadPriorityEntriesUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/datasources/api/LoadPriorityEntriesUseCaseTest.kt
@@ -11,10 +11,12 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.data.entries.api.LoadEntriesHelper
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
+import com.android.healthconnect.controller.dataentries.formatters.MenstruationPeriodFormatter
 import com.android.healthconnect.controller.dataentries.formatters.shared.HealthDataEntryFormatter
 import com.android.healthconnect.controller.datasources.api.LoadPriorityEntriesUseCase
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.shared.HealthPermissionToDatatypeMapper
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
 import com.android.healthconnect.controller.tests.utils.TEST_APP
 import com.android.healthconnect.controller.tests.utils.TEST_APP_2
@@ -65,6 +67,8 @@
 
     private lateinit var loadPriorityEntriesUseCase: LoadPriorityEntriesUseCase
     @Inject lateinit var healthDataEntryFormatter: HealthDataEntryFormatter
+    @Inject lateinit var menstruationPeriodFormatter: MenstruationPeriodFormatter
+    @Inject lateinit var dataSourceReader: MedicalDataSourceReader
 
     @Before
     fun setup() {
@@ -74,7 +78,13 @@
         context.setLocale(Locale.US)
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
         loadEntriesHelper =
-            LoadEntriesHelper(context, healthDataEntryFormatter, healthConnectManager)
+            LoadEntriesHelper(
+                context,
+                healthDataEntryFormatter,
+                menstruationPeriodFormatter,
+                healthConnectManager,
+                dataSourceReader,
+            )
         loadPriorityEntriesUseCase =
             LoadPriorityEntriesUseCase(loadEntriesHelper, loadPriorityListUseCase, Dispatchers.Main)
     }
@@ -104,7 +114,10 @@
                 getSleepSessionRecords(
                     listOf(
                         Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE),
-                        Pair(SLEEP_SESSION_2_START_DATE, SLEEP_SESSION_2_END_DATE))))
+                        Pair(SLEEP_SESSION_2_START_DATE, SLEEP_SESSION_2_END_DATE),
+                    )
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
@@ -112,7 +125,9 @@
             queryDate = sleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_3_START_DATE, SLEEP_SESSION_3_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_3_START_DATE, SLEEP_SESSION_3_END_DATE))
+                ),
+        )
 
         val result = loadPriorityEntriesUseCase.invoke(FitnessPermissionType.SLEEP, sleepDate)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -122,7 +137,10 @@
                 getSleepSessionRecords(
                     listOf(
                         Pair(SLEEP_SESSION_2_START_DATE, SLEEP_SESSION_2_END_DATE),
-                        Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE))))
+                        Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE),
+                    )
+                ),
+        )
     }
 
     @Test
@@ -162,7 +180,9 @@
             queryDate = sleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE))
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
@@ -170,7 +190,9 @@
             queryDate = sleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_2_START_DATE, SLEEP_SESSION_2_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_2_START_DATE, SLEEP_SESSION_2_END_DATE))
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME,
@@ -178,7 +200,9 @@
             queryDate = pastSleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_4_START_DATE, SLEEP_SESSION_4_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_4_START_DATE, SLEEP_SESSION_4_END_DATE))
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
@@ -188,7 +212,10 @@
                 getSleepSessionRecords(
                     listOf(
                         Pair(SLEEP_SESSION_3_START_DATE, SLEEP_SESSION_3_END_DATE),
-                        Pair(SLEEP_SESSION_5_START_DATE, SLEEP_SESSION_5_END_DATE))))
+                        Pair(SLEEP_SESSION_5_START_DATE, SLEEP_SESSION_5_END_DATE),
+                    )
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME_3,
@@ -196,7 +223,9 @@
             queryDate = sleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_6_START_DATE, SLEEP_SESSION_6_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_6_START_DATE, SLEEP_SESSION_6_END_DATE))
+                ),
+        )
 
         val result = loadPriorityEntriesUseCase.invoke(FitnessPermissionType.SLEEP, sleepDate)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -206,7 +235,10 @@
                 getSleepSessionRecords(
                     listOf(
                         Pair(SLEEP_SESSION_2_START_DATE, SLEEP_SESSION_2_END_DATE),
-                        Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE))))
+                        Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE),
+                    )
+                ),
+        )
     }
 
     @Test
@@ -245,13 +277,15 @@
             packageName = TEST_APP_PACKAGE_NAME,
             fitnessPermissionType = FitnessPermissionType.SLEEP,
             queryDate = noDataDate,
-            records = listOf())
+            records = listOf(),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
             fitnessPermissionType = FitnessPermissionType.SLEEP,
             queryDate = noDataDate,
-            records = listOf())
+            records = listOf(),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME,
@@ -259,7 +293,9 @@
             queryDate = sleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_1_START_DATE, SLEEP_SESSION_1_END_DATE))
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
@@ -267,7 +303,9 @@
             queryDate = sleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_2_START_DATE, SLEEP_SESSION_2_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_2_START_DATE, SLEEP_SESSION_2_END_DATE))
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME,
@@ -275,7 +313,9 @@
             queryDate = pastSleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_4_START_DATE, SLEEP_SESSION_4_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_4_START_DATE, SLEEP_SESSION_4_END_DATE))
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME_2,
@@ -285,7 +325,10 @@
                 getSleepSessionRecords(
                     listOf(
                         Pair(SLEEP_SESSION_3_START_DATE, SLEEP_SESSION_3_END_DATE),
-                        Pair(SLEEP_SESSION_5_START_DATE, SLEEP_SESSION_5_END_DATE))))
+                        Pair(SLEEP_SESSION_5_START_DATE, SLEEP_SESSION_5_END_DATE),
+                    )
+                ),
+        )
 
         mockEntriesResult(
             packageName = TEST_APP_PACKAGE_NAME_3,
@@ -293,7 +336,9 @@
             queryDate = sleepDate,
             records =
                 getSleepSessionRecords(
-                    listOf(Pair(SLEEP_SESSION_6_START_DATE, SLEEP_SESSION_6_END_DATE))))
+                    listOf(Pair(SLEEP_SESSION_6_START_DATE, SLEEP_SESSION_6_END_DATE))
+                ),
+        )
 
         val result = loadPriorityEntriesUseCase.invoke(FitnessPermissionType.SLEEP, noDataDate)
         assertThat(result is UseCaseResults.Success).isTrue()
@@ -331,13 +376,14 @@
         packageName: String,
         fitnessPermissionType: FitnessPermissionType,
         queryDate: LocalDate,
-        records: List<Record>
+        records: List<Record>,
     ) {
         val timeFilterRange =
             loadEntriesHelper.getTimeFilter(
                 queryDate.toInstantAtStartOfDay(),
                 DateNavigationPeriod.PERIOD_DAY,
-                endTimeExclusive = true)
+                endTimeExclusive = true,
+            )
         val dataTypes = HealthPermissionToDatatypeMapper.getDataTypes(fitnessPermissionType)
 
         dataTypes.map { dataType ->
@@ -350,7 +396,8 @@
                             request.forDataType(dataType)
                     },
                     ArgumentMatchers.any(),
-                    ArgumentMatchers.any())
+                    ArgumentMatchers.any(),
+                )
         }
     }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/deletion/DeletionFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/deletion/DeletionFragmentTest.kt
index 1f5e47c..20ed157 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/deletion/DeletionFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/deletion/DeletionFragmentTest.kt
@@ -16,6 +16,7 @@
 package com.android.healthconnect.controller.tests.deletion
 
 import android.health.connect.HealthDataCategory
+import android.health.connect.datatypes.StepsRecord
 import android.os.Bundle
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MutableLiveData
@@ -39,7 +40,6 @@
 import com.android.healthconnect.controller.deletion.DeletionType
 import com.android.healthconnect.controller.deletion.DeletionViewModel
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.launchFragment
@@ -52,6 +52,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 @Deprecated("This won't be used once the NEW_INFORMATION_ARCHITECTURE feature is enabled.")
@@ -64,7 +65,7 @@
     @Before
     fun setup() {
         hiltRule.inject()
-        Mockito.`when`(viewModel.isInactiveApp).then { false }
+        whenever(viewModel.isInactiveApp).then { false }
         toggleAnimation(false)
     }
 
@@ -78,7 +79,7 @@
     fun deleteAllData_timeRangeDialog_showsCorrectText() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(DeletionParameters(deletionType = deletionTypeAllData))
         }
 
@@ -86,7 +87,9 @@
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withText("Choose data to delete from Health Connect"))
@@ -95,7 +98,9 @@
         onView(
                 withText(
                     "This permanently deletes all data added to Health\u00A0Connect in the chosen" +
-                        " time period"))
+                        " time period"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Delete last 24 hours"))
@@ -123,7 +128,7 @@
         val deletionTypeCategory =
             DeletionType.DeletionTypeCategoryData(category = HealthDataCategory.ACTIVITY)
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(DeletionParameters(deletionType = deletionTypeCategory))
         }
 
@@ -131,7 +136,9 @@
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeCategory))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeCategory),
+                )
         }
 
         onView(withText("Choose data to delete from Health Connect"))
@@ -140,7 +147,9 @@
         onView(
                 withText(
                     "This permanently deletes activity data added to Health\u00A0Connect in the chosen" +
-                        " time period"))
+                        " time period"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Delete last 24 hours"))
@@ -167,9 +176,10 @@
     fun deletePermissionTypeData_timeRangeDialog_showsCorrectText() {
         val deletionTypeFitnessPermissionType =
             DeletionType.DeletionTypeHealthPermissionTypeData(
-                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE)
+                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE
+            )
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(DeletionParameters(deletionType = deletionTypeFitnessPermissionType))
         }
 
@@ -188,7 +198,9 @@
         onView(
                 withText(
                     "This permanently deletes blood glucose data added to Health\u00A0Connect in the chosen" +
-                        " time period"))
+                        " time period"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Delete last 24 hours"))
@@ -215,9 +227,11 @@
     fun deleteAppData_timeRangeDialog_showsCorrectText() {
         val deletionTypeAppData =
             DeletionType.DeletionTypeAppData(
-                packageName = TEST_APP_PACKAGE_NAME, appName = TEST_APP_NAME)
+                packageName = TEST_APP_PACKAGE_NAME,
+                appName = TEST_APP_NAME,
+            )
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(DeletionParameters(deletionType = deletionTypeAppData))
         }
 
@@ -225,7 +239,9 @@
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAppData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAppData),
+                )
         }
 
         onView(withText("Choose data to delete from Health Connect"))
@@ -234,7 +250,9 @@
         onView(
                 withText(
                     "This permanently deletes $TEST_APP_NAME data added to Health\u00A0Connect in the chosen" +
-                        " time period"))
+                        " time period"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Delete last 24 hours"))
@@ -265,7 +283,7 @@
                 packageName = TEST_APP_PACKAGE_NAME,
                 appName = TEST_APP_NAME,
             )
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(DeletionParameters(deletionType = deletionTypePermissionTypeFromApp))
         }
 
@@ -284,7 +302,9 @@
         onView(
                 withText(
                     "This permanently deletes steps data added by $TEST_APP_NAME to Health\u00A0Connect in the chosen" +
-                        " time period"))
+                        " time period"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Delete last 24 hours"))
@@ -311,19 +331,22 @@
     fun deleteAllData_confirmationDialogForOneDay_showsCorrectText() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_24_HOURS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_one_day))
@@ -339,7 +362,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -348,19 +373,22 @@
     fun deleteAllData_confirmationDialogForOneWeek_showsCorrectText() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_7_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_one_week))
@@ -376,7 +404,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -385,19 +415,22 @@
     fun deleteAllData_confirmationDialogForOneMonth_showsCorrectText() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_30_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_one_month))
@@ -413,7 +446,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -422,19 +457,22 @@
     fun deleteAllData_confirmationDialogForAllTime_showsCorrectText() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -450,7 +488,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -460,19 +500,22 @@
         val deletionTypeCategory =
             DeletionType.DeletionTypeCategoryData(category = HealthDataCategory.ACTIVITY)
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeCategory,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_24_HOURS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeCategory))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeCategory),
+                )
         }
 
         onView(withId(R.id.radio_button_one_day))
@@ -488,7 +531,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -497,19 +542,22 @@
     fun deleteCategoryData_confirmationDialogForOneWeek_showsCorrectText() {
         val deletionTypeCategory =
             DeletionType.DeletionTypeCategoryData(category = HealthDataCategory.ACTIVITY)
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeCategory,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_7_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeCategory))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeCategory),
+                )
         }
 
         onView(withId(R.id.radio_button_one_week))
@@ -525,7 +573,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -535,19 +585,22 @@
         val deletionTypeCategory =
             DeletionType.DeletionTypeCategoryData(category = HealthDataCategory.ACTIVITY)
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeCategory,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_30_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeCategory))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeCategory),
+                )
         }
 
         onView(withId(R.id.radio_button_one_month))
@@ -563,7 +616,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -572,19 +627,22 @@
     fun deleteCategoryData_confirmationDialogForAllTime_showsCorrectText() {
         val deletionTypeCategory =
             DeletionType.DeletionTypeCategoryData(category = HealthDataCategory.ACTIVITY)
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeCategory,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeCategory))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeCategory),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -600,7 +658,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -609,14 +669,16 @@
     fun deletePermissionTypeData_confirmationDialogForOneDay_showsCorrectText() {
         val deletionTypeFitnessPermissionType =
             DeletionType.DeletionTypeHealthPermissionTypeData(
-                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE)
+                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE
+            )
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeFitnessPermissionType,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_24_HOURS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
@@ -641,7 +703,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -650,13 +714,15 @@
     fun deletePermissionTypeData_confirmationDialogForOneWeek_showsCorrectText() {
         val deletionTypeFitnessPermissionType =
             DeletionType.DeletionTypeHealthPermissionTypeData(
-                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE)
-        Mockito.`when`(viewModel.deletionParameters).then {
+                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE
+            )
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeFitnessPermissionType,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_7_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
@@ -681,7 +747,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -690,14 +758,16 @@
     fun deletePermissionTypeData_confirmationDialogForOneMonth_showsCorrectText() {
         val deletionTypeFitnessPermissionType =
             DeletionType.DeletionTypeHealthPermissionTypeData(
-                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE)
+                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE
+            )
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeFitnessPermissionType,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_30_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
@@ -722,7 +792,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -731,13 +803,15 @@
     fun deletePermissionTypeData_confirmationDialogForAllTime_showsCorrectText() {
         val deletionTypeFitnessPermissionType =
             DeletionType.DeletionTypeHealthPermissionTypeData(
-                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE)
-        Mockito.`when`(viewModel.deletionParameters).then {
+                fitnessPermissionType = FitnessPermissionType.BLOOD_GLUCOSE
+            )
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeFitnessPermissionType,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
@@ -762,7 +836,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -771,21 +847,26 @@
     fun deleteAppData_confirmationDialogForOneDay_showsCorrectText() {
         val deletionTypeAppData =
             DeletionType.DeletionTypeAppData(
-                packageName = TEST_APP_PACKAGE_NAME, appName = TEST_APP_NAME)
+                packageName = TEST_APP_PACKAGE_NAME,
+                appName = TEST_APP_NAME,
+            )
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAppData,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_24_HOURS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAppData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAppData),
+                )
         }
 
         onView(withId(R.id.radio_button_one_day))
@@ -801,7 +882,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -810,20 +893,25 @@
     fun deleteAppData_confirmationDialogForOneWeek_showsCorrectText() {
         val deletionTypeAppData =
             DeletionType.DeletionTypeAppData(
-                packageName = TEST_APP_PACKAGE_NAME, appName = TEST_APP_NAME)
-        Mockito.`when`(viewModel.deletionParameters).then {
+                packageName = TEST_APP_PACKAGE_NAME,
+                appName = TEST_APP_NAME,
+            )
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAppData,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_7_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAppData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAppData),
+                )
         }
 
         onView(withId(R.id.radio_button_one_week))
@@ -839,7 +927,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -848,21 +938,26 @@
     fun deleteAppData_confirmationDialogForOneMonth_showsCorrectText() {
         val deletionTypeAppData =
             DeletionType.DeletionTypeAppData(
-                packageName = TEST_APP_PACKAGE_NAME, appName = TEST_APP_NAME)
+                packageName = TEST_APP_PACKAGE_NAME,
+                appName = TEST_APP_NAME,
+            )
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAppData,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_30_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAppData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAppData),
+                )
         }
 
         onView(withId(R.id.radio_button_one_month))
@@ -878,7 +973,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -887,20 +984,25 @@
     fun deleteAppData_confirmationDialogForAllTime_showsCorrectText() {
         val deletionTypeAppData =
             DeletionType.DeletionTypeAppData(
-                packageName = TEST_APP_PACKAGE_NAME, appName = TEST_APP_NAME)
-        Mockito.`when`(viewModel.deletionParameters).then {
+                packageName = TEST_APP_PACKAGE_NAME,
+                appName = TEST_APP_NAME,
+            )
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAppData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAppData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAppData),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -916,7 +1018,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -929,12 +1033,13 @@
                 packageName = TEST_APP_PACKAGE_NAME,
                 appName = TEST_APP_NAME,
             )
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypePermissionTypeFromApp,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_24_HOURS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
@@ -955,13 +1060,17 @@
 
         onView(
                 withText(
-                    "Permanently delete steps data added by $TEST_APP_NAME from the last 24 hours?"))
+                    "Permanently delete steps data added by $TEST_APP_NAME from the last 24 hours?"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -974,12 +1083,13 @@
                 packageName = TEST_APP_PACKAGE_NAME,
                 appName = TEST_APP_NAME,
             )
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypePermissionTypeFromApp,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_7_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
@@ -1000,13 +1110,17 @@
 
         onView(
                 withText(
-                    "Permanently delete steps data added by $TEST_APP_NAME from the last 7 days?"))
+                    "Permanently delete steps data added by $TEST_APP_NAME from the last 7 days?"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -1019,12 +1133,13 @@
                 packageName = TEST_APP_PACKAGE_NAME,
                 appName = TEST_APP_NAME,
             )
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypePermissionTypeFromApp,
                     chosenRange = ChosenRange.DELETE_RANGE_LAST_30_DAYS,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
@@ -1045,13 +1160,17 @@
 
         onView(
                 withText(
-                    "Permanently delete steps data added by $TEST_APP_NAME from the last 30 days?"))
+                    "Permanently delete steps data added by $TEST_APP_NAME from the last 30 days?"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -1064,12 +1183,13 @@
                 packageName = TEST_APP_PACKAGE_NAME,
                 appName = TEST_APP_NAME,
             )
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypePermissionTypeFromApp,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
@@ -1094,7 +1214,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
     }
@@ -1103,15 +1225,18 @@
     fun deleteInActiveAppData_confirmationDialog_showsCorrectText() {
         val deletionTypeAppData =
             DeletionType.DeletionTypeAppData(
-                packageName = TEST_APP_PACKAGE_NAME, appName = TEST_APP_NAME)
-        Mockito.`when`(viewModel.deletionParameters).then {
+                packageName = TEST_APP_PACKAGE_NAME,
+                appName = TEST_APP_NAME,
+            )
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAppData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
-        Mockito.`when`(viewModel.isInactiveApp).then { true }
+        whenever(viewModel.isInactiveApp).then { true }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
@@ -1128,7 +1253,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
@@ -1141,21 +1268,24 @@
     fun confirmationDialog_goBackButton_navigatesToTimeRangeDialog() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
-        Mockito.`when`(viewModel.showTimeRangeDialogFragment).then { true }
+        whenever(viewModel.showTimeRangeDialogFragment).then { true }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -1171,7 +1301,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
@@ -1183,7 +1315,9 @@
         onView(
                 withText(
                     "This permanently deletes all data added to Health\u00A0Connect in the chosen" +
-                        " time period"))
+                        " time period"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Delete last 24 hours"))
@@ -1208,13 +1342,13 @@
 
     @Test
     fun deleteAllData_confirmationDialogForEntry_showsCorrectText() {
-        val deletionEntry = DeletionType.DeleteDataEntry("test_id", DataType.STEPS, 0)
+        val deletionEntry = DeletionType.DeleteDataEntry("test_id", StepsRecord::class, 0)
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(DeletionParameters(deletionType = deletionEntry))
         }
 
-        Mockito.`when`(viewModel.showTimeRangeDialogFragment).then { false }
+        whenever(viewModel.showTimeRangeDialogFragment).then { false }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
@@ -1228,13 +1362,17 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
@@ -1246,21 +1384,24 @@
     fun deleteAllData_confirmationDialog_cancelButton_exitsFlow() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
-        Mockito.`when`(viewModel.showTimeRangeDialogFragment).then { false }
+        whenever(viewModel.showTimeRangeDialogFragment).then { false }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -1276,7 +1417,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
@@ -1289,20 +1432,23 @@
     fun deleteFragment_progressIndicatorStartedState_progressIndicatorShown() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionState = DeletionState.STATE_PROGRESS_INDICATOR_STARTED,
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -1318,7 +1464,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
@@ -1331,20 +1479,23 @@
     fun deleteFragment_progressIndicatorCanEndState_progressIndicatorDisappears() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionState = DeletionState.STATE_PROGRESS_INDICATOR_CAN_END,
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -1360,7 +1511,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
@@ -1373,20 +1526,23 @@
     fun deleteFragment_deletionSuccessfulState_successMessageShown() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionState = DeletionState.STATE_DELETION_SUCCESSFUL,
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -1402,7 +1558,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
@@ -1414,7 +1572,9 @@
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "If you want to completely delete the data from your connected apps, check each app where your data may be saved."))
+                    "If you want to completely delete the data from your connected apps, check each app where your data may be saved."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("See connected apps")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -1425,20 +1585,23 @@
     fun deleteFragment_deletionFailedState_failureMessageShown() {
         val deletionTypeAllData = DeletionType.DeletionTypeAllData()
 
-        Mockito.`when`(viewModel.deletionParameters).then {
+        whenever(viewModel.deletionParameters).then {
             MutableLiveData(
                 DeletionParameters(
                     deletionState = DeletionState.STATE_DELETION_FAILED,
                     deletionType = deletionTypeAllData,
                     chosenRange = ChosenRange.DELETE_RANGE_ALL_DATA,
-                ))
+                )
+            )
         }
 
         launchFragment<DeletionFragment>(Bundle()) {
             (this as DeletionFragment)
                 .parentFragmentManager
                 .setFragmentResult(
-                    START_DELETION_EVENT, bundleOf(DELETION_TYPE to deletionTypeAllData))
+                    START_DELETION_EVENT,
+                    bundleOf(DELETION_TYPE to deletionTypeAllData),
+                )
         }
 
         onView(withId(R.id.radio_button_all))
@@ -1454,7 +1617,9 @@
 
         onView(
                 withText(
-                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"))
+                    "Connected apps will no longer be able to access this data from Health\u00A0Connect"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeleteCategoryUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeleteCategoryUseCaseTest.kt
index ede39b1..d741841 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeleteCategoryUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeleteCategoryUseCaseTest.kt
@@ -19,20 +19,7 @@
 import android.health.connect.HealthConnectManager
 import android.health.connect.HealthDataCategory
 import android.health.connect.TimeInstantRangeFilter
-import android.health.connect.datatypes.ActiveCaloriesBurnedRecord
-import android.health.connect.datatypes.CyclingPedalingCadenceRecord
-import android.health.connect.datatypes.DistanceRecord
-import android.health.connect.datatypes.ElevationGainedRecord
-import android.health.connect.datatypes.ExerciseSessionRecord
-import android.health.connect.datatypes.FloorsClimbedRecord
-import android.health.connect.datatypes.PlannedExerciseSessionRecord
-import android.health.connect.datatypes.PowerRecord
-import android.health.connect.datatypes.SpeedRecord
-import android.health.connect.datatypes.StepsCadenceRecord
-import android.health.connect.datatypes.StepsRecord
-import android.health.connect.datatypes.TotalCaloriesBurnedRecord
-import android.health.connect.datatypes.Vo2MaxRecord
-import android.health.connect.datatypes.WheelchairPushesRecord
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings
 import com.android.healthconnect.controller.deletion.DeletionType
 import com.android.healthconnect.controller.deletion.api.DeleteCategoryUseCase
 import com.google.common.truth.Truth.assertThat
@@ -82,7 +69,8 @@
 
         useCase.invoke(
             deleteCategory,
-            TimeInstantRangeFilter.Builder().setStartTime(startTime).setEndTime(endTime).build())
+            TimeInstantRangeFilter.Builder().setStartTime(startTime).setEndTime(endTime).build(),
+        )
 
         Mockito.verify(manager, Mockito.times(1))
             .deleteRecords(filtersCaptor.capture(), any(), any())
@@ -92,22 +80,15 @@
         assertThat((filtersCaptor.value.timeRangeFilter as TimeInstantRangeFilter).endTime)
             .isEqualTo(endTime)
         assertThat(filtersCaptor.value.dataOrigins).isEmpty()
+        val healthConnectMappings = HealthConnectMappings.getInstance()
         assertThat(filtersCaptor.value.recordTypes)
-            .containsExactly(
-                TotalCaloriesBurnedRecord::class.java,
-                ActiveCaloriesBurnedRecord::class.java,
-                DistanceRecord::class.java,
-                StepsRecord::class.java,
-                StepsCadenceRecord::class.java,
-                SpeedRecord::class.java,
-                PowerRecord::class.java,
-                WheelchairPushesRecord::class.java,
-                FloorsClimbedRecord::class.java,
-                ElevationGainedRecord::class.java,
-                Vo2MaxRecord::class.java,
-                CyclingPedalingCadenceRecord::class.java,
-                ExerciseSessionRecord::class.java,
-                PlannedExerciseSessionRecord::class.java)
+            .containsExactlyElementsIn(
+                healthConnectMappings.allRecordTypeIdentifiers
+                    .associateWith { healthConnectMappings.getRecordCategoryForRecordType(it) }
+                    .filterValues { it == HealthDataCategory.ACTIVITY }
+                    .keys
+                    .map { healthConnectMappings.recordIdToExternalRecordClassMap[it]!! }
+            )
     }
 
     private fun prepareAnswer(): (InvocationOnMock) -> Nothing? {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeleteEntryUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeleteEntryUseCaseTest.kt
index 0cc5226..1ac6d39 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeleteEntryUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeleteEntryUseCaseTest.kt
@@ -20,7 +20,6 @@
 import android.health.connect.datatypes.StepsRecord
 import com.android.healthconnect.controller.deletion.DeletionType.DeleteDataEntry
 import com.android.healthconnect.controller.deletion.api.DeleteEntryUseCase
-import com.android.healthconnect.controller.shared.DataType
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -63,7 +62,7 @@
             .`when`(manager)
             .deleteRecords(anyListOf(RecordIdFilter::class.java), any(), any())
 
-        useCase.invoke(DeleteDataEntry("test_id", DataType.STEPS, 0))
+        useCase.invoke(DeleteDataEntry("test_id", StepsRecord::class, 0))
 
         verify(manager, times(1)).deleteRecords(listCaptor.capture(), any(), any())
         assertThat(listCaptor.value[0].id).isEqualTo("test_id")
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeletePermissionTypeAppDataUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeletePermissionTypeAllDataUseCaseTest.kt
similarity index 98%
rename from apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeletePermissionTypeAppDataUseCaseTest.kt
rename to apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeletePermissionTypeAllDataUseCaseTest.kt
index 9f86b87..ba64ab2 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeletePermissionTypeAppDataUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/deletion/api/DeletePermissionTypeAllDataUseCaseTest.kt
@@ -43,7 +43,7 @@
 
 @HiltAndroidTest
 @Deprecated("This won't be used once the NEW_INFORMATION_ARCHITECTURE feature is enabled.")
-class DeletePermissionTypeAppDataUseCaseTest {
+class DeletePermissionTypeAllDataUseCaseTest {
     @get:Rule val hiltRule = HiltAndroidRule(this)
 
     private lateinit var useCase: DeletePermissionTypeAppDataUseCase
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/entrydetails/DataEntryDetailsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/entrydetails/DataEntryDetailsFragmentTest.kt
index a6f1881..1edba5c 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/entrydetails/DataEntryDetailsFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/entrydetails/DataEntryDetailsFragmentTest.kt
@@ -36,7 +36,12 @@
 import android.health.connect.datatypes.ExercisePerformanceGoal
 import android.health.connect.datatypes.ExerciseRoute
 import android.health.connect.datatypes.ExerciseSegmentType
+import android.health.connect.datatypes.ExerciseSessionRecord
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.PlannedExerciseSessionRecord
 import android.health.connect.datatypes.PlannedExerciseStep
+import android.health.connect.datatypes.SkinTemperatureRecord
+import android.health.connect.datatypes.SleepSessionRecord
 import android.health.connect.datatypes.units.Length
 import android.health.connect.datatypes.units.Velocity
 import androidx.lifecycle.MutableLiveData
@@ -68,7 +73,6 @@
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.PLANNED_EXERCISE
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.SKIN_TEMPERATURE
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.SLEEP
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.tests.utils.TestData.WARSAW_ROUTE
 import com.android.healthconnect.controller.tests.utils.getPlannedExerciseBlock
 import com.android.healthconnect.controller.tests.utils.getPlannedExerciseStep
@@ -90,12 +94,12 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito.mock
-import org.mockito.Mockito.`when` as whenever
 import org.mockito.kotlin.atLeast
 import org.mockito.kotlin.atMost
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class DataEntryDetailsFragmentTest {
@@ -104,6 +108,7 @@
     @BindValue
     val viewModel: DataEntryDetailsViewModel = mock(DataEntryDetailsViewModel::class.java)
     private lateinit var context: Context
+
     @BindValue val healthConnectLogger: HealthConnectLogger = org.mockito.kotlin.mock()
 
     @Before
@@ -125,7 +130,11 @@
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = SLEEP, entryId = "1", showDataOrigin = true))
+                permissionType = SLEEP,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withId(R.id.loading)).check(matches(not(isDisplayed())))
     }
@@ -136,7 +145,11 @@
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = SLEEP, entryId = "1", showDataOrigin = true))
+                permissionType = SLEEP,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withId(R.id.error_view)).check(matches(isDisplayed()))
     }
@@ -147,7 +160,11 @@
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = SLEEP, entryId = "1", showDataOrigin = true))
+                permissionType = SLEEP,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withId(R.id.loading)).check(matches(isDisplayed()))
     }
@@ -165,12 +182,21 @@
                                 headerA11y = "07:06 • TEST_APP_NAME",
                                 title = "12 hour sleeping",
                                 titleA11y = "12 hour sleeping",
-                                dataType = DataType.SLEEP,
-                                notes = "notes")))))
+                                dataType = SleepSessionRecord::class,
+                                notes = "notes",
+                            )
+                        )
+                    )
+                )
+            )
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = SLEEP, entryId = "1", showDataOrigin = true))
+                permissionType = SLEEP,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("07:06 • TEST_APP_NAME")).check(matches(isDisplayed()))
         onView(withText("12 hour sleeping")).check(matches(isDisplayed()))
@@ -191,7 +217,11 @@
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = SLEEP, entryId = "1", showDataOrigin = true))
+                permissionType = SLEEP,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("12 hour sleeping")).check(matches(isDisplayed()))
         onView(withText("6 hour light sleeping")).check(matches(isDisplayed()))
@@ -206,7 +236,11 @@
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = HEART_RATE, entryId = "1", showDataOrigin = true))
+                permissionType = HEART_RATE,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("07:06 - 8:06 • TEST_APP_NAME")).check(matches(isDisplayed()))
         onView(withText("100 bpm")).check(matches(isDisplayed()))
@@ -223,7 +257,11 @@
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = SKIN_TEMPERATURE, entryId = "1", showDataOrigin = true))
+                permissionType = SKIN_TEMPERATURE,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("+0.5℃ (avg variation)")).check(matches(isDisplayed()))
         onView(withText("Measurement location")).check(matches(isDisplayed()))
@@ -247,7 +285,11 @@
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = SKIN_TEMPERATURE, entryId = "1", showDataOrigin = true))
+                permissionType = SKIN_TEMPERATURE,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("+0.5℃ (avg variation)")).check(matches(isDisplayed()))
         onView(withText("Measurement location")).check(doesNotExist())
@@ -271,7 +313,11 @@
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = SKIN_TEMPERATURE, entryId = "1", showDataOrigin = true))
+                permissionType = SKIN_TEMPERATURE,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("+0.5℃ (avg variation)")).check(matches(isDisplayed()))
         onView(withText("Measurement location")).check(matches(isDisplayed()))
@@ -291,7 +337,11 @@
         whenever(viewModel.sessionData).thenReturn(MutableLiveData(WithData(list)))
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = EXERCISE, entryId = "1", showDataOrigin = true))
+                permissionType = EXERCISE,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("12 hour running")).check(matches(isDisplayed()))
         onView(withId(R.id.map_view)).check(matches(isDisplayed()))
@@ -305,7 +355,11 @@
         whenever(viewModel.sessionData).thenReturn(MutableLiveData(WithData(list)))
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = EXERCISE, entryId = "1", showDataOrigin = true))
+                permissionType = EXERCISE,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("12 hour running")).check(matches(isDisplayed()))
         onView(withId(R.id.map_view)).check(matches(not(isDisplayed())))
@@ -321,8 +375,10 @@
                     headerA11y = "from 07:06 to 08:06 • Health Connect test app",
                     title = "Running • Morning Run",
                     titleA11y = "Running • Morning Run",
-                    dataType = DataType.PLANNED_EXERCISE,
-                    notes = "Morning quick run by the park"))
+                    dataType = PlannedExerciseSessionRecord::class,
+                    notes = "Morning quick run by the park",
+                )
+            )
             add(
                 PlannedExerciseBlockEntry(
                     block =
@@ -335,15 +391,23 @@
                                         ExerciseSegmentType.EXERCISE_SEGMENT_TYPE_RUNNING,
                                     completionGoal =
                                         ExerciseCompletionGoal.DistanceGoal(
-                                            Length.fromMeters(1000.0)),
+                                            Length.fromMeters(1000.0)
+                                        ),
                                     performanceGoals =
                                         listOf(
                                             ExercisePerformanceGoal.HeartRateGoal(100, 150),
                                             ExercisePerformanceGoal.SpeedGoal(
                                                 Velocity.fromMetersPerSecond(25.0),
-                                                Velocity.fromMetersPerSecond(15.0)))))),
+                                                Velocity.fromMetersPerSecond(15.0),
+                                            ),
+                                        ),
+                                )
+                            ),
+                        ),
                     title = "Warm up: 1 time",
-                    titleA11y = "Warm up 1 time"))
+                    titleA11y = "Warm up 1 time",
+                )
+            )
             add(SessionHeader("Notes"))
             add(FormattedSectionContent("Morning quick run by the park"))
             add(
@@ -355,31 +419,45 @@
                                     ExercisePerformanceGoal.HeartRateGoal(150, 180),
                                     ExercisePerformanceGoal.SpeedGoal(
                                         Velocity.fromMetersPerSecond(25.0),
-                                        Velocity.fromMetersPerSecond(15.0))))
+                                        Velocity.fromMetersPerSecond(15.0),
+                                    ),
+                                )
+                            )
                             .build(),
                     title = "4 km Running",
-                    titleA11y = "4 kilometres Running"))
+                    titleA11y = "4 kilometres Running",
+                )
+            )
             add(FormattedSectionContent(title = "This is a test exercise step", bulleted = true))
             add(
                 ExercisePerformanceGoalEntry(
                     goal = ExercisePerformanceGoal.HeartRateGoal(150, 180),
                     title = "150 bpm - 180 bpm",
-                    titleA11y = "150 beats per minute - 180 beats per minute"))
+                    titleA11y = "150 beats per minute - 180 beats per minute",
+                )
+            )
             add(
                 ExercisePerformanceGoalEntry(
                     goal =
                         ExercisePerformanceGoal.SpeedGoal(
                             Velocity.fromMetersPerSecond(180.0),
-                            Velocity.fromMetersPerSecond(90.0)),
+                            Velocity.fromMetersPerSecond(90.0),
+                        ),
                     title = "180 km/h - 90 km/h",
-                    titleA11y = "180 kilometres per hour - 90 kilometres per hour"))
+                    titleA11y = "180 kilometres per hour - 90 kilometres per hour",
+                )
+            )
         }
 
         whenever(viewModel.sessionData).thenReturn(MutableLiveData(WithData(list)))
 
         launchFragment<DataEntryDetailsFragment>(
             DataEntryDetailsFragment.createBundle(
-                permissionType = PLANNED_EXERCISE, entryId = "1", showDataOrigin = true))
+                permissionType = PLANNED_EXERCISE,
+                entryId = "1",
+                showDataOrigin = true,
+            )
+        )
 
         onView(withText("07:06 - 08:06 • Health Connect test app")).check(matches(isDisplayed()))
         onView(withText("Running • Morning Run")).check(matches(isDisplayed()))
@@ -415,7 +493,8 @@
                 headerA11y = "07:06 • TEST_APP_NAME",
                 title = "6 hour deep sleeping",
                 titleA11y = "6 hour deep sleeping",
-            ))
+            ),
+        )
     }
 
     private fun getSkinTemperatureEntry(): FormattedEntry {
@@ -425,12 +504,13 @@
             headerA11y = "16:00 - 17:00 • TEST_APP_NAME",
             title = "+0.5℃ (avg variation)",
             titleA11y = "+0.5 degrees Celsius (average variation)",
-            dataType = DataType.SKIN_TEMPERATURE)
+            dataType = SkinTemperatureRecord::class,
+        )
     }
 
     private fun getSkinTemperatureDeltas(
         includeBaseline: Boolean,
-        includeLocation: Boolean
+        includeLocation: Boolean,
     ): List<FormattedEntry> {
         val locationDefinedFormattedEntry: FormattedEntry.ReverseSessionDetail =
             FormattedEntry.ReverseSessionDetail(
@@ -466,7 +546,8 @@
                     headerA11y = "16:40 AM",
                     title = "-0.5℃",
                     titleA11y = "-0.5 degrees Celsius",
-                ))
+                ),
+            )
 
         return if (includeBaseline && includeLocation) {
             listOf(locationDefinedFormattedEntry, baselineDefinedFormattedEntry)
@@ -487,8 +568,9 @@
             headerA11y = "07:06 • TEST_APP_NAME",
             title = "12 hour sleeping",
             titleA11y = "12 hour sleeping",
-            dataType = DataType.SLEEP,
-            notes = "notes")
+            dataType = SleepSessionRecord::class,
+            notes = "notes",
+        )
     }
 
     private fun getFormattedExerciseSession(showSession: Boolean): ExerciseSessionEntry {
@@ -498,14 +580,15 @@
             headerA11y = "07:06 • TEST_APP_NAME",
             title = "12 hour running",
             titleA11y = "12 hour running",
-            dataType = DataType.EXERCISE,
+            dataType = ExerciseSessionRecord::class,
             notes = "notes",
             route =
                 if (showSession) {
                     ExerciseRoute(WARSAW_ROUTE)
                 } else {
                     null
-                })
+                },
+        )
     }
 
     private fun getFormattedSeriesData(): SeriesDataEntry {
@@ -515,13 +598,15 @@
             headerA11y = "07:06 - 8:06 • TEST_APP_NAME",
             title = "100 bpm",
             titleA11y = "100 beats per minute",
-            dataType = DataType.HEART_RATE)
+            dataType = HeartRateRecord::class,
+        )
     }
 
     private fun getPlannedExerciseStepBuilder(): PlannedExerciseStep.Builder {
         return PlannedExerciseStep.Builder(
             ExerciseSegmentType.EXERCISE_SEGMENT_TYPE_RUNNING,
             PlannedExerciseStep.EXERCISE_CATEGORY_ACTIVE,
-            ExerciseCompletionGoal.DistanceGoal(Length.fromMeters(1000.0)))
+            ExerciseCompletionGoal.DistanceGoal(Length.fromMeters(1000.0)),
+        )
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/exportimport/ExportFrequencyFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/exportimport/ExportFrequencyFragmentTest.kt
index 93e2936..6768be9 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/exportimport/ExportFrequencyFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/exportimport/ExportFrequencyFragmentTest.kt
@@ -35,7 +35,6 @@
 import com.android.healthconnect.controller.exportimport.api.ExportFrequency
 import com.android.healthconnect.controller.exportimport.api.ExportSettingsViewModel
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.ExportFrequencyElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.google.common.truth.Truth.assertThat
@@ -50,6 +49,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class ExportFrequencyFragmentTest {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/home/HomeFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/home/HomeFragmentTest.kt
index b6ecde4..d230ba9 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/home/HomeFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/home/HomeFragmentTest.kt
@@ -22,6 +22,8 @@
 import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import android.platform.test.flag.junit.SetFlagsRule
+import android.provider.Settings.ACTION_SECURITY_SETTINGS
+import androidx.lifecycle.MediatorLiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.navigation.Navigation
 import androidx.navigation.testing.TestNavHostController
@@ -30,17 +32,20 @@
 import androidx.test.espresso.action.ViewActions.scrollTo
 import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.intent.Intents
+import androidx.test.espresso.intent.Intents.intended
+import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction
 import androidx.test.espresso.matcher.RootMatchers
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withId
 import androidx.test.espresso.matcher.ViewMatchers.withText
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.R
-import com.android.healthconnect.controller.data.alldata.AllDataViewModel
 import com.android.healthconnect.controller.exportimport.api.ExportStatusViewModel
 import com.android.healthconnect.controller.exportimport.api.ScheduledExportUiState
 import com.android.healthconnect.controller.exportimport.api.ScheduledExportUiStatus
 import com.android.healthconnect.controller.home.HomeFragment
-import com.android.healthconnect.controller.home.HomeFragmentViewModel
+import com.android.healthconnect.controller.home.HomeViewModel
 import com.android.healthconnect.controller.migration.MigrationViewModel
 import com.android.healthconnect.controller.migration.MigrationViewModel.MigrationFragmentState.WithData
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState
@@ -64,10 +69,9 @@
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
 import com.android.healthconnect.controller.utils.DeviceInfoUtilsModule
-import com.android.healthconnect.controller.utils.FeatureUtils
+import com.android.healthconnect.controller.utils.KeyguardManagerUtil
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.DataRestoreElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
@@ -85,8 +89,6 @@
 import java.time.ZoneId
 import java.util.Locale
 import java.util.TimeZone
-import javax.inject.Inject
-import org.hamcrest.Matchers.not
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
@@ -96,7 +98,9 @@
 import org.mockito.kotlin.atLeast
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
+import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 @UninstallModules(DeviceInfoUtilsModule::class)
@@ -106,9 +110,7 @@
     @get:Rule val setFlagsRule = SetFlagsRule()
     private lateinit var context: Context
 
-    @BindValue
-    val homeFragmentViewModel: HomeFragmentViewModel =
-        Mockito.mock(HomeFragmentViewModel::class.java)
+    @BindValue val homeViewModel: HomeViewModel = Mockito.mock(HomeViewModel::class.java)
 
     @BindValue
     val recentAccessViewModel: RecentAccessViewModel =
@@ -121,16 +123,15 @@
     val exportStatusViewModel: ExportStatusViewModel =
         Mockito.mock(ExportStatusViewModel::class.java)
 
-    @BindValue val allDataViewModel: AllDataViewModel = Mockito.mock(AllDataViewModel::class.java)
-
     @BindValue val deviceInfoUtils: DeviceInfoUtils = FakeDeviceInfoUtils()
 
     @BindValue val timeSource = TestTimeSource
     @BindValue val healthConnectLogger: HealthConnectLogger = mock()
 
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
     private lateinit var navHostController: TestNavHostController
     @BindValue val navigationUtils: NavigationUtils = Mockito.mock(NavigationUtils::class.java)
+    @BindValue
+    val keyguardManagerUtils: KeyguardManagerUtil = Mockito.mock(KeyguardManagerUtil::class.java)
 
     companion object {
         private const val TEST_EXPORT_FREQUENCY_IN_DAYS = 1
@@ -169,8 +170,20 @@
                 )
             )
         }
-        whenever(allDataViewModel.isAnyMedicalData).then { MutableLiveData(false) }
+        whenever(homeViewModel.hasAnyMedicalData).then { MutableLiveData(false) }
         navHostController = TestNavHostController(context)
+        whenever(recentAccessViewModel.recentAccessApps).then {
+            MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
+        }
+        whenever(homeViewModel.connectedApps).then {
+            MutableLiveData(listOf(ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED)))
+        }
+        whenever(homeViewModel.showLockScreenBanner).then {
+            MediatorLiveData(HomeViewModel.LockScreenBannerState.NoBanner)
+        }
+        (deviceInfoUtils as FakeDeviceInfoUtils).setIntentHandlerAvailability(true)
+
+        Intents.init()
 
         // disable animations
         toggleAnimation(false)
@@ -180,6 +193,7 @@
     @After
     fun teardown() {
         timeSource.reset()
+        Intents.release()
         // enable animations
         toggleAnimation(true)
         reset(healthConnectLogger)
@@ -206,9 +220,9 @@
 
     @Test
     @DisableFlags(Flags.FLAG_ONBOARDING)
-    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun browseMedicalData_navigatesToBrowseMedicalData() {
-        whenever(allDataViewModel.isAnyMedicalData).then { MutableLiveData(true) }
+        whenever(homeViewModel.hasAnyMedicalData).then { MutableLiveData(true) }
         setupFragmentForNavigation()
 
         onView(withText("Browse health records")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -249,7 +263,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(listOf(recentApp)))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf<ConnectedAppMetadata>())
         }
 
@@ -288,7 +302,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(listOf(recentApp)))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf<ConnectedAppMetadata>())
         }
 
@@ -327,7 +341,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(listOf(recentApp)))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf<ConnectedAppMetadata>())
         }
 
@@ -380,7 +394,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(listOf(recentApp)))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf<ConnectedAppMetadata>())
         }
 
@@ -429,7 +443,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(listOf(recentApp)))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf<ConnectedAppMetadata>())
         }
 
@@ -447,7 +461,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -480,7 +494,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf(ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED)))
         }
 
@@ -505,7 +519,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -549,7 +563,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -594,7 +608,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -645,7 +659,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -700,7 +714,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -742,39 +756,38 @@
         setupFragmentForNavigation()
 
         onView(withText("Browse health records")).check(doesNotExist())
+        onView(withText("View your health records and which apps can access them"))
+            .check(doesNotExist())
+        verify(healthConnectLogger, times(0))
+            .logImpression(HomePageElement.BROWSE_HEALTH_RECORDS_BUTTON)
     }
 
     @Test
     @DisableFlags(Flags.FLAG_ONBOARDING)
-    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
-    fun browseMedicalData_errorFetchingMedicalData_notDisplayed() {
-        whenever(allDataViewModel.isAnyMedicalData).then { MutableLiveData(false) }
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun browseMedicalData_errorFetchingMedicalDataOrEmptyMedicalData_notDisplayed() {
+        whenever(homeViewModel.hasAnyMedicalData).then { MutableLiveData(false) }
 
         setupFragmentForNavigation()
 
         onView(withText("Browse health records")).check(doesNotExist())
+        onView(withText("View your health records and which apps can access them"))
+            .check(doesNotExist())
     }
 
     @Test
     @DisableFlags(Flags.FLAG_ONBOARDING)
-    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
-    fun browseMedicalData_emptyMedicalData_notDisplayed() {
-        whenever(allDataViewModel.isAnyMedicalData).then { MutableLiveData(false) }
-
-        setupFragmentForNavigation()
-
-        onView(withText("Browse health records")).check(doesNotExist())
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_ONBOARDING)
-    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun browseMedicalData_medicalDataExists_isDisplayed() {
-        whenever(allDataViewModel.isAnyMedicalData).then { MutableLiveData(true) }
+        whenever(homeViewModel.hasAnyMedicalData).then { MutableLiveData(true) }
 
         setupFragmentForNavigation()
 
         onView(withText("Browse health records")).check(matches(isDisplayed()))
+        onView(withText("View your health records and which apps can access them"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger).logImpression(HomePageElement.BROWSE_HEALTH_RECORDS_BUTTON)
     }
 
     // endregion
@@ -786,7 +799,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -819,7 +832,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -853,7 +866,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -888,7 +901,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -923,7 +936,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -965,7 +978,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -1002,7 +1015,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -1046,7 +1059,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED),
@@ -1103,7 +1116,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(listOf(recentApp)))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf<ConnectedAppMetadata>())
         }
 
@@ -1143,7 +1156,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(listOf(recentApp)))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf<ConnectedAppMetadata>())
         }
 
@@ -1168,7 +1181,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf(ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.DENIED)))
         }
 
@@ -1192,7 +1205,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf(ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.DENIED)))
         }
 
@@ -1210,7 +1223,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.DENIED),
@@ -1243,7 +1256,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(
                 listOf(
                     ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.DENIED),
@@ -1271,7 +1284,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf(ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED)))
         }
 
@@ -1296,7 +1309,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf(ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED)))
         }
 
@@ -1318,7 +1331,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(emptyList()))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf(ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED)))
         }
 
@@ -1331,6 +1344,161 @@
 
     // endregion
 
+    // region lock screen banner
+    @Test
+    @DisableFlags(
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER,
+    )
+    fun lockScreenBanner_phrFlagOff_bannerFlagOff_bannerNotShown() {
+        launchFragment<HomeFragment>(Bundle())
+
+        onView(withText("Set a screen lock")).check(doesNotExist())
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER)
+    fun lockScreenBanner_phrFlagOff_bannerFlagOn_bannerNotShown() {
+
+        launchFragment<HomeFragment>(Bundle())
+
+        onView(withText("Set a screen lock")).check(doesNotExist())
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun lockScreenBanner_phrFlagOn_bannerFlagOff_bannerNotShown() {
+        launchFragment<HomeFragment>(Bundle())
+
+        onView(withText("Set a screen lock")).check(doesNotExist())
+    }
+
+    @Test
+    @EnableFlags(
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER,
+    )
+    fun lockScreenBanner_shouldNotShowBanner_bannerNotShown() {
+        whenever(homeViewModel.showLockScreenBanner).then {
+            MediatorLiveData(HomeViewModel.LockScreenBannerState.NoBanner)
+        }
+
+        launchFragment<HomeFragment>(Bundle())
+
+        onView(withText("Set a screen lock")).check(doesNotExist())
+    }
+
+    @Test
+    @EnableFlags(
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER,
+    )
+    fun lockScreenBanner_securityIntentNotHandled_bannerNotShown() {
+        (deviceInfoUtils as FakeDeviceInfoUtils).setIntentHandlerAvailability(false)
+        whenever(homeViewModel.showLockScreenBanner).then {
+            MediatorLiveData(HomeViewModel.LockScreenBannerState.ShowBanner())
+        }
+
+        launchFragment<HomeFragment>(Bundle())
+
+        onView(withText("Set a screen lock")).check(doesNotExist())
+    }
+
+    @Test
+    @EnableFlags(
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER,
+    )
+    fun lockScreenBanner_bannerShown() {
+        whenever(homeViewModel.showLockScreenBanner).then {
+            MediatorLiveData(HomeViewModel.LockScreenBannerState.ShowBanner())
+        }
+
+        launchFragment<HomeFragment>(Bundle())
+
+        onView(withText("Set a screen lock")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "For added security for your health data, set a PIN, pattern, or password for this device"
+                )
+            )
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
+        onView(withText("Set screen lock")).perform(scrollTo()).check(matches(isDisplayed()))
+        verify(healthConnectLogger).logImpression(HomePageElement.LOCK_SCREEN_BANNER)
+        verify(healthConnectLogger).logImpression(HomePageElement.LOCK_SCREEN_BANNER_BUTTON)
+        verify(healthConnectLogger).logImpression(HomePageElement.LOCK_SCREEN_BANNER_DISMISS_BUTTON)
+    }
+
+    @Test
+    @EnableFlags(
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER,
+    )
+    fun lockScreenBanner_whenMedicalAndFitnessData_bannerShown() {
+        whenever(homeViewModel.showLockScreenBanner).then {
+            MediatorLiveData(
+                HomeViewModel.LockScreenBannerState.ShowBanner(
+                    hasAnyFitnessData = true,
+                    hasAnyMedicalData = true,
+                )
+            )
+        }
+
+        launchFragment<HomeFragment>(Bundle())
+
+        onView(withText("Set a screen lock")).perform(scrollTo()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ONBOARDING)
+    @EnableFlags(
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER,
+    )
+    fun lockScreenBanner_startsNewPasswordIntent() {
+        whenever(homeViewModel.showLockScreenBanner).then {
+            MediatorLiveData(HomeViewModel.LockScreenBannerState.ShowBanner())
+        }
+
+        launchFragment<HomeFragment>(Bundle())
+        onView(withText("Set screen lock")).perform(scrollTo()).perform(click())
+        verify(healthConnectLogger).logInteraction(HomePageElement.LOCK_SCREEN_BANNER_BUTTON)
+
+        intended(hasAction(ACTION_SECURITY_SETTINGS))
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ONBOARDING)
+    @EnableFlags(
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_LOCK_SCREEN_BANNER,
+    )
+    fun lockScreenBanner_dismissBanner_bannerDisappears() {
+        whenever(homeViewModel.showLockScreenBanner).then {
+            MediatorLiveData(HomeViewModel.LockScreenBannerState.ShowBanner())
+        }
+
+        launchFragment<HomeFragment>(Bundle())
+
+        onView(withText("Set screen lock")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withId(R.id.dismiss_button)).perform(scrollTo()).perform(click())
+        verify(healthConnectLogger)
+            .logInteraction(HomePageElement.LOCK_SCREEN_BANNER_DISMISS_BUTTON)
+
+        onView(withText("Set screen lock")).check(doesNotExist())
+    }
+
+    // endregion
+
     private fun setupFragmentForNavigation() {
         val recentApp =
             RecentAccessEntry(
@@ -1354,7 +1522,7 @@
         whenever(recentAccessViewModel.recentAccessApps).then {
             MutableLiveData<RecentAccessState>(RecentAccessState.WithData(listOf(recentApp)))
         }
-        whenever(homeFragmentViewModel.connectedApps).then {
+        whenever(homeViewModel.connectedApps).then {
             MutableLiveData(listOf<ConnectedAppMetadata>())
         }
 
@@ -1379,12 +1547,4 @@
         editor.putBoolean(Constants.CONNECT_MORE_APPS_BANNER_SEEN, seen)
         editor.apply()
     }
-
-    private fun setSeeCompatibleAppsBannerSeen(context: Context, seen: Boolean) {
-        val sharedPreference =
-            context.getSharedPreferences(Constants.USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
-        val editor = sharedPreference.edit()
-        editor.putBoolean(Constants.SEE_MORE_COMPATIBLE_APPS_BANNER_SEEN, seen)
-        editor.apply()
-    }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/home/HomeViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/home/HomeViewModelTest.kt
new file mode 100644
index 0000000..42c282a
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/home/HomeViewModelTest.kt
@@ -0,0 +1,520 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.tests.home
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.health.connect.HealthConnectManager
+import android.health.connect.HealthDataCategory
+import android.health.connect.HealthPermissionCategory
+import android.health.connect.MedicalResourceTypeInfo
+import android.health.connect.RecordTypeInfoResponse
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
+import android.health.connect.datatypes.Record
+import android.health.connect.datatypes.StepsRecord
+import android.health.connect.datatypes.WeightRecord
+import android.os.OutcomeReceiver
+import androidx.test.core.app.ApplicationProvider
+import com.android.healthconnect.controller.data.appdata.AllDataUseCase
+import com.android.healthconnect.controller.home.HomeViewModel
+import com.android.healthconnect.controller.permissions.connectedapps.ILoadHealthPermissionApps
+import com.android.healthconnect.controller.shared.Constants
+import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_2
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE
+import com.android.healthconnect.controller.tests.utils.TestObserver
+import com.android.healthconnect.controller.tests.utils.di.FakeHealthPermissionAppsUseCase
+import com.android.healthconnect.controller.tests.utils.getDataOrigin
+import com.android.healthconnect.controller.utils.KeyguardManagerUtil
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.advanceUntilIdle
+import kotlinx.coroutines.test.resetMain
+import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.test.setMain
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.Matchers
+import org.mockito.Mockito
+import org.mockito.Mockito.doAnswer
+import org.mockito.invocation.InvocationOnMock
+import org.mockito.kotlin.any
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@HiltAndroidTest
+class HomeViewModelTest {
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
+
+    private lateinit var viewModel: HomeViewModel
+    private lateinit var context: Context
+    private lateinit var sharedPreferences: SharedPreferences
+    private val testDispatcher = UnconfinedTestDispatcher()
+
+    private val keyguardManagerUtils: KeyguardManagerUtil =
+        Mockito.mock(KeyguardManagerUtil::class.java)
+    private val loadHealthPermissionApps: ILoadHealthPermissionApps =
+        FakeHealthPermissionAppsUseCase()
+    private val manager: HealthConnectManager = Mockito.mock(HealthConnectManager::class.java)
+
+    @Before
+    fun setup() {
+        hiltRule.inject()
+        Dispatchers.setMain(testDispatcher)
+        context = ApplicationProvider.getApplicationContext()
+        sharedPreferences =
+            context.getSharedPreferences(Constants.USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+
+        viewModel =
+            HomeViewModel(
+                loadHealthPermissionApps,
+                AllDataUseCase(manager, Dispatchers.Main),
+                keyguardManagerUtils,
+            )
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+    }
+
+    @After
+    fun tearDown() {
+        Dispatchers.resetMain()
+    }
+
+    @Test
+    fun isAnyMedicalData_noMedicalData_returnsFalse() = runTest {
+        doAnswer(prepareAnswer(emptyList()))
+            .`when`(manager)
+            .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
+
+        val testObserver = TestObserver<Boolean>()
+        viewModel.hasAnyMedicalData.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue()).isEqualTo(false)
+    }
+
+    @Test
+    fun isAnyMedicalData_hasMedicalData_returnsTrue() = runTest {
+        val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
+            listOf(
+                MedicalResourceTypeInfo(
+                    MEDICAL_RESOURCE_TYPE_VACCINES,
+                    setOf(TEST_MEDICAL_DATA_SOURCE),
+                )
+            )
+        doAnswer(prepareAnswer(medicalResourceTypeResources))
+            .`when`(manager)
+            .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
+
+        val testObserver = TestObserver<Boolean>()
+        viewModel.hasAnyMedicalData.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue()).isEqualTo(true)
+    }
+
+    // region lock screen banner
+
+    @Test
+    fun lockScreenBanner_deviceSecure_bannerNotSeen_bannerNotShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(true)
+        setLockScreenBannerSeenFitness(false)
+        setLockScreenBannerSeenMedical(false)
+        mockFitnessData()
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(HomeViewModel.LockScreenBannerState.NoBanner)
+    }
+
+    @Test
+    fun lockScreenBanner_bannerAlreadySeenWithFitness_hasFitnessData_bannerNotShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(true)
+        setLockScreenBannerSeenMedical(false)
+        mockFitnessData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(HomeViewModel.LockScreenBannerState.NoBanner)
+    }
+
+    @Test
+    fun lockScreenBanner_bannerAlreadySeenWithFitness_hasMedicalData_bannerNotShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(false)
+        setLockScreenBannerSeenMedical(true)
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(HomeViewModel.LockScreenBannerState.NoBanner)
+    }
+
+    @Test
+    fun lockScreenBanner_hasBothData_bannerSeenWithBoth_bannerNotShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(true)
+        setLockScreenBannerSeenMedical(true)
+        mockFitnessData()
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(HomeViewModel.LockScreenBannerState.NoBanner)
+    }
+
+    @Test
+    fun lockScreenBanner_hasBothData_bannerSeenWithFitnessData_bannerShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(true)
+        setLockScreenBannerSeenMedical(false)
+        mockFitnessData()
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(
+                HomeViewModel.LockScreenBannerState.ShowBanner(
+                    hasAnyFitnessData = true,
+                    hasAnyMedicalData = true,
+                )
+            )
+    }
+
+    @Test
+    fun lockScreenBanner_hasBothData_bannerSeenWithMedicalData_bannerShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(false)
+        setLockScreenBannerSeenMedical(true)
+        mockFitnessData()
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(
+                HomeViewModel.LockScreenBannerState.ShowBanner(
+                    hasAnyFitnessData = true,
+                    hasAnyMedicalData = true,
+                )
+            )
+    }
+
+    @Test
+    fun lockScreenBanner_hasBothData_bannerNotSeen_bannerShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(false)
+        setLockScreenBannerSeenMedical(false)
+        mockFitnessData()
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(
+                HomeViewModel.LockScreenBannerState.ShowBanner(
+                    hasAnyFitnessData = true,
+                    hasAnyMedicalData = true,
+                )
+            )
+    }
+
+    @Test
+    fun lockScreenBanner_hasFitnessData_bannerNotSeen_bannerShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(false)
+        setLockScreenBannerSeenMedical(false)
+        mockFitnessData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(
+                HomeViewModel.LockScreenBannerState.ShowBanner(
+                    hasAnyFitnessData = true,
+                    hasAnyMedicalData = false,
+                )
+            )
+    }
+
+    @Test
+    fun lockScreenBanner_hasFitnessData_bannerSeenWithMedical_bannerShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(false)
+        setLockScreenBannerSeenMedical(true)
+        mockFitnessData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(
+                HomeViewModel.LockScreenBannerState.ShowBanner(
+                    hasAnyFitnessData = true,
+                    hasAnyMedicalData = false,
+                )
+            )
+    }
+
+    @Test
+    fun lockScreenBanner_hasFitnessData_bannerSeenWithFitness_bannerNotShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(true)
+        setLockScreenBannerSeenMedical(false)
+        mockFitnessData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(HomeViewModel.LockScreenBannerState.NoBanner)
+    }
+
+    @Test
+    fun lockScreenBanner_hasFitnessData_bannerSeenWithBoth_bannerNotShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(true)
+        setLockScreenBannerSeenMedical(true)
+        mockFitnessData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(HomeViewModel.LockScreenBannerState.NoBanner)
+    }
+
+    @Test
+    fun lockScreenBanner_hasMedicalData_bannerNotSeen_bannerShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(false)
+        setLockScreenBannerSeenMedical(false)
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        val medicalDataObserver = TestObserver<Boolean>()
+        viewModel.hasAnyMedicalData.observeForever(medicalDataObserver)
+
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(medicalDataObserver.getLastValue()).isEqualTo(true)
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(
+                HomeViewModel.LockScreenBannerState.ShowBanner(
+                    hasAnyFitnessData = false,
+                    hasAnyMedicalData = true,
+                )
+            )
+    }
+
+    @Test
+    fun lockScreenBanner_hasMedicalData_bannerSeenWithFitness_bannerShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(true)
+        setLockScreenBannerSeenMedical(false)
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(
+                HomeViewModel.LockScreenBannerState.ShowBanner(
+                    hasAnyFitnessData = false,
+                    hasAnyMedicalData = true,
+                )
+            )
+    }
+
+    @Test
+    fun lockScreenBanner_hasMedicalData_bannerSeenWithMedical_bannerNotShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(false)
+        setLockScreenBannerSeenMedical(true)
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(HomeViewModel.LockScreenBannerState.NoBanner)
+    }
+
+    @Test
+    fun lockScreenBanner_hasMedicalData_bannerSeenWithBoth_bannerNotShown() = runTest {
+        whenever(keyguardManagerUtils.isDeviceSecure(any())).thenReturn(false)
+        setLockScreenBannerSeenFitness(true)
+        setLockScreenBannerSeenMedical(true)
+        mockMedicalData()
+
+        val testObserver = TestObserver<HomeViewModel.LockScreenBannerState>()
+        viewModel.showLockScreenBanner.observeForever(testObserver)
+        viewModel.loadHasAnyMedicalData()
+        viewModel.loadShouldShowLockScreenBanner(sharedPreferences, context)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .isEqualTo(HomeViewModel.LockScreenBannerState.NoBanner)
+    }
+
+    // endregion
+
+    private fun mockFitnessData() {
+        val recordTypeInfoMap: Map<Class<out Record>, RecordTypeInfoResponse> =
+            mapOf(
+                StepsRecord::class.java to
+                    RecordTypeInfoResponse(
+                        HealthPermissionCategory.STEPS,
+                        HealthDataCategory.ACTIVITY,
+                        listOf(
+                            getDataOrigin(TEST_APP_PACKAGE_NAME),
+                            getDataOrigin(TEST_APP_PACKAGE_NAME_2),
+                        ),
+                    ),
+                WeightRecord::class.java to
+                    RecordTypeInfoResponse(
+                        HealthPermissionCategory.WEIGHT,
+                        HealthDataCategory.BODY_MEASUREMENTS,
+                        listOf((getDataOrigin(TEST_APP_PACKAGE_NAME_2))),
+                    ),
+                HeartRateRecord::class.java to
+                    RecordTypeInfoResponse(
+                        HealthPermissionCategory.HEART_RATE,
+                        HealthDataCategory.VITALS,
+                        listOf((getDataOrigin(TEST_APP_PACKAGE_NAME))),
+                    ),
+            )
+        doAnswer(prepareAnswer(recordTypeInfoMap))
+            .`when`(manager)
+            .queryAllRecordTypesInfo(Matchers.any(), Matchers.any())
+    }
+
+    private fun mockMedicalData() {
+        val medicalResourceTypeResources: List<MedicalResourceTypeInfo> =
+            listOf(
+                MedicalResourceTypeInfo(
+                    MEDICAL_RESOURCE_TYPE_VACCINES,
+                    setOf(TEST_MEDICAL_DATA_SOURCE),
+                )
+            )
+        doAnswer(prepareAnswer(medicalResourceTypeResources))
+            .`when`(manager)
+            .queryAllMedicalResourceTypeInfos(Matchers.any(), Matchers.any())
+    }
+
+    private fun setLockScreenBannerSeenFitness(seen: Boolean) {
+        val editor = sharedPreferences.edit()
+        editor.putBoolean(Constants.LOCK_SCREEN_BANNER_SEEN_FITNESS, seen)
+        editor.apply()
+    }
+
+    private fun setLockScreenBannerSeenMedical(seen: Boolean) {
+        val editor = sharedPreferences.edit()
+        editor.putBoolean(Constants.LOCK_SCREEN_BANNER_SEEN_MEDICAL, seen)
+        editor.apply()
+    }
+
+    private fun prepareAnswer(
+        recordTypeInfoMap: Map<Class<out Record>, RecordTypeInfoResponse>
+    ): (InvocationOnMock) -> Map<Class<out Record>, RecordTypeInfoResponse> {
+        val answer = { args: InvocationOnMock ->
+            val receiver = args.arguments[1] as OutcomeReceiver<Any?, *>
+            receiver.onResult(recordTypeInfoMap)
+            recordTypeInfoMap
+        }
+        return answer
+    }
+
+    private fun prepareAnswer(
+        MedicalResourceTypeInfo: List<MedicalResourceTypeInfo>
+    ): (InvocationOnMock) -> List<MedicalResourceTypeInfo> {
+        val answer = { args: InvocationOnMock ->
+            val receiver = args.arguments[1] as OutcomeReceiver<Any?, *>
+            receiver.onResult(MedicalResourceTypeInfo)
+            MedicalResourceTypeInfo
+        }
+        return answer
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/managedata/ManageDataFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/managedata/ManageDataFragmentTest.kt
index a5eda0a..4e067fa 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/managedata/ManageDataFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/managedata/ManageDataFragmentTest.kt
@@ -21,7 +21,6 @@
 import com.android.healthconnect.controller.autodelete.AutoDeleteViewModel
 import com.android.healthconnect.controller.managedata.ManageDataFragment
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.ManageDataElement
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -39,6 +38,7 @@
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class ManageDataFragmentTest {
@@ -63,7 +63,9 @@
         whenever(autoDeleteViewModel.storedAutoDeleteRange).then {
             MutableLiveData(
                 AutoDeleteViewModel.AutoDeleteState.WithData(
-                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER))
+                    AutoDeleteRange.AUTO_DELETE_RANGE_NEVER
+                )
+            )
         }
         context = InstrumentationRegistry.getInstrumentation().context
         navHostController = TestNavHostController(context)
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/migration/AppUpdateRequiredFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/migration/AppUpdateRequiredFragmentTest.kt
index a25fcf1..ba86b43 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/migration/AppUpdateRequiredFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/migration/AppUpdateRequiredFragmentTest.kt
@@ -14,7 +14,6 @@
 import androidx.test.espresso.matcher.ViewMatchers.withText
 import com.android.healthconnect.controller.migration.AppUpdateRequiredFragment
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.AppStoreUtils
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
@@ -37,6 +36,7 @@
 import org.mockito.kotlin.never
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class AppUpdateRequiredFragmentTest {
@@ -66,7 +66,9 @@
         onView(
                 withText(
                     "Health Connect is being integrated with the Android system so " +
-                        "you can access it directly from your settings."))
+                        "you can access it directly from your settings."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Before continuing, update the Health Connect app to the latest version."))
             .check(matches(isDisplayed()))
@@ -84,16 +86,16 @@
     fun appUpdateRequiredFragment_ifAppStoreExists_intentToAppStore() {
         whenever(appStoreUtils.getAppStoreLink(any()))
             .thenReturn(
-                Intent(Intent.ACTION_SHOW_APP_INFO).also {
-                    it.setPackage("installer.package.name")
-                })
+                Intent(Intent.ACTION_SHOW_APP_INFO).also { it.setPackage("installer.package.name") }
+            )
         whenever(navigationUtils.startActivity(any(), any())).thenCallRealMethod()
         launchFragment<AppUpdateRequiredFragment>(Bundle())
         onView(withText("Update")).check(matches(isDisplayed()))
         onView(withText("Update")).perform(click())
 
         intended(
-            allOf(hasAction(Intent.ACTION_SHOW_APP_INFO), hasPackage("installer.package.name")))
+            allOf(hasAction(Intent.ACTION_SHOW_APP_INFO), hasPackage("installer.package.name"))
+        )
         verify(healthConnectLogger)
             .logInteraction(MigrationElement.MIGRATION_UPDATE_NEEDED_UPDATE_BUTTON)
     }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationActivityTest.kt
index 88fb315..2e70e57 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationActivityTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationActivityTest.kt
@@ -17,7 +17,6 @@
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.DataRestoreUiState
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.MigrationUiState
 import com.android.healthconnect.controller.tests.utils.di.FakeDeviceInfoUtils
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
 import com.android.healthconnect.controller.utils.DeviceInfoUtilsModule
 import dagger.hilt.android.testing.BindValue
@@ -28,6 +27,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.whenever
 
 @UninstallModules(DeviceInfoUtilsModule::class)
 @HiltAndroidTest
@@ -55,7 +55,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IN_PROGRESS,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val startActivityIntent =
             Intent.makeMainActivity(ComponentName(context, MigrationActivity::class.java))
@@ -73,7 +76,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val startActivityIntent =
             Intent.makeMainActivity(ComponentName(context, MigrationActivity::class.java))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationNavigationFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationNavigationFragmentTest.kt
index af5ca46..c42f7cd 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationNavigationFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationNavigationFragmentTest.kt
@@ -13,7 +13,6 @@
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.DataRestoreUiState
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.MigrationUiState
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.NavigationUtils
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -26,6 +25,7 @@
 import org.mockito.kotlin.eq
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class MigrationNavigationFragmentTest {
@@ -44,7 +44,8 @@
     fun whenMigrationFragmentStateLoading_showsLoading() {
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData<MigrationViewModel.MigrationFragmentState>(
-                MigrationViewModel.MigrationFragmentState.Loading)
+                MigrationViewModel.MigrationFragmentState.Loading
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -55,7 +56,8 @@
     fun whenMigrationFragmentStateError_showsError() {
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData<MigrationViewModel.MigrationFragmentState>(
-                MigrationViewModel.MigrationFragmentState.Error)
+                MigrationViewModel.MigrationFragmentState.Error
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -71,7 +73,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.ALLOWED_NOT_STARTED,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -88,7 +93,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.ALLOWED_PAUSED,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -105,14 +113,18 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.APP_UPGRADE_REQUIRED,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
         verify(navigationUtils, times(1))
             .navigate(
                 any(),
-                eq(R.id.action_migrationNavigationFragment_to_migrationAppUpdateNeededFragment))
+                eq(R.id.action_migrationNavigationFragment_to_migrationAppUpdateNeededFragment),
+            )
     }
 
     @Test
@@ -124,14 +136,18 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.MODULE_UPGRADE_REQUIRED,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
         verify(navigationUtils, times(1))
             .navigate(
                 any(),
-                eq(R.id.action_migrationNavigationFragment_to_migrationModuleUpdateNeededFragment))
+                eq(R.id.action_migrationNavigationFragment_to_migrationModuleUpdateNeededFragment),
+            )
     }
 
     @Test
@@ -143,13 +159,18 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IN_PROGRESS,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
         verify(navigationUtils, times(1))
             .navigate(
-                any(), eq(R.id.action_migrationNavigationFragment_to_migrationInProgressFragment))
+                any(),
+                eq(R.id.action_migrationNavigationFragment_to_migrationInProgressFragment),
+            )
     }
 
     @Test
@@ -161,7 +182,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.COMPLETE_IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -178,7 +202,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.COMPLETE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -195,7 +222,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -212,7 +242,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.ALLOWED_MIGRATOR_DISABLED,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -229,7 +262,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.UNKNOWN,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -246,13 +282,18 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
         verify(navigationUtils, times(1))
             .navigate(
-                any(), eq(R.id.action_migrationNavigationFragment_to_dataRestoreInProgressFragment))
+                any(),
+                eq(R.id.action_migrationNavigationFragment_to_dataRestoreInProgressFragment),
+            )
     }
 
     @Test
@@ -264,7 +305,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.PENDING,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
@@ -281,7 +325,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_FETCHING_DATA)))
+                        dataRestoreError = DataRestoreUiError.ERROR_FETCHING_DATA,
+                    )
+                )
+            )
         }
 
         launchFragment<MigrationNavigationFragment>()
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationPausedFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationPausedFragmentTest.kt
index 3881ed2..e9f0e54 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationPausedFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/migration/MigrationPausedFragmentTest.kt
@@ -10,7 +10,6 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.migration.MigrationPausedFragment
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.MigrationElement
@@ -31,6 +30,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class MigrationPausedFragmentTest {
@@ -58,7 +58,9 @@
                 withText(
                     "The Health Connect app closed while it was being integrated " +
                         "with the Android system.\n\nClick resume to reopen the app and continue " +
-                        "transferring your data and permissions."))
+                        "transferring your data and permissions."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Cancel")).check(matches(isDisplayed()))
         onView(withText("Resume")).check(matches(isDisplayed()))
@@ -110,7 +112,9 @@
                 withText(
                     "The Health Connect app closed while it was being integrated " +
                         "with the Android system.\n\nClick resume to reopen the app and continue " +
-                        "transferring your data and permissions."))
+                        "transferring your data and permissions."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Cancel")).check(matches(isDisplayed()))
         onView(withText("Resume")).check(matches(isDisplayed()))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/migration/ModuleUpdateRequiredFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/migration/ModuleUpdateRequiredFragmentTest.kt
index 77348ac..6d5c12c 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/migration/ModuleUpdateRequiredFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/migration/ModuleUpdateRequiredFragmentTest.kt
@@ -11,7 +11,6 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.migration.ModuleUpdateRequiredFragment
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.MigrationElement
@@ -32,6 +31,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class ModuleUpdateRequiredFragmentTest {
@@ -60,14 +60,18 @@
         onView(
                 withText(
                     "Health Connect is being integrated with the Android system so " +
-                        "you can access it directly from your settings."))
+                        "you can access it directly from your settings."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Before continuing, update your phone system."))
             .check(matches(isDisplayed()))
         onView(
                 withText(
                     "If you\'ve already updated your phone system, " +
-                        "try restarting your phone to continue the integration"))
+                        "try restarting your phone to continue the integration"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Cancel")).check(matches(isDisplayed()))
         onView(withText("Update")).check(matches(isDisplayed()))
@@ -105,7 +109,9 @@
 
         verify(navigationUtils, times(1))
             .navigate(
-                any(), eq(R.id.action_migrationModuleUpdateNeededFragment_to_systemUpdateActivity))
+                any(),
+                eq(R.id.action_migrationModuleUpdateNeededFragment_to_systemUpdateActivity),
+            )
         verify(healthConnectLogger)
             .logInteraction(MigrationElement.MIGRATION_UPDATE_NEEDED_UPDATE_BUTTON)
     }
@@ -121,14 +127,18 @@
         onView(
                 withText(
                     "Health Connect is being integrated with the Android system so " +
-                        "you can access it directly from your settings."))
+                        "you can access it directly from your settings."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Before continuing, update your phone system."))
             .check(matches(isDisplayed()))
         onView(
                 withText(
                     "If you\'ve already updated your phone system, " +
-                        "try restarting your phone to continue the integration"))
+                        "try restarting your phone to continue the integration"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Cancel")).check(matches(isDisplayed()))
         onView(withText("Update")).check(matches(isDisplayed()))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/navigation/TrampolineActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/navigation/TrampolineActivityTest.kt
index 2596b79..e87c931 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/navigation/TrampolineActivityTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/navigation/TrampolineActivityTest.kt
@@ -52,6 +52,7 @@
 import com.android.healthconnect.controller.exportimport.api.ExportStatusViewModel
 import com.android.healthconnect.controller.exportimport.api.ScheduledExportUiState
 import com.android.healthconnect.controller.exportimport.api.ScheduledExportUiStatus
+import com.android.healthconnect.controller.home.HomeViewModel
 import com.android.healthconnect.controller.migration.MigrationViewModel
 import com.android.healthconnect.controller.migration.MigrationViewModel.MigrationFragmentState.*
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState
@@ -63,13 +64,15 @@
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
+import com.android.healthconnect.controller.selectabledeletion.DeletionDataViewModel
+import com.android.healthconnect.controller.shared.app.ConnectedAppMetadata
+import com.android.healthconnect.controller.shared.app.ConnectedAppStatus
 import com.android.healthconnect.controller.tests.utils.NOW
 import com.android.healthconnect.controller.tests.utils.TEST_APP
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.di.FakeDeviceInfoUtils
 import com.android.healthconnect.controller.tests.utils.showOnboarding
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
 import com.android.healthconnect.controller.utils.DeviceInfoUtilsModule
 import com.android.healthfitness.flags.Flags
@@ -84,6 +87,7 @@
 import org.junit.Test
 import org.mockito.Mockito
 import org.mockito.Mockito.*
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 @UninstallModules(DeviceInfoUtilsModule::class)
@@ -102,6 +106,7 @@
     @BindValue
     val appPermissionViewModel: AppPermissionViewModel = mock(AppPermissionViewModel::class.java)
     @BindValue val allDataViewModel: AllDataViewModel = Mockito.mock(AllDataViewModel::class.java)
+    @BindValue val homeViewModel: HomeViewModel = mock(HomeViewModel::class.java)
 
     private val context = InstrumentationRegistry.getInstrumentation().context
 
@@ -171,6 +176,9 @@
         whenever(appPermissionViewModel.atLeastOneFitnessPermissionGranted).then {
             MediatorLiveData(true)
         }
+        whenever(appPermissionViewModel.atLeastOneHealthPermissionGranted).then {
+            MediatorLiveData(true)
+        }
         val accessDate = Instant.parse("2022-10-20T18:40:13.00Z")
         whenever(appPermissionViewModel.loadAccessDate(anyString())).thenReturn(accessDate)
         whenever(appPermissionViewModel.lastReadPermissionDisconnected).then {
@@ -188,10 +196,21 @@
                 )
             )
         }
-        whenever(allDataViewModel.isAnyMedicalData).then { MutableLiveData(false) }
         whenever(allDataViewModel.setOfPermissionTypesToBeDeleted).then {
             MutableLiveData<Set<FitnessPermissionType>>(emptySet())
         }
+        whenever(allDataViewModel.deletionScreenState).then {
+            MutableLiveData(DeletionDataViewModel.DeletionScreenState.VIEW)
+        }
+        whenever(allDataViewModel.getDeletionScreenStateValue())
+            .thenReturn(DeletionDataViewModel.DeletionScreenState.VIEW)
+        whenever(homeViewModel.connectedApps).then {
+            MutableLiveData(listOf(ConnectedAppMetadata(TEST_APP, ConnectedAppStatus.ALLOWED)))
+        }
+        whenever(homeViewModel.hasAnyMedicalData).then { MutableLiveData(false) }
+        whenever(homeViewModel.showLockScreenBanner).then {
+            MediatorLiveData(HomeViewModel.LockScreenBannerState.NoBanner)
+        }
     }
 
     @Test
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/onboarding/OnboardingScreenTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/onboarding/OnboardingScreenTest.kt
index c36ea50..495ae96 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/onboarding/OnboardingScreenTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/onboarding/OnboardingScreenTest.kt
@@ -18,6 +18,9 @@
 
 import android.content.ComponentName
 import android.content.Intent
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.espresso.Espresso.*
@@ -30,15 +33,27 @@
 import androidx.test.platform.app.InstrumentationRegistry.*
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.onboarding.OnboardingActivity
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.OnboardingElement
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthfitness.flags.Flags
+import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+import org.mockito.kotlin.atLeast
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
 
 @HiltAndroidTest
 class OnboardingScreenTest {
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
+
+    @BindValue val healthConnectLogger: HealthConnectLogger = mock()
 
     @Before
     fun setup() {
@@ -50,13 +65,16 @@
             Intent.makeMainActivity(
                     ComponentName(
                         ApplicationProvider.getApplicationContext(),
-                        OnboardingActivity::class.java))
+                        OnboardingActivity::class.java,
+                    )
+                )
                 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                 .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
 
         return ActivityScenario.launchActivityForResult(startOnboardingActivityIntent)
     }
 
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
     @Test
     fun onboardingScreen_isDisplayedCorrectly() {
         startOnboardingActivity()
@@ -64,7 +82,9 @@
         onView(withText("Get started with Health\u00A0Connect")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Health\u00A0Connect stores your health and fitness data, giving you a simple way to sync the different apps on your device"))
+                    "Health\u00A0Connect stores your health and fitness data, giving you a simple way to sync the different apps on your device"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withId(R.id.onboarding_image)).check(matches(isDisplayed()))
         onView(withId(R.id.share_icon)).perform(scrollTo()).check(matches(isDisplayed()))
@@ -85,10 +105,76 @@
         onView(withText("Go back")).check(matches(isDisplayed()))
     }
 
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    @Test
+    fun onboardingScreen_withHealthRecords_isDisplayedCorrectly() {
+        startOnboardingActivity()
+
+        onView(withText("Get started with Health\u00A0Connect")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Health\u00A0Connect stores and syncs your health and fitness data from different apps.\n\nFitness and wellness data, including exercise sessions, steps, nutrition, sleep and more\n\nHealth records, including vaccines, lab results and more"
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withId(R.id.onboarding_image)).check(matches(isDisplayed()))
+        onView(withId(R.id.share_icon)).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("With Health\u00A0Connect you can")).check(matches(isDisplayed()))
+        onView(withText("Share data with your apps"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
+        onView(withText("Choose the data each app can read or write to Health\u00A0Connect"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
+        onView(withId(R.id.manage_icon)).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("Manage your settings and privacy"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
+        onView(withText("Change app permissions and manage your data at any time"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
+        onView(withText("Get started")).check(matches(isDisplayed()))
+        onView(withText("Go back")).check(matches(isDisplayed()))
+    }
+
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun correctLogging() {
+        startOnboardingActivity()
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.ONBOARDING_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+        verify(healthConnectLogger).logImpression(OnboardingElement.ONBOARDING_GO_BACK_BUTTON)
+        verify(healthConnectLogger).logImpression(OnboardingElement.ONBOARDING_COMPLETED_BUTTON)
+        verify(healthConnectLogger, times(0))
+            .logImpression(OnboardingElement.ONBOARDING_MESSAGE_WITH_PHR)
+    }
+
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun correctLogging_withHealthRecords() {
+        startOnboardingActivity()
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.ONBOARDING_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+        verify(healthConnectLogger).logImpression(OnboardingElement.ONBOARDING_GO_BACK_BUTTON)
+        verify(healthConnectLogger).logImpression(OnboardingElement.ONBOARDING_COMPLETED_BUTTON)
+        verify(healthConnectLogger).logImpression(OnboardingElement.ONBOARDING_MESSAGE_WITH_PHR)
+    }
+
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
     @Test
     fun onboardingScreen_actions_isClickable() {
         startOnboardingActivity()
         onView(withId(R.id.go_back_button)).check(matches(isClickable()))
         onView(withId(R.id.get_started_button)).check(matches(isClickable()))
     }
+
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    @Test
+    fun onboardingScreen_withHealthRecords_actions_isClickable() {
+        startOnboardingActivity()
+        onView(withId(R.id.go_back_button)).check(matches(isClickable()))
+        onView(withId(R.id.get_started_button)).check(matches(isClickable()))
+    }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/AdditionalAccessFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/AdditionalAccessFragmentTest.kt
index 0aefe53..5654923 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/AdditionalAccessFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/AdditionalAccessFragmentTest.kt
@@ -32,9 +32,7 @@
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.contrib.RecyclerViewActions
 import androidx.test.espresso.matcher.RootMatchers
-import androidx.test.espresso.matcher.ViewMatchers.isChecked
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
-import androidx.test.espresso.matcher.ViewMatchers.isEnabled
 import androidx.test.espresso.matcher.ViewMatchers.withId
 import androidx.test.espresso.matcher.ViewMatchers.withText
 import androidx.test.platform.app.InstrumentationRegistry
@@ -52,10 +50,7 @@
 import com.android.healthconnect.controller.tests.utils.NOW
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.logging.AdditionalAccessElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -63,7 +58,6 @@
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
-import javax.inject.Inject
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
@@ -74,6 +68,7 @@
 import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class AdditionalAccessFragmentTest {
@@ -84,23 +79,24 @@
     @BindValue val additionalAccessViewModel: AdditionalAccessViewModel = mock()
     @BindValue val healthConnectLogger: HealthConnectLogger = mock()
 
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
-
     private val context = InstrumentationRegistry.getInstrumentation().context
 
     @Before
     fun setup() {
         hiltRule.inject()
-        (fakeFeatureUtils as FakeFeatureUtils).setIsExerciseRoutesReadAllEnabled(true)
 
         whenever(permissionsViewModel.appInfo).then {
             MutableLiveData(
                 AppMetadata(
                     TEST_APP_PACKAGE_NAME,
                     TEST_APP_NAME,
-                    context.getDrawable(R.drawable.health_connect_logo)))
+                    context.getDrawable(R.drawable.health_connect_logo),
+                )
+            )
         }
-        whenever(additionalAccessViewModel.additionalAccessState).then { MutableLiveData(State()) }
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(AdditionalAccessViewModel.ScreenState())
+        }
         whenever(additionalAccessViewModel.showEnableExerciseEvent)
             .thenReturn(MediatorLiveData(EnableExerciseDialogEvent()))
         whenever(additionalAccessViewModel.loadAccessDate(any())).thenReturn(NOW)
@@ -115,28 +111,33 @@
     fun validArgument_startsFragment() {
         val scenario =
             launchFragment<AdditionalAccessFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         assertThat(scenario.getState()).isEqualTo(Lifecycle.State.RESUMED)
     }
 
     @Test
-    fun validArgument_loadsAdditionalAccessPreferences() {
+    fun loadsAdditionalAccessPreferences() {
         launchFragment<AdditionalAccessFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         verify(additionalAccessViewModel).loadAdditionalAccessPreferences(eq(TEST_APP_PACKAGE_NAME))
     }
 
     @Test
-    fun validArgument_exerciseRouteDeclared_showsExerciseRouteOption() {
+    fun exerciseRouteDeclared_showsExerciseRouteOption() {
         val exerciseRouteDeclaredState = State(exerciseRoutePermissionUIState = ASK_EVERY_TIME)
-        whenever(additionalAccessViewModel.additionalAccessState).then {
-            MutableLiveData(exerciseRouteDeclaredState)
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(state = exerciseRouteDeclaredState)
+            )
         }
 
         launchFragment<AdditionalAccessFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withText(R.string.route_permissions_label)).check(matches(isDisplayed()))
         onView(withText(R.string.route_permissions_ask)).check(matches(isDisplayed()))
@@ -147,57 +148,80 @@
     }
 
     @Test
-    fun validArgument_exerciseRouteGranted_showsExerciseRouteOption() {
+    fun exerciseRouteGranted_showsExerciseRouteOption() {
         val exerciseRouteGrantedState = State(exerciseRoutePermissionUIState = ALWAYS_ALLOW)
-        whenever(additionalAccessViewModel.additionalAccessState).then {
-            MutableLiveData(exerciseRouteGrantedState)
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(state = exerciseRouteGrantedState)
+            )
         }
 
         launchFragment<AdditionalAccessFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withText(R.string.route_permissions_label)).check(matches(isDisplayed()))
         onView(withText(R.string.route_permissions_always_allow)).check(matches(isDisplayed()))
     }
 
     @Test
-    fun validArgument_exerciseRouteRevoked_showsExerciseRouteOption() {
+    fun exerciseRouteRevoked_showsExerciseRouteOption() {
         val exerciseRouteRevokedState = State(exerciseRoutePermissionUIState = NEVER_ALLOW)
-        whenever(additionalAccessViewModel.additionalAccessState).then {
-            MutableLiveData(exerciseRouteRevokedState)
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(state = exerciseRouteRevokedState)
+            )
         }
 
         launchFragment<AdditionalAccessFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withText(R.string.route_permissions_label)).check(matches(isDisplayed()))
         onView(withText(R.string.route_permissions_deny)).check(matches(isDisplayed()))
     }
 
     @Test
-    fun validArgument_historyReadDeclaredAndEnabled_showsHistoryReadPreference() {
+    fun historyReadDeclaredAndEnabled_onlyFitness_showsHistoryReadPreference() {
         val state =
             State(
                 exerciseRoutePermissionUIState = ALWAYS_ALLOW,
                 historyReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = true, isGranted = true))
-        whenever(additionalAccessViewModel.additionalAccessState).then { MutableLiveData(state) }
-
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = false,
+                    appHasGrantedFitnessReadPermission = true,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
         val scenario =
             launchFragment<AdditionalAccessFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         onView(withText("Access exercise routes")).check(matches(isDisplayed()))
         onView(withText("Always allow")).check(matches(isDisplayed()))
         onView(withText("Access past data")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Allow this app to access Health Connect data added before October 20, 2022"))
+                    "Allow this app to access Health Connect data added before October 20, 2022"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Enable at least one read permission in order to turn on past data access for this app"))
+                    "Enable at least one read permission in order to turn on past data access for this app"
+                )
+            )
             .check(doesNotExist())
 
         scenario.onActivity { activity ->
@@ -216,29 +240,46 @@
     }
 
     @Test
-    fun validArgument_historyReadDeclaredAndNotEnabled_showsFooter() {
+    fun historyReadDeclaredAndNotEnabled_onlyFitness_showsFooter() {
         val state =
             State(
                 exerciseRoutePermissionUIState = ALWAYS_ALLOW,
                 historyReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = false, isGranted = false))
-        whenever(additionalAccessViewModel.additionalAccessState).then { MutableLiveData(state) }
-
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = false,
+                    appHasGrantedFitnessReadPermission = false,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
         val scenario =
             launchFragment<AdditionalAccessFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         onView(withText("Access exercise routes")).check(matches(isDisplayed()))
         onView(withText("Always allow")).check(matches(isDisplayed()))
         onView(withText("Access past data")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Allow this app to access Health Connect data added before October 20, 2022"))
+                    "Allow this app to access Health Connect data added before October 20, 2022"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Enable at least one read permission in order to turn on past data access for this app"))
+                    "Enable at least one read permission in order to turn on past data access for this app"
+                )
+            )
             .check(matches(isDisplayed()))
 
         scenario.onActivity { activity ->
@@ -254,29 +295,46 @@
     }
 
     @Test
-    fun validArgument_backgroundReadDeclaredAndEnabled_showsBackgroundReadPreference() {
+    fun backgroundReadDeclaredAndEnabled_onlyFitness_showsBackgroundReadPreference() {
         val state =
             State(
                 exerciseRoutePermissionUIState = NEVER_ALLOW,
                 backgroundReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = true, isGranted = true))
-        whenever(additionalAccessViewModel.additionalAccessState).then { MutableLiveData(state) }
-
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = false,
+                    appHasGrantedFitnessReadPermission = true,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
         val scenario =
             launchFragment<AdditionalAccessFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         onView(withText("Access exercise routes")).check(matches(isDisplayed()))
         onView(withText("Don't allow")).check(matches(isDisplayed()))
         onView(withText("Access data in the background")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Allow this app to access Health Connect data when you're not using the app"))
+                    "Allow this app to access Health Connect data when you're not using the app"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Enable at least one read permission in order to turn on background access for this app"))
+                    "Enable at least one read permission in order to turn on background access for this app"
+                )
+            )
             .check(doesNotExist())
 
         scenario.onActivity { activity ->
@@ -295,29 +353,46 @@
     }
 
     @Test
-    fun validArgument_backgroundReadDeclaredAndNotEnabled_showsFooter() {
+    fun backgroundReadDeclaredAndNotEnabled_onlyFitness_showsFooter() {
         val state =
             State(
                 exerciseRoutePermissionUIState = NEVER_ALLOW,
                 backgroundReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = false, isGranted = false))
-        whenever(additionalAccessViewModel.additionalAccessState).then { MutableLiveData(state) }
-
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = false,
+                    appHasGrantedFitnessReadPermission = false,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
         val scenario =
             launchFragment<AdditionalAccessFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         onView(withText("Access exercise routes")).check(matches(isDisplayed()))
         onView(withText("Don't allow")).check(matches(isDisplayed()))
         onView(withText("Access data in the background")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Allow this app to access Health Connect data when you're not using the app"))
+                    "Allow this app to access Health Connect data when you're not using the app"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Enable at least one read permission in order to turn on background access for this app"))
+                    "Enable at least one read permission in order to turn on background access for this app"
+                )
+            )
             .check(matches(isDisplayed()))
 
         scenario.onActivity { activity ->
@@ -333,37 +408,59 @@
     }
 
     @Test
-    fun validArgument_backgroundAndHistoryReadDeclaredAndEnabled_showsBothPreferences() {
+    fun backgroundAndHistoryReadDeclaredAndEnabled_onlyFitness_showsBothPreferences() {
         val state =
             State(
                 exerciseRoutePermissionUIState = ASK_EVERY_TIME,
                 historyReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = true, isGranted = true),
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
                 backgroundReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = true, isGranted = true))
-        whenever(additionalAccessViewModel.additionalAccessState).then { MutableLiveData(state) }
-
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = false,
+                    appHasGrantedFitnessReadPermission = true,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
         val scenario =
             launchFragment<AdditionalAccessFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         onView(withText("Access exercise routes")).check(matches(isDisplayed()))
         onView(withText("Ask every time")).check(matches(isDisplayed()))
         onView(withText("Access data in the background")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Allow this app to access Health Connect data when you're not using the app"))
+                    "Allow this app to access Health Connect data when you're not using the app"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Access past data")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Allow this app to access Health Connect data added before October 20, 2022"))
+                    "Allow this app to access Health Connect data added before October 20, 2022"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Enable at least one read permission in order to turn on background or past data access for this app"))
+                    "Enable at least one read permission in order to turn on background or past data access for this app"
+                )
+            )
             .check(doesNotExist())
 
         scenario.onActivity { activity ->
@@ -389,40 +486,62 @@
     }
 
     @Test
-    fun validArgument_backgroundAndHistoryReadDeclaredAndNotEnabled_showsFooter() {
+    fun backgroundAndHistoryReadDeclaredAndNotEnabled_onlyFitness_showsFooter() {
         val state =
             State(
                 exerciseRoutePermissionUIState = ASK_EVERY_TIME,
                 historyReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = false, isGranted = false),
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    ),
                 backgroundReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = false, isGranted = false))
-        whenever(additionalAccessViewModel.additionalAccessState).then { MutableLiveData(state) }
-
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = false,
+                    appHasGrantedFitnessReadPermission = false,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
         val scenario =
             launchFragment<AdditionalAccessFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         onView(withText("Access exercise routes")).check(matches(isDisplayed()))
         onView(withText("Ask every time")).check(matches(isDisplayed()))
         onView(withText("Access data in the background")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Allow this app to access Health Connect data when you're not using the app"))
+                    "Allow this app to access Health Connect data when you're not using the app"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Access past data")).check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Allow this app to access Health Connect data added before October 20, 2022"))
+                    "Allow this app to access Health Connect data added before October 20, 2022"
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(RecyclerViewActions.scrollToLastPosition<RecyclerView.ViewHolder>())
         onView(
                 withText(
-                    "Enable at least one read permission in order to turn on background or past data access for this app"))
+                    "Enable at least one read permission in order to turn on background or past data access for this app"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
 
@@ -445,14 +564,516 @@
     }
 
     @Test
+    fun historyReadDeclaredAndEnabled_fitnessAndMedical_showsHistoryReadPreference() {
+        val state =
+            State(
+                exerciseRoutePermissionUIState = ALWAYS_ALLOW,
+                historyReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = true,
+                    appHasGrantedFitnessReadPermission = true,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
+        val scenario =
+            launchFragment<AdditionalAccessFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+
+        onView(withText("Access exercise routes")).check(matches(isDisplayed()))
+        onView(withText("Always allow")).check(matches(isDisplayed()))
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access data added before October 20, 2022"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Enable at least one read permission in order to turn on past data access for this app"
+                )
+            )
+            .check(doesNotExist())
+
+        scenario.onActivity { activity ->
+            val fragment =
+                activity.supportFragmentManager.findFragmentById(android.R.id.content)
+                    as AdditionalAccessFragment
+            val historyPreference =
+                fragment.preferenceScreen.findPreference("key_history_read")
+                    as HealthSwitchPreference?
+            assertThat(historyPreference?.isChecked).isTrue()
+            assertThat(historyPreference?.isEnabled).isTrue()
+        }
+
+        verify(healthConnectLogger).logImpression(AdditionalAccessElement.EXERCISE_ROUTES_BUTTON)
+        verify(healthConnectLogger).logImpression(AdditionalAccessElement.HISTORY_READ_BUTTON)
+    }
+
+    @Test
+    fun historyReadDeclaredAndNotEnabled_fitnessAndMedical_showsFooter() {
+        val state =
+            State(
+                exerciseRoutePermissionUIState = ALWAYS_ALLOW,
+                historyReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = true,
+                    appHasGrantedFitnessReadPermission = false,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
+        val scenario =
+            launchFragment<AdditionalAccessFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+
+        onView(withText("Access exercise routes")).check(matches(isDisplayed()))
+        onView(withText("Always allow")).check(matches(isDisplayed()))
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access data added before October 20, 2022"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Enable at least one read permission in order to turn on past data access for this app"
+                )
+            )
+            .check(matches(isDisplayed()))
+
+        scenario.onActivity { activity ->
+            val fragment =
+                activity.supportFragmentManager.findFragmentById(android.R.id.content)
+                    as AdditionalAccessFragment
+            val historyPreference =
+                fragment.preferenceScreen.findPreference("key_history_read")
+                    as HealthSwitchPreference?
+            assertThat(historyPreference?.isChecked).isFalse()
+            assertThat(historyPreference?.isEnabled).isFalse()
+        }
+    }
+
+    @Test
+    fun backgroundReadDeclaredAndEnabled_fitnessAndMedical_showsBackgroundReadPreference() {
+        val state =
+            State(
+                exerciseRoutePermissionUIState = NEVER_ALLOW,
+                backgroundReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = true,
+                    appHasGrantedFitnessReadPermission = true,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
+        val scenario =
+            launchFragment<AdditionalAccessFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+
+        onView(withText("Access exercise routes")).check(matches(isDisplayed()))
+        onView(withText("Don't allow")).check(matches(isDisplayed()))
+        onView(withText("Access fitness and wellness data in the background"))
+            .check(matches(isDisplayed()))
+        onView(withText("Allow this app to access this data " + "when you're not using the app"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Enable at least one read permission in order to turn on background access for this app"
+                )
+            )
+            .check(doesNotExist())
+
+        scenario.onActivity { activity ->
+            val fragment =
+                activity.supportFragmentManager.findFragmentById(android.R.id.content)
+                    as AdditionalAccessFragment
+            val backgroundPreference =
+                fragment.preferenceScreen.findPreference("key_background_read")
+                    as HealthSwitchPreference?
+            assertThat(backgroundPreference?.isChecked).isTrue()
+            assertThat(backgroundPreference?.isEnabled).isTrue()
+        }
+
+        verify(healthConnectLogger).logImpression(AdditionalAccessElement.EXERCISE_ROUTES_BUTTON)
+        verify(healthConnectLogger).logImpression(AdditionalAccessElement.BACKGROUND_READ_BUTTON)
+    }
+
+    @Test
+    fun backgroundReadDeclaredAndNotEnabled_fitnessAndMedical_showsFooter() {
+        val state =
+            State(
+                exerciseRoutePermissionUIState = NEVER_ALLOW,
+                backgroundReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = true,
+                    appHasGrantedFitnessReadPermission = true,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
+        val scenario =
+            launchFragment<AdditionalAccessFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+
+        onView(withText("Access exercise routes")).check(matches(isDisplayed()))
+        onView(withText("Don't allow")).check(matches(isDisplayed()))
+        onView(withText("Access fitness and wellness data in the background"))
+            .check(matches(isDisplayed()))
+        onView(withText("Allow this app to access this data " + "when you're not using the app"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Enable at least one read permission in order to turn on background access for this app"
+                )
+            )
+            .check(matches(isDisplayed()))
+
+        scenario.onActivity { activity ->
+            val fragment =
+                activity.supportFragmentManager.findFragmentById(android.R.id.content)
+                    as AdditionalAccessFragment
+            val backgroundPreference =
+                fragment.preferenceScreen.findPreference("key_background_read")
+                    as HealthSwitchPreference?
+            assertThat(backgroundPreference?.isChecked).isFalse()
+            assertThat(backgroundPreference?.isEnabled).isFalse()
+        }
+    }
+
+    @Test
+    fun backgroundAndHistoryReadDeclaredAndEnabled_fitnessAndMedical_showsBothPreferences() {
+        val state =
+            State(
+                exerciseRoutePermissionUIState = ASK_EVERY_TIME,
+                historyReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+                backgroundReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = true,
+                    appHasGrantedFitnessReadPermission = true,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
+        val scenario =
+            launchFragment<AdditionalAccessFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+
+        onView(withText("Access exercise routes")).check(matches(isDisplayed()))
+        onView(withText("Ask every time")).check(matches(isDisplayed()))
+        onView(withText("Access fitness and wellness data in the background"))
+            .check(matches(isDisplayed()))
+        onView(withText("Allow this app to access this data " + "when you're not using the app"))
+            .check(matches(isDisplayed()))
+            .check(matches(isDisplayed()))
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access data added before October 20, 2022"))
+            .check(matches(isDisplayed()))
+
+        onView(
+                withText(
+                    "Enable at least one read permission in order to turn on background or past data access for this app"
+                )
+            )
+            .check(doesNotExist())
+
+        scenario.onActivity { activity ->
+            val fragment =
+                activity.supportFragmentManager.findFragmentById(android.R.id.content)
+                    as AdditionalAccessFragment
+            val historyPreference =
+                fragment.preferenceScreen.findPreference("key_history_read")
+                    as HealthSwitchPreference?
+            assertThat(historyPreference?.isChecked).isTrue()
+            assertThat(historyPreference?.isEnabled).isTrue()
+
+            val backgroundPreference =
+                fragment.preferenceScreen.findPreference("key_background_read")
+                    as HealthSwitchPreference?
+            assertThat(backgroundPreference?.isChecked).isTrue()
+            assertThat(backgroundPreference?.isEnabled).isTrue()
+        }
+
+        verify(healthConnectLogger).logImpression(AdditionalAccessElement.EXERCISE_ROUTES_BUTTON)
+        verify(healthConnectLogger).logImpression(AdditionalAccessElement.HISTORY_READ_BUTTON)
+        verify(healthConnectLogger).logImpression(AdditionalAccessElement.BACKGROUND_READ_BUTTON)
+    }
+
+    @Test
+    fun backgroundAndHistoryReadDeclaredAndNotEnabled_fitnessAndMedical_showsFooter() {
+        val state =
+            State(
+                exerciseRoutePermissionUIState = ASK_EVERY_TIME,
+                historyReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    ),
+                backgroundReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = true,
+                    appHasGrantedFitnessReadPermission = false,
+                    showMedicalPastDataFooter = false,
+                )
+            )
+        }
+        val scenario =
+            launchFragment<AdditionalAccessFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+
+        onView(withText("Access exercise routes")).check(matches(isDisplayed()))
+        onView(withText("Ask every time")).check(matches(isDisplayed()))
+        onView(withText("Access all data in the background")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Allow this app to access fitness and wellness data and health records " +
+                        "when you're not using the app"
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access data added before October 20, 2022"))
+            .check(matches(isDisplayed()))
+
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(RecyclerViewActions.scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(
+                withText(
+                    "Enable at least one read permission in order to turn on background or past data access for this app"
+                )
+            )
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
+
+        scenario.onActivity { activity ->
+            val fragment =
+                activity.supportFragmentManager.findFragmentById(android.R.id.content)
+                    as AdditionalAccessFragment
+            val historyPreference =
+                fragment.preferenceScreen.findPreference("key_history_read")
+                    as HealthSwitchPreference?
+            assertThat(historyPreference?.isChecked).isFalse()
+            assertThat(historyPreference?.isEnabled).isFalse()
+
+            val backgroundPreference =
+                fragment.preferenceScreen.findPreference("key_background_read")
+                    as HealthSwitchPreference?
+            assertThat(backgroundPreference?.isChecked).isFalse()
+            assertThat(backgroundPreference?.isEnabled).isFalse()
+        }
+    }
+
+    @Test
+    fun whenMedicalReadGranted_andHistoryDeclared_showsInformationFooter() {
+        val state =
+            State(
+                exerciseRoutePermissionUIState = ASK_EVERY_TIME,
+                historyReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = false,
+                    ),
+                backgroundReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = true,
+                    appHasGrantedFitnessReadPermission = true,
+                    showMedicalPastDataFooter = true,
+                )
+            )
+        }
+        launchFragment<AdditionalAccessFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
+
+        onView(withText("Access exercise routes")).check(matches(isDisplayed()))
+        onView(withText("Ask every time")).check(matches(isDisplayed()))
+        onView(withText("Access all data in the background")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Allow this app to access fitness and wellness data and health records " +
+                        "when you're not using the app"
+                )
+            )
+            .check(matches(isDisplayed()))
+            .check(matches(isDisplayed()))
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access data added before October 20, 2022"))
+            .check(matches(isDisplayed()))
+
+        onView(
+                withText(
+                    "Enable at least one read permission in order to turn on background or past data access for this app"
+                )
+            )
+            .check(doesNotExist())
+        onView(
+                withText(
+                    "$TEST_APP_NAME can already access past data for your health records. " +
+                        "To change this, turn off health record permissions for this app"
+                )
+            )
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun whenMedicalReadGranted_andFitnessReadNotGranted_andHistoryGranted_showsWarning() {
+        val state =
+            State(
+                exerciseRoutePermissionUIState = ASK_EVERY_TIME,
+                historyReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+                backgroundReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = true,
+                    ),
+            )
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(
+                    state = state,
+                    appHasDeclaredMedicalPermissions = true,
+                    appHasGrantedFitnessReadPermission = false,
+                    showMedicalPastDataFooter = true,
+                )
+            )
+        }
+        val scenario =
+            launchFragment<AdditionalAccessFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+
+        onView(withText("Access exercise routes")).check(matches(isDisplayed()))
+        onView(withText("Ask every time")).check(matches(isDisplayed()))
+        onView(withText("Access health records in the background")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access this data " + "when you're not using the app"))
+            .check(matches(isDisplayed()))
+            .check(matches(isDisplayed()))
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access data added before October 20, 2022"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "No fitness data is currently being read because $TEST_APP_NAME has no read permissions on"
+                )
+            )
+            .check(matches(isDisplayed()))
+
+        onView(
+                withText(
+                    "Enable at least one read permission in order to turn on background or past data access for this app"
+                )
+            )
+            .check(doesNotExist())
+
+        scenario.onActivity { activity ->
+            val fragment =
+                activity.supportFragmentManager.findFragmentById(android.R.id.content)
+                    as AdditionalAccessFragment
+            val historyPreference =
+                fragment.preferenceScreen.findPreference("key_history_read")
+                    as HealthSwitchPreference?
+            assertThat(historyPreference?.isChecked).isTrue()
+            assertThat(historyPreference?.isEnabled).isTrue()
+
+            val backgroundPreference =
+                fragment.preferenceScreen.findPreference("key_background_read")
+                    as HealthSwitchPreference?
+            assertThat(backgroundPreference?.isChecked).isTrue()
+            assertThat(backgroundPreference?.isEnabled).isTrue()
+        }
+    }
+
+    @Test
     fun clickExerciseRoute_opensDialog() {
         val exerciseRouteDeclaredState = State(exerciseRoutePermissionUIState = ASK_EVERY_TIME)
+        whenever(additionalAccessViewModel.screenState).then {
+            MutableLiveData(
+                AdditionalAccessViewModel.ScreenState(state = exerciseRouteDeclaredState)
+            )
+        }
         whenever(additionalAccessViewModel.additionalAccessState).then {
             MutableLiveData(exerciseRouteDeclaredState)
         }
 
         launchFragment<AdditionalAccessFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
         onView(withText(R.string.route_permissions_label)).perform(click())
         onIdle()
 
@@ -475,7 +1096,8 @@
             .thenReturn(MediatorLiveData(event))
 
         launchFragment<AdditionalAccessFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
         onIdle()
 
         onView(withText(R.string.exercise_permission_dialog_enable_title))
@@ -490,7 +1112,8 @@
             .thenReturn(MediatorLiveData(event))
 
         launchFragment<AdditionalAccessFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
         onIdle()
 
         onView(withText(R.string.exercise_permission_dialog_enable_title)).check(doesNotExist())
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/AdditionalAccessViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/AdditionalAccessViewModelTest.kt
index 18c661f..8f59912 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/AdditionalAccessViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/AdditionalAccessViewModelTest.kt
@@ -20,6 +20,7 @@
 import android.health.connect.HealthPermissions.READ_EXERCISE_ROUTES
 import android.health.connect.HealthPermissions.READ_HEALTH_DATA_HISTORY
 import android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES
 import android.health.connect.HealthPermissions.WRITE_DISTANCE
 import com.android.healthconnect.controller.permissions.additionalaccess.AdditionalAccessViewModel
 import com.android.healthconnect.controller.permissions.additionalaccess.GetAdditionalPermissionUseCase
@@ -37,9 +38,6 @@
 import com.android.healthconnect.controller.tests.utils.NOW
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.TestObserver
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -59,6 +57,7 @@
 import org.mockito.kotlin.any
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @HiltAndroidTest
@@ -68,7 +67,6 @@
     @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
     private val testDispatcher = UnconfinedTestDispatcher()
 
-    private val featureUtils: FeatureUtils = FakeFeatureUtils()
     private val grantHealthPermissionUseCase: GrantHealthPermissionUseCase = mock()
     private val revokeHealthPermissionUseCase: RevokeHealthPermissionUseCase = mock()
     private val setHealthPermissionsUserFixedFlagValueUseCase:
@@ -94,10 +92,10 @@
                 loadDeclaredHealthPermissionUseCase,
                 getHealthPermissionsFlagsUseCase,
                 getGrantedHealthPermissionsUseCase,
-                testDispatcher)
+                testDispatcher,
+            )
         additionalAccessViewModel =
             AdditionalAccessViewModel(
-                featureUtils,
                 appInfoReader,
                 loadExerciseRoutePermissionUseCase,
                 grantHealthPermissionUseCase,
@@ -105,13 +103,12 @@
                 setHealthPermissionsUserFixedFlagValueUseCase,
                 getAdditionalPermissionUseCase,
                 getGrantedHealthPermissionsUseCase,
-                loadAccessDateUseCase)
+                loadAccessDateUseCase,
+                loadDeclaredHealthPermissionUseCase,
+            )
 
         whenever(loadAccessDateUseCase.invoke(anyString())).thenReturn(NOW)
 
-        (featureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        featureUtils.setIsBackgroundReadEnabled(true)
-
         whenever(loadDeclaredHealthPermissionUseCase.invoke(TEST_APP_PACKAGE_NAME))
             .thenReturn(
                 listOf(
@@ -119,12 +116,15 @@
                     READ_EXERCISE_ROUTES,
                     READ_HEALTH_DATA_HISTORY,
                     READ_HEALTH_DATA_IN_BACKGROUND,
-                    WRITE_DISTANCE))
+                    WRITE_DISTANCE,
+                )
+            )
 
         whenever(getHealthPermissionsFlagsUseCase.invoke(any(), any())).then {
             mapOf(
                 READ_EXERCISE_ROUTES to PackageManager.FLAG_PERMISSION_USER_SET,
-                READ_EXERCISE to PackageManager.FLAG_PERMISSION_USER_SET)
+                READ_EXERCISE to PackageManager.FLAG_PERMISSION_USER_SET,
+            )
         }
         whenever(getAdditionalPermissionUseCase.invoke(TEST_APP_PACKAGE_NAME))
             .thenReturn(
@@ -132,14 +132,13 @@
                     READ_EXERCISE_ROUTES,
                     READ_HEALTH_DATA_HISTORY,
                     READ_HEALTH_DATA_IN_BACKGROUND,
-                ))
+                )
+            )
     }
 
     @After
     fun tearDown() {
         Dispatchers.resetMain()
-        (featureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(false)
-        featureUtils.setIsBackgroundReadEnabled(false)
     }
 
     @Test
@@ -151,19 +150,38 @@
     }
 
     @Test
-    fun loadAdditionalAccessPreferences_loadsAllAdditionalAccess() = runTest {
+    fun whenMedicalDeclared_andFitnessReadGranted_loadsAllAdditionalAccess() = runTest {
+        whenever(loadDeclaredHealthPermissionUseCase.invoke(TEST_APP_PACKAGE_NAME))
+            .thenReturn(
+                listOf(
+                    READ_EXERCISE,
+                    WRITE_DISTANCE,
+                    READ_MEDICAL_DATA_VACCINES,
+                    READ_EXERCISE_ROUTES,
+                    READ_HEALTH_DATA_HISTORY,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                )
+            )
         whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
             .thenReturn(listOf(READ_EXERCISE, READ_EXERCISE_ROUTES, READ_HEALTH_DATA_HISTORY))
 
         val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
+        val screenStateObserver = TestObserver<AdditionalAccessViewModel.ScreenState>()
 
         additionalAccessViewModel.additionalAccessState.observeForever(
-            additionalAccessStateObserver)
+            additionalAccessStateObserver
+        )
+        additionalAccessViewModel.screenState.observeForever(screenStateObserver)
         additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
         val additionalAccessResult = additionalAccessStateObserver.getLastValue()
+        val screenStateResult = screenStateObserver.getLastValue()
 
+        assertThat(screenStateResult.state).isEqualTo(additionalAccessResult)
+        assertThat(screenStateResult.appHasGrantedFitnessReadPermission).isTrue()
+        assertThat(screenStateResult.appHasDeclaredMedicalPermissions).isTrue()
+        assertThat(screenStateResult.showMedicalPastDataFooter).isFalse()
         assertThat(additionalAccessResult.exercisePermissionUIState)
             .isEqualTo(PermissionUiState.ALWAYS_ALLOW)
         assertThat(additionalAccessResult.exerciseRoutePermissionUIState)
@@ -171,119 +189,137 @@
         assertThat(additionalAccessResult.historyReadUIState)
             .isEqualTo(
                 AdditionalAccessViewModel.AdditionalPermissionState(
-                    isDeclared = true, isEnabled = true, isGranted = true))
+                    isDeclared = true,
+                    isEnabled = true,
+                    isGranted = true,
+                )
+            )
         assertThat(additionalAccessResult.backgroundReadUIState)
             .isEqualTo(
                 AdditionalAccessViewModel.AdditionalPermissionState(
-                    isDeclared = true, isEnabled = true, isGranted = false))
-        assertThat(additionalAccessResult.isValid()).isTrue()
-        assertThat(additionalAccessResult.showFooter()).isFalse()
+                    isDeclared = true,
+                    isEnabled = true,
+                    isGranted = false,
+                )
+            )
+        assertThat(additionalAccessResult.isAvailable()).isTrue()
+        assertThat(additionalAccessResult.showEnableReadFooter()).isFalse()
         assertThat(
                 additionalAccessResult.isAdditionalPermissionDisabled(
-                    additionalAccessResult.backgroundReadUIState))
+                    additionalAccessResult.backgroundReadUIState
+                )
+            )
             .isFalse()
         assertThat(
                 additionalAccessResult.isAdditionalPermissionDisabled(
-                    additionalAccessResult.historyReadUIState))
+                    additionalAccessResult.historyReadUIState
+                )
+            )
             .isFalse()
     }
 
     @Test
-    fun loadAdditionalAccessPreferences_historyReadNotEnabled_doesNotReturnHistoryRead() = runTest {
-        (featureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(false)
+    fun whenNoReadPermissionsGranted_additionalPermissionsDisabled() = runTest {
+        whenever(loadDeclaredHealthPermissionUseCase.invoke(TEST_APP_PACKAGE_NAME))
+            .thenReturn(
+                listOf(
+                    READ_EXERCISE,
+                    WRITE_DISTANCE,
+                    READ_EXERCISE_ROUTES,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            )
         whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
-            .thenReturn(listOf(READ_EXERCISE, READ_EXERCISE_ROUTES, READ_HEALTH_DATA_HISTORY))
+            .thenReturn(listOf(WRITE_DISTANCE))
+
         val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
+        val screenStateObserver = TestObserver<AdditionalAccessViewModel.ScreenState>()
 
         additionalAccessViewModel.additionalAccessState.observeForever(
-            additionalAccessStateObserver)
+            additionalAccessStateObserver
+        )
+        additionalAccessViewModel.screenState.observeForever(screenStateObserver)
         additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
         val additionalAccessResult = additionalAccessStateObserver.getLastValue()
+        val screenStateResult = screenStateObserver.getLastValue()
 
+        assertThat(screenStateResult.state).isEqualTo(additionalAccessResult)
+        assertThat(screenStateResult.appHasDeclaredMedicalPermissions).isFalse()
+        assertThat(screenStateResult.appHasGrantedFitnessReadPermission).isFalse()
+        assertThat(screenStateResult.showMedicalPastDataFooter).isFalse()
         assertThat(additionalAccessResult.exercisePermissionUIState)
-            .isEqualTo(PermissionUiState.ALWAYS_ALLOW)
+            .isEqualTo(PermissionUiState.ASK_EVERY_TIME)
         assertThat(additionalAccessResult.exerciseRoutePermissionUIState)
-            .isEqualTo(PermissionUiState.ALWAYS_ALLOW)
+            .isEqualTo(PermissionUiState.ASK_EVERY_TIME)
         assertThat(additionalAccessResult.historyReadUIState)
             .isEqualTo(
                 AdditionalAccessViewModel.AdditionalPermissionState(
-                    isDeclared = false, isEnabled = false, isGranted = false))
+                    isDeclared = true,
+                    isEnabled = false,
+                    isGranted = false,
+                )
+            )
         assertThat(additionalAccessResult.backgroundReadUIState)
             .isEqualTo(
                 AdditionalAccessViewModel.AdditionalPermissionState(
-                    isDeclared = true, isEnabled = true, isGranted = false))
-        assertThat(additionalAccessResult.isValid()).isTrue()
-        assertThat(additionalAccessResult.showFooter()).isFalse()
+                    isDeclared = true,
+                    isEnabled = false,
+                    isGranted = false,
+                )
+            )
+        assertThat(additionalAccessResult.isAvailable()).isTrue()
+        assertThat(additionalAccessResult.showEnableReadFooter()).isTrue()
         assertThat(
                 additionalAccessResult.isAdditionalPermissionDisabled(
-                    additionalAccessResult.backgroundReadUIState))
-            .isFalse()
+                    additionalAccessResult.backgroundReadUIState
+                )
+            )
+            .isTrue()
         assertThat(
                 additionalAccessResult.isAdditionalPermissionDisabled(
-                    additionalAccessResult.historyReadUIState))
-            .isFalse()
+                    additionalAccessResult.historyReadUIState
+                )
+            )
+            .isTrue()
     }
 
     @Test
-    fun loadAdditionalAccessPreferences_backgroundReadNotEnabled_doesNotReturnBackgroundRead() =
+    fun whenMedicalAndHistoryReadDeclared_andMedicalReadGranted_shouldShowMedicalFooter() =
         runTest {
-            (featureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(false)
-            whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
-                .thenReturn(listOf(READ_EXERCISE, READ_EXERCISE_ROUTES, READ_HEALTH_DATA_HISTORY))
-
-            val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
-
-            additionalAccessViewModel.additionalAccessState.observeForever(
-                additionalAccessStateObserver)
-            additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
-            advanceUntilIdle()
-
-            val additionalAccessResult = additionalAccessStateObserver.getLastValue()
-
-            assertThat(additionalAccessResult.exercisePermissionUIState)
-                .isEqualTo(PermissionUiState.ALWAYS_ALLOW)
-            assertThat(additionalAccessResult.exerciseRoutePermissionUIState)
-                .isEqualTo(PermissionUiState.ALWAYS_ALLOW)
-            assertThat(additionalAccessResult.historyReadUIState)
-                .isEqualTo(
-                    AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = true, isGranted = true))
-            assertThat(additionalAccessResult.backgroundReadUIState)
-                .isEqualTo(
-                    AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = false, isEnabled = false, isGranted = false))
-            assertThat(additionalAccessResult.isValid()).isTrue()
-            assertThat(additionalAccessResult.showFooter()).isFalse()
-            assertThat(
-                    additionalAccessResult.isAdditionalPermissionDisabled(
-                        additionalAccessResult.backgroundReadUIState))
-                .isFalse()
-            assertThat(
-                    additionalAccessResult.isAdditionalPermissionDisabled(
-                        additionalAccessResult.historyReadUIState))
-                .isFalse()
-        }
-
-    @Test
-    fun loadAdditionalAccessPreferences_noReadPermissionsGranted_additionalPermissionsDisabled() =
-        runTest {
-            whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
+            whenever(loadDeclaredHealthPermissionUseCase.invoke(TEST_APP_PACKAGE_NAME))
                 .thenReturn(
                     listOf(
+                        READ_EXERCISE,
                         WRITE_DISTANCE,
-                    ))
+                        READ_EXERCISE_ROUTES,
+                        READ_MEDICAL_DATA_VACCINES,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_HEALTH_DATA_HISTORY,
+                    )
+                )
+            whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
+                .thenReturn(listOf(WRITE_DISTANCE, READ_MEDICAL_DATA_VACCINES))
 
             val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
+            val screenStateObserver = TestObserver<AdditionalAccessViewModel.ScreenState>()
 
             additionalAccessViewModel.additionalAccessState.observeForever(
-                additionalAccessStateObserver)
+                additionalAccessStateObserver
+            )
+            additionalAccessViewModel.screenState.observeForever(screenStateObserver)
             additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
             advanceUntilIdle()
 
             val additionalAccessResult = additionalAccessStateObserver.getLastValue()
+            val screenStateResult = screenStateObserver.getLastValue()
 
+            assertThat(screenStateResult.state).isEqualTo(additionalAccessResult)
+            assertThat(screenStateResult.appHasDeclaredMedicalPermissions).isTrue()
+            assertThat(screenStateResult.appHasGrantedFitnessReadPermission).isFalse()
+            assertThat(screenStateResult.showMedicalPastDataFooter).isTrue()
             assertThat(additionalAccessResult.exercisePermissionUIState)
                 .isEqualTo(PermissionUiState.ASK_EVERY_TIME)
             assertThat(additionalAccessResult.exerciseRoutePermissionUIState)
@@ -291,39 +327,50 @@
             assertThat(additionalAccessResult.historyReadUIState)
                 .isEqualTo(
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = false, isGranted = false))
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = false,
+                    )
+                )
             assertThat(additionalAccessResult.backgroundReadUIState)
                 .isEqualTo(
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = false, isGranted = false))
-            assertThat(additionalAccessResult.isValid()).isTrue()
-            assertThat(additionalAccessResult.showFooter()).isTrue()
+                        isDeclared = true,
+                        isEnabled = true,
+                        isGranted = false,
+                    )
+                )
+            assertThat(additionalAccessResult.isAvailable()).isTrue()
+            assertThat(additionalAccessResult.showEnableReadFooter()).isFalse()
             assertThat(
                     additionalAccessResult.isAdditionalPermissionDisabled(
-                        additionalAccessResult.backgroundReadUIState))
-                .isTrue()
+                        additionalAccessResult.backgroundReadUIState
+                    )
+                )
+                .isFalse()
             assertThat(
                     additionalAccessResult.isAdditionalPermissionDisabled(
-                        additionalAccessResult.historyReadUIState))
-                .isTrue()
+                        additionalAccessResult.historyReadUIState
+                    )
+                )
+                .isFalse()
         }
 
     @Test
     fun updateExerciseRouteState_toAlwaysAllow_noExercisePermission_showsDialog() = runTest {
         whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
-            .thenReturn(
-                listOf(
-                    WRITE_DISTANCE,
-                ))
+            .thenReturn(listOf(WRITE_DISTANCE))
 
         val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
         val showEnableExerciseEventObserver =
             TestObserver<AdditionalAccessViewModel.EnableExerciseDialogEvent>()
 
         additionalAccessViewModel.additionalAccessState.observeForever(
-            additionalAccessStateObserver)
+            additionalAccessStateObserver
+        )
         additionalAccessViewModel.showEnableExerciseEvent.observeForever(
-            showEnableExerciseEventObserver)
+            showEnableExerciseEventObserver
+        )
         additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
@@ -335,7 +382,9 @@
             .isEqualTo(PermissionUiState.ASK_EVERY_TIME)
 
         additionalAccessViewModel.updateExerciseRouteState(
-            TEST_APP_PACKAGE_NAME, PermissionUiState.ALWAYS_ALLOW)
+            TEST_APP_PACKAGE_NAME,
+            PermissionUiState.ALWAYS_ALLOW,
+        )
         advanceUntilIdle()
 
         val enableExerciseEventResult = showEnableExerciseEventObserver.getLastValue()
@@ -345,20 +394,18 @@
     @Test
     fun updateExerciseRouteState_toAlwaysAllow_withExercisePermission_grantsPermission() = runTest {
         whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
-            .thenReturn(
-                listOf(
-                    READ_EXERCISE,
-                    WRITE_DISTANCE,
-                ))
+            .thenReturn(listOf(READ_EXERCISE, WRITE_DISTANCE))
 
         val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
         val showEnableExerciseEventObserver =
             TestObserver<AdditionalAccessViewModel.EnableExerciseDialogEvent>()
 
         additionalAccessViewModel.additionalAccessState.observeForever(
-            additionalAccessStateObserver)
+            additionalAccessStateObserver
+        )
         additionalAccessViewModel.showEnableExerciseEvent.observeForever(
-            showEnableExerciseEventObserver)
+            showEnableExerciseEventObserver
+        )
         additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
@@ -370,7 +417,9 @@
             .isEqualTo(PermissionUiState.ASK_EVERY_TIME)
 
         additionalAccessViewModel.updateExerciseRouteState(
-            TEST_APP_PACKAGE_NAME, PermissionUiState.ALWAYS_ALLOW)
+            TEST_APP_PACKAGE_NAME,
+            PermissionUiState.ALWAYS_ALLOW,
+        )
         advanceUntilIdle()
 
         val enableExerciseEventResult = showEnableExerciseEventObserver.getLastValue()
@@ -381,21 +430,18 @@
     @Test
     fun updateExerciseRouteState_toAskEveryTime_fromAlwaysAllow_revokesPermission() = runTest {
         whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
-            .thenReturn(
-                listOf(
-                    READ_EXERCISE,
-                    READ_EXERCISE_ROUTES,
-                    WRITE_DISTANCE,
-                ))
+            .thenReturn(listOf(READ_EXERCISE, READ_EXERCISE_ROUTES, WRITE_DISTANCE))
 
         val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
         val showEnableExerciseEventObserver =
             TestObserver<AdditionalAccessViewModel.EnableExerciseDialogEvent>()
 
         additionalAccessViewModel.additionalAccessState.observeForever(
-            additionalAccessStateObserver)
+            additionalAccessStateObserver
+        )
         additionalAccessViewModel.showEnableExerciseEvent.observeForever(
-            showEnableExerciseEventObserver)
+            showEnableExerciseEventObserver
+        )
         additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
@@ -407,7 +453,9 @@
             .isEqualTo(PermissionUiState.ALWAYS_ALLOW)
 
         additionalAccessViewModel.updateExerciseRouteState(
-            TEST_APP_PACKAGE_NAME, PermissionUiState.ASK_EVERY_TIME)
+            TEST_APP_PACKAGE_NAME,
+            PermissionUiState.ASK_EVERY_TIME,
+        )
         advanceUntilIdle()
 
         val enableExerciseEventResult = showEnableExerciseEventObserver.getLastValue()
@@ -418,15 +466,12 @@
     @Test
     fun updateExerciseRouteState_toAskEveryTime_fromNeverAllow_setsFlag() = runTest {
         whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
-            .thenReturn(
-                listOf(
-                    READ_EXERCISE,
-                    WRITE_DISTANCE,
-                ))
+            .thenReturn(listOf(READ_EXERCISE, WRITE_DISTANCE))
         whenever(getHealthPermissionsFlagsUseCase.invoke(any(), any())).then {
             mapOf(
                 READ_EXERCISE_ROUTES to PackageManager.FLAG_PERMISSION_USER_FIXED,
-                READ_EXERCISE to PackageManager.FLAG_PERMISSION_USER_SET)
+                READ_EXERCISE to PackageManager.FLAG_PERMISSION_USER_SET,
+            )
         }
 
         val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
@@ -434,9 +479,11 @@
             TestObserver<AdditionalAccessViewModel.EnableExerciseDialogEvent>()
 
         additionalAccessViewModel.additionalAccessState.observeForever(
-            additionalAccessStateObserver)
+            additionalAccessStateObserver
+        )
         additionalAccessViewModel.showEnableExerciseEvent.observeForever(
-            showEnableExerciseEventObserver)
+            showEnableExerciseEventObserver
+        )
         additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
@@ -448,7 +495,9 @@
             .isEqualTo(PermissionUiState.NEVER_ALLOW)
 
         additionalAccessViewModel.updateExerciseRouteState(
-            TEST_APP_PACKAGE_NAME, PermissionUiState.ASK_EVERY_TIME)
+            TEST_APP_PACKAGE_NAME,
+            PermissionUiState.ASK_EVERY_TIME,
+        )
         advanceUntilIdle()
 
         val enableExerciseEventResult = showEnableExerciseEventObserver.getLastValue()
@@ -460,21 +509,18 @@
     @Test
     fun updateExerciseRouteState_toNeverAllow_revokesPermission_setsFlag() = runTest {
         whenever(getGrantedHealthPermissionsUseCase.invoke(TEST_APP_PACKAGE_NAME))
-            .thenReturn(
-                listOf(
-                    READ_EXERCISE,
-                    READ_EXERCISE_ROUTES,
-                    WRITE_DISTANCE,
-                ))
+            .thenReturn(listOf(READ_EXERCISE, READ_EXERCISE_ROUTES, WRITE_DISTANCE))
 
         val additionalAccessStateObserver = TestObserver<AdditionalAccessViewModel.State>()
         val showEnableExerciseEventObserver =
             TestObserver<AdditionalAccessViewModel.EnableExerciseDialogEvent>()
 
         additionalAccessViewModel.additionalAccessState.observeForever(
-            additionalAccessStateObserver)
+            additionalAccessStateObserver
+        )
         additionalAccessViewModel.showEnableExerciseEvent.observeForever(
-            showEnableExerciseEventObserver)
+            showEnableExerciseEventObserver
+        )
         additionalAccessViewModel.loadAdditionalAccessPreferences(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
@@ -486,7 +532,9 @@
             .isEqualTo(PermissionUiState.ALWAYS_ALLOW)
 
         additionalAccessViewModel.updateExerciseRouteState(
-            TEST_APP_PACKAGE_NAME, PermissionUiState.NEVER_ALLOW)
+            TEST_APP_PACKAGE_NAME,
+            PermissionUiState.NEVER_ALLOW,
+        )
         advanceUntilIdle()
 
         val enableExerciseEventResult = showEnableExerciseEventObserver.getLastValue()
@@ -508,7 +556,8 @@
         val showEnableExerciseEventObserver =
             TestObserver<AdditionalAccessViewModel.EnableExerciseDialogEvent>()
         additionalAccessViewModel.showEnableExerciseEvent.observeForever(
-            showEnableExerciseEventObserver)
+            showEnableExerciseEventObserver
+        )
 
         additionalAccessViewModel.hideExercisePermissionRequestDialog()
         advanceUntilIdle()
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/DisableExerciseRoutePermissionDialogTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/DisableExerciseRoutePermissionDialogTest.kt
index c6e090c..2ea2dc4 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/DisableExerciseRoutePermissionDialogTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/DisableExerciseRoutePermissionDialogTest.kt
@@ -31,13 +31,13 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.launchDialog
-import com.android.healthconnect.controller.tests.utils.safeEq
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.verify
 
@@ -51,7 +51,8 @@
     private val bundle =
         bundleOf(
             Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
-            Constants.EXTRA_APP_NAME to TEST_APP_NAME)
+            Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+        )
 
     @Before
     fun setup() {
@@ -66,7 +67,7 @@
             .inRoot(isDialog())
             .perform(click())
 
-        verify(viewModel).disableExerciseRoutePermission(safeEq(TEST_APP_PACKAGE_NAME))
+        verify(viewModel).disableExerciseRoutePermission(eq(TEST_APP_PACKAGE_NAME))
         verify(viewModel).hideExerciseRoutePermissionDialog()
     }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/EnableExercisePermissionDialogTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/EnableExercisePermissionDialogTest.kt
index 2abf6c4..0a9daf8 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/EnableExercisePermissionDialogTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/EnableExercisePermissionDialogTest.kt
@@ -31,13 +31,13 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.launchDialog
-import com.android.healthconnect.controller.tests.utils.safeEq
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.verify
 
@@ -51,7 +51,8 @@
     private val bundle =
         bundleOf(
             Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
-            Constants.EXTRA_APP_NAME to TEST_APP_NAME)
+            Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+        )
 
     @Before
     fun setup() {
@@ -66,7 +67,7 @@
             .inRoot(isDialog())
             .perform(click())
 
-        verify(viewModel).enableExercisePermission(safeEq(TEST_APP_PACKAGE_NAME))
+        verify(viewModel).enableExercisePermission(eq(TEST_APP_PACKAGE_NAME))
         verify(viewModel).hideExercisePermissionRequestDialog()
     }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/ExerciseRoutesPermissionDialogFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/ExerciseRoutesPermissionDialogFragmentTest.kt
index 8d8bfff..ca3b2fb 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/ExerciseRoutesPermissionDialogFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/ExerciseRoutesPermissionDialogFragmentTest.kt
@@ -42,8 +42,6 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.launchDialog
-import com.android.healthconnect.controller.tests.utils.safeEq
-import com.android.healthconnect.controller.tests.utils.whenever
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -52,6 +50,8 @@
 import org.junit.Test
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class ExerciseRoutesPermissionDialogFragmentTest {
@@ -68,7 +68,8 @@
         AppMetadata(
             TEST_APP_PACKAGE_NAME,
             TEST_APP_NAME,
-            context.getDrawable(R.drawable.health_connect_logo))
+            context.getDrawable(R.drawable.health_connect_logo),
+        )
 
     @Before
     fun setup() {
@@ -86,7 +87,8 @@
         }
 
         launchDialog<ExerciseRoutesPermissionDialogFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withId(R.id.radio_button_always_allow))
             .inRoot(isDialog())
@@ -100,7 +102,8 @@
         }
 
         launchDialog<ExerciseRoutesPermissionDialogFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withId(R.id.radio_button_ask)).inRoot(isDialog()).check(matches(isChecked()))
     }
@@ -112,7 +115,8 @@
         }
 
         launchDialog<ExerciseRoutesPermissionDialogFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withId(R.id.radio_button_revoke)).inRoot(isDialog()).check(matches(isChecked()))
     }
@@ -120,23 +124,25 @@
     @Test
     fun onOptionSelected_withAllowAll_callsViewModelWithGranted() {
         launchDialog<ExerciseRoutesPermissionDialogFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withId(R.id.radio_button_always_allow)).inRoot(isDialog()).perform(click())
 
         verify(additionalAccessViewModel)
-            .updateExerciseRouteState(safeEq(TEST_APP_PACKAGE_NAME), safeEq(ALWAYS_ALLOW))
+            .updateExerciseRouteState(eq(TEST_APP_PACKAGE_NAME), eq(ALWAYS_ALLOW))
     }
 
     @Test
     fun onOptionSelected_withAskEveryTime_callsViewModelWithDeclared() {
         launchDialog<ExerciseRoutesPermissionDialogFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withId(R.id.radio_button_ask)).inRoot(isDialog()).perform(click())
 
         verify(additionalAccessViewModel)
-            .updateExerciseRouteState(safeEq(TEST_APP_PACKAGE_NAME), safeEq(ASK_EVERY_TIME))
+            .updateExerciseRouteState(eq(TEST_APP_PACKAGE_NAME), eq(ASK_EVERY_TIME))
     }
 
     @Test
@@ -145,11 +151,12 @@
             MutableLiveData(State(exerciseRoutePermissionUIState = ALWAYS_ALLOW))
         }
         launchDialog<ExerciseRoutesPermissionDialogFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withId(R.id.radio_button_revoke)).inRoot(isDialog()).perform(click())
 
         verify(additionalAccessViewModel)
-            .updateExerciseRouteState(safeEq(TEST_APP_PACKAGE_NAME), safeEq(NEVER_ALLOW))
+            .updateExerciseRouteState(eq(TEST_APP_PACKAGE_NAME), eq(NEVER_ALLOW))
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/GetAdditionalPermissionUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/GetAdditionalPermissionUseCaseTest.kt
index a757672..956ef6d 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/GetAdditionalPermissionUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/GetAdditionalPermissionUseCaseTest.kt
@@ -22,8 +22,6 @@
 import com.android.healthconnect.controller.permissions.additionalaccess.GetAdditionalPermissionUseCase
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.safeEq
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -33,7 +31,9 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.eq
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class GetAdditionalPermissionUseCaseTest {
@@ -56,7 +56,7 @@
     fun execute_callsGetHealthPermissions() {
         useCase.invoke(TEST_APP_PACKAGE_NAME)
 
-        verify(healthPermissionReader).getAdditionalPermissions(safeEq(TEST_APP_PACKAGE_NAME))
+        verify(healthPermissionReader).getAdditionalPermissions(eq(TEST_APP_PACKAGE_NAME))
     }
 
     @Test
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/LoadDeclaredHealthPermissionUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/LoadDeclaredHealthPermissionUseCaseTest.kt
index 5efe1a0..9cc6c9a 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/LoadDeclaredHealthPermissionUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/LoadDeclaredHealthPermissionUseCaseTest.kt
@@ -18,11 +18,13 @@
 
 package com.android.healthconnect.controller.tests.permissions.additionalaccess
 
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import com.android.healthconnect.controller.permissions.additionalaccess.LoadDeclaredHealthPermissionUseCase
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.safeEq
-import com.android.healthconnect.controller.tests.utils.whenever
+import com.android.healthfitness.flags.Flags
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -31,12 +33,15 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito.mock
+import org.mockito.kotlin.eq
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class LoadDeclaredHealthPermissionUseCaseTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
 
     @Inject lateinit var useCase: LoadDeclaredHealthPermissionUseCase
 
@@ -51,9 +56,18 @@
     }
 
     @Test
-    fun execute_callsGetHealthPermissions() {
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun execute_callsGetDeclaredHealthPermissions() {
         useCase.invoke(TEST_APP_PACKAGE_NAME)
 
-        verify(healthPermissionReader).getDeclaredHealthPermissions(safeEq(TEST_APP_PACKAGE_NAME))
+        verify(healthPermissionReader).getDeclaredHealthPermissions(eq(TEST_APP_PACKAGE_NAME))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun execute_callsGetValidHealthPermissions() {
+        useCase.invoke(TEST_APP_PACKAGE_NAME)
+
+        verify(healthPermissionReader).getValidHealthPermissions(eq(TEST_APP_PACKAGE_NAME))
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/LoadExerciseRoutePermissionUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/LoadExerciseRoutePermissionUseCaseTest.kt
index 70464e0..4f2a3bc 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/LoadExerciseRoutePermissionUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/additionalaccess/LoadExerciseRoutePermissionUseCaseTest.kt
@@ -33,8 +33,6 @@
 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.di.FakeGetGrantedHealthPermissionsUseCase
-import com.android.healthconnect.controller.tests.utils.safeEq
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -44,7 +42,9 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.kotlin.any
+import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class LoadExerciseRoutePermissionUseCaseTest {
@@ -65,44 +65,50 @@
                 loadDeclaredHealthPermissionUseCase,
                 getHealthPermissionsFlagsUseCase,
                 getGrantedHealthPermissionsUseCase,
-                Dispatchers.Main)
+                Dispatchers.Main,
+            )
         getGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME, emptyList())
-        whenever(loadDeclaredHealthPermissionUseCase.invoke(safeEq(TEST_APP_PACKAGE_NAME))).then {
+        whenever(loadDeclaredHealthPermissionUseCase.invoke(eq(TEST_APP_PACKAGE_NAME))).then {
             listOf(READ_EXERCISE_ROUTES, READ_EXERCISE)
         }
         whenever(getHealthPermissionsFlagsUseCase.invoke(any(), any())).then {
             mapOf(
                 READ_EXERCISE_ROUTES to FLAG_PERMISSION_USER_SET,
-                READ_EXERCISE to FLAG_PERMISSION_USER_SET)
+                READ_EXERCISE to FLAG_PERMISSION_USER_SET,
+            )
         }
     }
 
     @Test
     fun execute_exerciseRoutePermissionGranted_returnGrantedState() = runTest {
         getGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE_ROUTES))
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE_ROUTES),
+        )
 
         val state = useCase.invoke(TEST_APP_PACKAGE_NAME)
 
         val expected =
             ExerciseRouteState(
                 exerciseRoutePermissionState = ALWAYS_ALLOW,
-                exercisePermissionState = ASK_EVERY_TIME)
+                exercisePermissionState = ASK_EVERY_TIME,
+            )
         assertThat(state).isEqualTo(UseCaseResults.Success(expected))
     }
 
     @Test
     fun execute_exerciseRoutePermissionDeclared_returnDeclaredState() = runTest {
-        whenever(loadDeclaredHealthPermissionUseCase.invoke(safeEq(TEST_APP_PACKAGE_NAME))).then {
+        whenever(loadDeclaredHealthPermissionUseCase.invoke(eq(TEST_APP_PACKAGE_NAME))).then {
             listOf(READ_EXERCISE_ROUTES, READ_EXERCISE)
         }
 
-        val state = useCase.invoke(safeEq(TEST_APP_PACKAGE_NAME))
+        val state = useCase.invoke(eq(TEST_APP_PACKAGE_NAME))
 
         val expected =
             ExerciseRouteState(
                 exerciseRoutePermissionState = ASK_EVERY_TIME,
-                exercisePermissionState = ASK_EVERY_TIME)
+                exercisePermissionState = ASK_EVERY_TIME,
+            )
         assertThat(state).isEqualTo(UseCaseResults.Success(expected))
     }
 
@@ -114,7 +120,9 @@
         val state = useCase.invoke(TEST_APP_PACKAGE_NAME)
         val expected =
             ExerciseRouteState(
-                exerciseRoutePermissionState = NEVER_ALLOW, exercisePermissionState = NOT_DECLARED)
+                exerciseRoutePermissionState = NEVER_ALLOW,
+                exercisePermissionState = NOT_DECLARED,
+            )
         assertThat(state).isEqualTo(UseCaseResults.Success(expected))
     }
 
@@ -128,7 +136,9 @@
 
         val expected =
             ExerciseRouteState(
-                exerciseRoutePermissionState = NOT_DECLARED, exercisePermissionState = NOT_DECLARED)
+                exerciseRoutePermissionState = NOT_DECLARED,
+                exercisePermissionState = NOT_DECLARED,
+            )
         assertThat(state).isEqualTo(UseCaseResults.Success(expected))
     }
 
@@ -142,7 +152,9 @@
 
         val expected =
             ExerciseRouteState(
-                exerciseRoutePermissionState = NOT_DECLARED, exercisePermissionState = NOT_DECLARED)
+                exerciseRoutePermissionState = NOT_DECLARED,
+                exercisePermissionState = NOT_DECLARED,
+            )
         assertThat(state).isEqualTo(UseCaseResults.Success(expected))
     }
 
@@ -156,7 +168,9 @@
 
         val expected =
             ExerciseRouteState(
-                exerciseRoutePermissionState = NOT_DECLARED, exercisePermissionState = NOT_DECLARED)
+                exerciseRoutePermissionState = NOT_DECLARED,
+                exercisePermissionState = NOT_DECLARED,
+            )
         assertThat(state).isEqualTo(UseCaseResults.Success(expected))
     }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/GetGrantedHealthPermissionsUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/GetGrantedHealthPermissionsUseCaseTest.kt
index e1f5524..9490bf7 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/GetGrantedHealthPermissionsUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/GetGrantedHealthPermissionsUseCaseTest.kt
@@ -19,13 +19,13 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.permissions.api.GetGrantedHealthPermissionsUseCase
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
 import org.mockito.kotlin.any
+import org.mockito.kotlin.whenever
 
 class GetGrantedHealthPermissionsUseCaseTest {
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/GetHealthPermissionsFlagsUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/GetHealthPermissionsFlagsUseCaseTest.kt
index 296c7ed..64b2272 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/GetHealthPermissionsFlagsUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/GetHealthPermissionsFlagsUseCaseTest.kt
@@ -20,13 +20,13 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.permissions.api.GetHealthPermissionsFlagsUseCase
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
 import org.mockito.Mockito
 import org.mockito.Mockito.verify
 import org.mockito.kotlin.any
+import org.mockito.kotlin.whenever
 
 class GetHealthPermissionsFlagsUseCaseTest {
     private lateinit var context: Context
@@ -46,7 +46,9 @@
 
         verify(healthPermissionManager)
             .getHealthPermissionsFlags(
-                "TEST_APP", listOf("PERMISSION_1", "PERMISSION_2", "PERMISSION_3"))
+                "TEST_APP",
+                listOf("PERMISSION_1", "PERMISSION_2", "PERMISSION_3"),
+            )
     }
 
     @Test
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/LoadAccessDateUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/LoadAccessDateUseCaseTest.kt
index 3852627..b9685f4 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/LoadAccessDateUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/api/LoadAccessDateUseCaseTest.kt
@@ -17,7 +17,6 @@
 
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
 import com.android.healthconnect.controller.permissions.api.LoadAccessDateUseCase
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -27,6 +26,7 @@
 import org.junit.Test
 import org.mockito.Mockito
 import org.mockito.kotlin.any
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class LoadAccessDateUseCaseTest {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/AppPermissionViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/AppPermissionViewModelTest.kt
index f6bc343..be72f98 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/AppPermissionViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/AppPermissionViewModelTest.kt
@@ -15,9 +15,10 @@
  */
 package com.android.healthconnect.controller.tests.permissions.connectedapps
 
-import android.health.connect.TimeInstantRangeFilter
-import com.android.healthconnect.controller.deletion.DeletionType
-import com.android.healthconnect.controller.deletion.api.DeleteAppDataUseCase
+
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.healthconnect.controller.deletion.api.DeleteAppDataUseCase as OldDeleteAppDataUseCase
 import com.android.healthconnect.controller.permissions.additionalaccess.ExerciseRouteState
 import com.android.healthconnect.controller.permissions.additionalaccess.PermissionUiState
 import com.android.healthconnect.controller.permissions.api.GrantHealthPermissionUseCase
@@ -27,12 +28,14 @@
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel
 import com.android.healthconnect.controller.permissions.app.LoadAppPermissionsStatusUseCase
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
-import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
-import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteAppData
+ import com.android.healthconnect.controller.selectabledeletion.api.DeleteAppDataUseCase
+ import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
 import com.android.healthconnect.controller.tests.utils.NOW
@@ -41,7 +44,7 @@
 import com.android.healthconnect.controller.tests.utils.TestObserver
 import com.android.healthconnect.controller.tests.utils.di.FakeGetGrantedHealthPermissionsUseCase
 import com.android.healthconnect.controller.tests.utils.di.FakeLoadExerciseRoute
-import com.android.healthconnect.controller.utils.FeatureUtils
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -63,8 +66,10 @@
 import org.mockito.MockitoAnnotations
 import org.mockito.kotlin.any
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.verifyNoMoreInteractions
 import org.mockito.kotlin.whenever
 
 @OptIn(ExperimentalCoroutinesApi::class)
@@ -73,12 +78,14 @@
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
     @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
+    @get:Rule val setFlagsRule = SetFlagsRule()
     private val testDispatcher = UnconfinedTestDispatcher()
 
     private val healthPermissionReader: HealthPermissionReader = mock()
     private val getGrantedHealthPermissionsUseCase = FakeGetGrantedHealthPermissionsUseCase()
     private val loadAccessDateUseCase: LoadAccessDateUseCase = mock()
-    private val deleteAppDateUseCase: DeleteAppDataUseCase = mock()
+    private val deleteAppDataUseCase: DeleteAppDataUseCase = mock()
+    private val oldDeleteAppDataUseCase: OldDeleteAppDataUseCase = mock()
     private val revokeAllHealthPermissionsUseCase: RevokeAllHealthPermissionsUseCase = mock()
     private val revokePermissionStatusUseCase: RevokeHealthPermissionUseCase = mock()
     private val grantPermissionsUseCase: GrantHealthPermissionUseCase = mock()
@@ -87,33 +94,32 @@
     private lateinit var loadAppPermissionsStatusUseCase: LoadAppPermissionsStatusUseCase
     private lateinit var appPermissionViewModel: AppPermissionViewModel
     @Inject lateinit var appInfoReader: AppInfoReader
-    @Inject lateinit var featureUtils: FeatureUtils
 
     private val readExercisePermission =
         FitnessPermission(FitnessPermissionType.EXERCISE, PermissionsAccessType.READ)
     private val readNutritionPermission =
         FitnessPermission(FitnessPermissionType.NUTRITION, PermissionsAccessType.READ)
-    private val readExerciseRoutesPermission =
-        HealthPermission.AdditionalPermission.READ_EXERCISE_ROUTES
-    private val readHistoryDataPermission =
-        HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY
-    private val readDataInBackgroundPermission =
-        HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND
-    private val readImmunization = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+    private val readExerciseRoutesPermission = AdditionalPermission.READ_EXERCISE_ROUTES
+    private val readHistoryDataPermission = AdditionalPermission.READ_HEALTH_DATA_HISTORY
+    private val readDataInBackgroundPermission = AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND
+    private val readImmunization = MedicalPermission(MedicalPermissionType.VACCINES)
+    private val readAllergies = MedicalPermission(MedicalPermissionType.ALLERGIES_INTOLERANCES)
     private val writeSleepPermission =
         FitnessPermission(FitnessPermissionType.SLEEP, PermissionsAccessType.WRITE)
     private val writeDistancePermission =
         FitnessPermission(FitnessPermissionType.DISTANCE, PermissionsAccessType.WRITE)
     private val writeMedicalData = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
 
-    @Captor lateinit var appDataCaptor: ArgumentCaptor<DeletionType.DeletionTypeAppData>
-    @Captor lateinit var timeFilterCaptor: ArgumentCaptor<TimeInstantRangeFilter>
+    @Captor lateinit var appDataCaptor: ArgumentCaptor<DeleteAppData>
 
     @Before
     fun setup() {
         MockitoAnnotations.initMocks(this)
         hiltRule.inject()
         Dispatchers.setMain(testDispatcher)
+        whenever(healthPermissionReader.getValidHealthPermissions(any())).thenCallRealMethod()
+        whenever(healthPermissionReader.maybeFilterOutAdditionalIfNotValid(any()))
+            .thenCallRealMethod()
         loadAppPermissionsStatusUseCase =
             LoadAppPermissionsStatusUseCase(
                 getGrantedHealthPermissionsUseCase,
@@ -127,12 +133,12 @@
                 grantPermissionsUseCase,
                 revokePermissionStatusUseCase,
                 revokeAllHealthPermissionsUseCase,
-                deleteAppDateUseCase,
+                deleteAppDataUseCase,
+                oldDeleteAppDataUseCase,
                 loadAccessDateUseCase,
                 getGrantedHealthPermissionsUseCase,
                 loadExerciseRoutePermissionUseCase,
                 healthPermissionReader,
-                featureUtils,
                 Dispatchers.Main,
             )
     }
@@ -151,7 +157,7 @@
     }
 
     @Test
-    fun whenPackageSupported_loadAllPermissions_fitnessOnly() = runTest {
+    fun whenPackageSupported_fitnessOnly_loadAllPermissions() = runTest {
         setupDeclaredAndGrantedFitnessPermissions()
 
         val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
@@ -216,7 +222,7 @@
     }
 
     @Test
-    fun whenPackageSupported_loadAllPermissions_fitnessAndMedical() = runTest {
+    fun whenPackageSupported_fitnessAndMedical_loadAllPermissions() = runTest {
         setupDeclaredAndGrantedFitnessAndMedicalPermissions()
         val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
         val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
@@ -281,10 +287,10 @@
     }
 
     @Test
-    fun whenPackageSupported_loadAllPermissions_medicalOnly() = runTest {
+    fun whenPackageSupported_medicalOnly_loadAllPermissions() = runTest {
         whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
-            .thenReturn(listOf(readImmunization, writeMedicalData))
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(listOf(readImmunization.toString(), writeMedicalData.toString()))
         getGrantedHealthPermissionsUseCase.updateData(
             TEST_APP_PACKAGE_NAME,
             listOf(writeMedicalData.toString()),
@@ -346,13 +352,13 @@
     @Test
     fun whenPackageNotSupported_fitnessOnly_loadOnlyGrantedPermissions() = runTest {
         whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(false)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
             .thenReturn(
                 listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    writeSleepPermission,
-                    writeDistancePermission,
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
                 )
             )
         getGrantedHealthPermissionsUseCase.updateData(
@@ -391,8 +397,8 @@
     @Test
     fun whenPackageNotSupported_medicalOnly_loadOnlyGrantedPermissions() = runTest {
         whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(false)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
-            .thenReturn(listOf(writeMedicalData, readImmunization))
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(listOf(writeMedicalData.toString(), readImmunization.toString()))
         getGrantedHealthPermissionsUseCase.updateData(
             TEST_APP_PACKAGE_NAME,
             listOf(writeMedicalData.toString()),
@@ -428,15 +434,15 @@
     @Test
     fun whenPackageNotSupported_fitnessAndMedical_loadOnlyGrantedPermissions() = runTest {
         whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(false)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
             .thenReturn(
                 listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    readImmunization,
-                    writeSleepPermission,
-                    writeDistancePermission,
-                    writeMedicalData,
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    readImmunization.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    writeMedicalData.toString(),
                 )
             )
         getGrantedHealthPermissionsUseCase.updateData(
@@ -552,153 +558,393 @@
     }
 
     @Test
-    fun updatePermissions_denyLastReadPermission_updatesAdditionalPermissions() = runTest {
-        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
-            .thenReturn(
-                listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    readExerciseRoutesPermission,
-                    readDataInBackgroundPermission,
-                    readHistoryDataPermission,
-                    writeSleepPermission,
-                    writeDistancePermission,
+    fun updatePermissions_denyLastReadFitnessPermission_noReadMedicalGranted_updatesAdditionalPermissions() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        readExerciseRoutesPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
                 )
-            )
-        getGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME,
-            listOf(
-                readNutritionPermission.toString(),
-                writeDistancePermission.toString(),
-                readExerciseRoutesPermission.additionalPermission,
-                readHistoryDataPermission.additionalPermission,
-                readDataInBackgroundPermission.additionalPermission,
-            ),
-        )
-
-        loadExerciseRoutePermissionUseCase.setExerciseRouteState(
-            ExerciseRouteState(
-                exerciseRoutePermissionState = PermissionUiState.ALWAYS_ALLOW,
-                exercisePermissionState = PermissionUiState.ALWAYS_ALLOW,
-            )
-        )
-
-        val appPermissionsObserver = TestObserver<List<FitnessPermission>>()
-        val grantedPermissionsObserver = TestObserver<Set<FitnessPermission>>()
-        appPermissionViewModel.fitnessPermissions.observeForever(appPermissionsObserver)
-        appPermissionViewModel.grantedFitnessPermissions.observeForever(grantedPermissionsObserver)
-
-        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
-        advanceUntilIdle()
-
-        val appPermissionsResult = appPermissionsObserver.getLastValue()
-        val grantedPermissionsResult = grantedPermissionsObserver.getLastValue()
-
-        assertThat(appPermissionsResult)
-            .containsExactlyElementsIn(
-                listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    writeSleepPermission,
-                    writeDistancePermission,
-                )
-            )
-        assertThat(grantedPermissionsResult)
-            .containsExactlyElementsIn(setOf(readNutritionPermission, writeDistancePermission))
-
-        val result =
-            appPermissionViewModel.updatePermission(
+            getGrantedHealthPermissionsUseCase.updateData(
                 TEST_APP_PACKAGE_NAME,
-                readNutritionPermission,
-                false,
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readExerciseRoutesPermission.additionalPermission,
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    writeMedicalData.toString(),
+                ),
             )
-        advanceUntilIdle()
 
-        assertThat(grantedPermissionsObserver.getLastValue())
-            .containsExactlyElementsIn(setOf(writeDistancePermission))
-        assertThat(result).isTrue()
-        verify(revokePermissionStatusUseCase)
-            .invoke(TEST_APP_PACKAGE_NAME, readExerciseRoutesPermission.additionalPermission)
-        verify(revokePermissionStatusUseCase)
-            .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.additionalPermission)
-        verify(revokePermissionStatusUseCase)
-            .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.additionalPermission)
-    }
+            loadExerciseRoutePermissionUseCase.setExerciseRouteState(
+                ExerciseRouteState(
+                    exerciseRoutePermissionState = PermissionUiState.ALWAYS_ALLOW,
+                    exercisePermissionState = PermissionUiState.ALWAYS_ALLOW,
+                )
+            )
+
+            val appPermissionsObserver = TestObserver<List<FitnessPermission>>()
+            val grantedPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+            appPermissionViewModel.fitnessPermissions.observeForever(appPermissionsObserver)
+            appPermissionViewModel.grantedFitnessPermissions.observeForever(
+                grantedPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val appPermissionsResult = appPermissionsObserver.getLastValue()
+            val grantedPermissionsResult = grantedPermissionsObserver.getLastValue()
+
+            assertThat(appPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(
+                        readExercisePermission,
+                        readNutritionPermission,
+                        writeSleepPermission,
+                        writeDistancePermission,
+                    )
+                )
+            assertThat(grantedPermissionsResult)
+                .containsExactlyElementsIn(setOf(readNutritionPermission, writeDistancePermission))
+
+            val result =
+                appPermissionViewModel.updatePermission(
+                    TEST_APP_PACKAGE_NAME,
+                    readNutritionPermission,
+                    false,
+                )
+            advanceUntilIdle()
+
+            assertThat(grantedPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(writeDistancePermission))
+            assertThat(result).isTrue()
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readExerciseRoutesPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.additionalPermission)
+        }
 
     @Test
-    fun updatePermissions_denyLastReadPermission_skipsERIfAlreadyAskEveryTime() = runTest {
-        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
-            .thenReturn(
-                listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    readExerciseRoutesPermission,
-                    readDataInBackgroundPermission,
-                    readHistoryDataPermission,
-                    writeSleepPermission,
-                    writeDistancePermission,
+    fun updatePermissions_denyLastReadFitnessPermission_noReadMedicalGranted_skipsERIfAlreadyAskEveryTime() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        readExerciseRoutesPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        writeMedicalData.toString(),
+                    )
                 )
-            )
-        getGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME,
-            listOf(
-                readExercisePermission.toString(),
-                writeDistancePermission.toString(),
-                readHistoryDataPermission.additionalPermission,
-                readDataInBackgroundPermission.additionalPermission,
-            ),
-        )
-
-        loadExerciseRoutePermissionUseCase.setExerciseRouteState(
-            ExerciseRouteState(
-                exerciseRoutePermissionState = PermissionUiState.ASK_EVERY_TIME,
-                exercisePermissionState = PermissionUiState.ALWAYS_ALLOW,
-            )
-        )
-
-        val appPermissionsObserver = TestObserver<List<FitnessPermission>>()
-        val grantedPermissionsObserver = TestObserver<Set<FitnessPermission>>()
-        appPermissionViewModel.fitnessPermissions.observeForever(appPermissionsObserver)
-        appPermissionViewModel.grantedFitnessPermissions.observeForever(grantedPermissionsObserver)
-
-        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
-        advanceUntilIdle()
-
-        val appPermissionsResult = appPermissionsObserver.getLastValue()
-        val grantedPermissionsResult = grantedPermissionsObserver.getLastValue()
-
-        assertThat(appPermissionsResult)
-            .containsExactlyElementsIn(
-                listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    writeSleepPermission,
-                    writeDistancePermission,
-                )
-            )
-        assertThat(grantedPermissionsResult)
-            .containsExactlyElementsIn(setOf(readExercisePermission, writeDistancePermission))
-
-        val result =
-            appPermissionViewModel.updatePermission(
+            getGrantedHealthPermissionsUseCase.updateData(
                 TEST_APP_PACKAGE_NAME,
-                readExercisePermission,
-                false,
+                listOf(
+                    readExercisePermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    writeMedicalData.toString(),
+                ),
             )
-        advanceUntilIdle()
 
-        assertThat(grantedPermissionsObserver.getLastValue())
-            .containsExactlyElementsIn(setOf(writeDistancePermission))
-        assertThat(result).isTrue()
-        verify(revokePermissionStatusUseCase, times(0))
-            .invoke(TEST_APP_PACKAGE_NAME, readExerciseRoutesPermission.additionalPermission)
-        verify(revokePermissionStatusUseCase)
-            .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.additionalPermission)
-        verify(revokePermissionStatusUseCase)
-            .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.additionalPermission)
-    }
+            loadExerciseRoutePermissionUseCase.setExerciseRouteState(
+                ExerciseRouteState(
+                    exerciseRoutePermissionState = PermissionUiState.ASK_EVERY_TIME,
+                    exercisePermissionState = PermissionUiState.ALWAYS_ALLOW,
+                )
+            )
+
+            val appPermissionsObserver = TestObserver<List<FitnessPermission>>()
+            val grantedPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+            appPermissionViewModel.fitnessPermissions.observeForever(appPermissionsObserver)
+            appPermissionViewModel.grantedFitnessPermissions.observeForever(
+                grantedPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val appPermissionsResult = appPermissionsObserver.getLastValue()
+            val grantedPermissionsResult = grantedPermissionsObserver.getLastValue()
+
+            assertThat(appPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(
+                        readExercisePermission,
+                        readNutritionPermission,
+                        writeSleepPermission,
+                        writeDistancePermission,
+                    )
+                )
+            assertThat(grantedPermissionsResult)
+                .containsExactlyElementsIn(setOf(readExercisePermission, writeDistancePermission))
+
+            val result =
+                appPermissionViewModel.updatePermission(
+                    TEST_APP_PACKAGE_NAME,
+                    readExercisePermission,
+                    false,
+                )
+            advanceUntilIdle()
+
+            assertThat(grantedPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(writeDistancePermission))
+            assertThat(result).isTrue()
+            verify(revokePermissionStatusUseCase, times(0))
+                .invoke(TEST_APP_PACKAGE_NAME, readExerciseRoutesPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.additionalPermission)
+        }
+
+    @Test
+    fun updatePermissions_denyLastReadFitnessPermission_withMedicalGranted_doesNotUpdateAdditionalPermissions() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        readExerciseRoutesPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readExerciseRoutesPermission.additionalPermission,
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            loadExerciseRoutePermissionUseCase.setExerciseRouteState(
+                ExerciseRouteState(
+                    exerciseRoutePermissionState = PermissionUiState.ALWAYS_ALLOW,
+                    exercisePermissionState = PermissionUiState.ALWAYS_ALLOW,
+                )
+            )
+
+            val appPermissionsObserver = TestObserver<List<FitnessPermission>>()
+            val grantedPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+            appPermissionViewModel.fitnessPermissions.observeForever(appPermissionsObserver)
+            appPermissionViewModel.grantedFitnessPermissions.observeForever(
+                grantedPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val appPermissionsResult = appPermissionsObserver.getLastValue()
+            val grantedPermissionsResult = grantedPermissionsObserver.getLastValue()
+
+            assertThat(appPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(
+                        readExercisePermission,
+                        readNutritionPermission,
+                        writeSleepPermission,
+                        writeDistancePermission,
+                    )
+                )
+            assertThat(grantedPermissionsResult)
+                .containsExactlyElementsIn(setOf(readNutritionPermission, writeDistancePermission))
+
+            val result =
+                appPermissionViewModel.updatePermission(
+                    TEST_APP_PACKAGE_NAME,
+                    readNutritionPermission,
+                    false,
+                )
+            advanceUntilIdle()
+
+            assertThat(grantedPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(writeDistancePermission))
+            assertThat(result).isTrue()
+            verify(revokePermissionStatusUseCase, never())
+                .invoke(TEST_APP_PACKAGE_NAME, readExerciseRoutesPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase, never())
+                .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase, never())
+                .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.additionalPermission)
+        }
+
+    @Test
+    fun updatePermissions_denyLastReadMedicalPermission_noReadFitnessGranted_updatesAdditionalPermissions() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        readExerciseRoutesPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    writeSleepPermission.toString(),
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            loadExerciseRoutePermissionUseCase.setExerciseRouteState(
+                ExerciseRouteState(
+                    exerciseRoutePermissionState = PermissionUiState.ASK_EVERY_TIME,
+                    exercisePermissionState = PermissionUiState.ASK_EVERY_TIME,
+                )
+            )
+
+            val appPermissionsObserver = TestObserver<List<MedicalPermission>>()
+            val grantedPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+            appPermissionViewModel.medicalPermissions.observeForever(appPermissionsObserver)
+            appPermissionViewModel.grantedMedicalPermissions.observeForever(
+                grantedPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val appPermissionsResult = appPermissionsObserver.getLastValue()
+            val grantedPermissionsResult = grantedPermissionsObserver.getLastValue()
+
+            assertThat(appPermissionsResult)
+                .containsExactlyElementsIn(listOf(readImmunization, writeMedicalData))
+            assertThat(grantedPermissionsResult)
+                .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+            val result =
+                appPermissionViewModel.updatePermission(
+                    TEST_APP_PACKAGE_NAME,
+                    readImmunization,
+                    false,
+                )
+            advanceUntilIdle()
+
+            assertThat(grantedPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(writeMedicalData))
+            assertThat(result).isTrue()
+            verify(revokePermissionStatusUseCase, never())
+                .invoke(TEST_APP_PACKAGE_NAME, readExerciseRoutesPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.additionalPermission)
+        }
+
+    @Test
+    fun updatePermissions_denyLastReadMedicalPermission_withFitnessGranted_doesNotUpdateAdditionalPermissions() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        readExerciseRoutesPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            loadExerciseRoutePermissionUseCase.setExerciseRouteState(
+                ExerciseRouteState(
+                    exerciseRoutePermissionState = PermissionUiState.ASK_EVERY_TIME,
+                    exercisePermissionState = PermissionUiState.ASK_EVERY_TIME,
+                )
+            )
+
+            val appPermissionsObserver = TestObserver<List<MedicalPermission>>()
+            val grantedPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+            appPermissionViewModel.medicalPermissions.observeForever(appPermissionsObserver)
+            appPermissionViewModel.grantedMedicalPermissions.observeForever(
+                grantedPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val appPermissionsResult = appPermissionsObserver.getLastValue()
+            val grantedPermissionsResult = grantedPermissionsObserver.getLastValue()
+
+            assertThat(appPermissionsResult)
+                .containsExactlyElementsIn(listOf(readImmunization, writeMedicalData))
+            assertThat(grantedPermissionsResult)
+                .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+            val result =
+                appPermissionViewModel.updatePermission(
+                    TEST_APP_PACKAGE_NAME,
+                    readImmunization,
+                    false,
+                )
+            advanceUntilIdle()
+
+            assertThat(grantedPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(writeMedicalData))
+            assertThat(result).isTrue()
+            verify(revokePermissionStatusUseCase, never())
+                .invoke(TEST_APP_PACKAGE_NAME, readExerciseRoutesPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase, never())
+                .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.additionalPermission)
+            verify(revokePermissionStatusUseCase, never())
+                .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.additionalPermission)
+        }
 
     @Test
     fun updatePermissions_deny_whenUnsuccessful_returnsFalse() = runTest {
@@ -944,7 +1190,6 @@
         appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
-        val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
         val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
         val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
         val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
@@ -969,7 +1214,7 @@
 
     @Test
     @Ignore("b/379884589")
-    fun revokeAllPermissions_fitnessPermissionsDeclaredOnly_revokesFitness() = runTest {
+    fun revokeAllPermissions_fitnessOnly_revokesFitness() = runTest {
         setupDeclaredAndGrantedFitnessPermissions()
         val appPermissionsObserver = TestObserver<List<FitnessPermission>>()
         val grantedPermissionsObserver = TestObserver<Set<FitnessPermission>>()
@@ -1001,41 +1246,127 @@
 
     @Test
     @Ignore("b/379884589")
-    fun revokeAllPermissions_fitnessAndMedical_revokesBoth() = runTest {
-        setupDeclaredAndGrantedFitnessAndMedicalPermissions()
-        val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+    fun revokeAllPermissions_fitnessAndAdditional_revokesFitnessAndAdditional() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    readExerciseRoutesPermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                writeSleepPermission.toString(),
+                readHistoryDataPermission.additionalPermission,
+                readDataInBackgroundPermission.additionalPermission,
+            ),
+        )
+
+        loadExerciseRoutePermissionUseCase.setExerciseRouteState(
+            ExerciseRouteState(
+                exerciseRoutePermissionState = PermissionUiState.ASK_EVERY_TIME,
+                exercisePermissionState = PermissionUiState.ASK_EVERY_TIME,
+            )
+        )
+
+        val appPermissionsObserver = TestObserver<List<FitnessPermission>>()
+        val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
         val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
-        val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
-        val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
-        appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+        appPermissionViewModel.fitnessPermissions.observeForever(appPermissionsObserver)
+        appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+            grantedAdditionalPermissionsObserver
+        )
         appPermissionViewModel.grantedFitnessPermissions.observeForever(
             grantedFitnessPermissionsObserver
         )
-        appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
-        appPermissionViewModel.grantedMedicalPermissions.observeForever(
-            grantedMedicalPermissionsObserver
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val appPermissionsResult = appPermissionsObserver.getLastValue()
+        val grantedAdditionalPermissionsResult = grantedAdditionalPermissionsObserver.getLastValue()
+        val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+        assertThat(appPermissionsResult)
+            .containsExactlyElementsIn(
+                listOf(
+                    readExercisePermission,
+                    readNutritionPermission,
+                    writeSleepPermission,
+                    writeDistancePermission,
+                )
+            )
+        assertThat(grantedAdditionalPermissionsResult)
+            .containsExactlyElementsIn(
+                setOf(readDataInBackgroundPermission, readHistoryDataPermission)
+            )
+        assertThat(grantedFitnessPermissionsResult)
+            .containsExactlyElementsIn(setOf(writeSleepPermission))
+
+        val result = appPermissionViewModel.revokeAllHealthPermissions(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+        assertThat(grantedFitnessPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(result).isTrue()
+    }
+
+    @Test
+    @Ignore("b/379884589")
+    fun revokeAllPermissions_fitnessAndMedical_revokesFitnessAndMedical() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readExercisePermission.toString(),
+                writeSleepPermission.toString(),
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
         )
 
-        val atLeastOneFitnessPermissionGrantedObserver = TestObserver<Boolean>()
-        val atLeastOneMedicalPermissionGrantedObserver = TestObserver<Boolean>()
-        val atLeastOneHealthPermissionGrantedObserver = TestObserver<Boolean>()
-        appPermissionViewModel.atLeastOneFitnessPermissionGranted.observeForever(
-            atLeastOneFitnessPermissionGrantedObserver
+        val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+        val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+        val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+        val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+        val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+        appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+        appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+        appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+            grantedAdditionalPermissionsObserver
         )
-        appPermissionViewModel.atLeastOneMedicalPermissionGranted.observeForever(
-            atLeastOneMedicalPermissionGrantedObserver
+        appPermissionViewModel.grantedFitnessPermissions.observeForever(
+            grantedFitnessPermissionsObserver
         )
-        appPermissionViewModel.atLeastOneHealthPermissionGranted.observeForever(
-            atLeastOneHealthPermissionGrantedObserver
+        appPermissionViewModel.grantedMedicalPermissions.observeForever(
+            grantedMedicalPermissionsObserver
         )
 
         appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
 
         val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
-        val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
         val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+        val grantedAdditionalPermissionsResult = grantedAdditionalPermissionsObserver.getLastValue()
+        val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
         val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
         assertThat(fitnessPermissionsResult)
             .containsExactlyElementsIn(
                 listOf(
@@ -1045,47 +1376,161 @@
                     writeDistancePermission,
                 )
             )
-        assertThat(grantedFitnessPermissionsResult)
-            .containsExactlyElementsIn(setOf(readExercisePermission))
         assertThat(medicalPermissionsResult)
             .containsExactlyElementsIn(listOf(readImmunization, writeMedicalData))
+
+        assertThat(grantedAdditionalPermissionsResult).isEmpty()
+
+        assertThat(grantedFitnessPermissionsResult)
+            .containsExactlyElementsIn(setOf(readExercisePermission, writeSleepPermission))
         assertThat(grantedMedicalPermissionsResult)
-            .containsExactlyElementsIn(setOf(readImmunization))
+            .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
 
         val result = appPermissionViewModel.revokeAllHealthPermissions(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
-
-        val atLeastOneFitnessPermissionGrantedResult =
-            atLeastOneFitnessPermissionGrantedObserver.getLastValue()
-        val atLeastOneMedicalPermissionGrantedResult =
-            atLeastOneMedicalPermissionGrantedObserver.getLastValue()
-        val atLeastOneHealthPermissionGrantedResult =
-            atLeastOneHealthPermissionGrantedObserver.getLastValue()
-
         assertThat(grantedFitnessPermissionsObserver.getLastValue()).isEmpty()
         assertThat(grantedMedicalPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
         assertThat(result).isTrue()
-
-        assertThat(atLeastOneFitnessPermissionGrantedResult).isFalse()
-        assertThat(atLeastOneMedicalPermissionGrantedResult).isFalse()
-        assertThat(atLeastOneHealthPermissionGrantedResult).isFalse()
     }
 
     @Test
     @Ignore("b/379884589")
-    fun revokeAllFitnessPermissions_fitnessAndMedical_revokesFitnessOnly() = runTest {
-        setupDeclaredAndGrantedFitnessAndMedicalPermissions()
-        val fitnessObserver = TestObserver<List<FitnessPermission>>()
-        val grantedFitnessObserver = TestObserver<Set<FitnessPermission>>()
-        val medicalObserver = TestObserver<List<MedicalPermission>>()
-        val grantedMedicalObserver = TestObserver<Set<MedicalPermission>>()
-        appPermissionViewModel.fitnessPermissions.observeForever(fitnessObserver)
-        appPermissionViewModel.grantedFitnessPermissions.observeForever(grantedFitnessObserver)
-        appPermissionViewModel.medicalPermissions.observeForever(medicalObserver)
-        appPermissionViewModel.grantedMedicalPermissions.observeForever(grantedMedicalObserver)
+    fun revokeAllPermissions_fitnessAndMedicalAndAdditional_revokesFitnessAndMedicalAndAdditional() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        readExerciseRoutesPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readExercisePermission.toString(),
+                    writeSleepPermission.toString(),
+                    readExerciseRoutesPermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+            val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+            val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+            val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+            val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+            appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+            appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+            appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+                grantedAdditionalPermissionsObserver
+            )
+            appPermissionViewModel.grantedFitnessPermissions.observeForever(
+                grantedFitnessPermissionsObserver
+            )
+            appPermissionViewModel.grantedMedicalPermissions.observeForever(
+                grantedMedicalPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+            val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+            val grantedAdditionalPermissionsResult =
+                grantedAdditionalPermissionsObserver.getLastValue()
+            val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+            val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+            assertThat(fitnessPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(
+                        readExercisePermission,
+                        readNutritionPermission,
+                        writeSleepPermission,
+                        writeDistancePermission,
+                    )
+                )
+            assertThat(medicalPermissionsResult)
+                .containsExactlyElementsIn(listOf(readImmunization, writeMedicalData))
+
+            assertThat(grantedAdditionalPermissionsResult)
+                .containsExactlyElementsIn(
+                    setOf(
+                        readExerciseRoutesPermission,
+                        readDataInBackgroundPermission,
+                        readHistoryDataPermission,
+                    )
+                )
+
+            assertThat(grantedFitnessPermissionsResult)
+                .containsExactlyElementsIn(setOf(readExercisePermission, writeSleepPermission))
+            assertThat(grantedMedicalPermissionsResult)
+                .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+            val result = appPermissionViewModel.revokeAllHealthPermissions(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+            assertThat(grantedFitnessPermissionsObserver.getLastValue()).isEmpty()
+            assertThat(grantedMedicalPermissionsObserver.getLastValue()).isEmpty()
+            assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
+            assertThat(result).isTrue()
+        }
+
+    @Test
+    fun revokeAllFitness_fitnessOnly_revokesFitnessOnly() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(readExercisePermission.toString(), writeSleepPermission.toString()),
+        )
+
+        val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+        val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+        val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+        val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+        val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+        appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+        appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+        appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+            grantedAdditionalPermissionsObserver
+        )
+        appPermissionViewModel.grantedFitnessPermissions.observeForever(
+            grantedFitnessPermissionsObserver
+        )
+        appPermissionViewModel.grantedMedicalPermissions.observeForever(
+            grantedMedicalPermissionsObserver
+        )
+
         appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
-        assertThat(fitnessObserver.getLastValue())
+
+        val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+        val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+        val grantedAdditionalPermissionsResult = grantedAdditionalPermissionsObserver.getLastValue()
+        val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+        val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+        assertThat(fitnessPermissionsResult)
             .containsExactlyElementsIn(
                 listOf(
                     readExercisePermission,
@@ -1094,37 +1539,86 @@
                     writeDistancePermission,
                 )
             )
-        assertThat(grantedFitnessObserver.getLastValue())
-            .containsExactlyElementsIn(setOf(readExercisePermission))
-        assertThat(medicalObserver.getLastValue())
-            .containsExactlyElementsIn(listOf(readImmunization, writeMedicalData))
-        assertThat(grantedMedicalObserver.getLastValue())
-            .containsExactlyElementsIn(setOf(readImmunization))
+        assertThat(medicalPermissionsResult).isEmpty()
 
-        val result = appPermissionViewModel.revokeAllFitnessPermissions(TEST_APP_PACKAGE_NAME)
+        assertThat(grantedAdditionalPermissionsResult).isEmpty()
 
+        assertThat(grantedFitnessPermissionsResult)
+            .containsExactlyElementsIn(setOf(readExercisePermission, writeSleepPermission))
+        assertThat(grantedMedicalPermissionsResult).isEmpty()
+
+        val result =
+            appPermissionViewModel.revokeAllFitnessAndMaybeAdditionalPermissions(
+                TEST_APP_PACKAGE_NAME
+            )
         advanceUntilIdle()
+        assertThat(grantedFitnessPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(grantedMedicalPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
+        // we revoke all declared permissions
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, readExercisePermission.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, readNutritionPermission.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, writeSleepPermission.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, writeDistancePermission.toString())
+        verifyNoMoreInteractions(revokePermissionStatusUseCase)
         assertThat(result).isTrue()
-        assertThat(grantedFitnessObserver.getLastValue()).isEmpty()
-        assertThat(grantedMedicalObserver.getLastValue())
-            .containsExactlyElementsIn(setOf(readImmunization))
     }
 
     @Test
-    @Ignore("b/379884589")
-    fun revokeAllMedicalPermissions_fitnessAndMedical_revokesMedicalOnly() = runTest {
-        setupDeclaredAndGrantedFitnessAndMedicalPermissions()
-        val fitnessObserver = TestObserver<List<FitnessPermission>>()
-        val grantedFitnessObserver = TestObserver<Set<FitnessPermission>>()
-        val medicalObserver = TestObserver<List<MedicalPermission>>()
-        val grantedMedicalObserver = TestObserver<Set<MedicalPermission>>()
-        appPermissionViewModel.fitnessPermissions.observeForever(fitnessObserver)
-        appPermissionViewModel.grantedFitnessPermissions.observeForever(grantedFitnessObserver)
-        appPermissionViewModel.medicalPermissions.observeForever(medicalObserver)
-        appPermissionViewModel.grantedMedicalPermissions.observeForever(grantedMedicalObserver)
+    fun revokeAllFitness_fitnessAndMedical_revokesFitnessOnly() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readExercisePermission.toString(),
+                writeSleepPermission.toString(),
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+        val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+        val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+        val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+        val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+        appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+        appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+        appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+            grantedAdditionalPermissionsObserver
+        )
+        appPermissionViewModel.grantedFitnessPermissions.observeForever(
+            grantedFitnessPermissionsObserver
+        )
+        appPermissionViewModel.grantedMedicalPermissions.observeForever(
+            grantedMedicalPermissionsObserver
+        )
+
         appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
         advanceUntilIdle()
-        assertThat(fitnessObserver.getLastValue())
+
+        val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+        val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+        val grantedAdditionalPermissionsResult = grantedAdditionalPermissionsObserver.getLastValue()
+        val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+        val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+        assertThat(fitnessPermissionsResult)
             .containsExactlyElementsIn(
                 listOf(
                     readExercisePermission,
@@ -1133,22 +1627,596 @@
                     writeDistancePermission,
                 )
             )
-        assertThat(grantedFitnessObserver.getLastValue())
-            .containsExactlyElementsIn(setOf(readExercisePermission))
-        assertThat(medicalObserver.getLastValue())
+        assertThat(medicalPermissionsResult)
             .containsExactlyElementsIn(listOf(readImmunization, writeMedicalData))
-        assertThat(grantedMedicalObserver.getLastValue())
-            .containsExactlyElementsIn(setOf(readImmunization))
 
-        val result = appPermissionViewModel.revokeAllMedicalPermissions(TEST_APP_PACKAGE_NAME)
+        assertThat(grantedAdditionalPermissionsResult).isEmpty()
 
+        assertThat(grantedFitnessPermissionsResult)
+            .containsExactlyElementsIn(setOf(readExercisePermission, writeSleepPermission))
+        assertThat(grantedMedicalPermissionsResult)
+            .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+        val result =
+            appPermissionViewModel.revokeAllFitnessAndMaybeAdditionalPermissions(
+                TEST_APP_PACKAGE_NAME
+            )
         advanceUntilIdle()
+        assertThat(grantedFitnessPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(grantedMedicalPermissionsObserver.getLastValue())
+            .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+        assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
+        // we revoke all declared permissions
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, readExercisePermission.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, readNutritionPermission.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, writeSleepPermission.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, writeDistancePermission.toString())
+        verifyNoMoreInteractions(revokePermissionStatusUseCase)
         assertThat(result).isTrue()
-        assertThat(grantedFitnessObserver.getLastValue())
-            .containsExactlyElementsIn(setOf(readExercisePermission))
-        assertThat(grantedMedicalObserver.getLastValue()).isEmpty()
     }
 
+    @Test
+    fun revokeAllFitness_fitnessAndMedicalAndAdditional_medicalReadGranted_revokesFitnessOnly() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readExercisePermission.toString(),
+                    writeSleepPermission.toString(),
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+            val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+            val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+            val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+            val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+            appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+            appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+            appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+                grantedAdditionalPermissionsObserver
+            )
+            appPermissionViewModel.grantedFitnessPermissions.observeForever(
+                grantedFitnessPermissionsObserver
+            )
+            appPermissionViewModel.grantedMedicalPermissions.observeForever(
+                grantedMedicalPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+            val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+            val grantedAdditionalPermissionsResult =
+                grantedAdditionalPermissionsObserver.getLastValue()
+            val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+            val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+            assertThat(fitnessPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(
+                        readExercisePermission,
+                        readNutritionPermission,
+                        writeSleepPermission,
+                        writeDistancePermission,
+                    )
+                )
+            assertThat(medicalPermissionsResult)
+                .containsExactlyElementsIn(listOf(readImmunization, writeMedicalData))
+
+            assertThat(grantedAdditionalPermissionsResult)
+                .containsExactlyElementsIn(
+                    setOf(readDataInBackgroundPermission, readHistoryDataPermission)
+                )
+
+            assertThat(grantedFitnessPermissionsResult)
+                .containsExactlyElementsIn(setOf(readExercisePermission, writeSleepPermission))
+            assertThat(grantedMedicalPermissionsResult)
+                .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+            val result =
+                appPermissionViewModel.revokeAllFitnessAndMaybeAdditionalPermissions(
+                    TEST_APP_PACKAGE_NAME
+                )
+            advanceUntilIdle()
+            assertThat(grantedFitnessPermissionsObserver.getLastValue()).isEmpty()
+            assertThat(grantedMedicalPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+            assertThat(grantedAdditionalPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(
+                    setOf(readDataInBackgroundPermission, readHistoryDataPermission)
+                )
+            // we revoke all declared fitness permissions
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readExercisePermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readNutritionPermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, writeSleepPermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, writeDistancePermission.toString())
+            verifyNoMoreInteractions(revokePermissionStatusUseCase)
+            assertThat(result).isTrue()
+        }
+
+    @Test
+    fun revokeAllFitness_fitnessAndMedicalAndAdditional_medicalNotGranted_revokesFitnessAndAdditional() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readExercisePermission.toString(),
+                    writeSleepPermission.toString(),
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+            val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+            val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+            val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+            val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+            appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+            appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+            appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+                grantedAdditionalPermissionsObserver
+            )
+            appPermissionViewModel.grantedFitnessPermissions.observeForever(
+                grantedFitnessPermissionsObserver
+            )
+            appPermissionViewModel.grantedMedicalPermissions.observeForever(
+                grantedMedicalPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+            val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+            val grantedAdditionalPermissionsResult =
+                grantedAdditionalPermissionsObserver.getLastValue()
+            val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+            val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+            assertThat(fitnessPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(
+                        readExercisePermission,
+                        readNutritionPermission,
+                        writeSleepPermission,
+                        writeDistancePermission,
+                    )
+                )
+            assertThat(medicalPermissionsResult)
+                .containsExactlyElementsIn(listOf(readImmunization, writeMedicalData))
+
+            assertThat(grantedAdditionalPermissionsResult)
+                .containsExactlyElementsIn(
+                    setOf(readDataInBackgroundPermission, readHistoryDataPermission)
+                )
+
+            assertThat(grantedFitnessPermissionsResult)
+                .containsExactlyElementsIn(setOf(readExercisePermission, writeSleepPermission))
+            assertThat(grantedMedicalPermissionsResult)
+                .containsExactlyElementsIn(setOf(writeMedicalData))
+
+            val result =
+                appPermissionViewModel.revokeAllFitnessAndMaybeAdditionalPermissions(
+                    TEST_APP_PACKAGE_NAME
+                )
+            advanceUntilIdle()
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, writeDistancePermission.toString())
+            assertThat(grantedFitnessPermissionsObserver.getLastValue()).isEmpty()
+            assertThat(grantedMedicalPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(writeMedicalData))
+            assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
+            // we revoke all declared fitness permissions
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readExercisePermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readNutritionPermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, writeSleepPermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, writeDistancePermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.toString())
+            verifyNoMoreInteractions(revokePermissionStatusUseCase)
+            assertThat(result).isTrue()
+        }
+
+    @Test
+    fun revokeAllMedical_medicalOnly_revokesMedicalOnly() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readAllergies.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(readImmunization.toString(), writeMedicalData.toString()),
+        )
+
+        val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+        val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+        val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+        val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+        val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+        appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+        appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+        appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+            grantedAdditionalPermissionsObserver
+        )
+        appPermissionViewModel.grantedFitnessPermissions.observeForever(
+            grantedFitnessPermissionsObserver
+        )
+        appPermissionViewModel.grantedMedicalPermissions.observeForever(
+            grantedMedicalPermissionsObserver
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+        val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+        val grantedAdditionalPermissionsResult = grantedAdditionalPermissionsObserver.getLastValue()
+        val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+        val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+        assertThat(fitnessPermissionsResult).isEmpty()
+        assertThat(medicalPermissionsResult)
+            .containsExactlyElementsIn(listOf(readAllergies, readImmunization, writeMedicalData))
+
+        assertThat(grantedAdditionalPermissionsResult).isEmpty()
+
+        assertThat(grantedFitnessPermissionsResult).isEmpty()
+        assertThat(grantedMedicalPermissionsResult)
+            .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+        val result =
+            appPermissionViewModel.revokeAllMedicalAndMaybeAdditionalPermissions(
+                TEST_APP_PACKAGE_NAME
+            )
+        advanceUntilIdle()
+        assertThat(grantedFitnessPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(grantedMedicalPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
+        // we revoke all declared medical permissions
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, readAllergies.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, readImmunization.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, writeMedicalData.toString())
+        verifyNoMoreInteractions(revokePermissionStatusUseCase)
+        assertThat(result).isTrue()
+    }
+
+    @Test
+    fun revokeAllMedical_fitnessAndMedical_revokesMedicalOnly() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    readAllergies.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readNutritionPermission.toString(),
+                writeSleepPermission.toString(),
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+        val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+        val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+        val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+        val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+        appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+        appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+        appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+            grantedAdditionalPermissionsObserver
+        )
+        appPermissionViewModel.grantedFitnessPermissions.observeForever(
+            grantedFitnessPermissionsObserver
+        )
+        appPermissionViewModel.grantedMedicalPermissions.observeForever(
+            grantedMedicalPermissionsObserver
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+        val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+        val grantedAdditionalPermissionsResult = grantedAdditionalPermissionsObserver.getLastValue()
+        val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+        val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+        assertThat(fitnessPermissionsResult)
+            .containsExactlyElementsIn(listOf(readNutritionPermission, writeSleepPermission))
+        assertThat(medicalPermissionsResult)
+            .containsExactlyElementsIn(listOf(readAllergies, readImmunization, writeMedicalData))
+
+        assertThat(grantedAdditionalPermissionsResult).isEmpty()
+
+        assertThat(grantedFitnessPermissionsResult)
+            .containsExactlyElementsIn(setOf(readNutritionPermission, writeSleepPermission))
+        assertThat(grantedMedicalPermissionsResult)
+            .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+        val result =
+            appPermissionViewModel.revokeAllMedicalAndMaybeAdditionalPermissions(
+                TEST_APP_PACKAGE_NAME
+            )
+        advanceUntilIdle()
+        assertThat(grantedFitnessPermissionsObserver.getLastValue())
+            .containsExactlyElementsIn(setOf(readNutritionPermission, writeSleepPermission))
+        assertThat(grantedMedicalPermissionsObserver.getLastValue()).isEmpty()
+        assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
+        // we revoke all declared medical permissions
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, readAllergies.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, readImmunization.toString())
+        verify(revokePermissionStatusUseCase)
+            .invoke(TEST_APP_PACKAGE_NAME, writeMedicalData.toString())
+        verifyNoMoreInteractions(revokePermissionStatusUseCase)
+        assertThat(result).isTrue()
+    }
+
+    @Test
+    fun revokeAllMedical_fitnessAndMedicalAndAdditional_fitnessGranted_revokesMedicalOnly() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        readExerciseRoutesPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readAllergies.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                ),
+            )
+
+            val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+            val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+            val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+            val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+            val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+            appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+            appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+            appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+                grantedAdditionalPermissionsObserver
+            )
+            appPermissionViewModel.grantedFitnessPermissions.observeForever(
+                grantedFitnessPermissionsObserver
+            )
+            appPermissionViewModel.grantedMedicalPermissions.observeForever(
+                grantedMedicalPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+            val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+            val grantedAdditionalPermissionsResult =
+                grantedAdditionalPermissionsObserver.getLastValue()
+            val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+            val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+            assertThat(fitnessPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(readExercisePermission, readNutritionPermission, writeSleepPermission)
+                )
+            assertThat(medicalPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(readAllergies, readImmunization, writeMedicalData)
+                )
+
+            assertThat(grantedAdditionalPermissionsResult)
+                .containsExactlyElementsIn(
+                    setOf(readDataInBackgroundPermission, readHistoryDataPermission)
+                )
+
+            assertThat(grantedFitnessPermissionsResult)
+                .containsExactlyElementsIn(setOf(readNutritionPermission, writeSleepPermission))
+            assertThat(grantedMedicalPermissionsResult)
+                .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+            val result =
+                appPermissionViewModel.revokeAllMedicalAndMaybeAdditionalPermissions(
+                    TEST_APP_PACKAGE_NAME
+                )
+            advanceUntilIdle()
+            assertThat(grantedFitnessPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(readNutritionPermission, writeSleepPermission))
+            assertThat(grantedMedicalPermissionsObserver.getLastValue()).isEmpty()
+            assertThat(grantedAdditionalPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(
+                    setOf(readDataInBackgroundPermission, readHistoryDataPermission)
+                )
+            // we revoke all declared medical permissions
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readAllergies.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readImmunization.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, writeMedicalData.toString())
+            verifyNoMoreInteractions(revokePermissionStatusUseCase)
+            assertThat(result).isTrue()
+        }
+
+    @Test
+    fun revokeAllMedical_fitnessAndMedicalAndAdditional_fitnessReadNotGranted_revokesMedicalAndAdditional() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        readExerciseRoutesPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readAllergies.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    writeSleepPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                ),
+            )
+
+            val fitnessPermissionsObserver = TestObserver<List<FitnessPermission>>()
+            val medicalPermissionsObserver = TestObserver<List<MedicalPermission>>()
+            val grantedAdditionalPermissionsObserver = TestObserver<Set<AdditionalPermission>>()
+            val grantedFitnessPermissionsObserver = TestObserver<Set<FitnessPermission>>()
+            val grantedMedicalPermissionsObserver = TestObserver<Set<MedicalPermission>>()
+            appPermissionViewModel.fitnessPermissions.observeForever(fitnessPermissionsObserver)
+            appPermissionViewModel.medicalPermissions.observeForever(medicalPermissionsObserver)
+            appPermissionViewModel.grantedAdditionalPermissions.observeForever(
+                grantedAdditionalPermissionsObserver
+            )
+            appPermissionViewModel.grantedFitnessPermissions.observeForever(
+                grantedFitnessPermissionsObserver
+            )
+            appPermissionViewModel.grantedMedicalPermissions.observeForever(
+                grantedMedicalPermissionsObserver
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val fitnessPermissionsResult = fitnessPermissionsObserver.getLastValue()
+            val medicalPermissionsResult = medicalPermissionsObserver.getLastValue()
+            val grantedAdditionalPermissionsResult =
+                grantedAdditionalPermissionsObserver.getLastValue()
+            val grantedFitnessPermissionsResult = grantedFitnessPermissionsObserver.getLastValue()
+            val grantedMedicalPermissionsResult = grantedMedicalPermissionsObserver.getLastValue()
+
+            assertThat(fitnessPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(readExercisePermission, readNutritionPermission, writeSleepPermission)
+                )
+            assertThat(medicalPermissionsResult)
+                .containsExactlyElementsIn(
+                    listOf(readAllergies, readImmunization, writeMedicalData)
+                )
+
+            assertThat(grantedAdditionalPermissionsResult)
+                .containsExactlyElementsIn(
+                    setOf(readDataInBackgroundPermission, readHistoryDataPermission)
+                )
+
+            assertThat(grantedFitnessPermissionsResult)
+                .containsExactlyElementsIn(setOf(writeSleepPermission))
+            assertThat(grantedMedicalPermissionsResult)
+                .containsExactlyElementsIn(setOf(readImmunization, writeMedicalData))
+
+            val result =
+                appPermissionViewModel.revokeAllMedicalAndMaybeAdditionalPermissions(
+                    TEST_APP_PACKAGE_NAME
+                )
+            advanceUntilIdle()
+            assertThat(grantedFitnessPermissionsObserver.getLastValue())
+                .containsExactlyElementsIn(setOf(writeSleepPermission))
+            assertThat(grantedMedicalPermissionsObserver.getLastValue()).isEmpty()
+            assertThat(grantedAdditionalPermissionsObserver.getLastValue()).isEmpty()
+            // we revoke all declared medical permissions
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readAllergies.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readImmunization.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, writeMedicalData.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readDataInBackgroundPermission.toString())
+            verify(revokePermissionStatusUseCase)
+                .invoke(TEST_APP_PACKAGE_NAME, readHistoryDataPermission.toString())
+            verifyNoMoreInteractions(revokePermissionStatusUseCase)
+            assertThat(result).isTrue()
+        }
+
     // TODO (b/324247426) unignore when we can mock suspend functions
     @Test
     @Ignore
@@ -1156,19 +2224,19 @@
         appPermissionViewModel.deleteAppData(TEST_APP_PACKAGE_NAME, TEST_APP_NAME)
         advanceUntilIdle()
 
-        verify(deleteAppDateUseCase).invoke(appDataCaptor.capture(), timeFilterCaptor.capture())
+        verify(deleteAppDataUseCase).invoke(appDataCaptor.capture())
     }
 
     @Test
     fun shouldNavigateToFragment_whenPackageNameSupported_returnsTrue() = runTest {
         whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
             .thenReturn(
                 listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    writeSleepPermission,
-                    writeDistancePermission,
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
                 )
             )
         getGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME, listOf())
@@ -1184,13 +2252,13 @@
     @Test
     fun shouldNavigateToFragment_whenAnyPermissionGranted_returnsTrue() = runTest {
         whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(false)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
             .thenReturn(
                 listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    writeSleepPermission,
-                    writeDistancePermission,
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
                 )
             )
         getGrantedHealthPermissionsUseCase.updateData(
@@ -1210,13 +2278,13 @@
     fun shouldNavigateToFragment_whenPackageNotSupported_andNoPermissionsGranted_returnsFalse() =
         runTest {
             whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(false)
-            whenever(healthPermissionReader.getValidHealthPermissions(any()))
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
                 .thenReturn(
                     listOf(
-                        readExercisePermission,
-                        readNutritionPermission,
-                        writeSleepPermission,
-                        writeDistancePermission,
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
                     )
                 )
             getGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME, listOf())
@@ -1293,15 +2361,859 @@
         }
     }
 
-    private fun setupDeclaredAndGrantedFitnessPermissions() {
+    @Test
+    fun revokeFitnessShouldIncludeBackground_whenBGNotDeclared_returnsFalse() = runTest {
         whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
             .thenReturn(
                 listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    writeSleepPermission,
-                    writeDistancePermission,
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readExercisePermission.toString(),
+                writeSleepPermission.toString(),
+                readHistoryDataPermission.additionalPermission,
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeFitnessShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeFitnessShouldIncludeBackground()
+        assertThat(revokeFitnessShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeFitnessShouldIncludeBackground_whenNoReadPermissionDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    writeMedicalData.toString(),
+                    readDataInBackgroundPermission.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(writeSleepPermission.toString(), writeMedicalData.toString()),
+        )
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeFitnessShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeFitnessShouldIncludeBackground()
+        assertThat(revokeFitnessShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeFitnessShouldIncludeBackground_whenNoFitnessReadGranted_returnsFalse() = runTest {
+        // If e.g. we revoke permissions for an app that has just write permissions
+        // declared/granted,
+        // Then we shouldn't revoke BG, because its only dependent on medical read
+        // And if there is no medical read, then we can't have BG anyway
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                writeSleepPermission.toString(),
+                readDataInBackgroundPermission.additionalPermission,
+                readHistoryDataPermission.additionalPermission,
+                writeMedicalData.toString(),
+            ),
+        )
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+        val revokeFitnessShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeFitnessShouldIncludeBackground()
+        assertThat(revokeFitnessShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeFitnessShouldIncludeBackground_whenMedicalRead_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readNutritionPermission.toString(),
+                writeSleepPermission.toString(),
+                readDataInBackgroundPermission.additionalPermission,
+                readHistoryDataPermission.additionalPermission,
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeFitnessShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeFitnessShouldIncludeBackground()
+        assertThat(revokeFitnessShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeFitnessShouldIncludeBackground_whenBGDeclared_andFitnessRead_andNoMedicalRead_returnsTrue() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    readDataInBackgroundPermission.additionalPermission,
+                    readHistoryDataPermission.additionalPermission,
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val revokeFitnessShouldIncludeBackgroundResult =
+                appPermissionViewModel.revokeFitnessShouldIncludeBackground()
+            assertThat(revokeFitnessShouldIncludeBackgroundResult).isTrue()
+        }
+
+    @Test
+    fun revokeFitnessShouldIncludePastData_whenPastDataNotDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readNutritionPermission.toString(),
+                writeSleepPermission.toString(),
+                readDataInBackgroundPermission.additionalPermission,
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeFitnessShouldIncludePastDataResult =
+            appPermissionViewModel.revokeFitnessShouldIncludePastData()
+        assertThat(revokeFitnessShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    fun revokeFitnessShouldIncludePastData_whenNoFitnessReadDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                writeSleepPermission.toString(),
+                readDataInBackgroundPermission.additionalPermission,
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeFitnessShouldIncludePastDataResult =
+            appPermissionViewModel.revokeFitnessShouldIncludePastData()
+        assertThat(revokeFitnessShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    fun revokeFitnessShouldIncludePastData_whenNoFitnessRead_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                writeSleepPermission.toString(),
+                readHistoryDataPermission.additionalPermission,
+                readDataInBackgroundPermission.additionalPermission,
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeFitnessShouldIncludePastDataResult =
+            appPermissionViewModel.revokeFitnessShouldIncludePastData()
+        assertThat(revokeFitnessShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    fun revokeFitnessShouldIncludePastData_whenMedicalRead_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readNutritionPermission.toString(),
+                writeSleepPermission.toString(),
+                readHistoryDataPermission.additionalPermission,
+                readDataInBackgroundPermission.additionalPermission,
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeFitnessShouldIncludePastDataResult =
+            appPermissionViewModel.revokeFitnessShouldIncludePastData()
+        assertThat(revokeFitnessShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    fun revokeFitnessShouldIncludePastData_whenPastDataDeclared_andFitnessRead_andNoMedicalRead_returnsTrue() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val revokeFitnessShouldIncludePastDataResult =
+                appPermissionViewModel.revokeFitnessShouldIncludePastData()
+            assertThat(revokeFitnessShouldIncludePastDataResult).isTrue()
+        }
+
+    @Test
+    fun revokeMedicalShouldIncludeBackground_whenBgNotDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readExercisePermission.toString(),
+                writeSleepPermission.toString(),
+                readHistoryDataPermission.additionalPermission,
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeMedicalShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeMedicalShouldIncludeBackground()
+        assertThat(revokeMedicalShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeMedicalShouldIncludeBackground_whenNoReadPermissionDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(writeSleepPermission.toString(), writeMedicalData.toString()),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeMedicalShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeMedicalShouldIncludeBackground()
+        assertThat(revokeMedicalShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeMedicalShouldIncludeBackground_whenNoMedicalRead_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                writeSleepPermission.toString(),
+                readDataInBackgroundPermission.additionalPermission,
+                readHistoryDataPermission.additionalPermission,
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeMedicalShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeMedicalShouldIncludeBackground()
+        assertThat(revokeMedicalShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeMedicalShouldIncludeBackground_whenFitnessRead_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readExercisePermission.toString(),
+                writeSleepPermission.toString(),
+                readDataInBackgroundPermission.additionalPermission,
+                readHistoryDataPermission.additionalPermission,
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeMedicalShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeMedicalShouldIncludeBackground()
+        assertThat(revokeMedicalShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeMedicalShouldIncludeBackground_whenBgDeclared_andMedicalRead_andNoFitnessRead_returnsTrue() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    writeSleepPermission.toString(),
+                    readDataInBackgroundPermission.additionalPermission,
+                    readHistoryDataPermission.additionalPermission,
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val revokeMedicalShouldIncludeBackgroundResult =
+                appPermissionViewModel.revokeMedicalShouldIncludeBackground()
+            assertThat(revokeMedicalShouldIncludeBackgroundResult).isTrue()
+        }
+
+    @Test
+    fun revokeMedicalShouldIncludePastData_whenPastDataNotDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readExercisePermission.toString(),
+                writeSleepPermission.toString(),
+                readDataInBackgroundPermission.additionalPermission,
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeMedicalShouldIncludePastDataResult =
+            appPermissionViewModel.revokeMedicalShouldIncludePastData()
+        assertThat(revokeMedicalShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun revokeMedicalShouldIncludePastData_whenNoFitnessReadDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                writeSleepPermission.toString(),
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeMedicalShouldIncludePastDataResult =
+            appPermissionViewModel.revokeMedicalShouldIncludePastData()
+        assertThat(revokeMedicalShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    fun revokeMedicalShouldIncludePastData_whenNoMedicalRead_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readExercisePermission.toString(),
+                writeSleepPermission.toString(),
+                readHistoryDataPermission.additionalPermission,
+                readDataInBackgroundPermission.additionalPermission,
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeMedicalShouldIncludePastDataResult =
+            appPermissionViewModel.revokeMedicalShouldIncludePastData()
+        assertThat(revokeMedicalShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    fun revokeMedicalShouldIncludePastData_whenFitnessRead_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readExercisePermission.toString(),
+                writeSleepPermission.toString(),
+                readHistoryDataPermission.additionalPermission,
+                readDataInBackgroundPermission.additionalPermission,
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeMedicalShouldIncludePastDataResult =
+            appPermissionViewModel.revokeMedicalShouldIncludePastData()
+        assertThat(revokeMedicalShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    fun revokeMedicalShouldIncludePastData_whenPastDataDeclared_andMedicalRead_andNoFitnessRead_returnsTrue() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readExercisePermission.toString(),
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        readImmunization.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    writeSleepPermission.toString(),
+                    readHistoryDataPermission.additionalPermission,
+                    readDataInBackgroundPermission.additionalPermission,
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val revokeMedicalShouldIncludePastDataResult =
+                appPermissionViewModel.revokeMedicalShouldIncludePastData()
+            assertThat(revokeMedicalShouldIncludePastDataResult).isTrue()
+        }
+
+    @Test
+    fun revokeAllShouldIncludeBackground_whenBgNotDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    readImmunization.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readNutritionPermission.toString(),
+                writeSleepPermission.toString(),
+                readHistoryDataPermission.additionalPermission,
+                readImmunization.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeAllShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeAllShouldIncludeBackground()
+        assertThat(revokeAllShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun revokeAllShouldIncludeBackground_whenNoReadPermissionDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    readHistoryDataPermission.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(writeSleepPermission.toString(), writeMedicalData.toString()),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeAllShouldIncludeBackgroundResult =
+            appPermissionViewModel.revokeAllShouldIncludeBackground()
+        assertThat(revokeAllShouldIncludeBackgroundResult).isFalse()
+    }
+
+    @Test
+    fun revokeAllShouldIncludeBackground_whenBgDeclared_andAtLeastOneReadPermissionDeclared_returnsTrue() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        readDataInBackgroundPermission.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    writeMedicalData.toString(),
+                ),
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val revokeAllShouldIncludeBackgroundResult =
+                appPermissionViewModel.revokeAllShouldIncludeBackground()
+            assertThat(revokeAllShouldIncludeBackgroundResult).isTrue()
+        }
+
+    @Test
+    fun revokeAllShouldIncludePastData_whenPastDataNotDeclared_returnsFalse() = runTest {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    readDataInBackgroundPermission.toString(),
+                    writeMedicalData.toString(),
+                )
+            )
+        getGrantedHealthPermissionsUseCase.updateData(
+            TEST_APP_PACKAGE_NAME,
+            listOf(
+                readNutritionPermission.toString(),
+                writeSleepPermission.toString(),
+                writeMedicalData.toString(),
+            ),
+        )
+
+        appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+        advanceUntilIdle()
+
+        val revokeAllShouldIncludePastDataResult =
+            appPermissionViewModel.revokeAllShouldIncludePastData()
+        assertThat(revokeAllShouldIncludePastDataResult).isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun revokeAllShouldIncludePastData_whenNoReadFitnessPermissionDeclared_returnsFalse() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(writeSleepPermission.toString(), writeMedicalData.toString()),
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val revokeAllShouldIncludePastDataResult =
+                appPermissionViewModel.revokeAllShouldIncludePastData()
+            assertThat(revokeAllShouldIncludePastDataResult).isFalse()
+        }
+
+    @Test
+    fun revokeAllShouldIncludePastData_whenPastDataDeclared_andAtLeastOneReadFitnessPermissionDeclared_returnsTrue() =
+        runTest {
+            whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+            whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+                .thenReturn(
+                    listOf(
+                        readNutritionPermission.toString(),
+                        writeSleepPermission.toString(),
+                        writeDistancePermission.toString(),
+                        readHistoryDataPermission.toString(),
+                        writeMedicalData.toString(),
+                    )
+                )
+            getGrantedHealthPermissionsUseCase.updateData(
+                TEST_APP_PACKAGE_NAME,
+                listOf(writeSleepPermission.toString(), writeMedicalData.toString()),
+            )
+
+            appPermissionViewModel.loadPermissionsForPackage(TEST_APP_PACKAGE_NAME)
+            advanceUntilIdle()
+
+            val revokeAllShouldIncludePastDataResult =
+                appPermissionViewModel.revokeAllShouldIncludePastData()
+            assertThat(revokeAllShouldIncludePastDataResult).isTrue()
+        }
+
+    private fun setupDeclaredAndGrantedFitnessPermissions() {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
+            .thenReturn(
+                listOf(
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
                 )
             )
         getGrantedHealthPermissionsUseCase.updateData(
@@ -1312,15 +3224,15 @@
 
     private fun setupDeclaredAndGrantedFitnessAndMedicalPermissions() {
         whenever(healthPermissionReader.isRationaleIntentDeclared(any())).thenReturn(true)
-        whenever(healthPermissionReader.getValidHealthPermissions(any()))
+        whenever(healthPermissionReader.getDeclaredHealthPermissions(any()))
             .thenReturn(
                 listOf(
-                    readExercisePermission,
-                    readNutritionPermission,
-                    readImmunization,
-                    writeSleepPermission,
-                    writeDistancePermission,
-                    writeMedicalData,
+                    readExercisePermission.toString(),
+                    readNutritionPermission.toString(),
+                    readImmunization.toString(),
+                    writeSleepPermission.toString(),
+                    writeDistancePermission.toString(),
+                    writeMedicalData.toString(),
                 )
             )
         getGrantedHealthPermissionsUseCase.updateData(
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/CombinedPermissionsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/CombinedPermissionsFragmentTest.kt
index 3a4cc43..88be16f 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/CombinedPermissionsFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/CombinedPermissionsFragmentTest.kt
@@ -42,6 +42,8 @@
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel.RevokeAllState.NotStarted
 import com.android.healthconnect.controller.permissions.app.CombinedPermissionsFragment
+import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.shared.Constants.EXTRA_APP_NAME
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
@@ -51,10 +53,10 @@
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.logging.AppAccessElement
+import com.android.healthconnect.controller.utils.logging.CombinedAppAccessElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -62,19 +64,18 @@
 import java.time.ZoneId
 import java.util.Locale
 import java.util.TimeZone
-import javax.inject.Inject
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito.*
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class CombinedPermissionsFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
 
     @BindValue val viewModel: AppPermissionViewModel = mock()
     @BindValue val healthConnectLogger: HealthConnectLogger = mock()
@@ -137,6 +138,13 @@
                 fragment.preferenceScreen.findPreference("manage_app") as PreferenceCategory?
             assertThat(managePermissions?.preferenceCount).isEqualTo(2)
             assertThat(manageApp?.preferenceCount).isEqualTo(2)
+
+            verify(healthConnectLogger, atLeast(1)).setPageId(PageName.COMBINED_APP_ACCESS_PAGE)
+            verify(healthConnectLogger).logPageImpression()
+            verify(healthConnectLogger)
+                .logImpression(CombinedAppAccessElement.FITNESS_PERMISSIONS_BUTTON)
+            verify(healthConnectLogger)
+                .logImpression(CombinedAppAccessElement.MEDICAL_PERMISSIONS_BUTTON)
         }
     }
 
@@ -185,10 +193,11 @@
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Health records")).perform(scrollTo()).check(matches(isDisplayed()))
-        onView(withText("Lab results, medications, immunizations and others"))
+        onView(withText("Lab results, medications, vaccines and others"))
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Additional access")).check(doesNotExist())
+        onView(withText("Past data, background data")).check(doesNotExist())
         onView(withText("Manage app")).perform(scrollTo()).check(matches(isDisplayed()))
         onView(withText("See app data")).perform(scrollTo()).check(matches(isDisplayed()))
         onView(withText("Remove access for this app"))
@@ -216,7 +225,7 @@
                     "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
                 )
             )
             .perform(scrollTo())
@@ -254,6 +263,9 @@
         )
 
         onView(withText("Additional access")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("Past data, background data"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
     }
 
     @Test
@@ -276,6 +288,9 @@
         )
 
         onView(withText("Additional access")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("Past data, background data"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
         verify(healthConnectLogger).logImpression(AppAccessElement.ADDITIONAL_ACCESS_BUTTON)
     }
 
@@ -365,12 +380,21 @@
                 )
             )
         }
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(true)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<CombinedPermissionsFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
         )
         onView(withText("Remove access for this app"))
             .perform(scrollTo())
             .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(CombinedAppAccessElement.REMOVE_ALL_PERMISSIONS_BUTTON)
         onView(withText("Remove access for this app")).perform(scrollTo()).perform(click())
 
         onView(withText("Remove all permissions?")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -414,6 +438,13 @@
                 )
             )
         }
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<CombinedPermissionsFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
         )
@@ -463,6 +494,13 @@
                 )
             )
         }
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(true)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<CombinedPermissionsFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
         )
@@ -494,6 +532,13 @@
 
     @Test
     fun removeAccessButton_noAdditionalPermissions_showsConfirmationDialog() {
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<CombinedPermissionsFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
         )
@@ -525,6 +570,13 @@
 
     @Test
     fun removeAccessButton_confirmationDialogWithCheckbox_remainsAfterRotation() {
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         val scenario =
             launchFragment<CombinedPermissionsFragment>(
                 bundleOf(
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/ConnectedAppsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/ConnectedAppsFragmentTest.kt
index 17150a7..22d209b 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/ConnectedAppsFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/ConnectedAppsFragmentTest.kt
@@ -18,20 +18,20 @@
 import android.content.Context
 import android.health.connect.HealthConnectManager
 import android.os.Bundle
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import androidx.lifecycle.MutableLiveData
 import androidx.navigation.Navigation
 import androidx.navigation.testing.TestNavHostController
 import androidx.recyclerview.widget.RecyclerView
 import androidx.test.espresso.Espresso.onView
 import androidx.test.espresso.action.ViewActions.click
-import androidx.test.espresso.action.ViewActions.repeatedlyUntil
 import androidx.test.espresso.action.ViewActions.scrollTo
-import androidx.test.espresso.action.ViewActions.swipeUp
 import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.contrib.RecyclerViewActions.scrollToLastPosition
 import androidx.test.espresso.matcher.RootMatchers
-import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.isEnabled
 import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -61,15 +61,14 @@
 import com.android.healthconnect.controller.tests.utils.isAbove
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
 import com.android.healthconnect.controller.utils.DeviceInfoUtilsModule
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.AppPermissionsElement
-import com.android.healthconnect.controller.utils.logging.DeletionDialogConfirmationElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.MigrationElement
 import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -88,12 +87,14 @@
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @UninstallModules(DeviceInfoUtilsModule::class)
 @HiltAndroidTest
 class ConnectedAppsFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
 
     @Inject lateinit var manager: HealthConnectManager
 
@@ -130,7 +131,9 @@
                 ConnectedAppMetadata(
                     TEST_APP,
                     status = ALLOWED,
-                    permissionsType = AppPermissionsType.FITNESS_PERMISSIONS_ONLY))
+                    permissionsType = AppPermissionsType.FITNESS_PERMISSIONS_ONLY,
+                )
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
         (deviceInfoUtils as FakeDeviceInfoUtils).setSendFeedbackAvailability(false)
         deviceInfoUtils.setPlayStoreAvailability(true)
@@ -153,7 +156,9 @@
                 ConnectedAppMetadata(
                     TEST_APP,
                     status = ALLOWED,
-                    permissionsType = AppPermissionsType.MEDICAL_PERMISSIONS_ONLY))
+                    permissionsType = AppPermissionsType.MEDICAL_PERMISSIONS_ONLY,
+                )
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
         (deviceInfoUtils as FakeDeviceInfoUtils).setSendFeedbackAvailability(false)
         deviceInfoUtils.setPlayStoreAvailability(true)
@@ -176,7 +181,9 @@
                 ConnectedAppMetadata(
                     TEST_APP,
                     status = ALLOWED,
-                    permissionsType = AppPermissionsType.COMBINED_PERMISSIONS))
+                    permissionsType = AppPermissionsType.COMBINED_PERMISSIONS,
+                )
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         (deviceInfoUtils as FakeDeviceInfoUtils).setSendFeedbackAvailability(false)
@@ -255,6 +262,34 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_NEW_INFORMATION_ARCHITECTURE)
+    fun allowedApps_newIAEnabled_confirmationDialogDisplayed_checkboxInDialogDisplayed() {
+        val connectApp = listOf(ConnectedAppMetadata(TEST_APP, status = ALLOWED))
+        whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
+        whenever(viewModel.alertDialogActive).then { MutableLiveData(true) }
+
+        launchFragment<ConnectedAppsFragment>(Bundle())
+
+        onView(withText("Also delete all Health Connect data"))
+            .inRoot(RootMatchers.isDialog())
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun allowedApps_phrEnabled_confirmationDialogDisplayed_checkboxInDialogDisplayed() {
+        val connectApp = listOf(ConnectedAppMetadata(TEST_APP, status = ALLOWED))
+        whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
+        whenever(viewModel.alertDialogActive).then { MutableLiveData(true) }
+
+        launchFragment<ConnectedAppsFragment>(Bundle())
+
+        onView(withText("Also delete all Health Connect data"))
+            .inRoot(RootMatchers.isDialog())
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
     fun noAllowedApps_removeAccessDisabled() {
         val connectApp = listOf(ConnectedAppMetadata(TEST_APP, status = DENIED))
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
@@ -304,13 +339,16 @@
             listOf(
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package3", appName = "thirdApp", icon = null),
-                    status = ALLOWED),
+                    status = ALLOWED,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package1", appName = "firstApp", icon = null),
-                    status = ALLOWED),
+                    status = ALLOWED,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package2", appName = "secondApp", icon = null),
-                    status = ALLOWED),
+                    status = ALLOWED,
+                ),
             )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectedApps) }
 
@@ -328,13 +366,16 @@
             listOf(
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package3", appName = "thirdApp", icon = null),
-                    status = DENIED),
+                    status = DENIED,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package1", appName = "firstApp", icon = null),
-                    status = DENIED),
+                    status = DENIED,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package2", appName = "secondApp", icon = null),
-                    status = DENIED),
+                    status = DENIED,
+                ),
             )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectedApps) }
 
@@ -352,13 +393,16 @@
             listOf(
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package3", appName = "thirdApp", icon = null),
-                    status = INACTIVE),
+                    status = INACTIVE,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package1", appName = "firstApp", icon = null),
-                    status = INACTIVE),
+                    status = INACTIVE,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package2", appName = "secondApp", icon = null),
-                    status = INACTIVE),
+                    status = INACTIVE,
+                ),
             )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectedApps) }
 
@@ -376,19 +420,22 @@
             listOf(
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package3", appName = "thirdApp", icon = null),
-                    status = NEEDS_UPDATE),
+                    status = NEEDS_UPDATE,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package1", appName = "firstApp", icon = null),
-                    status = NEEDS_UPDATE),
+                    status = NEEDS_UPDATE,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package2", appName = "secondApp", icon = null),
-                    status = NEEDS_UPDATE),
+                    status = NEEDS_UPDATE,
+                ),
             )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectedApps) }
 
         launchFragment<ConnectedAppsFragment>(Bundle())
         onView(withId(androidx.preference.R.id.recycler_view))
-                .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
         onView(withText("firstApp")).perform(scrollTo()).check(matches(isDisplayed()))
         onView(withText("secondApp")).perform(scrollTo()).check(matches(isDisplayed()))
         onView(withText("firstApp")).check(matches(isAbove(withText("secondApp"))))
@@ -396,8 +443,41 @@
         onView(withText("secondApp")).check(matches(isAbove(withText("thirdApp"))))
     }
 
+    @EnableFlags(Flags.FLAG_NEW_INFORMATION_ARCHITECTURE)
     @Test
-    fun whenClickOnInactiveApp_showsDeleteDataDialog() {
+    fun whenClickOnInactiveApp_newIaFlagEnabled_showsDeleteDataDialog() {
+        val connectApp = listOf(ConnectedAppMetadata(TEST_APP, status = INACTIVE))
+        whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
+
+        launchFragment<ConnectedAppsFragment>(Bundle())
+
+        onView(withText(TEST_APP_NAME)).check(matches(isDisplayed()))
+        onView(withText(R.string.inactive_apps)).check(matches(isDisplayed()))
+        onView(withTagValue(`is`("Delete button inactive app"))).perform(click())
+
+        onView(withText("Permanently delete all $TEST_APP_NAME data?"))
+            .check(matches(isDisplayed()))
+    }
+
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    @Test
+    fun whenClickOnInactiveApp_phrFlagEnabled_showsDeleteDataDialog() {
+        val connectApp = listOf(ConnectedAppMetadata(TEST_APP, status = INACTIVE))
+        whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
+
+        launchFragment<ConnectedAppsFragment>(Bundle())
+
+        onView(withText(TEST_APP_NAME)).check(matches(isDisplayed()))
+        onView(withText(R.string.inactive_apps)).check(matches(isDisplayed()))
+        onView(withTagValue(`is`("Delete button inactive app"))).perform(click())
+
+        onView(withText("Permanently delete all $TEST_APP_NAME data?"))
+            .check(matches(isDisplayed()))
+    }
+
+    @DisableFlags(Flags.FLAG_NEW_INFORMATION_ARCHITECTURE, Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun whenClickOnInactiveApp_oldDeletion_showsDeleteDataDialog() {
         val connectApp = listOf(ConnectedAppMetadata(TEST_APP, status = INACTIVE))
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
@@ -409,15 +489,6 @@
 
         onView(withText("Permanently delete $TEST_APP_NAME data from all time?"))
             .check(matches(isDisplayed()))
-
-        verify(healthConnectLogger)
-            .logImpression(DeletionDialogConfirmationElement.DELETION_DIALOG_CONFIRMATION_CONTAINER)
-        verify(healthConnectLogger)
-            .logImpression(
-                DeletionDialogConfirmationElement.DELETION_DIALOG_CONFIRMATION_DELETE_BUTTON)
-        verify(healthConnectLogger)
-            .logImpression(
-                DeletionDialogConfirmationElement.DELETION_DIALOG_CONFIRMATION_CANCEL_BUTTON)
     }
 
     @Test
@@ -475,7 +546,8 @@
         val connectApp =
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = DENIED),
-                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED))
+                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         launchFragment<ConnectedAppsFragment>(Bundle())
@@ -500,7 +572,8 @@
         val connectApp =
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = DENIED),
-                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED))
+                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         (deviceInfoUtils as FakeDeviceInfoUtils).setSendFeedbackAvailability(false)
@@ -517,7 +590,8 @@
         val connectApp =
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = DENIED),
-                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED))
+                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         (deviceInfoUtils as FakeDeviceInfoUtils).setSendFeedbackAvailability(false)
@@ -534,7 +608,8 @@
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = ALLOWED),
                 ConnectedAppMetadata(TEST_APP_2, status = DENIED),
-                ConnectedAppMetadata(OLD_TEST_APP, status = NEEDS_UPDATE))
+                ConnectedAppMetadata(OLD_TEST_APP, status = NEEDS_UPDATE),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
         (deviceInfoUtils as FakeDeviceInfoUtils).setPlayStoreAvailability(true)
 
@@ -544,7 +619,9 @@
         onView(
                 withText(
                     "Old permissions test app needs to be updated to " +
-                        "continue syncing with Health Connect"))
+                        "continue syncing with Health Connect. Updates may not be available for all apps."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Learn more")).check(matches(isDisplayed()))
         onView(withText("Check for updates")).check(matches(isDisplayed()))
@@ -566,13 +643,18 @@
                 ConnectedAppMetadata(TEST_APP, status = ALLOWED),
                 ConnectedAppMetadata(TEST_APP_2, status = DENIED),
                 ConnectedAppMetadata(OLD_TEST_APP, status = NEEDS_UPDATE),
-                ConnectedAppMetadata(TEST_APP_3, status = NEEDS_UPDATE))
+                ConnectedAppMetadata(TEST_APP_3, status = NEEDS_UPDATE),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
         (deviceInfoUtils as FakeDeviceInfoUtils).setPlayStoreAvailability(false)
 
         launchFragment<ConnectedAppsFragment>(Bundle())
         onView(withText("App update needed")).check(matches(isDisplayed()))
-        onView(withText("Some apps need to be updated to continue syncing with Health Connect"))
+        onView(
+                withText(
+                    "Some apps need to be updated to continue syncing with Health Connect. Updates may not be available for all apps."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Learn more")).check(matches(isDisplayed()))
         onView(withText("Check for updates")).check(matches(not(isDisplayed())))
@@ -592,7 +674,8 @@
                 ConnectedAppMetadata(TEST_APP, status = ALLOWED),
                 ConnectedAppMetadata(TEST_APP_2, status = DENIED),
                 ConnectedAppMetadata(OLD_TEST_APP, status = NEEDS_UPDATE),
-                ConnectedAppMetadata(TEST_APP_3, status = NEEDS_UPDATE))
+                ConnectedAppMetadata(TEST_APP_3, status = NEEDS_UPDATE),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
         (deviceInfoUtils as FakeDeviceInfoUtils).setPlayStoreAvailability(true)
 
@@ -602,7 +685,11 @@
             Navigation.setViewNavController(this.requireView(), navHostController)
         }
         onView(withText("App update needed")).check(matches(isDisplayed()))
-        onView(withText("Some apps need to be updated to continue syncing with Health Connect"))
+        onView(
+                withText(
+                    "Some apps need to be updated to continue syncing with Health Connect. Updates may not be available for all apps."
+                )
+            )
             .check(matches(isDisplayed()))
         onView(withText("Learn more")).check(matches(isDisplayed()))
         onView(withText("Check for updates")).check(matches(isDisplayed()))
@@ -616,7 +703,8 @@
         val connectApp =
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = DENIED),
-                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED))
+                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
         (deviceInfoUtils as FakeDeviceInfoUtils).setSendFeedbackAvailability(false)
         deviceInfoUtils.setPlayStoreAvailability(true)
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/ConnectedAppsViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/ConnectedAppsViewModelTest.kt
index e802e92..33f7a4c 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/ConnectedAppsViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/ConnectedAppsViewModelTest.kt
@@ -15,10 +15,12 @@
  */
 package com.android.healthconnect.controller.tests.permissions.connectedapps
 
+import android.platform.test.annotations.EnableFlags
 import com.android.healthconnect.controller.permissions.api.RevokeAllHealthPermissionsUseCase
 import com.android.healthconnect.controller.permissions.connectedapps.ConnectedAppsViewModel
 import com.android.healthconnect.controller.permissions.connectedapps.ILoadHealthPermissionApps
 import com.android.healthconnect.controller.permissions.connectedapps.searchapps.SearchHealthPermissionApps
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAllDataUseCase
 import com.android.healthconnect.controller.shared.app.ConnectedAppMetadata
 import com.android.healthconnect.controller.shared.app.ConnectedAppStatus
 import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
@@ -27,6 +29,7 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_2
 import com.android.healthconnect.controller.tests.utils.TestObserver
 import com.android.healthconnect.controller.tests.utils.di.FakeHealthPermissionAppsUseCase
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -42,6 +45,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @HiltAndroidTest
@@ -54,6 +58,7 @@
     private val loadHealthPermissionApps: ILoadHealthPermissionApps =
         FakeHealthPermissionAppsUseCase()
     private val revokeAllHealthPermissionsUseCase: RevokeAllHealthPermissionsUseCase = mock()
+    private val deleteAllDataUseCase: DeleteAllDataUseCase = mock()
     private lateinit var searchPermissionApps: SearchHealthPermissionApps
     private lateinit var viewModel: ConnectedAppsViewModel
 
@@ -67,7 +72,9 @@
                 loadHealthPermissionApps,
                 searchPermissionApps,
                 revokeAllHealthPermissionsUseCase,
-                Dispatchers.Main)
+                deleteAllDataUseCase,
+                Dispatchers.Main,
+            )
     }
 
     @After
@@ -92,7 +99,9 @@
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED),
                 ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.DENIED),
-                ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE)))
+                ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE),
+            )
+        )
         val testObserver = TestObserver<List<ConnectedAppMetadata>>()
         viewModel.connectedApps.observeForever(testObserver)
         viewModel.loadConnectedApps()
@@ -104,7 +113,9 @@
                 listOf(
                     ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED),
                     ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.DENIED),
-                    ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE)))
+                    ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE),
+                )
+            )
     }
 
     @Test
@@ -113,7 +124,9 @@
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED),
                 ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.DENIED),
-                ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE)))
+                ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE),
+            )
+        )
         val testObserver = TestObserver<List<ConnectedAppMetadata>>()
         viewModel.connectedApps.observeForever(testObserver)
         viewModel.searchConnectedApps("Some app")
@@ -129,7 +142,9 @@
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED),
                 ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.DENIED),
-                ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE)))
+                ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE),
+            )
+        )
         val testObserver = TestObserver<List<ConnectedAppMetadata>>()
         viewModel.connectedApps.observeForever(testObserver)
         viewModel.searchConnectedApps("Connect")
@@ -141,7 +156,8 @@
                 listOf(
                     ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED),
                     ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.DENIED),
-                ))
+                )
+            )
     }
 
     @Test
@@ -150,11 +166,24 @@
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED),
                 ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.DENIED),
-                ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE)))
+                ConnectedAppMetadata(OLD_TEST_APP, status = ConnectedAppStatus.NEEDS_UPDATE),
+            )
+        )
 
         assertThat(
                 viewModel.disconnectAllApps(
-                    listOf(ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED))))
+                    listOf(ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED))
+                )
+            )
             .isTrue()
     }
+
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    @Test
+    fun deleteAllData_invokesDeletion() = runTest {
+        viewModel.deleteAllData()
+        advanceUntilIdle()
+
+        verify(deleteAllDataUseCase).invoke()
+    }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/FitnessAppFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/FitnessAppFragmentTest.kt
index f3de5b8..9c7ff0a 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/FitnessAppFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/FitnessAppFragmentTest.kt
@@ -17,6 +17,8 @@
 
 import android.content.Intent
 import android.content.Intent.*
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MediatorLiveData
 import androidx.lifecycle.MutableLiveData
@@ -32,6 +34,7 @@
 import androidx.test.espresso.intent.Intents
 import androidx.test.espresso.intent.Intents.intended
 import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction
+import androidx.test.espresso.matcher.RootMatchers.isDialog
 import androidx.test.espresso.matcher.ViewMatchers.isChecked
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -44,29 +47,30 @@
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel.RevokeAllState.NotStarted
 import com.android.healthconnect.controller.permissions.app.FitnessAppFragment
 import com.android.healthconnect.controller.permissions.app.HealthPermissionStatus
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.DISTANCE
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.EXERCISE
+import com.android.healthconnect.controller.permissions.data.HealthPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType.READ
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType.WRITE
 import com.android.healthconnect.controller.shared.Constants.EXTRA_APP_NAME
+import com.android.healthconnect.controller.shared.Constants.SHOW_MANAGE_APP_SECTION
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
+import com.android.healthconnect.controller.shared.preference.HealthMainSwitchPreference
+import com.android.healthconnect.controller.shared.preference.HealthPreferenceFragment
 import com.android.healthconnect.controller.tests.TestActivity
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.safeEq
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.logging.AppAccessElement
 import com.android.healthconnect.controller.utils.logging.DisconnectAppDialogElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
-import com.android.settingslib.widget.MainSwitchPreference
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -75,21 +79,26 @@
 import java.time.ZoneId
 import java.util.Locale
 import java.util.TimeZone
-import javax.inject.Inject
 import org.hamcrest.Matchers.not
 import org.junit.After
 import org.junit.Before
 import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
-import org.mockito.Mockito.*
+import org.mockito.Mockito.anyString
+import org.mockito.Mockito.atLeast
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class FitnessAppFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
+    @get:Rule val setFlagsRule = SetFlagsRule()
 
     @BindValue val viewModel: AppPermissionViewModel = mock()
     @BindValue val healthConnectLogger: HealthConnectLogger = mock()
@@ -104,7 +113,6 @@
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
         navHostController = TestNavHostController(context)
         hiltRule.inject()
-        (fakeFeatureUtils as FakeFeatureUtils).setIsNewInformationArchitectureEnabled(false)
 
         whenever(viewModel.revokeAllHealthPermissionsState).then { MutableLiveData(NotStarted) }
         whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(false) }
@@ -126,7 +134,9 @@
                 AppMetadata(
                     TEST_APP_PACKAGE_NAME,
                     TEST_APP_NAME,
-                    context.getDrawable(R.drawable.health_connect_logo)))
+                    context.getDrawable(R.drawable.health_connect_logo),
+                )
+            )
         }
 
         whenever(additionalAccessViewModel.additionalAccessState).then {
@@ -142,6 +152,9 @@
     @After
     fun teardown() {
         reset(healthConnectLogger)
+        reset(viewModel)
+        reset(additionalAccessViewModel)
+        reset(healthPermissionReader)
         // enable animations
         toggleAnimation(true)
         Intents.release()
@@ -156,22 +169,19 @@
         val scenario =
             launchFragment<FitnessAppFragment>(
                 bundleOf(
-                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
 
         scenario.onActivity { activity: TestActivity ->
-            val fragment =
-                activity.supportFragmentManager.findFragmentById(android.R.id.content)
-                    as FitnessAppFragment
-            val readCategory =
-                fragment.preferenceScreen.findPreference("read_permission_category")
-                    as PreferenceCategory?
-            val writeCategory =
-                fragment.preferenceScreen.findPreference("write_permission_category")
-                    as PreferenceCategory?
+            val fragment = getFragment(activity)
+            val readCategory = getPreferenceCategory(fragment, "read_permission_category")
+
+            val writeCategory = getPreferenceCategory(fragment, "write_permission_category")
             assertThat(readCategory?.preferenceCount).isEqualTo(0)
             assertThat(writeCategory?.preferenceCount).isEqualTo(0)
         }
-        onView(withText("See app data")).check(doesNotExist())
     }
 
     @Test
@@ -183,24 +193,21 @@
         val scenario =
             launchFragment<FitnessAppFragment>(
                 bundleOf(
-                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
 
         scenario.onActivity { activity: TestActivity ->
-            val fragment =
-                activity.supportFragmentManager.findFragmentById(android.R.id.content)
-                    as FitnessAppFragment
-            val readCategory =
-                fragment.preferenceScreen.findPreference("read_permission_category")
-                    as PreferenceCategory?
-            val writeCategory =
-                fragment.preferenceScreen.findPreference("write_permission_category")
-                    as PreferenceCategory?
+            val fragment = getFragment(activity)
+            val readCategory = getPreferenceCategory(fragment, "read_permission_category")
+
+            val writeCategory = getPreferenceCategory(fragment, "write_permission_category")
             assertThat(readCategory?.preferenceCount).isEqualTo(1)
             assertThat(writeCategory?.preferenceCount).isEqualTo(0)
         }
+
         onView(withText("Distance")).check(matches(isDisplayed()))
-        onView(withText("See app data")).check(doesNotExist())
-        onView(withText("Delete app data")).check(matches(isDisplayed()))
     }
 
     @Test
@@ -212,23 +219,20 @@
         val scenario =
             launchFragment<FitnessAppFragment>(
                 bundleOf(
-                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
 
         scenario.onActivity { activity: TestActivity ->
-            val fragment =
-                activity.supportFragmentManager.findFragmentById(android.R.id.content)
-                    as FitnessAppFragment
-            val readCategory =
-                fragment.preferenceScreen.findPreference("read_permission_category")
-                    as PreferenceCategory?
-            val writeCategory =
-                fragment.preferenceScreen.findPreference("write_permission_category")
-                    as PreferenceCategory?
+            val fragment = getFragment(activity)
+            val readCategory = getPreferenceCategory(fragment, "read_permission_category")
+            val writeCategory = getPreferenceCategory(fragment, "write_permission_category")
+
             assertThat(readCategory?.preferenceCount).isEqualTo(0)
             assertThat(writeCategory?.preferenceCount).isEqualTo(1)
         }
         onView(withText("Exercise")).check(matches(isDisplayed()))
-        onView(withText("See app data")).check(doesNotExist())
     }
 
     @Test
@@ -245,24 +249,21 @@
         val scenario =
             launchFragment<FitnessAppFragment>(
                 bundleOf(
-                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
 
         scenario.onActivity { activity: TestActivity ->
-            val fragment =
-                activity.supportFragmentManager.findFragmentById(android.R.id.content)
-                    as FitnessAppFragment
-            val readCategory =
-                fragment.preferenceScreen.findPreference("read_permission_category")
-                    as PreferenceCategory?
-            val writeCategory =
-                fragment.preferenceScreen.findPreference("write_permission_category")
-                    as PreferenceCategory?
+            val fragment = getFragment(activity)
+            val readCategory = getPreferenceCategory(fragment, "read_permission_category")
+            val writeCategory = getPreferenceCategory(fragment, "write_permission_category")
+
             assertThat(readCategory?.preferenceCount).isEqualTo(1)
             assertThat(writeCategory?.preferenceCount).isEqualTo(1)
         }
         onView(withText("Exercise")).check(matches(isDisplayed()))
         onView(withText("Distance")).check(matches(isDisplayed()))
-        onView(withText("See app data")).check(doesNotExist())
 
         verify(healthConnectLogger, atLeast(1)).setPageId(PageName.APP_ACCESS_PAGE)
         verify(healthConnectLogger).logPageImpression()
@@ -288,22 +289,22 @@
         val scenario =
             launchFragment<FitnessAppFragment>(
                 bundleOf(
-                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
 
         scenario.onActivity { activity: TestActivity ->
-            val fragment =
-                activity.supportFragmentManager.findFragmentById(android.R.id.content)
-                    as FitnessAppFragment
+            val fragment = getFragment(activity)
             val mainSwitchPreference =
                 fragment.preferenceScreen.findPreference("allow_all_preference")
-                    as MainSwitchPreference?
+                    as HealthMainSwitchPreference?
 
             assertThat(mainSwitchPreference?.isChecked).isTrue()
         }
         // TODO (b/325680041) investigate why not active
         verify(healthConnectLogger)
             .logImpression(AppAccessElement.ALLOW_ALL_PERMISSIONS_SWITCH_INACTIVE)
-        onView(withText("See app data")).check(doesNotExist())
     }
 
     @Test
@@ -318,34 +319,57 @@
         val scenario =
             launchFragment<FitnessAppFragment>(
                 bundleOf(
-                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+                    EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                    EXTRA_APP_NAME to TEST_APP_NAME,
+                )
+            )
 
         scenario.onActivity { activity: TestActivity ->
-            val fragment =
-                activity.supportFragmentManager.findFragmentById(android.R.id.content)
-                    as FitnessAppFragment
+            val fragment = getFragment(activity)
 
             val mainSwitchPreference =
                 fragment.preferenceScreen.findPreference("allow_all_preference")
-                    as MainSwitchPreference?
+                    as HealthMainSwitchPreference?
 
             assertThat(mainSwitchPreference?.isChecked).isFalse()
         }
     }
 
     @Test
-    fun allowAll_toggleOff_showsDisconnectDialog() {
+    fun allowAll_toggleOff_withAdditional_andMedicalPermissions_showsDisconnectDialog() {
         val writePermission = FitnessPermission(EXERCISE, WRITE)
         val readPermission = FitnessPermission(DISTANCE, READ)
         whenever(viewModel.fitnessPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
         whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeFitnessShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeFitnessShouldIncludePastData()).thenReturn(true)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
         onView(withText("Allow all")).perform(click())
 
-        onView(withText("Remove all permissions?")).check(matches(isDisplayed()))
+        onView(withText("Remove all fitness and wellness permissions?"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " this data from Health Connect, including background and past data." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete fitness data from " + "$TEST_APP_NAME from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
         verify(healthConnectLogger)
             .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
         verify(healthConnectLogger)
@@ -354,12 +378,284 @@
             .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
         verify(healthConnectLogger)
             .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
 
-        onView(withText("See app data")).check(doesNotExist())
+    @Test
+    fun allowAll_toggleOff_withBackground_andMedicalPermissions_showsDisconnectDialog() {
+        val writePermission = FitnessPermission(EXERCISE, WRITE)
+        val readPermission = FitnessPermission(DISTANCE, READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeFitnessShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeFitnessShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
+
+        launchFragment<FitnessAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all fitness and wellness permissions?"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " this data from Health Connect, including background data." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete fitness data from " + "$TEST_APP_NAME from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
+
+    @Test
+    fun allowAll_toggleOff_withPastData_andMedicalPermissions_showsDisconnectDialog() {
+        val writePermission = FitnessPermission(EXERCISE, WRITE)
+        val readPermission = FitnessPermission(DISTANCE, READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeFitnessShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeFitnessShouldIncludePastData()).thenReturn(true)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
+
+        launchFragment<FitnessAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all fitness and wellness permissions?"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " this data from Health Connect, including past data." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete fitness data from " + "$TEST_APP_NAME from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
+
+    @Test
+    fun allowAll_toggleOff_withAdditional_andNoMedicalPermissions_showsDisconnectDialog() {
+        val writePermission = FitnessPermission(EXERCISE, WRITE)
+        val readPermission = FitnessPermission(DISTANCE, READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeFitnessShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeFitnessShouldIncludePastData()).thenReturn(true)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData<List<HealthPermission.MedicalPermission>>(emptyList())
+        }
+
+        launchFragment<FitnessAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all permissions?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " any data from Health Connect, including background and past data." +
+                        "\n\nThis doesn't affect other permissions this app may have, like location, " +
+                        "camera, or microphone."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete " + "$TEST_APP_NAME data from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
+
+    @Test
+    fun allowAll_toggleOff_noAdditional_andMedicalPermissions_showsDisconnectDialog() {
+        val writePermission = FitnessPermission(EXERCISE, WRITE)
+        val readPermission = FitnessPermission(DISTANCE, READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeFitnessShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeFitnessShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
+
+        launchFragment<FitnessAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all fitness and wellness permissions?"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " this data from Health Connect." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete fitness data from " + "$TEST_APP_NAME from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
+
+    @Test
+    fun allowAll_toggleOff_withBackground_andNoMedicalPermissions_showsDisconnectDialog() {
+        val writePermission = FitnessPermission(EXERCISE, WRITE)
+        val readPermission = FitnessPermission(DISTANCE, READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeFitnessShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeFitnessShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData<List<HealthPermission.MedicalPermission>>(emptyList())
+        }
+
+        launchFragment<FitnessAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all permissions?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " any data from Health Connect, including background data." +
+                        "\n\nThis doesn't affect other permissions this app may have, like location, " +
+                        "camera, or microphone."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete " + "$TEST_APP_NAME data from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
+
+    @Test
+    fun allowAll_toggleOff_noAdditional_andNoMedical_showsDisconnectDialog() {
+        val writePermission = FitnessPermission(EXERCISE, WRITE)
+        val readPermission = FitnessPermission(DISTANCE, READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeFitnessShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeFitnessShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData<List<HealthPermission.MedicalPermission>>(emptyList())
+        }
+
+        launchFragment<FitnessAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all permissions?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " any data from Health Connect." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone, or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete " + "$TEST_APP_NAME data from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
     }
 
     @Test
     fun allowAll_toggleOff_onDialogRemoveAllClicked_disconnectAllPermissions() {
+        whenever(viewModel.revokeFitnessShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeFitnessShouldIncludePastData()).thenReturn(true)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         val writePermission = FitnessPermission(EXERCISE, WRITE)
         val readPermission = FitnessPermission(DISTANCE, READ)
         whenever(viewModel.fitnessPermissions).then {
@@ -370,7 +666,8 @@
         }
         whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
         onView(withText("Allow all")).perform(click())
 
         onView(withText("Remove all")).perform(click())
@@ -379,10 +676,10 @@
 
         onView(withText("Exercise")).check(matches(not(isChecked())))
         onView(withText("Distance")).check(matches(not(isChecked())))
-        onView(withText("See app data")).check(doesNotExist())
     }
 
     @Test
+    @Ignore("b/369796531 - unignore when more tests added")
     fun allowAll_toggleOff_deleteDataSelected_onDialogRemoveAllClicked_deleteIsCalled() {
         val writePermission = FitnessPermission(EXERCISE, WRITE)
         val readPermission = FitnessPermission(DISTANCE, READ)
@@ -394,7 +691,8 @@
         }
         whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
         onView(withText("Allow all")).perform(click())
 
         onView(withId(R.id.dialog_checkbox)).perform(click())
@@ -404,7 +702,7 @@
         verify(healthConnectLogger)
             .logInteraction(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
 
-        verify(viewModel).deleteAppData(safeEq(TEST_APP_PACKAGE_NAME), safeEq(TEST_APP_NAME))
+        verify(viewModel).deleteAppData(eq(TEST_APP_PACKAGE_NAME), eq(TEST_APP_NAME))
     }
 
     @Test
@@ -417,7 +715,8 @@
         whenever(healthPermissionReader.getApplicationRationaleIntent(TEST_APP_PACKAGE_NAME))
             .thenReturn(Intent())
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
 
         onView(
                 withText(
@@ -426,7 +725,9 @@
                         "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Read privacy policy")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -447,10 +748,16 @@
                 AdditionalAccessViewModel.State(
                     historyReadUIState =
                         AdditionalAccessViewModel.AdditionalPermissionState(
-                            isDeclared = true, isEnabled = false, isGranted = false)))
+                            isDeclared = true,
+                            isEnabled = false,
+                            isGranted = false,
+                        )
+                )
+            )
         }
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
 
         onIdle()
         onView(
@@ -458,7 +765,9 @@
                     "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Read privacy policy")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -478,7 +787,8 @@
         whenever(healthPermissionReader.getApplicationRationaleIntent(TEST_APP_PACKAGE_NAME))
             .thenReturn(Intent())
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
 
         onIdle()
         onView(
@@ -486,7 +796,9 @@
                     "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Read privacy policy")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -510,14 +822,17 @@
             .thenReturn(Intent(rationaleAction))
 
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
 
         onView(
                 withText(
                     "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Read privacy policy")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -528,8 +843,8 @@
     }
 
     @Test
-    fun seeAppData_isEnabled_buttonDisplayed() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsNewInformationArchitectureEnabled(true)
+    @EnableFlags(Flags.FLAG_NEW_INFORMATION_ARCHITECTURE)
+    fun seeAppData_showManageAppSectionEnabled_isEnabled_buttonDisplayed() {
 
         val writePermission = FitnessPermission(EXERCISE, WRITE)
         val readPermission = FitnessPermission(DISTANCE, READ)
@@ -541,19 +856,48 @@
         }
         whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                EXTRA_APP_NAME to TEST_APP_NAME,
+                SHOW_MANAGE_APP_SECTION to true, // shows manage app permission
+            )
+        )
         onView(withText("See app data")).perform(scrollTo()).check(matches(isDisplayed()))
         onView(withText("Delete app data")).check(doesNotExist())
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_NEW_INFORMATION_ARCHITECTURE)
+    fun seeAppData_hideManageAppPermissionEnabled_isEnabled_buttonDisplayed() {
+        val writePermission = FitnessPermission(EXERCISE, WRITE)
+        val readPermission = FitnessPermission(DISTANCE, READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.grantedFitnessPermissions).then {
+            MutableLiveData(setOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(true) }
+        launchFragment<FitnessAppFragment>(
+            bundleOf(
+                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
+                EXTRA_APP_NAME to TEST_APP_NAME,
+                SHOW_MANAGE_APP_SECTION to false, // hides manage app permission
+            )
+        )
+        onView(withText("Manage app")).check(doesNotExist())
+        onView(withText("See app data")).check(doesNotExist())
+    }
+
+    @Test
     fun additionalAccessState_notValid_hidesAdditionalAccess() {
         whenever(additionalAccessViewModel.additionalAccessState).then {
             MutableLiveData(AdditionalAccessViewModel.State())
         }
 
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
 
         onView(withText(R.string.additional_access_label)).check(doesNotExist())
     }
@@ -563,13 +907,15 @@
         val validState =
             AdditionalAccessViewModel.State(
                 exerciseRoutePermissionUIState = PermissionUiState.ASK_EVERY_TIME,
-                exercisePermissionUIState = PermissionUiState.ASK_EVERY_TIME)
+                exercisePermissionUIState = PermissionUiState.ASK_EVERY_TIME,
+            )
         whenever(additionalAccessViewModel.additionalAccessState).then {
             MutableLiveData(validState)
         }
 
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
 
         onView(withText(R.string.additional_access_label))
             .perform(scrollTo())
@@ -582,13 +928,18 @@
             AdditionalAccessViewModel.State(
                 backgroundReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = false, isGranted = false))
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    )
+            )
         whenever(additionalAccessViewModel.additionalAccessState).then {
             MutableLiveData(validState)
         }
 
         launchFragment<FitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
 
         onView(withText(R.string.additional_access_label))
             .perform(scrollTo())
@@ -597,23 +948,24 @@
     }
 
     @Test
-    @Ignore //TODO(b/352003559): Unignore when fixed flakiness.
+    @Ignore // TODO(b/352003559): Unignore when fixed flakiness.
     fun additionalAccessState_onClick_navigatesToAdditionalAccessFragment() {
         val validState =
             AdditionalAccessViewModel.State(
                 exerciseRoutePermissionUIState = PermissionUiState.ASK_EVERY_TIME,
-                exercisePermissionUIState = PermissionUiState.ASK_EVERY_TIME)
+                exercisePermissionUIState = PermissionUiState.ASK_EVERY_TIME,
+            )
         whenever(additionalAccessViewModel.additionalAccessState).then {
             MutableLiveData(validState)
         }
 
         launchFragment<FitnessAppFragment>(
-            bundleOf(
-                EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)) {
-                navHostController.setGraph(R.navigation.nav_graph)
-                navHostController.setCurrentDestination(R.id.fitnessAppFragment)
-                Navigation.setViewNavController(requireView(), navHostController)
-            }
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        ) {
+            navHostController.setGraph(R.navigation.nav_graph)
+            navHostController.setCurrentDestination(R.id.fitnessAppFragment)
+            Navigation.setViewNavController(requireView(), navHostController)
+        }
         onView(withText(R.string.additional_access_label)).perform(scrollTo()).perform(click())
 
         onIdle()
@@ -621,4 +973,17 @@
             .isEqualTo(R.id.additionalAccessFragment)
         verify(healthConnectLogger).logInteraction(AppAccessElement.ADDITIONAL_ACCESS_BUTTON)
     }
+
+    private fun getFragment(activity: TestActivity): HealthPreferenceFragment {
+        return activity.supportFragmentManager.findFragmentById(android.R.id.content)
+            as HealthPreferenceFragment
+    }
+
+    private fun getPreferenceCategory(
+        fragment: HealthPreferenceFragment,
+        id: String,
+    ): PreferenceCategory? {
+        return fragment.preferenceScreen.findPreference(id) as PreferenceCategory?
+    }
+    // TODO (b/369832891) add tests for deletion dialogs for old IA
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/LoadAppPermissionsStatusUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/LoadAppPermissionsStatusUseCaseTest.kt
index 9a8e5f0..a107e05 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/LoadAppPermissionsStatusUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/LoadAppPermissionsStatusUseCaseTest.kt
@@ -17,13 +17,12 @@
 
 import com.android.healthconnect.controller.permissions.app.HealthPermissionStatus
 import com.android.healthconnect.controller.permissions.app.LoadAppPermissionsStatusUseCase
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.di.FakeGetGrantedHealthPermissionsUseCase
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -33,6 +32,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class LoadAppPermissionsStatusUseCaseTest {
@@ -47,7 +47,10 @@
         hiltRule.inject()
         loadAppPermissionsStatusUseCase =
             LoadAppPermissionsStatusUseCase(
-                loadGrantedHealthPermissionsUseCase, healthPermissionReader, Dispatchers.Main)
+                loadGrantedHealthPermissionsUseCase,
+                healthPermissionReader,
+                Dispatchers.Main,
+            )
     }
 
     @Test
@@ -58,7 +61,9 @@
             FitnessPermission(FitnessPermissionType.EXERCISE, PermissionsAccessType.WRITE)
 
         loadGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME, listOf(readExercisePermission.toString()))
+            TEST_APP_PACKAGE_NAME,
+            listOf(readExercisePermission.toString()),
+        )
         whenever(healthPermissionReader.getValidHealthPermissions(TEST_APP_PACKAGE_NAME))
             .thenReturn(listOf(readExercisePermission, writeExercisePermission))
 
@@ -67,7 +72,9 @@
             .containsExactlyElementsIn(
                 listOf(
                     HealthPermissionStatus(readExercisePermission, true),
-                    HealthPermissionStatus(writeExercisePermission, false)))
+                    HealthPermissionStatus(writeExercisePermission, false),
+                )
+            )
     }
 
     @Test
@@ -79,13 +86,15 @@
 
         loadGrantedHealthPermissionsUseCase.updateData(
             TEST_APP_PACKAGE_NAME,
-            listOf(readExercisePermission.toString(), writeExercisePermission.toString()))
+            listOf(readExercisePermission.toString(), writeExercisePermission.toString()),
+        )
         whenever(healthPermissionReader.getValidHealthPermissions(TEST_APP_PACKAGE_NAME))
             .thenReturn(listOf(writeExercisePermission))
 
         val result = loadAppPermissionsStatusUseCase.invoke(TEST_APP_PACKAGE_NAME)
         assertThat(result)
             .containsExactlyElementsIn(
-                listOf(HealthPermissionStatus(writeExercisePermission, true)))
+                listOf(HealthPermissionStatus(writeExercisePermission, true))
+            )
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/LoadHealthPermissionAppsTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/LoadHealthPermissionAppsTest.kt
index 1ddc296..585e0fa 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/LoadHealthPermissionAppsTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/LoadHealthPermissionAppsTest.kt
@@ -16,14 +16,10 @@
 package com.android.healthconnect.controller.tests.permissions.connectedapps
 
 import android.content.Context
-import android.health.connect.RecordTypeInfoResponse
-import android.health.connect.datatypes.Record
-import android.os.OutcomeReceiver
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.permissions.connectedapps.LoadHealthPermissionApps
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppInfoReader
-import com.android.healthconnect.controller.shared.app.AppPermissionsType
 import com.android.healthconnect.controller.shared.app.AppPermissionsType.COMBINED_PERMISSIONS
 import com.android.healthconnect.controller.shared.app.AppPermissionsType.FITNESS_PERMISSIONS_ONLY
 import com.android.healthconnect.controller.shared.app.AppPermissionsType.MEDICAL_PERMISSIONS_ONLY
@@ -36,11 +32,9 @@
 import com.android.healthconnect.controller.tests.utils.di.FakeGetContributorAppInfoUseCase
 import com.android.healthconnect.controller.tests.utils.di.FakeGetGrantedHealthPermissionsUseCase
 import com.android.healthconnect.controller.tests.utils.di.FakeQueryRecentAccessLogsUseCase
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
-import org.mockito.kotlin.any
 import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -50,8 +44,8 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
-import org.mockito.Mockito.doAnswer
-import org.mockito.invocation.InvocationOnMock
+import org.mockito.kotlin.any
+import org.mockito.kotlin.whenever
 
 @ExperimentalCoroutinesApi
 @HiltAndroidTest
@@ -80,7 +74,8 @@
                 getContributorAppInfoUseCase,
                 queryRecentAccessLogsUseCase,
                 appInfoReader,
-                Dispatchers.Main)
+                Dispatchers.Main,
+            )
     }
 
     @After
@@ -96,7 +91,9 @@
         whenever(healthPermissionReader.getAppsWithHealthPermissions())
             .thenReturn(listOf(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2))
         loadGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME, listOf("PERM_1", "PERM_2"))
+            TEST_APP_PACKAGE_NAME,
+            listOf("PERM_1", "PERM_2"),
+        )
         loadGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME_2, listOf())
 
         // appsWithData
@@ -119,9 +116,17 @@
             .containsExactlyElementsIn(
                 listOf(
                     ConnectedAppMetadata(
-                        testAppMetadata, status = ConnectedAppStatus.ALLOWED, healthUsageLastAccess = null),
+                        testAppMetadata,
+                        status = ConnectedAppStatus.ALLOWED,
+                        healthUsageLastAccess = null,
+                    ),
                     ConnectedAppMetadata(
-                        testApp2Metadata, status = ConnectedAppStatus.DENIED, healthUsageLastAccess = null)))
+                        testApp2Metadata,
+                        status = ConnectedAppStatus.DENIED,
+                        healthUsageLastAccess = null,
+                    ),
+                )
+            )
     }
 
     @Test
@@ -130,7 +135,9 @@
         whenever(healthPermissionReader.getAppsWithHealthPermissions())
             .thenReturn(listOf(TEST_APP_PACKAGE_NAME))
         loadGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME, listOf("PERM_1", "PERM_2"))
+            TEST_APP_PACKAGE_NAME,
+            listOf("PERM_1", "PERM_2"),
+        )
         val testAppMetadata = appInfoReader.getAppMetadata(TEST_APP_PACKAGE_NAME)
         val testApp2Metadata = appInfoReader.getAppMetadata(TEST_APP_PACKAGE_NAME_2)
 
@@ -152,9 +159,17 @@
             .containsExactlyElementsIn(
                 listOf(
                     ConnectedAppMetadata(
-                        testAppMetadata, status = ConnectedAppStatus.ALLOWED, healthUsageLastAccess =  null),
+                        testAppMetadata,
+                        status = ConnectedAppStatus.ALLOWED,
+                        healthUsageLastAccess = null,
+                    ),
                     ConnectedAppMetadata(
-                        testApp2Metadata, status = ConnectedAppStatus.INACTIVE, healthUsageLastAccess = null)))
+                        testApp2Metadata,
+                        status = ConnectedAppStatus.INACTIVE,
+                        healthUsageLastAccess = null,
+                    ),
+                )
+            )
     }
 
     @Test
@@ -187,9 +202,17 @@
                 .containsExactlyElementsIn(
                     listOf(
                         ConnectedAppMetadata(
-                            testAppMetadata, status = ConnectedAppStatus.DENIED, healthUsageLastAccess = null),
+                            testAppMetadata,
+                            status = ConnectedAppStatus.DENIED,
+                            healthUsageLastAccess = null,
+                        ),
                         ConnectedAppMetadata(
-                            oldTestAppMetadata, status = ConnectedAppStatus.NEEDS_UPDATE, healthUsageLastAccess = null)))
+                            oldTestAppMetadata,
+                            status = ConnectedAppStatus.NEEDS_UPDATE,
+                            healthUsageLastAccess = null,
+                        ),
+                    )
+                )
         }
 
     @Test
@@ -199,7 +222,9 @@
             .thenReturn(listOf(TEST_APP_PACKAGE_NAME, OLD_PERMISSIONS_TEST_APP_PACKAGE_NAME))
         loadGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME, listOf("PERM_1"))
         loadGrantedHealthPermissionsUseCase.updateData(
-            OLD_PERMISSIONS_TEST_APP_PACKAGE_NAME, listOf("PERM_1"))
+            OLD_PERMISSIONS_TEST_APP_PACKAGE_NAME,
+            listOf("PERM_1"),
+        )
         val testAppMetadata = appInfoReader.getAppMetadata(TEST_APP_PACKAGE_NAME)
         val oldTestAppMetadata = appInfoReader.getAppMetadata(OLD_PERMISSIONS_TEST_APP_PACKAGE_NAME)
 
@@ -222,18 +247,30 @@
             .containsExactlyElementsIn(
                 listOf(
                     ConnectedAppMetadata(
-                        testAppMetadata, status = ConnectedAppStatus.ALLOWED, healthUsageLastAccess = null),
+                        testAppMetadata,
+                        status = ConnectedAppStatus.ALLOWED,
+                        healthUsageLastAccess = null,
+                    ),
                     ConnectedAppMetadata(
-                        oldTestAppMetadata, status = ConnectedAppStatus.ALLOWED, healthUsageLastAccess = null)))
+                        oldTestAppMetadata,
+                        status = ConnectedAppStatus.ALLOWED,
+                        healthUsageLastAccess = null,
+                    ),
+                )
+            )
     }
 
     @Test
     fun appsWithMedicalPermissions_correctlyReturnsAppPermissionsTypes() = runTest {
         // appsWithHealthPermissions
         whenever(healthPermissionReader.getAppsWithHealthPermissions())
-            .thenReturn(listOf(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2, TEST_APP_PACKAGE_NAME_3))
+            .thenReturn(
+                listOf(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2, TEST_APP_PACKAGE_NAME_3)
+            )
         loadGrantedHealthPermissionsUseCase.updateData(
-            TEST_APP_PACKAGE_NAME, listOf("PERM_1", "PERM_2"))
+            TEST_APP_PACKAGE_NAME,
+            listOf("PERM_1", "PERM_2"),
+        )
         loadGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME_2, listOf())
         loadGrantedHealthPermissionsUseCase.updateData(TEST_APP_PACKAGE_NAME_3, listOf())
 
@@ -262,10 +299,24 @@
             .containsExactlyElementsIn(
                 listOf(
                     ConnectedAppMetadata(
-                        testAppMetadata, status = ConnectedAppStatus.ALLOWED, permissionsType = FITNESS_PERMISSIONS_ONLY, healthUsageLastAccess = null),
+                        testAppMetadata,
+                        status = ConnectedAppStatus.ALLOWED,
+                        permissionsType = FITNESS_PERMISSIONS_ONLY,
+                        healthUsageLastAccess = null,
+                    ),
                     ConnectedAppMetadata(
-                        testApp2Metadata, status = ConnectedAppStatus.DENIED, permissionsType = MEDICAL_PERMISSIONS_ONLY, healthUsageLastAccess = null),
+                        testApp2Metadata,
+                        status = ConnectedAppStatus.DENIED,
+                        permissionsType = MEDICAL_PERMISSIONS_ONLY,
+                        healthUsageLastAccess = null,
+                    ),
                     ConnectedAppMetadata(
-                        testApp3Metadata, status = ConnectedAppStatus.DENIED, permissionsType = COMBINED_PERMISSIONS, healthUsageLastAccess = null)))
+                        testApp3Metadata,
+                        status = ConnectedAppStatus.DENIED,
+                        permissionsType = COMBINED_PERMISSIONS,
+                        healthUsageLastAccess = null,
+                    ),
+                )
+            )
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/MedicalAppFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/MedicalAppFragmentTest.kt
index ad6e657..9b294ee 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/MedicalAppFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/MedicalAppFragmentTest.kt
@@ -32,6 +32,7 @@
 import androidx.test.espresso.intent.Intents
 import androidx.test.espresso.intent.Intents.intended
 import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction
+import androidx.test.espresso.matcher.RootMatchers.isDialog
 import androidx.test.espresso.matcher.ViewMatchers.isChecked
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -46,26 +47,22 @@
 import com.android.healthconnect.controller.permissions.app.MedicalAppFragment
 import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.ALL_MEDICAL_DATA
-import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.IMMUNIZATION
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType.VACCINES
 import com.android.healthconnect.controller.shared.Constants.EXTRA_APP_NAME
 import com.android.healthconnect.controller.shared.Constants.SHOW_MANAGE_APP_SECTION
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
+import com.android.healthconnect.controller.shared.preference.HealthMainSwitchPreference
 import com.android.healthconnect.controller.tests.TestActivity
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.safeEq
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.logging.AppAccessElement
 import com.android.healthconnect.controller.utils.logging.DisconnectAppDialogElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
-import com.android.settingslib.widget.MainSwitchPreference
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -74,21 +71,24 @@
 import java.time.ZoneId
 import java.util.Locale
 import java.util.TimeZone
-import javax.inject.Inject
 import org.hamcrest.Matchers.not
 import org.junit.After
 import org.junit.Before
 import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
-import org.mockito.Mockito.*
+import org.mockito.Mockito.anyString
+import org.mockito.Mockito.atLeast
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class MedicalAppFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
 
     @BindValue val viewModel: AppPermissionViewModel = mock()
     @BindValue val healthConnectLogger: HealthConnectLogger = mock()
@@ -103,7 +103,6 @@
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
         navHostController = TestNavHostController(context)
         hiltRule.inject()
-        (fakeFeatureUtils as FakeFeatureUtils).setIsNewInformationArchitectureEnabled(false)
 
         whenever(viewModel.revokeAllHealthPermissionsState).then { MutableLiveData(NotStarted) }
         whenever(viewModel.allMedicalPermissionsGranted).then { MediatorLiveData(false) }
@@ -116,7 +115,7 @@
         val accessDate = Instant.parse("2022-10-20T18:40:13.00Z")
         whenever(viewModel.loadAccessDate(anyString())).thenReturn(accessDate)
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -149,7 +148,7 @@
     }
 
     @Test
-    fun test_noPermissions() {
+    fun noPermissions() {
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf<HealthPermissionStatus>())
         }
@@ -179,8 +178,8 @@
     }
 
     @Test
-    fun test_readPermission() {
-        val permission = MedicalPermission(IMMUNIZATION)
+    fun readPermission() {
+        val permission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then { MutableLiveData(listOf(permission)) }
         whenever(viewModel.grantedMedicalPermissions).then { MutableLiveData(setOf(permission)) }
 
@@ -205,12 +204,25 @@
             assertThat(readCategory?.preferenceCount).isEqualTo(1)
             assertThat(writeCategory?.preferenceCount).isEqualTo(0)
         }
-        onView(withText("Immunization")).check(matches(isDisplayed()))
+        onView(withText("Vaccines")).check(matches(isDisplayed()))
         onView(withText("See app data")).perform(scrollTo()).check(matches(isDisplayed()))
     }
 
     @Test
-    fun test_writePermission() {
+    fun logPageImpression() {
+        val permission = MedicalPermission(VACCINES)
+        whenever(viewModel.medicalPermissions).then { MutableLiveData(listOf(permission)) }
+        whenever(viewModel.grantedMedicalPermissions).then { MutableLiveData(setOf(permission)) }
+        launchFragment<MedicalAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.MEDICAL_APP_ACCESS_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+    }
+
+    @Test
+    fun writePermission() {
         val permission = MedicalPermission(ALL_MEDICAL_DATA)
         whenever(viewModel.medicalPermissions).then { MutableLiveData(listOf(permission)) }
         whenever(viewModel.grantedMedicalPermissions).then { MutableLiveData(setOf(permission)) }
@@ -241,9 +253,9 @@
     }
 
     @Test
-    fun test_readAndWritePermission() {
+    fun readAndWritePermission() {
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -273,17 +285,14 @@
             assertThat(writeCategory?.preferenceCount).isEqualTo(1)
         }
         onView(withText("All health records")).check(matches(isDisplayed()))
-        onView(withText("Immunization")).check(matches(isDisplayed()))
+        onView(withText("Vaccines")).check(matches(isDisplayed()))
         onView(withText("See app data")).perform(scrollTo()).check(matches(isDisplayed()))
-
-        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.UNKNOWN_PAGE)
-        verify(healthConnectLogger).logPageImpression()
     }
 
     @Test
-    fun test_allowAllToggleOn_whenAllPermissionsOn() {
+    fun allowAllToggleOn_whenAllPermissionsOn() {
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -306,7 +315,7 @@
                     as MedicalAppFragment
             val mainSwitchPreference =
                 fragment.preferenceScreen.findPreference("allow_all_preference")
-                    as MainSwitchPreference?
+                    as HealthMainSwitchPreference?
 
             assertThat(mainSwitchPreference?.isChecked).isTrue()
         }
@@ -314,9 +323,9 @@
     }
 
     @Test
-    fun test_allowAllToggleOff_whenAtLeastOnePermissionOff() {
+    fun allowAllToggleOff_whenAtLeastOnePermissionOff() {
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -337,26 +346,158 @@
 
             val mainSwitchPreference =
                 fragment.preferenceScreen.findPreference("allow_all_preference")
-                    as MainSwitchPreference?
+                    as HealthMainSwitchPreference?
 
             assertThat(mainSwitchPreference?.isChecked).isFalse()
         }
     }
 
     @Test
-    fun allowAll_toggleOff_showsDisconnectDialog() {
+    fun allowAll_toggleOff_withAdditionalPermissions_showsDisconnectDialog() {
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
         whenever(viewModel.allMedicalPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeMedicalShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeMedicalShouldIncludePastData()).thenReturn(true)
         launchFragment<MedicalAppFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
         )
         onView(withText("Allow all")).perform(click())
 
-        onView(withText("Remove all permissions?")).check(matches(isDisplayed()))
+        onView(withText("Remove all health record permissions?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " this data from Health Connect, including background and past data." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete health records from " + "$TEST_APP_NAME from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
+
+    @Test
+    fun allowAll_toggleOff_withBackgroundPermission_showsDisconnectDialog() {
+        val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
+        val readPermission = MedicalPermission(VACCINES)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allMedicalPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeMedicalShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeMedicalShouldIncludePastData()).thenReturn(false)
+        launchFragment<MedicalAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all health record permissions?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " this data from Health Connect, including background data." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete health records from " + "$TEST_APP_NAME from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
+
+    @Test
+    fun allowAll_toggleOff_withPastDataPermission_showsDisconnectDialog() {
+        val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
+        val readPermission = MedicalPermission(VACCINES)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allMedicalPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeMedicalShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeMedicalShouldIncludePastData()).thenReturn(true)
+        launchFragment<MedicalAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all health record permissions?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " this data from Health Connect, including past data." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete health records from " + "$TEST_APP_NAME from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CANCEL_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
+    }
+
+    @Test
+    fun allowAll_toggleOff_noAdditionalPermissions_showsDisconnectDialog() {
+        val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
+        val readPermission = MedicalPermission(VACCINES)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.allMedicalPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeMedicalShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeMedicalShouldIncludePastData()).thenReturn(false)
+        launchFragment<MedicalAppFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
+        )
+        onView(withText("Allow all")).perform(click())
+
+        onView(withText("Remove all health record permissions?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "$TEST_APP_NAME will no longer be able to read or write" +
+                        " this data from Health Connect." +
+                        "\n\nThis doesn't affect other permissions this app may have, like camera, " +
+                        "microphone or location."
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Also delete health records from " + "$TEST_APP_NAME from Health Connect"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
         verify(healthConnectLogger)
             .logImpression(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONTAINER)
         verify(healthConnectLogger)
@@ -370,7 +511,7 @@
     @Test
     fun allowAll_toggleOff_onDialogRemoveAllClicked_disconnectAllPermissions() {
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -378,6 +519,8 @@
             MutableLiveData(setOf(writePermission, readPermission))
         }
         whenever(viewModel.allMedicalPermissionsGranted).then { MediatorLiveData(true) }
+        whenever(viewModel.revokeMedicalShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeMedicalShouldIncludePastData()).thenReturn(true)
         launchFragment<MedicalAppFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME, EXTRA_APP_NAME to TEST_APP_NAME)
         )
@@ -388,14 +531,15 @@
             .logInteraction(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_CONFIRM_BUTTON)
 
         onView(withText("All health records")).check(matches(not(isChecked())))
-        onView(withText("Immunization")).check(matches(not(isChecked())))
+        onView(withText("Vaccines")).check(matches(not(isChecked())))
         onView(withText("See app data")).perform(scrollTo()).check(matches(isDisplayed()))
     }
 
     @Test
+    @Ignore("b/369796531 - unignore when more tests added")
     fun allowAll_toggleOff_deleteDataSelected_onDialogRemoveAllClicked_deleteIsCalled() {
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -415,12 +559,12 @@
         verify(healthConnectLogger)
             .logInteraction(DisconnectAppDialogElement.DISCONNECT_APP_DIALOG_DELETE_CHECKBOX)
 
-        verify(viewModel).deleteAppData(safeEq(TEST_APP_PACKAGE_NAME), safeEq(TEST_APP_NAME))
+        verify(viewModel).deleteAppData(eq(TEST_APP_PACKAGE_NAME), eq(TEST_APP_NAME))
     }
 
     @Test
     fun footerWithGrantTime_whenNoHistoryRead_isNotDisplayed() {
-        val permission = MedicalPermission(IMMUNIZATION)
+        val permission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then { MutableLiveData(listOf(permission)) }
         whenever(viewModel.grantedMedicalPermissions).then { MutableLiveData(setOf(permission)) }
         whenever(healthPermissionReader.isRationaleIntentDeclared(TEST_APP_PACKAGE_NAME))
@@ -437,7 +581,7 @@
                     "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
                 )
             )
             .perform(scrollTo())
@@ -449,7 +593,7 @@
     @Test
     @Ignore // TODO(b/353512381): Unignore when not flaky.
     fun footerWithGrantTime_whenHistoryRead_isNotDisplayed() {
-        val permission = MedicalPermission(IMMUNIZATION)
+        val permission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then { MutableLiveData(listOf(permission)) }
         whenever(viewModel.grantedMedicalPermissions).then { MutableLiveData(setOf(permission)) }
         whenever(healthPermissionReader.isRationaleIntentDeclared(TEST_APP_PACKAGE_NAME))
@@ -478,7 +622,7 @@
                     "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
                 )
             )
             .perform(scrollTo())
@@ -490,7 +634,7 @@
     @Test
     @Ignore
     fun footerWithoutGrantTime_isDisplayed() {
-        val permission = MedicalPermission(IMMUNIZATION)
+        val permission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then { MutableLiveData(listOf(permission)) }
         whenever(viewModel.grantedMedicalPermissions).then {
             MutableLiveData<Set<MedicalPermission>>(setOf())
@@ -510,7 +654,7 @@
                     "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
                 )
             )
             .perform(scrollTo())
@@ -524,7 +668,7 @@
     @Ignore
     fun whenClickOnPrivacyPolicyLink_startsRationaleActivity() {
         val rationaleAction = "android.intent.action.VIEW_PERMISSION_USAGE"
-        val permission = MedicalPermission(IMMUNIZATION)
+        val permission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then { MutableLiveData(listOf(permission)) }
         whenever(viewModel.grantedMedicalPermissions).then {
             MutableLiveData<Set<MedicalPermission>>(setOf())
@@ -544,7 +688,7 @@
                     "To manage other Android permissions this app can " +
                         "access, go to Settings > Apps" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
                 )
             )
             .perform(scrollTo())
@@ -559,7 +703,7 @@
     @Test
     fun seeAppData_shouldShowManageDataSection_displayed() {
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -582,7 +726,7 @@
     @Test
     fun seeAppData_shouldNotSowManageDataSection_notDisplayed() {
         val writePermission = MedicalPermission(ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(IMMUNIZATION)
+        val readPermission = MedicalPermission(VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/MockedFitnessAppFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/MockedFitnessAppFragmentTest.kt
index 1ac4c0f..16f1168 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/MockedFitnessAppFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/MockedFitnessAppFragmentTest.kt
@@ -24,6 +24,7 @@
 import androidx.core.os.bundleOf
 import androidx.test.espresso.Espresso.onView
 import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.action.ViewActions.scrollTo
 import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.matcher.RootMatchers.isDialog
@@ -31,50 +32,57 @@
 import androidx.test.espresso.matcher.ViewMatchers.withText
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
 import com.android.healthconnect.controller.permissions.app.FitnessAppFragment
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.fromPermissionString
 import com.android.healthconnect.controller.service.HealthPermissionManagerModule
 import com.android.healthconnect.controller.shared.Constants
+import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
-import com.android.healthconnect.controller.tests.utils.isAbove
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import dagger.hilt.android.testing.UninstallModules
-import javax.inject.Inject
-import org.hamcrest.Matchers.allOf
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+import org.mockito.Mockito
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.never
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 @UninstallModules(HealthPermissionManagerModule::class)
 class MockedFitnessAppFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
     @BindValue val healthPermissionManager: HealthPermissionManager = mock()
+    @BindValue val healthPermissionReader: HealthPermissionReader = mock()
 
     @Before
     fun setup() {
         hiltRule.inject()
-        (fakeFeatureUtils as FakeFeatureUtils).setIsNewInformationArchitectureEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsExerciseRoutesReadAllEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
         toggleAnimation(false)
+        whenever(healthPermissionReader.getValidHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .thenReturn(
+                listOf(
+                    fromPermissionString(HealthPermissions.READ_EXERCISE),
+                    fromPermissionString(HealthPermissions.READ_HEART_RATE),
+                    fromPermissionString(HealthPermissions.READ_EXERCISE_ROUTES),
+                    fromPermissionString(HealthPermissions.WRITE_STEPS),
+                    fromPermissionString(HealthPermissions.READ_HEALTH_DATA_HISTORY),
+                )
+            )
     }
 
     @After
     fun tearDown() {
         toggleAnimation(true)
+        Mockito.reset(healthPermissionManager)
+        Mockito.reset(healthPermissionReader)
     }
 
     @Test
@@ -83,16 +91,19 @@
             .thenReturn(
                 listOf(
                     HealthPermissions.READ_EXERCISE,
-                    HealthPermissions.READ_SLEEP,
+                    HealthPermissions.READ_HEART_RATE,
                     HealthPermissions.READ_EXERCISE_ROUTES,
-                    HealthPermissions.READ_HEALTH_DATA_HISTORY))
+                )
+            )
 
         launchFragment<FitnessAppFragment>(
             bundleOf(
                 Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
-                Constants.EXTRA_APP_NAME to TEST_APP_NAME))
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
 
-        onView(allOf(withText("Exercise"), isAbove(withText("Allowed to write")))).perform(click())
+        onView(withText("Exercise")).perform(scrollTo()).perform(click())
 
         // check for dialog
         onView(withText("Disable both data types?"))
@@ -100,7 +111,9 @@
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "$TEST_APP_NAME requires exercise access in order for exercise routes to be enabled"))
+                    "$TEST_APP_NAME requires exercise access in order for exercise routes to be enabled"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Yes")).inRoot(isDialog()).perform(click())
@@ -111,7 +124,9 @@
             .revokeHealthPermission(TEST_APP_PACKAGE_NAME, HealthPermissions.READ_EXERCISE_ROUTES)
         verify(healthPermissionManager, never())
             .revokeHealthPermission(
-                TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEALTH_DATA_HISTORY)
+                TEST_APP_PACKAGE_NAME,
+                HealthPermissions.READ_HEALTH_DATA_HISTORY,
+            )
     }
 
     @Test
@@ -121,12 +136,15 @@
             .thenAnswer {
                 if (revokeCalled) {
                     listOf(
-                        HealthPermissions.READ_EXERCISE, HealthPermissions.READ_HEALTH_DATA_HISTORY)
+                        HealthPermissions.READ_EXERCISE,
+                        HealthPermissions.READ_HEALTH_DATA_HISTORY,
+                    )
                 } else {
                     listOf(
                         HealthPermissions.READ_EXERCISE,
                         HealthPermissions.READ_EXERCISE_ROUTES,
-                        HealthPermissions.READ_HEALTH_DATA_HISTORY)
+                        HealthPermissions.READ_HEALTH_DATA_HISTORY,
+                    )
                 }
             }
 
@@ -134,7 +152,10 @@
         // calling the revoke API again
         whenever(
                 healthPermissionManager.revokeHealthPermission(
-                    TEST_APP_PACKAGE_NAME, HealthPermissions.READ_EXERCISE_ROUTES))
+                    TEST_APP_PACKAGE_NAME,
+                    HealthPermissions.READ_EXERCISE_ROUTES,
+                )
+            )
             .then {
                 revokeCalled = true
                 null
@@ -143,9 +164,11 @@
         launchFragment<FitnessAppFragment>(
             bundleOf(
                 Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
-                Constants.EXTRA_APP_NAME to TEST_APP_NAME))
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
 
-        onView(allOf(withText("Exercise"), isAbove(withText("Allowed to write")))).perform(click())
+        onView(withText("Exercise")).perform(scrollTo()).perform(click())
 
         // check for dialog
         onView(withText("Disable both data types?"))
@@ -153,7 +176,9 @@
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "$TEST_APP_NAME requires exercise access in order for exercise routes to be enabled"))
+                    "$TEST_APP_NAME requires exercise access in order for exercise routes to be enabled"
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Yes")).inRoot(isDialog()).perform(click())
@@ -164,31 +189,39 @@
             .revokeHealthPermission(TEST_APP_PACKAGE_NAME, HealthPermissions.READ_EXERCISE_ROUTES)
         verify(healthPermissionManager)
             .revokeHealthPermission(
-                TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEALTH_DATA_HISTORY)
+                TEST_APP_PACKAGE_NAME,
+                HealthPermissions.READ_HEALTH_DATA_HISTORY,
+            )
     }
 
     @Test
     fun exerciseRoutesAskEveryTime_revokeExercise_lastReadPermission_doesNotShowDialog() {
         whenever(healthPermissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
             .thenReturn(
-                listOf(HealthPermissions.READ_EXERCISE, HealthPermissions.READ_HEALTH_DATA_HISTORY))
+                listOf(HealthPermissions.READ_EXERCISE, HealthPermissions.READ_HEALTH_DATA_HISTORY)
+            )
 
         whenever(
                 healthPermissionManager.getHealthPermissionsFlags(
                     TEST_APP_PACKAGE_NAME,
-                    listOf(
-                        HealthPermissions.READ_EXERCISE_ROUTES, HealthPermissions.READ_EXERCISE)))
+                    listOf(HealthPermissions.READ_EXERCISE_ROUTES, HealthPermissions.READ_EXERCISE),
+                )
+            )
             .thenReturn(
                 mapOf(
                     HealthPermissions.READ_EXERCISE_ROUTES to FLAG_PERMISSION_USER_SET,
-                    HealthPermissions.READ_EXERCISE to FLAG_PERMISSION_USER_SET))
+                    HealthPermissions.READ_EXERCISE to FLAG_PERMISSION_USER_SET,
+                )
+            )
 
         launchFragment<FitnessAppFragment>(
             bundleOf(
                 Intent.EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME,
-                Constants.EXTRA_APP_NAME to TEST_APP_NAME))
+                Constants.EXTRA_APP_NAME to TEST_APP_NAME,
+            )
+        )
 
-        onView(allOf(withText("Exercise"), isAbove(withText("Allowed to write")))).perform(click())
+        onView(withText("Exercise")).perform(scrollTo()).perform(click())
 
         // check for dialog
         onView(withText("Disable both data types?")).check(doesNotExist())
@@ -199,6 +232,8 @@
             .revokeHealthPermission(TEST_APP_PACKAGE_NAME, HealthPermissions.READ_EXERCISE_ROUTES)
         verify(healthPermissionManager)
             .revokeHealthPermission(
-                TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEALTH_DATA_HISTORY)
+                TEST_APP_PACKAGE_NAME,
+                HealthPermissions.READ_HEALTH_DATA_HISTORY,
+            )
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/searchapps/SearchAppsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/searchapps/SearchAppsFragmentTest.kt
index f3d702b..a77f672 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/searchapps/SearchAppsFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/searchapps/SearchAppsFragmentTest.kt
@@ -28,7 +28,6 @@
 import com.android.healthconnect.controller.tests.utils.isAbove
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.AppPermissionsElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -46,6 +45,7 @@
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class SearchAppsFragmentTest {
@@ -79,7 +79,9 @@
                 listOf(
                     ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED),
                     ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.DENIED),
-                    ConnectedAppMetadata(TEST_APP_3, status = ConnectedAppStatus.INACTIVE)))
+                    ConnectedAppMetadata(TEST_APP_3, status = ConnectedAppStatus.INACTIVE),
+                )
+            )
         }
 
         launchFragment<SearchAppsFragment>(Bundle())
@@ -106,7 +108,9 @@
                 listOf(
                     ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.DENIED),
                     ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.DENIED),
-                    ConnectedAppMetadata(TEST_APP_3, status = ConnectedAppStatus.INACTIVE)))
+                    ConnectedAppMetadata(TEST_APP_3, status = ConnectedAppStatus.INACTIVE),
+                )
+            )
         }
 
         launchFragment<SearchAppsFragment>(Bundle())
@@ -127,7 +131,9 @@
                 listOf(
                     ConnectedAppMetadata(TEST_APP, status = ConnectedAppStatus.ALLOWED),
                     ConnectedAppMetadata(TEST_APP_2, status = ConnectedAppStatus.ALLOWED),
-                    ConnectedAppMetadata(TEST_APP_3, status = ConnectedAppStatus.ALLOWED)))
+                    ConnectedAppMetadata(TEST_APP_3, status = ConnectedAppStatus.ALLOWED),
+                )
+            )
         }
 
         launchFragment<SearchAppsFragment>(Bundle())
@@ -159,7 +165,9 @@
                 ConnectedAppMetadata(
                     TEST_APP,
                     status = ConnectedAppStatus.ALLOWED,
-                    permissionsType = AppPermissionsType.FITNESS_PERMISSIONS_ONLY))
+                    permissionsType = AppPermissionsType.FITNESS_PERMISSIONS_ONLY,
+                )
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         launchFragment<SearchAppsFragment>(Bundle()) {
@@ -181,7 +189,9 @@
                 ConnectedAppMetadata(
                     TEST_APP,
                     status = ConnectedAppStatus.ALLOWED,
-                    permissionsType = AppPermissionsType.MEDICAL_PERMISSIONS_ONLY))
+                    permissionsType = AppPermissionsType.MEDICAL_PERMISSIONS_ONLY,
+                )
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         launchFragment<SearchAppsFragment>(Bundle()) {
@@ -203,7 +213,9 @@
                 ConnectedAppMetadata(
                     TEST_APP,
                     status = ConnectedAppStatus.ALLOWED,
-                    permissionsType = AppPermissionsType.COMBINED_PERMISSIONS))
+                    permissionsType = AppPermissionsType.COMBINED_PERMISSIONS,
+                )
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         launchFragment<SearchAppsFragment>(Bundle()) {
@@ -224,13 +236,16 @@
             listOf(
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package3", appName = "thirdApp", icon = null),
-                    status = ConnectedAppStatus.ALLOWED),
+                    status = ConnectedAppStatus.ALLOWED,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package1", appName = "firstApp", icon = null),
-                    status = ConnectedAppStatus.ALLOWED),
+                    status = ConnectedAppStatus.ALLOWED,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package2", appName = "secondApp", icon = null),
-                    status = ConnectedAppStatus.ALLOWED),
+                    status = ConnectedAppStatus.ALLOWED,
+                ),
             )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectedApps) }
 
@@ -248,13 +263,16 @@
             listOf(
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package3", appName = "thirdApp", icon = null),
-                    status = ConnectedAppStatus.DENIED),
+                    status = ConnectedAppStatus.DENIED,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package1", appName = "firstApp", icon = null),
-                    status = ConnectedAppStatus.DENIED),
+                    status = ConnectedAppStatus.DENIED,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package2", appName = "secondApp", icon = null),
-                    status = ConnectedAppStatus.DENIED),
+                    status = ConnectedAppStatus.DENIED,
+                ),
             )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectedApps) }
 
@@ -272,13 +290,16 @@
             listOf(
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package3", appName = "thirdApp", icon = null),
-                    status = ConnectedAppStatus.INACTIVE),
+                    status = ConnectedAppStatus.INACTIVE,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package1", appName = "firstApp", icon = null),
-                    status = ConnectedAppStatus.INACTIVE),
+                    status = ConnectedAppStatus.INACTIVE,
+                ),
                 ConnectedAppMetadata(
                     AppMetadata(packageName = "package2", appName = "secondApp", icon = null),
-                    status = ConnectedAppStatus.INACTIVE),
+                    status = ConnectedAppStatus.INACTIVE,
+                ),
             )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectedApps) }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsActivityTest.kt
index 48492e1..c3ebfb0 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsActivityTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsActivityTest.kt
@@ -31,8 +31,8 @@
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
 import com.android.healthconnect.controller.permissions.shared.SettingsActivity
 import com.android.healthconnect.controller.service.HealthPermissionManagerModule
@@ -42,7 +42,6 @@
 import com.android.healthconnect.controller.tests.utils.di.FakeHealthPermissionManager
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.showOnboarding
-import com.android.healthconnect.controller.tests.utils.whenever
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -56,6 +55,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.whenever
 
 @UninstallModules(HealthPermissionManagerModule::class)
 @HiltAndroidTest
@@ -76,7 +76,9 @@
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
         hiltRule.inject()
         (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf())
+            TEST_APP_PACKAGE_NAME,
+            listOf(),
+        )
         whenever(viewModel.grantedFitnessPermissions).then {
             MutableLiveData<Set<FitnessPermission>>(emptySet())
         }
@@ -91,6 +93,7 @@
 
         whenever(viewModel.allFitnessPermissionsGranted).then { MediatorLiveData(false) }
         whenever(viewModel.atLeastOneFitnessPermissionGranted).then { MediatorLiveData(false) }
+        whenever(viewModel.atLeastOneHealthPermissionGranted).then { MediatorLiveData(false) }
         val accessDate = Instant.parse("2022-10-20T18:40:13.00Z")
         whenever(viewModel.loadAccessDate(Mockito.anyString())).thenReturn(accessDate)
 
@@ -99,7 +102,9 @@
                 AppMetadata(
                     TEST_APP_PACKAGE_NAME,
                     TEST_APP_NAME,
-                    context.getDrawable(R.drawable.health_connect_logo)))
+                    context.getDrawable(R.drawable.health_connect_logo),
+                )
+            )
         }
         val writePermission =
             FitnessPermission(FitnessPermissionType.EXERCISE, PermissionsAccessType.WRITE)
@@ -174,7 +179,9 @@
             onView(
                     withText(
                         "Apps with this permission can read and write your" +
-                            " health and fitness data."))
+                            " health and fitness data."
+                    )
+                )
                 .check(matches(isDisplayed()))
         }
     }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsCombinedPermissionsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsCombinedPermissionsFragmentTest.kt
index 0588966..51870ab 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsCombinedPermissionsFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsCombinedPermissionsFragmentTest.kt
@@ -43,7 +43,9 @@
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel.RevokeAllState.NotStarted
 import com.android.healthconnect.controller.permissions.app.SettingsCombinedPermissionsFragment
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.HealthPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
@@ -51,7 +53,6 @@
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.DataRestoreElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
@@ -76,8 +77,8 @@
 import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
-import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class SettingsCombinedPermissionsFragmentTest {
@@ -192,21 +193,58 @@
         onView(withText("Fitness and wellness")).check(matches(isDisplayed()))
         onView(withText("Exercise, sleep, nutrition and others")).check(matches(isDisplayed()))
         onView(withText("Health records")).check(matches(isDisplayed()))
-        onView(withText("Lab results, medications, immunizations and others"))
+        onView(withText("Lab results, medications, vaccines and others"))
             .check(matches(isDisplayed()))
         onView(withText("Additional access")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("Past data, background data"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
         onView(withText("Manage app")).perform(scrollTo()).check(matches(isDisplayed()))
         onView(withText("Remove access for this app"))
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Data you share with Health Connect test app is covered by their privacy policy"
+                    "You can learn how Health Connect test app handles your data in the developer's privacy policy"
                 )
             )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
-        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.MANAGE_PERMISSIONS_PAGE)
+    }
+
+    @Test
+    fun fragmentStarts_logPageImpression() {
+        val writePermission =
+            FitnessPermission(FitnessPermissionType.EXERCISE, PermissionsAccessType.WRITE)
+        val readPermission =
+            FitnessPermission(FitnessPermissionType.DISTANCE, PermissionsAccessType.READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.grantedFitnessPermissions).then {
+            MutableLiveData(setOf(writePermission))
+        }
+        whenever(viewModel.isPackageSupported(TEST_APP_PACKAGE_NAME)).then { true }
+
+        val validState =
+            AdditionalAccessViewModel.State(
+                backgroundReadUIState =
+                    AdditionalAccessViewModel.AdditionalPermissionState(
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    )
+            )
+        whenever(additionalAccessViewModel.additionalAccessState).then {
+            MutableLiveData(validState)
+        }
+
+        launchFragment<SettingsCombinedPermissionsFragment>(
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
+
+        verify(healthConnectLogger, atLeast(1))
+            .setPageId(PageName.SETTINGS_MANAGE_COMBINED_APP_PERMISSIONS_PAGE)
         verify(healthConnectLogger).logPageImpression()
     }
 
@@ -499,6 +537,13 @@
                 )
             )
         }
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(true)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<SettingsCombinedPermissionsFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
         )
@@ -525,7 +570,7 @@
                 )
             )
             .inRoot(isDialog())
-            .check(doesNotExist())
+            .check(matches(not(isDisplayed())))
     }
 
     @Test
@@ -548,6 +593,13 @@
                 )
             )
         }
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(true)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<SettingsCombinedPermissionsFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
         )
@@ -574,7 +626,7 @@
                 )
             )
             .inRoot(isDialog())
-            .check(doesNotExist())
+            .check(matches(not(isDisplayed())))
     }
 
     @Test
@@ -597,6 +649,13 @@
                 )
             )
         }
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(true)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<SettingsCombinedPermissionsFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
         )
@@ -623,11 +682,18 @@
                 )
             )
             .inRoot(isDialog())
-            .check(doesNotExist())
+            .check(matches(not(isDisplayed())))
     }
 
     @Test
     fun removeAccessButton_noAdditionalPermissions_showsConfirmationDialog() {
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         launchFragment<SettingsCombinedPermissionsFragment>(
             bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
         )
@@ -654,11 +720,18 @@
                 )
             )
             .inRoot(isDialog())
-            .check(doesNotExist())
+            .check(matches(not(isDisplayed())))
     }
 
     @Test
     fun removeAccessButton_confirmationDialogNoCheckbox_remainsAfterRotation() {
+        whenever(viewModel.revokeAllShouldIncludeBackground()).thenReturn(false)
+        whenever(viewModel.revokeAllShouldIncludePastData()).thenReturn(false)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(
+                listOf(HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
+            )
+        }
         val scenario =
             launchFragment<SettingsCombinedPermissionsFragment>(
                 bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
@@ -686,7 +759,7 @@
                 )
             )
             .inRoot(isDialog())
-            .check(doesNotExist())
+            .check(matches(not(isDisplayed())))
 
         scenario.recreate()
         onView(withText("Remove all permissions?")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -707,6 +780,6 @@
                 )
             )
             .inRoot(isDialog())
-            .check(doesNotExist())
+            .check(matches(not(isDisplayed())))
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsFitnessAppFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsFitnessAppFragmentTest.kt
index 9e0fe7c..ecb0466 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsFitnessAppFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsFitnessAppFragmentTest.kt
@@ -47,8 +47,8 @@
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel.DisableExerciseRouteDialogEvent
 import com.android.healthconnect.controller.permissions.app.AppPermissionViewModel.RevokeAllState
 import com.android.healthconnect.controller.permissions.app.SettingsFitnessAppFragment
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
@@ -56,7 +56,6 @@
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.DataRestoreElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
@@ -84,6 +83,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class SettingsFitnessAppFragmentTest {
@@ -123,7 +123,9 @@
                 AppMetadata(
                     TEST_APP_PACKAGE_NAME,
                     TEST_APP_NAME,
-                    context.getDrawable(R.drawable.health_connect_logo)))
+                    context.getDrawable(R.drawable.health_connect_logo),
+                )
+            )
         }
 
         whenever(additionalAccessViewModel.additionalAccessState).then {
@@ -134,7 +136,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -142,7 +145,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         whenever(viewModel.lastReadPermissionDisconnected).then { MutableLiveData(false) }
 
@@ -172,7 +178,8 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
         scenario.onActivity { activity ->
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
@@ -180,6 +187,29 @@
         onView(withText("Allow all")).check(matches(isDisplayed()))
         onView(withText("Allowed to read")).check(matches(isDisplayed()))
         onView(withText("Allowed to write")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun fragmentStarts_logPageImpression() {
+        val writePermission =
+            FitnessPermission(FitnessPermissionType.EXERCISE, PermissionsAccessType.WRITE)
+        val readPermission =
+            FitnessPermission(FitnessPermissionType.DISTANCE, PermissionsAccessType.READ)
+        whenever(viewModel.fitnessPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.grantedFitnessPermissions).then {
+            MutableLiveData(setOf(writePermission))
+        }
+
+        val scenario =
+            launchFragment<SettingsFitnessAppFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+        scenario.onActivity { activity ->
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+        }
+
         verify(healthConnectLogger, atLeast(1)).setPageId(PageName.MANAGE_PERMISSIONS_PAGE)
         verify(healthConnectLogger).logPageImpression()
         verify(healthConnectLogger).logImpression(PermissionsElement.ALLOW_ALL_SWITCH)
@@ -197,7 +227,8 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
         scenario.onActivity { activity ->
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
@@ -218,7 +249,8 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
         scenario.onActivity { activity ->
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
@@ -245,7 +277,8 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
         scenario.onActivity { activity ->
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
@@ -283,7 +316,8 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
         scenario.onActivity { activity ->
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
@@ -294,7 +328,9 @@
                 withText(
                     "$TEST_APP_NAME can read data added after October 20, 2022" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .check(doesNotExist())
         onView(withText("Read privacy policy")).check(doesNotExist())
     }
@@ -315,7 +351,8 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
         scenario.onActivity { activity ->
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
@@ -324,7 +361,9 @@
                 withText(
                     "$TEST_APP_NAME can read data added after October 20, 2022" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Read privacy policy")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -346,7 +385,8 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
         scenario.onActivity { activity ->
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
@@ -355,7 +395,9 @@
                 withText(
                     "$TEST_APP_NAME can read data added after October 20, 2022" +
                         "\n\n" +
-                        "Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+                        "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Read privacy policy")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -368,7 +410,8 @@
         }
 
         launchFragment<SettingsFitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withText(R.string.additional_access_label)).check(doesNotExist())
     }
@@ -378,13 +421,15 @@
         val validState =
             AdditionalAccessViewModel.State(
                 exerciseRoutePermissionUIState = PermissionUiState.ASK_EVERY_TIME,
-                exercisePermissionUIState = PermissionUiState.ASK_EVERY_TIME)
+                exercisePermissionUIState = PermissionUiState.ASK_EVERY_TIME,
+            )
         whenever(additionalAccessViewModel.additionalAccessState).then {
             MutableLiveData(validState)
         }
 
         launchFragment<SettingsFitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withText(R.string.additional_access_label)).check(matches(isDisplayed()))
     }
@@ -395,13 +440,18 @@
             AdditionalAccessViewModel.State(
                 backgroundReadUIState =
                     AdditionalAccessViewModel.AdditionalPermissionState(
-                        isDeclared = true, isEnabled = false, isGranted = false))
+                        isDeclared = true,
+                        isEnabled = false,
+                        isGranted = false,
+                    )
+            )
         whenever(additionalAccessViewModel.additionalAccessState).then {
             MutableLiveData(validState)
         }
 
         launchFragment<SettingsFitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(withText(R.string.additional_access_label)).check(matches(isDisplayed()))
     }
@@ -411,20 +461,23 @@
         val validState =
             AdditionalAccessViewModel.State(
                 exerciseRoutePermissionUIState = PermissionUiState.ASK_EVERY_TIME,
-                exercisePermissionUIState = PermissionUiState.ASK_EVERY_TIME)
+                exercisePermissionUIState = PermissionUiState.ASK_EVERY_TIME,
+            )
         whenever(additionalAccessViewModel.additionalAccessState).then {
             MutableLiveData(validState)
         }
 
         launchFragment<SettingsFitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
         onView(withText(R.string.additional_access_label)).perform(click())
 
         verify(navigationUtils)
             .navigate(
                 fragment = any(),
                 action = eq(R.id.action_settingsFitnessApp_to_additionalAccessFragment),
-                bundle = any())
+                bundle = any(),
+            )
     }
 
     @Test
@@ -433,7 +486,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.APP_UPGRADE_REQUIRED,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -441,7 +495,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.APP_UPGRADE_REQUIRED,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val writePermission =
             FitnessPermission(FitnessPermissionType.EXERCISE, PermissionsAccessType.WRITE)
@@ -456,11 +513,14 @@
         whenever(viewModel.isPackageSupported(TEST_APP_PACKAGE_NAME)).then { true }
 
         launchFragment<SettingsFitnessAppFragment>(
-            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+            bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+        )
 
         onView(
                 withText(
-                    "Health Connect is ready to be integrated with your Android system. If you give $TEST_APP_NAME access now, some features may not work until integration is complete."))
+                    "Health Connect is ready to be integrated with your Android system. If you give $TEST_APP_NAME access now, some features may not work until integration is complete."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         // TODO (b/322495982) check navigation to Migration activity
@@ -485,7 +545,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IN_PROGRESS,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -493,7 +554,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IN_PROGRESS,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val writePermission =
             FitnessPermission(FitnessPermissionType.EXERCISE, PermissionsAccessType.WRITE)
@@ -509,11 +573,14 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         onView(
                 withText(
-                    "Health Connect is being integrated with the Android system.\n\nYou'll get a notification when the process is complete and you can use $TEST_APP_NAME with Health Connect."))
+                    "Health Connect is being integrated with the Android system.\n\nYou'll get a notification when the process is complete and you can use $TEST_APP_NAME with Health Connect."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -537,7 +604,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -545,7 +613,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val writePermission =
             FitnessPermission(FitnessPermissionType.EXERCISE, PermissionsAccessType.WRITE)
@@ -561,14 +632,17 @@
 
         val scenario =
             launchFragment<SettingsFitnessAppFragment>(
-                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME))
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
 
         onView(withText("Health Connect restore in progress"))
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Health Connect is restoring data and permissions. This may take some time to complete."))
+                    "Health Connect is restoring data and permissions. This may take some time to complete."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(isDialog()).check(matches(isDisplayed()))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsManagePermissionFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsManagePermissionFragmentTest.kt
index 49ebb6e..1055a44 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsManagePermissionFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsManagePermissionFragmentTest.kt
@@ -47,7 +47,6 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME_2
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.AppPermissionsElement
 import com.android.healthconnect.controller.utils.logging.DataRestoreElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
@@ -67,6 +66,7 @@
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class SettingsManagePermissionFragmentTest {
@@ -88,7 +88,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -96,7 +97,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         // disable animations
         toggleAnimation(false)
@@ -145,7 +149,8 @@
 
     @Test
     fun test_accessedHealthData_showsRecentAccessSummary() {
-        val connectApp = listOf(ConnectedAppMetadata(TEST_APP, status = ALLOWED, healthUsageLastAccess = NOW))
+        val connectApp =
+            listOf(ConnectedAppMetadata(TEST_APP, status = ALLOWED, healthUsageLastAccess = NOW))
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         launchFragment<SettingsManagePermissionFragment>(Bundle())
@@ -169,7 +174,8 @@
         val connectApp =
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = DENIED),
-                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED))
+                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         launchFragment<SettingsManagePermissionFragment>(Bundle())
@@ -190,7 +196,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IN_PROGRESS,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -198,19 +205,25 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IN_PROGRESS,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val connectApp =
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = DENIED),
-                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED))
+                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         val scenario = launchFragment<SettingsManagePermissionFragment>(Bundle())
 
         onView(
                 withText(
-                    "Health Connect is being integrated with the Android system.\n\nYou'll get a notification when the process is complete and you can use Health Connect."))
+                    "Health Connect is being integrated with the Android system.\n\nYou'll get a notification when the process is complete and you can use Health Connect."
+                )
+            )
             .inRoot(RootMatchers.isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(RootMatchers.isDialog()).check(matches(isDisplayed()))
@@ -234,7 +247,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -242,12 +256,16 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val connectApp =
             listOf(
                 ConnectedAppMetadata(TEST_APP, status = DENIED),
-                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED))
+                ConnectedAppMetadata(TEST_APP_2, status = ALLOWED),
+            )
         whenever(viewModel.connectedApps).then { MutableLiveData(connectApp) }
 
         val scenario = launchFragment<SettingsManagePermissionFragment>(Bundle())
@@ -257,7 +275,9 @@
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Health Connect is restoring data and permissions. This may take some time to complete."))
+                    "Health Connect is restoring data and permissions. This may take some time to complete."
+                )
+            )
             .inRoot(RootMatchers.isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(RootMatchers.isDialog()).check(matches(isDisplayed()))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsMedicalAppFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsMedicalAppFragmentTest.kt
index ef0ffe5..80c0a98 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsMedicalAppFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/connectedapps/settings/SettingsMedicalAppFragmentTest.kt
@@ -54,7 +54,6 @@
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.NavigationUtils
 import com.android.healthconnect.controller.utils.logging.DataRestoreElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
@@ -80,6 +79,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class SettingsMedicalAppFragmentTest {
@@ -158,7 +158,7 @@
     @Test
     fun fragment_starts() {
         val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -177,7 +177,29 @@
         onView(withText("Allow all")).check(matches(isDisplayed()))
         onView(withText("Allowed to read")).check(matches(isDisplayed()))
         onView(withText("Allowed to write")).check(matches(isDisplayed()))
-        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.MANAGE_PERMISSIONS_PAGE)
+    }
+
+    @Test
+    fun fragmentStarts_logPageImpression() {
+        val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
+        whenever(viewModel.medicalPermissions).then {
+            MutableLiveData(listOf(writePermission, readPermission))
+        }
+        whenever(viewModel.grantedMedicalPermissions).then {
+            MutableLiveData(setOf(writePermission))
+        }
+
+        val scenario =
+            launchFragment<SettingsMedicalAppFragment>(
+                bundleOf(EXTRA_PACKAGE_NAME to TEST_APP_PACKAGE_NAME)
+            )
+        scenario.onActivity { activity ->
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+        }
+
+        verify(healthConnectLogger, atLeast(1))
+            .setPageId(PageName.SETTINGS_MANAGE_MEDICAL_APP_PERMISSIONS_PAGE)
         verify(healthConnectLogger).logPageImpression()
         verify(healthConnectLogger).logImpression(PermissionsElement.ALLOW_ALL_SWITCH)
         verify(healthConnectLogger, times(2)).logImpression(PermissionsElement.PERMISSION_SWITCH)
@@ -185,7 +207,7 @@
 
     @Test
     fun doesNotShowWriteHeader_whenNoWritePermissions() {
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         whenever(viewModel.medicalPermissions).then { MutableLiveData(listOf(readPermission)) }
         whenever(viewModel.grantedMedicalPermissions).then {
             MutableLiveData(setOf(readPermission))
@@ -227,7 +249,7 @@
 
     @Test
     fun unsupportedPackage_grantedPermissionsNotLoaded_onOrientationChange() {
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
 
         whenever(viewModel.medicalPermissions).then {
@@ -247,10 +269,10 @@
         }
 
         onView(withText("Allow all")).check(matches(isDisplayed()))
-        onView(withText("Immunization")).check(matches(isDisplayed()))
+        onView(withText("Vaccines")).check(matches(isDisplayed()))
         onView(withText("All health records")).check(matches(isDisplayed()))
-        onView(withText("Immunization")).perform(click())
-        onView(withText("Immunization")).check(matches(not(isChecked())))
+        onView(withText("Vaccines")).perform(click())
+        onView(withText("Vaccines")).check(matches(not(isChecked())))
 
         scenario.onActivity { activity ->
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
@@ -259,12 +281,12 @@
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(RecyclerViewActions.scrollToLastPosition<RecyclerView.ViewHolder>())
         onIdle()
-        onView(withText("Immunization")).perform(scrollTo()).check(matches(not(isChecked())))
+        onView(withText("Vaccines")).perform(scrollTo()).check(matches(not(isChecked())))
     }
 
     @Test
     fun unsupportedPackage_doesNotShowFooter() {
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
 
         whenever(viewModel.medicalPermissions).then {
@@ -285,7 +307,11 @@
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(RecyclerViewActions.scrollToLastPosition<RecyclerView.ViewHolder>())
-        onView(withText("Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+        onView(
+                withText(
+                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .check(doesNotExist())
         onView(withText("Read privacy policy")).check(doesNotExist())
     }
@@ -293,7 +319,7 @@
     @Test
     fun supportedPackage_whenNoHistoryRead_showsFooterWithGrantTime() {
         val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -310,7 +336,11 @@
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
 
-        onView(withText("Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+        onView(
+                withText(
+                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Read privacy policy")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -319,7 +349,7 @@
     @Test
     fun supportedPackage_whenHistoryRead_showsFooterWithoutGrantTime() {
         val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -336,7 +366,11 @@
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
         }
 
-        onView(withText("Data you share with $TEST_APP_NAME is covered by their privacy policy"))
+        onView(
+                withText(
+                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                )
+            )
             .perform(scrollTo())
             .check(matches(isDisplayed()))
         onView(withText("Read privacy policy")).perform(scrollTo()).check(matches(isDisplayed()))
@@ -440,7 +474,7 @@
             )
         }
         val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -497,7 +531,7 @@
             )
         }
         val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
@@ -554,7 +588,7 @@
             )
         }
         val writePermission = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
-        val readPermission = MedicalPermission(MedicalPermissionType.IMMUNIZATION)
+        val readPermission = MedicalPermission(MedicalPermissionType.VACCINES)
         whenever(viewModel.medicalPermissions).then {
             MutableLiveData(listOf(writePermission, readPermission))
         }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/FitnessPermissionStringsTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/FitnessPermissionStringsTest.kt
index 4d11660..7c1803f 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/FitnessPermissionStringsTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/FitnessPermissionStringsTest.kt
@@ -14,8 +14,10 @@
 package com.android.healthconnect.controller.tests.permissions.data
 
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionStrings
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isAdditionalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -39,7 +41,7 @@
 
     @Test
     fun allHealthPermissionTypesHaveStrings() {
-        for (type in FitnessPermissionType.values()) {
+        for (type in FitnessPermissionType.entries) {
             assertThat(FitnessPermissionStrings.fromPermissionType(type)).isNotNull()
         }
     }
@@ -48,8 +50,7 @@
     fun allFitnessPermissionsHaveStrings() {
         val allPermissions =
             healthPermissionReader.getHealthPermissions().filterNot { perm ->
-                healthPermissionReader.isAdditionalPermission(perm) ||
-                    healthPermissionReader.isMedicalPermission(perm)
+                isAdditionalPermission(perm) || isMedicalPermission(perm)
             }
         for (permission in allPermissions) {
             val type = FitnessPermission.fromPermissionString(permission).fitnessPermissionType
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/HealthPermissionTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/HealthPermissionTest.kt
index 3df4816..ca9ac16 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/HealthPermissionTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/HealthPermissionTest.kt
@@ -16,12 +16,17 @@
 package com.android.healthconnect.controller.tests.permissions.data
 
 import android.health.connect.HealthPermissions
-import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
-import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.fromPermissionString
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
-import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.ACTIVE_CALORIES_BURNED
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BLOOD_GLUCOSE
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.fromPermissionString
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isAdditionalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isFitnessPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isFitnessReadPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalReadPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.PermissionsAccessType
 import com.android.healthconnect.controller.shared.HealthPermissionReader
@@ -62,8 +67,7 @@
     fun fromPermissionString_canParseAllFitnessPermissions() {
         val allPermissions =
             healthPermissionReader.getHealthPermissions().filterNot { perm ->
-                healthPermissionReader.isAdditionalPermission(perm) ||
-                    healthPermissionReader.isMedicalPermission(perm)
+                isAdditionalPermission(perm) || isMedicalPermission(perm)
             }
         for (permissionString in allPermissions) {
             assertThat(fromPermissionString(permissionString).toString())
@@ -75,7 +79,7 @@
     fun fromPermissionString_canParseAllMedicalPermissions() {
         val medicalPermissions =
             healthPermissionReader.getHealthPermissions().filter { perm ->
-                healthPermissionReader.isMedicalPermission(perm)
+                isMedicalPermission(perm)
             }
         for (permissionString in medicalPermissions) {
             assertThat(fromPermissionString(permissionString).toString())
@@ -98,48 +102,57 @@
             .isEqualTo(MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA))
 
         assertThat(
-            fromPermissionString(
-                "android.permission.health.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE"))
-            .isEqualTo(MedicalPermission(MedicalPermissionType.ALLERGY_INTOLERANCE))
+                fromPermissionString(
+                    "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"
+                )
+            )
+            .isEqualTo(MedicalPermission(MedicalPermissionType.ALLERGIES_INTOLERANCES))
+
+        assertThat(fromPermissionString("android.permission.health.READ_MEDICAL_DATA_CONDITIONS"))
+            .isEqualTo(MedicalPermission(MedicalPermissionType.CONDITIONS))
+
+        assertThat(
+                fromPermissionString("android.permission.health.READ_MEDICAL_DATA_VACCINES")
+            )
+            .isEqualTo(MedicalPermission(MedicalPermissionType.VACCINES))
 
         assertThat(
                 fromPermissionString(
-                    "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION"))
-            .isEqualTo(MedicalPermission(MedicalPermissionType.IMMUNIZATION))
-
-        assertThat(
-            fromPermissionString(
-                "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"))
+                    "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"
+                )
+            )
             .isEqualTo(MedicalPermission(MedicalPermissionType.LABORATORY_RESULTS))
 
-        assertThat(
-            fromPermissionString(
-                "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"))
+        assertThat(fromPermissionString("android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"))
             .isEqualTo(MedicalPermission(MedicalPermissionType.MEDICATIONS))
 
         assertThat(
-            fromPermissionString(
-                "android.permission.health.READ_MEDICAL_DATA_PREGNANCY"))
+                fromPermissionString("android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS")
+            )
+            .isEqualTo(MedicalPermission(MedicalPermissionType.PERSONAL_DETAILS))
+
+        assertThat(
+                fromPermissionString(
+                    "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"
+                )
+            )
+            .isEqualTo(MedicalPermission(MedicalPermissionType.PRACTITIONER_DETAILS))
+
+        assertThat(fromPermissionString("android.permission.health.READ_MEDICAL_DATA_PREGNANCY"))
             .isEqualTo(MedicalPermission(MedicalPermissionType.PREGNANCY))
 
-        assertThat(
-            fromPermissionString(
-                "android.permission.health.READ_MEDICAL_DATA_PROBLEMS"))
-            .isEqualTo(MedicalPermission(MedicalPermissionType.PROBLEMS))
-
-        assertThat(
-            fromPermissionString(
-                "android.permission.health.READ_MEDICAL_DATA_PROCEDURES"))
+        assertThat(fromPermissionString("android.permission.health.READ_MEDICAL_DATA_PROCEDURES"))
             .isEqualTo(MedicalPermission(MedicalPermissionType.PROCEDURES))
 
         assertThat(
-            fromPermissionString(
-                "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"))
+                fromPermissionString("android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY")
+            )
             .isEqualTo(MedicalPermission(MedicalPermissionType.SOCIAL_HISTORY))
 
-        assertThat(
-            fromPermissionString(
-                "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"))
+        assertThat(fromPermissionString("android.permission.health.READ_MEDICAL_DATA_VISITS"))
+            .isEqualTo(MedicalPermission(MedicalPermissionType.VISITS))
+
+        assertThat(fromPermissionString("android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"))
             .isEqualTo(MedicalPermission(MedicalPermissionType.VITAL_SIGNS))
     }
 
@@ -149,4 +162,69 @@
             fromPermissionString("Unsupported_permission")
         }
     }
+
+    @Test
+    fun isAdditionalPermission_whenAdditionalPermission_returnsTrue() {
+        val perm = AdditionalPermission(HealthPermissions.READ_EXERCISE_ROUTES)
+        assertThat(isAdditionalPermission(perm.toString())).isTrue()
+    }
+
+    @Test
+    fun isAdditionalPermission_whenNotAdditionalPermissions_returnsFalse() {
+        val perm = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
+        assertThat(isAdditionalPermission(perm.toString())).isFalse()
+    }
+
+    @Test
+    fun isMedicalPermission_whenMedicalPermission_returnsTrue() {
+        val perm = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
+        assertThat(isMedicalPermission(perm.toString())).isTrue()
+    }
+
+    @Test
+    fun isMedicalPermission_whenNotMedicalPermission_returnsFalse() {
+        val perm = AdditionalPermission(HealthPermissions.READ_EXERCISE_ROUTES)
+        assertThat(isMedicalPermission(perm.toString())).isFalse()
+    }
+
+    @Test
+    fun isFitnessPermission_whenFitnessPermission_returnsTrue() {
+        val perm =
+            FitnessPermission.fromPermissionString(HealthPermissions.READ_ACTIVE_CALORIES_BURNED)
+        assertThat(isFitnessPermission(perm.toString())).isTrue()
+    }
+
+    @Test
+    fun isFitnessPermission_whenNotFitnessPermission_returnsFalse() {
+        val perm = AdditionalPermission(HealthPermissions.READ_EXERCISE_ROUTES)
+        assertThat(isFitnessPermission(perm.toString())).isFalse()
+    }
+
+    @Test
+    fun isFitnessReadPermission_whenFitnessReadPermission_returnsTrue() {
+        val perm = FitnessPermission.fromPermissionString(HealthPermissions.READ_EXERCISE)
+        assertThat(isFitnessReadPermission(perm)).isTrue()
+        assertThat(isFitnessReadPermission(perm.toString())).isTrue()
+    }
+
+    @Test
+    fun isFitnessReadPermission_whenNotFitnessReadPermission_returnsFalse() {
+        val perm = FitnessPermission.fromPermissionString(HealthPermissions.WRITE_SLEEP)
+        assertThat(isFitnessReadPermission(perm)).isFalse()
+        assertThat(isFitnessReadPermission(perm.toString())).isFalse()
+    }
+
+    @Test
+    fun isMedicalReadPermission_whenMedicalReadPermission_returnsTrue() {
+        val perm = MedicalPermission(MedicalPermissionType.CONDITIONS)
+        assertThat(isMedicalReadPermission(perm)).isTrue()
+        assertThat(isMedicalReadPermission(perm.toString())).isTrue()
+    }
+
+    @Test
+    fun isMedicalReadPermission_whenNotMedicalReadPermission_returnsFalse() {
+        val perm = MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
+        assertThat(isMedicalReadPermission(perm)).isFalse()
+        assertThat(isMedicalReadPermission(perm.toString())).isFalse()
+    }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/MedicalPermissionTypeTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/MedicalPermissionTypeTest.kt
index ed1f141..24bbf4c 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/MedicalPermissionTypeTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/data/MedicalPermissionTypeTest.kt
@@ -16,8 +16,7 @@
 package com.android.healthconnect.controller.tests.permissions.data
 
 import android.content.Context
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.permissions.data.fromMedicalResourceType
@@ -48,17 +47,8 @@
 
     @Test
     fun fromMedicalResourceType_immunization() {
-        assertThat(fromMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION))
-            .isEqualTo(MedicalPermissionType.IMMUNIZATION)
-    }
-
-    @Test
-    fun fromMedicalResourceType_unknown_notSupported() {
-        val thrown =
-            assertThrows(IllegalArgumentException::class.java) {
-                fromMedicalResourceType(MEDICAL_RESOURCE_TYPE_UNKNOWN)
-            }
-        assertThat(thrown).hasMessageThat().isEqualTo("MedicalResourceType is UNKNOWN.")
+        assertThat(fromMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES))
+            .isEqualTo(MedicalPermissionType.VACCINES)
     }
 
     @Test
@@ -70,14 +60,17 @@
 
     @Test
     fun toMedicalResourceType_immunization() {
-        assertThat(toMedicalResourceType(MedicalPermissionType.IMMUNIZATION))
-            .isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+        assertThat(toMedicalResourceType(MedicalPermissionType.VACCINES))
+            .isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES)
     }
 
     @Test
-    fun toMedicalResourceType_allMedicalData() {
-        assertThat(toMedicalResourceType(MedicalPermissionType.ALL_MEDICAL_DATA))
-            .isEqualTo(MEDICAL_RESOURCE_TYPE_UNKNOWN)
+    fun toMedicalResourceType_allMedicalData_throws() {
+        val thrown =
+            assertThrows(IllegalArgumentException::class.java) {
+                toMedicalResourceType(MedicalPermissionType.ALL_MEDICAL_DATA)
+            }
+        assertThat(thrown).hasMessageThat().isEqualTo("MedicalPermissionType does not map to a MedicalResourceType.")
     }
 
     @Test
@@ -87,8 +80,6 @@
                 it == MedicalPermissionType.ALL_MEDICAL_DATA
             }) {
             assertThat(toMedicalResourceType(permissionType)).isNotNull()
-            assertThat(toMedicalResourceType(permissionType))
-                .isNotEqualTo(MEDICAL_RESOURCE_TYPE_UNKNOWN)
         }
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/AdditionalPermissionsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/AdditionalPermissionsFragmentTest.kt
deleted file mode 100644
index 2bcb78e..0000000
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/AdditionalPermissionsFragmentTest.kt
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.healthconnect.controller.tests.permissions.request
-
-import android.health.connect.HealthPermissions
-import androidx.core.os.bundleOf
-import androidx.lifecycle.MutableLiveData
-import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.action.ViewActions.click
-import androidx.test.espresso.assertion.ViewAssertions.matches
-import androidx.test.espresso.matcher.ViewMatchers
-import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
-import androidx.test.espresso.matcher.ViewMatchers.withText
-import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
-import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.fromPermissionString
-import com.android.healthconnect.controller.permissions.data.PermissionState
-import com.android.healthconnect.controller.permissions.request.AdditionalPermissionsFragment
-import com.android.healthconnect.controller.permissions.request.AdditionalPermissionsInfo
-import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
-import com.android.healthconnect.controller.shared.app.AppMetadata
-import com.android.healthconnect.controller.tests.utils.NOW
-import com.android.healthconnect.controller.tests.utils.TEST_APP
-import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
-import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.any
-import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.toPermissionsList
-import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
-import com.android.healthconnect.controller.utils.logging.PageName
-import com.android.healthconnect.controller.utils.logging.RequestBackgroundReadPermissionElement
-import com.android.healthconnect.controller.utils.logging.RequestCombinedAdditionalPermissionsElement
-import com.android.healthconnect.controller.utils.logging.RequestHistoryReadPermissionElement
-import com.android.healthconnect.controller.utils.logging.UIAction
-import dagger.hilt.android.testing.BindValue
-import dagger.hilt.android.testing.HiltAndroidRule
-import dagger.hilt.android.testing.HiltAndroidTest
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.junit.After
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.mockito.Matchers
-import org.mockito.Mockito
-import org.mockito.kotlin.eq
-import org.mockito.kotlin.verify
-
-@ExperimentalCoroutinesApi
-@HiltAndroidTest
-class AdditionalPermissionsFragmentTest {
-
-    @get:Rule val hiltRule = HiltAndroidRule(this)
-
-    @BindValue
-    val viewModel: RequestPermissionViewModel = Mockito.mock(RequestPermissionViewModel::class.java)
-    @BindValue
-    val healthConnectLogger: HealthConnectLogger = Mockito.mock(HealthConnectLogger::class.java)
-
-    @Before
-    fun setup() {
-        hiltRule.inject()
-
-        whenever(viewModel.grantedAdditionalPermissions).then {
-            MutableLiveData(emptySet<AdditionalPermission>())
-        }
-        whenever(viewModel.loadAccessDate(org.mockito.kotlin.any())).thenReturn(NOW)
-        toggleAnimation(false)
-    }
-
-    @After
-    fun teardown() {
-        Mockito.reset(healthConnectLogger)
-        toggleAnimation(true)
-    }
-
-    @Test
-    fun displaysCombinedAdditionalPermissions() {
-        Mockito.`when`(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    listOf(
-                        AdditionalPermission.READ_HEALTH_DATA_HISTORY,
-                        AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND),
-                    AppMetadata(TEST_APP_PACKAGE_NAME, TEST_APP_NAME, null)))
-        }
-
-        launchFragment<AdditionalPermissionsFragment>(bundleOf())
-
-        onView(withText("Allow additional access for $TEST_APP_NAME?"))
-            .check(matches(isDisplayed()))
-        onView(withText("Access data in the background")).check(matches(isDisplayed()))
-        onView(
-                withText(
-                    "Allow this app to access Health Connect data when you're not using the app"))
-            .check(matches(isDisplayed()))
-
-        onView(withText("Access past data")).check(matches(isDisplayed()))
-        onView(
-            withText("Allow this app to access Health Connect data added before October 20, 2022"))
-
-        onView(withText("Don't allow")).check(matches(isDisplayed()))
-        onView(withText("Allow")).check(matches(isDisplayed()))
-
-        verify(healthConnectLogger).setPageId(PageName.REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE)
-        verify(healthConnectLogger).logPageImpression()
-        verify(healthConnectLogger)
-            .logImpression(
-                RequestCombinedAdditionalPermissionsElement
-                    .ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON)
-        verify(healthConnectLogger)
-            .logImpression(
-                RequestCombinedAdditionalPermissionsElement
-                    .CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON)
-        verify(healthConnectLogger)
-            .logImpression(RequestCombinedAdditionalPermissionsElement.BACKGROUND_READ_BUTTON)
-        verify(healthConnectLogger)
-            .logImpression(RequestCombinedAdditionalPermissionsElement.HISTORY_READ_BUTTON)
-    }
-
-    @Test
-    fun displaysBackgroundReadPermission() {
-        Mockito.`when`(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    listOf(AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND),
-                    AppMetadata(TEST_APP_PACKAGE_NAME, TEST_APP_NAME, null)))
-        }
-
-        launchFragment<AdditionalPermissionsFragment>(bundleOf())
-
-        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
-            .check(matches(isDisplayed()))
-
-        onView(
-                withText(
-                    "If you allow, this app can access Health Connect data when you're not using the app."))
-            .check(matches(isDisplayed()))
-
-        onView(withText("Don't allow")).check(matches(isDisplayed()))
-        onView(withText("Allow")).check(matches(isDisplayed()))
-
-        verify(healthConnectLogger).setPageId(PageName.REQUEST_BACKGROUND_READ_PERMISSION_PAGE)
-        verify(healthConnectLogger).logPageImpression()
-        verify(healthConnectLogger)
-            .logImpression(RequestBackgroundReadPermissionElement.ALLOW_BACKGROUND_READ_BUTTON)
-        verify(healthConnectLogger)
-            .logImpression(RequestBackgroundReadPermissionElement.CANCEL_BACKGROUND_READ_BUTTON)
-    }
-
-    @Test
-    fun displaysHistoryReadPermission() {
-        Mockito.`when`(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    listOf(AdditionalPermission.READ_HEALTH_DATA_HISTORY),
-                    AppMetadata(TEST_APP_PACKAGE_NAME, TEST_APP_NAME, null)))
-        }
-
-        launchFragment<AdditionalPermissionsFragment>(bundleOf())
-
-        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
-
-        onView(
-                withText(
-                    "If you allow, this app can access Health Connect data added before October 20, 2022."))
-            .check(matches(isDisplayed()))
-
-        onView(withText("Don't allow")).check(matches(isDisplayed()))
-        onView(withText("Allow")).check(matches(isDisplayed()))
-
-        verify(healthConnectLogger).setPageId(PageName.REQUEST_HISTORY_READ_PERMISSION_PAGE)
-        verify(healthConnectLogger).logPageImpression()
-        verify(healthConnectLogger)
-            .logImpression(RequestHistoryReadPermissionElement.ALLOW_HISTORY_READ_BUTTON)
-        verify(healthConnectLogger)
-            .logImpression(RequestHistoryReadPermissionElement.CANCEL_HISTORY_READ_BUTTON)
-    }
-
-    @Test
-    fun toggleOn_updatesAdditionalPermission() {
-        Mockito.`when`(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    listOf(
-                        AdditionalPermission.READ_HEALTH_DATA_HISTORY,
-                        AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND),
-                    AppMetadata(TEST_APP_PACKAGE_NAME, TEST_APP_NAME, null)))
-        }
-
-        launchFragment<AdditionalPermissionsFragment>(bundleOf())
-        onView(withText("Access data in the background")).check(matches(isDisplayed()))
-        onView(withText("Access data in the background")).perform(click())
-
-        Mockito.verify(viewModel)
-            .updateHealthPermission(any(AdditionalPermission::class.java), Matchers.eq(true))
-
-        verify(healthConnectLogger)
-            .logInteraction(
-                RequestCombinedAdditionalPermissionsElement.BACKGROUND_READ_BUTTON,
-                UIAction.ACTION_TOGGLE_ON)
-    }
-
-    @Test
-    fun toggleOff_updatesAdditionalPermission() {
-        Mockito.`when`(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    listOf(
-                        AdditionalPermission.READ_HEALTH_DATA_HISTORY,
-                        AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND),
-                    AppMetadata(TEST_APP_PACKAGE_NAME, TEST_APP_NAME, null)))
-        }
-
-        Mockito.`when`(viewModel.grantedAdditionalPermissions).then {
-            MutableLiveData(setOf(AdditionalPermission.READ_HEALTH_DATA_HISTORY))
-        }
-        Mockito.`when`(
-                viewModel.isPermissionLocallyGranted(
-                    eq(AdditionalPermission.READ_HEALTH_DATA_HISTORY)))
-            .thenReturn(true)
-
-        launchFragment<AdditionalPermissionsFragment>(bundleOf())
-        onView(withText("Access past data")).check(matches(isDisplayed()))
-        onView(withText("Access past data")).perform(click())
-
-        Mockito.verify(viewModel)
-            .updateHealthPermission(any(AdditionalPermission::class.java), Matchers.eq(false))
-
-        verify(healthConnectLogger)
-            .logInteraction(
-                RequestCombinedAdditionalPermissionsElement.HISTORY_READ_BUTTON,
-                UIAction.ACTION_TOGGLE_OFF)
-    }
-
-    @Test
-    fun allowButton_noAdditionalPermissionsSelected_isDisabled() {
-        val permissions =
-            arrayOf(
-                HealthPermissions.READ_HEALTH_DATA_HISTORY,
-                HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND)
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(true)
-
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    permissions.toPermissionsList().map { it as AdditionalPermission }, TEST_APP))
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(HealthPermissions.READ_HEALTH_DATA_HISTORY) to
-                    PermissionState.GRANTED,
-                fromPermissionString(HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND) to
-                    PermissionState.GRANTED,
-            )
-        }
-        whenever(viewModel.grantedAdditionalPermissions).then {
-            MutableLiveData(emptySet<AdditionalPermission>())
-        }
-
-        launchFragment<AdditionalPermissionsFragment>(bundleOf())
-
-        onView(withText("Allow")).check(matches(ViewMatchers.isNotEnabled()))
-    }
-
-    @Test
-    fun allowButton_additionalPermissionsSelected_isEnabled() {
-        val permissions =
-            arrayOf(
-                HealthPermissions.READ_HEALTH_DATA_HISTORY,
-                HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND)
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(true)
-        whenever(viewModel.isFitnessPermissionRequestConcluded()).thenReturn(true)
-
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    permissions.toPermissionsList().map { it as AdditionalPermission }, TEST_APP))
-        }
-
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(HealthPermissions.READ_HEALTH_DATA_HISTORY) to
-                    PermissionState.GRANTED,
-                fromPermissionString(HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND) to
-                    PermissionState.NOT_GRANTED)
-        }
-        whenever(viewModel.grantedAdditionalPermissions).then {
-            MutableLiveData(setOf(AdditionalPermission.READ_HEALTH_DATA_HISTORY))
-        }
-
-        launchFragment<AdditionalPermissionsFragment>(bundleOf())
-
-        onView(withText("Allow")).check(matches(ViewMatchers.isEnabled()))
-    }
-
-    @Test
-    fun allowButton_medicalRequestConcluded_isEnabled() {
-        val permissions =
-            arrayOf(
-                HealthPermissions.READ_HEALTH_DATA_HISTORY,
-                HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND)
-
-        whenever(viewModel.isMedicalPermissionRequestConcluded()).thenReturn(true)
-
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    permissions.toPermissionsList().map { it as AdditionalPermission }, TEST_APP))
-        }
-
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(HealthPermissions.READ_HEALTH_DATA_HISTORY) to
-                    PermissionState.GRANTED,
-                fromPermissionString(HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND) to
-                    PermissionState.NOT_GRANTED)
-        }
-        whenever(viewModel.grantedAdditionalPermissions).then {
-            MutableLiveData(setOf(AdditionalPermission.READ_HEALTH_DATA_HISTORY))
-        }
-
-        launchFragment<AdditionalPermissionsFragment>(bundleOf())
-
-        onView(withText("Allow")).check(matches(ViewMatchers.isEnabled()))
-    }
-}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/CombinedAdditionalPermissionsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/CombinedAdditionalPermissionsFragmentTest.kt
new file mode 100644
index 0000000..4047953
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/CombinedAdditionalPermissionsFragmentTest.kt
@@ -0,0 +1,514 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.tests.permissions.request
+
+import androidx.core.os.bundleOf
+import androidx.lifecycle.MutableLiveData
+import androidx.recyclerview.widget.RecyclerView
+import androidx.test.espresso.Espresso
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.contrib.RecyclerViewActions
+import androidx.test.espresso.matcher.ViewMatchers
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
+import com.android.healthconnect.controller.permissions.request.AdditionalScreenState
+import com.android.healthconnect.controller.permissions.request.CombinedAdditionalPermissionsFragment
+import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
+import com.android.healthconnect.controller.shared.app.AppMetadata
+import com.android.healthconnect.controller.tests.utils.NOW
+import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.any
+import com.android.healthconnect.controller.tests.utils.launchFragment
+import com.android.healthconnect.controller.tests.utils.setLocale
+import com.android.healthconnect.controller.tests.utils.toggleAnimation
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthconnect.controller.utils.logging.RequestCombinedAdditionalPermissionsElement
+import com.android.healthconnect.controller.utils.logging.UIAction
+import dagger.hilt.android.testing.BindValue
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import java.util.Locale
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.Mockito
+import org.mockito.kotlin.atLeast
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@ExperimentalCoroutinesApi
+@HiltAndroidTest
+class CombinedAdditionalPermissionsFragmentTest {
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    @BindValue
+    val viewModel: RequestPermissionViewModel = Mockito.mock(RequestPermissionViewModel::class.java)
+    @BindValue
+    val healthConnectLogger: HealthConnectLogger = Mockito.mock(HealthConnectLogger::class.java)
+    private lateinit var appMetadata: AppMetadata
+
+    @Before
+    fun setup() {
+        hiltRule.inject()
+        val context = InstrumentationRegistry.getInstrumentation().context
+        context.setLocale(Locale.US)
+        appMetadata =
+            AppMetadata(
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                context.getDrawable(R.drawable.health_connect_logo),
+            )
+        whenever(viewModel.grantedAdditionalPermissions).then {
+            MutableLiveData(emptySet<AdditionalPermission>())
+        }
+        toggleAnimation(false)
+    }
+
+    @After
+    fun teardown() {
+        Mockito.reset(healthConnectLogger)
+        toggleAnimation(true)
+    }
+
+    @Test
+    fun withoutMedical_withAccessDate_displaysCorrectly() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = false,
+                    isMedicalReadGranted = false,
+                    isFitnessReadGranted = false,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow additional access for $TEST_APP_NAME?"))
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME also wants to access these Health Connect settings"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access past data")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Allow this app to access Health Connect data added before October 20, 2022"
+                )
+            )
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access data in the background")).check(matches(isDisplayed()))
+        onView(ViewMatchers.withId(androidx.preference.R.id.recycler_view))
+            .perform(
+                RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
+                    ViewMatchers.hasDescendant(
+                        withText(
+                            "Allow this app to access Health Connect data when you're not using the app"
+                        )
+                    )
+                )
+            )
+        onView(
+                withText(
+                    "Allow this app to access Health Connect data when you're not using the app"
+                )
+            )
+            .check(matches(isDisplayed()))
+
+        onView(withText("Don't allow")).check(matches(isDisplayed()))
+        onView(withText("Allow")).check(matches(isDisplayed()))
+
+        verify(healthConnectLogger, atLeast(1))
+            .setPageId(PageName.REQUEST_COMBINED_ADDITIONAL_PERMISSIONS_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+        verify(healthConnectLogger)
+            .logImpression(
+                RequestCombinedAdditionalPermissionsElement
+                    .ALLOW_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
+            )
+        verify(healthConnectLogger)
+            .logImpression(
+                RequestCombinedAdditionalPermissionsElement
+                    .CANCEL_COMBINED_ADDITIONAL_PERMISSIONS_BUTTON
+            )
+        verify(healthConnectLogger)
+            .logImpression(RequestCombinedAdditionalPermissionsElement.BACKGROUND_READ_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(RequestCombinedAdditionalPermissionsElement.HISTORY_READ_BUTTON)
+    }
+
+    @Test
+    fun withoutMedical_withoutAccessDate_displaysFallback() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = false,
+                    isMedicalReadGranted = false,
+                    isFitnessReadGranted = false,
+                    dataAccessDate = null,
+                )
+            )
+        }
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow additional access for $TEST_APP_NAME?"))
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME also wants to access these Health Connect settings"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access past data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access all past Health Connect data"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access data in the background")).check(matches(isDisplayed()))
+        onView(ViewMatchers.withId(androidx.preference.R.id.recycler_view))
+            .perform(
+                RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
+                    ViewMatchers.hasDescendant(
+                        withText(
+                            "Allow this app to access Health Connect data when you're not using the app"
+                        )
+                    )
+                )
+            )
+        onView(
+                withText(
+                    "Allow this app to access Health Connect data when you're not using the app"
+                )
+            )
+            .check(matches(isDisplayed()))
+
+        onView(withText("Don't allow")).check(matches(isDisplayed()))
+        onView(withText("Allow")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun medicalNotGranted_fitnessGranted_withAccessDate_displaysCorrectly() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = false,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow additional access for $TEST_APP_NAME?"))
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME also wants to access these Health Connect settings"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access data added before October 20, 2022"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access fitness and wellness data in the background"))
+            .check(matches(isDisplayed()))
+        onView(ViewMatchers.withId(androidx.preference.R.id.recycler_view))
+            .perform(
+                RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
+                    ViewMatchers.hasDescendant(
+                        withText("Allow this app to access this data when you're not using the app")
+                    )
+                )
+            )
+        onView(withText("Allow this app to access this data when you're not using the app"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Don't allow")).check(matches(isDisplayed()))
+        onView(withText("Allow")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun medicalNotGranted_fitnessGranted_withoutAccessDate_displaysFallback() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = false,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = null,
+                )
+            )
+        }
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow additional access for $TEST_APP_NAME?"))
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME also wants to access these Health Connect settings"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access all past data")).check(matches(isDisplayed()))
+
+        onView(withText("Access fitness and wellness data in the background"))
+            .check(matches(isDisplayed()))
+        onView(ViewMatchers.withId(androidx.preference.R.id.recycler_view))
+            .perform(
+                RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
+                    ViewMatchers.hasDescendant(
+                        withText("Allow this app to access this data when you're not using the app")
+                    )
+                )
+            )
+        onView(withText("Allow this app to access this data when you're not using the app"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Don't allow")).check(matches(isDisplayed()))
+        onView(withText("Allow")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun medicalGranted_fitnessGranted_withAccessDate_displaysFooter() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow additional access for $TEST_APP_NAME?"))
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME also wants to access these Health Connect settings"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access data added before October 20, 2022"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access all data in the background")).check(matches(isDisplayed()))
+        onView(ViewMatchers.withId(androidx.preference.R.id.recycler_view))
+            .perform(
+                RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
+                    ViewMatchers.hasDescendant(
+                        withText(
+                            "Allow this app to access fitness and wellness data and health records " +
+                                "when you're not using the app"
+                        )
+                    )
+                )
+            )
+        onView(
+                withText(
+                    "Allow this app to access fitness and wellness data and health records " +
+                        "when you're not using the app"
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(ViewMatchers.withId(androidx.preference.R.id.recycler_view))
+            .perform(RecyclerViewActions.scrollToLastPosition<RecyclerView.ViewHolder>())
+        Espresso.onIdle()
+        onView(withText("$TEST_APP_NAME can already access past data for your health records"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Don't allow")).check(matches(isDisplayed()))
+        onView(withText("Allow")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun medicalGranted_fitnessGranted_withoutAccessDate_displaysFallback() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = null,
+                )
+            )
+        }
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow additional access for $TEST_APP_NAME?"))
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME also wants to access these Health Connect settings"))
+            .check(matches(isDisplayed()))
+
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Allow this app to access all past data")).check(matches(isDisplayed()))
+
+        onView(withText("Access all data in the background")).check(matches(isDisplayed()))
+
+        onView(ViewMatchers.withId(androidx.preference.R.id.recycler_view))
+            .perform(
+                RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
+                    ViewMatchers.hasDescendant(
+                        withText(
+                            "Allow this app to access fitness and wellness data and health records " +
+                                "when you're not using the app"
+                        )
+                    )
+                )
+            )
+        onView(
+                withText(
+                    "Allow this app to access fitness and wellness data and health records " +
+                        "when you're not using the app"
+                )
+            )
+            .check(matches(isDisplayed()))
+
+        onView(withText("Don't allow")).check(matches(isDisplayed()))
+        onView(withText("Allow")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun toggleOn_updatesAdditionalPermission() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+        onView(ViewMatchers.withId(androidx.preference.R.id.recycler_view))
+            .perform(
+                RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
+                    ViewMatchers.hasDescendant(withText("Access all data in the background"))
+                )
+            )
+        onView(withText("Access all data in the background")).check(matches(isDisplayed()))
+        onView(withText("Access all data in the background")).perform(click())
+
+        Mockito.verify(viewModel)
+            .updateHealthPermission(any(AdditionalPermission::class.java), eq(true))
+
+        verify(healthConnectLogger)
+            .logInteraction(
+                RequestCombinedAdditionalPermissionsElement.BACKGROUND_READ_BUTTON,
+                UIAction.ACTION_TOGGLE_ON,
+            )
+    }
+
+    @Test
+    fun toggleOff_updatesAdditionalPermission() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+
+        whenever(viewModel.grantedAdditionalPermissions).then {
+            MutableLiveData(setOf(AdditionalPermission.READ_HEALTH_DATA_HISTORY))
+        }
+        whenever(
+                viewModel.isPermissionLocallyGranted(
+                    eq(AdditionalPermission.READ_HEALTH_DATA_HISTORY)
+                )
+            )
+            .thenReturn(true)
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+        onView(withText("Access past fitness and wellness data")).check(matches(isDisplayed()))
+        onView(withText("Access past fitness and wellness data")).perform(click())
+
+        Mockito.verify(viewModel)
+            .updateHealthPermission(any(AdditionalPermission::class.java), eq(false))
+
+        verify(healthConnectLogger)
+            .logInteraction(
+                RequestCombinedAdditionalPermissionsElement.HISTORY_READ_BUTTON,
+                UIAction.ACTION_TOGGLE_OFF,
+            )
+    }
+
+    @Test
+    fun allowButton_noAdditionalPermissionsSelected_isDisabled() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+
+        whenever(viewModel.grantedAdditionalPermissions).then {
+            MutableLiveData(emptySet<AdditionalPermission>())
+        }
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow")).check(matches(ViewMatchers.isNotEnabled()))
+    }
+
+    @Test
+    fun allowButton_additionalPermissionsSelected_isEnabled() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowCombined(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+        whenever(viewModel.grantedAdditionalPermissions).then {
+            MutableLiveData(setOf(AdditionalPermission.READ_HEALTH_DATA_HISTORY))
+        }
+
+        launchFragment<CombinedAdditionalPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow")).check(matches(ViewMatchers.isEnabled()))
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/FitnessPermissionsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/FitnessPermissionsFragmentTest.kt
index e8849af..2c6ea17 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/FitnessPermissionsFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/FitnessPermissionsFragmentTest.kt
@@ -15,19 +15,17 @@
  */
 package com.android.healthconnect.controller.tests.permissions.request
 
-import android.health.connect.HealthPermissions.READ_DISTANCE
-import android.health.connect.HealthPermissions.READ_HEART_RATE
+import android.health.connect.HealthPermissions.READ_SLEEP
 import android.health.connect.HealthPermissions.READ_STEPS
-import android.health.connect.HealthPermissions.WRITE_DISTANCE
 import android.health.connect.HealthPermissions.WRITE_EXERCISE
 import android.health.connect.HealthPermissions.WRITE_HEART_RATE
-import android.health.connect.HealthPermissions.WRITE_STEPS
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MutableLiveData
 import androidx.recyclerview.widget.RecyclerView
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.action.ViewActions.*
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.contrib.RecyclerViewActions
 import androidx.test.espresso.matcher.ViewMatchers
@@ -35,30 +33,28 @@
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.withId
 import androidx.test.espresso.matcher.ViewMatchers.withText
-import androidx.test.platform.app.InstrumentationRegistry.*
+import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.permissions.data.HealthPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission.Companion.fromPermissionString
-import com.android.healthconnect.controller.permissions.data.PermissionState
 import com.android.healthconnect.controller.permissions.request.FitnessPermissionsFragment
+import com.android.healthconnect.controller.permissions.request.FitnessScreenState
 import com.android.healthconnect.controller.permissions.request.PermissionsFragment
 import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
 import com.android.healthconnect.controller.shared.app.AppMetadata
+import com.android.healthconnect.controller.shared.preference.HealthMainSwitchPreference
 import com.android.healthconnect.controller.tests.TestActivity
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.any
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
-import com.android.healthconnect.controller.tests.utils.toPermissionsList
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.logging.PermissionsElement
 import com.android.healthconnect.controller.utils.logging.UIAction
-import com.android.settingslib.widget.MainSwitchPreference
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -69,8 +65,13 @@
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
-import org.mockito.Matchers.eq
-import org.mockito.Mockito.*
+import org.mockito.Mockito.atLeast
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.whenever
 
 @ExperimentalCoroutinesApi
 @HiltAndroidTest
@@ -81,22 +82,36 @@
     val viewModel: RequestPermissionViewModel = mock(RequestPermissionViewModel::class.java)
     @BindValue val healthConnectLogger: HealthConnectLogger = mock(HealthConnectLogger::class.java)
 
+    private lateinit var appMetadata: AppMetadata
+    private lateinit var fitnessReadPermissions: List<FitnessPermission>
+    private lateinit var fitnessWritePermissions: List<FitnessPermission>
+    private lateinit var fitnessReadWritePermissions: List<FitnessPermission>
+
     @Before
     fun setup() {
         hiltRule.inject()
         val context = getInstrumentation().context
         context.setLocale(Locale.US)
-        `when`(viewModel.appMetadata).then {
-            MutableLiveData(
-                AppMetadata(
-                    TEST_APP_PACKAGE_NAME,
-                    TEST_APP_NAME,
-                    context.getDrawable(R.drawable.health_connect_logo)))
-        }
-        `when`(viewModel.allFitnessPermissionsGranted).then { MutableLiveData(false) }
-        `when`(viewModel.grantedFitnessPermissions).then {
+        appMetadata =
+            AppMetadata(
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                context.getDrawable(R.drawable.health_connect_logo),
+            )
+        fitnessReadPermissions =
+            listOf(fromPermissionString(READ_STEPS), fromPermissionString(READ_SLEEP))
+        fitnessWritePermissions =
+            listOf(fromPermissionString(WRITE_HEART_RATE), fromPermissionString(WRITE_EXERCISE))
+        fitnessReadWritePermissions = fitnessReadPermissions + fitnessWritePermissions
+
+        whenever(viewModel.allFitnessPermissionsGranted).then { MutableLiveData(false) }
+        whenever(viewModel.grantedFitnessPermissions).then {
             MutableLiveData(emptySet<FitnessPermission>())
         }
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(FitnessScreenState.NoFitnessData)
+        }
+
         toggleAnimation(false)
     }
 
@@ -107,14 +122,16 @@
     }
 
     @Test
-    fun displaysCategories() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(READ_STEPS),
-                    fromPermissionString(WRITE_HEART_RATE),
+    fun fitnessReadAndWrite_noMedical_noHistory_displaysCategories() {
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = false,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
                 )
-            MutableLiveData(permissions)
+            )
         }
         launchFragment<FitnessPermissionsFragment>(bundleOf())
 
@@ -124,129 +141,295 @@
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "If you give read access, the app can read new data and data from the past 30 days"))
+                    "If you give read access, the app can read new data and data from the past 30 days"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"))
+                    "You can learn how $TEST_APP_NAME handles your data in their privacy policy"
+                )
+            )
             .check(matches(isDisplayed()))
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Allow \u201C$TEST_APP_NAME\u201D to read"))))
+                    hasDescendant(withText("Allow \u201C$TEST_APP_NAME\u201D to read"))
+                )
+            )
         Espresso.onIdle()
         onView(withText("Allow \u201C$TEST_APP_NAME\u201D to read")).check(matches(isDisplayed()))
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Allow \u201C$TEST_APP_NAME\u201D to write"))))
+                    hasDescendant(withText("Allow \u201C$TEST_APP_NAME\u201D to write"))
+                )
+            )
         Espresso.onIdle()
         onView(withText("Allow \u201C$TEST_APP_NAME\u201D to write")).check(matches(isDisplayed()))
 
         verify(healthConnectLogger, atLeast(1)).setPageId(PageName.REQUEST_PERMISSIONS_PAGE)
         verify(healthConnectLogger).logPageImpression()
-        verify(healthConnectLogger, times(2)).logImpression(PermissionsElement.PERMISSION_SWITCH)
+        verify(healthConnectLogger, times(4)).logImpression(PermissionsElement.PERMISSION_SWITCH)
         verify(healthConnectLogger).logImpression(PermissionsElement.ALLOW_ALL_SWITCH)
     }
 
     @Test
-    fun whenHistoryReadPermissionAlreadyGranted_displaysCorrectText() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(READ_STEPS),
-                    fromPermissionString(WRITE_HEART_RATE),
+    fun whenMedical_headerDisplaysCorrectTitle() {
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = true,
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
                 )
-            MutableLiveData(permissions)
+            )
         }
-        `when`(viewModel.isHistoryAccessGranted()).thenReturn(true)
+        launchFragment<FitnessPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow $TEST_APP_NAME to access fitness and wellness data?"))
+            .check(matches(isDisplayed()))
+        onView(withText("Allow $TEST_APP_NAME to access Health Connect?")).check(doesNotExist())
+    }
+
+    @Test
+    fun whenNoMedical_headerDisplaysCorrectTitle() {
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = true,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
+                )
+            )
+        }
+        launchFragment<FitnessPermissionsFragment>(bundleOf())
+
+        onView(withText("Allow $TEST_APP_NAME to access fitness and wellness data?"))
+            .check(doesNotExist())
+        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun whenHistoryReadGranted_headerDisplaysCorrectText() {
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = true,
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
+                )
+            )
+        }
+        launchFragment<FitnessPermissionsFragment>(bundleOf())
+
+        onView(withText("If you give read access, the app can read new and past data"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you give read access, the app can read new data and data from the past 30 days"
+                )
+            )
+            .check(doesNotExist())
+    }
+
+    @Test
+    fun whenHistoryReadNotGranted_headerDisplaysCorrectText() {
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = false,
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
+                )
+            )
+        }
+        launchFragment<FitnessPermissionsFragment>(bundleOf())
+
+        onView(withText("If you give read access, the app can read new and past data"))
+            .check(doesNotExist())
+        onView(
+                withText(
+                    "If you give read access, the app can read new data and data from the past 30 days"
+                )
+            )
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun whenOnlyReadPermissionsRequested_headerDisplaysCorrectText() {
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessRead(
+                    historyGranted = false,
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadPermissions,
+                )
+            )
+        }
+        launchFragment<FitnessPermissionsFragment>(bundleOf())
+
+        onView(withText("Choose data you want this app to read from Health Connect"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you give read access, the app can read new data and data from the past 30 days"
+                )
+            )
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun whenOnlyWritePermissionsRequested_headerDisplaysCorrectText() {
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessWrite(
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessWritePermissions,
+                )
+            )
+        }
+        launchFragment<FitnessPermissionsFragment>(bundleOf())
+
+        onView(withText("Choose data you want this app to write to Health Connect"))
+            .check(matches(isDisplayed()))
+        onView(withText("If you give read access, the app can read new and past data"))
+            .check(doesNotExist())
+        onView(
+                withText(
+                    "If you give read access, the app can read new data and data from the past 30 days"
+                )
+            )
+            .check(doesNotExist())
+    }
+
+    @Test
+    fun whenReadAndWritePermissionsRequested_headerDisplaysCorrectText() {
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = false,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
+                )
+            )
+        }
         launchFragment<FitnessPermissionsFragment>(bundleOf())
 
         onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
             .check(matches(isDisplayed()))
         onView(withText("Choose data you want this app to read or write to Health Connect"))
             .check(matches(isDisplayed()))
-        onView(withText("If you give read access, the app can read new and past data"))
+        onView(
+                withText(
+                    "If you give read access, the app can read new data and data from the past 30 days"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"))
+                    "You can learn how $TEST_APP_NAME handles your data in their privacy policy"
+                )
+            )
             .check(matches(isDisplayed()))
     }
 
     @Test
     fun displaysReadPermissions() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(READ_STEPS),
-                    fromPermissionString(READ_HEART_RATE),
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessRead(
+                    historyGranted = false,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadPermissions,
                 )
-            MutableLiveData(permissions)
+            )
         }
         launchFragment<FitnessPermissionsFragment>(bundleOf())
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Steps"))))
+                    hasDescendant(withText("Steps"))
+                )
+            )
         Espresso.onIdle()
         onView(withText("Steps")).check(matches(isDisplayed()))
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Heart rate"))))
+                    hasDescendant(withText("Sleep"))
+                )
+            )
         Espresso.onIdle()
-        onView(withText("Heart rate")).check(matches(isDisplayed()))
+        onView(withText("Sleep")).check(matches(isDisplayed()))
     }
 
     @Test
     fun displaysWritePermissions() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(WRITE_DISTANCE),
-                    fromPermissionString(WRITE_EXERCISE),
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessWrite(
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessWritePermissions,
                 )
-            MutableLiveData(permissions)
+            )
         }
         launchFragment<FitnessPermissionsFragment>(bundleOf())
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Distance"))))
+                    hasDescendant(withText("Heart rate"))
+                )
+            )
         Espresso.onIdle()
-        onView(withText("Distance")).check(matches(isDisplayed()))
+        onView(withText("Heart rate")).check(matches(isDisplayed()))
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Exercise"))))
+                    hasDescendant(withText("Exercise"))
+                )
+            )
         Espresso.onIdle()
         onView(withText("Exercise")).check(matches(isDisplayed()))
     }
 
     @Test
     fun togglesPermissions_callsUpdatePermissions() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(READ_DISTANCE),
-                    fromPermissionString(WRITE_EXERCISE),
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = false,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
                 )
-            MutableLiveData(permissions)
+            )
         }
         launchFragment<FitnessPermissionsFragment>(bundleOf())
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Distance"))))
+                    hasDescendant(withText("Sleep"))
+                )
+            )
         Espresso.onIdle()
-        onView(withText("Distance")).perform(click())
+        onView(withText("Sleep")).perform(click())
 
         verify(viewModel).updateHealthPermission(any(FitnessPermission::class.java), eq(true))
         verify(healthConnectLogger)
@@ -255,15 +438,16 @@
 
     @Test
     fun allowAllToggleOn_updatesAllPermissions() {
-        val permissions =
-            listOf(
-                fromPermissionString(READ_STEPS),
-                fromPermissionString(WRITE_STEPS),
-                fromPermissionString(READ_HEART_RATE),
-                fromPermissionString(WRITE_HEART_RATE),
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = false,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
+                )
             )
-        `when`(viewModel.healthPermissionsList).then { MutableLiveData(permissions) }
-
+        }
         val activityScenario = launchFragment<FitnessPermissionsFragment>(bundleOf())
 
         activityScenario.onActivity { activity: TestActivity ->
@@ -272,7 +456,7 @@
                     as PermissionsFragment
             val allowAllPreference =
                 fragment.preferenceScreen.findPreference("allow_all_preference")
-                    as MainSwitchPreference?
+                    as HealthMainSwitchPreference?
             allowAllPreference?.isChecked =
                 false // makes sure the preference is on so OnPreferenceChecked is triggered
 
@@ -288,14 +472,16 @@
 
     @Test
     fun allowAllToggleOff_updatesAllPermissions() {
-        val permissions =
-            listOf(
-                fromPermissionString(READ_STEPS),
-                fromPermissionString(WRITE_STEPS),
-                fromPermissionString(READ_HEART_RATE),
-                fromPermissionString(WRITE_HEART_RATE),
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = false,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
+                )
             )
-        `when`(viewModel.healthPermissionsList).then { MutableLiveData(permissions) }
+        }
         val activityScenario = launchFragment<FitnessPermissionsFragment>(bundleOf())
 
         activityScenario.onActivity { activity: TestActivity ->
@@ -304,7 +490,7 @@
                     as PermissionsFragment
             val allowAllPreference =
                 fragment.preferenceScreen.findPreference("allow_all_preference")
-                    as MainSwitchPreference?
+                    as HealthMainSwitchPreference?
             allowAllPreference?.isChecked =
                 true // makes sure the preference is on so OnPreferenceChecked is triggered
 
@@ -316,19 +502,15 @@
 
     @Test
     fun allowButton_noFitnessPermissionsSelected_isDisabled() {
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                HealthPermission.fromPermissionString(READ_STEPS) to PermissionState.GRANTED,
-                HealthPermission.fromPermissionString(READ_HEART_RATE) to PermissionState.GRANTED,
-                HealthPermission.fromPermissionString(WRITE_DISTANCE) to PermissionState.GRANTED,
-                HealthPermission.fromPermissionString(WRITE_EXERCISE) to PermissionState.GRANTED)
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = false,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
+                )
+            )
         }
         whenever(viewModel.grantedFitnessPermissions).then {
             MutableLiveData(emptySet<FitnessPermission>())
@@ -340,12 +522,15 @@
 
     @Test
     fun allowButton_fitnessPermissionsSelected_isEnabled() {
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    historyGranted = false,
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    fitnessPermissions = fitnessReadWritePermissions,
+                )
+            )
         }
         whenever(viewModel.grantedFitnessPermissions).then {
             MutableLiveData(setOf(HealthPermission.fromPermissionString(READ_STEPS)))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/MedicalPermissionsFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/MedicalPermissionsFragmentTest.kt
index 324eabc..8c307a8 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/MedicalPermissionsFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/MedicalPermissionsFragmentTest.kt
@@ -15,24 +15,25 @@
  */
 package com.android.healthconnect.controller.tests.permissions.request
 
-import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE
-import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_CONDITIONS
 import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS
 import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS
 import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PREGNANCY
-import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PROBLEMS
 import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PROCEDURES
 import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VISITS
 import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS
-import android.health.connect.HealthPermissions.READ_STEPS
-import android.health.connect.HealthPermissions.WRITE_DISTANCE
 import android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MutableLiveData
 import androidx.recyclerview.widget.RecyclerView
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.action.ViewActions.*
+import androidx.test.espresso.action.ViewActions.click
 import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.contrib.RecyclerViewActions
@@ -41,18 +42,17 @@
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.withId
 import androidx.test.espresso.matcher.ViewMatchers.withText
-import androidx.test.platform.app.InstrumentationRegistry.*
+import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
 import com.android.compatibility.common.util.DisableAnimationRule
 import com.android.healthconnect.controller.R
-import com.android.healthconnect.controller.permissions.data.HealthPermission
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission.Companion.fromPermissionString
-import com.android.healthconnect.controller.permissions.data.PermissionState
 import com.android.healthconnect.controller.permissions.request.MedicalPermissionsFragment
+import com.android.healthconnect.controller.permissions.request.MedicalScreenState
 import com.android.healthconnect.controller.permissions.request.PermissionsFragment
 import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
 import com.android.healthconnect.controller.shared.app.AppMetadata
+import com.android.healthconnect.controller.shared.preference.HealthMainSwitchPreference
 import com.android.healthconnect.controller.tests.TestActivity
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
@@ -60,13 +60,11 @@
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.ErrorPageElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
 import com.android.healthconnect.controller.utils.logging.PermissionsElement
 import com.android.healthconnect.controller.utils.logging.UIAction
-import com.android.settingslib.widget.MainSwitchPreference
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -77,8 +75,13 @@
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
-import org.mockito.Matchers.eq
-import org.mockito.Mockito.*
+import org.mockito.Mockito.atLeast
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.whenever
 
 @ExperimentalCoroutinesApi
 @HiltAndroidTest
@@ -91,25 +94,45 @@
     val viewModel: RequestPermissionViewModel = mock(RequestPermissionViewModel::class.java)
     @BindValue val healthConnectLogger: HealthConnectLogger = mock(HealthConnectLogger::class.java)
 
-    val emptyFitnessPermissionList: List<HealthPermission> = listOf()
+    private lateinit var appMetadata: AppMetadata
+    private lateinit var allMedicalReadPermissions: List<MedicalPermission>
+    private lateinit var allMedicalWritePermissions: List<MedicalPermission>
+    private lateinit var allMedicalPermissions: List<MedicalPermission>
 
     @Before
     fun setup() {
         hiltRule.inject()
         val context = getInstrumentation().context
         context.setLocale(Locale.US)
-        `when`(viewModel.appMetadata).then {
-            MutableLiveData(
-                AppMetadata(
-                    TEST_APP_PACKAGE_NAME,
-                    TEST_APP_NAME,
-                    context.getDrawable(R.drawable.health_connect_logo),
-                )
+        appMetadata =
+            AppMetadata(
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                context.getDrawable(R.drawable.health_connect_logo),
             )
+        allMedicalReadPermissions =
+            listOf(
+                fromPermissionString(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES),
+                fromPermissionString(READ_MEDICAL_DATA_CONDITIONS),
+                fromPermissionString(READ_MEDICAL_DATA_LABORATORY_RESULTS),
+                fromPermissionString(READ_MEDICAL_DATA_MEDICATIONS),
+                fromPermissionString(READ_MEDICAL_DATA_PERSONAL_DETAILS),
+                fromPermissionString(READ_MEDICAL_DATA_PRACTITIONER_DETAILS),
+                fromPermissionString(READ_MEDICAL_DATA_PREGNANCY),
+                fromPermissionString(READ_MEDICAL_DATA_PROCEDURES),
+                fromPermissionString(READ_MEDICAL_DATA_SOCIAL_HISTORY),
+                fromPermissionString(READ_MEDICAL_DATA_VACCINES),
+                fromPermissionString(READ_MEDICAL_DATA_VISITS),
+                fromPermissionString(READ_MEDICAL_DATA_VITAL_SIGNS),
+            )
+        allMedicalWritePermissions = listOf(fromPermissionString(WRITE_MEDICAL_DATA))
+        allMedicalPermissions = allMedicalReadPermissions + allMedicalWritePermissions
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(MedicalScreenState.NoMedicalData)
         }
-        `when`(viewModel.allMedicalPermissionsGranted).then { MutableLiveData(false) }
-        `when`(viewModel.grantedMedicalPermissions).then {
-            MutableLiveData(emptySet<FitnessPermission>())
+        whenever(viewModel.allMedicalPermissionsGranted).then { MutableLiveData(false) }
+        whenever(viewModel.grantedMedicalPermissions).then {
+            MutableLiveData(emptySet<MedicalPermission>())
         }
         toggleAnimation(false)
     }
@@ -121,34 +144,31 @@
     }
 
     @Test
-    fun displaysMedicalCategories() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(READ_MEDICAL_DATA_ALLERGY_INTOLERANCE),
-                    fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION),
-                    fromPermissionString(READ_MEDICAL_DATA_LABORATORY_RESULTS),
-                    fromPermissionString(READ_MEDICAL_DATA_MEDICATIONS),
-                    fromPermissionString(READ_MEDICAL_DATA_PREGNANCY),
-                    fromPermissionString(READ_MEDICAL_DATA_PROBLEMS),
-                    fromPermissionString(READ_MEDICAL_DATA_PROCEDURES),
-                    fromPermissionString(READ_MEDICAL_DATA_SOCIAL_HISTORY),
-                    fromPermissionString(READ_MEDICAL_DATA_VITAL_SIGNS),
-                    fromPermissionString(WRITE_MEDICAL_DATA),
+    fun medicalReadAndWrite_displaysMedicalCategories() {
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalReadWrite(
+                    appMetadata = appMetadata,
+                    medicalPermissions = allMedicalPermissions,
                 )
-            MutableLiveData(permissions)
+            )
         }
+
         launchFragment<MedicalPermissionsFragment>(bundleOf())
 
-        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
+        onView(withText("Allow $TEST_APP_NAME to access your health records?"))
             .check(matches(isDisplayed()))
         onView(withText("Choose data you want this app to read or write to Health Connect"))
             .check(matches(isDisplayed()))
-        onView(withText("If you give read access, the app can read new and past data"))
+        onView(
+                withText(
+                    "If you give access, the app can read and write data such as allergies, lab results, vaccines and more\nAbout health records"
+                )
+            )
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                    "You can learn how $TEST_APP_NAME handles your data in their privacy policy"
                 )
             )
             .check(matches(isDisplayed()))
@@ -170,125 +190,94 @@
             )
         Espresso.onIdle()
         onView(withText("Allow \u201C$TEST_APP_NAME\u201D to write")).check(matches(isDisplayed()))
+    }
 
-        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.UNKNOWN_PAGE)
+    @Test
+    fun medicalReadAndWrite_phrUiTelemetryFlagEnabled_phrTelemetry() {
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalReadWrite(
+                    appMetadata = appMetadata,
+                    medicalPermissions = allMedicalPermissions,
+                )
+            )
+        }
+        launchFragment<MedicalPermissionsFragment>(bundleOf())
+
+        verify(healthConnectLogger, atLeast(1)).setPageId(PageName.REQUEST_MEDICAL_PERMISSIONS_PAGE)
         verify(healthConnectLogger).logPageImpression()
         verify(healthConnectLogger, times(3)).logImpression(ErrorPageElement.UNKNOWN_ELEMENT)
     }
 
     @Test
-    fun whenHistoryReadPermissionAlreadyGranted_displaysCorrectText() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(READ_MEDICAL_DATA_ALLERGY_INTOLERANCE),
-                    fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION),
-                    fromPermissionString(WRITE_MEDICAL_DATA),
+    fun medicalRead_displaysOnlyReadPermissions() {
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalRead(
+                    appMetadata = appMetadata,
+                    medicalPermissions = allMedicalReadPermissions,
                 )
-            MutableLiveData(permissions)
+            )
         }
-        `when`(viewModel.isHistoryAccessGranted()).thenReturn(true)
+
         launchFragment<MedicalPermissionsFragment>(bundleOf())
 
-        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
+        onView(withText("Allow $TEST_APP_NAME to access your health records?"))
             .check(matches(isDisplayed()))
-        onView(withText("Choose data you want this app to read or write to Health Connect"))
-            .check(matches(isDisplayed()))
-        onView(withText("If you give read access, the app can read new and past data"))
+        onView(withText("Choose data you want this app to read from Health Connect"))
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                    "If you give access, the app can read data such as allergies, lab results, vaccines and more\nAbout health records"
                 )
             )
             .check(matches(isDisplayed()))
-    }
-
-    @Test
-    fun whenHistoryReadPermissionRevoked_displaysCorrectText() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION),
-                    fromPermissionString(WRITE_MEDICAL_DATA),
-                )
-            MutableLiveData(permissions)
-        }
-        launchFragment<MedicalPermissionsFragment>(bundleOf())
-
-        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
-            .check(matches(isDisplayed()))
-        onView(withText("Choose data you want this app to read or write to Health Connect"))
-            .check(matches(isDisplayed()))
-        onView(withText("If you give read access, the app can read new and past data"))
-            .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"
+                    "You can learn how $TEST_APP_NAME handles your data in their privacy policy"
                 )
             )
             .check(matches(isDisplayed()))
-    }
-
-    @Test
-    fun displaysOnlyReadPermissions() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions = listOf(fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION))
-            MutableLiveData(permissions)
-        }
-        launchFragment<MedicalPermissionsFragment>(bundleOf())
 
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Immunization"))
+                    hasDescendant(withText("Allow \u201C$TEST_APP_NAME\u201D to read"))
                 )
             )
         Espresso.onIdle()
-        onView(withText("Immunization")).check(matches(isDisplayed()))
-
+        onView(withText("Allow \u201C$TEST_APP_NAME\u201D to read")).check(matches(isDisplayed()))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(RecyclerViewActions.scrollToLastPosition<RecyclerView.ViewHolder>())
+        Espresso.onIdle()
+        onView(withText("Allow \u201C$TEST_APP_NAME\u201D to write")).check(doesNotExist())
         onView(withText("All health records")).check(doesNotExist())
     }
 
     @Test
-    fun displaysOnlyWritePermissions() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions = listOf(fromPermissionString(WRITE_MEDICAL_DATA))
-            MutableLiveData(permissions)
-        }
-        launchFragment<MedicalPermissionsFragment>(bundleOf())
-
-        onView(withText("Immunization")).check(doesNotExist())
-
-        onView(withId(androidx.preference.R.id.recycler_view))
-            .perform(
-                RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("All health records"))
-                )
-            )
-        Espresso.onIdle()
-        onView(withText("All health records")).check(matches(isDisplayed()))
-    }
-
-    @Test
     fun togglesPermissions_callsUpdatePermissions() {
-        `when`(viewModel.healthPermissionsList).then {
-            val permissions =
-                listOf(
-                    fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION),
-                    fromPermissionString(WRITE_MEDICAL_DATA),
+        val permissions =
+            listOf(
+                fromPermissionString(READ_MEDICAL_DATA_VACCINES),
+                fromPermissionString(WRITE_MEDICAL_DATA),
+            )
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalRead(
+                    appMetadata = appMetadata,
+                    medicalPermissions = permissions,
                 )
-            MutableLiveData(permissions)
+            )
         }
         launchFragment<MedicalPermissionsFragment>(bundleOf())
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(
                 RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
-                    hasDescendant(withText("Immunization"))
+                    hasDescendant(withText("Vaccines"))
                 )
             )
         Espresso.onIdle()
-        onView(withText("Immunization")).perform(click())
+        onView(withText("Vaccines")).perform(click())
 
         verify(viewModel).updateHealthPermission(any(MedicalPermission::class.java), eq(true))
         verify(healthConnectLogger)
@@ -299,13 +288,17 @@
     fun allowAllToggleOn_updatesAllPermissions() {
         val permissions =
             listOf(
-                FitnessPermission.fromPermissionString(READ_STEPS),
-                FitnessPermission.fromPermissionString(WRITE_DISTANCE),
-                fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION),
+                fromPermissionString(READ_MEDICAL_DATA_VACCINES),
                 fromPermissionString(WRITE_MEDICAL_DATA),
             )
-        `when`(viewModel.healthPermissionsList).then { MutableLiveData(permissions) }
-
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalRead(
+                    appMetadata = appMetadata,
+                    medicalPermissions = permissions,
+                )
+            )
+        }
         val activityScenario = launchFragment<MedicalPermissionsFragment>(bundleOf())
 
         activityScenario.onActivity { activity: TestActivity ->
@@ -314,7 +307,7 @@
                     as PermissionsFragment
             val allowAllPreference =
                 fragment.preferenceScreen.findPreference("allow_all_preference")
-                    as MainSwitchPreference?
+                    as HealthMainSwitchPreference?
             allowAllPreference?.isChecked =
                 false // makes sure the preference is on so OnPreferenceChecked is triggered
 
@@ -332,10 +325,17 @@
     fun allowAllToggleOff_updatesAllPermissions() {
         val permissions =
             listOf(
-                fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION),
+                fromPermissionString(READ_MEDICAL_DATA_VACCINES),
                 fromPermissionString(WRITE_MEDICAL_DATA),
             )
-        `when`(viewModel.healthPermissionsList).then { MutableLiveData(permissions) }
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalRead(
+                    appMetadata = appMetadata,
+                    medicalPermissions = permissions,
+                )
+            )
+        }
         val activityScenario = launchFragment<MedicalPermissionsFragment>(bundleOf())
 
         activityScenario.onActivity { activity: TestActivity ->
@@ -344,7 +344,7 @@
                     as PermissionsFragment
             val allowAllPreference =
                 fragment.preferenceScreen.findPreference("allow_all_preference")
-                    as MainSwitchPreference?
+                    as HealthMainSwitchPreference?
             allowAllPreference?.isChecked =
                 true // makes sure the preference is on so OnPreferenceChecked is triggered
 
@@ -356,17 +356,21 @@
 
     @Test
     fun allowButton_noMedicalPermissionsSelected_isDisabled() {
-        val permissions = listOf(READ_MEDICAL_DATA_IMMUNIZATION, WRITE_MEDICAL_DATA)
-        whenever(viewModel.healthPermissionsList).then { MutableLiveData(permissions) }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                HealthPermission.fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION) to
-                    PermissionState.GRANTED,
-                HealthPermission.fromPermissionString(WRITE_DISTANCE) to PermissionState.GRANTED,
+        val permissions =
+            listOf(
+                fromPermissionString(READ_MEDICAL_DATA_VACCINES),
+                fromPermissionString(WRITE_MEDICAL_DATA),
+            )
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalRead(
+                    appMetadata = appMetadata,
+                    medicalPermissions = permissions,
+                )
             )
         }
         whenever(viewModel.grantedMedicalPermissions).then {
-            MutableLiveData(emptySet<FitnessPermission>())
+            MutableLiveData(emptySet<MedicalPermission>())
         }
 
         launchFragment<MedicalPermissionsFragment>(bundleOf())
@@ -375,12 +379,21 @@
 
     @Test
     fun allowButton_medicalPermissionsSelected_isEnabled() {
-        val permissions = listOf(READ_MEDICAL_DATA_IMMUNIZATION, WRITE_MEDICAL_DATA)
-        whenever(viewModel.healthPermissionsList).then { MutableLiveData(permissions) }
-        whenever(viewModel.grantedMedicalPermissions).then {
-            MutableLiveData(
-                setOf(HealthPermission.fromPermissionString(READ_MEDICAL_DATA_IMMUNIZATION))
+        val permissions =
+            listOf(
+                fromPermissionString(READ_MEDICAL_DATA_VACCINES),
+                fromPermissionString(WRITE_MEDICAL_DATA),
             )
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalRead(
+                    appMetadata = appMetadata,
+                    medicalPermissions = permissions,
+                )
+            )
+        }
+        whenever(viewModel.grantedMedicalPermissions).then {
+            MutableLiveData(setOf(fromPermissionString(READ_MEDICAL_DATA_VACCINES)))
         }
 
         launchFragment<MedicalPermissionsFragment>(bundleOf())
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/MockedPermissionsActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/MockedPermissionsActivityTest.kt
index 0a85d15..714cf12 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/MockedPermissionsActivityTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/MockedPermissionsActivityTest.kt
@@ -19,31 +19,39 @@
 package com.android.healthconnect.controller.tests.permissions.request
 
 import android.app.Activity
+import android.app.Activity.RESULT_CANCELED
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
-import android.content.pm.ActivityInfo
+import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
+import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
 import android.content.pm.PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES
 import android.content.pm.PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS
 import android.content.pm.PackageManager.PERMISSION_DENIED
-import android.content.pm.PackageManager.PERMISSION_GRANTED
-import android.health.connect.HealthPermissions.READ_HEALTH_DATA_HISTORY
-import android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND
 import android.health.connect.HealthPermissions.READ_HEART_RATE
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES
 import android.health.connect.HealthPermissions.READ_STEPS
 import android.health.connect.HealthPermissions.WRITE_DISTANCE
 import android.health.connect.HealthPermissions.WRITE_EXERCISE
-import android.widget.Button
+import android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.MutableLiveData
+import androidx.recyclerview.widget.RecyclerView
 import androidx.test.core.app.ActivityScenario.launchActivityForResult
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.Espresso.onView
 import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.action.ViewActions.scrollTo
 import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.contrib.RecyclerViewActions.scrollToLastPosition
+import androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition
 import androidx.test.espresso.matcher.RootMatchers.isDialog
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withId
 import androidx.test.espresso.matcher.ViewMatchers.withText
 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
 import com.android.healthconnect.controller.R
@@ -53,80 +61,97 @@
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.DataRestoreUiError
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.DataRestoreUiState
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.MigrationUiState
+import com.android.healthconnect.controller.navigation.TrampolineActivity
 import com.android.healthconnect.controller.permissions.data.HealthPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.fromPermissionString
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.PermissionState
-import com.android.healthconnect.controller.permissions.request.AdditionalPermissionsInfo
+import com.android.healthconnect.controller.permissions.request.AdditionalScreenState
+import com.android.healthconnect.controller.permissions.request.FitnessScreenState
+import com.android.healthconnect.controller.permissions.request.MedicalScreenState
 import com.android.healthconnect.controller.permissions.request.PermissionsActivity
+import com.android.healthconnect.controller.permissions.request.PermissionsActivityState
 import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
+import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
-import com.android.healthconnect.controller.tests.utils.TEST_APP
+import com.android.healthconnect.controller.tests.utils.NOW
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
+import com.android.healthconnect.controller.tests.utils.di.FakeDeviceInfoUtils
 import com.android.healthconnect.controller.tests.utils.showOnboarding
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
+import com.android.healthconnect.controller.utils.DeviceInfoUtils
+import com.android.healthconnect.controller.utils.DeviceInfoUtilsModule
 import com.android.healthconnect.controller.utils.logging.DataRestoreElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.MedicalWritePermissionPageElement
 import com.android.healthconnect.controller.utils.logging.MigrationElement
-import com.android.healthconnect.controller.utils.logging.PermissionsElement
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
-import javax.inject.Inject
+import dagger.hilt.android.testing.UninstallModules
 import org.junit.After
 import org.junit.Assert.assertEquals
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
-import org.mockito.Mockito
 import org.mockito.Mockito.anyString
+import org.mockito.Mockito.atLeast
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.times
 import org.mockito.kotlin.anyArray
-import org.mockito.kotlin.atLeast
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
+/**
+ * Tests the display of the PermissionsActivity and all the cases where the activity is terminated
+ * before displaying anything.
+ */
+@UninstallModules(DeviceInfoUtilsModule::class)
 @HiltAndroidTest
 class MockedPermissionsActivityTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
 
     @BindValue
-    val viewModel: RequestPermissionViewModel = Mockito.mock(RequestPermissionViewModel::class.java)
+    val viewModel: RequestPermissionViewModel = mock(RequestPermissionViewModel::class.java)
+    @BindValue val migrationViewModel: MigrationViewModel = mock(MigrationViewModel::class.java)
+    @BindValue val healthConnectLogger: HealthConnectLogger = mock(HealthConnectLogger::class.java)
+    @BindValue val deviceInfoUtils: DeviceInfoUtils = FakeDeviceInfoUtils()
     @BindValue
-    val migrationViewModel: MigrationViewModel = Mockito.mock(MigrationViewModel::class.java)
-    @BindValue
-    val healthConnectLogger: HealthConnectLogger = Mockito.mock(HealthConnectLogger::class.java)
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
+    val healthPermissionReader: HealthPermissionReader = mock(HealthPermissionReader::class.java)
 
     private lateinit var context: Context
+    private lateinit var appMetadata: AppMetadata
 
     @Before
     fun setup() {
         hiltRule.inject()
         context = getInstrumentation().context
+        appMetadata =
+            AppMetadata(
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                context.getDrawable(R.drawable.health_connect_logo),
+            )
         val permissionsList =
             listOf(
                 fromPermissionString(READ_STEPS),
                 fromPermissionString(READ_HEART_RATE),
                 fromPermissionString(WRITE_DISTANCE),
-                fromPermissionString(WRITE_EXERCISE))
+                fromPermissionString(WRITE_EXERCISE),
+            )
+        whenever(viewModel.appMetadata).then { MutableLiveData(appMetadata) }
         whenever(viewModel.grantedFitnessPermissions).then {
             MutableLiveData(permissionsList.toSet())
         }
         whenever(viewModel.allFitnessPermissionsGranted).then { MutableLiveData(true) }
-        whenever(viewModel.appMetadata).then {
-            MutableLiveData(
-                AppMetadata(
-                    TEST_APP_PACKAGE_NAME,
-                    TEST_APP_NAME,
-                    context.getDrawable(R.drawable.health_connect_logo)))
-        }
         whenever(viewModel.isAnyPermissionUserFixed(anyString(), anyArray())).thenReturn(false)
         whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(true)
         whenever(migrationViewModel.migrationState).then {
@@ -135,10 +160,27 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
+        whenever(viewModel.grantedAdditionalPermissions).then {
+            MutableLiveData<Set<AdditionalPermission>>(setOf())
+        }
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(MedicalScreenState.NoMedicalData)
+        }
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(FitnessScreenState.NoFitnessData)
+        }
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(AdditionalScreenState.NoAdditionalData)
+        }
+
+        whenever(healthPermissionReader.isRationaleIntentDeclared(anyString())).thenReturn(true)
+
+        (deviceInfoUtils as FakeDeviceInfoUtils).setHealthConnectAvailable(true)
         showOnboarding(context, false)
         // disable animations
         toggleAnimation(false)
@@ -152,586 +194,379 @@
     }
 
     @Test
-    fun requestWithFitnessPermissions_sendsResultOk() {
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
+    fun whenHealthConnectNotAvailable_sendsResultCanceled() {
+        (deviceInfoUtils as FakeDeviceInfoUtils).setHealthConnectAvailable(false)
 
-        whenever(viewModel.isHistoryAccessGranted()).thenReturn(false)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_STEPS) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEART_RATE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_DISTANCE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_EXERCISE) to PermissionState.GRANTED)
-        }
+        val scenario =
+            launchActivityForResult<TrampolineActivity>(
+                getPermissionScreenIntent(arrayOf(READ_STEPS))
+            )
 
+        assertThat(scenario.result.resultCode).isEqualTo(RESULT_CANCELED)
+    }
+
+    @Test
+    fun whenNoPackageNameInIntent_sendsResultCanceled() {
+        val intent =
+            Intent.makeMainActivity(ComponentName(context, PermissionsActivity::class.java))
+                .putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES, arrayOf<String>())
+                .addFlags(FLAG_ACTIVITY_NEW_TASK)
+                .addFlags(FLAG_ACTIVITY_CLEAR_TASK)
+        val scenario = launchActivityForResult<PermissionsActivity>(intent)
+
+        assertThat(scenario.result.resultCode).isEqualTo(RESULT_CANCELED)
+    }
+
+    @Test
+    fun whenNoRationaleIntentDeclared_sendsResultCanceled() {
+        whenever(healthPermissionReader.isRationaleIntentDeclared(anyString())).thenReturn(false)
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowMedical(isWriteOnly = true))
+        }
+        val scenario =
+            launchActivityForResult<TrampolineActivity>(
+                getPermissionScreenIntent(arrayOf(READ_STEPS))
+            )
+
+        assertThat(scenario.result.resultCode).isEqualTo(RESULT_CANCELED)
+    }
+
+    @Test
+    fun showMedicalPermissionRequest_withOnlyWritePermission() {
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowMedical(isWriteOnly = true))
+        }
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalWrite(
+                    appMetadata = appMetadata,
+                    medicalPermissions =
+                        listOf(
+                            HealthPermission.MedicalPermission.fromPermissionString(
+                                WRITE_MEDICAL_DATA
+                            )
+                        ),
+                )
+            )
+        }
+        val permissions = arrayOf(WRITE_MEDICAL_DATA)
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withText("Allow $TEST_APP_NAME to access your health records?"))
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "If you give read access, the app can read new data and data from the past 30 days"))
+                    "If you allow, $TEST_APP_NAME can share your health records with Health Connect."
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToPosition<RecyclerView.ViewHolder>(2))
+        onView(withText("Data to share includes")).check(matches(isDisplayed()))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToPosition<RecyclerView.ViewHolder>(3))
+        val availableMedicalPermissionsString =
+            "Allergies\n" +
+                "Conditions\n" +
+                "Lab results\n" +
+                "Medications\n" +
+                "Procedures\n" +
+                "Vaccines\n" +
+                "Vital signs"
+        onView(withText(availableMedicalPermissionsString)).check(matches(isDisplayed()))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        Espresso.onIdle()
+        onView(
+                withText(
+                    "Sync your health records from your different apps and sources to keep " +
+                        "them in one place"
+                )
+            )
+            .perform(scrollTo())
+        onView(
+                withText(
+                    "Sync your health records from your different apps and sources to keep " +
+                        "them in one place"
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withText("About health records")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun showMedicalPermissionRequest_correctLogging() {
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowMedical(isWriteOnly = true))
+        }
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalWrite(
+                    appMetadata = appMetadata,
+                    medicalPermissions =
+                        listOf(
+                            HealthPermission.MedicalPermission.fromPermissionString(
+                                WRITE_MEDICAL_DATA
+                            )
+                        ),
+                )
+            )
+        }
+        val permissions = arrayOf(WRITE_MEDICAL_DATA)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        verify(healthConnectLogger, atLeast(1))
+            .setPageId(PageName.REQUEST_WRITE_MEDICAL_PERMISSION_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+        verify(healthConnectLogger)
+            .logImpression(MedicalWritePermissionPageElement.ALLOW_WRITE_HEALTH_RECORDS_BUTTON)
+        verify(healthConnectLogger)
+            .logImpression(MedicalWritePermissionPageElement.CANCEL_WRITE_HEALTH_RECORDS_BUTTON)
+    }
+
+    @Test
+    fun showMedicalPermissionRequest_withReadAndWritePermissions() {
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowMedical(isWriteOnly = false))
+        }
+        whenever(viewModel.medicalScreenState).then {
+            MutableLiveData(
+                MedicalScreenState.ShowMedicalReadWrite(
+                    appMetadata = appMetadata,
+                    medicalPermissions =
+                        listOf(READ_MEDICAL_DATA_VACCINES, WRITE_MEDICAL_DATA).map {
+                            fromPermissionString(it) as HealthPermission.MedicalPermission
+                        },
+                )
+            )
+        }
+        whenever(viewModel.allMedicalPermissionsGranted).then { MutableLiveData(true) }
+        whenever(viewModel.grantedMedicalPermissions).then {
+            MutableLiveData(setOf(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES))
+        }
+        val permissions = arrayOf(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withText("Allow $TEST_APP_NAME to access your health records?"))
+            .check(matches(isDisplayed()))
+        onView(withText("Choose data you want this app to read or write to Health Connect"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you give access, the app can read and write data such as allergies, lab results, vaccines and more\nAbout health records"
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "You can learn how $TEST_APP_NAME handles your data in their privacy policy"
+                )
+            )
             .check(matches(isDisplayed()))
 
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        verify(healthConnectLogger, atLeast(1))
-            .logImpression(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
-        verify(healthConnectLogger, atLeast(1))
-            .logInteraction(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(
-                intArrayOf(
-                    PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_GRANTED))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToPosition<RecyclerView.ViewHolder>(2))
+        onView(withText("Allow all")).check(matches(isDisplayed()))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Vaccines")).check(matches(isDisplayed()))
+        onView(withText("All health records")).check(matches(isDisplayed()))
     }
 
     @Test
-    fun requestWithAdditionalPermissions_flagsOff_finishesActivity() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(false)
-
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(false)
-
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+    fun showFitnessPermissionRequest() {
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowFitness)
         }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
+        whenever(viewModel.fitnessScreenState).then {
             MutableLiveData(
-                AdditionalPermissionsInfo(
-                    permissions.toPermissionsList().map { it as AdditionalPermission }, TEST_APP))
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to PermissionState.GRANTED,
+                FitnessScreenState.ShowFitnessReadWrite(
+                    appMetadata = appMetadata,
+                    fitnessPermissions =
+                        listOf(READ_STEPS, WRITE_DISTANCE).map {
+                            fromPermissionString(it) as HealthPermission.FitnessPermission
+                        },
+                    hasMedical = false,
+                    historyGranted = false,
+                )
             )
         }
-
+        whenever(viewModel.grantedFitnessPermissions).then {
+            MutableLiveData(setOf(FitnessPermission.fromPermissionString(READ_STEPS)))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MutableLiveData(false) }
+        val permissions = arrayOf(READ_STEPS, WRITE_DISTANCE)
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        assertEquals(Lifecycle.State.DESTROYED, scenario.state)
-    }
-
-    @Test
-    fun requestWithAdditionalPermissions_noReadPermissionsGranted_sendsResultCancelled() {
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(false)
-
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    permissions.toPermissionsList().map { it as AdditionalPermission }, TEST_APP))
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to PermissionState.GRANTED,
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
+            .check(matches(isDisplayed()))
+        onView(withText("Choose data you want this app to read or write to Health Connect"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you give read access, the app can read new data and data from the past 30 days"
+                )
             )
-        }
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_CANCELED)
-    }
-
-    @Test
-    fun requestWithAdditionalPermissions_readPermissionsGranted_sendsResultOk() {
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(true)
-
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(
-                AdditionalPermissionsInfo(
-                    permissions.toPermissionsList().map { it as AdditionalPermission }, TEST_APP))
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to PermissionState.GRANTED,
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "You can learn how $TEST_APP_NAME handles your data in their privacy policy"
+                )
             )
-        }
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED))
+            .check(matches(isDisplayed()))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToPosition<RecyclerView.ViewHolder>(2))
+        onView(withText("Allow all")).check(matches(isDisplayed()))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Steps")).check(matches(isDisplayed()))
+        onView(withText("Distance")).check(matches(isDisplayed()))
     }
 
     @Test
-    fun requestWithAdditionalPermissions_fitnessPermissionsGranted_onRotate_showsCorrectFragment() {
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(true)
-        whenever(viewModel.isFitnessPermissionRequestConcluded()).thenReturn(true)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+    fun showAdditionalPermissionRequest() {
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowAdditional(false))
         }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
+        whenever(viewModel.additionalScreenState).then {
             MutableLiveData(
-                AdditionalPermissionsInfo(
-                    permissions.toPermissionsList().map { it as AdditionalPermission }, TEST_APP))
+                AdditionalScreenState.ShowCombined(
+                    hasMedical = false,
+                    appMetadata = appMetadata,
+                    isMedicalReadGranted = false,
+                    isFitnessReadGranted = true,
+                    dataAccessDate = NOW,
+                )
+            )
         }
         whenever(viewModel.grantedAdditionalPermissions).then {
-            MutableLiveData(emptySet<AdditionalPermission>())
+            MutableLiveData(setOf(AdditionalPermission.READ_HEALTH_DATA_HISTORY))
         }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.NOT_GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to PermissionState.NOT_GRANTED,
-            )
-        }
-
+        val permissions = arrayOf(READ_STEPS, WRITE_DISTANCE)
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withText("Allow additional access for $TEST_APP_NAME?"))
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME also wants to access these Health Connect settings"))
+            .check(matches(isDisplayed()))
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Access past data")).check(matches(isDisplayed()))
+        onView(withText("Access data in the background")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun whenNoPermissions_sendsOkResult() {
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.NoPermissions)
+        }
+        val startActivityIntent = getPermissionScreenIntent(arrayOf())
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES)).isEmpty()
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS)).isEmpty()
+    }
 
-        onView(withText("Allow additional access for $TEST_APP_NAME?"))
-            .check(matches(isDisplayed()))
-        scenario.onActivity { activity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun whenPermissionUserFixed_noFlowConcluded_sendsResultOk() {
+        whenever(viewModel.isAnyPermissionUserFixed(anyString(), anyArray())).thenReturn(true)
+        whenever(viewModel.isFitnessPermissionRequestConcluded()).thenReturn(false)
+        whenever(viewModel.isMedicalPermissionRequestConcluded()).thenReturn(false)
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowFitness)
         }
-        Espresso.onIdle()
-
-        onView(withText("Allow additional access for $TEST_APP_NAME?"))
-            .check(matches(isDisplayed()))
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
+        whenever(viewModel.getPermissionGrants())
+            .thenReturn(
+                mutableMapOf(
+                    fromPermissionString(READ_STEPS) to PermissionState.NOT_GRANTED,
+                    fromPermissionString(WRITE_DISTANCE) to PermissionState.NOT_GRANTED,
+                )
+            )
+        val startActivityIntent = getPermissionScreenIntent(arrayOf(READ_STEPS, WRITE_DISTANCE))
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
         assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
         val returnedIntent = scenario.result.resultData
         assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
+            .isEqualTo(arrayOf(READ_STEPS, WRITE_DISTANCE))
         assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
             .isEqualTo(intArrayOf(PERMISSION_DENIED, PERMISSION_DENIED))
     }
 
     @Test
-    fun requestWithCombinedPermissions_noPermissionsGranted_showsBothRequestScreens() {
-        val permissions =
-            arrayOf(
-                READ_STEPS,
-                READ_HEART_RATE,
-                WRITE_DISTANCE,
-                WRITE_EXERCISE,
-                READ_HEALTH_DATA_HISTORY,
-                READ_HEALTH_DATA_IN_BACKGROUND)
-        val healthPermissionsList = permissions.toPermissionsList()
-        val fitnessPermissionsList = healthPermissionsList.filterIsInstance<FitnessPermission>()
-        val additionalPermissionsList =
-            healthPermissionsList.filterIsInstance<AdditionalPermission>()
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(true)
-        whenever(viewModel.healthPermissionsList).then { MutableLiveData(healthPermissionsList) }
-        whenever(viewModel.fitnessPermissionsList).then { MutableLiveData(fitnessPermissionsList) }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(additionalPermissionsList)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun whenPermissionUserFixed_flowConcluded_showsRequest() {
+        whenever(viewModel.isAnyPermissionUserFixed(anyString(), anyArray())).thenReturn(true)
+        whenever(viewModel.isFitnessPermissionRequestConcluded()).thenReturn(false)
+        whenever(viewModel.isMedicalPermissionRequestConcluded()).thenReturn(true)
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowFitness)
         }
-        whenever(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(AdditionalPermissionsInfo(additionalPermissionsList, TEST_APP))
-        }
-
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_STEPS) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEART_RATE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_DISTANCE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_EXERCISE) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to PermissionState.GRANTED)
-        }
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        scenario.onActivity { activity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-        }
-        Espresso.onIdle()
-        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
-            .check(matches(isDisplayed()))
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        verify(healthConnectLogger, atLeast(1))
-            .logImpression(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
-        verify(healthConnectLogger, atLeast(1))
-            .logInteraction(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
-
-        // Additional permissions
-        onView(withText("Allow additional access for $TEST_APP_NAME?"))
-            .check(matches(isDisplayed()))
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(
-                intArrayOf(
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED))
-    }
-
-    @Test
-    fun requestWithCombinedPermissions_noPermissionsGranted_denyAdditionalPermissions_sendsResultOk() {
-        val permissions =
-            arrayOf(
-                READ_STEPS,
-                READ_HEART_RATE,
-                WRITE_DISTANCE,
-                WRITE_EXERCISE,
-                READ_HEALTH_DATA_HISTORY,
-                READ_HEALTH_DATA_IN_BACKGROUND)
-        val healthPermissionsList = permissions.toPermissionsList()
-        val fitnessPermissionsList = healthPermissionsList.filterIsInstance<FitnessPermission>()
-        val additionalPermissionsList =
-            healthPermissionsList.filterIsInstance<AdditionalPermission>()
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(true)
-        whenever(viewModel.healthPermissionsList).then { MutableLiveData(healthPermissionsList) }
-        whenever(viewModel.fitnessPermissionsList).then { MutableLiveData(fitnessPermissionsList) }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(additionalPermissionsList)
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(AdditionalPermissionsInfo(additionalPermissionsList, TEST_APP))
-        }
-
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_STEPS) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEART_RATE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_DISTANCE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_EXERCISE) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.NOT_GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to PermissionState.NOT_GRANTED)
-        }
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
-            .check(matches(isDisplayed()))
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        verify(healthConnectLogger, atLeast(1))
-            .logImpression(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
-        verify(healthConnectLogger, atLeast(1))
-            .logInteraction(PermissionsElement.ALLOW_PERMISSIONS_BUTTON)
-
-        // Additional permissions
-        onView(withText("Allow additional access for $TEST_APP_NAME?"))
-            .check(matches(isDisplayed()))
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.dont_allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(
-                intArrayOf(
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_DENIED,
-                    PERMISSION_DENIED))
-    }
-
-    @Test
-    fun requestWithCombinedPermissions_fitnessPermissionsAlreadyGranted_showsAdditionalPermissions() {
-        val permissions =
-            arrayOf(
-                READ_STEPS,
-                READ_HEART_RATE,
-                WRITE_DISTANCE,
-                WRITE_EXERCISE,
-                READ_HEALTH_DATA_HISTORY,
-                READ_HEALTH_DATA_IN_BACKGROUND)
-        val notGrantedPermissions =
-            arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        val healthPermissionsList = notGrantedPermissions.toPermissionsList()
-        val fitnessPermissionsList = healthPermissionsList.filterIsInstance<FitnessPermission>()
-        val additionalPermissionsList =
-            healthPermissionsList.filterIsInstance<AdditionalPermission>()
-
-        whenever(viewModel.isAnyReadPermissionGranted()).thenReturn(true)
-        whenever(viewModel.healthPermissionsList).then { MutableLiveData(healthPermissionsList) }
-        whenever(viewModel.fitnessPermissionsList).then { MutableLiveData(fitnessPermissionsList) }
-        whenever(viewModel.additionalPermissionsList).then {
-            MutableLiveData(additionalPermissionsList)
-        }
-        whenever(viewModel.additionalPermissionsInfo).then {
-            MutableLiveData(AdditionalPermissionsInfo(additionalPermissionsList, TEST_APP))
-        }
-
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_STEPS) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEART_RATE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_DISTANCE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_EXERCISE) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to PermissionState.NOT_GRANTED)
-        }
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        scenario.onActivity { activity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-        }
-        Espresso.onIdle()
-        // This should show additional permissions only
-        onView(withText("Allow additional access for $TEST_APP_NAME?"))
-            .check(matches(isDisplayed()))
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(
-                intArrayOf(
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_GRANTED,
-                    PERMISSION_DENIED))
-    }
-
-    @Test
-    fun sendsOkResult_requestWithFitnessPermissionsSomeDenied() {
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_STEPS) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEART_RATE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_DISTANCE) to PermissionState.NOT_GRANTED,
-                fromPermissionString(WRITE_EXERCISE) to PermissionState.GRANTED,
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions =
+                        listOf(READ_STEPS, WRITE_DISTANCE).map {
+                            fromPermissionString(it) as FitnessPermission
+                        },
+                    historyGranted = false,
+                )
             )
         }
+        whenever(viewModel.grantedFitnessPermissions).then {
+            MutableLiveData(setOf(FitnessPermission.fromPermissionString(READ_STEPS)))
+        }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MutableLiveData(false) }
+        val permissions = arrayOf(READ_STEPS, WRITE_DISTANCE)
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(
-                intArrayOf(
-                    PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_DENIED, PERMISSION_GRANTED))
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        Espresso.onIdle()
+        onView(withText("Allow $TEST_APP_NAME to access fitness and wellness data?"))
+            .check(matches(isDisplayed()))
     }
 
     @Test
-    fun sendsOkResult_requestWithNoFitnessPermissionsGranted() {
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun whenPermissionUserFixed_sendsResultOk() {
+        whenever(viewModel.isAnyPermissionUserFixed(anyString(), anyArray())).thenReturn(true)
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowFitness)
         }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_STEPS) to PermissionState.NOT_GRANTED,
-                fromPermissionString(READ_HEART_RATE) to PermissionState.NOT_GRANTED,
-                fromPermissionString(WRITE_DISTANCE) to PermissionState.NOT_GRANTED,
-                fromPermissionString(WRITE_EXERCISE) to PermissionState.NOT_GRANTED,
+        whenever(viewModel.getPermissionGrants())
+            .thenReturn(
+                mutableMapOf(
+                    fromPermissionString(READ_STEPS) to PermissionState.NOT_GRANTED,
+                    fromPermissionString(WRITE_DISTANCE) to PermissionState.NOT_GRANTED,
+                )
             )
-        }
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
+        val startActivityIntent = getPermissionScreenIntent(arrayOf(READ_STEPS, WRITE_DISTANCE))
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.dont_allow).callOnClick()
-        }
-
-        verify(viewModel).updateFitnessPermissions(false)
         assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
         val returnedIntent = scenario.result.resultData
         assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
+            .isEqualTo(arrayOf(READ_STEPS, WRITE_DISTANCE))
         assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(
-                intArrayOf(
-                    PERMISSION_DENIED, PERMISSION_DENIED, PERMISSION_DENIED, PERMISSION_DENIED))
+            .isEqualTo(intArrayOf(PERMISSION_DENIED, PERMISSION_DENIED))
     }
 
     @Test
-    fun sendsOkResult_requestWithPermissionsSomeWithError() {
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_STEPS) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEART_RATE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_DISTANCE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_EXERCISE) to PermissionState.ERROR)
-        }
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(
-                intArrayOf(
-                    PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_DENIED))
-    }
-
-    @Test
-    fun allPermissionsGranted_finishesActivity() {
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(emptyList<HealthPermission>())
-        }
-        whenever(viewModel.getPermissionGrants()).then {
-            mapOf(
-                fromPermissionString(READ_STEPS) to PermissionState.GRANTED,
-                fromPermissionString(READ_HEART_RATE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_DISTANCE) to PermissionState.GRANTED,
-                fromPermissionString(WRITE_EXERCISE) to PermissionState.GRANTED)
-        }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData<List<FitnessPermission>>(emptyList())
-        }
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(
-                intArrayOf(
-                    PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_GRANTED))
-    }
-
-    @Test
-    fun intent_migrationInProgress_shoesMigrationInProgressDialog() {
+    fun whenMigrationInProgress_showsMigrationInProgressDialog() {
         whenever(migrationViewModel.getCurrentMigrationUiState()).then {
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IN_PROGRESS,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -739,32 +574,44 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IN_PROGRESS,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowFitness)
         }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions =
+                        listOf(READ_STEPS, WRITE_DISTANCE).map {
+                            fromPermissionString(it) as FitnessPermission
+                        },
+                    historyGranted = false,
+                )
+            )
         }
         whenever(viewModel.grantedFitnessPermissions).then {
-            MutableLiveData(setOf(fromPermissionString(READ_STEPS)))
+            MutableLiveData(setOf(FitnessPermission.fromPermissionString(READ_STEPS)))
         }
+        whenever(viewModel.allFitnessPermissionsGranted).then { MutableLiveData(false) }
 
+        val permissions = arrayOf(READ_STEPS, WRITE_DISTANCE)
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        scenario.onActivity { activity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-        }
-        Espresso.onIdle()
         onView(withText("Health Connect integration in progress"))
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Health Connect is being integrated with the Android system.\n\nYou'll get a notification when the process is complete and you can use $TEST_APP_NAME with Health Connect."))
+                    "Health Connect is being integrated with the Android system.\n\nYou'll get a notification when the process is complete and you can use $TEST_APP_NAME with Health Connect."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -783,12 +630,13 @@
     }
 
     @Test
-    fun intent_restoreInProgress_showsRestoreInProgressDialog() {
+    fun whenRestoreInProgress_showsRestoreInProgressDialog() {
         whenever(migrationViewModel.getCurrentMigrationUiState()).then {
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -796,32 +644,44 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowFitness)
         }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions =
+                        listOf(READ_STEPS, WRITE_DISTANCE).map {
+                            fromPermissionString(it) as FitnessPermission
+                        },
+                    historyGranted = false,
+                )
+            )
         }
         whenever(viewModel.grantedFitnessPermissions).then {
-            MutableLiveData(setOf(fromPermissionString(READ_STEPS)))
+            MutableLiveData(setOf(FitnessPermission.fromPermissionString(READ_STEPS)))
         }
-
+        whenever(viewModel.allFitnessPermissionsGranted).then { MutableLiveData(false) }
+        val permissions = arrayOf(READ_STEPS, WRITE_DISTANCE)
         val startActivityIntent = getPermissionScreenIntent(permissions)
-
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        scenario.onActivity { activity ->
-            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-        }
+
         Espresso.onIdle()
         onView(withText("Health Connect restore in progress"))
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Health Connect is restoring data and permissions. This may take some time to complete."))
+                    "Health Connect is restoring data and permissions. This may take some time to complete."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -840,12 +700,13 @@
     }
 
     @Test
-    fun intent_migrationPending_showsMigrationPendingDialog() {
+    fun whenMigrationPending_showsMigrationPendingDialog() {
         whenever(migrationViewModel.getCurrentMigrationUiState()).then {
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.APP_UPGRADE_REQUIRED,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -853,26 +714,41 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.APP_UPGRADE_REQUIRED,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
-        val permissions = arrayOf(READ_STEPS, READ_HEART_RATE, WRITE_DISTANCE, WRITE_EXERCISE)
-        whenever(viewModel.healthPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+        whenever(viewModel.permissionsActivityState).then {
+            MutableLiveData(PermissionsActivityState.ShowFitness)
         }
-        whenever(viewModel.fitnessPermissionsList).then {
-            MutableLiveData(permissions.toPermissionsList())
+        whenever(viewModel.fitnessScreenState).then {
+            MutableLiveData(
+                FitnessScreenState.ShowFitnessReadWrite(
+                    hasMedical = true,
+                    appMetadata = appMetadata,
+                    fitnessPermissions =
+                        listOf(READ_STEPS, WRITE_DISTANCE).map {
+                            fromPermissionString(it) as FitnessPermission
+                        },
+                    historyGranted = false,
+                )
+            )
         }
         whenever(viewModel.grantedFitnessPermissions).then {
-            MutableLiveData(setOf(fromPermissionString(READ_STEPS)))
+            MutableLiveData(setOf(FitnessPermission.fromPermissionString(READ_STEPS)))
         }
-
+        whenever(viewModel.allFitnessPermissionsGranted).then { MutableLiveData(false) }
+        val permissions = arrayOf(READ_STEPS, WRITE_DISTANCE)
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
         launchActivityForResult<PermissionsActivity>(startActivityIntent)
 
         onView(
                 withText(
-                    "Health Connect is ready to be integrated with your Android system. If you give $TEST_APP_NAME access now, some features may not work until integration is complete."))
+                    "Health Connect is ready to be integrated with your Android system. If you give $TEST_APP_NAME access now, some features may not work until integration is complete."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         // TODO (b/322495982) check navigation to Migration activity
@@ -895,10 +771,6 @@
         Intent.makeMainActivity(ComponentName(context, PermissionsActivity::class.java))
             .putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES, permissions)
             .putExtra(Intent.EXTRA_PACKAGE_NAME, TEST_APP_PACKAGE_NAME)
-            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
-
-    private fun Array<String>.toPermissionsList(): List<HealthPermission> {
-        return this.map { fromPermissionString(it) }.toList()
-    }
+            .addFlags(FLAG_ACTIVITY_NEW_TASK)
+            .addFlags(FLAG_ACTIVITY_CLEAR_TASK)
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/PermissionsActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/PermissionsActivityTest.kt
index 80e7d41..55347b6 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/PermissionsActivityTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/PermissionsActivityTest.kt
@@ -26,21 +26,27 @@
 import android.content.Intent.EXTRA_PACKAGE_NAME
 import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
 import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
-import android.content.pm.PackageManager
+import android.content.pm.ActivityInfo
 import android.content.pm.PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES
 import android.content.pm.PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS
+import android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED
 import android.content.pm.PackageManager.PERMISSION_DENIED
 import android.content.pm.PackageManager.PERMISSION_GRANTED
 import android.health.connect.HealthPermissions.READ_EXERCISE
 import android.health.connect.HealthPermissions.READ_HEALTH_DATA_HISTORY
 import android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND
-import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION
-import android.health.connect.HealthPermissions.READ_SKIN_TEMPERATURE
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_CONDITIONS
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES
 import android.health.connect.HealthPermissions.READ_SLEEP
 import android.health.connect.HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED
+import android.health.connect.HealthPermissions.WRITE_EXERCISE
 import android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA
 import android.health.connect.HealthPermissions.WRITE_SKIN_TEMPERATURE
 import android.health.connect.HealthPermissions.WRITE_SLEEP
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import android.widget.Button
 import androidx.lifecycle.MutableLiveData
 import androidx.recyclerview.widget.RecyclerView
@@ -48,6 +54,7 @@
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.Espresso.onView
 import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.action.ViewActions.scrollTo
 import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.contrib.RecyclerViewActions.scrollToLastPosition
@@ -62,7 +69,6 @@
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.DataRestoreUiError
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.DataRestoreUiState
 import com.android.healthconnect.controller.migration.api.MigrationRestoreState.MigrationUiState
-import com.android.healthconnect.controller.navigation.TrampolineActivity
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
 import com.android.healthconnect.controller.permissions.api.LoadAccessDateUseCase
 import com.android.healthconnect.controller.permissions.request.PermissionsActivity
@@ -72,32 +78,27 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.UNSUPPORTED_TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.di.FakeDeviceInfoUtils
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
 import com.android.healthconnect.controller.tests.utils.di.FakeHealthPermissionManager
 import com.android.healthconnect.controller.tests.utils.showOnboarding
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.DeviceInfoUtils
 import com.android.healthconnect.controller.utils.DeviceInfoUtilsModule
-import com.android.healthconnect.controller.utils.FeatureUtils
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import dagger.hilt.android.testing.UninstallModules
-import javax.inject.Inject
-import kotlinx.coroutines.test.runTest
 import org.junit.After
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito.any
 import org.mockito.Mockito.mock
+import org.mockito.kotlin.whenever
 
-@UninstallModules(
-    HealthPermissionManagerModule::class,
-    DeviceInfoUtilsModule::class,
-)
+@UninstallModules(HealthPermissionManagerModule::class, DeviceInfoUtilsModule::class)
 @HiltAndroidTest
 class PermissionsActivityTest {
 
@@ -105,25 +106,25 @@
         private val fitnessPermissions =
             arrayOf(READ_EXERCISE, READ_SLEEP, WRITE_SKIN_TEMPERATURE, WRITE_ACTIVE_CALORIES_BURNED)
         private val fitnessAndMedicalPermissions =
-            arrayOf(READ_EXERCISE, READ_MEDICAL_DATA_IMMUNIZATION)
+            arrayOf(READ_EXERCISE, READ_MEDICAL_DATA_VACCINES)
         private val fitnessAndAdditionalPermissions =
             arrayOf(WRITE_SLEEP, READ_HEALTH_DATA_IN_BACKGROUND)
         private val medicalPermissions =
-            arrayOf(READ_MEDICAL_DATA_IMMUNIZATION, WRITE_MEDICAL_DATA)
+            arrayOf(READ_MEDICAL_DATA_VACCINES, WRITE_MEDICAL_DATA)
         private val medicalAndAdditionalPermissions =
-            arrayOf(READ_MEDICAL_DATA_IMMUNIZATION, READ_HEALTH_DATA_IN_BACKGROUND)
+            arrayOf(READ_MEDICAL_DATA_VACCINES, READ_HEALTH_DATA_IN_BACKGROUND)
         private val allThreeCombined =
-            arrayOf(READ_HEALTH_DATA_IN_BACKGROUND, READ_SLEEP, READ_MEDICAL_DATA_IMMUNIZATION)
+            arrayOf(READ_HEALTH_DATA_IN_BACKGROUND, READ_SLEEP, READ_MEDICAL_DATA_VACCINES)
     }
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
 
     @BindValue val permissionManager: HealthPermissionManager = FakeHealthPermissionManager()
     @BindValue val deviceInfoUtils: DeviceInfoUtils = FakeDeviceInfoUtils()
     @BindValue val migrationViewModel: MigrationViewModel = mock(MigrationViewModel::class.java)
     @BindValue
     val loadAccessDateUseCase: LoadAccessDateUseCase = mock(LoadAccessDateUseCase::class.java)
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
 
     private lateinit var context: Context
 
@@ -138,37 +139,24 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         whenever(loadAccessDateUseCase.invoke(any())).thenReturn(NOW)
         showOnboarding(context, false)
         toggleAnimation(false)
         (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf())
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(false)
+            TEST_APP_PACKAGE_NAME,
+            listOf(),
+        )
     }
 
     @After
     fun tearDown() {
         toggleAnimation(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(false)
-    }
-
-    @Test
-    fun healthConnectNotAvailable_finishesActivity() {
-        (deviceInfoUtils as FakeDeviceInfoUtils).setHealthConnectAvailable(false)
-
-        val scenario =
-            launchActivityForResult<TrampolineActivity>(
-                getPermissionScreenIntent(fitnessPermissions))
-
-        assertThat(scenario.result.resultCode).isEqualTo(RESULT_CANCELED)
+        (permissionManager as FakeHealthPermissionManager).reset()
     }
 
     @Test
@@ -186,7 +174,7 @@
     }
 
     @Test
-    fun intentSkipsUnrecognisedPermission() {
+    fun intentSkipsUnrecognisedPermission_excludesItFromResponse() {
         val permissions = arrayOf(READ_EXERCISE, WRITE_SLEEP, "permission")
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
@@ -213,10 +201,13 @@
     }
 
     @Test
-    fun intentSkipsGrantedPermissions() {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun phrFlagOn_intentSkipsGrantedPermissions_includesItInResponse() {
         val startActivityIntent = getPermissionScreenIntent(fitnessPermissions)
         (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE))
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE),
+        )
 
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
         onView(withId(androidx.preference.R.id.recycler_view))
@@ -244,318 +235,23 @@
     }
 
     @Test
-    fun intentSkipsHiddenFitnessPermissions() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(false)
-        val permissions =
-            arrayOf(READ_EXERCISE, READ_SLEEP, READ_SKIN_TEMPERATURE, WRITE_ACTIVE_CALORIES_BURNED)
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        onView(withId(androidx.preference.R.id.recycler_view))
-            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
-        Espresso.onIdle()
-
-        onView(withText("Exercise")).check(matches(isDisplayed()))
-        onView(withText("Sleep")).check(matches(isDisplayed()))
-        onView(withText("Skin temperature")).check(doesNotExist())
-        onView(withText("Active calories burned")).check(matches(isDisplayed()))
-
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(arrayOf(READ_EXERCISE, READ_SLEEP, WRITE_ACTIVE_CALORIES_BURNED))
-        val expectedResults = intArrayOf(PERMISSION_DENIED, PERMISSION_DENIED, PERMISSION_DENIED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
-    }
-
-    @Test
-    fun intentSkipsHiddenAdditionalPermissions() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(false)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE))
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES)).isEmpty()
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS)).isEmpty()
-    }
-
-    @Test
-    fun intentSkipsHiddenMedicalPermissions() {
-        val startActivityIntent = getPermissionScreenIntent(medicalPermissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES)).isEmpty()
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS)).isEmpty()
-    }
-
-    @Test
-    fun emptyRequest_sendsEmptyResultOk() {
-        val startActivityIntent = getPermissionScreenIntent(emptyArray())
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES)).isEmpty()
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS)).isEmpty()
-    }
-
-    @Test
-    fun intentDisplaysFitnessPermissions() {
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun phrFlagOff_intentSkipsGrantedPermissions_includesItInResponse() {
         val startActivityIntent = getPermissionScreenIntent(fitnessPermissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE),
+        )
 
-        launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
-            .check(matches(isDisplayed()))
-        onView(withText("Choose data you want this app to read or write to Health Connect"))
-            .check(matches(isDisplayed()))
-        onView(
-                withText(
-                    "If you give read access, the app can read new data and data from the past 30 days"))
-            .check(matches(isDisplayed()))
-        onView(
-                withText(
-                    "You can learn how $TEST_APP_NAME handles your data in the developer's privacy policy"))
-            .check(matches(isDisplayed()))
-
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
         Espresso.onIdle()
 
-        onView(withText("Exercise")).check(matches(isDisplayed()))
+        onView(withText("Exercise")).check(doesNotExist())
         onView(withText("Sleep")).check(matches(isDisplayed()))
         onView(withText("Active calories burned")).check(matches(isDisplayed()))
-
-        onView(withText("Allow")).check(matches(isDisplayed()))
-        onView(withText("Don't allow")).check(matches(isDisplayed()))
-    }
-
-    @Test
-    fun intentDisplaysAdditionalPermissions() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE, READ_SLEEP))
-
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Allow additional access for $TEST_APP_NAME?"))
-            .check(matches(isDisplayed()))
-        onView(withText("Access data in the background")).check(matches(isDisplayed()))
-        onView(withText("Access past data")).check(matches(isDisplayed()))
-        onView(withText("Allow")).check(matches(isDisplayed()))
-        onView(withText("Don't allow")).check(matches(isDisplayed()))
-    }
-
-    @Test
-    fun intentDisplaysBackgroundReadPermission() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE, READ_SLEEP))
-
-        val permissions = arrayOf(READ_HEALTH_DATA_IN_BACKGROUND)
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
-            .check(matches(isDisplayed()))
-        onView(
-                withText(
-                    "If you allow, this app can access Health Connect data when you're not using the app."))
-            .check(matches(isDisplayed()))
-        onView(withText("Allow")).check(matches(isDisplayed()))
-        onView(withText("Don't allow")).check(matches(isDisplayed()))
-    }
-
-    @Test
-    fun intentDisplaysHistoryReadPermission() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE, READ_SLEEP))
-
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY)
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
-        onView(
-                withText(
-                    "If you allow, this app can access Health Connect data added before October 20, 2022."))
-            .check(matches(isDisplayed()))
-        onView(withText("Allow")).check(matches(isDisplayed()))
-        onView(withText("Don't allow")).check(matches(isDisplayed()))
-    }
-
-    @Test
-    fun requestFitnessPermissions_alreadyGrantedRestDenied_sendsResultOk() {
-        val startActivityIntent = getPermissionScreenIntent(fitnessPermissions)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(true)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE, READ_SLEEP))
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(fitnessPermissions)
-        val expectedResults =
-            intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_DENIED, PERMISSION_DENIED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
-    }
-
-    @Test
-    fun whenReadPermissionsAlreadyGranted_requestAdditionalPermissions_sendsResultOk() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE, READ_SLEEP))
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Access data in the background")).check(matches(isDisplayed()))
-        onView(withText("Access data in the background")).perform(click())
-
-        onView(withText("Access past data")).check(matches(isDisplayed()))
-        onView(withText("Access past data")).perform(click())
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
-    }
-
-    @Test
-    fun requestOneAdditionalPermission_clickOnDontAllow_deniesPermission() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY))
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
-            .check(matches(isDisplayed()))
-
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.dont_allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_DENIED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
-    }
-
-    @Test
-    fun requestOneAdditionalPermission_clickOnAllow_grantsPermission() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY))
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
-            .check(matches(isDisplayed()))
-
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
-    }
-
-    @Test
-    fun whenReadPermissionsNotAlreadyGranted_requestAdditionalPermissions_sendsResultCancelled() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf())
-
-        val startActivityIntent = getPermissionScreenIntent(permissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_CANCELED)
-        val returnedIntent = scenario.result.resultData
-
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(permissions)
-        val expectedResults = intArrayOf(PERMISSION_DENIED, PERMISSION_DENIED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
-    }
-
-    @Test
-    fun grantOneFitnessPermission_sendsResultOk() {
-        val startActivityIntent = getPermissionScreenIntent(fitnessPermissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        onView(withId(androidx.preference.R.id.recycler_view))
-            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
-        Espresso.onIdle()
-
-        onView(withText("Exercise")).check(matches(isDisplayed()))
-        onView(withText("Exercise")).perform(click())
+        onView(withText("Skin temperature")).check(matches(isDisplayed()))
 
         scenario.onActivity { activity: PermissionsActivity ->
             activity.findViewById<Button>(R.id.allow).callOnClick()
@@ -573,243 +269,801 @@
     }
 
     @Test
-    fun grantOneMedicalPermission_sendsResultOk() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun intentSkipsHiddenMedicalPermissions() {
         val startActivityIntent = getPermissionScreenIntent(medicalPermissions)
 
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        onView(withId(androidx.preference.R.id.recycler_view))
-            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
-        Espresso.onIdle()
 
-        onView(withText("Immunization")).check(matches(isDisplayed()))
-        onView(withText("Immunization")).perform(click())
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES)).isEmpty()
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS)).isEmpty()
+    }
 
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun phrFlagOn_requestAlreadyGrantedPermissions_sendsEmptyResultOk_doesNotModifyPermissions() {
+        val startActivityIntent = getPermissionScreenIntent(fitnessPermissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            fitnessPermissions.toList(),
+        )
+
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
 
         assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
         val returnedIntent = scenario.result.resultData
 
         assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(medicalPermissions)
+            .isEqualTo(fitnessPermissions)
+        val expectedResults =
+            intArrayOf(
+                PERMISSION_GRANTED,
+                PERMISSION_GRANTED,
+                PERMISSION_GRANTED,
+                PERMISSION_GRANTED,
+            )
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.revokeHealthPermissionInvocations).isEqualTo(0)
+        assertThat(permissionManager.grantHealthPermissionInvocations).isEqualTo(0)
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun phrFlagOff_requestAlreadyGrantedPermissions_sendsEmptyResultOk_doesNotModifyPermissions() {
+        val startActivityIntent = getPermissionScreenIntent(fitnessPermissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            fitnessPermissions.toList(),
+        )
+
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(fitnessPermissions)
+        val expectedResults =
+            intArrayOf(
+                PERMISSION_GRANTED,
+                PERMISSION_GRANTED,
+                PERMISSION_GRANTED,
+                PERMISSION_GRANTED,
+            )
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.revokeHealthPermissionInvocations).isEqualTo(0)
+        assertThat(permissionManager.grantHealthPermissionInvocations).isEqualTo(0)
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestOnlyWriteMedicalPermission_clickOnAllow_sendsResultOk() {
+        val permissions = arrayOf(READ_MEDICAL_DATA_VACCINES, WRITE_MEDICAL_DATA)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_MEDICAL_DATA_VACCINES),
+        )
+
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        // Only medical write needs granting
+        onView(
+                withText(
+                    "If you allow, $TEST_APP_NAME can share your health records with Health Connect."
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withText("Allow")).perform(click())
+
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
+        val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(listOf(READ_MEDICAL_DATA_VACCINES, WRITE_MEDICAL_DATA))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestOnlyWriteMedicalPermission_clickOnDontAllow_sendsResultOk() {
+        val permissions = arrayOf(READ_MEDICAL_DATA_VACCINES, WRITE_MEDICAL_DATA)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_MEDICAL_DATA_VACCINES),
+        )
+
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        // Only medical write needs granting
+        onView(
+                withText(
+                    "If you allow, $TEST_APP_NAME can share your health records with Health Connect."
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withText("Don't allow")).perform(click())
+
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
         val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_DENIED)
         assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
             .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(listOf(READ_MEDICAL_DATA_VACCINES))
     }
 
     @Test
-    fun requestMedicalAndFitnessPermissions_flagDisabled_onlyShowFitness() {
-        val startActivityIntent = getPermissionScreenIntent(fitnessAndMedicalPermissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        onView(withId(androidx.preference.R.id.recycler_view))
-            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
-
-        Espresso.onIdle()
-        onView(withText("Exercise")).check(matches(isDisplayed()))
-        onView(withText("Exercise")).perform(click())
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(arrayOf(READ_EXERCISE))
-        val expectedResults = intArrayOf(PERMISSION_GRANTED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
-    }
-
-    @Test
-    fun requestMedicalAndAdditionalPermissions_showBoth() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-        val startActivityIntent = getPermissionScreenIntent(medicalAndAdditionalPermissions)
-
-        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        onView(withId(androidx.preference.R.id.recycler_view))
-            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
-        Espresso.onIdle()
-
-        onView(withText("Immunization")).check(matches(isDisplayed()))
-        onView(withText("Immunization")).perform(click())
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-        Espresso.onIdle()
-        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
-            .check(matches(isDisplayed()))
-        onView(withText("Allow")).perform(click())
-
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(medicalAndAdditionalPermissions)
-        val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
-    }
-
-    @Test
-    fun requestMedicalAndAdditionalPermissions_backgroundAndHistory_showBoth() {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalPermissions_someGrantedSomeDenied_clickOnAllow_includesAllInResponse() {
         val permissions =
             arrayOf(
-                READ_MEDICAL_DATA_IMMUNIZATION,
-                READ_HEALTH_DATA_IN_BACKGROUND,
-                READ_HEALTH_DATA_HISTORY)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
+                READ_MEDICAL_DATA_CONDITIONS,
+                READ_MEDICAL_DATA_VACCINES,
+                WRITE_MEDICAL_DATA,
+            )
         val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_MEDICAL_DATA_VACCINES),
+        )
 
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
-        Espresso.onIdle()
-
-        onView(withText("Immunization")).check(matches(isDisplayed()))
-        onView(withText("Immunization")).perform(click())
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-        Espresso.onIdle()
-        onView(withText("Access data in the background")).perform(click())
+        onView(withText("Conditions")).perform(click())
         onView(withText("Allow")).perform(click())
 
         assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
         val returnedIntent = scenario.result.resultData
+
         assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
             .isEqualTo(permissions)
         val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_DENIED)
         assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
             .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(
+                listOf(READ_MEDICAL_DATA_VACCINES, READ_MEDICAL_DATA_CONDITIONS)
+            )
     }
 
     @Test
-    fun requestDataTypeAndAdditionalPermissions_showBothScreens() {
-        val startActivityIntent = getPermissionScreenIntent(fitnessAndAdditionalPermissions)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalPermissions_someGrantedSomeDenied_clickOnDontAllow_includesAllInResponse() {
+        val permissions =
+            arrayOf(
+                READ_MEDICAL_DATA_CONDITIONS,
+                READ_MEDICAL_DATA_VACCINES,
+                WRITE_MEDICAL_DATA,
+            )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_MEDICAL_DATA_VACCINES),
+        )
 
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        // This should not be granted even if we toggled it on
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Conditions")).perform(click())
+        onView(withText("Don't allow")).perform(click())
+
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
+        val expectedResults = intArrayOf(PERMISSION_DENIED, PERMISSION_GRANTED, PERMISSION_DENIED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(listOf(READ_MEDICAL_DATA_VACCINES))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalAndFitness_clickOnAllow_grantsMedical_showsFitness() {
+        val permissions =
+            arrayOf(
+                READ_MEDICAL_DATA_CONDITIONS,
+                READ_MEDICAL_DATA_VACCINES,
+                READ_SLEEP,
+                WRITE_EXERCISE,
+                WRITE_MEDICAL_DATA,
+            )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_MEDICAL_DATA_VACCINES),
+        )
+
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Conditions")).perform(click())
+        onView(withText("Allow")).perform(click())
+
         Espresso.onIdle()
 
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
         onView(withText("Sleep")).check(matches(isDisplayed()))
-        onView(withText("Sleep")).perform(click())
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
+
+        assertThat(permissionManager.revokeHealthPermissionInvocations).isEqualTo(1)
+        assertThat(permissionManager.grantHealthPermissionInvocations).isEqualTo(2)
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(
+                listOf(READ_MEDICAL_DATA_VACCINES, READ_MEDICAL_DATA_CONDITIONS)
+            )
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalAndFitness_clickOnDontAllow_revokesMedical_showsFitness() {
+        val permissions =
+            arrayOf(
+                READ_MEDICAL_DATA_CONDITIONS,
+                READ_MEDICAL_DATA_VACCINES,
+                READ_SLEEP,
+                WRITE_EXERCISE,
+                WRITE_MEDICAL_DATA,
+            )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_MEDICAL_DATA_VACCINES),
+        )
+
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        // This should not be granted even if we toggled it on
+        onView(withText("Conditions")).perform(click())
+        onView(withText("Don't allow")).perform(click())
+
         Espresso.onIdle()
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Sleep")).check(matches(isDisplayed()))
+
+        assertThat(permissionManager.revokeHealthPermissionInvocations).isEqualTo(2)
+        assertThat(permissionManager.grantHealthPermissionInvocations).isEqualTo(1)
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(listOf(READ_MEDICAL_DATA_VACCINES))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalAndBackground_clickOnAllow_showsBackground() {
+        val permissions =
+            arrayOf(
+                READ_MEDICAL_DATA_CONDITIONS,
+                READ_MEDICAL_DATA_VACCINES,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                WRITE_MEDICAL_DATA,
+            )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_MEDICAL_DATA_VACCINES),
+        )
+
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        // This should not be granted even if we toggled it on
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Conditions")).perform(click())
+        onView(withText("Allow")).perform(click())
+
+        Espresso.onIdle()
+
         onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
             .check(matches(isDisplayed()))
-        onView(withText("Allow")).perform(click())
 
-        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val returnedIntent = scenario.result.resultData
-        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(fitnessAndAdditionalPermissions)
-        val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED)
-        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
-            .isEqualTo(expectedResults)
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(
+                listOf(READ_MEDICAL_DATA_VACCINES, READ_MEDICAL_DATA_CONDITIONS)
+            )
     }
 
     @Test
-    fun requestDataTypeAndAdditionalPermissions_backgroundAndHistory_showBothScreens() {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalAndBackground_clickOnDontAllow_doesNotShowBackground() {
         val permissions =
-            arrayOf(WRITE_SLEEP, READ_HEALTH_DATA_IN_BACKGROUND, READ_HEALTH_DATA_HISTORY)
+            arrayOf(
+                READ_MEDICAL_DATA_CONDITIONS,
+                READ_MEDICAL_DATA_VACCINES,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                WRITE_MEDICAL_DATA,
+            )
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        // This should not be granted even if we toggled it on
         onView(withId(androidx.preference.R.id.recycler_view))
             .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
-        Espresso.onIdle()
+        onView(withText("Conditions")).perform(click())
+        onView(withText("Don't allow")).perform(click())
 
-        onView(withText("Sleep")).check(matches(isDisplayed()))
-        onView(withText("Sleep")).perform(click())
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.allow).callOnClick()
-        }
-        Espresso.onIdle()
-        onView(withText("Access data in the background")).perform(click())
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
+        val expectedResults =
+            intArrayOf(PERMISSION_DENIED, PERMISSION_DENIED, PERMISSION_DENIED, PERMISSION_DENIED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME)).isEmpty()
+    }
+
+    @Test
+    fun requestFitnessPermissions_someGrantedSomeDenied_clickOnAllow_includesAllInResponse() {
+        val permissions =
+            arrayOf(READ_EXERCISE, READ_SLEEP, WRITE_ACTIVE_CALORIES_BURNED, WRITE_SLEEP)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_SLEEP),
+        )
+
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Exercise")).perform(click())
         onView(withText("Allow")).perform(click())
 
         assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
         val returnedIntent = scenario.result.resultData
+
         assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
             .isEqualTo(permissions)
-        val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_DENIED)
+        val expectedResults =
+            intArrayOf(PERMISSION_GRANTED, PERMISSION_GRANTED, PERMISSION_DENIED, PERMISSION_DENIED)
         assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
             .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(listOf(READ_EXERCISE, READ_SLEEP))
     }
 
     @Test
-    fun clickOnCancel_deniesAllFitnessPermissions_finishesActivity() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-        val permissions = arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY)
+    fun requestFitnessPermissions_someGrantedSomeDenied_clickOnDontAllow_includesAllInResponse() {
+        val permissions =
+            arrayOf(READ_EXERCISE, READ_SLEEP, WRITE_ACTIVE_CALORIES_BURNED, WRITE_SLEEP)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_SLEEP),
+        )
+
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        // This should not be granted even if it's toggled on
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Exercise")).perform(click())
+        onView(withText("Don't allow")).perform(click())
+
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
+        val expectedResults =
+            intArrayOf(PERMISSION_DENIED, PERMISSION_GRANTED, PERMISSION_DENIED, PERMISSION_DENIED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(listOf(READ_SLEEP))
+    }
+
+    @Test
+    fun requestFitnessAndAdditional_clickOnAllow_showsAdditional() {
+        val permissions =
+            arrayOf(
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                WRITE_ACTIVE_CALORIES_BURNED,
+                WRITE_SLEEP,
+            )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_SLEEP),
+        )
+
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Exercise")).perform(click())
+        onView(withText("Allow")).perform(click())
+
+        Espresso.onIdle()
+
+        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(listOf(READ_SLEEP, READ_EXERCISE))
+    }
+
+    @Test
+    fun requestFitnessAndAdditional_someReadGranted_clickOnDontAllow_showsAdditional() {
+        val permissions =
+            arrayOf(
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                WRITE_ACTIVE_CALORIES_BURNED,
+                WRITE_SLEEP,
+            )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_SLEEP),
+        )
+
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        // This should not be granted even if it's toggled on
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Exercise")).perform(click())
+        onView(withText("Don't allow")).perform(click())
+
+        Espresso.onIdle()
+
+        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(listOf(READ_SLEEP))
+    }
+
+    @Test
+    fun requestFitnessAndAdditional_noReadGranted_clickOnDontAllow_doesNotShowAdditional() {
+        val permissions =
+            arrayOf(
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                WRITE_ACTIVE_CALORIES_BURNED,
+                WRITE_SLEEP,
+            )
         val startActivityIntent = getPermissionScreenIntent(permissions)
 
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.dont_allow).callOnClick()
-        }
+
+        // This should not be granted even if it's toggled on
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        onView(withText("Exercise")).perform(click())
+        onView(withText("Don't allow")).perform(click())
 
         assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
         val returnedIntent = scenario.result.resultData
 
         assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
             .isEqualTo(permissions)
-        val expectedResults = intArrayOf(PERMISSION_DENIED, PERMISSION_DENIED, PERMISSION_DENIED)
+        val expectedResults =
+            intArrayOf(
+                PERMISSION_DENIED,
+                PERMISSION_DENIED,
+                PERMISSION_DENIED,
+                PERMISSION_DENIED,
+                PERMISSION_DENIED,
+            )
         assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
             .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME)).isEmpty()
     }
 
     @Test
-    fun clickOnCancel_deniesAllMedicalPermissions_finishesActivity() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-        val startActivityIntent = getPermissionScreenIntent(medicalPermissions)
+    fun requestAdditional_noReadGranted_doesNotShowAdditional() {
+        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
 
         val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
-        scenario.onActivity { activity: PermissionsActivity ->
-            activity.findViewById<Button>(R.id.dont_allow).callOnClick()
-        }
 
         assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
         val returnedIntent = scenario.result.resultData
 
         assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(medicalPermissions)
+            .isEqualTo(permissions)
         val expectedResults = intArrayOf(PERMISSION_DENIED, PERMISSION_DENIED)
         assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
             .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME)).isEmpty()
     }
 
     @Test
-    fun whenOnePermissionUserFixed_finishesActivity_sendsResultOk() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(true)
-        val startActivityIntent = getPermissionScreenIntent(fitnessPermissions)
+    fun requestAdditional_readAndHistoryGranted_showsBackgroundRequest() {
+        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
         (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE))
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_HEALTH_DATA_HISTORY, READ_SLEEP),
+        )
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
 
-        val permissionFlags =
-            mapOf(
-                READ_EXERCISE to PERMISSION_GRANTED,
-                READ_SLEEP to PERMISSION_DENIED,
-                WRITE_SKIN_TEMPERATURE to PackageManager.FLAG_PERMISSION_USER_FIXED,
-                WRITE_ACTIVE_CALORIES_BURNED to PERMISSION_DENIED)
-        permissionManager.setHealthPermissionFlags(TEST_APP_PACKAGE_NAME, permissionFlags)
+        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
+            .check(matches(isDisplayed()))
+    }
 
-        val firstScenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+    @Test
+    fun requestAdditional_readAndBackgroundGranted_showsHistoryRequest() {
+        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_HEALTH_DATA_IN_BACKGROUND, READ_SLEEP),
+        )
+        launchActivityForResult<PermissionsActivity>(startActivityIntent)
 
-        assertThat(firstScenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val firstReturnedIntent = firstScenario.result.resultData
+        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
+    }
 
-        assertThat(firstReturnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
-            .isEqualTo(fitnessPermissions)
-        assertThat(firstReturnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestAdditional_clickOnAllow_includesAllInResponse() {
+        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_SLEEP),
+        )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        onView(withText("Access past fitness and wellness data")).perform(click())
+        onView(withText("Allow")).perform(click())
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
+        val expectedResults = intArrayOf(PERMISSION_GRANTED, PERMISSION_DENIED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(arrayOf(READ_SLEEP, READ_HEALTH_DATA_HISTORY))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestAdditional_clickOnDontAllow_includesAllInResponse() {
+        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_SLEEP),
+        )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        // This should not be granted even if it's toggled on
+        onView(withText("Access past fitness and wellness data")).perform(click())
+        onView(withText("Don't allow")).perform(click())
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
+        val expectedResults = intArrayOf(PERMISSION_DENIED, PERMISSION_DENIED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(arrayOf(READ_SLEEP))
+    }
+
+    @Test
+    fun requestOneAdditional_clickOnAllow_includesAllInResponse() {
+        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_SLEEP),
+        )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
+        onView(withText("Allow")).perform(click())
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
+        val expectedResults = intArrayOf(PERMISSION_GRANTED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(arrayOf(READ_HEALTH_DATA_HISTORY, READ_SLEEP))
+    }
+
+    @Test
+    fun requestOneAdditional_clickOnDontAllow_includesAllInResponse() {
+        val permissions = arrayOf(READ_HEALTH_DATA_IN_BACKGROUND)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_SLEEP),
+        )
+        val startActivityIntent = getPermissionScreenIntent(permissions)
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+
+        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
+            .check(matches(isDisplayed()))
+        onView(withText("Don't allow")).perform(click())
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(permissions)
+        val expectedResults = intArrayOf(PERMISSION_DENIED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactlyElementsIn(arrayOf(READ_SLEEP))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    @Ignore("b/363994647 - flaky rotation test")
+    fun requestFitnessAndAdditionalPermissions_userFixSomeFitness_onRotate_showsAdditional() {
+        val startActivityIntent =
+            getPermissionScreenIntent(
+                arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_IN_BACKGROUND)
+            )
+        permissionManager.revokeHealthPermission(TEST_APP_PACKAGE_NAME, READ_EXERCISE)
+        permissionManager.revokeHealthPermission(TEST_APP_PACKAGE_NAME, READ_SLEEP)
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        Espresso.onIdle()
+
+        onView(withText("Sleep")).perform(click())
+        onView(withText("Allow")).perform(click())
+        Espresso.onIdle()
+        // At this point, READ_EXERCISE should be USER_FIXED
+        assertThat(
+                permissionManager
+                    .getHealthPermissionsFlags(TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE))[
+                        READ_EXERCISE]
+            )
+            .isEqualTo(FLAG_PERMISSION_USER_FIXED)
+
+        scenario.onActivity { activity ->
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+        }
+        // The fragment should have checked for the USER_FIXED permission but not end the activity
+        // because we are in a flow
+        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
+            .check(matches(isDisplayed()))
+        scenario.onActivity { activity ->
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+        }
+        onView(withText("Allow")).perform(click())
+
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
+            .isEqualTo(arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_IN_BACKGROUND))
+        val expectedResults = intArrayOf(PERMISSION_DENIED, PERMISSION_GRANTED, PERMISSION_GRANTED)
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    @Ignore("b/363994647 - flaky rotation test")
+    fun requestMedicalAndFitnessPermissions_userFixSomeMedical_onRotate_showsFitness() {
+        val startActivityIntent =
+            getPermissionScreenIntent(
+                arrayOf(
+                    READ_MEDICAL_DATA_VACCINES,
+                    READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                    READ_EXERCISE,
+                    WRITE_SLEEP,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                )
+            )
+        permissionManager.revokeHealthPermission(
+            TEST_APP_PACKAGE_NAME,
+            READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+        )
+        permissionManager.revokeHealthPermission(TEST_APP_PACKAGE_NAME, WRITE_SLEEP)
+        val scenario = launchActivityForResult<PermissionsActivity>(startActivityIntent)
+        onView(withId(androidx.preference.R.id.recycler_view))
+            .perform(scrollToLastPosition<RecyclerView.ViewHolder>())
+        Espresso.onIdle()
+
+        onView(withText("Immunizations")).check(matches(isDisplayed()))
+        onView(withText("Immunizations")).perform(click())
+        scenario.onActivity { activity: PermissionsActivity ->
+            activity.findViewById<Button>(R.id.allow).callOnClick()
+        }
+        Espresso.onIdle()
+        // At this point, READ_MEDICAL_DATA_ALLERGY_INTOLERANCE should be USER_FIXED
+        assertThat(
+                permissionManager
+                    .getHealthPermissionsFlags(
+                        TEST_APP_PACKAGE_NAME,
+                        listOf(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES),
+                    )[READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES]
+            )
+            .isEqualTo(FLAG_PERMISSION_USER_FIXED)
+
+        scenario.onActivity { activity ->
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+        }
+        Espresso.onIdle()
+
+        // The fragment should have checked for the USER_FIXED permission but not end the activity
+        // because we are in a flow
+        onView(withText("Allow $TEST_APP_NAME to access Health Connect?"))
+            .check(matches(isDisplayed()))
+        scenario.onActivity { activity ->
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+        }
+        onView(withText("Exercise")).perform(scrollTo()).check(matches(isDisplayed()))
+        onView(withText("Exercise")).perform(click())
+        onView(withText("Allow")).perform(click())
+
+        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
+            .check(matches(isDisplayed()))
+
+        Espresso.onIdle()
+        onView(withText("Allow")).perform(click())
+
+        assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_OK)
+        val returnedIntent = scenario.result.resultData
+        assertThat(returnedIntent.getStringArrayExtra(EXTRA_REQUEST_PERMISSIONS_NAMES))
             .isEqualTo(
-                intArrayOf(
-                    PERMISSION_GRANTED, PERMISSION_DENIED, PERMISSION_DENIED, PERMISSION_DENIED))
+                arrayOf(
+                    READ_MEDICAL_DATA_VACCINES,
+                    READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                    READ_EXERCISE,
+                    WRITE_SLEEP,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                )
+            )
+        val expectedResults =
+            intArrayOf(
+                PERMISSION_GRANTED,
+                PERMISSION_DENIED,
+                PERMISSION_GRANTED,
+                PERMISSION_DENIED,
+                PERMISSION_GRANTED,
+            )
+        assertThat(returnedIntent.getIntArrayExtra(EXTRA_REQUEST_PERMISSIONS_RESULTS))
+            .isEqualTo(expectedResults)
     }
 
     private fun getPermissionScreenIntent(permissions: Array<String>): Intent =
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/RequestPermissionViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/RequestPermissionViewModelTest.kt
index 62614de..8672d1d 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/RequestPermissionViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/RequestPermissionViewModelTest.kt
@@ -22,41 +22,49 @@
 import android.health.connect.HealthPermissions.READ_HEALTH_DATA_HISTORY
 import android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND
 import android.health.connect.HealthPermissions.READ_HEART_RATE
-import android.health.connect.HealthPermissions.READ_PLANNED_EXERCISE
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
+import android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES
 import android.health.connect.HealthPermissions.READ_SKIN_TEMPERATURE
 import android.health.connect.HealthPermissions.READ_SLEEP
 import android.health.connect.HealthPermissions.READ_STEPS
 import android.health.connect.HealthPermissions.WRITE_DISTANCE
 import android.health.connect.HealthPermissions.WRITE_EXERCISE
+import android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA
 import android.health.connect.HealthPermissions.WRITE_PLANNED_EXERCISE
 import android.health.connect.HealthPermissions.WRITE_SKIN_TEMPERATURE
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.healthconnect.controller.permissions.additionalaccess.LoadDeclaredHealthPermissionUseCase
 import com.android.healthconnect.controller.permissions.api.GetGrantedHealthPermissionsUseCase
 import com.android.healthconnect.controller.permissions.api.GetHealthPermissionsFlagsUseCase
 import com.android.healthconnect.controller.permissions.api.GrantHealthPermissionUseCase
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
 import com.android.healthconnect.controller.permissions.api.LoadAccessDateUseCase
 import com.android.healthconnect.controller.permissions.api.RevokeHealthPermissionUseCase
-import com.android.healthconnect.controller.permissions.data.HealthPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.AdditionalPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.fromPermissionString
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
 import com.android.healthconnect.controller.permissions.data.PermissionState
+import com.android.healthconnect.controller.permissions.request.AdditionalScreenState
+import com.android.healthconnect.controller.permissions.request.FitnessScreenState
+import com.android.healthconnect.controller.permissions.request.MedicalScreenState
+import com.android.healthconnect.controller.permissions.request.PermissionsActivityState
 import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
 import com.android.healthconnect.controller.service.HealthPermissionManagerModule
-import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.android.healthconnect.controller.shared.app.AppInfoReader
 import com.android.healthconnect.controller.shared.app.AppMetadata
 import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
 import com.android.healthconnect.controller.tests.utils.NOW
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME_2
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_2
 import com.android.healthconnect.controller.tests.utils.TestObserver
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
 import com.android.healthconnect.controller.tests.utils.di.FakeHealthPermissionManager
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
-import com.android.healthconnect.controller.utils.FeaturesModule
-import com.google.common.truth.Truth.*
+import com.android.healthfitness.flags.Flags
+import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -75,36 +83,36 @@
 import org.junit.Test
 import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
 
 @OptIn(ExperimentalCoroutinesApi::class)
-@UninstallModules(HealthPermissionManagerModule::class, FeaturesModule::class)
+@UninstallModules(HealthPermissionManagerModule::class)
 @HiltAndroidTest
 class RequestPermissionViewModelTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
     @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
     private val testDispatcher = UnconfinedTestDispatcher()
 
     @BindValue val permissionManager: HealthPermissionManager = FakeHealthPermissionManager()
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
 
     @Inject lateinit var appInfoReader: AppInfoReader
     @Inject lateinit var grantHealthPermissionUseCase: GrantHealthPermissionUseCase
     @Inject lateinit var revokeHealthPermissionUseCase: RevokeHealthPermissionUseCase
     @Inject lateinit var getGrantHealthPermissionUseCase: GetGrantedHealthPermissionsUseCase
     @Inject lateinit var getHealthPermissionsFlagsUseCase: GetHealthPermissionsFlagsUseCase
+    @Inject lateinit var loadDeclaredHealthPermissionUseCase: LoadDeclaredHealthPermissionUseCase
     @BindValue var loadAccessDateUseCase: LoadAccessDateUseCase = mock()
 
-    @Inject lateinit var healthPermissionReader: HealthPermissionReader
     lateinit var viewModel: RequestPermissionViewModel
 
     @Before
     fun setup() {
         hiltRule.inject()
         permissionManager.revokeAllHealthPermissions(TEST_APP_PACKAGE_NAME)
+        permissionManager.revokeAllHealthPermissions(TEST_APP_PACKAGE_NAME_2)
         Dispatchers.setMain(testDispatcher)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
         viewModel =
             RequestPermissionViewModel(
                 appInfoReader,
@@ -113,15 +121,15 @@
                 getGrantHealthPermissionUseCase,
                 getHealthPermissionsFlagsUseCase,
                 loadAccessDateUseCase,
-                healthPermissionReader)
+                loadDeclaredHealthPermissionUseCase,
+            )
         whenever(loadAccessDateUseCase.invoke(eq(TEST_APP_PACKAGE_NAME))).thenReturn(NOW)
+        whenever(loadAccessDateUseCase.invoke(eq(TEST_APP_PACKAGE_NAME_2))).thenReturn(NOW)
     }
 
     @After
     fun tearDown() {
         Dispatchers.resetMain()
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(false)
     }
 
     @Test
@@ -136,154 +144,963 @@
         assertThat(testObserver.getLastValue().packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
     }
 
+    // PermissionScreenStates
     @Test
-    fun init_loadsHealthPermissions() = runTest {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withMedicalReadAndWritePermissions_loadsPermissionActivityScreenStateShowMedical() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_MEDICAL_DATA_VACCINES,
+                    WRITE_MEDICAL_DATA,
+                    READ_EXERCISE,
+                    READ_SLEEP,
+                    WRITE_EXERCISE,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            val permissionActivityStateObserver = TestObserver<PermissionsActivityState>()
+            viewModel.permissionsActivityState.observeForever(permissionActivityStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = permissionActivityStateObserver.getLastValue()
+            assertThat(result is PermissionsActivityState.ShowMedical).isTrue()
+            assertThat((result as PermissionsActivityState.ShowMedical).isWriteOnly).isFalse()
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withMedicalWritePermissions_loadsPermissionActivityScreenStateShowMedical() = runTest {
+        val permissions =
+            arrayOf(
+                WRITE_MEDICAL_DATA,
+                READ_EXERCISE,
+                READ_SLEEP,
+                WRITE_EXERCISE,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        val permissionActivityStateObserver = TestObserver<PermissionsActivityState>()
+        viewModel.permissionsActivityState.observeForever(permissionActivityStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+        advanceUntilIdle()
+
+        val result = permissionActivityStateObserver.getLastValue()
+        assertThat(result is PermissionsActivityState.ShowMedical).isTrue()
+        assertThat((result as PermissionsActivityState.ShowMedical).isWriteOnly).isTrue()
+    }
+
+    @Test
+    fun init_withFitnessPermissions_loadsPermissionActivityScreenStateShowFitness() = runTest {
         val permissions =
             arrayOf(
                 READ_EXERCISE,
                 READ_SLEEP,
                 WRITE_EXERCISE,
                 READ_HEALTH_DATA_IN_BACKGROUND,
-                READ_HEALTH_DATA_HISTORY)
+                READ_HEALTH_DATA_HISTORY,
+            )
+        val permissionActivityStateObserver = TestObserver<PermissionsActivityState>()
+        viewModel.permissionsActivityState.observeForever(permissionActivityStateObserver)
+
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
-
-        val fitnessPermissionObserver = TestObserver<List<FitnessPermission>>()
-        viewModel.fitnessPermissionsList.observeForever(fitnessPermissionObserver)
-
-        val additionalPermissionObserver = TestObserver<List<AdditionalPermission>>()
-        viewModel.additionalPermissionsList.observeForever(additionalPermissionObserver)
-
-        val healthPermissionObserver = TestObserver<List<HealthPermission>>()
-        viewModel.healthPermissionsList.observeForever(healthPermissionObserver)
-
         advanceUntilIdle()
-        assertThat(fitnessPermissionObserver.getLastValue())
-            .isEqualTo(
-                listOf(
-                    fromPermissionString(READ_EXERCISE),
-                    fromPermissionString(READ_SLEEP),
-                    fromPermissionString(WRITE_EXERCISE)))
-        assertThat(additionalPermissionObserver.getLastValue())
-            .isEqualTo(
-                listOf(
-                    fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND),
-                    fromPermissionString(READ_HEALTH_DATA_HISTORY)))
-        assertThat(healthPermissionObserver.getLastValue())
-            .isEqualTo(
-                listOf(
-                    fromPermissionString(READ_EXERCISE),
-                    fromPermissionString(READ_SLEEP),
-                    fromPermissionString(WRITE_EXERCISE),
-                    fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND),
-                    fromPermissionString(READ_HEALTH_DATA_HISTORY)))
+
+        val result = permissionActivityStateObserver.getLastValue()
+        assertThat(result is PermissionsActivityState.ShowFitness).isTrue()
     }
 
     @Test
-    fun initPermissions_filtersOutAdditionalPermissions() = runTest {
-        viewModel.init(
-            TEST_APP_PACKAGE_NAME,
-            arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_IN_BACKGROUND))
-        val testObserver = TestObserver<List<FitnessPermission>>()
-        viewModel.fitnessPermissionsList.observeForever(testObserver)
+    fun init_withSingleAdditionalPermissions_loadsPermissionActivityScreenStateShowAdditional() =
+        runTest {
+            val permissions =
+                arrayOf(READ_EXERCISE, READ_SLEEP, WRITE_EXERCISE, READ_HEALTH_DATA_IN_BACKGROUND)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_EXERCISE, READ_SLEEP, WRITE_EXERCISE),
+            )
+            val permissionActivityStateObserver = TestObserver<PermissionsActivityState>()
+            viewModel.permissionsActivityState.observeForever(permissionActivityStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = permissionActivityStateObserver.getLastValue()
+            assertThat(result is PermissionsActivityState.ShowAdditional).isTrue()
+            assertThat((result as PermissionsActivityState.ShowAdditional).singlePermission)
+                .isTrue()
+        }
+
+    @Test
+    fun init_withMultipleAdditionalPermissions_loadsPermissionActivityScreenStateShowAdditional() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_EXERCISE,
+                    READ_SLEEP,
+                    WRITE_EXERCISE,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_EXERCISE, READ_SLEEP, WRITE_EXERCISE),
+            )
+            val permissionActivityStateObserver = TestObserver<PermissionsActivityState>()
+            viewModel.permissionsActivityState.observeForever(permissionActivityStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = permissionActivityStateObserver.getLastValue()
+            assertThat(result is PermissionsActivityState.ShowAdditional).isTrue()
+            assertThat((result as PermissionsActivityState.ShowAdditional).singlePermission)
+                .isFalse()
+        }
+
+    // MedicalScreenStates
+    @Test
+    fun init_withNoMedicalPermissions_loadsMedicalScreenStateNoMedicalData() = runTest {
+        val permissions =
+            arrayOf(
+                READ_EXERCISE,
+                READ_SLEEP,
+                WRITE_EXERCISE,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        val medicalScreenStateObserver = TestObserver<MedicalScreenState>()
+        viewModel.medicalScreenState.observeForever(medicalScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
         advanceUntilIdle()
-        assertThat(testObserver.getLastValue())
-            .isEqualTo(
-                listOf(fromPermissionString(READ_EXERCISE), fromPermissionString(READ_SLEEP)))
+
+        val result = medicalScreenStateObserver.getLastValue()
+        assertThat(result is MedicalScreenState.NoMedicalData).isTrue()
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withMedicalWritePermissions_loadsMedicalScreenStateShowMedicalWrite() = runTest {
+        val permissions =
+            arrayOf(
+                WRITE_MEDICAL_DATA,
+                READ_EXERCISE,
+                READ_SLEEP,
+                WRITE_EXERCISE,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        val medicalScreenStateObserver = TestObserver<MedicalScreenState>()
+        viewModel.medicalScreenState.observeForever(medicalScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+        advanceUntilIdle()
+
+        val result = medicalScreenStateObserver.getLastValue()
+        assertThat(result is MedicalScreenState.ShowMedicalWrite).isTrue()
+        assertThat((result as MedicalScreenState.ShowMedicalWrite).appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME)
+        assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(result.medicalPermissions)
+            .containsExactlyElementsIn(listOf(fromPermissionString(WRITE_MEDICAL_DATA)))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withMedicalReadPermissions_loadsMedicalScreenStateShowMedicalRead() = runTest {
+        val permissions =
+            arrayOf(
+                READ_MEDICAL_DATA_VACCINES,
+                READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                READ_EXERCISE,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        val medicalScreenStateObserver = TestObserver<MedicalScreenState>()
+        viewModel.medicalScreenState.observeForever(medicalScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+        advanceUntilIdle()
+
+        val result = medicalScreenStateObserver.getLastValue()
+        assertThat(result is MedicalScreenState.ShowMedicalRead).isTrue()
+        assertThat((result as MedicalScreenState.ShowMedicalRead).appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME)
+        assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(result.medicalPermissions)
+            .containsExactlyElementsIn(
+                listOf(READ_MEDICAL_DATA_VACCINES, READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES)
+                    .map { fromPermissionString(it) }
+            )
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withMedicalReadWritePermissions_loadsMedicalScreenStateShowMedicalReadWrite() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_MEDICAL_DATA_VACCINES,
+                    READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                    WRITE_MEDICAL_DATA,
+                    READ_EXERCISE,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            val medicalScreenStateObserver = TestObserver<MedicalScreenState>()
+            viewModel.medicalScreenState.observeForever(medicalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = medicalScreenStateObserver.getLastValue()
+            assertThat(result is MedicalScreenState.ShowMedicalReadWrite).isTrue()
+            assertThat((result as MedicalScreenState.ShowMedicalReadWrite).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.medicalPermissions)
+                .containsExactlyElementsIn(
+                    listOf(
+                            READ_MEDICAL_DATA_VACCINES,
+                            READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                            WRITE_MEDICAL_DATA,
+                        )
+                        .map { fromPermissionString(it) }
+                )
+        }
+
+    // FitnessScreenStates
+    @Test
+    fun init_withNoFitnessPermissions_loadsFitnessScreenStateNoFitnessData() = runTest {
+        val permissions =
+            arrayOf(
+                READ_MEDICAL_DATA_VACCINES,
+                READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+        viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+        advanceUntilIdle()
+
+        val result = fitnessScreenStateObserver.getLastValue()
+        assertThat(result is FitnessScreenState.NoFitnessData).isTrue()
+    }
+
+    @Test
+    fun init_withFitnessRead_withNoMedical_withNoHistory_loadsFitnessScreenStateShowFitnessRead() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_EXERCISE,
+                    READ_SLEEP,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+            viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME_2, permissions)
+            advanceUntilIdle()
+
+            val result = fitnessScreenStateObserver.getLastValue()
+            assertThat(result is FitnessScreenState.ShowFitnessRead).isTrue()
+            assertThat((result as FitnessScreenState.ShowFitnessRead).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME_2)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+            assertThat(result.historyGranted).isFalse()
+            assertThat(result.hasMedical).isFalse()
+            assertThat(result.fitnessPermissions)
+                .containsExactlyElementsIn(
+                    listOf(READ_EXERCISE, READ_SLEEP).map { fromPermissionString(it) }
+                )
+        }
+
+    @Test
+    fun init_withFitnessRead_withNoMedical_withHistory_loadsFitnessScreenStateShowFitnessRead() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_HEART_RATE,
+                    READ_SLEEP,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME_2,
+                listOf(READ_HEALTH_DATA_HISTORY),
+            )
+            val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+            viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME_2, permissions)
+            advanceUntilIdle()
+
+            val result = fitnessScreenStateObserver.getLastValue()
+            assertThat(result is FitnessScreenState.ShowFitnessRead).isTrue()
+            assertThat((result as FitnessScreenState.ShowFitnessRead).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME_2)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+            assertThat(result.historyGranted).isTrue()
+            assertThat(result.hasMedical).isFalse()
+            assertThat(result.fitnessPermissions)
+                .containsExactlyElementsIn(
+                    listOf(READ_HEART_RATE, READ_SLEEP).map { fromPermissionString(it) }
+                )
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withFitnessRead_withMedical_withNoHistory_loadsFitnessScreenStateShowFitnessRead() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_EXERCISE,
+                    READ_SLEEP,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+            viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = fitnessScreenStateObserver.getLastValue()
+            assertThat(result is FitnessScreenState.ShowFitnessRead).isTrue()
+            assertThat((result as FitnessScreenState.ShowFitnessRead).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.historyGranted).isFalse()
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.fitnessPermissions)
+                .containsExactlyElementsIn(
+                    listOf(READ_EXERCISE, READ_SLEEP).map { fromPermissionString(it) }
+                )
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withFitnessRead_withMedical_withHistory_loadsFitnessScreenStateShowFitnessRead() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_EXERCISE,
+                    READ_SLEEP,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_HEALTH_DATA_HISTORY),
+            )
+            val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+            viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = fitnessScreenStateObserver.getLastValue()
+            assertThat(result is FitnessScreenState.ShowFitnessRead).isTrue()
+            assertThat((result as FitnessScreenState.ShowFitnessRead).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.historyGranted).isTrue()
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.fitnessPermissions)
+                .containsExactlyElementsIn(
+                    listOf(READ_EXERCISE, READ_SLEEP).map { fromPermissionString(it) }
+                )
+        }
+
+    @Test
+    fun init_withFitnessWrite_withNoMedical_loadsFitnessScreenStateShowFitnessWrite() = runTest {
+        val permissions =
+            arrayOf(
+                WRITE_SKIN_TEMPERATURE,
+                WRITE_EXERCISE,
+                WRITE_PLANNED_EXERCISE,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+        viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME_2, permissions)
+        advanceUntilIdle()
+
+        val result = fitnessScreenStateObserver.getLastValue()
+        assertThat(result is FitnessScreenState.ShowFitnessWrite).isTrue()
+        assertThat((result as FitnessScreenState.ShowFitnessWrite).appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME_2)
+        assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+        assertThat(result.hasMedical).isFalse()
+        assertThat(result.fitnessPermissions)
+            .containsExactlyElementsIn(
+                listOf(WRITE_EXERCISE, WRITE_PLANNED_EXERCISE, WRITE_SKIN_TEMPERATURE).map {
+                    fromPermissionString(it)
+                }
+            )
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withFitnessWrite_withMedical_loadsFitnessScreenStateShowFitnessWrite() = runTest {
+        val permissions =
+            arrayOf(
+                WRITE_SKIN_TEMPERATURE,
+                WRITE_EXERCISE,
+                WRITE_PLANNED_EXERCISE,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+        viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+        advanceUntilIdle()
+
+        val result = fitnessScreenStateObserver.getLastValue()
+        assertThat(result is FitnessScreenState.ShowFitnessWrite).isTrue()
+        assertThat((result as FitnessScreenState.ShowFitnessWrite).appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME)
+        assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+        assertThat(result.hasMedical).isTrue()
+        assertThat(result.fitnessPermissions)
+            .containsExactlyElementsIn(
+                listOf(WRITE_EXERCISE, WRITE_PLANNED_EXERCISE, WRITE_SKIN_TEMPERATURE).map {
+                    fromPermissionString(it)
+                }
+            )
+    }
+
+    @Test
+    fun init_withFitnessReadWrite_withNoMedical_withNoHistory_loadsFitnessScreenStateShowFitnessReadWrite() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_EXERCISE,
+                    READ_SLEEP,
+                    WRITE_SKIN_TEMPERATURE,
+                    WRITE_EXERCISE,
+                    WRITE_PLANNED_EXERCISE,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+            viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME_2, permissions)
+            advanceUntilIdle()
+
+            val result = fitnessScreenStateObserver.getLastValue()
+            assertThat(result is FitnessScreenState.ShowFitnessReadWrite).isTrue()
+            assertThat((result as FitnessScreenState.ShowFitnessReadWrite).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME_2)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+            assertThat(result.hasMedical).isFalse()
+            assertThat(result.historyGranted).isFalse()
+            assertThat(result.fitnessPermissions)
+                .containsExactlyElementsIn(
+                    listOf(
+                            READ_EXERCISE,
+                            READ_SLEEP,
+                            WRITE_EXERCISE,
+                            WRITE_PLANNED_EXERCISE,
+                            WRITE_SKIN_TEMPERATURE,
+                        )
+                        .map { fromPermissionString(it) }
+                )
+        }
+
+    @Test
+    fun init_withFitnessReadWrite_withNoMedical_withHistory_loadsFitnessScreenStateShowFitnessReadWrite() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_HEART_RATE,
+                    READ_STEPS,
+                    WRITE_SKIN_TEMPERATURE,
+                    WRITE_EXERCISE,
+                    WRITE_PLANNED_EXERCISE,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME_2,
+                listOf(READ_HEALTH_DATA_HISTORY),
+            )
+            val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+            viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME_2, permissions)
+            advanceUntilIdle()
+
+            val result = fitnessScreenStateObserver.getLastValue()
+            assertThat(result is FitnessScreenState.ShowFitnessReadWrite).isTrue()
+            assertThat((result as FitnessScreenState.ShowFitnessReadWrite).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME_2)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+            assertThat(result.hasMedical).isFalse()
+            assertThat(result.historyGranted).isTrue()
+            assertThat(result.fitnessPermissions)
+                .containsExactlyElementsIn(
+                    listOf(
+                            READ_HEART_RATE,
+                            READ_STEPS,
+                            WRITE_EXERCISE,
+                            WRITE_PLANNED_EXERCISE,
+                            WRITE_SKIN_TEMPERATURE,
+                        )
+                        .map { fromPermissionString(it) }
+                )
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withFitnessReadWrite_withMedical_withNoHistory_loadsFitnessScreenStateShowFitnessReadWrite() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_EXERCISE,
+                    READ_SLEEP,
+                    WRITE_SKIN_TEMPERATURE,
+                    WRITE_EXERCISE,
+                    WRITE_PLANNED_EXERCISE,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+            viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = fitnessScreenStateObserver.getLastValue()
+            assertThat(result is FitnessScreenState.ShowFitnessReadWrite).isTrue()
+            assertThat((result as FitnessScreenState.ShowFitnessReadWrite).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.historyGranted).isFalse()
+            assertThat(result.fitnessPermissions)
+                .containsExactlyElementsIn(
+                    listOf(
+                            READ_EXERCISE,
+                            READ_SLEEP,
+                            WRITE_EXERCISE,
+                            WRITE_PLANNED_EXERCISE,
+                            WRITE_SKIN_TEMPERATURE,
+                        )
+                        .map { fromPermissionString(it) }
+                )
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withFitnessReadWrite_withMedical_withHistory_loadsFitnessScreenStateShowFitnessReadWrite() =
+        runTest {
+            val permissions =
+                arrayOf(
+                    READ_EXERCISE,
+                    READ_SLEEP,
+                    WRITE_SKIN_TEMPERATURE,
+                    WRITE_EXERCISE,
+                    WRITE_PLANNED_EXERCISE,
+                    READ_HEALTH_DATA_IN_BACKGROUND,
+                    READ_HEALTH_DATA_HISTORY,
+                )
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_HEALTH_DATA_HISTORY),
+            )
+            val fitnessScreenStateObserver = TestObserver<FitnessScreenState>()
+            viewModel.fitnessScreenState.observeForever(fitnessScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = fitnessScreenStateObserver.getLastValue()
+            assertThat(result is FitnessScreenState.ShowFitnessReadWrite).isTrue()
+            assertThat((result as FitnessScreenState.ShowFitnessReadWrite).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.historyGranted).isTrue()
+            assertThat(result.fitnessPermissions)
+                .containsExactlyElementsIn(
+                    listOf(
+                            READ_EXERCISE,
+                            READ_SLEEP,
+                            WRITE_EXERCISE,
+                            WRITE_PLANNED_EXERCISE,
+                            WRITE_SKIN_TEMPERATURE,
+                        )
+                        .map { fromPermissionString(it) }
+                )
+        }
+
+    // AdditionalScreenStates
+    @Test
+    fun init_withNoAdditionalPermissions_loadsAdditionalScreenStateNoAdditionalData() = runTest {
+        val permissions = arrayOf(READ_HEALTH_DATA_IN_BACKGROUND, READ_HEALTH_DATA_HISTORY)
+        val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+        viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+        advanceUntilIdle()
+
+        val result = additionalScreenStateObserver.getLastValue()
+        assertThat(result is AdditionalScreenState.NoAdditionalData).isTrue()
+    }
+
+    @Test
+    fun init_withHistoryRead_withNoMedical_loadsAdditionalScreenStateShowHistory() = runTest {
+        val permissions = arrayOf(READ_HEALTH_DATA_HISTORY)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME_2,
+            listOf(READ_SLEEP),
+        )
+        val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+        viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME_2, permissions)
+        advanceUntilIdle()
+
+        val result = additionalScreenStateObserver.getLastValue()
+        assertThat(result is AdditionalScreenState.ShowHistory).isTrue()
+        assertThat((result as AdditionalScreenState.ShowHistory).appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME_2)
+        assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+        assertThat(result.hasMedical).isFalse()
+        assertThat(result.isMedicalReadGranted).isFalse()
+        assertThat(result.dataAccessDate).isEqualTo(NOW)
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withHistoryRead_withMedical_medicalNotGranted_loadsAdditionalScreenStateShowHistory() =
+        runTest {
+            val permissions = arrayOf(READ_HEALTH_DATA_HISTORY)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_SLEEP),
+            )
+            val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+            viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = additionalScreenStateObserver.getLastValue()
+            assertThat(result is AdditionalScreenState.ShowHistory).isTrue()
+            assertThat((result as AdditionalScreenState.ShowHistory).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.isMedicalReadGranted).isFalse()
+            assertThat(result.dataAccessDate).isEqualTo(NOW)
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withHistoryRead_withMedical_medicalGranted_loadsAdditionalScreenStateShowHistory() =
+        runTest {
+            val permissions = arrayOf(READ_HEALTH_DATA_HISTORY)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES, READ_SLEEP),
+            )
+            val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+            viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = additionalScreenStateObserver.getLastValue()
+            assertThat(result is AdditionalScreenState.ShowHistory).isTrue()
+            assertThat((result as AdditionalScreenState.ShowHistory).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.isMedicalReadGranted).isTrue()
+            assertThat(result.dataAccessDate).isEqualTo(NOW)
+        }
+
+    @Test
+    fun init_withBackgroundRead_withNoMedical_loadsAdditionalScreenStateShowBackground() = runTest {
+        val permissions = arrayOf(READ_HEALTH_DATA_IN_BACKGROUND)
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME_2,
+            listOf(READ_SLEEP),
+        )
+        val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+        viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME_2, permissions)
+        advanceUntilIdle()
+
+        val result = additionalScreenStateObserver.getLastValue()
+        assertThat(result is AdditionalScreenState.ShowBackground).isTrue()
+        assertThat((result as AdditionalScreenState.ShowBackground).appMetadata.appName)
+            .isEqualTo(TEST_APP_NAME_2)
+        assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+        assertThat(result.hasMedical).isFalse()
+        assertThat(result.isMedicalReadGranted).isFalse()
+        assertThat(result.isFitnessReadGranted).isTrue()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withBackgroundRead_withMedical_medicalGranted_fitnessNotGranted_loadsAdditionalScreenStateShowBackground() =
+        runTest {
+            val permissions = arrayOf(READ_HEALTH_DATA_IN_BACKGROUND)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES),
+            )
+            val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+            viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = additionalScreenStateObserver.getLastValue()
+            assertThat(result is AdditionalScreenState.ShowBackground).isTrue()
+            assertThat((result as AdditionalScreenState.ShowBackground).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.isMedicalReadGranted).isTrue()
+            assertThat(result.isFitnessReadGranted).isFalse()
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withBackgroundRead_withMedical_medicalNotGranted_fitnessGranted_loadsAdditionalScreenStateShowBackground() =
+        runTest {
+            val permissions = arrayOf(READ_HEALTH_DATA_IN_BACKGROUND)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_SLEEP),
+            )
+            val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+            viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = additionalScreenStateObserver.getLastValue()
+            assertThat(result is AdditionalScreenState.ShowBackground).isTrue()
+            assertThat((result as AdditionalScreenState.ShowBackground).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.isMedicalReadGranted).isFalse()
+            assertThat(result.isFitnessReadGranted).isTrue()
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withBackgroundRead_withMedical_medicalGranted_fitnessGranted_loadsAdditionalScreenStateShowBackground() =
+        runTest {
+            val permissions = arrayOf(READ_HEALTH_DATA_IN_BACKGROUND)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_SLEEP, READ_MEDICAL_DATA_VACCINES),
+            )
+            val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+            viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = additionalScreenStateObserver.getLastValue()
+            assertThat(result is AdditionalScreenState.ShowBackground).isTrue()
+            assertThat((result as AdditionalScreenState.ShowBackground).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.isMedicalReadGranted).isTrue()
+            assertThat(result.isFitnessReadGranted).isTrue()
+        }
+
+    @Test
+    fun init_withAdditionalPermissions_withNoMedical_loadsAdditionalScreenStateShowCombined() =
+        runTest {
+            val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME_2,
+                listOf(READ_SLEEP),
+            )
+            val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+            viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME_2, permissions)
+            advanceUntilIdle()
+
+            val result = additionalScreenStateObserver.getLastValue()
+            assertThat(result is AdditionalScreenState.ShowCombined).isTrue()
+            assertThat((result as AdditionalScreenState.ShowCombined).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME_2)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME_2)
+            assertThat(result.hasMedical).isFalse()
+            assertThat(result.isMedicalReadGranted).isFalse()
+            assertThat(result.isFitnessReadGranted).isTrue()
+            assertThat(result.dataAccessDate).isEqualTo(NOW)
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withAdditionalPermissions_withMedical_medicalNotGranted_fitnessGranted_loadsAdditionalScreenStateShowCombined() =
+        runTest {
+            val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_SLEEP),
+            )
+            val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+            viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = additionalScreenStateObserver.getLastValue()
+            assertThat(result is AdditionalScreenState.ShowCombined).isTrue()
+            assertThat((result as AdditionalScreenState.ShowCombined).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.isMedicalReadGranted).isFalse()
+            assertThat(result.isFitnessReadGranted).isTrue()
+            assertThat(result.dataAccessDate).isEqualTo(NOW)
+        }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun init_withAdditionalPermissions_withMedical_medicalGranted_fitnessGranted_loadsAdditionalScreenStateShowCombined() =
+        runTest {
+            val permissions = arrayOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+            (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_SLEEP, READ_MEDICAL_DATA_VACCINES),
+            )
+            val additionalScreenStateObserver = TestObserver<AdditionalScreenState>()
+            viewModel.additionalScreenState.observeForever(additionalScreenStateObserver)
+
+            viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+            advanceUntilIdle()
+
+            val result = additionalScreenStateObserver.getLastValue()
+            assertThat(result is AdditionalScreenState.ShowCombined).isTrue()
+            assertThat((result as AdditionalScreenState.ShowCombined).appMetadata.appName)
+                .isEqualTo(TEST_APP_NAME)
+            assertThat(result.appMetadata.packageName).isEqualTo(TEST_APP_PACKAGE_NAME)
+            assertThat(result.hasMedical).isTrue()
+            assertThat(result.isMedicalReadGranted).isTrue()
+            assertThat(result.isFitnessReadGranted).isTrue()
+            assertThat(result.dataAccessDate).isEqualTo(NOW)
+        }
+
+    @Test
     fun initPermissions_filtersOutUndeclaredPermissions() = runTest {
-        viewModel.init(
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
             TEST_APP_PACKAGE_NAME,
-            arrayOf(READ_STEPS, READ_HEART_RATE, READ_HEALTH_DATA_IN_BACKGROUND))
-        val testObserver = TestObserver<List<HealthPermission>>()
-        viewModel.healthPermissionsList.observeForever(testObserver)
-        advanceUntilIdle()
-        assertThat(testObserver.getLastValue())
-            .isEqualTo(listOf(fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND)))
-    }
+            listOf(READ_EXERCISE),
+        )
+        val permissionActivityStateObserver = TestObserver<PermissionsActivityState>()
+        viewModel.permissionsActivityState.observeForever(permissionActivityStateObserver)
 
-    @Test
-    fun initPermissions_whenPermissionsHidden_filtersOutHiddenPermissions() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPlannedExerciseEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(false)
+        val fitnessStateObserver = TestObserver<FitnessScreenState>()
+        viewModel.fitnessScreenState.observeForever(fitnessStateObserver)
+
+        val additionalStateObserver = TestObserver<AdditionalScreenState>()
+        viewModel.additionalScreenState.observeForever(additionalStateObserver)
 
         viewModel.init(
             TEST_APP_PACKAGE_NAME,
-            arrayOf(
-                READ_EXERCISE,
-                READ_SLEEP,
-                READ_SKIN_TEMPERATURE,
-                WRITE_SKIN_TEMPERATURE,
-                READ_PLANNED_EXERCISE,
-                WRITE_PLANNED_EXERCISE,
-                READ_HEALTH_DATA_HISTORY,
-                READ_HEALTH_DATA_IN_BACKGROUND))
+            arrayOf(READ_STEPS, READ_HEART_RATE, READ_HEALTH_DATA_IN_BACKGROUND),
+        )
 
-        val testObserver = TestObserver<List<HealthPermission>>()
-        viewModel.healthPermissionsList.observeForever(testObserver)
         advanceUntilIdle()
-        assertThat(testObserver.getLastValue())
-            .isEqualTo(
-                listOf(
-                    fromPermissionString(READ_EXERCISE),
-                    fromPermissionString(READ_SLEEP),
-                    fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND)))
-    }
-
-    @Test
-    fun initPermissions_whenPermissionsNotHidden_doesNotFilterOutPermissions() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPlannedExerciseEnabled(true)
-
-        viewModel.init(
-            TEST_APP_PACKAGE_NAME,
-            arrayOf(
-                READ_SLEEP,
-                READ_EXERCISE,
-                READ_SKIN_TEMPERATURE,
-                WRITE_SKIN_TEMPERATURE,
-                READ_PLANNED_EXERCISE,
-                WRITE_PLANNED_EXERCISE))
-        val testObserver = TestObserver<List<FitnessPermission>>()
-        viewModel.fitnessPermissionsList.observeForever(testObserver)
-        advanceUntilIdle()
-        assertThat(testObserver.getLastValue())
-            .isEqualTo(
-                listOf(
-                    fromPermissionString(READ_SLEEP),
-                    fromPermissionString(READ_EXERCISE),
-                    fromPermissionString(READ_SKIN_TEMPERATURE),
-                    fromPermissionString(WRITE_SKIN_TEMPERATURE),
-                    fromPermissionString(READ_PLANNED_EXERCISE),
-                    fromPermissionString(WRITE_PLANNED_EXERCISE)))
+        assertThat(
+                permissionActivityStateObserver.getLastValue()
+                    is PermissionsActivityState.ShowAdditional
+            )
+            .isTrue()
+        assertThat(fitnessStateObserver.getLastValue() is FitnessScreenState.NoFitnessData).isTrue()
+        assertThat(additionalStateObserver.getLastValue() is AdditionalScreenState.ShowBackground)
+            .isTrue()
     }
 
     @Test
     fun initPermissions_filtersOutUnrecognisedPermissions() = runTest {
-        viewModel.init(TEST_APP_PACKAGE_NAME, arrayOf(READ_EXERCISE, READ_SLEEP, "permission"))
+        val permissionActivityStateObserver = TestObserver<PermissionsActivityState>()
+        viewModel.permissionsActivityState.observeForever(permissionActivityStateObserver)
 
-        val testObserver = TestObserver<List<HealthPermission>>()
-        viewModel.healthPermissionsList.observeForever(testObserver)
+        val fitnessStateObserver = TestObserver<FitnessScreenState>()
+        viewModel.fitnessScreenState.observeForever(fitnessStateObserver)
+
+        viewModel.init(TEST_APP_PACKAGE_NAME, arrayOf(READ_EXERCISE, READ_SLEEP, "permission"))
         advanceUntilIdle()
-        assertThat(testObserver.getLastValue())
-            .isEqualTo(
-                listOf(fromPermissionString(READ_EXERCISE), fromPermissionString(READ_SLEEP)))
+
+        assertThat(
+                permissionActivityStateObserver.getLastValue()
+                    is PermissionsActivityState.ShowFitness
+            )
+            .isTrue()
+        assertThat(fitnessStateObserver.getLastValue() is FitnessScreenState.ShowFitnessRead)
+            .isTrue()
+        assertThat(
+                (fitnessStateObserver.getLastValue() as FitnessScreenState.ShowFitnessRead)
+                    .fitnessPermissions
+            )
+            .containsExactlyElementsIn(
+                listOf(READ_EXERCISE, READ_SLEEP).map { fromPermissionString(it) }
+            )
     }
 
     @Test
     fun initPermissions_filtersOutGrantedPermissions() = runTest {
         (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE, READ_HEALTH_DATA_IN_BACKGROUND))
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE, READ_HEALTH_DATA_IN_BACKGROUND),
+        )
+        val permissionActivityStateObserver = TestObserver<PermissionsActivityState>()
+        viewModel.permissionsActivityState.observeForever(permissionActivityStateObserver)
+
+        val fitnessStateObserver = TestObserver<FitnessScreenState>()
+        viewModel.fitnessScreenState.observeForever(fitnessStateObserver)
+
+        val additionalStateObserver = TestObserver<AdditionalScreenState>()
+        viewModel.additionalScreenState.observeForever(additionalStateObserver)
+
         viewModel.init(
             TEST_APP_PACKAGE_NAME,
-            arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_IN_BACKGROUND))
+            arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_IN_BACKGROUND),
+        )
 
-        val testObserver = TestObserver<List<HealthPermission>>()
-        viewModel.healthPermissionsList.observeForever(testObserver)
         advanceUntilIdle()
-        assertThat(testObserver.getLastValue()).isEqualTo(listOf(fromPermissionString(READ_SLEEP)))
+        assertThat(
+                permissionActivityStateObserver.getLastValue()
+                    is PermissionsActivityState.ShowFitness
+            )
+            .isTrue()
+        assertThat(fitnessStateObserver.getLastValue() is FitnessScreenState.ShowFitnessRead)
+            .isTrue()
+        assertThat(
+                (fitnessStateObserver.getLastValue() as FitnessScreenState.ShowFitnessRead)
+                    .fitnessPermissions
+            )
+            .containsExactlyElementsIn(listOf(READ_SLEEP).map { fromPermissionString(it) })
+        assertThat(additionalStateObserver.getLastValue() is AdditionalScreenState.NoAdditionalData)
+            .isTrue()
     }
 
     @Test
@@ -298,6 +1115,17 @@
     }
 
     @Test
+    fun isPermissionLocallyGranted_medicalPermissionGranted_returnsTrue() = runTest {
+        val permissions = arrayOf(READ_EXERCISE, READ_SLEEP, READ_MEDICAL_DATA_VACCINES)
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+
+        val readImmunizationPermission = fromPermissionString(READ_MEDICAL_DATA_VACCINES)
+        viewModel.updateHealthPermission(readImmunizationPermission, grant = true)
+
+        assertThat(viewModel.isPermissionLocallyGranted(readImmunizationPermission)).isTrue()
+    }
+
+    @Test
     fun isPermissionLocallyGranted_additionalPermissionGranted_returnsTrue() = runTest {
         val permissions = arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY)
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
@@ -316,15 +1144,29 @@
         val readStepsPermission = fromPermissionString(READ_STEPS)
         viewModel.updateHealthPermission(readStepsPermission, grant = false)
 
-        assertThat(viewModel.isPermissionLocallyGranted(fromPermissionString(READ_EXERCISE)))
-            .isFalse()
+        assertThat(viewModel.isPermissionLocallyGranted(readStepsPermission)).isFalse()
+    }
+
+    @Test
+    fun isPermissionLocallyGranted_medicalPermissionRevoked_returnsFalse() = runTest {
+        val permissions = arrayOf(READ_EXERCISE, READ_SLEEP, READ_MEDICAL_DATA_VACCINES)
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+
+        val readImmunizationPermission = fromPermissionString(READ_MEDICAL_DATA_VACCINES)
+        viewModel.updateHealthPermission(readImmunizationPermission, grant = false)
+
+        assertThat(viewModel.isPermissionLocallyGranted(readImmunizationPermission)).isFalse()
     }
 
     @Test
     fun isPermissionLocallyGranted_additionalPermissionRevoked_returnsFalse() = runTest {
         val permissions =
             arrayOf(
-                READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+            )
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
 
         val historyReadPermission = fromPermissionString(READ_HEALTH_DATA_HISTORY)
@@ -334,16 +1176,39 @@
     }
 
     @Test
-    fun init_anyReadPermissionsGranted_whenReadPermissionGranted_returnsTrue() = runTest {
+    fun init_anyReadPermissionsGranted_whenReadFitnessPermissionGranted_returnsTrue() = runTest {
         val permissions =
             arrayOf(
                 READ_EXERCISE,
                 READ_SLEEP,
                 WRITE_DISTANCE,
                 READ_HEALTH_DATA_IN_BACKGROUND,
-                READ_HEALTH_DATA_HISTORY)
+                READ_HEALTH_DATA_HISTORY,
+            )
         (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE))
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE),
+        )
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+
+        advanceUntilIdle()
+        assertThat(viewModel.isAnyReadPermissionGranted()).isTrue()
+    }
+
+    @Test
+    fun init_anyReadPermissionsGranted_whenReadMedicalPermissionGranted_returnsTrue() = runTest {
+        val permissions =
+            arrayOf(
+                READ_EXERCISE,
+                READ_SLEEP,
+                WRITE_DISTANCE,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_MEDICAL_DATA_VACCINES),
+        )
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
 
         advanceUntilIdle()
@@ -358,9 +1223,12 @@
                 READ_SLEEP,
                 WRITE_EXERCISE,
                 READ_HEALTH_DATA_IN_BACKGROUND,
-                READ_HEALTH_DATA_HISTORY)
+                READ_HEALTH_DATA_HISTORY,
+            )
         (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf())
+            TEST_APP_PACKAGE_NAME,
+            listOf(WRITE_MEDICAL_DATA),
+        )
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
 
         advanceUntilIdle()
@@ -376,9 +1244,12 @@
                     READ_SLEEP,
                     WRITE_EXERCISE,
                     READ_HEALTH_DATA_IN_BACKGROUND,
-                    READ_HEALTH_DATA_HISTORY)
+                    READ_HEALTH_DATA_HISTORY,
+                )
             (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-                TEST_APP_PACKAGE_NAME, listOf(READ_HEALTH_DATA_HISTORY))
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_HEALTH_DATA_HISTORY),
+            )
             viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
 
             advanceUntilIdle()
@@ -394,9 +1265,12 @@
                     READ_SLEEP,
                     WRITE_EXERCISE,
                     READ_HEALTH_DATA_IN_BACKGROUND,
-                    READ_HEALTH_DATA_HISTORY)
+                    READ_HEALTH_DATA_HISTORY,
+                )
             (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-                TEST_APP_PACKAGE_NAME, listOf(READ_HEALTH_DATA_IN_BACKGROUND))
+                TEST_APP_PACKAGE_NAME,
+                listOf(READ_HEALTH_DATA_IN_BACKGROUND),
+            )
             viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
 
             advanceUntilIdle()
@@ -427,6 +1301,21 @@
     }
 
     @Test
+    fun updateHealthPermission_grant_updatesGrantedMedicalPermissions() = runTest {
+        val permissions =
+            arrayOf(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES, READ_SLEEP, READ_HEALTH_DATA_HISTORY)
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+
+        val readAllergiesPermission = fromPermissionString(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES)
+        val testObserver = TestObserver<Set<MedicalPermission>>()
+        viewModel.grantedMedicalPermissions.observeForever(testObserver)
+        viewModel.updateHealthPermission(readAllergiesPermission, grant = true)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue()).contains(readAllergiesPermission)
+    }
+
+    @Test
     fun updateHealthPermission_grant_updatesGrantedAdditionalPermissions() = runTest {
         val permissions = arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY)
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
@@ -455,6 +1344,21 @@
     }
 
     @Test
+    fun updateHealthPermission_revoke_updatesGrantedMedicalPermissions() = runTest {
+        val permissions =
+            arrayOf(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES, READ_SLEEP, READ_HEALTH_DATA_HISTORY)
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+
+        val readAllergiesPermission = fromPermissionString(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES)
+        val testObserver = TestObserver<Set<MedicalPermission>>()
+        viewModel.grantedMedicalPermissions.observeForever(testObserver)
+        viewModel.updateHealthPermission(readAllergiesPermission, grant = false)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue()).doesNotContain(readAllergiesPermission)
+    }
+
+    @Test
     fun updateHealthPermission_revoke_updatesGrantedAdditionalPermissions() = runTest {
         val permissions = arrayOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY)
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
@@ -483,10 +1387,44 @@
     }
 
     @Test
-    fun updateAdditionalPermissions_grant_updatesGrantedAdditionalPermissions() = runTest {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun updateMedicalPermissions_grant_updatesGrantedMedicalPermissions() = runTest {
         val permissions =
             arrayOf(
-                READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+                READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                WRITE_MEDICAL_DATA,
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+
+        val testObserver = TestObserver<Set<MedicalPermission>>()
+        viewModel.grantedMedicalPermissions.observeForever(testObserver)
+        viewModel.updateMedicalPermissions(grant = true)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue())
+            .containsExactlyElementsIn(
+                setOf(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES, WRITE_MEDICAL_DATA).map {
+                    fromPermissionString(it)
+                }
+            )
+    }
+
+    @Test
+    fun updateAdditionalPermissions_grant_updatesGrantedAdditionalPermissions() = runTest {
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE),
+        )
+        val permissions =
+            arrayOf(
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+            )
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
 
         val testObserver = TestObserver<Set<AdditionalPermission>>()
@@ -497,7 +1435,8 @@
         assertThat(testObserver.getLastValue())
             .containsExactly(
                 fromPermissionString(READ_HEALTH_DATA_HISTORY),
-                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND))
+                fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND),
+            )
     }
 
     @Test
@@ -514,10 +1453,34 @@
     }
 
     @Test
+    fun updateMedicalPermissions_revoke_updatesGrantedMedicalPermissions() = runTest {
+        val permissions =
+            arrayOf(
+                READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                WRITE_MEDICAL_DATA,
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+            )
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+
+        val testObserver = TestObserver<Set<MedicalPermission>>()
+        viewModel.grantedMedicalPermissions.observeForever(testObserver)
+        viewModel.updateMedicalPermissions(grant = false)
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue()).isEmpty()
+    }
+
+    @Test
     fun updateAdditionalPermissions_revoke_updatesGrantedAdditionalPermissions() = runTest {
         val permissions =
             arrayOf(
-                READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+            )
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
 
         val testObserver = TestObserver<Set<AdditionalPermission>>()
@@ -532,7 +1495,11 @@
     fun requestFitnessPermissions_updatesPermissionState() {
         val permissions =
             arrayOf(
-                READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+            )
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
         viewModel.updateFitnessPermissions(true)
 
@@ -546,41 +1513,92 @@
                     fromPermissionString(READ_SLEEP) to PermissionState.GRANTED,
                     fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.NOT_GRANTED,
                     fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to
-                        PermissionState.NOT_GRANTED))
+                        PermissionState.NOT_GRANTED,
+                )
+            )
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalPermissions_updatesPermissionState() {
+        val permissions =
+            arrayOf(
+                READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                WRITE_MEDICAL_DATA,
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+            )
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+        viewModel.updateMedicalPermissions(true)
+
+        viewModel.requestMedicalPermissions(TEST_APP_PACKAGE_NAME)
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactly(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES, WRITE_MEDICAL_DATA)
+        assertThat(viewModel.getPermissionGrants())
+            .isEqualTo(
+                mutableMapOf(
+                    fromPermissionString(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES) to
+                        PermissionState.GRANTED,
+                    fromPermissionString(WRITE_MEDICAL_DATA) to PermissionState.GRANTED,
+                    fromPermissionString(READ_EXERCISE) to PermissionState.NOT_GRANTED,
+                    fromPermissionString(READ_SLEEP) to PermissionState.NOT_GRANTED,
+                    fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.NOT_GRANTED,
+                    fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to
+                        PermissionState.NOT_GRANTED,
+                )
+            )
     }
 
     @Test
     fun requestAdditionalPermissions_updatesPermissionState() {
-        val permissions =
-            arrayOf(
-                READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
-        viewModel.updateAdditionalPermissions(true)
-
-        viewModel.requestAdditionalPermissions(TEST_APP_PACKAGE_NAME)
-        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
-            .containsExactly(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
-        assertThat(viewModel.getPermissionGrants())
-            .isEqualTo(
-                mutableMapOf(
-                    fromPermissionString(READ_EXERCISE) to PermissionState.NOT_GRANTED,
-                    fromPermissionString(READ_SLEEP) to PermissionState.NOT_GRANTED,
-                    fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.GRANTED,
-                    fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to
-                        PermissionState.GRANTED))
-    }
-
-    @Test
-    fun requestAdditionalPermissions_skipsExerciseRoutePermission_updatesPermissionState() {
         (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
-            TEST_APP_PACKAGE_NAME, listOf(READ_EXERCISE_ROUTES))
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE),
+        )
         val permissions =
             arrayOf(
                 READ_EXERCISE,
                 READ_SLEEP,
                 READ_HEALTH_DATA_HISTORY,
                 READ_HEALTH_DATA_IN_BACKGROUND,
-                READ_EXERCISE_ROUTES)
+            )
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+        viewModel.updateAdditionalPermissions(true)
+
+        viewModel.requestAdditionalPermissions(TEST_APP_PACKAGE_NAME)
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactly(
+                READ_EXERCISE,
+                READ_HEALTH_DATA_HISTORY,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+            )
+        assertThat(viewModel.getPermissionGrants())
+            .isEqualTo(
+                mutableMapOf(
+                    fromPermissionString(READ_EXERCISE) to PermissionState.GRANTED,
+                    fromPermissionString(READ_SLEEP) to PermissionState.NOT_GRANTED,
+                    fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.GRANTED,
+                    fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to PermissionState.GRANTED,
+                )
+            )
+    }
+
+    @Test
+    fun requestAdditionalPermissions_skipsExerciseRoutePermission_updatesPermissionState() {
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE_ROUTES),
+        )
+        val permissions =
+            arrayOf(
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_EXERCISE_ROUTES,
+            )
         viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
         viewModel.updateAdditionalPermissions(false)
 
@@ -595,12 +1613,41 @@
                     fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.NOT_GRANTED,
                     fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to
                         PermissionState.NOT_GRANTED,
-                    fromPermissionString(READ_EXERCISE_ROUTES) to PermissionState.GRANTED))
+                    fromPermissionString(READ_EXERCISE_ROUTES) to PermissionState.GRANTED,
+                )
+            )
     }
 
     @Test
-    fun loadAccessDate_returnsCorrectAccessDate() {
-        assertThat(viewModel.loadAccessDate(TEST_APP_PACKAGE_NAME)).isEqualTo(NOW)
+    fun requestHealthPermissionsWithoutGrantingOrRevoking_doesNotUpdatePermissions() = runTest {
+        (permissionManager as FakeHealthPermissionManager).setGrantedPermissionsForTest(
+            TEST_APP_PACKAGE_NAME,
+            listOf(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY),
+        )
+        val permissions =
+            arrayOf(
+                READ_EXERCISE,
+                READ_SLEEP,
+                READ_HEALTH_DATA_HISTORY,
+                READ_HEALTH_DATA_IN_BACKGROUND,
+                READ_EXERCISE_ROUTES,
+            )
+        viewModel.init(TEST_APP_PACKAGE_NAME, permissions)
+
+        viewModel.updatePermissionGrants()
+        assertThat(permissionManager.getGrantedHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactly(READ_EXERCISE, READ_SLEEP, READ_HEALTH_DATA_HISTORY)
+        assertThat(viewModel.getPermissionGrants())
+            .isEqualTo(
+                mutableMapOf(
+                    fromPermissionString(READ_EXERCISE) to PermissionState.GRANTED,
+                    fromPermissionString(READ_SLEEP) to PermissionState.GRANTED,
+                    fromPermissionString(READ_HEALTH_DATA_HISTORY) to PermissionState.GRANTED,
+                    fromPermissionString(READ_HEALTH_DATA_IN_BACKGROUND) to
+                        PermissionState.NOT_GRANTED,
+                    fromPermissionString(READ_EXERCISE_ROUTES) to PermissionState.NOT_GRANTED,
+                )
+            )
     }
 
     @Test
@@ -608,13 +1655,18 @@
         val permissionFlags =
             mapOf(
                 READ_EXERCISE to PackageManager.FLAG_PERMISSION_USER_SET,
-                READ_SLEEP to PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT)
+                READ_SLEEP to PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT,
+            )
         (permissionManager as FakeHealthPermissionManager).setHealthPermissionFlags(
-            TEST_APP_PACKAGE_NAME, permissionFlags)
+            TEST_APP_PACKAGE_NAME,
+            permissionFlags,
+        )
 
         val result =
             viewModel.isAnyPermissionUserFixed(
-                TEST_APP_PACKAGE_NAME, arrayOf(READ_EXERCISE, READ_SLEEP))
+                TEST_APP_PACKAGE_NAME,
+                arrayOf(READ_EXERCISE, READ_SLEEP),
+            )
         assertThat(result).isFalse()
     }
 
@@ -623,13 +1675,58 @@
         val permissionFlags =
             mapOf(
                 READ_EXERCISE to PackageManager.FLAG_PERMISSION_USER_SET,
-                READ_SLEEP to PackageManager.FLAG_PERMISSION_USER_FIXED)
+                READ_SLEEP to PackageManager.FLAG_PERMISSION_USER_FIXED,
+            )
         (permissionManager as FakeHealthPermissionManager).setHealthPermissionFlags(
-            TEST_APP_PACKAGE_NAME, permissionFlags)
+            TEST_APP_PACKAGE_NAME,
+            permissionFlags,
+        )
 
         val result =
             viewModel.isAnyPermissionUserFixed(
-                TEST_APP_PACKAGE_NAME, arrayOf(READ_EXERCISE, READ_SLEEP))
+                TEST_APP_PACKAGE_NAME,
+                arrayOf(READ_EXERCISE, READ_SLEEP),
+            )
+        assertThat(result).isTrue()
+    }
+
+    @Test
+    fun isAnyPermissionUserFixed_whenNoPermissionUserFixed_andSomePermissionsNotDeclared_returnsFalse() {
+        val permissionFlags =
+            mapOf(
+                READ_EXERCISE to PackageManager.FLAG_PERMISSION_USER_SET,
+                READ_SLEEP to PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT,
+            )
+        (permissionManager as FakeHealthPermissionManager).setHealthPermissionFlags(
+            TEST_APP_PACKAGE_NAME,
+            permissionFlags,
+        )
+
+        val result =
+            viewModel.isAnyPermissionUserFixed(
+                TEST_APP_PACKAGE_NAME,
+                arrayOf(READ_EXERCISE, READ_SLEEP, READ_SKIN_TEMPERATURE),
+            )
+        assertThat(result).isFalse()
+    }
+
+    @Test
+    fun isAnyPermissionUserFixed_whenAtLeastOnePermissionIsUserFixed__andSomePermissionsNotDeclared_returnsTrue() {
+        val permissionFlags =
+            mapOf(
+                READ_EXERCISE to PackageManager.FLAG_PERMISSION_USER_SET,
+                READ_SLEEP to PackageManager.FLAG_PERMISSION_USER_FIXED,
+            )
+        (permissionManager as FakeHealthPermissionManager).setHealthPermissionFlags(
+            TEST_APP_PACKAGE_NAME,
+            permissionFlags,
+        )
+
+        val result =
+            viewModel.isAnyPermissionUserFixed(
+                TEST_APP_PACKAGE_NAME,
+                arrayOf(READ_EXERCISE, READ_SLEEP, WRITE_PLANNED_EXERCISE),
+            )
         assertThat(result).isTrue()
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/SingleAdditionalPermissionFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/SingleAdditionalPermissionFragmentTest.kt
new file mode 100644
index 0000000..b899c4d
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissions/request/SingleAdditionalPermissionFragmentTest.kt
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.healthconnect.controller.tests.permissions.request
+
+import androidx.core.os.bundleOf
+import androidx.lifecycle.MutableLiveData
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.healthconnect.controller.R
+import com.android.healthconnect.controller.permissions.request.AdditionalScreenState
+import com.android.healthconnect.controller.permissions.request.RequestPermissionViewModel
+import com.android.healthconnect.controller.permissions.request.SingleAdditionalPermissionFragment
+import com.android.healthconnect.controller.shared.app.AppMetadata
+import com.android.healthconnect.controller.tests.utils.NOW
+import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
+import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.launchFragment
+import com.android.healthconnect.controller.tests.utils.setLocale
+import com.android.healthconnect.controller.tests.utils.toggleAnimation
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
+import dagger.hilt.android.testing.BindValue
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import java.util.Locale
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.Mockito
+import org.mockito.Mockito.atLeast
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.whenever
+
+@ExperimentalCoroutinesApi
+@HiltAndroidTest
+class SingleAdditionalPermissionFragmentTest {
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    @BindValue
+    val viewModel: RequestPermissionViewModel = Mockito.mock(RequestPermissionViewModel::class.java)
+    @BindValue
+    val healthConnectLogger: HealthConnectLogger = Mockito.mock(HealthConnectLogger::class.java)
+
+    private lateinit var appMetadata: AppMetadata
+
+    @Before
+    fun setup() {
+        hiltRule.inject()
+        val context = InstrumentationRegistry.getInstrumentation().context
+        context.setLocale(Locale.US)
+        appMetadata =
+            AppMetadata(
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                context.getDrawable(R.drawable.health_connect_logo),
+            )
+
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(AdditionalScreenState.NoAdditionalData)
+        }
+        toggleAnimation(false)
+    }
+
+    @After
+    fun teardown() {
+        Mockito.reset(healthConnectLogger)
+        toggleAnimation(true)
+    }
+
+    @Test
+    fun requestHistory_whenNoMedicalDeclared_displaysCorrectText() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowHistory(
+                    appMetadata = appMetadata,
+                    hasMedical = false,
+                    isMedicalReadGranted = false,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+
+        launchFragment<SingleAdditionalPermissionFragment>(bundleOf())
+
+        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you allow, this app can access Health Connect data added before October 20, 2022."
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME can already access past data for your health records"))
+            .check(doesNotExist())
+
+        verify(healthConnectLogger, atLeast(1))
+            .setPageId(PageName.REQUEST_HISTORY_READ_PERMISSION_PAGE)
+        verify(healthConnectLogger, times(0))
+            .setPageId(PageName.REQUEST_BACKGROUND_READ_PERMISSION_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+    }
+
+    @Test
+    fun requestHistory_whenMedicalDeclared_displaysCorrectText() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowHistory(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = false,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+
+        launchFragment<SingleAdditionalPermissionFragment>(bundleOf())
+
+        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you allow, this app can access fitness and wellness data added before October 20, 2022."
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME can already access past data for your health records"))
+            .check(doesNotExist())
+    }
+
+    @Test
+    fun requestHistory_whenMedicalReadGranted_showsFooter() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowHistory(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    dataAccessDate = NOW,
+                )
+            )
+        }
+
+        launchFragment<SingleAdditionalPermissionFragment>(bundleOf())
+
+        onView(withText("Allow $TEST_APP_NAME to access past data?")).check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you allow, this app can access fitness and wellness data added before October 20, 2022."
+                )
+            )
+            .check(matches(isDisplayed()))
+        onView(withText("$TEST_APP_NAME can already access past data for your health records"))
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun requestBackground_whenNoMedicalDeclared_displaysCorrectText() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowBackground(
+                    appMetadata = appMetadata,
+                    hasMedical = false,
+                    isMedicalReadGranted = false,
+                    isFitnessReadGranted = true,
+                )
+            )
+        }
+
+        launchFragment<SingleAdditionalPermissionFragment>(bundleOf())
+        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you allow, this app can access Health Connect data when you're not using the app."
+                )
+            )
+            .check(matches(isDisplayed()))
+
+        verify(healthConnectLogger, atLeast(1))
+            .setPageId(PageName.REQUEST_BACKGROUND_READ_PERMISSION_PAGE)
+        verify(healthConnectLogger, times(0))
+            .setPageId(PageName.REQUEST_HISTORY_READ_PERMISSION_PAGE)
+        verify(healthConnectLogger).logPageImpression()
+    }
+
+    @Test
+    fun requestBackground_whenMedicalDeclared_whenFitnessReadGranted_displaysCorrectText() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowBackground(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = false,
+                    isFitnessReadGranted = true,
+                )
+            )
+        }
+
+        launchFragment<SingleAdditionalPermissionFragment>(bundleOf())
+        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you allow, this app can access fitness and wellness data when you're not using the app."
+                )
+            )
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun requestBackground_whenMedicalDeclaredAndReadGranted_displaysCorrectText() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowBackground(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    isFitnessReadGranted = false,
+                )
+            )
+        }
+
+        launchFragment<SingleAdditionalPermissionFragment>(bundleOf())
+        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you allow, this app can access health records when you're not using the app."
+                )
+            )
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun requestBackground_whenMedicalDeclared_whenFitnessAndMedicalReadGranted_displaysCorrectText() {
+        whenever(viewModel.additionalScreenState).then {
+            MutableLiveData(
+                AdditionalScreenState.ShowBackground(
+                    appMetadata = appMetadata,
+                    hasMedical = true,
+                    isMedicalReadGranted = true,
+                    isFitnessReadGranted = true,
+                )
+            )
+        }
+
+        launchFragment<SingleAdditionalPermissionFragment>(bundleOf())
+        onView(withText("Allow $TEST_APP_NAME to access data in the background?"))
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "If you allow, this app can access fitness and wellness data and health records when you're not using the app."
+                )
+            )
+            .check(matches(isDisplayed()))
+    }
+
+    // TODO
+    // requestMultipleAdditionalPermissions_showsCombinedFragment()
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissiontypes/FitnessPermissionTypesFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissiontypes/FitnessPermissionTypesFragmentTest.kt
index 69edefe..0b21c23 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissiontypes/FitnessPermissionTypesFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissiontypes/FitnessPermissionTypesFragmentTest.kt
@@ -41,8 +41,6 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_2
 import com.android.healthconnect.controller.tests.utils.TEST_APP_3
 import com.android.healthconnect.controller.tests.utils.launchFragment
-import com.android.healthconnect.controller.tests.utils.whenever
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthconnect.controller.utils.logging.DeletionDialogTimeRangeElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.PageName
@@ -51,7 +49,6 @@
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
-import javax.inject.Inject
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
@@ -62,12 +59,12 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class FitnessPermissionTypesFragmentTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
     private lateinit var context: Context
     private lateinit var navHostController: TestNavHostController
 
@@ -107,19 +104,21 @@
 
     @Test
     fun deletePermissionTypeData_showsDialog() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
                 PermissionTypesState.WithData(
                     listOf(
                         FitnessPermissionType.DISTANCE,
                         FitnessPermissionType.EXERCISE,
                         FitnessPermissionType.STEPS,
-                    )))
+                    )
+                )
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(activityCategoryBundle())
 
         onView(withText("Delete activity data")).check(matches(isDisplayed()))
@@ -131,13 +130,16 @@
             .logImpression(DeletionDialogTimeRangeElement.DELETION_DIALOG_TIME_RANGE_CONTAINER)
         verify(healthConnectLogger)
             .logImpression(
-                DeletionDialogTimeRangeElement.DELETION_DIALOG_TIME_RANGE_LAST_7_DAYS_BUTTON)
+                DeletionDialogTimeRangeElement.DELETION_DIALOG_TIME_RANGE_LAST_7_DAYS_BUTTON
+            )
         verify(healthConnectLogger)
             .logImpression(
-                DeletionDialogTimeRangeElement.DELETION_DIALOG_TIME_RANGE_LAST_24_HOURS_BUTTON)
+                DeletionDialogTimeRangeElement.DELETION_DIALOG_TIME_RANGE_LAST_24_HOURS_BUTTON
+            )
         verify(healthConnectLogger)
             .logImpression(
-                DeletionDialogTimeRangeElement.DELETION_DIALOG_TIME_RANGE_LAST_30_DAYS_BUTTON)
+                DeletionDialogTimeRangeElement.DELETION_DIALOG_TIME_RANGE_LAST_30_DAYS_BUTTON
+            )
         verify(healthConnectLogger)
             .logImpression(DeletionDialogTimeRangeElement.DELETION_DIALOG_TIME_RANGE_NEXT_BUTTON)
         verify(healthConnectLogger)
@@ -146,19 +148,21 @@
 
     @Test
     fun permissionTypesFragment_activityCategory_isDisplayed() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
                 PermissionTypesState.WithData(
                     listOf(
                         FitnessPermissionType.DISTANCE,
                         FitnessPermissionType.EXERCISE,
                         FitnessPermissionType.STEPS,
-                    )))
+                    )
+                )
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(activityCategoryBundle())
 
         onView(withText("Active calories burned")).check(doesNotExist())
@@ -189,7 +193,8 @@
     fun permissionTypesFragment_activityCategory_trainingPlansAvailable_isDisplayed() {
         whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
-                PermissionTypesState.WithData(listOf(FitnessPermissionType.PLANNED_EXERCISE)))
+                PermissionTypesState.WithData(listOf(FitnessPermissionType.PLANNED_EXERCISE))
+            )
         }
         whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
@@ -211,14 +216,15 @@
 
     @Test
     fun permissionTypesFragment_sleepCategory_isDisplayed() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
-                PermissionTypesState.WithData(listOf(FitnessPermissionType.SLEEP)))
+                PermissionTypesState.WithData(listOf(FitnessPermissionType.SLEEP))
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(sleepCategoryBundle())
 
         onView(withText("Manage data")).check(matches(isDisplayed()))
@@ -228,20 +234,23 @@
 
     @Test
     fun permissionTypesFragment_withTwoOrMoreContributingApps_appFilters_areDisplayed() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
                 PermissionTypesState.WithData(
                     listOf(
                         FitnessPermissionType.DISTANCE,
                         FitnessPermissionType.EXERCISE,
                         FitnessPermissionType.STEPS,
-                    )))
+                    )
+                )
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(
-                AppsWithDataFragmentState.WithData(listOf(TEST_APP, TEST_APP_2)))
+                AppsWithDataFragmentState.WithData(listOf(TEST_APP, TEST_APP_2))
+            )
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("All apps") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("All apps") }
         launchFragment<HealthPermissionTypesFragment>(activityCategoryBundle())
 
         onView(withText("All apps")).check(matches(isDisplayed()))
@@ -255,16 +264,19 @@
 
     @Test
     fun permissionTypesFragment_withLessThanTwoContributingApps_appFilters_areNotDisplayed() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
                 PermissionTypesState.WithData(
-                    listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.EXERCISE)))
+                    listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.EXERCISE)
+                )
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(
-                AppsWithDataFragmentState.WithData(listOf(TEST_APP_3)))
+                AppsWithDataFragmentState.WithData(listOf(TEST_APP_3))
+            )
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("All apps") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("All apps") }
         launchFragment<HealthPermissionTypesFragment>(activityCategoryBundle())
 
         onView(withText("All apps")).check(doesNotExist())
@@ -273,16 +285,19 @@
 
     @Test
     fun permissionTypesFragment_appFilters_areSelectableCorrectly() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
                 PermissionTypesState.WithData(
-                    listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.EXERCISE)))
+                    listOf(FitnessPermissionType.DISTANCE, FitnessPermissionType.EXERCISE)
+                )
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(
-                AppsWithDataFragmentState.WithData(listOf(TEST_APP, TEST_APP_3)))
+                AppsWithDataFragmentState.WithData(listOf(TEST_APP, TEST_APP_3))
+            )
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("All apps") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("All apps") }
         launchFragment<HealthPermissionTypesFragment>(activityCategoryBundle())
 
         onView(withText(TEST_APP_3.appName)).perform(scrollTo(), click())
@@ -292,19 +307,21 @@
 
     @Test
     fun permissionTypesFragment_activityCategory_showsNewAppPriorityButton() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
                 PermissionTypesState.WithData(
                     listOf(
                         FitnessPermissionType.DISTANCE,
                         FitnessPermissionType.EXERCISE,
                         FitnessPermissionType.STEPS,
-                    )))
+                    )
+                )
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(activityCategoryBundle())
 
         onView(withText("Active calories burned")).check(doesNotExist())
@@ -327,14 +344,15 @@
 
     @Test
     fun permissionTypesFragment_sleepCategory_showsNewAppPriorityButton() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
-                PermissionTypesState.WithData(listOf(FitnessPermissionType.SLEEP)))
+                PermissionTypesState.WithData(listOf(FitnessPermissionType.SLEEP))
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(sleepCategoryBundle())
 
         onView(withText("Manage data")).check(matches(isDisplayed()))
@@ -344,19 +362,21 @@
 
     @Test
     fun permissionTypesFragment_whenBodyMeasurementsCategory_doesNotShowPriorityButton() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
                 PermissionTypesState.WithData(
                     listOf(
                         FitnessPermissionType.BASAL_METABOLIC_RATE,
                         FitnessPermissionType.BODY_FAT,
                         FitnessPermissionType.HEIGHT,
-                    )))
+                    )
+                )
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(bodyMeasurementsCategoryBundle())
 
         onView(withText("Data sources and priority")).check(doesNotExist())
@@ -364,14 +384,15 @@
 
     @Test
     fun permissionTypesFragment_whenCycleTrackingCategory_doesNotShowPriorityButton() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
-                PermissionTypesState.WithData(listOf(FitnessPermissionType.MENSTRUATION)))
+                PermissionTypesState.WithData(listOf(FitnessPermissionType.MENSTRUATION))
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(cycleCategoryBundle())
 
         onView(withText("Data sources and priority")).check(doesNotExist())
@@ -379,14 +400,15 @@
 
     @Test
     fun permissionTypesFragment_whenNutritionCategory_doesNotShowPriorityButton() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
-                PermissionTypesState.WithData(listOf(FitnessPermissionType.NUTRITION)))
+                PermissionTypesState.WithData(listOf(FitnessPermissionType.NUTRITION))
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(nutritionCategoryBundle())
 
         onView(withText("Data sources and priority")).check(doesNotExist())
@@ -394,14 +416,15 @@
 
     @Test
     fun permissionTypesFragment_whenVitalsCategory_doesNotShowPriorityButton() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
-                PermissionTypesState.WithData(listOf(FitnessPermissionType.HEART_RATE)))
+                PermissionTypesState.WithData(listOf(FitnessPermissionType.HEART_RATE))
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(vitalsCategoryBundle())
 
         onView(withText("Data sources and priority")).check(doesNotExist())
@@ -416,7 +439,9 @@
     private fun bodyMeasurementsCategoryBundle(): Bundle {
         val bundle = Bundle()
         bundle.putInt(
-            HealthDataCategoriesFragment.CATEGORY_KEY, HealthDataCategory.BODY_MEASUREMENTS)
+            HealthDataCategoriesFragment.CATEGORY_KEY,
+            HealthDataCategory.BODY_MEASUREMENTS,
+        )
         return bundle
     }
 
@@ -445,19 +470,21 @@
     }
 
     private fun setupFragmentForNavigationTesting() {
-        Mockito.`when`(viewModel.permissionTypesData).then {
+        whenever(viewModel.permissionTypesData).then {
             MutableLiveData<PermissionTypesState>(
                 PermissionTypesState.WithData(
                     listOf(
                         FitnessPermissionType.DISTANCE,
                         FitnessPermissionType.EXERCISE,
                         FitnessPermissionType.STEPS,
-                    )))
+                    )
+                )
+            )
         }
-        Mockito.`when`(viewModel.appsWithData).then {
+        whenever(viewModel.appsWithData).then {
             MutableLiveData<AppsWithDataFragmentState>(AppsWithDataFragmentState.WithData(listOf()))
         }
-        Mockito.`when`(viewModel.selectedAppFilter).then { MutableLiveData("") }
+        whenever(viewModel.selectedAppFilter).then { MutableLiveData("") }
         launchFragment<HealthPermissionTypesFragment>(activityCategoryBundle()) {
             navHostController.setGraph(R.navigation.data_nav_graph)
             navHostController.setCurrentDestination(R.id.healthPermissionTypesFragment)
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/permissiontypes/api/LoadPriorityListUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/permissiontypes/api/LoadPriorityListUseCaseTest.kt
index 75dbf0b..3e0f384 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/permissiontypes/api/LoadPriorityListUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/permissiontypes/api/LoadPriorityListUseCaseTest.kt
@@ -25,6 +25,7 @@
 import org.mockito.Matchers
 import org.mockito.Mockito
 import org.mockito.invocation.InvocationOnMock
+import org.mockito.kotlin.eq
 
 @ExperimentalCoroutinesApi
 @HiltAndroidTest
@@ -49,12 +50,18 @@
         val dataOriginsPriorityOrderResponse =
             FetchDataOriginsPriorityOrderResponse(
                 mutableListOf(
-                    getDataOrigin(TEST_APP_PACKAGE_NAME), getDataOrigin(TEST_APP_PACKAGE_NAME_2)))
+                    getDataOrigin(TEST_APP_PACKAGE_NAME),
+                    getDataOrigin(TEST_APP_PACKAGE_NAME_2),
+                )
+            )
 
         Mockito.doAnswer(prepareAnswer(dataOriginsPriorityOrderResponse))
             .`when`(manager)
             .fetchDataOriginsPriorityOrder(
-                Matchers.eq(HealthDataCategory.ACTIVITY), Matchers.any(), Matchers.any())
+                eq(HealthDataCategory.ACTIVITY),
+                Matchers.any(),
+                Matchers.any(),
+            )
 
         val loadedAppsPriorityList = usecase.execute(HealthDataCategory.ACTIVITY)
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/recentaccess/RecentAccessFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/recentaccess/RecentAccessFragmentTest.kt
index 0e5720a..5cdcf28 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/recentaccess/RecentAccessFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/recentaccess/RecentAccessFragmentTest.kt
@@ -53,6 +53,7 @@
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 import java.time.Instant
 import java.time.ZoneId
 import java.util.*
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/recentaccess/RecentAccessViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/recentaccess/RecentAccessViewModelTest.kt
index a0bbf97..3902208 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/recentaccess/RecentAccessViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/recentaccess/RecentAccessViewModelTest.kt
@@ -18,12 +18,11 @@
 import android.health.connect.Constants
 import android.health.connect.accesslog.AccessLog
 import android.health.connect.datatypes.BasalMetabolicRateRecord
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
 import android.health.connect.datatypes.RecordTypeIdentifier
 import android.health.connect.datatypes.StepsRecord
 import android.health.connect.datatypes.WeightRecord
-import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import android.platform.test.flag.junit.SetFlagsRule
 import com.android.healthconnect.controller.R
@@ -44,10 +43,8 @@
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_2
 import com.android.healthconnect.controller.tests.utils.TestObserver
 import com.android.healthconnect.controller.tests.utils.TestTimeSource
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
 import com.android.healthconnect.controller.tests.utils.di.FakeHealthPermissionAppsUseCase
 import com.android.healthconnect.controller.tests.utils.di.FakeRecentAccessUseCase
-import com.android.healthconnect.controller.utils.FeatureUtils
 import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
@@ -71,15 +68,14 @@
 @HiltAndroidTest
 class RecentAccessViewModelTest {
 
-    @get:Rule val setFlagsRule = SetFlagsRule()
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
 
     @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
     private val testDispatcher = UnconfinedTestDispatcher()
 
     @Inject lateinit var appInfoReader: AppInfoReader
     @Inject lateinit var healthPermissionReader: HealthPermissionReader
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
 
     private val timeSource = TestTimeSource
     private val fakeRecentAccessUseCase = FakeRecentAccessUseCase()
@@ -537,10 +533,9 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun loadRecentAccessApps_medicalPermissionsEnabled_returnsCorrectAppPermissionsType() =
         runTest {
-            (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-
             val packageName = TEST_APP_PACKAGE_NAME
 
             val time1 = MIDNIGHT.plusSeconds(60)
@@ -788,117 +783,7 @@
         assertRecentAccessEquality(actual, expected)
     }
 
-    @DisableFlags(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun loadRecentAccessApps_mindfulness_flagDisabled() = runTest {
-        val packageName = TEST_APP_PACKAGE_NAME
-
-        val accessTime = Instant.ofEpochMilli(timeSource.currentTimeMillis()).minusSeconds(1)
-        val accessLogs =
-            listOf(
-                    AccessLog(
-                        packageName,
-                        listOf(RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION),
-                        accessTime.toEpochMilli(),
-                        Constants.UPSERT,
-                    ),
-                    AccessLog(
-                        packageName,
-                        listOf(RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION),
-                        accessTime.toEpochMilli(),
-                        Constants.READ,
-                    ),
-                    AccessLog(
-                        packageName,
-                        listOf(RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION),
-                        accessTime.toEpochMilli(),
-                        Constants.DELETE,
-                    ),
-                )
-                .sortedByDescending { it.accessTime }
-
-        fakeRecentAccessUseCase.updateList(accessLogs)
-        val testObserver = TestObserver<RecentAccessState>()
-        viewModel.recentAccessApps.observeForever(testObserver)
-        viewModel.loadRecentAccessApps()
-        advanceUntilIdle()
-
-        val actual = testObserver.getLastValue()
-        val expected =
-            listOf(
-                RecentAccessEntry(
-                    metadata = TEST_APP,
-                    instantTime = accessTime,
-                    isToday = true,
-                    dataTypesWritten = mutableSetOf(),
-                    dataTypesRead = mutableSetOf(),
-                )
-            )
-        assertRecentAccessEquality(actual, expected)
-    }
-
-    @DisableFlags(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun loadRecentAccessApps_mindfulness_withOtherDataTypes_flagDisabled() = runTest {
-        val packageName = TEST_APP_PACKAGE_NAME
-
-        val accessTime = Instant.ofEpochMilli(timeSource.currentTimeMillis()).minusSeconds(1)
-        val accessLogs =
-            listOf(
-                    AccessLog(
-                        packageName,
-                        listOf(RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION),
-                        accessTime.toEpochMilli(),
-                        Constants.UPSERT,
-                    ),
-                    AccessLog(
-                        packageName,
-                        listOf(RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION),
-                        accessTime.toEpochMilli(),
-                        Constants.UPSERT,
-                    ),
-                    AccessLog(
-                        packageName,
-                        listOf(RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION),
-                        accessTime.toEpochMilli(),
-                        Constants.READ,
-                    ),
-                    AccessLog(
-                        packageName,
-                        listOf(RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION),
-                        accessTime.toEpochMilli(),
-                        Constants.DELETE,
-                    ),
-                    AccessLog(
-                        packageName,
-                        listOf(RecordTypeIdentifier.RECORD_TYPE_NUTRITION),
-                        accessTime.toEpochMilli(),
-                        Constants.READ,
-                    ),
-                )
-                .sortedByDescending { it.accessTime }
-
-        fakeRecentAccessUseCase.updateList(accessLogs)
-        val testObserver = TestObserver<RecentAccessState>()
-        viewModel.recentAccessApps.observeForever(testObserver)
-        viewModel.loadRecentAccessApps()
-        advanceUntilIdle()
-
-        val actual = testObserver.getLastValue()
-        val expected =
-            listOf(
-                RecentAccessEntry(
-                    metadata = TEST_APP,
-                    instantTime = accessTime,
-                    isToday = true,
-                    dataTypesWritten = mutableSetOf(R.string.activity_category_uppercase),
-                    dataTypesRead = mutableSetOf(R.string.nutrition_category_uppercase),
-                )
-            )
-        assertRecentAccessEquality(actual, expected)
-    }
-
-    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     @Test
     fun loadRecentAccessApps_healthRecords_read() = runTest {
         val packageName = TEST_APP_PACKAGE_NAME
@@ -911,8 +796,8 @@
                         accessTime.toEpochMilli(),
                         Constants.READ,
                         setOf(
-                            MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                            MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
+                            MEDICAL_RESOURCE_TYPE_VACCINES,
+                            MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
                         ),
                         true,
                     )
@@ -939,7 +824,7 @@
         assertRecentAccessEquality(actual, expected)
     }
 
-    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     @Test
     fun loadRecentAccessApps_healthRecords_upsert() = runTest {
         val packageName = TEST_APP_PACKAGE_NAME
@@ -952,8 +837,8 @@
                         accessTime.toEpochMilli(),
                         Constants.UPSERT,
                         setOf(
-                            MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                            MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
+                            MEDICAL_RESOURCE_TYPE_VACCINES,
+                            MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
                         ),
                         true,
                     )
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/route/RouteRequestActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/route/RouteRequestActivityTest.kt
index 00031a5..af68f8e 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/route/RouteRequestActivityTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/route/RouteRequestActivityTest.kt
@@ -54,7 +54,6 @@
 import com.android.healthconnect.controller.tests.utils.getMetaData
 import com.android.healthconnect.controller.tests.utils.setLocale
 import com.android.healthconnect.controller.tests.utils.toggleAnimation
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.logging.DataRestoreElement
 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
 import com.android.healthconnect.controller.utils.logging.MigrationElement
@@ -78,6 +77,7 @@
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.reset
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @ExperimentalCoroutinesApi
 @HiltAndroidTest
@@ -89,7 +89,8 @@
                 getMetaData(),
                 START,
                 START.plusMillis(123456),
-                ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING)
+                ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING,
+            )
             .setTitle("Session title")
             .setRoute(
                 ExerciseRoute(
@@ -120,7 +121,9 @@
                             .build(),
                         ExerciseRoute.Location.Builder(START.plusSeconds(109), 52.25954, 21.02354)
                             .build(),
-                    )))
+                    )
+                )
+            )
             .build()
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
@@ -144,7 +147,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
 
         whenever(viewModel.isReadRoutesPermissionDeclared(context.packageName)).thenReturn(true)
@@ -209,11 +215,14 @@
                             getMetaData(),
                             START,
                             START.plusMillis(123456),
-                            ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING)
+                            ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING,
+                        )
                         .setTitle("Session title")
                         .setRoute(ExerciseRoute(listOf()))
                         .build(),
-                    TEST_APP))
+                    TEST_APP,
+                )
+            )
         }
 
         val scenario = launchActivityForResult<RouteRequestActivity>(startActivityIntent)
@@ -234,11 +243,14 @@
                             getMetaData(),
                             START,
                             START.plusMillis(123456),
-                            ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING)
+                            ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING,
+                        )
                         .setTitle("Session title")
                         .setRoute(ExerciseRoute(listOf()))
                         .build(),
-                    TEST_APP))
+                    TEST_APP,
+                )
+            )
         }
 
         val scenario = launchActivityForResult<RouteRequestActivity>(startActivityIntent)
@@ -306,18 +318,30 @@
                             getMetaData(),
                             START,
                             START.plusMillis(123456),
-                            ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING)
+                            ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING,
+                        )
                         .setRoute(
                             ExerciseRoute(
                                 listOf(
                                     ExerciseRoute.Location.Builder(
-                                            START.plusSeconds(12), 52.26019, 21.02268)
+                                            START.plusSeconds(12),
+                                            52.26019,
+                                            21.02268,
+                                        )
                                         .build(),
                                     ExerciseRoute.Location.Builder(
-                                            START.plusSeconds(40), 52.26000, 21.02360)
-                                        .build())))
+                                            START.plusSeconds(40),
+                                            52.26000,
+                                            21.02360,
+                                        )
+                                        .build(),
+                                )
+                            )
+                        )
                         .build(),
-                    TEST_APP))
+                    TEST_APP,
+                )
+            )
         }
 
         launchActivityForResult<RouteRequestActivity>(startActivityIntent)
@@ -455,7 +479,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IN_PROGRESS,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -463,7 +488,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IN_PROGRESS,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val startActivityIntent = getRouteActivityIntent()
 
@@ -474,7 +502,9 @@
         val scenario = launchActivityForResult<RouteRequestActivity>(startActivityIntent)
         onView(
                 withText(
-                    "Health Connect is being integrated with the Android system.\n\nYou'll get a notification when the process is complete and you can use Health Connect with Health Connect."))
+                    "Health Connect is being integrated with the Android system.\n\nYou'll get a notification when the process is complete and you can use Health Connect with Health Connect."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -499,7 +529,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.IDLE,
                 dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -507,7 +538,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.IDLE,
                         dataRestoreState = DataRestoreUiState.IN_PROGRESS,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val startActivityIntent = getRouteActivityIntent()
 
@@ -522,7 +556,9 @@
             .check(matches(isDisplayed()))
         onView(
                 withText(
-                    "Health Connect is restoring data and permissions. This may take some time to complete."))
+                    "Health Connect is restoring data and permissions. This may take some time to complete."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(withText("Got it")).inRoot(isDialog()).check(matches(isDisplayed()))
@@ -546,7 +582,8 @@
             MigrationRestoreState(
                 migrationUiState = MigrationUiState.APP_UPGRADE_REQUIRED,
                 dataRestoreState = DataRestoreUiState.IDLE,
-                dataRestoreError = DataRestoreUiError.ERROR_NONE)
+                dataRestoreError = DataRestoreUiError.ERROR_NONE,
+            )
         }
         whenever(migrationViewModel.migrationState).then {
             MutableLiveData(
@@ -554,7 +591,10 @@
                     MigrationRestoreState(
                         migrationUiState = MigrationUiState.APP_UPGRADE_REQUIRED,
                         dataRestoreState = DataRestoreUiState.IDLE,
-                        dataRestoreError = DataRestoreUiError.ERROR_NONE)))
+                        dataRestoreError = DataRestoreUiError.ERROR_NONE,
+                    )
+                )
+            )
         }
         val startActivityIntent = getRouteActivityIntent()
 
@@ -566,7 +606,9 @@
 
         onView(
                 withText(
-                    "Health Connect is ready to be integrated with your Android system. If you give Health Connect access now, some features may not work until integration is complete."))
+                    "Health Connect is ready to be integrated with your Android system. If you give Health Connect access now, some features may not work until integration is complete."
+                )
+            )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         // TODO (b/322495982) check navigation to Migration activity
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/safetycenter/HealthConnectSafetySourceTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/safetycenter/HealthConnectSafetySourceTest.kt
index 0aa87e3..0c07a12 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/safetycenter/HealthConnectSafetySourceTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/safetycenter/HealthConnectSafetySourceTest.kt
@@ -29,29 +29,26 @@
 import com.android.healthconnect.controller.safetycenter.HealthConnectSafetySource
 import com.android.healthconnect.controller.safetycenter.HealthConnectSafetySource.Companion.HEALTH_CONNECT_SOURCE_ID
 import com.android.healthconnect.controller.safetycenter.SafetyCenterManagerWrapper
-import com.android.healthconnect.controller.utils.FeatureUtils
 import org.junit.Before
 import org.junit.Test
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.never
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when` as whenever
+import org.mockito.kotlin.whenever
 
 class HealthConnectSafetySourceTest {
 
-    private val mockFeatureUtils = mock(FeatureUtils::class.java)
     private val mockSafetyCenterManagerWrapper = mock(SafetyCenterManagerWrapper::class.java)
     private lateinit var safetySource: HealthConnectSafetySource
     private lateinit var context: Context
 
     @Before
     fun setup() {
-        safetySource = HealthConnectSafetySource(mockFeatureUtils, mockSafetyCenterManagerWrapper)
+        safetySource = HealthConnectSafetySource(mockSafetyCenterManagerWrapper)
         context = InstrumentationRegistry.getInstrumentation().context
 
         whenever(mockSafetyCenterManagerWrapper.isEnabled(context)).thenReturn(true)
-        whenever(mockFeatureUtils.isEntryPointsEnabled()).thenReturn(true)
     }
 
     @Test
@@ -65,17 +62,6 @@
     }
 
     @Test
-    fun setSafetySourceData_whenEntryPointsIsDisabled_setsNullData() {
-        whenever(mockFeatureUtils.isEntryPointsEnabled()).thenReturn(false)
-
-        safetySource.setSafetySourceData(context, EVENT_SOURCE_STATE_CHANGED)
-
-        verify(mockSafetyCenterManagerWrapper, times(1))
-            .setSafetySourceData(
-                context, HEALTH_CONNECT_SOURCE_ID, null, EVENT_SOURCE_STATE_CHANGED)
-    }
-
-    @Test
     fun setSafetySourceData_setsData() {
         safetySource.setSafetySourceData(context, EVENT_SOURCE_STATE_CHANGED)
 
@@ -85,19 +71,27 @@
                     SafetySourceStatus.Builder(
                             HEALTH_CONNECT_TITLE,
                             HEALTH_CONNECT_SUMMARY,
-                            SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED)
+                            SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED,
+                        )
                         .setPendingIntent(
                             PendingIntent.getActivity(
                                 context,
                                 /* requestCode= */ 0,
                                 Intent(HEALTH_CONNECT_INTENT_ACTION),
-                                FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE))
-                        .build())
+                                FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE,
+                            )
+                        )
+                        .build()
+                )
                 .build()
 
         verify(mockSafetyCenterManagerWrapper, times(1))
             .setSafetySourceData(
-                context, HEALTH_CONNECT_SOURCE_ID, expectedData, EVENT_SOURCE_STATE_CHANGED)
+                context,
+                HEALTH_CONNECT_SOURCE_ID,
+                expectedData,
+                EVENT_SOURCE_STATE_CHANGED,
+            )
     }
 
     private fun <T> any(): T {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/safetycenter/SafetyCenterManagerWrapperTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/safetycenter/SafetyCenterManagerWrapperTest.kt
index 78720c5..c0493b6 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/safetycenter/SafetyCenterManagerWrapperTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/safetycenter/SafetyCenterManagerWrapperTest.kt
@@ -28,8 +28,8 @@
 import org.junit.Before
 import org.junit.Test
 import org.mockito.Mockito
-import org.mockito.Mockito.`when` as whenever
 import org.mockito.MockitoAnnotations.initMocks
+import org.mockito.kotlin.whenever
 
 class SafetyCenterManagerWrapperTest {
 
@@ -67,8 +67,10 @@
                     SafetySourceStatus.Builder(
                             HEALTH_CONNECT_TITLE,
                             HEALTH_CONNECT_SUMMARY,
-                            SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED)
-                        .build())
+                            SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED,
+                        )
+                        .build()
+                )
                 .build()
 
         val safetyEvent =
@@ -77,7 +79,11 @@
                 .build()
 
         wrapper.setSafetySourceData(
-            mockContext, HEALTH_CONNECT_SOURCE_ID, safetySourceData, safetyEvent)
+            mockContext,
+            HEALTH_CONNECT_SOURCE_ID,
+            safetySourceData,
+            safetyEvent,
+        )
 
         Mockito.verify(mockSafetyCenterManager)
             .setSafetySourceData(HEALTH_CONNECT_SOURCE_ID, safetySourceData, safetyEvent)
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/DeletionFragmentTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/DeletionFragmentTest.kt
index 8886ae7..d9d2348 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/DeletionFragmentTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/DeletionFragmentTest.kt
@@ -16,6 +16,8 @@
 package com.android.healthconnect.controller.tests.selectabledeletion
 
 import android.content.Context
+import android.health.connect.datatypes.StepsCadenceRecord
+import android.health.connect.datatypes.StepsRecord
 import android.os.Bundle
 import androidx.core.os.bundleOf
 import androidx.lifecycle.MutableLiveData
@@ -33,28 +35,32 @@
 import com.android.healthconnect.controller.selectabledeletion.DeletionFragment
 import com.android.healthconnect.controller.selectabledeletion.DeletionType
 import com.android.healthconnect.controller.selectabledeletion.DeletionViewModel
-import com.android.healthconnect.controller.shared.DataType
+import com.android.healthconnect.controller.tests.utils.ClearTimeFormatRule
 import com.android.healthconnect.controller.tests.utils.TEST_APP_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.TestTimeSource
 import com.android.healthconnect.controller.tests.utils.launchFragment
 import com.android.healthconnect.controller.tests.utils.setLocale
-import com.android.healthconnect.controller.tests.utils.whenever
 import com.android.healthconnect.controller.utils.TimeSource
 import dagger.hilt.android.testing.BindValue
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import java.time.Instant
+import java.time.ZoneId
 import java.util.Locale
+import java.util.TimeZone
 import javax.inject.Inject
+import org.hamcrest.Matchers.not
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class DeletionFragmentTest {
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val clearTimeFormatRule = ClearTimeFormatRule()
 
     @BindValue val viewModel: DeletionViewModel = Mockito.mock(DeletionViewModel::class.java)
     private lateinit var context: Context
@@ -71,6 +77,8 @@
                 totalPermissionTypes = 10,
             )
         }
+        whenever(viewModel.removePermissions).thenReturn(false)
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
     }
 
     // region DeletePermissionTypes
@@ -203,6 +211,8 @@
             )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
+        onView(withText("Also remove all $TEST_APP_NAME permissions from Health Connect"))
+            .check(matches(not(isDisplayed())))
         onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
         onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
     }
@@ -237,6 +247,8 @@
             )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
+        onView(withText("Also remove all $TEST_APP_NAME permissions from Health Connect"))
+            .check(matches(not(isDisplayed())))
         onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
         onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
     }
@@ -271,6 +283,8 @@
             )
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
+        onView(withText("Also remove all $TEST_APP_NAME permissions from Health Connect"))
+            .check(matches(isDisplayed()))
         onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
         onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
     }
@@ -289,7 +303,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS),
+                mapOf("test_id_1" to StepsRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_DAY,
                 startTime = selectedDay,
@@ -326,7 +340,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_DAY,
                 startTime = selectedDay,
@@ -363,7 +377,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_DAY,
                 startTime = selectedDay,
@@ -400,7 +414,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 2,
                 period = DateNavigationPeriod.PERIOD_DAY,
                 startTime = selectedDay,
@@ -437,7 +451,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 2,
                 period = DateNavigationPeriod.PERIOD_DAY,
                 startTime = selectedDay,
@@ -477,7 +491,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS),
+                mapOf("test_id_1" to StepsRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_WEEK,
                 startTime = selectedDay,
@@ -507,6 +521,8 @@
     @Test
     fun deleteEntries_fromWeekWithinYear_someSelected_confirmationDialog_showsCorrectText() {
         val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        // This date is on a Monday. The dialog should show the current week range,
+        // which starts on this Monday
         val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
         (testTimeSource as TestTimeSource).setNow(now)
         whenever(viewModel.deletionProgress).then {
@@ -514,7 +530,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_WEEK,
                 startTime = selectedDay,
@@ -527,7 +543,7 @@
                 .setFragmentResult(START_DELETION_KEY, bundleOf())
         }
 
-        onView(withText("Permanently delete selected entries for the week of Sep 19 – 26?"))
+        onView(withText("Permanently delete selected entries for the week of Sep 19 – 25?"))
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(
@@ -544,6 +560,8 @@
     @Test
     fun deleteEntries_fromWeekPastYear_someSelected_confirmationDialog_showsCorrectText() {
         val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        // This date is on a Sunday. The dialog should show the current week range,
+        // which ends on this Sunday
         val selectedDay = Instant.parse("2021-09-19T20:00:00.000Z")
         (testTimeSource as TestTimeSource).setNow(now)
         whenever(viewModel.deletionProgress).then {
@@ -551,7 +569,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_WEEK,
                 startTime = selectedDay,
@@ -564,7 +582,7 @@
                 .setFragmentResult(START_DELETION_KEY, bundleOf())
         }
 
-        onView(withText("Permanently delete selected entries for the week of Sep 19 – 26, 2021?"))
+        onView(withText("Permanently delete selected entries for the week of Sep 13 – 19, 2021?"))
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(
@@ -581,6 +599,8 @@
     @Test
     fun deleteEntries_fromWeekWithinYear_allSelected_confirmationDialog_showsCorrectText() {
         val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        // This date is on a Monday. The dialog should show the current week range,
+        // which starts on this Monday
         val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
         (testTimeSource as TestTimeSource).setNow(now)
         whenever(viewModel.deletionProgress).then {
@@ -588,7 +608,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 2,
                 period = DateNavigationPeriod.PERIOD_WEEK,
                 startTime = selectedDay,
@@ -601,7 +621,7 @@
                 .setFragmentResult(START_DELETION_KEY, bundleOf())
         }
 
-        onView(withText("Permanently delete all entries for the week of Sep 19 – 26?"))
+        onView(withText("Permanently delete all entries for the week of Sep 19 – 25?"))
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(
@@ -618,6 +638,8 @@
     @Test
     fun deleteEntries_fromWeekPastYear_allSelected_confirmationDialog_showsCorrectText() {
         val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        // This date is on a Sunday. The dialog should show the current week range,
+        // which ends on this Sunday
         val selectedDay = Instant.parse("2021-09-19T20:00:00.000Z")
         (testTimeSource as TestTimeSource).setNow(now)
         whenever(viewModel.deletionProgress).then {
@@ -625,7 +647,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 2,
                 period = DateNavigationPeriod.PERIOD_WEEK,
                 startTime = selectedDay,
@@ -638,7 +660,7 @@
                 .setFragmentResult(START_DELETION_KEY, bundleOf())
         }
 
-        onView(withText("Permanently delete all entries for the week of Sep 19 – 26, 2021?"))
+        onView(withText("Permanently delete all entries for the week of Sep 13 – 19, 2021?"))
             .inRoot(isDialog())
             .check(matches(isDisplayed()))
         onView(
@@ -665,7 +687,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS),
+                mapOf("test_id_1" to StepsRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_MONTH,
                 startTime = selectedDay,
@@ -702,7 +724,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_MONTH,
                 startTime = selectedDay,
@@ -739,7 +761,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 10,
                 period = DateNavigationPeriod.PERIOD_MONTH,
                 startTime = selectedDay,
@@ -776,7 +798,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 2,
                 period = DateNavigationPeriod.PERIOD_MONTH,
                 startTime = selectedDay,
@@ -813,7 +835,7 @@
         }
         whenever(viewModel.getDeletionType()).then {
             DeletionType.DeleteEntries(
-                mapOf("test_id_1" to DataType.STEPS, "test_id_2" to DataType.STEPS_CADENCE),
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
                 totalEntries = 2,
                 period = DateNavigationPeriod.PERIOD_MONTH,
                 startTime = selectedDay,
@@ -843,8 +865,665 @@
     // endregion
 
     // endregion
-    // TODO app entries
-    // TODO inactive app data
+
+    // region DeleteEntriesFromApp
+
+    // region day
+    @Test
+    fun deleteAppEntries_fromDay_oneSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_DAY,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete this $TEST_APP_NAME entry?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromDayWithinYear_someSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_DAY,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete selected $TEST_APP_NAME entries for Sep 19?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromDayPastYear_someSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2021-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_DAY,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete selected $TEST_APP_NAME entries for Sep 19, 2021?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromDayWithinYear_allSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 2,
+                period = DateNavigationPeriod.PERIOD_DAY,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete all $TEST_APP_NAME entries for Sep 19?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromDayPastYear_allSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2021-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 2,
+                period = DateNavigationPeriod.PERIOD_DAY,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete all $TEST_APP_NAME entries for Sep 19, 2021?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    // endregion
+
+    // region week
+    @Test
+    fun deleteAppEntries_fromWeek_oneSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_WEEK,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete this $TEST_APP_NAME entry?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromWeekWithinYear_someSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        // This date is on a Monday. The dialog should show the current week range,
+        // which starts on this Monday
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_WEEK,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(
+                withText(
+                    "Permanently delete selected $TEST_APP_NAME entries for the week of Sep 19 – 25?"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromWeekPastYear_someSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        // This date is on a Sunday. The dialog should show the current week range,
+        // which ends on this Sunday
+        val selectedDay = Instant.parse("2021-09-19T20:00:00.000Z")
+        // This needs to be start of period in the local time
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_WEEK,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(
+                withText(
+                    "Permanently delete selected $TEST_APP_NAME entries for the week of Sep 13 – 19, 2021?"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromWeekWithinYear_allSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        // This date is on a Monday. The dialog should show the current week range,
+        // which starts on this Monday
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 2,
+                period = DateNavigationPeriod.PERIOD_WEEK,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(
+                withText(
+                    "Permanently delete all $TEST_APP_NAME entries for the week of Sep 19 – 25?"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromWeekPastYear_allSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        // This date is on a Sunday. The dialog should show the current week range,
+        // which ends on this Sunday
+        val selectedDay = Instant.parse("2021-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 2,
+                period = DateNavigationPeriod.PERIOD_WEEK,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(
+                withText(
+                    "Permanently delete all $TEST_APP_NAME entries for the week of Sep 13 – 19, 2021?"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    // endregion
+
+    // region month
+    @Test
+    fun deleteAppEntries_fromMonth_oneSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_MONTH,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete this $TEST_APP_NAME entry?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromMonthWithinYear_someSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_MONTH,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete selected $TEST_APP_NAME entries for September?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromMonthPastYear_someSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2021-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 10,
+                period = DateNavigationPeriod.PERIOD_MONTH,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete selected $TEST_APP_NAME entries for September 2021?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromMonthWithinYear_allSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2022-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 2,
+                period = DateNavigationPeriod.PERIOD_MONTH,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete all $TEST_APP_NAME entries for September?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun deleteAppEntries_fromMonthPastYear_allSelected_confirmationDialog_showsCorrectText() {
+        val now = Instant.parse("2022-09-20T20:00:00.000Z")
+        val selectedDay = Instant.parse("2021-09-19T20:00:00.000Z")
+        (testTimeSource as TestTimeSource).setNow(now)
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteEntriesFromApp(
+                mapOf("test_id_1" to StepsRecord::class, "test_id_2" to StepsCadenceRecord::class),
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_NAME,
+                totalEntries = 2,
+                period = DateNavigationPeriod.PERIOD_MONTH,
+                startTime = selectedDay,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete all $TEST_APP_NAME entries for September 2021?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    // endregion
+
+    // endregion
+
+    // region inactive app
+    @Test
+    fun deleteInactiveAppHealthPermissionTypeData_showsCorrectText() {
+        whenever(viewModel.deletionProgress).then {
+            MutableLiveData(DeletionViewModel.DeletionProgress.NOT_STARTED)
+        }
+        whenever(viewModel.getDeletionType()).then {
+            DeletionType.DeleteInactiveAppData(
+                appName = TEST_APP_NAME,
+                packageName = TEST_APP_PACKAGE_NAME,
+                healthPermissionType = FitnessPermissionType.STEPS,
+            )
+        }
+
+        launchFragment<DeletionFragment>(Bundle()) {
+            (this as DeletionFragment)
+                .parentFragmentManager
+                .setFragmentResult(START_DELETION_KEY, bundleOf())
+        }
+
+        onView(withText("Permanently delete steps data for $TEST_APP_NAME?"))
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(
+                withText(
+                    "Connected apps will no longer be able to read this data from Health\u00A0Connect"
+                )
+            )
+            .inRoot(isDialog())
+            .check(matches(isDisplayed()))
+        onView(withText("Cancel")).inRoot(isDialog()).check(matches(isDisplayed()))
+        onView(withText("Delete")).inRoot(isDialog()).check(matches(isDisplayed()))
+    }
+
+    // endregion
 
     // region confirmation dialog buttons
     @Test
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/DeletionViewModelTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/DeletionViewModelTest.kt
index 192435e..2c3e98b 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/DeletionViewModelTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/DeletionViewModelTest.kt
@@ -15,16 +15,17 @@
  */
 package com.android.healthconnect.controller.tests.selectabledeletion
 
+import android.health.connect.datatypes.StepsRecord
 import com.android.healthconnect.controller.data.entries.FormattedEntry
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.selectabledeletion.DeletionType
 import com.android.healthconnect.controller.selectabledeletion.DeletionViewModel
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAppDataUseCase
 import com.android.healthconnect.controller.selectabledeletion.api.DeleteEntriesUseCase
-import com.android.healthconnect.controller.selectabledeletion.api.DeleteFitnessPermissionTypesFromAppUseCase
+import com.android.healthconnect.controller.selectabledeletion.api.DeletePermissionTypesFromAppUseCase
 import com.android.healthconnect.controller.selectabledeletion.api.DeletePermissionTypesUseCase
-import com.android.healthconnect.controller.shared.DataType
 import com.android.healthconnect.controller.tests.utils.InstantTaskExecutorRule
 import com.android.healthconnect.controller.tests.utils.TestObserver
 import com.google.common.truth.Truth.assertThat
@@ -40,7 +41,6 @@
 import kotlinx.coroutines.test.setMain
 import org.junit.After
 import org.junit.Before
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mockito.mock
@@ -58,9 +58,9 @@
     private val deletePermissionTypesUseCase: DeletePermissionTypesUseCase =
         mock(DeletePermissionTypesUseCase::class.java)
     private val deleteEntriesUseCase: DeleteEntriesUseCase = mock(DeleteEntriesUseCase::class.java)
-
-    private val deletePermissionTypesFromAppUseCase: DeleteFitnessPermissionTypesFromAppUseCase =
-        mock(DeleteFitnessPermissionTypesFromAppUseCase::class.java)
+    private val deleteAppDataUseCase: DeleteAppDataUseCase = mock(DeleteAppDataUseCase::class.java)
+    private val deletePermissionTypesFromAppUseCase: DeletePermissionTypesFromAppUseCase =
+        mock(DeletePermissionTypesFromAppUseCase::class.java)
 
     private lateinit var viewModel: DeletionViewModel
 
@@ -70,6 +70,7 @@
         Dispatchers.setMain(testDispatcher)
         viewModel =
             DeletionViewModel(
+                deleteAppDataUseCase,
                 deletePermissionTypesUseCase,
                 deleteEntriesUseCase,
                 deletePermissionTypesFromAppUseCase,
@@ -138,10 +139,25 @@
     }
 
     @Test
+    fun permissionTypes_deleteWithRemovingPermissions_deletionInvokedCorrectly() = runTest {
+        val deletionType =
+            DeletionType.DeleteHealthPermissionTypes(
+                setOf(FitnessPermissionType.DISTANCE),
+                totalPermissionTypes = 1,
+            )
+        viewModel.removePermissions = true
+        viewModel.setDeletionType(deletionType)
+        viewModel.delete()
+        advanceUntilIdle()
+
+        verify(deletePermissionTypesUseCase).invoke(deletionType)
+    }
+
+    @Test
     fun permissionTypes_deleteFitnessAndMedical_deletionInvokedCorrectly() = runTest {
         val deletionType =
             DeletionType.DeleteHealthPermissionTypes(
-                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.IMMUNIZATION),
+                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.VACCINES),
                 4,
             )
         viewModel.setDeletionType(deletionType = deletionType)
@@ -154,7 +170,7 @@
     @Test
     fun permissionTypes_deleteMedical_deletionInvokedCorrectly() = runTest {
         val deletionType =
-            DeletionType.DeleteHealthPermissionTypes(setOf(MedicalPermissionType.IMMUNIZATION), 2)
+            DeletionType.DeleteHealthPermissionTypes(setOf(MedicalPermissionType.VACCINES), 2)
         viewModel.setDeletionType(deletionType)
         viewModel.delete()
         advanceUntilIdle()
@@ -162,6 +178,157 @@
         verify(deletePermissionTypesUseCase).invoke(deletionType)
     }
 
+    // TODO
+    @Test
+    fun permissionTypesFromApp_resetAppPermissionTypesReloadNeeded_valueSetCorrectly() = runTest {
+        val testObserver = TestObserver<Boolean>()
+        viewModel.appPermissionTypesReloadNeeded.observeForever(testObserver)
+        viewModel.resetAppPermissionTypesReloadNeeded()
+        advanceUntilIdle()
+
+        assertThat(testObserver.getLastValue()).isEqualTo(false)
+    }
+
+    @Test
+    fun permissionTypesFromApp_deleteSet_setCorrectly() = runTest {
+        val deleteSet =
+            setOf(
+                FitnessPermissionType.DISTANCE,
+                FitnessPermissionType.HEART_RATE,
+                FitnessPermissionType.STEPS,
+            )
+        val numPermissionTypes = 4
+        viewModel.setDeletionType(
+            DeletionType.DeleteHealthPermissionTypesFromApp(
+                deleteSet,
+                numPermissionTypes,
+                "some.package",
+                "appName",
+            )
+        )
+
+        assertThat(viewModel.getDeletionType() is DeletionType.DeleteHealthPermissionTypesFromApp)
+            .isTrue()
+        val actualDeletionType =
+            viewModel.getDeletionType() as DeletionType.DeleteHealthPermissionTypesFromApp
+        assertThat(actualDeletionType.healthPermissionTypes)
+            .isEqualTo(
+                setOf(
+                    FitnessPermissionType.DISTANCE,
+                    FitnessPermissionType.HEART_RATE,
+                    FitnessPermissionType.STEPS,
+                )
+            )
+        assertThat(actualDeletionType.totalPermissionTypes).isEqualTo(numPermissionTypes)
+        assertThat(actualDeletionType.packageName).isEqualTo("some.package")
+        assertThat(actualDeletionType.appName).isEqualTo("appName")
+    }
+
+    @Test
+    fun permissionTypesFromApp_deleteFitnessWithoutRemovingPermissions_deletionInvokedCorrectly() =
+        runTest {
+            val deletionType =
+                DeletionType.DeleteHealthPermissionTypesFromApp(
+                    setOf(FitnessPermissionType.DISTANCE),
+                    totalPermissionTypes = 4,
+                    "some.package",
+                    "appName",
+                )
+            viewModel.setDeletionType(deletionType)
+            viewModel.delete()
+            advanceUntilIdle()
+
+            verify(deletePermissionTypesFromAppUseCase).invoke(deletionType, false)
+        }
+
+    @Test
+    fun permissionTypesFromApp_deleteFitnessWithRemovingPermissions_deletionInvokedCorrectly() =
+        runTest {
+            val deletionType =
+                DeletionType.DeleteHealthPermissionTypesFromApp(
+                    setOf(FitnessPermissionType.DISTANCE),
+                    totalPermissionTypes = 4,
+                    "some.package",
+                    "appName",
+                )
+            viewModel.setDeletionType(deletionType)
+            viewModel.removePermissions = true
+            viewModel.delete()
+            advanceUntilIdle()
+
+            verify(deletePermissionTypesFromAppUseCase).invoke(deletionType, true)
+        }
+
+    @Test
+    fun permissionTypesFromApp_deleteMedicalWithoutRemovingPermissions_deletionInvokedCorrectly() =
+        runTest {
+            val deletionType =
+                DeletionType.DeleteHealthPermissionTypesFromApp(
+                    setOf(MedicalPermissionType.VACCINES),
+                    2,
+                    "some.package",
+                    "appName",
+                )
+            viewModel.setDeletionType(deletionType)
+            viewModel.delete()
+            advanceUntilIdle()
+
+            verify(deletePermissionTypesFromAppUseCase).invoke(deletionType, false)
+        }
+
+    @Test
+    fun permissionTypesFromApp_deleteMedicalWithRemovingPermissions_deletionInvokedCorrectly() =
+        runTest {
+            val deletionType =
+                DeletionType.DeleteHealthPermissionTypesFromApp(
+                    setOf(MedicalPermissionType.VACCINES),
+                    1,
+                    "some.package",
+                    "appName",
+                )
+            viewModel.setDeletionType(deletionType)
+            viewModel.removePermissions = true
+            viewModel.delete()
+            advanceUntilIdle()
+
+            verify(deletePermissionTypesFromAppUseCase).invoke(deletionType, true)
+        }
+
+    @Test
+    fun permissionTypesFromApp_deleteFitnessAndMedicalWithoutRemovingPermissions_deletionInvokedCorrectly() =
+        runTest {
+            val deletionType =
+                DeletionType.DeleteHealthPermissionTypesFromApp(
+                    setOf(MedicalPermissionType.VACCINES, FitnessPermissionType.STEPS),
+                    3,
+                    "some.package",
+                    "appName",
+                )
+            viewModel.setDeletionType(deletionType)
+            viewModel.delete()
+            advanceUntilIdle()
+
+            verify(deletePermissionTypesFromAppUseCase).invoke(deletionType, false)
+        }
+
+    @Test
+    fun permissionTypesFromApp_deleteFitnessAndMedicalWithRemovingPermissions_deletionInvokedCorrectly() =
+        runTest {
+            val deletionType =
+                DeletionType.DeleteHealthPermissionTypesFromApp(
+                    setOf(MedicalPermissionType.VACCINES, FitnessPermissionType.STEPS),
+                    2,
+                    "some.package",
+                    "appName",
+                )
+            viewModel.setDeletionType(deletionType)
+            viewModel.removePermissions = true
+            viewModel.delete()
+            advanceUntilIdle()
+
+            verify(deletePermissionTypesFromAppUseCase).invoke(deletionType, true)
+        }
+
     @Test
     fun entries_resetEntriesReloadNeeded_valueSetCorrectly() = runTest {
         val testObserver = TestObserver<Boolean>()
@@ -216,8 +383,7 @@
     }
 
     @Test
-    @Ignore("App entries not yet implemented")
-    fun appPermissionTypes_delete_deletionInvokesCorrectly() = runTest {
+    fun appEntries_delete_deletionInvokesCorrectly() = runTest {
         val deletionType =
             DeletionType.DeleteEntriesFromApp(
                 mapOf(
@@ -225,12 +391,42 @@
                     FORMATTED_STEPS_2.uuid to FORMATTED_STEPS_2.dataType,
                 ),
                 "package.name",
+                "appName",
+                4,
+                DateNavigationPeriod.PERIOD_DAY,
+                Instant.now(),
             )
 
         viewModel.setDeletionType(deletionType)
         viewModel.delete()
         advanceUntilIdle()
-        //        verify(deleteEntriesUseCase).invoke(deletionType)
+        verify(deleteEntriesUseCase).invoke(deletionType.toDeleteEntries())
+    }
+
+    @Test
+    fun appData_delete_deletionInvokedCorrectly() = runTest {
+        val deletionType = DeletionType.DeleteAppData("package.name", "appName")
+
+        viewModel.setDeletionType(deletionType)
+        viewModel.delete()
+        advanceUntilIdle()
+        verify(deleteAppDataUseCase).invoke(deletionType)
+    }
+
+    @Test
+    fun inactiveAppData_delete_deletionInvokedCorrectly() = runTest {
+        val deletionType =
+            DeletionType.DeleteInactiveAppData(
+                packageName = "package.name",
+                appName = "app.name",
+                healthPermissionType = FitnessPermissionType.STEPS,
+            )
+
+        viewModel.setDeletionType(deletionType)
+        viewModel.delete()
+        advanceUntilIdle()
+        verify(deletePermissionTypesFromAppUseCase)
+            .invoke(deletionType.toDeleteHealthPermissionTypesFromApp())
     }
 }
 
@@ -241,7 +437,7 @@
         headerA11y = "from 7:06 to 7:06",
         title = "12 steps",
         titleA11y = "12 steps",
-        dataType = DataType.STEPS,
+        dataType = StepsRecord::class,
     )
 private val FORMATTED_STEPS_2 =
     FormattedEntry.FormattedDataEntry(
@@ -250,5 +446,5 @@
         headerA11y = "from 8:06 to 8:06",
         title = "15 steps",
         titleA11y = "15 steps",
-        dataType = DataType.STEPS,
+        dataType = StepsRecord::class,
     )
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllDataUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllDataUseCaseTest.kt
index e4fe789..94469f7 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllDataUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllDataUseCaseTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
  * in compliance with the License. You may obtain a copy of the License at
@@ -16,8 +16,21 @@
 package com.android.healthconnect.controller.tests.selectabledeletion.api
 
 import android.health.connect.DeleteUsingFiltersRequest
+import android.health.connect.GetMedicalDataSourcesRequest
 import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.MedicalDataSource
+import android.os.OutcomeReceiver
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import com.android.healthconnect.controller.selectabledeletion.api.DeleteAllDataUseCase
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAllFitnessDataUseCase
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAllMedicalDataUseCase
+import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE_2
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -28,34 +41,61 @@
 import org.junit.Test
 import org.mockito.ArgumentCaptor
 import org.mockito.Captor
-import org.mockito.Matchers.any
+import org.mockito.Mockito.any
 import org.mockito.Mockito.doAnswer
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 import org.mockito.invocation.InvocationOnMock
+import org.mockito.kotlin.whenever
 
 @HiltAndroidTest
 class DeleteAllDataUseCaseTest {
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
 
-    private lateinit var useCase: DeleteAllDataUseCase
     var manager: HealthConnectManager = mock(HealthConnectManager::class.java)
 
+    private lateinit var useCase: DeleteAllDataUseCase
+    private lateinit var deleteAllFitnessDataUseCase: DeleteAllFitnessDataUseCase
+    private lateinit var deleteAllMedicalDataUseCase: DeleteAllMedicalDataUseCase
+    private val healthPermissionReader: HealthPermissionReader =
+        mock((HealthPermissionReader::class.java))
+
+    @Captor lateinit var dataSourceIdCaptor: ArgumentCaptor<String>
     @Captor lateinit var filtersCaptor: ArgumentCaptor<DeleteUsingFiltersRequest>
 
     @Before
     fun setup() {
         MockitoAnnotations.initMocks(this)
-        useCase = DeleteAllDataUseCase(manager, Dispatchers.Main)
+        deleteAllFitnessDataUseCase = DeleteAllFitnessDataUseCase(manager, Dispatchers.Main)
+        deleteAllMedicalDataUseCase =
+            DeleteAllMedicalDataUseCase(
+                manager,
+                healthPermissionReader,
+                MedicalDataSourceReader(manager, Dispatchers.Main),
+                Dispatchers.Main,
+            )
+        useCase =
+            DeleteAllDataUseCase(
+                deleteAllFitnessDataUseCase,
+                deleteAllMedicalDataUseCase,
+                Dispatchers.Main,
+            )
     }
 
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     @Test
     fun invoke_deleteAllData_callsHealthManager() = runTest {
         doAnswer(prepareAnswer())
             .`when`(manager)
             .deleteRecords(any(DeleteUsingFiltersRequest::class.java), any(), any())
+        doAnswer(prepareAnswer(listOf(TEST_MEDICAL_DATA_SOURCE, TEST_MEDICAL_DATA_SOURCE_2)))
+            .`when`(manager)
+            .getMedicalDataSources(any(GetMedicalDataSourcesRequest::class.java), any(), any())
+        whenever(healthPermissionReader.getAppsWithMedicalPermissions())
+            .thenReturn(listOf(TEST_MEDICAL_DATA_SOURCE.packageName))
 
         useCase.invoke()
 
@@ -63,10 +103,44 @@
         assertThat(filtersCaptor.value.timeRangeFilter).isNull()
         assertThat(filtersCaptor.value.dataOrigins).isEmpty()
         assertThat(filtersCaptor.value.recordTypes).isEmpty()
+        verify(manager, times(2))
+            .deleteMedicalDataSourceWithData(dataSourceIdCaptor.capture(), any(), any())
+        assertThat(dataSourceIdCaptor.value).isEqualTo(TEST_MEDICAL_DATA_SOURCE_2.id)
+    }
+
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun invoke_deleteAllData_phrFlagDisabled_callsHealthManager() = runTest {
+        doAnswer(prepareAnswer())
+            .`when`(manager)
+            .deleteRecords(any(DeleteUsingFiltersRequest::class.java), any(), any())
+        doAnswer(prepareAnswer(listOf(TEST_MEDICAL_DATA_SOURCE, TEST_MEDICAL_DATA_SOURCE_2)))
+            .`when`(manager)
+            .getMedicalDataSources(any(GetMedicalDataSourcesRequest::class.java), any(), any())
+        whenever(healthPermissionReader.getAppsWithMedicalPermissions())
+            .thenReturn(listOf(TEST_MEDICAL_DATA_SOURCE.packageName))
+
+        useCase.invoke()
+
+        verify(manager).deleteRecords(filtersCaptor.capture(), any(), any())
+        assertThat(filtersCaptor.value.timeRangeFilter).isNull()
+        assertThat(filtersCaptor.value.dataOrigins).isEmpty()
+        assertThat(filtersCaptor.value.recordTypes).isEmpty()
+        verify(manager, times(0))
+            .deleteMedicalDataSourceWithData(dataSourceIdCaptor.capture(), any(), any())
     }
 
     private fun prepareAnswer(): (InvocationOnMock) -> Nothing? {
         val answer = { _: InvocationOnMock -> null }
         return answer
     }
-}
+
+    private fun prepareAnswer(
+        medicalDataSourcesResponse: List<MedicalDataSource>
+    ): (InvocationOnMock) -> Unit {
+        return { args: InvocationOnMock ->
+            val receiver = args.arguments[2] as OutcomeReceiver<List<MedicalDataSource>, *>
+            receiver.onResult(medicalDataSourcesResponse)
+        }
+    }
+}
\ No newline at end of file
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllFitnessDataUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllFitnessDataUseCaseTest.kt
new file mode 100644
index 0000000..2c27af0
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllFitnessDataUseCaseTest.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.tests.selectabledeletion.api
+
+import android.health.connect.DeleteUsingFiltersRequest
+import android.health.connect.HealthConnectManager
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAllFitnessDataUseCase
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Matchers.any
+import org.mockito.Mockito.doAnswer
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+import org.mockito.invocation.InvocationOnMock
+
+@HiltAndroidTest
+class DeleteAllFitnessDataUseCaseTest {
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    private lateinit var useCase: DeleteAllFitnessDataUseCase
+    var manager: HealthConnectManager = mock(HealthConnectManager::class.java)
+
+    @Captor lateinit var filtersCaptor: ArgumentCaptor<DeleteUsingFiltersRequest>
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        useCase = DeleteAllFitnessDataUseCase(manager, Dispatchers.Main)
+    }
+
+    @Test
+    fun invoke_deleteAllData_callsHealthManager() = runTest {
+        doAnswer(prepareAnswer())
+            .`when`(manager)
+            .deleteRecords(any(DeleteUsingFiltersRequest::class.java), any(), any())
+
+        useCase.invoke()
+
+        verify(manager, times(1)).deleteRecords(filtersCaptor.capture(), any(), any())
+        assertThat(filtersCaptor.value.timeRangeFilter).isNull()
+        assertThat(filtersCaptor.value.dataOrigins).isEmpty()
+        assertThat(filtersCaptor.value.recordTypes).isEmpty()
+    }
+
+    private fun prepareAnswer(): (InvocationOnMock) -> Nothing? {
+        val answer = { _: InvocationOnMock -> null }
+        return answer
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllMedicalDataUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllMedicalDataUseCaseTest.kt
new file mode 100644
index 0000000..5fc35cd
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAllMedicalDataUseCaseTest.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.tests.selectabledeletion.api
+
+import android.health.connect.GetMedicalDataSourcesRequest
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.MedicalDataSource
+import android.os.OutcomeReceiver
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAllMedicalDataUseCase
+import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE_2
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito.any
+import org.mockito.Mockito.doAnswer
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+import org.mockito.invocation.InvocationOnMock
+import org.mockito.kotlin.whenever
+
+@HiltAndroidTest
+class DeleteAllMedicalDataUseCaseTest {
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    private lateinit var useCase: DeleteAllMedicalDataUseCase
+    private val healthPermissionReader: HealthPermissionReader =
+        mock((HealthPermissionReader::class.java))
+    var manager: HealthConnectManager = mock(HealthConnectManager::class.java)
+
+    @Captor lateinit var dataSourceIdCaptor: ArgumentCaptor<String>
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        useCase =
+            DeleteAllMedicalDataUseCase(
+                manager,
+                healthPermissionReader,
+                MedicalDataSourceReader(manager, Dispatchers.Main),
+                Dispatchers.Main,
+            )
+    }
+
+    @Test
+    fun invoke_deleteAllMedicalData_callsHealthManager() = runTest {
+        doAnswer(prepareAnswer(listOf(TEST_MEDICAL_DATA_SOURCE, TEST_MEDICAL_DATA_SOURCE_2)))
+            .`when`(manager)
+            .getMedicalDataSources(any(GetMedicalDataSourcesRequest::class.java), any(), any())
+        whenever(healthPermissionReader.getAppsWithMedicalPermissions())
+            .thenReturn(listOf(TEST_MEDICAL_DATA_SOURCE.packageName))
+
+        useCase.invoke()
+
+        verify(manager, times(2))
+            .deleteMedicalDataSourceWithData(dataSourceIdCaptor.capture(), any(), any())
+        assertThat(dataSourceIdCaptor.value).isEqualTo(TEST_MEDICAL_DATA_SOURCE_2.id)
+    }
+
+    private fun prepareAnswer(
+        medicalDataSourcesResponse: List<MedicalDataSource>
+    ): (InvocationOnMock) -> Unit {
+        return { args: InvocationOnMock ->
+            val receiver = args.arguments[2] as OutcomeReceiver<List<MedicalDataSource>, *>
+            receiver.onResult(medicalDataSourcesResponse)
+        }
+    }
+}
\ No newline at end of file
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAppDataUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAppDataUseCaseTest.kt
index 7a62ef3..45fd9a1 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAppDataUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteAppDataUseCaseTest.kt
@@ -16,13 +16,23 @@
 package com.android.healthconnect.controller.tests.selectabledeletion.api
 
 import android.health.connect.DeleteUsingFiltersRequest
+import android.health.connect.GetMedicalDataSourcesRequest
 import android.health.connect.HealthConnectManager
 import android.health.connect.datatypes.DataOrigin
+import android.health.connect.datatypes.MedicalDataSource
+import android.os.OutcomeReceiver
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
 import com.android.healthconnect.controller.permissions.api.RevokeAllHealthPermissionsUseCase
 import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteAppData
 import com.android.healthconnect.controller.selectabledeletion.api.DeleteAppDataUseCase
-import com.google.common.truth.Truth
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE_2
+import com.android.healthfitness.flags.Flags
+import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import kotlinx.coroutines.Dispatchers
@@ -39,40 +49,88 @@
 @HiltAndroidTest
 class DeleteAppDataUseCaseTest {
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
 
     private lateinit var useCase: DeleteAppDataUseCase
 
-    var dataManager: HealthConnectManager = mock(HealthConnectManager::class.java)
-    var permissionManager: HealthPermissionManager = mock(HealthPermissionManager::class.java)
+    private var dataManager: HealthConnectManager = mock(HealthConnectManager::class.java)
+    private var permissionManager: HealthPermissionManager =
+        mock(HealthPermissionManager::class.java)
 
     @Captor lateinit var filtersCaptor: ArgumentCaptor<DeleteUsingFiltersRequest>
+    @Captor lateinit var dataSourceIdCaptor: ArgumentCaptor<String>
 
     @Before
     fun setup() {
         MockitoAnnotations.initMocks(this)
         val revokePermissionsUseCase = RevokeAllHealthPermissionsUseCase(permissionManager)
-        useCase = DeleteAppDataUseCase(dataManager, revokePermissionsUseCase, Dispatchers.Main)
+        useCase =
+            DeleteAppDataUseCase(
+                dataManager,
+                MedicalDataSourceReader(dataManager, Dispatchers.Main),
+                revokePermissionsUseCase,
+                Dispatchers.Main,
+            )
     }
 
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     @Test
     fun invoke_deleteAppData_callsHealthManager() = runTest {
         doAnswer(prepareAnswer())
             .`when`(dataManager)
             .deleteRecords(any(DeleteUsingFiltersRequest::class.java), any(), any())
+        doAnswer(prepareAnswer(listOf(TEST_MEDICAL_DATA_SOURCE, TEST_MEDICAL_DATA_SOURCE_2)))
+            .`when`(dataManager)
+            .getMedicalDataSources(any(GetMedicalDataSourcesRequest::class.java), any(), any())
 
-        val deleteAppData = DeleteAppData(packageName = "package.name")
+        val deleteAppData = DeleteAppData(packageName = "package.name", appName = "App Name")
 
         useCase.invoke(deleteAppData)
 
-        verify(dataManager, times(1)).deleteRecords(filtersCaptor.capture(), any(), any())
-        Truth.assertThat(filtersCaptor.value.timeRangeFilter).isNull()
-        Truth.assertThat(filtersCaptor.value.dataOrigins)
+        verify(dataManager).deleteRecords(filtersCaptor.capture(), any(), any())
+        assertThat(filtersCaptor.value.timeRangeFilter).isNull()
+        assertThat(filtersCaptor.value.dataOrigins)
             .containsExactly(DataOrigin.Builder().setPackageName("package.name").build())
-        Truth.assertThat(filtersCaptor.value.recordTypes).isEmpty()
+        assertThat(filtersCaptor.value.recordTypes).isEmpty()
+        verify(dataManager, times(2))
+            .deleteMedicalDataSourceWithData(dataSourceIdCaptor.capture(), any(), any())
+        assertThat(dataSourceIdCaptor.value).isEqualTo(TEST_MEDICAL_DATA_SOURCE_2.id)
+    }
+
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    @Test
+    fun invoke_deleteAppData_phrFlagDisabled_callsHealthManager() = runTest {
+        doAnswer(prepareAnswer())
+            .`when`(dataManager)
+            .deleteRecords(any(DeleteUsingFiltersRequest::class.java), any(), any())
+        doAnswer(prepareAnswer(listOf(TEST_MEDICAL_DATA_SOURCE, TEST_MEDICAL_DATA_SOURCE_2)))
+            .`when`(dataManager)
+            .getMedicalDataSources(any(GetMedicalDataSourcesRequest::class.java), any(), any())
+
+        val deleteAppData = DeleteAppData(packageName = "package.name", appName = "App Name")
+
+        useCase.invoke(deleteAppData)
+
+        verify(dataManager).deleteRecords(filtersCaptor.capture(), any(), any())
+        assertThat(filtersCaptor.value.timeRangeFilter).isNull()
+        assertThat(filtersCaptor.value.dataOrigins)
+            .containsExactly(DataOrigin.Builder().setPackageName("package.name").build())
+        assertThat(filtersCaptor.value.recordTypes).isEmpty()
+        verify(dataManager, times(0))
+            .deleteMedicalDataSourceWithData(dataSourceIdCaptor.capture(), any(), any())
     }
 
     private fun prepareAnswer(): (InvocationOnMock) -> Nothing? {
         val answer = { _: InvocationOnMock -> null }
         return answer
     }
+
+    private fun prepareAnswer(
+        medicalDataSourcesResponse: List<MedicalDataSource>
+    ): (InvocationOnMock) -> Unit {
+        return { args: InvocationOnMock ->
+            val receiver = args.arguments[2] as OutcomeReceiver<List<MedicalDataSource>, *>
+            receiver.onResult(medicalDataSourcesResponse)
+        }
+    }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteEntriesUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteEntriesUseCaseTest.kt
index e506456..b234889 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteEntriesUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteEntriesUseCaseTest.kt
@@ -22,7 +22,6 @@
 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
 import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteEntries
 import com.android.healthconnect.controller.selectabledeletion.api.DeleteEntriesUseCase
-import com.android.healthconnect.controller.shared.DataType
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
@@ -38,7 +37,6 @@
 import org.mockito.Matchers.anyListOf
 import org.mockito.Mockito.doAnswer
 import org.mockito.Mockito.mock
-import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 import org.mockito.invocation.InvocationOnMock
@@ -67,14 +65,14 @@
 
         useCase.invoke(
             DeleteEntries(
-                mapOf("test_id1" to DataType.STEPS, "test_id2" to DataType.STEPS_CADENCE),
+                mapOf("test_id1" to StepsRecord::class, "test_id2" to StepsCadenceRecord::class),
                 4,
                 period = DateNavigationPeriod.PERIOD_DAY,
                 startTime = Instant.now(),
             )
         )
 
-        verify(manager, times(1)).deleteRecords(listCaptor.capture(), any(), any())
+        verify(manager).deleteRecords(listCaptor.capture(), any(), any())
         assertThat(listCaptor.value[0].id).isEqualTo("test_id1")
         assertThat(listCaptor.value[0].recordType).isEqualTo(StepsRecord::class.java)
         assertThat(listCaptor.value[1].id).isEqualTo("test_id2")
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteFitnessPermissionTypesFromAppUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteFitnessPermissionTypesFromAppUseCaseTest.kt
new file mode 100644
index 0000000..0be9a45
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteFitnessPermissionTypesFromAppUseCaseTest.kt
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.tests.selectabledeletion.api
+
+import android.health.connect.DeleteUsingFiltersRequest
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.CyclingPedalingCadenceRecord
+import android.health.connect.datatypes.DataOrigin
+import android.health.connect.datatypes.ExerciseSessionRecord
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.MenstruationFlowRecord
+import android.health.connect.datatypes.MenstruationPeriodRecord
+import android.health.connect.datatypes.SleepSessionRecord
+import android.health.connect.datatypes.StepsCadenceRecord
+import android.health.connect.datatypes.StepsRecord
+import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteHealthPermissionTypesFromApp
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteFitnessPermissionTypesFromAppUseCase
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers.any
+import org.mockito.Captor
+import org.mockito.Mockito
+import org.mockito.Mockito.doAnswer
+import org.mockito.MockitoAnnotations
+import org.mockito.invocation.InvocationOnMock
+
+@HiltAndroidTest
+class DeleteFitnessPermissionTypesFromAppUseCaseTest {
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    private lateinit var useCase: DeleteFitnessPermissionTypesFromAppUseCase
+    var manager: HealthConnectManager = Mockito.mock(HealthConnectManager::class.java)
+
+    @Captor lateinit var filtersCaptor: ArgumentCaptor<DeleteUsingFiltersRequest>
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        useCase = DeleteFitnessPermissionTypesFromAppUseCase(manager, Dispatchers.Main)
+    }
+
+    @Test
+    fun invoke_deletePermissionTypesFromApp_callsHealthManager() = runTest {
+        doAnswer(prepareAnswer())
+            .`when`(manager)
+            .deleteRecords(any(DeleteUsingFiltersRequest::class.java), any(), any())
+
+        val deletePermissionTypes =
+            DeleteHealthPermissionTypesFromApp(
+                setOf(
+                    FitnessPermissionType.STEPS,
+                    FitnessPermissionType.HEART_RATE,
+                    FitnessPermissionType.SLEEP,
+                    FitnessPermissionType.EXERCISE,
+                    FitnessPermissionType.MENSTRUATION,
+                    MedicalPermissionType.VACCINES,
+                ),
+                8,
+                packageName = "package.name",
+                "app name",
+            )
+
+        useCase.invoke(deletePermissionTypes)
+
+        Mockito.verify(manager, Mockito.times(1))
+            .deleteRecords(filtersCaptor.capture(), any(), any())
+
+        assertThat(filtersCaptor.value.timeRangeFilter).isNull()
+        assertThat(filtersCaptor.value.dataOrigins)
+            .containsExactly(DataOrigin.Builder().setPackageName("package.name").build())
+        assertThat(filtersCaptor.value.recordTypes)
+            .containsExactly(
+                StepsRecord::class.java,
+                StepsCadenceRecord::class.java,
+                HeartRateRecord::class.java,
+                SleepSessionRecord::class.java,
+                ExerciseSessionRecord::class.java,
+                MenstruationFlowRecord::class.java,
+                MenstruationPeriodRecord::class.java,
+                CyclingPedalingCadenceRecord::class.java,
+            )
+    }
+
+    private fun prepareAnswer(): (InvocationOnMock) -> Nothing? {
+        val answer = { _: InvocationOnMock -> null }
+        return answer
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteFitnessPermissionTypesUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteFitnessPermissionTypesUseCaseTest.kt
index 2e3269e..67bae72 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteFitnessPermissionTypesUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteFitnessPermissionTypesUseCaseTest.kt
@@ -75,7 +75,7 @@
                     FitnessPermissionType.SLEEP,
                     FitnessPermissionType.EXERCISE,
                     FitnessPermissionType.MENSTRUATION,
-                    MedicalPermissionType.IMMUNIZATION,
+                    MedicalPermissionType.VACCINES,
                 ),
                 8,
             )
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteMedicalPermissionTypesFromAppUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteMedicalPermissionTypesFromAppUseCaseTest.kt
new file mode 100644
index 0000000..39a848d
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteMedicalPermissionTypesFromAppUseCaseTest.kt
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.tests.selectabledeletion.api
+
+import android.health.connect.DeleteMedicalResourcesRequest
+import android.health.connect.GetMedicalDataSourcesRequest
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.MedicalDataSource
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
+import android.os.OutcomeReceiver
+import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionType
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteMedicalPermissionTypesFromAppUseCase
+import com.android.healthconnect.controller.shared.app.MedicalDataSourceReader
+import com.android.healthconnect.controller.tests.utils.TEST_MEDICAL_DATA_SOURCE
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers.any
+import org.mockito.Captor
+import org.mockito.Mockito
+import org.mockito.Mockito.doAnswer
+import org.mockito.MockitoAnnotations
+import org.mockito.invocation.InvocationOnMock
+
+@HiltAndroidTest
+class DeleteMedicalPermissionTypesFromAppUseCaseTest {
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    private lateinit var useCase: DeleteMedicalPermissionTypesFromAppUseCase
+    var manager: HealthConnectManager = Mockito.mock(HealthConnectManager::class.java)
+
+    @Captor lateinit var medicalRequestCaptor: ArgumentCaptor<DeleteMedicalResourcesRequest>
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        useCase =
+            DeleteMedicalPermissionTypesFromAppUseCase(
+                manager,
+                MedicalDataSourceReader(manager, Dispatchers.Main),
+                Dispatchers.Main,
+            )
+    }
+
+    @Test
+    fun invoke_deletePermissionTypes_callsHealthManager() = runTest {
+        doAnswer(prepareAnswer())
+            .`when`(manager)
+            .deleteMedicalResources(any(DeleteMedicalResourcesRequest::class.java), any(), any())
+        doAnswer(prepareAnswer(listOf(TEST_MEDICAL_DATA_SOURCE)))
+            .`when`(manager)
+            .getMedicalDataSources(any(GetMedicalDataSourcesRequest::class.java), any(), any())
+
+        val deletePermissionType =
+            DeletionType.DeleteHealthPermissionTypesFromApp(
+                setOf(
+                    MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                    MedicalPermissionType.VACCINES,
+                ),
+                8,
+                packageName = "package.name",
+                "app name",
+            )
+
+        useCase.invoke(deletePermissionType)
+
+        Mockito.verify(manager).deleteMedicalResources(medicalRequestCaptor.capture(), any(), any())
+
+        assertThat(medicalRequestCaptor.value.dataSourceIds)
+            .containsExactly(TEST_MEDICAL_DATA_SOURCE.id)
+        assertThat(medicalRequestCaptor.value.medicalResourceTypes)
+            .containsExactly(
+                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                MEDICAL_RESOURCE_TYPE_VACCINES,
+            )
+    }
+
+    private fun prepareAnswer(): (InvocationOnMock) -> Nothing? {
+        val answer = { _: InvocationOnMock -> null }
+        return answer
+    }
+
+    private fun prepareAnswer(
+        medicalDataSourcesResponse: List<MedicalDataSource>
+    ): (InvocationOnMock) -> Unit {
+        return { args: InvocationOnMock ->
+            val receiver = args.arguments[2] as OutcomeReceiver<List<MedicalDataSource>, *>
+            receiver.onResult(medicalDataSourcesResponse)
+        }
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteMedicalPermissionTypesUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteMedicalPermissionTypesUseCaseTest.kt
index 54d0bcb..d4037a4 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteMedicalPermissionTypesUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeleteMedicalPermissionTypesUseCaseTest.kt
@@ -16,10 +16,9 @@
 package com.android.healthconnect.controller.tests.selectabledeletion.api
 
 import android.health.connect.DeleteMedicalResourcesRequest
-import android.health.connect.DeleteUsingFiltersRequest
 import android.health.connect.HealthConnectManager
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteHealthPermissionTypes
 import com.android.healthconnect.controller.selectabledeletion.api.DeleteMedicalPermissionTypesUseCase
@@ -47,7 +46,6 @@
     private lateinit var useCase: DeleteMedicalPermissionTypesUseCase
     var manager: HealthConnectManager = Mockito.mock(HealthConnectManager::class.java)
 
-    @Captor lateinit var filtersCaptor: ArgumentCaptor<DeleteUsingFiltersRequest>
     @Captor lateinit var medicalRequestCaptor: ArgumentCaptor<DeleteMedicalResourcesRequest>
 
     @Before
@@ -65,22 +63,21 @@
         val deletePermissionType =
             DeleteHealthPermissionTypes(
                 setOf(
-                    MedicalPermissionType.ALLERGY_INTOLERANCE,
-                    MedicalPermissionType.IMMUNIZATION,
+                    MedicalPermissionType.ALLERGIES_INTOLERANCES,
+                    MedicalPermissionType.VACCINES,
                 ),
                 8,
             )
 
         useCase.invoke(deletePermissionType)
 
-        Mockito.verify(manager, Mockito.times(1))
-            .deleteMedicalResources(medicalRequestCaptor.capture(), any(), any())
+        Mockito.verify(manager).deleteMedicalResources(medicalRequestCaptor.capture(), any(), any())
 
         assertThat(medicalRequestCaptor.value.dataSourceIds).isEmpty()
         assertThat(medicalRequestCaptor.value.medicalResourceTypes)
             .containsExactly(
-                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                MEDICAL_RESOURCE_TYPE_VACCINES,
             )
     }
 
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeletePermissionTypesFromAppUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeletePermissionTypesFromAppUseCaseTest.kt
index c227208..9eb0c40 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeletePermissionTypesFromAppUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeletePermissionTypesFromAppUseCaseTest.kt
@@ -16,96 +16,196 @@
 package com.android.healthconnect.controller.tests.selectabledeletion.api
 
 import android.health.connect.DeleteUsingFiltersRequest
-import android.health.connect.HealthConnectManager
-import android.health.connect.datatypes.CyclingPedalingCadenceRecord
-import android.health.connect.datatypes.DataOrigin
-import android.health.connect.datatypes.ExerciseSessionRecord
-import android.health.connect.datatypes.HeartRateRecord
-import android.health.connect.datatypes.MenstruationFlowRecord
-import android.health.connect.datatypes.MenstruationPeriodRecord
-import android.health.connect.datatypes.SleepSessionRecord
-import android.health.connect.datatypes.StepsCadenceRecord
-import android.health.connect.datatypes.StepsRecord
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
 import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
+import com.android.healthconnect.controller.selectabledeletion.DeletionType
 import com.android.healthconnect.controller.selectabledeletion.DeletionType.DeleteHealthPermissionTypesFromApp
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteAppDataUseCase
 import com.android.healthconnect.controller.selectabledeletion.api.DeleteFitnessPermissionTypesFromAppUseCase
-import com.google.common.truth.Truth.assertThat
+import com.android.healthconnect.controller.selectabledeletion.api.DeleteMedicalPermissionTypesFromAppUseCase
+import com.android.healthconnect.controller.selectabledeletion.api.DeletePermissionTypesFromAppUseCase
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.advanceUntilIdle
 import kotlinx.coroutines.test.runTest
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.ArgumentCaptor
 import org.mockito.Captor
-import org.mockito.Matchers.any
-import org.mockito.Mockito
-import org.mockito.Mockito.doAnswer
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyZeroInteractions
 import org.mockito.MockitoAnnotations
-import org.mockito.invocation.InvocationOnMock
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @HiltAndroidTest
-class DeletePermissionTypeUseCaseTest {
+class DeletePermissionTypesFromAppUseCaseTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
 
-    private lateinit var useCase: DeleteFitnessPermissionTypesFromAppUseCase
-    var manager: HealthConnectManager = Mockito.mock(HealthConnectManager::class.java)
+    private lateinit var useCase: DeletePermissionTypesFromAppUseCase
+
+    private val deleteFitnessPermissionTypesFromAppUseCase:
+        DeleteFitnessPermissionTypesFromAppUseCase =
+        mock(DeleteFitnessPermissionTypesFromAppUseCase::class.java)
+    private val deleteMedicalPermissionTypesFromAppUseCase:
+        DeleteMedicalPermissionTypesFromAppUseCase =
+        mock(DeleteMedicalPermissionTypesFromAppUseCase::class.java)
+    private val deleteAppDataUseCase: DeleteAppDataUseCase = mock(DeleteAppDataUseCase::class.java)
 
     @Captor lateinit var filtersCaptor: ArgumentCaptor<DeleteUsingFiltersRequest>
 
     @Before
     fun setup() {
         MockitoAnnotations.initMocks(this)
-        useCase = DeleteFitnessPermissionTypesFromAppUseCase(manager, Dispatchers.Main)
+        useCase =
+            DeletePermissionTypesFromAppUseCase(
+                deleteFitnessPermissionTypesFromAppUseCase,
+                deleteMedicalPermissionTypesFromAppUseCase,
+                deleteAppDataUseCase,
+                Dispatchers.Main,
+            )
     }
 
     @Test
-    fun invoke_deletePermissionTypesFromApp_callsHealthManager() = runTest {
-        doAnswer(prepareAnswer())
-            .`when`(manager)
-            .deleteRecords(any(DeleteUsingFiltersRequest::class.java), any(), any())
-
-        val deletePermissionTypes =
+    fun permissionTypes_emptyDeleteMethod_noDeletionInvoked() = runTest {
+        useCase.invoke(
             DeleteHealthPermissionTypesFromApp(
-                setOf(
-                    FitnessPermissionType.STEPS,
-                    FitnessPermissionType.HEART_RATE,
-                    FitnessPermissionType.SLEEP,
-                    FitnessPermissionType.EXERCISE,
-                    FitnessPermissionType.MENSTRUATION,
-                    MedicalPermissionType.IMMUNIZATION,
-                ),
-                8,
-                packageName = "package.name",
+                setOf(),
+                totalPermissionTypes = 0,
+                "package.name",
                 "app name",
             )
+        )
+        advanceUntilIdle()
 
-        useCase.invoke(deletePermissionTypes)
-
-        Mockito.verify(manager, Mockito.times(1))
-            .deleteRecords(filtersCaptor.capture(), any(), any())
-
-        assertThat(filtersCaptor.value.timeRangeFilter).isNull()
-        assertThat(filtersCaptor.value.dataOrigins)
-            .containsExactly(DataOrigin.Builder().setPackageName("package.name").build())
-        assertThat(filtersCaptor.value.recordTypes)
-            .containsExactly(
-                StepsRecord::class.java,
-                StepsCadenceRecord::class.java,
-                HeartRateRecord::class.java,
-                SleepSessionRecord::class.java,
-                ExerciseSessionRecord::class.java,
-                MenstruationFlowRecord::class.java,
-                MenstruationPeriodRecord::class.java,
-                CyclingPedalingCadenceRecord::class.java,
-            )
+        verifyZeroInteractions(deleteFitnessPermissionTypesFromAppUseCase)
+        verifyZeroInteractions(deleteMedicalPermissionTypesFromAppUseCase)
     }
 
-    private fun prepareAnswer(): (InvocationOnMock) -> Nothing? {
-        val answer = { _: InvocationOnMock -> null }
-        return answer
+    @Test
+    fun permissionTypes_deleteSomeData_deletionInvokedCorrectly() = runTest {
+        useCase.invoke(
+            DeleteHealthPermissionTypesFromApp(
+                setOf(FitnessPermissionType.DISTANCE),
+                totalPermissionTypes = 2,
+                "package.name",
+                "app name",
+            )
+        )
+        advanceUntilIdle()
+
+        val expectedDeletionType =
+            DeleteHealthPermissionTypesFromApp(
+                setOf(FitnessPermissionType.DISTANCE),
+                totalPermissionTypes = 2,
+                "package.name",
+                "app name",
+            )
+        verify(deleteFitnessPermissionTypesFromAppUseCase).invoke(expectedDeletionType)
+        verifyZeroInteractions(deleteMedicalPermissionTypesFromAppUseCase)
+    }
+
+    @Test
+    fun permissionTypes_deleteAllData_deletionInvokedCorrectly() = runTest {
+        useCase.invoke(
+            DeleteHealthPermissionTypesFromApp(
+                setOf(FitnessPermissionType.DISTANCE),
+                totalPermissionTypes = 1,
+                "package.name",
+                "app name",
+            )
+        )
+        advanceUntilIdle()
+
+        val expectedDeletionType = DeletionType.DeleteAppData("package.name", "app name")
+        verify(deleteAppDataUseCase).invoke(expectedDeletionType)
+        verifyZeroInteractions(deleteFitnessPermissionTypesFromAppUseCase)
+        verifyZeroInteractions(deleteMedicalPermissionTypesFromAppUseCase)
+    }
+
+    @Test
+    fun permissionTypes_deleteSomeFitnessAndMedical_deletionInvokedCorrectly() = runTest {
+        useCase.invoke(
+            DeleteHealthPermissionTypesFromApp(
+                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.VACCINES),
+                totalPermissionTypes = 4,
+                "package.name",
+                "app name",
+            )
+        )
+        advanceUntilIdle()
+
+        val expectedDeletionType =
+            DeleteHealthPermissionTypesFromApp(
+                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.VACCINES),
+                totalPermissionTypes = 4,
+                "package.name",
+                "app name",
+            )
+        verify(deleteFitnessPermissionTypesFromAppUseCase).invoke(expectedDeletionType)
+        verify(deleteMedicalPermissionTypesFromAppUseCase).invoke(expectedDeletionType)
+    }
+
+    @Test
+    fun permissionTypes_deleteAllFitnessAndMedical_deletionInvokedCorrectly() = runTest {
+        useCase.invoke(
+            DeleteHealthPermissionTypesFromApp(
+                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.VACCINES),
+                totalPermissionTypes = 2,
+                "package.name",
+                "app name",
+            )
+        )
+        advanceUntilIdle()
+
+        val expectedDeletionType = DeletionType.DeleteAppData("package.name", "app name")
+        verify(deleteAppDataUseCase).invoke(expectedDeletionType)
+        verifyZeroInteractions(deleteFitnessPermissionTypesFromAppUseCase)
+        verifyZeroInteractions(deleteMedicalPermissionTypesFromAppUseCase)
+    }
+
+    @Test
+    fun permissionTypes_deleteSomeMedical_deletionInvokedCorrectly() = runTest {
+        useCase.invoke(
+            DeleteHealthPermissionTypesFromApp(
+                setOf(MedicalPermissionType.VACCINES),
+                totalPermissionTypes = 3,
+                "package.name",
+                "app name",
+            )
+        )
+        advanceUntilIdle()
+
+        val expectedDeletionType =
+            DeleteHealthPermissionTypesFromApp(
+                setOf(MedicalPermissionType.VACCINES),
+                totalPermissionTypes = 3,
+                "package.name",
+                "app name",
+            )
+        verify(deleteMedicalPermissionTypesFromAppUseCase).invoke(expectedDeletionType)
+        verifyZeroInteractions(deleteFitnessPermissionTypesFromAppUseCase)
+    }
+
+    @Test
+    fun permissionTypes_deleteAllMedical_deletionInvokedCorrectly() = runTest {
+        useCase.invoke(
+            DeleteHealthPermissionTypesFromApp(
+                setOf(MedicalPermissionType.VACCINES),
+                totalPermissionTypes = 1,
+                "package.name",
+                "app name",
+            )
+        )
+        advanceUntilIdle()
+
+        val expectedDeletionType = DeletionType.DeleteAppData("package.name", "app name")
+        verify(deleteAppDataUseCase).invoke(expectedDeletionType)
+        verifyZeroInteractions(deleteFitnessPermissionTypesFromAppUseCase)
+        verifyZeroInteractions(deleteMedicalPermissionTypesFromAppUseCase)
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeletePermissionTypesUseCaseTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeletePermissionTypesUseCaseTest.kt
index 6b5efa8..e899c4d 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeletePermissionTypesUseCaseTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/selectabledeletion/api/DeletePermissionTypesUseCaseTest.kt
@@ -88,7 +88,7 @@
     fun permissionTypes_deleteFitnessAndMedical_deletionInvokedCorrectly() = runTest {
         useCase.invoke(
             DeleteHealthPermissionTypes(
-                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.IMMUNIZATION),
+                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.VACCINES),
                 4,
             )
         )
@@ -96,7 +96,7 @@
 
         val expectedDeletionType =
             DeleteHealthPermissionTypes(
-                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.IMMUNIZATION),
+                setOf(FitnessPermissionType.DISTANCE, MedicalPermissionType.VACCINES),
                 4,
             )
         verify(deleteFitnessPermissionTypesUseCase).invoke(expectedDeletionType)
@@ -105,11 +105,11 @@
 
     @Test
     fun permissionTypes_deleteMedical_deletionInvokedCorrectly() = runTest {
-        useCase.invoke(DeleteHealthPermissionTypes(setOf(MedicalPermissionType.IMMUNIZATION), 3))
+        useCase.invoke(DeleteHealthPermissionTypes(setOf(MedicalPermissionType.VACCINES), 3))
         advanceUntilIdle()
 
         val expectedDeletionType =
-            DeleteHealthPermissionTypes(setOf(MedicalPermissionType.IMMUNIZATION), 3)
+            DeleteHealthPermissionTypes(setOf(MedicalPermissionType.VACCINES), 3)
         verify(deleteMedicalPermissionTypesUseCase).invoke(expectedDeletionType)
         verifyZeroInteractions(deleteFitnessPermissionTypesUseCase)
     }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/shared/HealthDataCategoryExtensionsTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/shared/HealthDataCategoryExtensionsTest.kt
index 6221550..1ce9944 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/shared/HealthDataCategoryExtensionsTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/shared/HealthDataCategoryExtensionsTest.kt
@@ -18,6 +18,7 @@
 
 package com.android.healthconnect.controller.tests.shared
 
+import android.health.connect.HealthDataCategory
 import android.health.connect.HealthDataCategory.ACTIVITY
 import android.health.connect.HealthDataCategory.BODY_MEASUREMENTS
 import android.health.connect.HealthDataCategory.CYCLE_TRACKING
@@ -26,6 +27,9 @@
 import android.health.connect.HealthDataCategory.VITALS
 import com.android.healthconnect.controller.R
 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isAdditionalPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isFitnessPermission
+import com.android.healthconnect.controller.permissions.data.HealthPermission.Companion.isMedicalPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
 import com.android.healthconnect.controller.permissions.data.HealthPermission.MedicalPermission
 import com.android.healthconnect.controller.shared.FITNESS_DATA_CATEGORIES
@@ -36,6 +40,7 @@
 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.uppercaseTitle
 import com.android.healthconnect.controller.shared.HealthPermissionReader
 import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import javax.inject.Inject
@@ -57,19 +62,40 @@
     }
 
     @Test
+    fun fitnessDataCategories() {
+        assertThat(FITNESS_DATA_CATEGORIES).hasSize(7)
+        assertThat(FITNESS_DATA_CATEGORIES).containsNoDuplicates()
+        assertThat(FITNESS_DATA_CATEGORIES).doesNotContain(HealthDataCategory.UNKNOWN)
+    }
+
+    @Test
+    fun healthPermissionTypes_containNoDuplicates() {
+        FITNESS_DATA_CATEGORIES.forEach { dataCategory ->
+            assertWithMessage("HealthDataCategoty ${dataCategory}")
+                .that(dataCategory.healthPermissionTypes())
+                .containsNoDuplicates()
+        }
+
+        assertThat(FITNESS_DATA_CATEGORIES.flatMap { it.healthPermissionTypes() })
+            .containsNoDuplicates()
+    }
+
+    @Test
     fun allFitnessPermissions_haveParentCategory() {
         val allFitnessPermissions =
             healthPermissionReader.getHealthPermissions().filterNot { perm ->
-                healthPermissionReader.isAdditionalPermission(perm) ||
-                    healthPermissionReader.isMedicalPermission(perm)
+                isAdditionalPermission(perm) || isMedicalPermission(perm)
             }
         for (permissionString in allFitnessPermissions) {
             val fitnessPermission = FitnessPermission.fromPermissionString(permissionString)
-            assertThat(
-                    FITNESS_DATA_CATEGORIES.any {
+
+            assertWithMessage(permissionString)
+                .that(
+                    FITNESS_DATA_CATEGORIES.count() {
                         it.healthPermissionTypes().contains(fitnessPermission.fitnessPermissionType)
-                    })
-                .isEqualTo(true)
+                    }
+                )
+                .isEqualTo(1)
         }
     }
 
@@ -77,14 +103,14 @@
     fun allMedicalPermissions_haveParentCategory() {
         val allMedicalsPermissions =
             healthPermissionReader.getHealthPermissions().filterNot { perm ->
-                healthPermissionReader.isAdditionalPermission(perm) ||
-                    healthPermissionReader.isFitnessPermission(perm)
+                isAdditionalPermission(perm) || isFitnessPermission(perm)
             }
         for (permissionString in allMedicalsPermissions) {
             val medicalPermission = MedicalPermission.fromPermissionString(permissionString)
             assertThat(
                     MEDICAL.healthPermissionTypes()
-                        .contains(medicalPermission.medicalPermissionType))
+                        .contains(medicalPermission.medicalPermissionType)
+                )
                 .isEqualTo(true)
         }
     }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/shared/HealthPermissionReaderTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/shared/HealthPermissionReaderTest.kt
index abec505..1ed2542 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/shared/HealthPermissionReaderTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/shared/HealthPermissionReaderTest.kt
@@ -1,67 +1,66 @@
 package com.android.healthconnect.controller.tests.shared
 
 import android.content.Context
+import android.content.pm.PackageManager
 import android.health.connect.HealthPermissions
+import android.health.connect.HealthPermissions.MANAGE_HEALTH_PERMISSIONS
 import android.health.connect.HealthPermissions.READ_PLANNED_EXERCISE
 import android.health.connect.HealthPermissions.READ_SKIN_TEMPERATURE
 import android.health.connect.HealthPermissions.WRITE_PLANNED_EXERCISE
 import android.health.connect.HealthPermissions.WRITE_SKIN_TEMPERATURE
+import android.os.Build
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import android.platform.test.flag.junit.SetFlagsRule
+import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
+import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
 import com.android.healthconnect.controller.permissions.data.HealthPermission
-import com.android.healthconnect.controller.permissions.data.HealthPermission.FitnessPermission
-import com.android.healthconnect.controller.permissions.data.MedicalPermissionType
 import com.android.healthconnect.controller.shared.HealthPermissionReader
+import com.android.healthconnect.controller.shared.app.AppPermissionsType.COMBINED_PERMISSIONS
+import com.android.healthconnect.controller.shared.app.AppPermissionsType.FITNESS_PERMISSIONS_ONLY
+import com.android.healthconnect.controller.shared.app.AppPermissionsType.MEDICAL_PERMISSIONS_ONLY
+import com.android.healthconnect.controller.tests.utils.MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.OLD_PERMISSIONS_TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME
 import com.android.healthconnect.controller.tests.utils.TEST_APP_PACKAGE_NAME_2
 import com.android.healthconnect.controller.tests.utils.UNSUPPORTED_TEST_APP_PACKAGE_NAME
-import com.android.healthconnect.controller.tests.utils.di.FakeFeatureUtils
-import com.android.healthconnect.controller.utils.FeatureUtils
+import com.android.healthconnect.controller.tests.utils.WEAR_LEGACY_TEST_APP_PACKAGE_NAME
+import com.android.healthconnect.controller.tests.utils.WEAR_TEST_APP_PACKAGE_NAME
+import com.android.healthfitness.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import dagger.hilt.android.testing.HiltAndroidRule
 import dagger.hilt.android.testing.HiltAndroidTest
 import javax.inject.Inject
 import kotlinx.coroutines.test.runTest
+import org.junit.Assume.assumeFalse
+import org.junit.Assume.assumeTrue
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
-import com.android.healthconnect.controller.shared.app.AppPermissionsType.COMBINED_PERMISSIONS
-import com.android.healthconnect.controller.shared.app.AppPermissionsType.FITNESS_PERMISSIONS_ONLY
-import com.android.healthconnect.controller.shared.app.AppPermissionsType.MEDICAL_PERMISSIONS_ONLY
-import com.android.healthconnect.controller.tests.utils.MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME
 
 @HiltAndroidTest
 class HealthPermissionReaderTest {
 
     @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
+    @get:Rule val checkFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
 
     @Inject lateinit var permissionReader: HealthPermissionReader
-    @Inject lateinit var fakeFeatureUtils: FeatureUtils
     private lateinit var context: Context
 
     @Before
     fun setup() {
-        hiltRule.inject()
+        runWithShellPermissionIdentity({ hiltRule.inject() }, MANAGE_HEALTH_PERMISSIONS)
         context = InstrumentationRegistry.getInstrumentation().context
     }
 
     @Test
-    fun getValidHealthPermissions_hidesSessionTypesIfDisabled() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSessionTypesEnabled(false)
-
-        assertThat(permissionReader.getValidHealthPermissions(TEST_APP_PACKAGE_NAME))
-            .containsExactly(
-                HealthPermissions.WRITE_EXERCISE_ROUTE.toHealthPermission(),
-                HealthPermissions.READ_ACTIVE_CALORIES_BURNED.toHealthPermission(),
-                HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED.toHealthPermission(),
-                HealthPermission.AdditionalPermission.READ_EXERCISE_ROUTES)
-    }
-
-    @Test
-    fun getValidHealthPermissions_returnsDataTypeAndAdditionalPermissions() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsHistoryReadEnabled(true)
-
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun getValidHealthPermissions_phrFlagOff_returnsFitnessAndAdditionalPermissions() = runTest {
         assertThat(permissionReader.getValidHealthPermissions(TEST_APP_PACKAGE_NAME))
             .containsExactly(
                 HealthPermissions.READ_ACTIVE_CALORIES_BURNED.toHealthPermission(),
@@ -73,10 +72,51 @@
                 HealthPermission.AdditionalPermission.READ_EXERCISE_ROUTES,
                 HealthPermissions.WRITE_EXERCISE_ROUTE.toHealthPermission(),
                 HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
-                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY)
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY,
+                HealthPermissions.READ_SKIN_TEMPERATURE.toHealthPermission(),
+                HealthPermissions.WRITE_SKIN_TEMPERATURE.toHealthPermission(),
+                HealthPermissions.READ_PLANNED_EXERCISE.toHealthPermission(),
+                HealthPermissions.WRITE_PLANNED_EXERCISE.toHealthPermission(),
+            )
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun getValidHealthPermissions_phrFlagOn_returnsAllHealthAndAdditionalPermissions() = runTest {
+        assertThat(permissionReader.getValidHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactly(
+                HealthPermissions.READ_ACTIVE_CALORIES_BURNED.toHealthPermission(),
+                HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED.toHealthPermission(),
+                HealthPermissions.READ_EXERCISE.toHealthPermission(),
+                HealthPermissions.WRITE_EXERCISE.toHealthPermission(),
+                HealthPermissions.READ_SLEEP.toHealthPermission(),
+                HealthPermissions.WRITE_SLEEP.toHealthPermission(),
+                HealthPermission.AdditionalPermission.READ_EXERCISE_ROUTES,
+                HealthPermissions.WRITE_EXERCISE_ROUTE.toHealthPermission(),
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY,
+                HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_CONDITIONS.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_PREGNANCY.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_PROCEDURES.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_VACCINES.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_VISITS.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS.toHealthPermission(),
+                HealthPermissions.WRITE_MEDICAL_DATA.toHealthPermission(),
+                HealthPermissions.READ_SKIN_TEMPERATURE.toHealthPermission(),
+                HealthPermissions.WRITE_SKIN_TEMPERATURE.toHealthPermission(),
+                HealthPermissions.READ_PLANNED_EXERCISE.toHealthPermission(),
+                HealthPermissions.WRITE_PLANNED_EXERCISE.toHealthPermission(),
+            )
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
     fun getValidHealthPermissions_returnsAllPermissions_exceptHiddenPermissions() = runTest {
         assertThat(permissionReader.getValidHealthPermissions(TEST_APP_PACKAGE_NAME))
             .containsExactly(
@@ -87,29 +127,19 @@
                 HealthPermissions.READ_SLEEP.toHealthPermission(),
                 HealthPermissions.READ_ACTIVE_CALORIES_BURNED.toHealthPermission(),
                 HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED.toHealthPermission(),
-                HealthPermission.AdditionalPermission.READ_EXERCISE_ROUTES)
+                HealthPermission.AdditionalPermission.READ_EXERCISE_ROUTES,
+                HealthPermissions.READ_SKIN_TEMPERATURE.toHealthPermission(),
+                HealthPermissions.WRITE_SKIN_TEMPERATURE.toHealthPermission(),
+                HealthPermissions.READ_PLANNED_EXERCISE.toHealthPermission(),
+                HealthPermissions.WRITE_PLANNED_EXERCISE.toHealthPermission(),
+                HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND.toHealthPermission(),
+                HealthPermissions.READ_HEALTH_DATA_HISTORY.toHealthPermission(),
+            )
     }
 
     @Test
-    fun getDeclaredHealthPermissions_returnsAllPermissions() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        assertThat(permissionReader.getDeclaredHealthPermissions(TEST_APP_PACKAGE_NAME))
-            .containsExactly(
-                HealthPermissions.READ_ACTIVE_CALORIES_BURNED,
-                HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED,
-                HealthPermissions.READ_EXERCISE,
-                HealthPermissions.WRITE_EXERCISE,
-                HealthPermissions.READ_SLEEP,
-                HealthPermissions.WRITE_SLEEP,
-                HealthPermissions.READ_EXERCISE_ROUTES,
-                HealthPermissions.WRITE_EXERCISE_ROUTE,
-                HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND)
-    }
-
-    @Test
-    fun getDeclaredHealthPermissions_medicalFlagOn_returnsAllPermissions() {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsBackgroundReadEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun getDeclaredHealthPermissions_phrFlagOff_returnsAllFitnessAndAdditionalPermissions() {
         assertThat(permissionReader.getDeclaredHealthPermissions(TEST_APP_PACKAGE_NAME))
             .containsExactly(
                 HealthPermissions.READ_ACTIVE_CALORIES_BURNED,
@@ -121,16 +151,94 @@
                 HealthPermissions.READ_EXERCISE_ROUTES,
                 HealthPermissions.WRITE_EXERCISE_ROUTE,
                 HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND,
-                HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE,
-                HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION,
+                HealthPermissions.READ_SKIN_TEMPERATURE,
+                HealthPermissions.WRITE_SKIN_TEMPERATURE,
+                HealthPermissions.READ_PLANNED_EXERCISE,
+                HealthPermissions.WRITE_PLANNED_EXERCISE,
+                HealthPermissions.READ_HEALTH_DATA_HISTORY,
+            )
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun getDeclaredHealthPermissions_medicalFlagOn_returnsAllHealthAndAdditionalPermissions() {
+        assertThat(permissionReader.getDeclaredHealthPermissions(TEST_APP_PACKAGE_NAME))
+            .containsExactly(
+                HealthPermissions.READ_ACTIVE_CALORIES_BURNED,
+                HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED,
+                HealthPermissions.READ_EXERCISE,
+                HealthPermissions.WRITE_EXERCISE,
+                HealthPermissions.READ_SLEEP,
+                HealthPermissions.WRITE_SLEEP,
+                HealthPermissions.READ_EXERCISE_ROUTES,
+                HealthPermissions.WRITE_EXERCISE_ROUTE,
+                HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND,
+                HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
                 HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS,
                 HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS,
+                HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS,
+                HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS,
                 HealthPermissions.READ_MEDICAL_DATA_PREGNANCY,
-                HealthPermissions.READ_MEDICAL_DATA_PROBLEMS,
                 HealthPermissions.READ_MEDICAL_DATA_PROCEDURES,
                 HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY,
+                HealthPermissions.READ_MEDICAL_DATA_VACCINES,
+                HealthPermissions.READ_MEDICAL_DATA_VISITS,
                 HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS,
-                HealthPermissions.WRITE_MEDICAL_DATA)
+                HealthPermissions.WRITE_MEDICAL_DATA,
+                HealthPermissions.READ_SKIN_TEMPERATURE,
+                HealthPermissions.WRITE_SKIN_TEMPERATURE,
+                HealthPermissions.READ_PLANNED_EXERCISE,
+                HealthPermissions.WRITE_PLANNED_EXERCISE,
+                HealthPermissions.READ_HEALTH_DATA_HISTORY,
+            )
+    }
+
+    @RequiresFlagsEnabled(
+        Flags.FLAG_ACTIVITY_INTENSITY,
+        Flags.FLAG_ACTIVITY_INTENSITY_DB,
+        Flags.FLAG_HEALTH_CONNECT_MAPPINGS,
+    )
+    @Test
+    fun getHealthPermissions_activityIntensityFlagsEnabled_returnsPermissions() {
+        assertThat(permissionReader.getHealthPermissions())
+            .containsAtLeast(
+                HealthPermissions.READ_ACTIVITY_INTENSITY,
+                HealthPermissions.WRITE_ACTIVITY_INTENSITY,
+            )
+    }
+
+    @RequiresFlagsEnabled(Flags.FLAG_ACTIVITY_INTENSITY_DB, Flags.FLAG_HEALTH_CONNECT_MAPPINGS)
+    @RequiresFlagsDisabled(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    fun getHealthPermissions_activityIntensityFlagDisabled_doesNotReturnPermissions() {
+        assertThat(permissionReader.getHealthPermissions())
+            .containsNoneOf(
+                HealthPermissions.READ_ACTIVITY_INTENSITY,
+                HealthPermissions.WRITE_ACTIVITY_INTENSITY,
+            )
+    }
+
+    @RequiresFlagsEnabled(Flags.FLAG_ACTIVITY_INTENSITY, Flags.FLAG_HEALTH_CONNECT_MAPPINGS)
+    @RequiresFlagsDisabled(Flags.FLAG_ACTIVITY_INTENSITY_DB)
+    @Test
+    fun getHealthPermissions_activityIntensityDbFlagDisabled_doesNotReturnPermissions() {
+        assertThat(permissionReader.getHealthPermissions())
+            .containsNoneOf(
+                HealthPermissions.READ_ACTIVITY_INTENSITY,
+                HealthPermissions.WRITE_ACTIVITY_INTENSITY,
+            )
+    }
+
+    @RequiresFlagsEnabled(Flags.FLAG_ACTIVITY_INTENSITY, Flags.FLAG_ACTIVITY_INTENSITY_DB)
+    @RequiresFlagsDisabled(Flags.FLAG_HEALTH_CONNECT_MAPPINGS)
+    @Test
+    fun getHealthPermissions_healthConnectMappingsFlagDisabled_doesNotReturnPermissions() {
+        assertThat(permissionReader.getHealthPermissions())
+            .containsNoneOf(
+                HealthPermissions.READ_ACTIVITY_INTENSITY,
+                HealthPermissions.WRITE_ACTIVITY_INTENSITY,
+            )
     }
 
     @Test
@@ -145,7 +253,8 @@
     }
 
     @Test
-    fun getAppsWithHealthPermissions_returnsSupportedApps() = runTest {
+    fun getAppsWithHealthPermissions_returnsSupportedApps_handHeldDevices() = runTest {
+        assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
         assertThat(permissionReader.getAppsWithHealthPermissions())
             .containsAtLeast(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2)
     }
@@ -157,15 +266,47 @@
     }
 
     @Test
-    fun getAppsWithHealthPermissions_doesNotReturnUnsupportedApps() = runTest {
+    fun getAppsWithHealthPermissions_doesNotReturnUnsupportedApps_handHeldDevices() = runTest {
+        assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
         assertThat(permissionReader.getAppsWithHealthPermissions())
             .doesNotContain(UNSUPPORTED_TEST_APP_PACKAGE_NAME)
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED)
+    fun getAppsWithHealthPermissions_returnAppsRequestingHealthPermissions_wearDevices() = runTest {
+        assumeTrue(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
+
+        val wearAppsWithHealthPermissions = permissionReader.getAppsWithHealthPermissions()
+        assertThat(wearAppsWithHealthPermissions)
+            .containsAtLeast(
+                TEST_APP_PACKAGE_NAME,
+                TEST_APP_PACKAGE_NAME_2,
+                WEAR_LEGACY_TEST_APP_PACKAGE_NAME, // Test split permissiom from BODY_SENSORS
+                WEAR_TEST_APP_PACKAGE_NAME,
+            )
+        // An app is not considered a wear app with health permissions if not requesting a system
+        // health permission, regardless of declaring an intent filter
+        assertThat(wearAppsWithHealthPermissions)
+            .doesNotContain(MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+    @EnableFlags(Flags.FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED)
+    fun getSystemHealthPermissions_returnSystemHealthPermissions() = runTest {
+        assertThat(permissionReader.getSystemHealthPermissions())
+            .containsExactly(
+                HealthPermissions.READ_HEART_RATE,
+                HealthPermissions.READ_OXYGEN_SATURATION,
+                HealthPermissions.READ_SKIN_TEMPERATURE,
+            )
+    }
+
+    @Test
     fun getAppsWithFitnessPermissions_returnsSupportedApps() = runTest {
         assertThat(permissionReader.getAppsWithFitnessPermissions())
-                .containsAtLeast(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2)
+            .containsAtLeast(TEST_APP_PACKAGE_NAME, TEST_APP_PACKAGE_NAME_2)
     }
 
     @Test
@@ -177,45 +318,40 @@
     @Test
     fun getAppsWithFitnessPermissions_doesNotReturnUnsupportedApps() = runTest {
         assertThat(permissionReader.getAppsWithFitnessPermissions())
-                .doesNotContain(UNSUPPORTED_TEST_APP_PACKAGE_NAME)
+            .doesNotContain(UNSUPPORTED_TEST_APP_PACKAGE_NAME)
     }
 
     @Test
     fun getAppsWithFitnessPermissions_doesNotReturnMedicalPermissionApps() = runTest {
         assertThat(permissionReader.getAppsWithFitnessPermissions())
-                .doesNotContain(MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)
+            .doesNotContain(MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)
     }
 
     @Test
-    fun getAppsWithMedicalPermissions_flagDisabled_returnsEmptyList() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(false)
-
-        assertThat(permissionReader.getAppsWithMedicalPermissions())
-                .isEmpty()
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun getAppsWithMedicalPermissions_phrFlagOff_returnsEmptyList() = runTest {
+        assertThat(permissionReader.getAppsWithMedicalPermissions()).isEmpty()
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun getAppsWithMedicalPermissions_returnsSupportedApps() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-
         assertThat(permissionReader.getAppsWithMedicalPermissions())
-                .containsAtLeast(TEST_APP_PACKAGE_NAME, MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)
+            .containsAtLeast(TEST_APP_PACKAGE_NAME, MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun getAppsWithMedicalPermissions_returnsDistinctApps() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(false)
-
         val apps = permissionReader.getAppsWithMedicalPermissions()
         assertThat(apps).isEqualTo(apps.distinct())
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun getAppsWithMedicalPermissions_doesNotReturnUnsupportedApps() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(false)
-
         assertThat(permissionReader.getAppsWithMedicalPermissions())
-                .doesNotContain(UNSUPPORTED_TEST_APP_PACKAGE_NAME)
+            .doesNotContain(UNSUPPORTED_TEST_APP_PACKAGE_NAME)
     }
 
     @Test
@@ -243,20 +379,7 @@
     }
 
     @Test
-    fun shouldHidePermission_whenFeatureNotEnabled_returnsTrue() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(false)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPlannedExerciseEnabled(false)
-        assertThat(permissionReader.shouldHidePermission(READ_SKIN_TEMPERATURE)).isTrue()
-        assertThat(permissionReader.shouldHidePermission(WRITE_SKIN_TEMPERATURE)).isTrue()
-
-        assertThat(permissionReader.shouldHidePermission(READ_PLANNED_EXERCISE)).isTrue()
-        assertThat(permissionReader.shouldHidePermission(WRITE_PLANNED_EXERCISE)).isTrue()
-    }
-
-    @Test
     fun shouldHidePermission_whenFeatureEnabled_returnsFalse() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsSkinTemperatureEnabled(true)
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPlannedExerciseEnabled(true)
         assertThat(permissionReader.shouldHidePermission(READ_SKIN_TEMPERATURE)).isFalse()
         assertThat(permissionReader.shouldHidePermission(WRITE_SKIN_TEMPERATURE)).isFalse()
 
@@ -265,52 +388,112 @@
     }
 
     @Test
-    fun isAdditionalPermission_returnsTrue() = runTest {
-        val perm = HealthPermission.AdditionalPermission(HealthPermissions.READ_EXERCISE_ROUTES)
-        assertThat(permissionReader.isAdditionalPermission(perm.toString())).isTrue()
+    fun maybeFilterOutAdditionalIfNotValid_fitnessReadDeclared_doesNotChangeList() {
+        val declaredPermissions =
+            listOf(
+                HealthPermissions.WRITE_EXERCISE_ROUTE.toHealthPermission(),
+                HealthPermissions.READ_EXERCISE.toHealthPermission(),
+                HealthPermissions.WRITE_EXERCISE.toHealthPermission(),
+                HealthPermissions.WRITE_SLEEP.toHealthPermission(),
+                HealthPermissions.READ_SLEEP.toHealthPermission(),
+                HealthPermissions.READ_ACTIVE_CALORIES_BURNED.toHealthPermission(),
+                HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED.toHealthPermission(),
+                HealthPermissions.WRITE_MEDICAL_DATA.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_VACCINES.toHealthPermission(),
+                HealthPermission.AdditionalPermission.READ_EXERCISE_ROUTES,
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY,
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+            )
+        val result = permissionReader.maybeFilterOutAdditionalIfNotValid(declaredPermissions)
+        assertThat(result).containsExactlyElementsIn(declaredPermissions)
     }
 
     @Test
-    fun isMedicalPermission_withMedicalPermission_returnsTrue() = runTest {
-        val perm = HealthPermission.MedicalPermission(MedicalPermissionType.ALL_MEDICAL_DATA)
-        assertThat(permissionReader.isMedicalPermission(perm.toString())).isTrue()
+    fun maybeFilterOutAdditionalIfNotValid_noReadDeclared_filtersOutHistoryAndBackground() {
+        val declaredPermissions =
+            listOf(
+                HealthPermissions.WRITE_EXERCISE_ROUTE.toHealthPermission(),
+                HealthPermissions.WRITE_EXERCISE.toHealthPermission(),
+                HealthPermissions.WRITE_SLEEP.toHealthPermission(),
+                HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED.toHealthPermission(),
+                HealthPermissions.WRITE_MEDICAL_DATA.toHealthPermission(),
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY,
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+            )
+        val result = permissionReader.maybeFilterOutAdditionalIfNotValid(declaredPermissions)
+        assertThat(result)
+            .containsExactlyElementsIn(
+                listOf(
+                    HealthPermissions.WRITE_EXERCISE_ROUTE.toHealthPermission(),
+                    HealthPermissions.WRITE_EXERCISE.toHealthPermission(),
+                    HealthPermissions.WRITE_SLEEP.toHealthPermission(),
+                    HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED.toHealthPermission(),
+                    HealthPermissions.WRITE_MEDICAL_DATA.toHealthPermission(),
+                )
+            )
     }
 
     @Test
-    fun isMedicalPermission_withoutMedicalPermission_returnsFalse() = runTest {
-        val perm = HealthPermission.AdditionalPermission(HealthPermissions.READ_EXERCISE_ROUTES)
-        assertThat(permissionReader.isMedicalPermission(perm.toString())).isFalse()
+    fun maybeFilterOutAdditionalIfNotValid_noFitnessReadDeclared_filtersOutHistory() {
+        val declaredPermissions =
+            listOf(
+                HealthPermissions.WRITE_EXERCISE_ROUTE.toHealthPermission(),
+                HealthPermissions.WRITE_EXERCISE.toHealthPermission(),
+                HealthPermissions.WRITE_SLEEP.toHealthPermission(),
+                HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED.toHealthPermission(),
+                HealthPermissions.WRITE_MEDICAL_DATA.toHealthPermission(),
+                HealthPermissions.READ_MEDICAL_DATA_VACCINES.toHealthPermission(),
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_HISTORY,
+                HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+            )
+        val result = permissionReader.maybeFilterOutAdditionalIfNotValid(declaredPermissions)
+        assertThat(result)
+            .containsExactlyElementsIn(
+                listOf(
+                    HealthPermissions.WRITE_EXERCISE_ROUTE.toHealthPermission(),
+                    HealthPermissions.WRITE_EXERCISE.toHealthPermission(),
+                    HealthPermissions.WRITE_SLEEP.toHealthPermission(),
+                    HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED.toHealthPermission(),
+                    HealthPermissions.WRITE_MEDICAL_DATA.toHealthPermission(),
+                    HealthPermissions.READ_MEDICAL_DATA_VACCINES.toHealthPermission(),
+                    HealthPermission.AdditionalPermission.READ_HEALTH_DATA_IN_BACKGROUND,
+                )
+            )
     }
 
     @Test
-    fun getAppPermissionsType_flagDisabled_returnsFitnessOnly() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(false)
-
-        assertThat(permissionReader.getAppPermissionsType(TEST_APP_PACKAGE_NAME)).isEqualTo(FITNESS_PERMISSIONS_ONLY)
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+    fun getAppPermissionsType_phrFlagOff_returnsFitnessOnly() = runTest {
+        assertThat(permissionReader.getAppPermissionsType(TEST_APP_PACKAGE_NAME))
+            .isEqualTo(FITNESS_PERMISSIONS_ONLY)
     }
 
     @Test
-    fun getAppPermissionsType_flagEnabled_returnsCombinedPermissions() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-
-        assertThat(permissionReader.getAppPermissionsType(TEST_APP_PACKAGE_NAME)).isEqualTo(COMBINED_PERMISSIONS)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun getAppPermissionsType_phrFlagOn_returnsCombinedPermissions() = runTest {
+        assertThat(permissionReader.getAppPermissionsType(TEST_APP_PACKAGE_NAME))
+            .isEqualTo(COMBINED_PERMISSIONS)
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     fun getAppPermissionsType_medicalPermissionsOnlyApp_returnsMedicalPermissions() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(true)
-
-        assertThat(permissionReader.getAppPermissionsType(MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)).isEqualTo(MEDICAL_PERMISSIONS_ONLY)
+        assertThat(
+                permissionReader.getAppPermissionsType(MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)
+            )
+            .isEqualTo(MEDICAL_PERMISSIONS_ONLY)
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
     fun getAppPermissionsType_noPermissions_returnsFitnessPermissions() = runTest {
-        (fakeFeatureUtils as FakeFeatureUtils).setIsPersonalHealthRecordEnabled(false)
-
-        assertThat(permissionReader.getAppPermissionsType(MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)).isEqualTo(FITNESS_PERMISSIONS_ONLY)
+        assertThat(
+                permissionReader.getAppPermissionsType(MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME)
+            )
+            .isEqualTo(FITNESS_PERMISSIONS_ONLY)
     }
 
-    private fun String.toHealthPermission(): FitnessPermission {
-        return FitnessPermission.fromPermissionString(this)
+    private fun String.toHealthPermission(): HealthPermission {
+        return HealthPermission.fromPermissionString(this)
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/MockitoExtensions.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/MockitoExtensions.kt
deleted file mode 100644
index 18a2b9e..0000000
--- a/apk/tests/src/com/android/healthconnect/controller/tests/utils/MockitoExtensions.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.android.healthconnect.controller.tests.utils
-
-import org.mockito.Matchers.eq
-import org.mockito.Mockito.`when`
-import org.mockito.stubbing.OngoingStubbing
-import org.mockito.stubbing.Stubber
-
-fun <T : Any> safeEq(value: T): T = eq(value) ?: value
-
-/**
- * Helper function for stubbing methods without the need to use backticks.
- *
- * @see Mockito.when
- */
-fun <T> whenever(methodCall: T): OngoingStubbing<T> = `when`(methodCall)
-
-fun <T> Stubber.whenever(mock: T): T = `when`(mock)
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/TestConstants.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/TestConstants.kt
index 2413d47..eac1e33 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/utils/TestConstants.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utils/TestConstants.kt
@@ -502,6 +502,8 @@
 const val UNSUPPORTED_TEST_APP_PACKAGE_NAME = "android.healthconnect.controller.test.app3"
 const val OLD_PERMISSIONS_TEST_APP_PACKAGE_NAME = "android.healthconnect.controller.test.app4"
 const val MEDICAL_PERMISSIONS_TEST_APP_PACKAGE_NAME = "android.healthconnect.controller.test.app5"
+const val WEAR_LEGACY_TEST_APP_PACKAGE_NAME = "android.healthconnect.controller.test.app6"
+const val WEAR_TEST_APP_PACKAGE_NAME = "android.healthconnect.controller.test.app7"
 const val TEST_APP_NAME = "Health Connect test app"
 const val TEST_APP_NAME_2 = "Health Connect test app 2"
 const val TEST_APP_NAME_3 = "Health Connect test app 3"
@@ -523,46 +525,46 @@
 // endregion
 
 // PHR
-const val TEST_DATASOURCE_ID = "123"
+val TEST_DATASOURCE_ID = getUniqueId()
 val TEST_FHIR_VERSION: FhirVersion = FhirVersion.parseFhirVersion("4.0.1")
 val TEST_FHIR_RESOURCE_IMMUNIZATION: FhirResource =
     FhirResource.Builder(
             FHIR_RESOURCE_TYPE_IMMUNIZATION,
             "Immunization1",
-            "{\"resourceType\" : \"Immunization\", \"id\" : \"Immunization_1\"}",
+        "{\"resourceType\":\"Immunization\",\"id\":\"immunization-1\",\"status\":\"completed\",\"vaccineCode\":{\"coding\":[{\"system\":\"http://hl7.org/fhir/sid/cvx\",\"code\":\"115\"},{\"system\":\"http://hl7.org/fhir/sid/ndc\",\"code\":\"58160-842-11\"}],\"text\":\"Tdap\"},\"patient\":{\"reference\":\"Patient/patient_1\",\"display\":\"Example, Anne\"},\"occurrenceDateTime\":\"2018-05-21\"}"
         )
         .build()
 val TEST_FHIR_RESOURCE_IMMUNIZATION_2: FhirResource =
     FhirResource.Builder(
             FHIR_RESOURCE_TYPE_IMMUNIZATION,
             "Immunization2",
-            "{\"resourceType\" : \"Immunization\", \"id\" : \"Immunization_2\"}",
+        "{\"resourceType\":\"Immunization\",\"id\":\"immunization-2\",\"status\":\"completed\",\"vaccineCode\":{\"coding\":[{\"system\":\"http://hl7.org/fhir/sid/cvx\",\"code\":\"115\"},{\"system\":\"http://hl7.org/fhir/sid/ndc\",\"code\":\"58160-842-11\"}],\"text\":\"Tdap\"},\"patient\":{\"reference\":\"Patient/patient_1\",\"display\":\"Example, Anne\"},\"occurrenceDateTime\":\"2018-05-21\"}"
         )
         .build()
 val TEST_FHIR_RESOURCE_IMMUNIZATION_3: FhirResource =
     FhirResource.Builder(
             FHIR_RESOURCE_TYPE_IMMUNIZATION,
             "Immunization3",
-            "{\"resourceType\" : \"Immunization\", \"id\" : \"Immunization_3\"}",
+              "{\"resourceType\":\"Immunization\",\"id\":\"immunization-3\",\"status\":\"completed\",\"vaccineCode\":{\"coding\":[{\"system\":\"http://hl7.org/fhir/sid/cvx\",\"code\":\"115\"},{\"system\":\"http://hl7.org/fhir/sid/ndc\",\"code\":\"58160-842-11\"}],\"text\":\"Tdap\"},\"patient\":{\"reference\":\"Patient/patient_1\",\"display\":\"Example, Anne\"},\"occurrenceDateTime\":\"2018-05-21\"}"
         )
         .build()
 val TEST_FHIR_RESOURCE_IMMUNIZATION_LONG: FhirResource =
     FhirResource.Builder(
             FHIR_RESOURCE_TYPE_IMMUNIZATION,
             "Immunization11",
-            "{\"resourceType\":\"Immunization\",\"id\":\"immunization_1\",\"status\":\"completed\",\"vaccineCode\":{\"coding\":[{\"system\":\"http://hl7.org/fhir/sid/cvx\",\"code\":\"115\"},{\"system\":\"http://hl7.org/fhir/sid/ndc\",\"code\":\"58160-842-11\"}],\"text\":\"Tdap\"},\"patient\":{\"reference\":\"Patient/patient_1\",\"display\":\"Example, Anne\"},\"encounter\":{\"reference\":\"Encounter/encounter_unk\",\"display\":\"GP Visit\"},\"occurrenceDateTime\":\"2018-05-21\",\"primarySource\":true,\"manufacturer\":{\"display\":\"Sanofi Pasteur\"},\"lotNumber\":\"1\",\"site\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v3-ActSite\",\"code\":\"LA\",\"display\":\"Left Arm\"}],\"text\":\"Left Arm\"},\"route\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration\",\"code\":\"IM\",\"display\":\"Injection, intramuscular\"}],\"text\":\"Injection, intramuscular\"},\"doseQuantity\":{\"value\":0.5,\"unit\":\"mL\"},\"performer\":[{\"function\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v2-0443\",\"code\":\"AP\",\"display\":\"Administering Provider\"}],\"text\":\"Administering Provider\"},\"actor\":{\"reference\":\"Practitioner/practitioner_1\",\"type\":\"Practitioner\",\"display\":\"Dr Maria Hernandez\"}}]}",
+            "{\"resourceType\":\"Immunization\",\"id\":\"immunization-1\",\"status\":\"completed\",\"vaccineCode\":{\"coding\":[{\"system\":\"http://hl7.org/fhir/sid/cvx\",\"code\":\"115\"},{\"system\":\"http://hl7.org/fhir/sid/ndc\",\"code\":\"58160-842-11\"}],\"text\":\"Tdap\"},\"patient\":{\"reference\":\"Patient/patient_1\",\"display\":\"Example, Anne\"},\"encounter\":{\"reference\":\"Encounter/encounter_unk\",\"display\":\"GP Visit\"},\"occurrenceDateTime\":\"2018-05-21\",\"primarySource\":true,\"manufacturer\":{\"display\":\"Sanofi Pasteur\"},\"lotNumber\":\"1\",\"site\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v3-ActSite\",\"code\":\"LA\",\"display\":\"Left Arm\"}],\"text\":\"Left Arm\"},\"route\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration\",\"code\":\"IM\",\"display\":\"Injection, intramuscular\"}],\"text\":\"Injection, intramuscular\"},\"doseQuantity\":{\"value\":0.5,\"unit\":\"mL\"},\"performer\":[{\"function\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v2-0443\",\"code\":\"AP\",\"display\":\"Administering Provider\"}],\"text\":\"Administering Provider\"},\"actor\":{\"reference\":\"Practitioner/practitioner_1\",\"type\":\"Practitioner\",\"display\":\"Dr Maria Hernandez\"}}]}",
         )
         .build()
 val TEST_FHIR_RESOURCE_INVALID_JSON: FhirResource =
     FhirResource.Builder(
             FHIR_RESOURCE_TYPE_IMMUNIZATION,
             "invalid_json",
-            "{\"resourceType\" : \"Immunization\", {{{\"id\"\" : \"Immunization_3\"}",
+            "{\"resourceType\" : \"Immunization\", {{{\"id\"\" : \"Immunization-3\"}",
         )
         .build()
 val TEST_MEDICAL_RESOURCE_IMMUNIZATION: MedicalResource =
     MedicalResource.Builder(
-            MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+            MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
             TEST_DATASOURCE_ID,
             TEST_FHIR_VERSION,
             TEST_FHIR_RESOURCE_IMMUNIZATION,
@@ -570,7 +572,7 @@
         .build()
 val TEST_MEDICAL_RESOURCE_IMMUNIZATION_2: MedicalResource =
     MedicalResource.Builder(
-            MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+            MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
             TEST_DATASOURCE_ID,
             TEST_FHIR_VERSION,
             TEST_FHIR_RESOURCE_IMMUNIZATION_2,
@@ -578,7 +580,7 @@
         .build()
 val TEST_MEDICAL_RESOURCE_IMMUNIZATION_3: MedicalResource =
     MedicalResource.Builder(
-            MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+            MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
             TEST_DATASOURCE_ID,
             TEST_FHIR_VERSION,
             TEST_FHIR_RESOURCE_IMMUNIZATION_3,
@@ -586,7 +588,7 @@
         .build()
 val TEST_MEDICAL_RESOURCE_IMMUNIZATION_LONG: MedicalResource =
     MedicalResource.Builder(
-            MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+            MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
             TEST_DATASOURCE_ID,
             TEST_FHIR_VERSION,
             TEST_FHIR_RESOURCE_IMMUNIZATION_LONG,
@@ -594,7 +596,7 @@
         .build()
 val TEST_MEDICAL_RESOURCE_INVALID_JSON: MedicalResource =
     MedicalResource.Builder(
-            MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+            MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES,
             TEST_DATASOURCE_ID,
             TEST_FHIR_VERSION,
             TEST_FHIR_RESOURCE_INVALID_JSON,
@@ -602,26 +604,29 @@
         .build()
 val TEST_MEDICAL_DATA_SOURCE: MedicalDataSource =
     MedicalDataSource.Builder(
-            /* id= */ "123",
+            /* id= */ TEST_DATASOURCE_ID,
             TEST_APP_PACKAGE_NAME,
             /* fhirBaseUri= */ Uri.parse("fhir.base.uri"),
             /* displayName= */ "App A Data Source",
+            /* fhirVersion= */ TEST_FHIR_VERSION,
         )
         .build()
 val TEST_MEDICAL_DATA_SOURCE_2: MedicalDataSource =
     MedicalDataSource.Builder(
-            /* id= */ "234",
+            /* id= */ getUniqueId(),
             TEST_APP_PACKAGE_NAME,
             /* fhirBaseUri= */ Uri.parse("fhir.base.uri"),
             /* displayName= */ "App A Data Source 2",
+            /* fhirVersion= */ TEST_FHIR_VERSION,
         )
         .build()
 val TEST_MEDICAL_DATA_SOURCE_DIFFERENT_APP: MedicalDataSource =
     MedicalDataSource.Builder(
-            /* id= */ "456",
+            /* id= */ getUniqueId(),
             TEST_APP_PACKAGE_NAME_2,
             /* fhirBaseUri= */ Uri.parse("fhir.base.uri"),
             /* displayName= */ "App B Data Source",
+            /* fhirVersion= */ TEST_FHIR_VERSION,
         )
         .build()
 // endregion
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/TestTimeSource.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/TestTimeSource.kt
index 2a81fea..717b843 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/utils/TestTimeSource.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utils/TestTimeSource.kt
@@ -32,10 +32,11 @@
 object TestTimeSource : TimeSource {
     private var localNow: Instant = NOW
     private var is24HourFormat = true
+    private var offset: ZoneId = UTC
 
     override fun currentTimeMillis(): Long = localNow.toEpochMilli()
 
-    override fun deviceZoneOffset(): ZoneId = UTC
+    override fun deviceZoneOffset(): ZoneId = offset
 
     override fun currentLocalDateTime(): LocalDateTime =
         Instant.ofEpochMilli(currentTimeMillis()).atZone(deviceZoneOffset()).toLocalDateTime()
@@ -56,6 +57,10 @@
     fun setIs24Hour(boolean: Boolean) {
         is24HourFormat = boolean
     }
+
+    fun setDeviceZoneOffset(offset: ZoneId) {
+        this.offset = offset
+    }
 }
 
 @Module
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/ViewMatchers.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/ViewMatchers.kt
index 99136c0..d91c95d 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/utils/ViewMatchers.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utils/ViewMatchers.kt
@@ -18,9 +18,20 @@
 import android.view.View
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.matcher.BoundedMatcher
+import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
+import androidx.test.espresso.matcher.ViewMatchers.isChecked
+import androidx.test.espresso.matcher.ViewMatchers.isNotChecked
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withTagValue
+import androidx.test.espresso.matcher.ViewMatchers.withText
 import org.hamcrest.Description
 import org.hamcrest.Matcher
+import org.hamcrest.Matchers.allOf
+import org.hamcrest.Matchers.`is`
+import org.hamcrest.Matchers.not
 import org.hamcrest.TypeSafeMatcher
 
 /**
@@ -103,3 +114,66 @@
     }
     return null // No match found
 }
+
+// Checkbox assertions
+fun assertCheckboxNotChecked(
+    recyclerViewId: Int,
+    title: String,
+    position: Int,
+    tag: String = "checkbox",
+) {
+    onView(withId(recyclerViewId))
+        .check(
+            matches(
+                atPosition(
+                    position,
+                    allOf(
+                        hasDescendant(withText(title)),
+                        hasDescendant(withTagValue(`is`(tag))),
+                        hasDescendant(isNotChecked()),
+                    ),
+                )
+            )
+        )
+}
+
+fun assertCheckboxNotShown(
+    recyclerViewId: Int,
+    title: String,
+    position: Int,
+    tag: String = "checkbox",
+) {
+    onView(withId(recyclerViewId))
+        .check(
+            matches(
+                atPosition(
+                    position,
+                    allOf(
+                        hasDescendant(withText(title)),
+                        not(hasDescendant(withTagValue(`is`(tag)))),
+                    ),
+                )
+            )
+        )
+}
+
+fun assertCheckboxChecked(
+    recyclerViewId: Int,
+    title: String,
+    position: Int,
+    tag: String = "checkbox",
+) {
+    onView(withId(recyclerViewId))
+        .check(
+            matches(
+                atPosition(
+                    position,
+                    allOf(
+                        hasDescendant(withText(title)),
+                        hasDescendant(withTagValue(`is`(tag))),
+                        hasDescendant(isChecked()),
+                    ),
+                )
+            )
+        )
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeDeviceInfoUtils.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeDeviceInfoUtils.kt
index 1214da4..08ea0c9 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeDeviceInfoUtils.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeDeviceInfoUtils.kt
@@ -30,6 +30,8 @@
 
     private var isHealthConnectAvailable = true
 
+    private var isIntentHandlerAvailable = false
+
     var helpCenterInvoked = false
     var backupAndRestoreHelpCenterInvoked = false
 
@@ -53,6 +55,10 @@
         isHealthConnectAvailable = isAvailable
     }
 
+    fun setIntentHandlerAvailability(available: Boolean) {
+        isIntentHandlerAvailable = available
+    }
+
     override fun isHealthConnectAvailable(context: Context): Boolean {
         return isHealthConnectAvailable
     }
@@ -76,6 +82,10 @@
     override fun openSendFeedbackActivity(activity: FragmentActivity) {}
 
     override fun isIntentHandlerAvailable(context: Context, intent: Intent): Boolean {
+        return isIntentHandlerAvailable
+    }
+
+    override fun isOnWatch(context: Context): Boolean {
         return false
     }
 }
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeFeatureUtils.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeFeatureUtils.kt
deleted file mode 100644
index 3d5333f..0000000
--- a/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeFeatureUtils.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.android.healthconnect.controller.tests.utils.di
-
-import com.android.healthconnect.controller.utils.FeatureUtils
-import com.android.healthconnect.controller.utils.FeaturesModule
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.components.SingletonComponent
-import dagger.hilt.testing.TestInstallIn
-import javax.inject.Singleton
-
-class FakeFeatureUtils : FeatureUtils {
-
-    private var isSessionTypesEnabled = true
-    private var isExerciseRoutesReadAllEnabled = true
-    private var isEntryPointsEnabled = true
-    private var isNewInformationArchitectureEnabled = false
-    private var isBackgroundReadEnabled = false
-    private var isHistoryReadEnabled = false
-    private var isSkinTemperatureEnabled = false
-    private var isPlannedExerciseEnabled = false
-    private var isPersonalHealthRecordEnabled = false
-
-    fun setIsSessionTypesEnabled(boolean: Boolean) {
-        isSessionTypesEnabled = boolean
-    }
-
-    fun setIsExerciseRoutesReadAllEnabled(boolean: Boolean) {
-        isExerciseRoutesReadAllEnabled = boolean
-    }
-
-    fun setIsEntryPointsEnabled(boolean: Boolean) {
-        isEntryPointsEnabled = boolean
-    }
-
-    fun setIsNewInformationArchitectureEnabled(boolean: Boolean) {
-        isNewInformationArchitectureEnabled = boolean
-    }
-
-    fun setIsBackgroundReadEnabled(isBackgroundReadEnabled: Boolean) {
-        this.isBackgroundReadEnabled = isBackgroundReadEnabled
-    }
-
-    fun setIsHistoryReadEnabled(isHistoryReadEnabled: Boolean) {
-        this.isHistoryReadEnabled = isHistoryReadEnabled
-    }
-
-    fun setIsSkinTemperatureEnabled(isSkinTemperatureEnabled: Boolean) {
-        this.isSkinTemperatureEnabled = isSkinTemperatureEnabled
-    }
-
-    fun setIsPlannedExerciseEnabled(isPlannedExerciseEnabled: Boolean) {
-        this.isPlannedExerciseEnabled = isPlannedExerciseEnabled
-    }
-
-    fun setIsPersonalHealthRecordEnabled(isPersonalHealthRecordEnabled: Boolean) {
-        this.isPersonalHealthRecordEnabled = isPersonalHealthRecordEnabled
-    }
-
-    override fun isNewInformationArchitectureEnabled(): Boolean {
-        return isNewInformationArchitectureEnabled
-    }
-
-    override fun isSessionTypesEnabled(): Boolean {
-        return isSessionTypesEnabled
-    }
-
-    override fun isExerciseRouteReadAllEnabled(): Boolean {
-        return isExerciseRoutesReadAllEnabled
-    }
-
-    override fun isEntryPointsEnabled(): Boolean {
-        return isEntryPointsEnabled
-    }
-
-    override fun isBackgroundReadEnabled(): Boolean {
-        return isBackgroundReadEnabled
-    }
-
-    override fun isHistoryReadEnabled(): Boolean {
-        return isHistoryReadEnabled
-    }
-
-    override fun isPlannedExerciseEnabled(): Boolean {
-        return isPlannedExerciseEnabled
-    }
-
-    override fun isSkinTemperatureEnabled(): Boolean {
-        return isSkinTemperatureEnabled
-    }
-
-    override fun isPersonalHealthRecordEnabled(): Boolean {
-        return isPersonalHealthRecordEnabled
-    }
-}
-
-@Module
-@TestInstallIn(components = [SingletonComponent::class], replaces = [FeaturesModule::class])
-object FakeFeaturesUtilsModule {
-    @Provides @Singleton fun providesFeaturesUtils(): FeatureUtils = FakeFeatureUtils()
-}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeHealthPermissionManager.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeHealthPermissionManager.kt
index f8dde59..8d94895 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeHealthPermissionManager.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utils/di/FakeHealthPermissionManager.kt
@@ -16,6 +16,9 @@
 
 package com.android.healthconnect.controller.tests.utils.di
 
+import android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED
+import android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET
+import android.content.pm.PackageManager.PERMISSION_GRANTED
 import com.android.healthconnect.controller.permissions.api.HealthPermissionManager
 import com.android.healthconnect.controller.tests.utils.NOW
 import java.time.Instant
@@ -25,6 +28,16 @@
     private val grantedPermissions = mutableMapOf<String, MutableList<String>>()
     private val healthPermissionFlags = mutableMapOf<String, Map<String, Int>>()
 
+    var revokeHealthPermissionInvocations = 0
+    var grantHealthPermissionInvocations = 0
+
+    fun reset() {
+        revokeHealthPermissionInvocations = 0
+        grantHealthPermissionInvocations = 0
+        grantedPermissions.clear()
+        healthPermissionFlags.clear()
+    }
+
     fun setHealthPermissionFlags(packageName: String, flags: Map<String, Int>) {
         healthPermissionFlags[packageName] = flags
     }
@@ -34,12 +47,12 @@
     }
 
     override fun getGrantedHealthPermissions(packageName: String): List<String> {
-        return grantedPermissions.getOrDefault(packageName, emptyList())
+        return grantedPermissions.getOrDefault(packageName, emptyList()).toSet().toList()
     }
 
     override fun getHealthPermissionsFlags(
         packageName: String,
-        permissions: List<String>
+        permissions: List<String>,
     ): Map<String, Int> {
         return healthPermissionFlags.getOrDefault(packageName, mapOf())
     }
@@ -47,7 +60,7 @@
     override fun setHealthPermissionsUserFixedFlagValue(
         packageName: String,
         permissions: List<String>,
-        value: Boolean
+        value: Boolean,
     ) {
         // do nothing
     }
@@ -56,12 +69,31 @@
         val permissions = grantedPermissions.getOrDefault(packageName, mutableListOf())
         permissions.add(permissionName)
         grantedPermissions[packageName] = permissions
+
+        val flags = getHealthPermissionsFlags(packageName, permissions).toMutableMap()
+        flags[permissionName] = PERMISSION_GRANTED
+        setHealthPermissionFlags(packageName, flags.toMap())
+        grantHealthPermissionInvocations += 1
     }
 
     override fun revokeHealthPermission(packageName: String, permissionName: String) {
         val permissions = grantedPermissions.getOrDefault(packageName, mutableListOf())
         permissions.remove(permissionName)
         grantedPermissions[packageName] = permissions
+
+        val flags = getHealthPermissionsFlags(packageName, permissions).toMutableMap()
+        if (flags.containsKey(permissionName)) {
+            val currentFlag = flags[permissionName]
+            if (currentFlag == PERMISSION_GRANTED) {
+                flags[permissionName] = FLAG_PERMISSION_USER_SET
+            } else if (currentFlag == FLAG_PERMISSION_USER_SET) {
+                flags[permissionName] = FLAG_PERMISSION_USER_FIXED
+            }
+        } else {
+            flags[permissionName] = FLAG_PERMISSION_USER_SET
+        }
+        setHealthPermissionFlags(packageName, flags.toMap())
+        revokeHealthPermissionInvocations += 1
     }
 
     override fun revokeAllHealthPermissions(packageName: String) {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/HealthConnectLoggerTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/HealthConnectLoggerTest.kt
new file mode 100644
index 0000000..06f0ea5
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/HealthConnectLoggerTest.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.tests.utiltests
+
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
+import com.android.healthconnect.controller.utils.logging.PageName
+import com.android.healthconnect.controller.utils.logging.PageName.ALL_MEDICAL_DATA_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.COMBINED_APP_ACCESS_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.MEDICAL_APP_ACCESS_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.RAW_FHIR_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.REQUEST_MEDICAL_PERMISSIONS_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.REQUEST_WRITE_MEDICAL_PERMISSION_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.SETTINGS_MANAGE_COMBINED_APP_PERMISSIONS_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.SETTINGS_MANAGE_MEDICAL_APP_PERMISSIONS_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.TAB_MEDICAL_ACCESS_PAGE
+import com.android.healthconnect.controller.utils.logging.PageName.TAB_MEDICAL_ENTRIES_PAGE
+import com.android.healthfitness.flags.Flags
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import javax.inject.Inject
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@HiltAndroidTest
+class HealthConnectLoggerTest {
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+    @get:Rule val setFlagsRule = SetFlagsRule()
+
+    @Inject lateinit var healthConnectLogger: HealthConnectLogger
+
+    @Before
+    fun setup() {
+        hiltRule.inject()
+    }
+
+    private val phrPages =
+        listOf(
+            ALL_MEDICAL_DATA_PAGE,
+            TAB_MEDICAL_ENTRIES_PAGE,
+            TAB_MEDICAL_ACCESS_PAGE,
+            RAW_FHIR_PAGE,
+            REQUEST_MEDICAL_PERMISSIONS_PAGE,
+            COMBINED_APP_ACCESS_PAGE,
+            MEDICAL_APP_ACCESS_PAGE,
+            SETTINGS_MANAGE_COMBINED_APP_PERMISSIONS_PAGE,
+            SETTINGS_MANAGE_MEDICAL_APP_PERMISSIONS_PAGE,
+            REQUEST_WRITE_MEDICAL_PERMISSION_PAGE,
+        )
+
+    @Test
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_UI_TELEMETRY)
+    fun logMedicalPageNames_flagOff_unknownPageNameLogged() {
+        phrPages.forEach {
+            healthConnectLogger.setPageId(it)
+
+            assertThat(healthConnectLogger.getPageId()).isEqualTo(PageName.UNKNOWN_PAGE)
+        }
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_UI_TELEMETRY)
+    fun logMedicalPageNames_flagOn_actualPageNameLogged() {
+        phrPages.forEach {
+            healthConnectLogger.setPageId(it)
+
+            assertThat(healthConnectLogger.getPageId()).isEqualTo(it)
+        }
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/TimeExtensionsTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/TimeExtensionsTest.kt
index 51fc23a..7d95787 100644
--- a/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/TimeExtensionsTest.kt
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/TimeExtensionsTest.kt
@@ -15,9 +15,11 @@
  */
 package com.android.healthconnect.controller.tests.utiltests
 
+import com.android.healthconnect.controller.tests.utils.TestTimeSource
 import com.android.healthconnect.controller.utils.atStartOfDay
 import com.android.healthconnect.controller.utils.getInstant
 import com.android.healthconnect.controller.utils.isAtLeastOneDayAfter
+import com.android.healthconnect.controller.utils.isLessThanOneYearAgo
 import com.android.healthconnect.controller.utils.isOnDayAfter
 import com.android.healthconnect.controller.utils.isOnDayBefore
 import com.android.healthconnect.controller.utils.isOnSameDay
@@ -253,6 +255,28 @@
     }
 
     @Test
+    fun instantIsLessThanOneYearAgo_returnsTrue() {
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
+        val timeSource = TestTimeSource
+        val nowInstant = Instant.parse("2023-02-14T03:00:00Z")
+        val thenInstant = Instant.parse("2022-12-14T03:00:00Z")
+        timeSource.setNow(nowInstant)
+
+        assertThat(thenInstant.isLessThanOneYearAgo(timeSource)).isTrue()
+    }
+
+    @Test
+    fun instantIsMoreThanOneYearAgo_returnsFalse() {
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
+        val timeSource = TestTimeSource
+        val nowInstant = Instant.parse("2023-02-14T03:00:00Z")
+        val thenInstant = Instant.parse("2021-12-14T03:00:00Z")
+        timeSource.setNow(nowInstant)
+
+        assertThat(thenInstant.isLessThanOneYearAgo(timeSource)).isFalse()
+    }
+
+    @Test
     fun localDateToInstantAtStartOfDay_returnsCorrectInstant() {
         // UTC - 3
         TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("America/Sao_Paulo")))
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/TimeUtilsTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/TimeUtilsTest.kt
new file mode 100644
index 0000000..972e2d0
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utiltests/TimeUtilsTest.kt
@@ -0,0 +1,498 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.controller.tests.utiltests
+
+import android.content.Context
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
+import com.android.healthconnect.controller.tests.utils.NOW
+import com.android.healthconnect.controller.tests.utils.TestTimeSource
+import com.android.healthconnect.controller.tests.utils.setLocale
+import com.android.healthconnect.controller.utils.LocalDateTimeFormatter
+import com.android.healthconnect.controller.utils.TimeSource
+import com.android.healthconnect.controller.utils.formatDateTimeForTimePeriod
+import com.android.healthconnect.controller.utils.formatRecentAccessTime
+import com.android.healthconnect.controller.utils.getPeriodStartDate
+import com.google.common.truth.Truth.assertThat
+import java.time.Instant
+import java.time.ZoneId
+import java.util.Locale
+import java.util.TimeZone
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+
+class TimeUtilsTest {
+    private lateinit var context: Context
+    private lateinit var dateFormatter: LocalDateTimeFormatter
+    private lateinit var timeSource: TimeSource
+
+    @Before
+    fun setup() {
+        context = InstrumentationRegistry.getInstrumentation().context
+        context.setLocale(Locale.US)
+        dateFormatter = LocalDateTimeFormatter(context)
+        timeSource = TestTimeSource
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
+    }
+
+    @After
+    fun tearDown() {
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")))
+    }
+
+    @Test
+    fun getPeriodStartDate_periodDay_startTimeSameDateAsLocal() {
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+
+        val expectedResult = Instant.parse("2021-09-19T00:00:00.000Z")
+        val actualResult = getPeriodStartDate(startTime, period)
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun getPeriodStartDate_periodDay_startTimeDiffDateToLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+
+        val expectedResult = Instant.parse("2021-09-19T15:00:00.000Z")
+        val actualResult = getPeriodStartDate(startTime, period)
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun getPeriodStartDate_periodWeek_startTimeSameDateAsLocal() {
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+
+        val expectedResult = Instant.parse("2021-09-13T00:00:00.000Z")
+        val actualResult = getPeriodStartDate(startTime, period)
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun getPeriodStartDate_periodWeek_startTimeDiffDateToLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+
+        val expectedResult = Instant.parse("2021-09-19T15:00:00.000Z")
+        val actualResult = getPeriodStartDate(startTime, period)
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun getPeriodStartDate_periodMonth_startTimeSameDateAsLocal() {
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_MONTH
+
+        val expectedResult = Instant.parse("2021-09-01T00:00:00.000Z")
+        val actualResult = getPeriodStartDate(startTime, period)
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun getPeriodStartDate_periodMonth_startTimeDiffDateToLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2021-09-30T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_MONTH
+
+        val expectedResult = Instant.parse("2021-09-30T15:00:00.000Z")
+        val actualResult = getPeriodStartDate(startTime, period)
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodDay_withWeekday_pastYear_startTimeSameDateAsLocal() {
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+        val useWeekday = true
+
+        val expectedResult = "Sun, Sep 19, 2021"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodDay_withWeekday_sameYear_startTimeSameDateAsLocal() {
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2022-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+        val useWeekday = true
+
+        val expectedResult = "Mon, Sep 19"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodDay_withoutWeekday_pastYear_startTimeSameDateAsLocal() {
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+        val useWeekday = false
+
+        val expectedResult = "Sep 19, 2021"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodDay_withoutWeekday_sameYear_startTimeSameDateAsLocal() {
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2022-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+        val useWeekday = false
+
+        val expectedResult = "Sep 19"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodDay_withWeekday_pastYear_startTimeDiffDateAsLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+        val useWeekday = true
+
+        val expectedResult = "Mon, Sep 20, 2021"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodDay_withWeekday_sameYear_startTimeDiffDateAsLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2022-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+        val useWeekday = true
+
+        val expectedResult = "Tue, Sep 20"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodDay_withoutWeekday_pastYear_startTimeDiffDateAsLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2021-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+        val useWeekday = false
+
+        val expectedResult = "Sep 20, 2021"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodDay_withoutWeekday_sameYear_startTimeDiffDateAsLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2022-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_DAY
+        val useWeekday = false
+
+        val expectedResult = "Sep 20"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodWeek_sameYear_startTimeNotOnMonday_sameTimeZone() {
+        // UTC
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2022-09-20T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+        val useWeekday = true
+
+        val expectedResult = "Sep 19 – 25"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodWeek_sameYear_startTimeOnMonday_sameTimeZone() {
+        // UTC
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2022-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+        val useWeekday = true
+
+        val expectedResult = "Sep 19 – 25"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodWeek_sameYear_startTimeNotOnMonday_diffTimeZone() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2022-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+        val useWeekday = true
+
+        val expectedResult = "Sep 19 – 25"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodWeek_sameYear_startTimeOnMonday_diffTimeZone() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2022-09-18T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+        val useWeekday = true
+
+        val expectedResult = "Sep 19 – 25"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodWeek_pastYear_startTimeNotOnMonday_sameTimeZone() {
+        // UTC
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2020-09-20T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+        val useWeekday = true
+
+        val expectedResult = "Sep 14 – 20, 2020"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodWeek_pastYear_startTimeOnMonday_sameTimeZone() {
+        // UTC
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2020-09-21T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+        val useWeekday = true
+
+        val expectedResult = "Sep 21 – 27, 2020"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodWeek_pastYear_startTimeNotOnMonday_diffTimeZone() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2020-09-19T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+        val useWeekday = true
+
+        val expectedResult = "Sep 14 – 20, 2020"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodWeek_pastYear_startTimeOnMonday_diffTimeZone() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2020-09-20T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_WEEK
+        val useWeekday = true
+
+        val expectedResult = "Sep 21 – 27, 2020"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodMonth_sameYear_startTimeSameDateAsLocal() {
+        // UTC
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2022-09-21T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_MONTH
+        val useWeekday = true
+
+        val expectedResult = "September"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodMonth_sameYear_startTimeDiffDateAsLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2022-09-30T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_MONTH
+        val useWeekday = true
+
+        val expectedResult = "October"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodMonth_pastYear_startTimeSameDateAsLocal() {
+        // UTC
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("UTC"))
+        val startTime = Instant.parse("2020-09-21T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_MONTH
+        val useWeekday = true
+
+        val expectedResult = "September 2020"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatDateTimeForTimePeriod_periodMonth_pastYear_startTimeDiffDateAsLocal() {
+        // UTC + 9
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Asia/Tokyo")))
+        (timeSource as TestTimeSource).setNow(NOW)
+        (timeSource as TestTimeSource).setDeviceZoneOffset(ZoneId.of("Asia/Tokyo"))
+        val startTime = Instant.parse("2020-09-30T20:00:00.000Z")
+        val period = DateNavigationPeriod.PERIOD_MONTH
+        val useWeekday = true
+
+        val expectedResult = "October 2020"
+        val actualResult =
+            formatDateTimeForTimePeriod(startTime, period, dateFormatter, timeSource, useWeekday)
+
+        assertThat(actualResult).isEqualTo(expectedResult)
+    }
+
+    @Test
+    fun formatRecentAccessTime_24Hour_returns24HourString() {
+        (timeSource as TestTimeSource).setIs24Hour(true)
+        val time = Instant.parse("2024-11-20T20:15:45.000Z")
+        val result = formatRecentAccessTime(time, timeSource, context)
+
+        assertThat(result).isEqualTo("20:15")
+    }
+
+    @Test
+    fun formatRecentAccessTime_12Hour_korea_returnsSpecial12HourString() {
+        (timeSource as TestTimeSource).setIs24Hour(false)
+        context.setLocale(Locale.KOREA)
+        val time = Instant.parse("2024-11-20T20:15:45.000Z")
+        val result = formatRecentAccessTime(time, timeSource, context)
+
+        assertThat(result.substring(3)).isEqualTo("8:15")
+    }
+
+    @Test
+    fun formatRecentAccessTime_12Hour_korean_returnsSpecial12HourString() {
+        (timeSource as TestTimeSource).setIs24Hour(false)
+        context.setLocale(Locale.KOREAN)
+        val time = Instant.parse("2024-11-20T20:15:45.000Z")
+        val result = formatRecentAccessTime(time, timeSource, context)
+
+        assertThat(result.substring(3)).isEqualTo("8:15")
+    }
+
+    @Test
+    fun formatRecentAccessTime_12Hour_returns12HourString() {
+        (timeSource as TestTimeSource).setIs24Hour(false)
+        val time = Instant.parse("2024-11-20T20:15:45.000Z")
+        val result = formatRecentAccessTime(time, timeSource, context)
+
+        assertThat(result).isEqualTo("8:15 PM")
+    }
+}
diff --git a/flags/Android.bp b/flags/Android.bp
index c3b563a..6df4b40 100644
--- a/flags/Android.bp
+++ b/flags/Android.bp
@@ -52,8 +52,28 @@
     defaults: ["framework-minus-apex-aconfig-java-defaults"],
     mode: "exported",
     visibility: [
-        // Added this due to go/android-flags-howto-apis#test-infra-and-mainline-support, hence
-        // making this only visible to tests for now.
+        // This has to be exported due to
+        // go/android-flags-howto-apis#test-infra-and-mainline-support, hence making this only
+        // visible to tests for now.
+        "//packages/modules/HealthFitness/tests:__subpackages__",
+    ],
+}
+
+// This is needed and only used for hostside tests
+// See:
+// - go/flag-value-annotations#usage
+// - http://shortn/_MWsbwMFJUo
+java_aconfig_library {
+    name: "healthfitness-exported-aconfig-flags-lib-host",
+    aconfig_declarations: "healthfitness-aconfig-flags",
+    min_sdk_version: "34",
+    defaults: ["framework-minus-apex-aconfig-java-defaults"],
+    mode: "exported",
+    host_supported: true,
+    visibility: [
+        // This has to be exported due to
+        // go/android-flags-howto-apis#test-infra-and-mainline-support, hence making this only
+        // visible to tests for now.
         "//packages/modules/HealthFitness/tests:__subpackages__",
     ],
 }
diff --git a/flags/flags.aconfig b/flags/flags.aconfig
index 0ed24cd..b22ce42 100644
--- a/flags/flags.aconfig
+++ b/flags/flags.aconfig
@@ -7,6 +7,7 @@
     description: "Enables reading third-party exercise routes by apps who hold the corresponding permission."
     bug: "232379924"
     is_fixed_read_only: true
+    is_exported: true
 }
 
 flag {
@@ -14,6 +15,7 @@
     namespace: "healthconnect"
     description: "Flag for adding the new data type skin temperature."
     bug: "319602927"
+    is_exported: true
 }
 
 flag {
@@ -21,6 +23,7 @@
     namespace: "healthconnect"
     description: "Flag for adding the new data type planned exercise sessions."
     bug: "319604661"
+    is_exported: true
 }
 
 flag {
@@ -28,6 +31,7 @@
     namespace: "healthconnect"
     description: "Permission to enable reading health data in the background."
     bug: "294558364"
+    is_exported: true
 }
 
 flag {
@@ -35,4 +39,5 @@
     namespace: "healthconnect"
     description: "Permission to enable reading past health data."
     bug: "325430290"
+    is_exported: true
 }
diff --git a/flags/healthfitness-flags.aconfig b/flags/healthfitness-flags.aconfig
index 6656a5e..e073cdb 100644
--- a/flags/healthfitness-flags.aconfig
+++ b/flags/healthfitness-flags.aconfig
@@ -46,6 +46,165 @@
 }
 
 flag {
+    name: "personal_health_record_telemetry"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for guarding telemetry for PHR MVP APIs. This is for normal WW"
+    bug: "361796560"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "personal_health_record_telemetry_private_ww"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for guarding telemetry for PHR MVP APIs. This is for private WW"
+    bug: "375157800"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "personal_health_record_ui_telemetry"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for guarding telemetry for PHR MVP UI."
+    bug: "342159144"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "personal_health_record_entries_screen"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for guarding the improved Health Record Entries screen."
+    bug: "362672526"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "personal_health_record_lock_screen_banner"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for guarding the home screen banner that recommends setting up a device lock."
+    bug: "375384825"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "personal_health_record_enable_d2d_and_export_import"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for merging PHR data in both device to device transfer and export/import flows."
+    bug: "369809932"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "personal_health_record_disable_d2d"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for excluding PHR tables from device to device transfer flow."
+    bug: "369809932"
+    is_fixed_read_only: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+    is_exported: true
+}
+
+flag {
+    name: "personal_health_record_disable_export_import"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for excluding PHR tables from export/import flow."
+    bug: "369809932"
+    is_fixed_read_only: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+    is_exported: true
+}
+
+flag {
+    name: "phr_fhir_structural_validation"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for validating structure of FHIR resources when upserting medical data."
+    bug: "350010200"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "phr_fhir_oneof_validation"
+    namespace: "health_fitness_aconfig"
+    description: "UNUSED."
+    bug: "376673951"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "phr_fhir_primitive_type_validation"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for validating FHIR primitive data types when upserting medical data."
+    bug: "361775172"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "phr_fhir_basic_complex_type_validation"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for basic validation of FHIR complex types when upserting medical data."
+    bug: "376283237"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "phr_fhir_complex_type_validation"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for full validation of FHIR complex types when upserting medical data."
+    bug: "377701407"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "phr_upsert_fix_parcel_size_calculation"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for fixing the UpsertMedicalResourceRequest parcel size calculation."
+    bug: "379819662"
+    is_fixed_read_only: true
+    is_exported: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
+    name: "phr_upsert_fix_use_shared_memory"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for fixing upsertMedicalResources to use shared memory."
+    bug: "380022133"
+    is_fixed_read_only: true
+    is_exported: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
+    name: "phr_read_medical_resources_fix_query_limit"
+    namespace: "health_fitness_aconfig"
+    description: "Flag for fixing the readMedicalResources query."
+    bug: "381201968"
+    is_fixed_read_only: true
+    is_exported: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
     name: "export_import"
     namespace: "health_fitness_aconfig"
     description: "Flag for adding new export/import feature."
@@ -76,6 +235,18 @@
 }
 
 flag {
+    name: "permission_tracker_fix_mapping_init"
+    namespace: "health_fitness_aconfig"
+    description: "Fixes a bug when setting up intent tracker for a new user."
+    bug: "301926710"
+    is_fixed_read_only: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+    is_exported: true
+}
+
+flag {
     name: "dependency_injection"
     namespace: "health_fitness_aconfig"
     description: "Enables dependency injection."
@@ -162,3 +333,118 @@
        purpose: PURPOSE_BUGFIX
    }
 }
+
+flag {
+    name: "ecosystem_metrics"
+    namespace: "health_fitness_aconfig"
+    description: "Enables collection of ecosystem metrics."
+    bug: "369507783"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "immediate_export"
+    namespace: "health_fitness_aconfig"
+    description: "Enables immediate export."
+    bug: "318484000"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "cloud_backup_and_restore"
+    namespace: "health_fitness_aconfig"
+    description: "Enables cloud B&R."
+    bug: "369798725"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "ecosystem_metrics_db_changes"
+    namespace: "health_fitness_aconfig"
+    description: "Enables DB modification to allow collection of ecosystem metrics."
+    bug: "369507783"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "permission_metrics"
+    namespace: "health_fitness_aconfig"
+    description: "Enables collection of permission metrics."
+    bug: "372464298"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "logcat_censor_iae"
+    namespace: "health_fitness_aconfig"
+    description: "In Health Connect service only log the stack trace, not the message for IllegalArgumentExceptions."
+    bug: "372454440"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "activity_intensity"
+    namespace: "health_fitness_aconfig"
+    description: "Enables the activity intensity data type."
+    bug: "373585917"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "activity_intensity_db"
+    namespace: "health_fitness_aconfig"
+    description: "Enables DB changes to support the activity intensity data type."
+    bug: "373585917"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "export_import_nice_to_have"
+    namespace: "health_fitness_aconfig"
+    description: "Enables export/import feature updates after fast follow stage."
+    bug: "318484000"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "expressive_theming_enabled"
+    namespace: "health_fitness_aconfig"
+    description: "Enables expressive theming for the UI."
+    bug: "376085738"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "architecture_improvement"
+    namespace: "health_fitness_aconfig"
+    description: "Enables architecture and testing improvement for HC."
+    bug: "376085738"
+    is_fixed_read_only: true
+    is_exported: true
+}
+
+flag {
+    name: "replace_body_sensor_permission_enabled"
+    is_fixed_read_only: true
+    namespace: "android_health_services"
+    description: "This fixed read-only flag is used to enable replacing permission BODY_SENSORS (and BODY_SENSORS_BACKGROUND) with granular health permission READ_HEART_RATE (and READ_HEALTH_DATA_IN_BACKGROUND)"
+    bug: "364638912"
+}
+
+flag {
+    name: "deprecate_exercise_session_type_breathing"
+    namespace: "android_health_services"
+    description: "Deprecates ExerciseSessionType#EXERCISE_SESSION_TYPE_GUIDED_BREATHING"
+    bug: "373629817"
+    is_exported: true
+}
\ No newline at end of file
diff --git a/flags/src/com/android/healthfitness/flags/AconfigFlagHelper.java b/flags/src/com/android/healthfitness/flags/AconfigFlagHelper.java
index c7e5402..51a9f24 100644
--- a/flags/src/com/android/healthfitness/flags/AconfigFlagHelper.java
+++ b/flags/src/com/android/healthfitness/flags/AconfigFlagHelper.java
@@ -16,6 +16,9 @@
 
 package com.android.healthfitness.flags;
 
+import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_ACTIVITY_INTENSITY;
+import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_ECOSYSTEM_METRICS;
+import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_PERSONAL_HEALTH_RECORD;
 import static com.android.healthfitness.flags.DatabaseVersions.LAST_ROLLED_OUT_DB_VERSION;
 import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
 
@@ -23,6 +26,7 @@
 
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.function.BooleanSupplier;
 
 /**
  * A helper class to act as the source of truth for whether a feature is enabled or not by taking
@@ -38,7 +42,9 @@
     // framework. See
     // https://groups.google.com/a/google.com/g/android-chatty-eng/c/TymmRzs3UcY/m/_JeFcynRBwAJ.
     @VisibleForTesting(visibility = PRIVATE)
-    public static final TreeMap<Integer, Boolean> DB_VERSION_TO_DB_FLAG_MAP = new TreeMap<>();
+    // Using BooleanSupplier instead of Boolean due to b/370447278#comment2
+    public static final TreeMap<Integer, BooleanSupplier> DB_VERSION_TO_DB_FLAG_MAP =
+            new TreeMap<>();
 
     /**
      * Returns the DB version based on DB flag values, this DB version is used to initialize {@link
@@ -50,8 +56,8 @@
         }
 
         int dbVersion = LAST_ROLLED_OUT_DB_VERSION;
-        for (Map.Entry<Integer, Boolean> entry : getDbVersionToDbFlagMap().entrySet()) {
-            if (!entry.getValue()) {
+        for (Map.Entry<Integer, BooleanSupplier> entry : getDbVersionToDbFlagMap().entrySet()) {
+            if (!entry.getValue().getAsBoolean()) {
                 break;
             }
             dbVersion = entry.getKey();
@@ -62,26 +68,30 @@
 
     /**
      * Returns whether the DB flag of a feature is enabled.
-     * <p>
-     * A DB flag is deemed to be enabled if and only if the DB flag as well as all other features
+     *
+     * <p>A DB flag is deemed to be enabled if and only if the DB flag as well as all other features
      * with smaller version numbers have their DB flags enabled.
-     * <p>
-     * For example, if DB_VERSION_TO_DB_FLAG_MAP contains these:
+     *
+     * <p>For example, if DB_VERSION_TO_DB_FLAG_MAP contains these:
+     *
      * <pre>{@code
-     *   DB_F1 = true
-     *   DB_F2 = true
-     *   DB_F3 = true
-     *   DB_F4 = false
+     * DB_F1 = true
+     * DB_F2 = true
+     * DB_F3 = true
+     * DB_F4 = false
      * }</pre>
+     *
      * Then isDbFlagEnabled(3) will return true and isDbFlagEnabled(4) will return false.
-     * <p>
-     * In case the map contains a disconnected line of "true"s before the last "false" like this:
+     *
+     * <p>In case the map contains a disconnected line of "true"s before the last "false" like this:
+     *
      * <pre>{@code
-     *   DB_F1 = true
-     *   DB_F2 = false
-     *   DB_F3 = true
-     *   DB_F4 = false
+     * DB_F1 = true
+     * DB_F2 = false
+     * DB_F3 = true
+     * DB_F4 = false
      * }</pre>
+     *
      * Then isDbFlagEnabled(3) will return false even though DB_F3 is mapped to true.
      *
      * @see #getDbVersion()
@@ -108,25 +118,34 @@
      * the <code>@EnableFlags</code> annotations won't work in unit tests due to its evaluation
      * being done after the map has already been initialized.
      */
-    private static Map<Integer, Boolean> getDbVersionToDbFlagMap() {
+    private static Map<Integer, BooleanSupplier> getDbVersionToDbFlagMap() {
         if (!DB_VERSION_TO_DB_FLAG_MAP.isEmpty()) {
             return DB_VERSION_TO_DB_FLAG_MAP;
         }
 
-        // TODO(b/357062401): When PHR DB schema changes is finalized, we'll create
-        // DB_VERSION_TO_DB_FLAG_MAP, add the following line, then move advance the PHR DB flag to
-        // trunk-food first, then PHR feature flag:
-        // DB_VERSION_TO_DB_FLAG_MAP.put(DB_VERSION_PERSONAL_HEALTH_RECORD,
-        //                                                  Flags.personalHealthRecordDatabase());
+        DB_VERSION_TO_DB_FLAG_MAP.put(
+                DB_VERSION_PERSONAL_HEALTH_RECORD, Flags::personalHealthRecordDatabase);
+        DB_VERSION_TO_DB_FLAG_MAP.put(DB_VERSION_ACTIVITY_INTENSITY, Flags::activityIntensityDb);
+        DB_VERSION_TO_DB_FLAG_MAP.put(
+                DB_VERSION_ECOSYSTEM_METRICS, Flags::ecosystemMetricsDbChanges);
 
         return DB_VERSION_TO_DB_FLAG_MAP;
     }
 
     /** Returns a boolean indicating whether PHR feature is enabled. */
     public static synchronized boolean isPersonalHealthRecordEnabled() {
-        // TODO(b/357062401): When PHR DB schema changes is finalized:
-        // return Flags.personalHealthRecord() &&
-        // isDbFlagEnabled(DB_VERSION_PERSONAL_HEALTH_RECORD);
-        return Flags.personalHealthRecord();
+        return Flags.personalHealthRecord() && isDbFlagEnabled(DB_VERSION_PERSONAL_HEALTH_RECORD);
+    }
+
+    /** Returns a boolean indicating whether Activity Intensity data type is enabled. */
+    public static boolean isActivityIntensityEnabled() {
+        return Flags.activityIntensity()
+                && isDbFlagEnabled(DB_VERSION_ACTIVITY_INTENSITY)
+                && Flags.healthConnectMappings();
+    }
+
+    /** Returns a boolean indicating whether Ecosystem Metrics is enabled. */
+    public static boolean isEcosystemMetricsEnabled() {
+        return Flags.ecosystemMetrics() && isDbFlagEnabled(DB_VERSION_ECOSYSTEM_METRICS);
     }
 }
diff --git a/flags/src/com/android/healthfitness/flags/DatabaseVersions.java b/flags/src/com/android/healthfitness/flags/DatabaseVersions.java
index 2240b86..d130516 100644
--- a/flags/src/com/android/healthfitness/flags/DatabaseVersions.java
+++ b/flags/src/com/android/healthfitness/flags/DatabaseVersions.java
@@ -30,6 +30,12 @@
     public static final int DB_VERSION_PLANNED_EXERCISE_SESSIONS_FLAG_RELEASE = 13;
     public static final int DB_VERSION_MINDFULNESS_SESSION = 14;
 
+    /** The DB version in which the schema changes for PHR MVP were added. */
+    public static final int DB_VERSION_PERSONAL_HEALTH_RECORD = 15;
+
+    public static final int DB_VERSION_ACTIVITY_INTENSITY = 16;
+    public static final int DB_VERSION_ECOSYSTEM_METRICS = 17;
+
     // For historical reasons, we do not support versions below this
     // See go/hc-mainline-dev/trunk_stable/db-and-aconfig#a-bit-of-history
     public static final int MIN_SUPPORTED_DB_VERSION = DB_VERSION_UUID_BLOB;
diff --git a/framework/Android.bp b/framework/Android.bp
index f90a651..4ed3c0d 100644
--- a/framework/Android.bp
+++ b/framework/Android.bp
@@ -55,7 +55,7 @@
     ],
     path: "java",
     visibility: [
-        "//frameworks/base",
+        "//frameworks/base/api",
         "//packages/modules/HealthFitness:__subpackages__",
     ],
 }
diff --git a/framework/api/current.txt b/framework/api/current.txt
index 8586e6f..da08ae1 100644
--- a/framework/api/current.txt
+++ b/framework/api/current.txt
@@ -40,17 +40,19 @@
     method public int describeContents();
     method @NonNull public String getDisplayName();
     method @NonNull public android.net.Uri getFhirBaseUri();
+    method @NonNull public android.health.connect.datatypes.FhirVersion getFhirVersion();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.health.connect.CreateMedicalDataSourceRequest> CREATOR;
   }
 
   public static final class CreateMedicalDataSourceRequest.Builder {
-    ctor public CreateMedicalDataSourceRequest.Builder(@NonNull android.net.Uri, @NonNull String);
+    ctor public CreateMedicalDataSourceRequest.Builder(@NonNull android.net.Uri, @NonNull String, @NonNull android.health.connect.datatypes.FhirVersion);
     ctor public CreateMedicalDataSourceRequest.Builder(@NonNull android.health.connect.CreateMedicalDataSourceRequest.Builder);
     ctor public CreateMedicalDataSourceRequest.Builder(@NonNull android.health.connect.CreateMedicalDataSourceRequest);
     method @NonNull public android.health.connect.CreateMedicalDataSourceRequest build();
     method @NonNull public android.health.connect.CreateMedicalDataSourceRequest.Builder setDisplayName(@NonNull String);
     method @NonNull public android.health.connect.CreateMedicalDataSourceRequest.Builder setFhirBaseUri(@NonNull android.net.Uri);
+    method @NonNull public android.health.connect.CreateMedicalDataSourceRequest.Builder setFhirVersion(@NonNull android.health.connect.datatypes.FhirVersion);
   }
 
   @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public final class DeleteMedicalResourcesRequest implements android.os.Parcelable {
@@ -64,6 +66,7 @@
   public static final class DeleteMedicalResourcesRequest.Builder {
     ctor public DeleteMedicalResourcesRequest.Builder();
     ctor public DeleteMedicalResourcesRequest.Builder(@NonNull android.health.connect.DeleteMedicalResourcesRequest.Builder);
+    ctor public DeleteMedicalResourcesRequest.Builder(@NonNull android.health.connect.DeleteMedicalResourcesRequest);
     method @NonNull public android.health.connect.DeleteMedicalResourcesRequest.Builder addDataSourceId(@NonNull String);
     method @NonNull public android.health.connect.DeleteMedicalResourcesRequest.Builder addMedicalResourceType(int);
     method @NonNull public android.health.connect.DeleteMedicalResourcesRequest build();
@@ -80,8 +83,11 @@
 
   public static final class GetMedicalDataSourcesRequest.Builder {
     ctor public GetMedicalDataSourcesRequest.Builder();
+    ctor public GetMedicalDataSourcesRequest.Builder(@NonNull android.health.connect.GetMedicalDataSourcesRequest.Builder);
+    ctor public GetMedicalDataSourcesRequest.Builder(@NonNull android.health.connect.GetMedicalDataSourcesRequest);
     method @NonNull public android.health.connect.GetMedicalDataSourcesRequest.Builder addPackageName(@NonNull String);
     method @NonNull public android.health.connect.GetMedicalDataSourcesRequest build();
+    method @NonNull public android.health.connect.GetMedicalDataSourcesRequest.Builder clearPackageNames();
   }
 
   public class HealthConnectException extends java.lang.RuntimeException {
@@ -126,6 +132,7 @@
 
   public final class HealthPermissions {
     field public static final String READ_ACTIVE_CALORIES_BURNED = "android.permission.health.READ_ACTIVE_CALORIES_BURNED";
+    field @FlaggedApi("com.android.healthfitness.flags.activity_intensity") public static final String READ_ACTIVITY_INTENSITY = "android.permission.health.READ_ACTIVITY_INTENSITY";
     field public static final String READ_BASAL_BODY_TEMPERATURE = "android.permission.health.READ_BASAL_BODY_TEMPERATURE";
     field public static final String READ_BASAL_METABOLIC_RATE = "android.permission.health.READ_BASAL_METABOLIC_RATE";
     field public static final String READ_BLOOD_GLUCOSE = "android.permission.health.READ_BLOOD_GLUCOSE";
@@ -148,14 +155,17 @@
     field public static final String READ_HYDRATION = "android.permission.health.READ_HYDRATION";
     field public static final String READ_INTERMENSTRUAL_BLEEDING = "android.permission.health.READ_INTERMENSTRUAL_BLEEDING";
     field public static final String READ_LEAN_BODY_MASS = "android.permission.health.READ_LEAN_BODY_MASS";
-    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_ALLERGY_INTOLERANCE = "android.permission.health.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE";
-    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_IMMUNIZATION = "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION";
+    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES = "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES";
+    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_CONDITIONS = "android.permission.health.READ_MEDICAL_DATA_CONDITIONS";
     field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_LABORATORY_RESULTS = "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS";
     field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_MEDICATIONS = "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS";
+    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_PERSONAL_DETAILS = "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS";
+    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_PRACTITIONER_DETAILS = "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS";
     field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_PREGNANCY = "android.permission.health.READ_MEDICAL_DATA_PREGNANCY";
-    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_PROBLEMS = "android.permission.health.READ_MEDICAL_DATA_PROBLEMS";
     field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_PROCEDURES = "android.permission.health.READ_MEDICAL_DATA_PROCEDURES";
     field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_SOCIAL_HISTORY = "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY";
+    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_VACCINES = "android.permission.health.READ_MEDICAL_DATA_VACCINES";
+    field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_VISITS = "android.permission.health.READ_MEDICAL_DATA_VISITS";
     field @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public static final String READ_MEDICAL_DATA_VITAL_SIGNS = "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS";
     field public static final String READ_MENSTRUATION = "android.permission.health.READ_MENSTRUATION";
     field @FlaggedApi("com.android.healthfitness.flags.mindfulness") public static final String READ_MINDFULNESS = "android.permission.health.READ_MINDFULNESS";
@@ -176,6 +186,7 @@
     field public static final String READ_WEIGHT = "android.permission.health.READ_WEIGHT";
     field public static final String READ_WHEELCHAIR_PUSHES = "android.permission.health.READ_WHEELCHAIR_PUSHES";
     field public static final String WRITE_ACTIVE_CALORIES_BURNED = "android.permission.health.WRITE_ACTIVE_CALORIES_BURNED";
+    field @FlaggedApi("com.android.healthfitness.flags.activity_intensity") public static final String WRITE_ACTIVITY_INTENSITY = "android.permission.health.WRITE_ACTIVITY_INTENSITY";
     field public static final String WRITE_BASAL_BODY_TEMPERATURE = "android.permission.health.WRITE_BASAL_BODY_TEMPERATURE";
     field public static final String WRITE_BASAL_METABOLIC_RATE = "android.permission.health.WRITE_BASAL_METABOLIC_RATE";
     field public static final String WRITE_BLOOD_GLUCOSE = "android.permission.health.WRITE_BLOOD_GLUCOSE";
@@ -280,10 +291,11 @@
   }
 
   @FlaggedApi("com.android.healthfitness.flags.personal_health_record") public final class ReadMedicalResourcesResponse implements android.os.Parcelable {
-    ctor public ReadMedicalResourcesResponse(@NonNull java.util.List<android.health.connect.datatypes.MedicalResource>, @Nullable String);
+    ctor public ReadMedicalResourcesResponse(@NonNull java.util.List<android.health.connect.datatypes.MedicalResource>, @Nullable String, int);
     method public int describeContents();
     method @NonNull public java.util.List<android.health.connect.datatypes.MedicalResource> getMedicalResources();
     method @Nullable public String getNextPageToken();
+    method public int getRemainingCount();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.health.connect.ReadMedicalResourcesResponse> CREATOR;
   }
@@ -443,6 +455,23 @@
     method @NonNull public android.health.connect.datatypes.ActiveCaloriesBurnedRecord.Builder setStartZoneOffset(@NonNull java.time.ZoneOffset);
   }
 
+  @FlaggedApi("com.android.healthfitness.flags.activity_intensity") public final class ActivityIntensityRecord extends android.health.connect.datatypes.IntervalRecord {
+    method public int getActivityIntensityType();
+    field public static final int ACTIVITY_INTENSITY_TYPE_MODERATE = 0; // 0x0
+    field public static final int ACTIVITY_INTENSITY_TYPE_VIGOROUS = 1; // 0x1
+    field @NonNull public static final android.health.connect.datatypes.AggregationType<java.time.Duration> DURATION_TOTAL;
+    field @NonNull public static final android.health.connect.datatypes.AggregationType<java.lang.Long> INTENSITY_MINUTES_TOTAL;
+    field @NonNull public static final android.health.connect.datatypes.AggregationType<java.time.Duration> MODERATE_DURATION_TOTAL;
+    field @NonNull public static final android.health.connect.datatypes.AggregationType<java.time.Duration> VIGOROUS_DURATION_TOTAL;
+  }
+
+  public static final class ActivityIntensityRecord.Builder {
+    ctor public ActivityIntensityRecord.Builder(@NonNull android.health.connect.datatypes.Metadata, @NonNull java.time.Instant, @NonNull java.time.Instant, int);
+    method @NonNull public android.health.connect.datatypes.ActivityIntensityRecord build();
+    method @NonNull public android.health.connect.datatypes.ActivityIntensityRecord.Builder setEndZoneOffset(@NonNull java.time.ZoneOffset);
+    method @NonNull public android.health.connect.datatypes.ActivityIntensityRecord.Builder setStartZoneOffset(@NonNull java.time.ZoneOffset);
+  }
+
   public final class AggregationType<T> {
   }
 
@@ -976,7 +1005,7 @@
     field public static final int EXERCISE_SESSION_TYPE_FOOTBALL_AUSTRALIAN = 14; // 0xe
     field public static final int EXERCISE_SESSION_TYPE_FRISBEE_DISC = 15; // 0xf
     field public static final int EXERCISE_SESSION_TYPE_GOLF = 16; // 0x10
-    field public static final int EXERCISE_SESSION_TYPE_GUIDED_BREATHING = 17; // 0x11
+    field @Deprecated @FlaggedApi("com.android.healthfitness.flags.deprecate_exercise_session_type_breathing") public static final int EXERCISE_SESSION_TYPE_GUIDED_BREATHING = 17; // 0x11
     field public static final int EXERCISE_SESSION_TYPE_GYMNASTICS = 18; // 0x12
     field public static final int EXERCISE_SESSION_TYPE_HANDBALL = 19; // 0x13
     field public static final int EXERCISE_SESSION_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING = 20; // 0x14
@@ -1032,13 +1061,18 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.health.connect.datatypes.FhirResource> CREATOR;
     field public static final int FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE = 2; // 0x2
     field public static final int FHIR_RESOURCE_TYPE_CONDITION = 4; // 0x4
+    field public static final int FHIR_RESOURCE_TYPE_ENCOUNTER = 12; // 0xc
     field public static final int FHIR_RESOURCE_TYPE_IMMUNIZATION = 1; // 0x1
+    field public static final int FHIR_RESOURCE_TYPE_LOCATION = 13; // 0xd
     field public static final int FHIR_RESOURCE_TYPE_MEDICATION = 6; // 0x6
     field public static final int FHIR_RESOURCE_TYPE_MEDICATION_REQUEST = 7; // 0x7
     field public static final int FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT = 8; // 0x8
     field public static final int FHIR_RESOURCE_TYPE_OBSERVATION = 3; // 0x3
+    field public static final int FHIR_RESOURCE_TYPE_ORGANIZATION = 14; // 0xe
+    field public static final int FHIR_RESOURCE_TYPE_PATIENT = 9; // 0x9
+    field public static final int FHIR_RESOURCE_TYPE_PRACTITIONER = 10; // 0xa
+    field public static final int FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE = 11; // 0xb
     field public static final int FHIR_RESOURCE_TYPE_PROCEDURE = 5; // 0x5
-    field public static final int FHIR_RESOURCE_TYPE_UNKNOWN = 0; // 0x0
   }
 
   public static final class FhirResource.Builder {
@@ -1056,6 +1090,7 @@
     method public int getMajor();
     method public int getMinor();
     method public int getPatch();
+    method public boolean isSupportedFhirVersion();
     method @NonNull public static android.health.connect.datatypes.FhirVersion parseFhirVersion(@NonNull String);
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.health.connect.datatypes.FhirVersion> CREATOR;
@@ -1182,6 +1217,7 @@
     method public int describeContents();
     method @NonNull public String getDisplayName();
     method @NonNull public android.net.Uri getFhirBaseUri();
+    method @NonNull public android.health.connect.datatypes.FhirVersion getFhirVersion();
     method @NonNull public String getId();
     method @Nullable public java.time.Instant getLastDataUpdateTime();
     method @NonNull public String getPackageName();
@@ -1190,12 +1226,13 @@
   }
 
   public static final class MedicalDataSource.Builder {
-    ctor public MedicalDataSource.Builder(@NonNull String, @NonNull String, @NonNull android.net.Uri, @NonNull String);
+    ctor public MedicalDataSource.Builder(@NonNull String, @NonNull String, @NonNull android.net.Uri, @NonNull String, @NonNull android.health.connect.datatypes.FhirVersion);
     ctor public MedicalDataSource.Builder(@NonNull android.health.connect.datatypes.MedicalDataSource.Builder);
     ctor public MedicalDataSource.Builder(@NonNull android.health.connect.datatypes.MedicalDataSource);
     method @NonNull public android.health.connect.datatypes.MedicalDataSource build();
     method @NonNull public android.health.connect.datatypes.MedicalDataSource.Builder setDisplayName(@NonNull String);
     method @NonNull public android.health.connect.datatypes.MedicalDataSource.Builder setFhirBaseUri(@NonNull android.net.Uri);
+    method @NonNull public android.health.connect.datatypes.MedicalDataSource.Builder setFhirVersion(@NonNull android.health.connect.datatypes.FhirVersion);
     method @NonNull public android.health.connect.datatypes.MedicalDataSource.Builder setId(@NonNull String);
     method @NonNull public android.health.connect.datatypes.MedicalDataSource.Builder setLastDataUpdateTime(@Nullable java.time.Instant);
     method @NonNull public android.health.connect.datatypes.MedicalDataSource.Builder setPackageName(@NonNull String);
@@ -1210,15 +1247,17 @@
     method public int getType();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.health.connect.datatypes.MedicalResource> CREATOR;
-    field public static final int MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE = 2; // 0x2
-    field public static final int MEDICAL_RESOURCE_TYPE_IMMUNIZATION = 1; // 0x1
+    field public static final int MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES = 2; // 0x2
+    field public static final int MEDICAL_RESOURCE_TYPE_CONDITIONS = 7; // 0x7
     field public static final int MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS = 6; // 0x6
     field public static final int MEDICAL_RESOURCE_TYPE_MEDICATIONS = 9; // 0x9
+    field public static final int MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS = 10; // 0xa
+    field public static final int MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS = 11; // 0xb
     field public static final int MEDICAL_RESOURCE_TYPE_PREGNANCY = 3; // 0x3
-    field public static final int MEDICAL_RESOURCE_TYPE_PROBLEMS = 7; // 0x7
     field public static final int MEDICAL_RESOURCE_TYPE_PROCEDURES = 8; // 0x8
     field public static final int MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY = 4; // 0x4
-    field public static final int MEDICAL_RESOURCE_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int MEDICAL_RESOURCE_TYPE_VACCINES = 1; // 0x1
+    field public static final int MEDICAL_RESOURCE_TYPE_VISITS = 12; // 0xc
     field public static final int MEDICAL_RESOURCE_TYPE_VITAL_SIGNS = 5; // 0x5
   }
 
diff --git a/framework/api/system-current.txt b/framework/api/system-current.txt
index f5d2ac5..5e23485 100644
--- a/framework/api/system-current.txt
+++ b/framework/api/system-current.txt
@@ -92,6 +92,7 @@
 
   public class HealthPermissionCategory {
     field public static final int ACTIVE_CALORIES_BURNED = 1; // 0x1
+    field @FlaggedApi("com.android.healthfitness.flags.activity_intensity") public static final int ACTIVITY_INTENSITY = 42; // 0x2a
     field public static final int BASAL_BODY_TEMPERATURE = 33; // 0x21
     field public static final int BASAL_METABOLIC_RATE = 9; // 0x9
     field public static final int BLOOD_GLUCOSE = 26; // 0x1a
@@ -191,6 +192,7 @@
 
   public final class RecordTypeIdentifier {
     field public static final int RECORD_TYPE_ACTIVE_CALORIES_BURNED = 2; // 0x2
+    field @FlaggedApi("com.android.healthfitness.flags.activity_intensity") public static final int RECORD_TYPE_ACTIVITY_INTENSITY = 42; // 0x2a
     field public static final int RECORD_TYPE_BASAL_BODY_TEMPERATURE = 20; // 0x14
     field public static final int RECORD_TYPE_BASAL_METABOLIC_RATE = 16; // 0x10
     field public static final int RECORD_TYPE_BLOOD_GLUCOSE = 25; // 0x19
diff --git a/framework/java/android/health/connect/CreateMedicalDataSourceRequest.java b/framework/java/android/health/connect/CreateMedicalDataSourceRequest.java
index f91fe22..b3b300f 100644
--- a/framework/java/android/health/connect/CreateMedicalDataSourceRequest.java
+++ b/framework/java/android/health/connect/CreateMedicalDataSourceRequest.java
@@ -24,12 +24,13 @@
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.health.connect.datatypes.FhirVersion;
 import android.net.Uri;
 import android.os.Parcel;
 import android.os.Parcelable;
 
 /**
- * Represents a create request for {@link HealthConnectManager#createMedicalDataSource}
+ * A create request for {@link HealthConnectManager#createMedicalDataSource}.
  *
  * <p>Medical data is represented using the <a href="https://hl7.org/fhir/">Fast Healthcare
  * Interoperability Resources (FHIR)</a> standard.
@@ -43,6 +44,7 @@
 
     @NonNull private final Uri mFhirBaseUri;
     @NonNull private final String mDisplayName;
+    @NonNull private final FhirVersion mFhirVersion;
     private long mDataSize;
 
     @NonNull
@@ -65,14 +67,24 @@
                 }
             };
 
-    private CreateMedicalDataSourceRequest(@NonNull Uri fhirBaseUri, @NonNull String displayName) {
+    /**
+     * Creates a new instance of {@link CreateMedicalDataSourceRequest}. Please see {@link
+     * CreateMedicalDataSourceRequest.Builder} for more detailed parameters information.
+     */
+    private CreateMedicalDataSourceRequest(
+            @NonNull Uri fhirBaseUri,
+            @NonNull String displayName,
+            @NonNull FhirVersion fhirVersion) {
         requireNonNull(fhirBaseUri);
         requireNonNull(displayName);
+        requireNonNull(fhirVersion);
         validateFhirBaseUriCharacterLimit(fhirBaseUri);
         validateDisplayNameCharacterLimit(displayName);
+        validateFhirVersion(fhirVersion);
 
         mFhirBaseUri = fhirBaseUri;
         mDisplayName = displayName;
+        mFhirVersion = fhirVersion;
     }
 
     private CreateMedicalDataSourceRequest(@NonNull Parcel in) {
@@ -81,24 +93,40 @@
 
         mFhirBaseUri = requireNonNull(in.readParcelable(Uri.class.getClassLoader(), Uri.class));
         mDisplayName = requireNonNull(in.readString());
+        mFhirVersion =
+                requireNonNull(
+                        in.readParcelable(FhirVersion.class.getClassLoader(), FhirVersion.class));
 
         validateFhirBaseUriCharacterLimit(mFhirBaseUri);
         validateDisplayNameCharacterLimit(mDisplayName);
+        validateFhirVersion(mFhirVersion);
     }
 
-    /** Returns the fhir base uri. */
+    /**
+     * Returns the FHIR base URI. For data coming from a FHIR server this is <a
+     * href="https://hl7.org/fhir/R4/http.html#root">the base URL</a>.
+     */
     @NonNull
     public Uri getFhirBaseUri() {
         return mFhirBaseUri;
     }
 
-    /** Returns the display name. */
+    /** Returns the display name. For the request to succeed this must be unique per app. */
     @NonNull
     public String getDisplayName() {
         return mDisplayName;
     }
 
     /**
+     * Returns the FHIR version. For the request to succeeds this must be a version supported by
+     * Health Connect, as documented on the {@link FhirVersion}.
+     */
+    @NonNull
+    public FhirVersion getFhirVersion() {
+        return mFhirVersion;
+    }
+
+    /**
      * Returns the size of the parcel when the class was created from Parcel.
      *
      * @hide
@@ -116,70 +144,86 @@
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeParcelable(mFhirBaseUri, 0);
         dest.writeString(mDisplayName);
+        dest.writeParcelable(mFhirVersion, 0);
     }
 
-    /** Indicates whether some other object is "equal to" this one. */
     @Override
     public boolean equals(@Nullable Object o) {
         if (this == o) return true;
         if (!(o instanceof CreateMedicalDataSourceRequest that)) return false;
         return getFhirBaseUri().equals(that.getFhirBaseUri())
-                && getDisplayName().equals(that.getDisplayName());
+                && getDisplayName().equals(that.getDisplayName())
+                && getFhirVersion().equals(that.getFhirVersion());
     }
 
-    /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
-        return hash(getFhirBaseUri(), getDisplayName());
+        return hash(getFhirBaseUri(), getDisplayName(), getFhirVersion());
     }
 
-    /** Returns a string representation of this {@link CreateMedicalDataSourceRequest}. */
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append(this.getClass().getSimpleName()).append("{");
         sb.append("fhirBaseUri=").append(getFhirBaseUri());
         sb.append(",displayName=").append(getDisplayName());
+        sb.append(",fhirVersion=").append(getFhirVersion());
         sb.append("}");
         return sb.toString();
     }
 
-    /** Builder class for {@link CreateMedicalDataSourceRequest} */
+    /** Builder class for {@link CreateMedicalDataSourceRequest}. */
     public static final class Builder {
         @NonNull private Uri mFhirBaseUri;
         @NonNull private String mDisplayName;
+        @NonNull private FhirVersion mFhirVersion;
 
         /**
+         * Constructs a new {@link CreateMedicalDataSourceRequest.Builder} instance.
+         *
          * @param fhirBaseUri The FHIR base URI of the data source. For data coming from a FHIR
-         *     server this should be the base URL. The maximum length for the Uri is 2000
+         *     server this should be the base URL. The maximum length for the URI is 2000
          *     characters.
          * @param displayName The display name that describes the data source. The maximum length
-         *     for the display name is 90 characters.
+         *     for the display name is 90 characters. This must be unique per app.
+         * @param fhirVersion The FHIR version of the medical data that will be linked to this data
+         *     source. This has to be a version supported by Health Connect, as documented on the
+         *     {@link FhirVersion}.
          */
-        public Builder(@NonNull Uri fhirBaseUri, @NonNull String displayName) {
+        public Builder(
+                @NonNull Uri fhirBaseUri,
+                @NonNull String displayName,
+                @NonNull FhirVersion fhirVersion) {
             requireNonNull(fhirBaseUri);
             requireNonNull(displayName);
+            requireNonNull(fhirVersion);
 
             mFhirBaseUri = fhirBaseUri;
             mDisplayName = displayName;
+            mFhirVersion = fhirVersion;
         }
 
-        public Builder(@NonNull Builder original) {
-            requireNonNull(original);
-            mFhirBaseUri = original.mFhirBaseUri;
-            mDisplayName = original.mDisplayName;
+        /** Constructs a clone of the other {@link CreateMedicalDataSourceRequest.Builder}. */
+        public Builder(@NonNull Builder other) {
+            requireNonNull(other);
+            mFhirBaseUri = other.mFhirBaseUri;
+            mDisplayName = other.mDisplayName;
+            mFhirVersion = other.mFhirVersion;
         }
 
-        public Builder(@NonNull CreateMedicalDataSourceRequest original) {
-            requireNonNull(original);
-            mFhirBaseUri = original.getFhirBaseUri();
-            mDisplayName = original.getDisplayName();
+        /** Constructs a clone of the other {@link CreateMedicalDataSourceRequest} instance. */
+        public Builder(@NonNull CreateMedicalDataSourceRequest other) {
+            requireNonNull(other);
+            mFhirBaseUri = other.getFhirBaseUri();
+            mDisplayName = other.getDisplayName();
+            mFhirVersion = other.getFhirVersion();
         }
 
         /**
-         * Sets the fhir base URI. For data coming from a FHIR server this should be the base URL.
+         * Sets the FHIR base URI. For data coming from a FHIR server this should be <a
+         * href="https://hl7.org/fhir/R4/http.html#root">the base URL</a>.
          *
-         * <p>The uri may not exceed 2000 characters.
+         * <p>The URI may not exceed 2000 characters.
          */
         @NonNull
         public Builder setFhirBaseUri(@NonNull Uri fhirBaseUri) {
@@ -189,7 +233,7 @@
         }
 
         /**
-         * Sets the display name
+         * Sets the display name. For the request to succeed this must be unique per app.
          *
          * <p>The display name may not exceed 90 characters.
          */
@@ -201,15 +245,29 @@
         }
 
         /**
+         * Sets the FHIR version of data from this data source.
+         *
+         * <p>This has to be a version supported by Health Connect, as documented on the {@link
+         * FhirVersion}.
+         */
+        @NonNull
+        public Builder setFhirVersion(@NonNull FhirVersion fhirVersion) {
+            requireNonNull(fhirVersion);
+            mFhirVersion = fhirVersion;
+            return this;
+        }
+
+        /**
          * Returns a new instance of {@link CreateMedicalDataSourceRequest} with the specified
          * parameters.
          *
          * @throws IllegalArgumentException if the {@code mFhirBaseUri} or {@code mDisplayName}
-         *     exceed the character limits.
+         *     exceed the character limits or if the {@code mFhirVersion} is not supported by Health
+         *     Connect.
          */
         @NonNull
         public CreateMedicalDataSourceRequest build() {
-            return new CreateMedicalDataSourceRequest(mFhirBaseUri, mDisplayName);
+            return new CreateMedicalDataSourceRequest(mFhirBaseUri, mDisplayName, mFhirVersion);
         }
     }
 
@@ -228,13 +286,19 @@
     private static void validateFhirBaseUriCharacterLimit(Uri fhirBaseUri) {
         String fhirBaseUriString = fhirBaseUri.toString();
         if (fhirBaseUriString.isEmpty()) {
-            throw new IllegalArgumentException("Fhir base uri cannot be empty.");
+            throw new IllegalArgumentException("FHIR base URI cannot be empty.");
         }
         if (fhirBaseUriString.length() > FHIR_BASE_URI_CHARACTER_LIMIT) {
             throw new IllegalArgumentException(
-                    "Fhir base uri cannot be longer than "
+                    "FHIR base URI cannot be longer than "
                             + FHIR_BASE_URI_CHARACTER_LIMIT
                             + " characters.");
         }
     }
+
+    private static void validateFhirVersion(FhirVersion fhirVersion) {
+        if (!fhirVersion.isSupportedFhirVersion()) {
+            throw new IllegalArgumentException("Unsupported FHIR version " + fhirVersion + ".");
+        }
+    }
 }
diff --git a/framework/java/android/health/connect/DeleteMedicalResourcesRequest.java b/framework/java/android/health/connect/DeleteMedicalResourcesRequest.java
index aa1b567..3c0a5f9 100644
--- a/framework/java/android/health/connect/DeleteMedicalResourcesRequest.java
+++ b/framework/java/android/health/connect/DeleteMedicalResourcesRequest.java
@@ -16,6 +16,7 @@
 
 package android.health.connect;
 
+import static android.health.connect.datatypes.MedicalDataSource.validateMedicalDataSourceIds;
 import static android.health.connect.datatypes.MedicalResource.validateMedicalResourceType;
 
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
@@ -25,6 +26,7 @@
 
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
+import android.health.connect.datatypes.MedicalDataSource;
 import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.MedicalResource.MedicalResourceType;
 import android.os.Parcel;
@@ -35,7 +37,7 @@
 import java.util.Set;
 
 /**
- * Request to delete Medical resources using {@link HealthConnectManager#deleteMedicalResources}.
+ * A delete request for {@link HealthConnectManager#deleteMedicalResources}.
  *
  * <p>Each field in the request acts as a cumulative filter. So if a set of data sources and a set
  * of types are specified, then only resources which are both from data sources in the given set and
@@ -50,6 +52,10 @@
     @NonNull private final Set<String> mDataSourceIds;
     @NonNull @MedicalResourceType private final Set<Integer> mMedicalResourceTypes;
 
+    /**
+     * Creates a new instance of {@link DeleteMedicalResourcesRequest}. Please see {@link
+     * DeleteMedicalResourcesRequest.Builder} for more detailed parameters information.
+     */
     private DeleteMedicalResourcesRequest(
             @NonNull Set<String> dataSourceIds,
             @NonNull @MedicalResourceType Set<Integer> medicalResourceTypes) {
@@ -58,6 +64,7 @@
                     "No restrictions specified for delete. The request must restrict by data source"
                             + " or resource type");
         }
+        validateMedicalDataSourceIds(dataSourceIds);
         medicalResourceTypes.forEach(MedicalResource::validateMedicalResourceType);
         mDataSourceIds = dataSourceIds;
         mMedicalResourceTypes = medicalResourceTypes;
@@ -75,6 +82,7 @@
             throw new IllegalArgumentException("Empty data sources and resource types in parcel");
         }
         mDataSourceIds = new HashSet<>(dataSourceIdList);
+        validateMedicalDataSourceIds(mDataSourceIds);
         mMedicalResourceTypes = new HashSet<>();
         for (int resourceType : resourceTypes) {
             validateMedicalResourceType(resourceType);
@@ -97,9 +105,9 @@
             };
 
     /**
-     * Gets the ids for the data sources that are being requested to delete.
+     * Returns the IDs for the {@link MedicalDataSource} that are being requested to delete.
      *
-     * <p>These ids should come from {@link HealthConnectManager#createMedicalDataSource}, or other
+     * <p>These IDs should come from {@link HealthConnectManager#createMedicalDataSource}, or other
      * {@link HealthConnectManager} data source methods.
      *
      * <p>If the set is empty it means resources from any data source should be deleted.
@@ -110,7 +118,7 @@
     }
 
     /**
-     * Gets the Medical resource types that should be deleted.
+     * Returns the {@link MedicalResource} types that should be deleted.
      *
      * <p>If the set is empty it means resources of all types should be deleted.
      */
@@ -159,23 +167,42 @@
         private final Set<String> mDataSourceIds = new HashSet<>();
         @MedicalResourceType private final Set<Integer> mMedicalResourceTypes = new HashSet<>();
 
-        /** Constructs a new {@link Builder} with no data sources set. */
+        /** Constructs a new {@link DeleteMedicalResourcesRequest.Builder} with no filters. */
         public Builder() {}
 
-        /** Constructs a new {@link Builder} copying all settings from {@code other}. */
+        /** Constructs a clone of the other {@link DeleteMedicalResourcesRequest.Builder}. */
         public Builder(@NonNull Builder other) {
             mDataSourceIds.addAll(other.mDataSourceIds);
             mMedicalResourceTypes.addAll(other.mMedicalResourceTypes);
         }
 
-        /** Add the data source ID to request to delete. */
+        /** Constructs a clone of the other {@link DeleteMedicalResourcesRequest} instance. */
+        public Builder(@NonNull DeleteMedicalResourcesRequest other) {
+            mDataSourceIds.addAll(other.getDataSourceIds());
+            mMedicalResourceTypes.addAll(other.getMedicalResourceTypes());
+        }
+
+        /**
+         * Adds the data source ID to request to delete. This should be an ID of the existing {@link
+         * MedicalDataSource}.
+         *
+         * <p>If the set of data source IDs is empty, it means resources from any data source should
+         * be deleted.
+         *
+         * @throws IllegalArgumentException if the provided {@code dataSourceId} is not a valid ID.
+         */
         @NonNull
         public Builder addDataSourceId(@NonNull String dataSourceId) {
             mDataSourceIds.add(requireNonNull(dataSourceId));
+            validateMedicalDataSourceIds(Set.of(dataSourceId));
             return this;
         }
 
-        /** Add the medical resource type to request to delete. */
+        /**
+         * Adds the medical resource type to request to delete.
+         *
+         * @throws IllegalArgumentException if the provided {@code resourceType} is not supported.
+         */
         @NonNull
         public Builder addMedicalResourceType(@MedicalResourceType int resourceType) {
             validateMedicalResourceType(resourceType);
@@ -198,9 +225,10 @@
         }
 
         /**
-         * Builds a {@link DeleteMedicalResourcesRequest} from this Builder.
+         * Returns a new instance of {@link DeleteMedicalResourcesRequest} with the specified
+         * parameters.
          *
-         * @throws IllegalArgumentException if no data source ids or medical resource types have
+         * @throws IllegalArgumentException if no data source IDs or medical resource types have
          *     been added.
          */
         @NonNull
diff --git a/framework/java/android/health/connect/GetMedicalDataSourcesRequest.java b/framework/java/android/health/connect/GetMedicalDataSourcesRequest.java
index 012b1e3..34da969 100644
--- a/framework/java/android/health/connect/GetMedicalDataSourcesRequest.java
+++ b/framework/java/android/health/connect/GetMedicalDataSourcesRequest.java
@@ -23,26 +23,36 @@
 
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
-import android.os.OutcomeReceiver;
+import android.health.connect.datatypes.MedicalDataSource;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.util.ArraySet;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
-import java.util.concurrent.Executor;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
- * Request to read medical data sources using {@link
- * HealthConnectManager#getMedicalDataSources(GetMedicalDataSourcesRequest, Executor,
- * OutcomeReceiver)}.
+ * A create request for {@link HealthConnectManager#getMedicalDataSources}.
  *
- * <p>If no package names are set requests all data sources from all packages. Otherwise the request
- * is limited to the requested package names.
+ * <p>If no {@link GetMedicalDataSourcesRequest#getPackageNames() package names} are set, requests
+ * all {@link MedicalDataSource}s from all packages. Otherwise the request is limited to the
+ * requested package names.
  */
 @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
 public final class GetMedicalDataSourcesRequest implements Parcelable {
+    @NonNull private final Set<String> mPackageNames;
+
+    // A full Java-language-style package name for the Android app can contain uppercase
+    // or lowercase letters, numbers, and underscores ('_'). It must have at least two segments (one
+    // or more dots), and individual package name parts can only start with letters. See the
+    // <a
+    // href="https://developer.android.com/guide/topics/manifest/manifest-element.html#package">Android developer doc</a>.
+    private static final String PACKAGE_NAME_REGEX =
+            "^([A-Za-z][a-zA-Z0-9_]*\\.)+[A-Za-z][a-zA-Z0-9_]*$";
 
     @NonNull
     public static final Creator<GetMedicalDataSourcesRequest> CREATOR =
@@ -58,10 +68,13 @@
                 }
             };
 
-    @NonNull private final Set<String> mPackageNames;
-
+    /**
+     * Creates a new instance of {@link GetMedicalDataSourcesRequest}. Please see {@link
+     * GetMedicalDataSourcesRequest.Builder} for more detailed parameters information.
+     */
     private GetMedicalDataSourcesRequest(@NonNull Set<String> packageNames) {
         Objects.requireNonNull(packageNames);
+        validatePackageNames(packageNames);
         mPackageNames = packageNames;
     }
 
@@ -72,17 +85,40 @@
     private GetMedicalDataSourcesRequest(@NonNull Parcel in) {
         Objects.requireNonNull(in);
         mPackageNames = new ArraySet<>(requireNonNull(in.createStringArrayList()));
+        validatePackageNames(mPackageNames);
     }
 
     /**
-     * Gets the package names for which datasources are being requested. If data sources for all
-     * apps are requested, the result will be empty..
+     * Returns the package names for which {@link MedicalDataSource}s are being requested, or an
+     * empty set for no filter.
      */
     @NonNull
     public Set<String> getPackageNames() {
         return new ArraySet<>(mPackageNames);
     }
 
+    /**
+     * Validates all of the provided {@code packageNames} are valid, which matches with the {@link
+     * #PACKAGE_NAME_REGEX}.
+     *
+     * @throws IllegalArgumentException with all invalid package names if not all {@code
+     *     packageNames} are valid.
+     */
+    private static void validatePackageNames(Set<String> packageNames) {
+        Pattern pattern = Pattern.compile(PACKAGE_NAME_REGEX);
+
+        Set<String> invalidPackageNames = new HashSet<>();
+        for (String packageName : packageNames) {
+            Matcher matcher = pattern.matcher(packageName);
+            if (!matcher.matches()) {
+                invalidPackageNames.add(packageName);
+            }
+        }
+        if (!invalidPackageNames.isEmpty()) {
+            throw new IllegalArgumentException("Invalid package name(s): " + invalidPackageNames);
+        }
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -114,26 +150,52 @@
         return sb.toString();
     }
 
-    /** Builder for a {@link GetMedicalDataSourcesRequest}. */
+    /** Builder class for {@link GetMedicalDataSourcesRequest}. */
     public static final class Builder {
         private final Set<String> mPackageNames = new ArraySet<>();
 
+        /** Constructs a new {@link GetMedicalDataSourcesRequest.Builder} with no filters set. */
         public Builder() {}
 
+        /** Constructs a clone of the other {@link GetMedicalDataSourcesRequest.Builder}. */
+        public Builder(@NonNull Builder other) {
+            requireNonNull(other);
+            mPackageNames.addAll(other.mPackageNames);
+        }
+
+        /** Constructs a clone of the other {@link GetMedicalDataSourcesRequest} instance. */
+        public Builder(@NonNull GetMedicalDataSourcesRequest other) {
+            requireNonNull(other);
+            mPackageNames.addAll(other.getPackageNames());
+        }
+
         /**
-         * Add a package name to limit this request to.
+         * Adds a package name to limit this request to.
          *
-         * <p>If the list of package names is empty, medical data sources for all packages will be
-         * requested. Otherwise only data sources for the added package names are requested.
+         * <p>If the list of package names is empty, {@link MedicalDataSource}s for all packages
+         * will be requested. Otherwise only those for the added package names are requested.
+         *
+         * @throws IllegalArgumentException if the provided {@code packageName} is not valid.
          */
         @NonNull
         public Builder addPackageName(@NonNull String packageName) {
             Objects.requireNonNull(packageName);
+            validatePackageNames(Set.of(packageName));
             mPackageNames.add(packageName);
             return this;
         }
 
-        /** Returns a {@link GetMedicalDataSourcesRequest} as specified by this builder. */
+        /** Clears all package names. */
+        @NonNull
+        public Builder clearPackageNames() {
+            mPackageNames.clear();
+            return this;
+        }
+
+        /**
+         * Returns a new instance of {@link GetMedicalDataSourcesRequest} with the specified
+         * parameters.
+         */
         @NonNull
         public GetMedicalDataSourcesRequest build() {
             return new GetMedicalDataSourcesRequest(mPackageNames);
diff --git a/framework/java/android/health/connect/HealthConnectManager.java b/framework/java/android/health/connect/HealthConnectManager.java
index 1c82201..40b399c 100644
--- a/framework/java/android/health/connect/HealthConnectManager.java
+++ b/framework/java/android/health/connect/HealthConnectManager.java
@@ -22,6 +22,8 @@
 import static android.health.connect.HealthPermissions.MANAGE_HEALTH_PERMISSIONS;
 import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
 
+import static com.android.healthfitness.flags.Flags.FLAG_CLOUD_BACKUP_AND_RESTORE;
+import static com.android.healthfitness.flags.Flags.FLAG_IMMEDIATE_EXPORT;
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
 
 import android.Manifest;
@@ -61,13 +63,16 @@
 import android.health.connect.aidl.IDataStagingFinishedCallback;
 import android.health.connect.aidl.IEmptyResponseCallback;
 import android.health.connect.aidl.IGetChangeLogTokenCallback;
+import android.health.connect.aidl.IGetChangesForBackupResponseCallback;
 import android.health.connect.aidl.IGetHealthConnectDataStateCallback;
 import android.health.connect.aidl.IGetHealthConnectMigrationUiStateCallback;
 import android.health.connect.aidl.IGetPriorityResponseCallback;
+import android.health.connect.aidl.IGetSettingsForBackupResponseCallback;
 import android.health.connect.aidl.IHealthConnectService;
 import android.health.connect.aidl.IInsertRecordsResponseCallback;
 import android.health.connect.aidl.IMedicalDataSourceResponseCallback;
 import android.health.connect.aidl.IMedicalDataSourcesResponseCallback;
+import android.health.connect.aidl.IMedicalResourceListParcelResponseCallback;
 import android.health.connect.aidl.IMedicalResourceTypeInfosCallback;
 import android.health.connect.aidl.IMedicalResourcesResponseCallback;
 import android.health.connect.aidl.IMigrationCallback;
@@ -75,17 +80,23 @@
 import android.health.connect.aidl.IReadRecordsResponseCallback;
 import android.health.connect.aidl.IRecordTypeInfoResponseCallback;
 import android.health.connect.aidl.InsertRecordsResponseParcel;
+import android.health.connect.aidl.MedicalResourceListParcel;
 import android.health.connect.aidl.ReadRecordsResponseParcel;
 import android.health.connect.aidl.RecordIdFiltersParcel;
 import android.health.connect.aidl.RecordTypeInfoResponseParcel;
 import android.health.connect.aidl.RecordsParcel;
 import android.health.connect.aidl.UpdatePriorityRequestParcel;
+import android.health.connect.aidl.UpsertMedicalResourceRequestsParcel;
+import android.health.connect.backuprestore.GetChangesForBackupResponse;
+import android.health.connect.backuprestore.GetSettingsForBackupResponse;
 import android.health.connect.changelog.ChangeLogTokenRequest;
 import android.health.connect.changelog.ChangeLogTokenResponse;
 import android.health.connect.changelog.ChangeLogsRequest;
 import android.health.connect.changelog.ChangeLogsResponse;
 import android.health.connect.datatypes.AggregationType;
 import android.health.connect.datatypes.DataOrigin;
+import android.health.connect.datatypes.FhirResource;
+import android.health.connect.datatypes.FhirVersion;
 import android.health.connect.datatypes.MedicalDataSource;
 import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.Record;
@@ -112,6 +123,8 @@
 import android.os.UserHandle;
 import android.util.Log;
 
+import com.android.healthfitness.flags.Flags;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.time.Duration;
@@ -991,7 +1004,6 @@
                             callback) {
         try {
             mService.getCurrentPriority(
-                    mContext.getPackageName(),
                     dataCategory,
                     new IGetPriorityResponseCallback.Stub() {
                         @Override
@@ -1027,7 +1039,6 @@
             @NonNull OutcomeReceiver<Void, HealthConnectException> callback) {
         try {
             mService.updatePriority(
-                    mContext.getPackageName(),
                     new UpdatePriorityRequestParcel(request),
                     new IEmptyResponseCallback.Stub() {
                         @Override
@@ -1819,7 +1830,7 @@
     }
 
     /**
-     * Queries the status of a data import.
+     * Imports the given compressed database file.
      *
      * @throws RuntimeException for internal errors
      * @hide
@@ -1855,6 +1866,42 @@
     }
 
     /**
+     * Triggers an immediate export of health connect data.
+     *
+     * @throws RuntimeException for internal errors
+     * @hide
+     */
+    @WorkerThread
+    @FlaggedApi(FLAG_IMMEDIATE_EXPORT)
+    @RequiresPermission(MANAGE_HEALTH_DATA_PERMISSION)
+    public void runImmediateExport(
+            @NonNull Uri file,
+            @NonNull Executor executor,
+            @NonNull OutcomeReceiver<Void, HealthConnectException> callback) {
+        Objects.requireNonNull(file);
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(callback);
+        try {
+            mService.runImmediateExport(
+                    file,
+                    new IEmptyResponseCallback.Stub() {
+                        @Override
+                        public void onResult() {
+                            Binder.clearCallingIdentity();
+                            executor.execute(() -> callback.onResult(null));
+                        }
+
+                        @Override
+                        public void onError(HealthConnectExceptionParcel exception) {
+                            returnError(executor, exception, callback);
+                        }
+                    });
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Returns currently set period between scheduled exports for this user.
      *
      * <p>If you are calling this function for the first time after a user unlock, this might take
@@ -2036,8 +2083,7 @@
 
         Set<String> permissions = new HashSet<>();
         for (PermissionInfo perm : packageInfo.permissions) {
-            if (android.health.connect.HealthPermissions.HEALTH_PERMISSION_GROUP.equals(
-                    perm.group)) {
+            if (HealthPermissions.isValidHealthPermission(perm)) {
                 permissions.add(perm.name);
             }
         }
@@ -2065,23 +2111,58 @@
     }
 
     /**
-     * Inserts or updates a list of {@link MedicalResource}s into the HealthConnect database.
+     * Inserts or updates a list of {@link MedicalResource}s into the HealthConnect database using
+     * {@link UpsertMedicalResourceRequest}.
+     *
+     * <p>For each {@link UpsertMedicalResourceRequest}, one {@link MedicalResource} will be
+     * returned. The returned list of {@link MedicalResource}s will be in the same order as the
+     * {@code requests}.
      *
      * <p>Medical data is represented using the <a href="https://hl7.org/fhir/">Fast Healthcare
-     * Interoperability Resources (FHIR)</a> standard.
+     * Interoperability Resources (FHIR)</a> standard. The FHIR resource provided in {@link
+     * UpsertMedicalResourceRequest#getData()} is expected to be valid FHIR in JSON representation
+     * for the specified {@link UpsertMedicalResourceRequest#getFhirVersion()} according to the <a
+     * href="https://hl7.org/fhir/resourcelist.html">FHIR spec</a>. Structural validation checks
+     * such as resource structure, field types and presence of required fields are performed, but
+     * these checks may not cover all FHIR spec requirements and may change in future versions.
      *
-     * <p>The returned list of {@link MedicalResource}s will be in the same order as the {@code
-     * requests}.
+     * <p>Each {@link UpsertMedicalResourceRequest} also has to meet the following requirements.
      *
-     * <p>The uniqueness is calculated comparing the combination of {@link
+     * <ul>
+     *   <li>The FHIR resource contains an "id" and "resourceType" field.
+     *   <li>The FHIR resource type is in our accepted list of resource types. See {@link
+     *       FhirResource} for the accepted types.
+     *   <li>The FHIR resource does not contain any "contained" resources.
+     *   <li>The resource can be mapped to one of the READ_MEDICAL_DATA_ {@link HealthPermissions}
+     *       categories.
+     *   <li>The {@link UpsertMedicalResourceRequest#getDataSourceId()} is valid.
+     *   <li>The {@link UpsertMedicalResourceRequest#getFhirVersion()} matches the {@link
+     *       FhirVersion} of the {@link MedicalDataSource}.
+     * </ul>
+     *
+     * <p>If any request contains invalid {@link MedicalDataSource} IDs, the API will throw an
+     * {@link IllegalArgumentException}, and none of the {@code requests} will be upserted into the
+     * HealthConnect database.
+     *
+     * <p>If any request is deemed invalid for any other reasons, the caller will receive an
+     * exception with code {@link HealthConnectException#ERROR_INVALID_ARGUMENT} via {@code
+     * callback.onError()}, and none of the {@code requests} will be upserted into the HealthConnect
+     * database.
+     *
+     * <p>If data for any {@link UpsertMedicalResourceRequest} fails to be upserted, then no data
+     * from any {@code requests} will be upserted into the database.
+     *
+     * <p>The uniqueness of each request is calculated comparing the combination of {@link
      * UpsertMedicalResourceRequest#getDataSourceId() data source id}, FHIR resource type and FHIR
-     * resource id extracted from the provided {@link MedicalResource} data. If there is no match,
-     * then a new {@link MedicalResource} is inserted, otherwise the existing one is updated.
+     * resource ID extracted from the provided {@link UpsertMedicalResourceRequest#getData() data}.
+     * If the above combination does not match with an existing one in Health Connect, then a new
+     * {@link MedicalResource} is inserted, otherwise the existing one is updated.
      *
-     * <p>If an invalid {@link UpsertMedicalResourceRequest#getDataSourceId() data source id} is
-     * provided, this will throw an {@link IllegalArgumentException} with the first data source id
-     * that is invalid. In this case, none of the given {@link UpsertMedicalResourceRequest}s will
-     * be upserted into the HealthConnect database.
+     * @param requests List of upsert requests.
+     * @param executor Executor on which to invoke the callback.
+     * @param callback Callback to receive result of performing this operation.
+     * @throws IllegalArgumentException if any {@code requests} contains invalid {@link
+     *     MedicalDataSource} IDs.
      */
     // Suppress missing because API flagged out.
     // TODO: b/355156275 - remove suppression once API not flagged out.
@@ -2102,20 +2183,41 @@
         }
 
         try {
-            mService.upsertMedicalResources(
-                    mContext.getAttributionSource(),
-                    requests,
-                    new IMedicalResourcesResponseCallback.Stub() {
-                        @Override
-                        public void onResult(List<MedicalResource> medicalResources) {
-                            returnResult(executor, medicalResources, callback);
-                        }
+            if (Flags.phrUpsertFixUseSharedMemory()) {
+                mService.upsertMedicalResourcesFromRequestsParcel(
+                        mContext.getAttributionSource(),
+                        new UpsertMedicalResourceRequestsParcel(requests),
+                        new IMedicalResourceListParcelResponseCallback.Stub() {
+                            @Override
+                            public void onResult(
+                                    MedicalResourceListParcel medicalResourceListParcel) {
+                                returnResult(
+                                        executor,
+                                        medicalResourceListParcel.getMedicalResources(),
+                                        callback);
+                            }
 
-                        @Override
-                        public void onError(HealthConnectExceptionParcel exception) {
-                            returnError(executor, exception, callback);
-                        }
-                    });
+                            @Override
+                            public void onError(HealthConnectExceptionParcel exception) {
+                                returnError(executor, exception, callback);
+                            }
+                        });
+            } else {
+                mService.upsertMedicalResources(
+                        mContext.getAttributionSource(),
+                        requests,
+                        new IMedicalResourcesResponseCallback.Stub() {
+                            @Override
+                            public void onResult(List<MedicalResource> medicalResources) {
+                                returnResult(executor, medicalResources, callback);
+                            }
+
+                            @Override
+                            public void onError(HealthConnectExceptionParcel exception) {
+                                returnError(executor, exception, callback);
+                            }
+                        });
+            }
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2124,37 +2226,51 @@
     /**
      * Reads {@link MedicalResource}s based on a list of {@link MedicalResourceId}s.
      *
-     * <p>The returned list of {@link MedicalResource}s will be in the same order as the {@code
-     * ids}.
-     *
-     * <p>Number of resources returned by this API will depend based on below factors:
+     * <p>The number and order of medical resources returned by this API is not guaranteed. The
+     * number will depend on the factors below:
      *
      * <ul>
-     *   <li>When an app with read permissions allowed for the requested IDs but without the {@link
-     *       android.health.connect.HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND} calls the API
-     *       from background then it will be able to read only its own inserted medical resources
-     *       and will not get medical resources inserted by other apps. This may be less than the
-     *       requested size.
-     *   <li>When an app with read permissions allowed for the requested IDs and with the {@link
-     *       android.health.connect.HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND} calls the API
-     *       from background then it will be able to read the medical resources it has read
-     *       permissions for. This has the same size the app can read from foreground.
-     *   <li>When an app with all read permissions allowed for the requested IDs calls the API from
-     *       foreground then it will be able to read all the corresponding medical resources.
-     *   <li>When an app with less read permissions allowed to cover all the requested IDs calls the
-     *       API from foreground then it will be able to read only the medical resources it has read
-     *       permissions for. This may be less than the requested size.
-     *   <li>App with only write permission but no read permission allowed will be able to read only
-     *       its own inserted medical resources both when in foreground or background. This may be
-     *       less than the requested size.
-     *   <li>An app without both read and write permissions will not be able to read any medical
-     *       resources and the API will throw Security Exception.
+     *   <li>If an empty list of {@code ids} is provided, an empty list will be returned.
+     *   <li>If the size of {@code ids} is more than 5000, the API will throw an {@link
+     *       IllegalArgumentException}.
+     *   <li>If any ID in {@code ids} is invalid, the API will throw an {@link
+     *       IllegalArgumentException}.
+     *   <li>If any ID in {@code ids} does not exist, no medical resource will be returned for that
+     *       ID.
+     *   <li>Callers will only get medical resources they are permitted to get. See below.
      * </ul>
      *
+     * Being permitted to read medical resources is dependent on the following logic, in priority
+     * order, earlier statements take precedence.
+     *
+     * <ol>
+     *   <li>A caller with the system permission can get any medical resources in the foreground or
+     *       background.
+     *   <li>A caller without any read or write permissions for health data will not be able to get
+     *       any medical resources and receive an exception with code {@link
+     *       HealthConnectException#ERROR_SECURITY} via {@code callback.onError()}, even for medical
+     *       resources the caller has created.
+     *   <li>Callers can get medical resources they have created, whether this method is called in
+     *       the foreground or background. Note this only applies if the caller has at least one
+     *       read or write permission for health data.
+     *   <li>For any given medical resource, a caller can get that medical resource in the
+     *       foreground if the caller has the corresponding read permission, or in the background if
+     *       it also has {@link
+     *       android.health.connect.HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND}.
+     *   <li>In all other cases the caller is not permitted to get the given medical resource and it
+     *       will not be returned.
+     * </ol>
+     *
+     * <p>Each returned {@link MedicalResource} has passed the Health Connect FHIR validation checks
+     * at write time, but is not guaranteed to meet all requirements of the <a
+     * href="https://hl7.org/fhir/resourcelist.html">Fast Healthcare Interoperability Resources
+     * (FHIR) spec</a>. If required, clients should perform their own checks on the data.
+     *
      * @param ids Identifiers on which to perform read operation.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive result of performing this operation.
-     * @throws IllegalArgumentException if {@code ids} is empty or its size is more than 5000.
+     * @throws IllegalArgumentException if the size of {@code ids} is more than 5000 or if any id is
+     *     invalid.
      */
     @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
     public void readMedicalResources(
@@ -2199,34 +2315,34 @@
      * Reads {@link MedicalResource}s based on {@link ReadMedicalResourcesInitialRequest} or {@link
      * ReadMedicalResourcesPageRequest}.
      *
-     * <p>Number of resources returned by this API will depend based on below factors:
+     * <p>Being permitted to read medical resources is dependent on the following logic, in priority
+     * order, earlier statements take precedence.
      *
-     * <ul>
-     *   <li>When an app with read permissions allowed for the requested filters but without the
-     *       {@link android.health.connect.HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND} calls
-     *       the API from background then it will be able to read only its own inserted medical
-     *       resources and will not get medical resources inserted by other apps. This may be less
-     *       than the size the app can read from foreground.
-     *   <li>When an app with read permissions allowed for the requested filters and with the {@link
-     *       android.health.connect.HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND} calls the API
-     *       from background then it will be able to read all the corresponding medical resources.
-     *       This has the same size the app can read from foreground.
-     *   <li>When an app with the read permissions allowed for the requested filters calls the API
-     *       from foreground then it will be able to read all the corresponding medical resources.
-     *   <li>App with only write permission but no read permission allowed will be able to read only
-     *       its own inserted medical resources both when in foreground or background.
-     *   <li>An app without both read and write permissions will not be able to read any medical
-     *       resources and the API will throw Security Exception.
-     * </ul>
+     * <ol>
+     *   <li>A caller with the system permission can get any medical resources in the foreground or
+     *       background.
+     *   <li>A caller without any read or write permissions for health data will not be able to get
+     *       any medical resources and receive an exception with code {@link
+     *       HealthConnectException#ERROR_SECURITY} via {@code callback.onError()}, even for medical
+     *       resources the caller has created.
+     *   <li>Callers can get medical resources they have created, whether this method is called in
+     *       the foreground or background. Note this only applies if the caller has at least one
+     *       read or write permission for health data.
+     *   <li>For any given medical resource, a caller can get that medical resource in the
+     *       foreground if the caller has the corresponding read permission, or in the background if
+     *       it also has {@link
+     *       android.health.connect.HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND}.
+     *   <li>In all other cases the caller is not permitted to get the given medical resource and it
+     *       will not be returned.
+     * </ol>
      *
      * @param request The read request {@link ReadMedicalResourcesInitialRequest} or {@link
      *     ReadMedicalResourcesPageRequest}.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive result of performing this operation.
-     * @throws IllegalArgumentException if request page size set is less than 1 or more than 5000;
-     *     or if contains not supported medical resource type or invalid {@link MedicalDataSource}
-     *     IDs when using {@link ReadMedicalResourcesInitialRequest}; or page token is {@code null}
-     *     when using {@link ReadMedicalResourcesPageRequest}.
+     * @throws IllegalArgumentException if {@code request} has set page size to be less than 1 or
+     *     more than 5000; or if contains unsupported medical resource type or invalid {@link
+     *     MedicalDataSource} IDs when using {@link ReadMedicalResourcesInitialRequest}.
      */
     @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
     public void readMedicalResources(
@@ -2266,14 +2382,16 @@
      * <p>Regarding permissions:
      *
      * <ul>
-     *   <li>Only apps with {@link HealthPermissions#MANAGE_HEALTH_DATA_PERMISSION} can delete data
-     *       written by apps other than themselves.
+     *   <li>Only apps with the system permission can delete data written by apps other than
+     *       themselves.
      *   <li>Deletes are permitted in the foreground or background.
      * </ul>
      *
      * @param request The delete request.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive result of performing this operation.
+     * @throws IllegalArgumentException if {@code request} contains unsupported medical resource
+     *     types or invalid {@link MedicalDataSource} IDs.
      */
     @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
     // Suppress missing because API flagged out. "RequiresPermission" is also needed because
@@ -2310,13 +2428,21 @@
     }
 
     /**
-     * Deletes a list of medical resources by id. Ids that don't exist will be ignored.
+     * Deletes a list of {@link MedicalResource}s by the provided list of {@link
+     * MedicalResourceId}s.
+     *
+     * <ul>
+     *   <li>If any ID in {@code ids} is invalid, the API will throw an {@link
+     *       IllegalArgumentException}, and nothing will be deleted.
+     *   <li>If any ID in {@code ids} does not exist, that ID will be ignored, while deletion on
+     *       other IDs will be performed.
+     * </ul>
      *
      * <p>Regarding permissions:
      *
      * <ul>
-     *   <li>Only apps with {@link HealthPermissions#MANAGE_HEALTH_DATA_PERMISSION} can delete data
-     *       written by apps other than themselves.
+     *   <li>Only apps with the system permission can delete data written by apps other than
+     *       themselves.
      *   <li>Deletes are permitted in the foreground or background.
      * </ul>
      *
@@ -2411,13 +2537,16 @@
      * <p>Medical data is represented using the <a href="https://hl7.org/fhir/">Fast Healthcare
      * Interoperability Resources (FHIR)</a> standard.
      *
-     * <p>The {@link CreateMedicalDataSourceRequest.Builder#setFhirBaseUri} must be unique across
-     * all medical data sources created by an app. The FHIR base uri cannot be updated after
-     * creating the data source.
+     * <p>The {@link CreateMedicalDataSourceRequest.Builder#setDisplayName display name} must be
+     * unique per app, and {@link CreateMedicalDataSourceRequest.Builder#setFhirVersion} FHIR
+     * version} must be a version supported by Health Connect, as documented on the {@link
+     * FhirVersion}.
      *
      * @param request Creation request.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive result of performing this operation.
+     * @throws IllegalArgumentException if {@code request} contains a FHIR base URI or display name
+     *     exceeding the character limits, or an unsupported FHIR version.
      */
     @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
     // Suppress missing because API flagged out.
@@ -2453,37 +2582,39 @@
     }
 
     /**
-     * Returns {@link MedicalDataSource}s for the provided list of {@link MedicalDataSource} ids.
+     * Returns {@link MedicalDataSource}s for the provided list of IDs.
      *
-     * <p>The returned list of data sources will be in the same order as the {@code ids}.
-     *
-     * <p>Number of data sources returned by this API will depend based on below factors:
+     * <p>The number and order of medical data sources returned by this API is not guaranteed. The
+     * number will depend on the factors below:
      *
      * <ul>
-     *   <li>If an empty list of {@code ids} is provided, no data sources will be returned.
-     *   <li>If an id is invalid or non-existent, no data source will be returned for that id.
+     *   <li>If an empty list of {@code ids} is provided, an empty list will be returned.
+     *   <li>If any ID in {@code ids} is invalid, the caller will receive an exception with code
+     *       {@link HealthConnectException#ERROR_INVALID_ARGUMENT} via {@code callback.onError()}.
+     *   <li>If any ID in {@code ids} does not exist, no data source will be returned for that ID.
      *   <li>Callers will only get data sources they are permitted to get. See below.
      * </ul>
      *
-     * <p>There is no specific read permission for getting data sources. Instead permission to read
-     * data sources is based on whether the caller has permission to read the data currently
-     * contained in that data source. Being permitted to get data sources is dependent on the
-     * following logic, in priority order, earlier statements take precedence.
+     * <p>There is no specific read permission for getting data sources. Instead, permission to read
+     * data sources is based on whether the caller has permission to read the data currently linked
+     * to that data source. Being permitted to get data sources is dependent on the following logic,
+     * in priority order, earlier statements take precedence.
      *
      * <ol>
-     *   <li>A caller with System permission {@link HealthPermissions#MANAGE_HEALTH_DATA_PERMISSION}
-     *       can get any datasource in the foreground or background.
+     *   <li>A caller with the system permission can get any data source in the foreground or
+     *       background.
      *   <li>A caller without any read or write permissions for health data will not be able to get
-     *       any medical data sources and the API will throw {@link SecurityException}, even for
-     *       data sources the caller has created.
+     *       any medical data sources and receive an exception with code {@link
+     *       HealthConnectException#ERROR_SECURITY} via {@code callback.onError()}, even for data
+     *       sources the caller has created.
      *   <li>Callers can get data sources they have created, whether this method is called in the
      *       foreground or background. Note this only applies if the caller has at least one read or
      *       write permission for health data.
      *   <li>For any given data source, a caller can get that data source in the foreground if the
-     *       caller has permission to read any of the data contained in that data source. For
-     *       clarity, the does not allow it to get an empty data source.
+     *       caller has permission to read any of the data linked to that data source. For clarity,
+     *       the does not allow it to get an empty data source.
      *   <li>For any given data source, a caller can get that data source in the background if it
-     *       has both permission to read any of the data contained in that data source, and {@link
+     *       has both permission to read any of the data linked to that data source, and {@link
      *       android.health.connect.HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND}.
      *   <li>In all other cases the caller is not permitted to get the given data source and it will
      *       not be returned.
@@ -2492,6 +2623,7 @@
      * @param ids Identifiers for data sources to get.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive result of performing this operation.
+     * @throws IllegalArgumentException if the size of {@code ids} is more than 5000.
      */
     @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
     public void getMedicalDataSources(
@@ -2507,6 +2639,11 @@
             return;
         }
 
+        if (ids.size() > MAXIMUM_PAGE_SIZE) {
+            throw new IllegalArgumentException(
+                    "The number of requested IDs must be <= " + MAXIMUM_PAGE_SIZE);
+        }
+
         try {
             mService.getMedicalDataSourcesByIds(
                     mContext.getAttributionSource(),
@@ -2533,33 +2670,35 @@
      * <p>Number of data sources returned by this API will depend based on below factors:
      *
      * <ul>
-     *   <li>If an empty {@link GetMedicalDataSourcesRequest} is passed, all data sources for all
-     *       apps are requested, and all which the caller is permitted to get will be returned. See
-     *       below.
-     *   <li>If a list of packages is specified in the request, then only the data sources created
-     *       by those packages is being requested. All data sources created by those packages which
-     *       the caller is permitted to get will be returned. See below.
+     *   <li>If an empty {@link GetMedicalDataSourcesRequest#getPackageNames() list of package
+     *       names} is passed, all permitted data sources from all apps will be returned. See below.
+     *   <li>If any package name in the {@link GetMedicalDataSourcesRequest#getPackageNames() list
+     *       of package names} is invalid, the API will throw an {@link IllegalArgumentException}.
+     *   <li>If a non-empty {@link GetMedicalDataSourcesRequest#getPackageNames() list of package
+     *       names} is specified in the request, then only the permitted data sources created by
+     *       those packages will be returned. See below.
      * </ul>
      *
      * <p>There is no specific read permission for getting data sources. Instead permission to read
-     * data sources is based on whether the caller has permission to read the data currently
-     * contained in that data source. Being permitted to get data sources is dependent on the
-     * following logic, in priority order, earlier statements take precedence.
+     * data sources is based on whether the caller has permission to read the data currently linked
+     * to that data source. Being permitted to get data sources is dependent on the following logic,
+     * in priority order, earlier statements take precedence.
      *
      * <ol>
-     *   <li>A caller with System permission {@link HealthPermissions#MANAGE_HEALTH_DATA_PERMISSION}
-     *       can get any datasource in the foreground or background.
+     *   <li>A caller with the system permission can get any data source in the foreground or
+     *       background.
      *   <li>A caller without any read or write permissions for health data will not be able to get
-     *       any medical data sources and the API will throw {@link SecurityException}, even for
-     *       data sources the caller has created.
+     *       any medical data sources and receive an exception with code {@link
+     *       HealthConnectException#ERROR_SECURITY} via {@code callback.onError()}, even for data
+     *       sources the caller has created.
      *   <li>Callers can get data sources they have created, whether this method is called in the
      *       foreground or background. Note this only applies if the caller has at least one read or
      *       write permission for health data.
      *   <li>For any given data source, a caller can get that data source in the foreground if the
-     *       caller has permission to read any of the data contained in that data source. For
-     *       clarity, the does not allow it to get an empty data source.
+     *       caller has permission to read any of the data linked to that data source. For clarity,
+     *       the does not allow it to get an empty data source.
      *   <li>For any given data source, a caller can get that data source in the background if it
-     *       has both permission to read any of the data contained in that data source, and {@link
+     *       has both permission to read any of the data linked to that data source, and {@link
      *       android.health.connect.HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND}.
      *   <li>In all other cases the caller is not permitted to get the given data source and it will
      *       not be returned.
@@ -2568,6 +2707,7 @@
      * @param request the request for which data sources to return.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive result of performing this operation.
+     * @throws IllegalArgumentException if {@code request} contains invalid package names.
      */
     @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
     public void getMedicalDataSources(
@@ -2599,16 +2739,17 @@
     }
 
     /**
-     * Deletes a {@link MedicalDataSource} and all data contained within it.
+     * Deletes a {@link MedicalDataSource} and all data linked to it.
      *
-     * <p>If the datasource does not exist, {@code callback.onError()} is passed an exception with
-     * code {@link HealthConnectException#ERROR_INVALID_ARGUMENT}.
+     * <p>If the provided data source {@code id} is either invalid, or does not exist, or owned by
+     * another apps, the caller will receive an exception with code {@link
+     * HealthConnectException#ERROR_INVALID_ARGUMENT} via {@code callback.onError()}.
      *
      * <p>Regarding permissions:
      *
      * <ul>
-     *   <li>Only apps with {@link HealthPermissions#MANAGE_HEALTH_DATA_PERMISSION} can delete data
-     *       written by apps other than themselves.
+     *   <li>Only apps with the system permission can delete data written by apps other than
+     *       themselves.
      *   <li>Deletes are permitted in the foreground or background.
      * </ul>
      *
@@ -2650,4 +2791,77 @@
             throw e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * The changeToken returned by the previous call should be passed in to resume the upload. A
+     * null or empty changeToken means we are doing a fresh backup, and should start from the
+     * beginning.
+     *
+     * <p>If the changeToken is not found, it means that HealthConnect can no longer resume the
+     * backup from this point, and will respond with an Exception. The caller should restart the
+     * backup in this case.
+     *
+     * <p>If no changes are returned by the API, this means that the client has synced all changes
+     * as of now.
+     *
+     * @hide
+     */
+    @SuppressWarnings("NullAway") // TODO: b/178748627 - fix this suppression.
+    @FlaggedApi(FLAG_CLOUD_BACKUP_AND_RESTORE)
+    public void getChangesForBackup(
+            @Nullable String changeToken,
+            @NonNull Executor executor,
+            @NonNull
+                    OutcomeReceiver<GetChangesForBackupResponse, HealthConnectException> callback) {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(callback);
+        try {
+            mService.getChangesForBackup(
+                    changeToken,
+                    new IGetChangesForBackupResponseCallback.Stub() {
+                        @Override
+                        public void onResult(GetChangesForBackupResponse response) {
+                            returnResult(executor, response, callback);
+                        }
+
+                        @Override
+                        public void onError(HealthConnectExceptionParcel exception) {
+                            returnError(executor, exception, callback);
+                        }
+                    });
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Returns all user settings bundled as a single byte array.
+     *
+     * @hide
+     */
+    @FlaggedApi(FLAG_CLOUD_BACKUP_AND_RESTORE)
+    public void getSettingsForBackup(
+            @NonNull Executor executor,
+            @NonNull
+                    OutcomeReceiver<GetSettingsForBackupResponse, HealthConnectException>
+                            callback) {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(callback);
+        try {
+            mService.getSettingsForBackup(
+                    new IGetSettingsForBackupResponseCallback.Stub() {
+                        @Override
+                        public void onResult(GetSettingsForBackupResponse response) {
+                            returnResult(executor, response, callback);
+                        }
+
+                        @Override
+                        public void onError(HealthConnectExceptionParcel exception) {
+                            returnError(executor, exception, callback);
+                        }
+                    });
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/framework/java/android/health/connect/HealthPermissionCategory.java b/framework/java/android/health/connect/HealthPermissionCategory.java
index 41d0434..b7db0ed 100644
--- a/framework/java/android/health/connect/HealthPermissionCategory.java
+++ b/framework/java/android/health/connect/HealthPermissionCategory.java
@@ -16,6 +16,7 @@
 
 package android.health.connect;
 
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
 import static com.android.healthfitness.flags.Flags.FLAG_MINDFULNESS;
 
 import android.annotation.FlaggedApi;
@@ -49,6 +50,10 @@
     /** Permission category for {@link ActiveCaloriesBurnedRecord} */
     public static final int ACTIVE_CALORIES_BURNED = 1;
 
+    /** Permission category for {@link android.health.connect.datatypes.ActivityIntensityRecord}. */
+    @FlaggedApi(FLAG_ACTIVITY_INTENSITY)
+    public static final int ACTIVITY_INTENSITY = 42;
+
     /** Permission category for {@link DistanceRecord} */
     public static final int DISTANCE = 2;
 
@@ -178,6 +183,7 @@
     @IntDef({
         UNKNOWN,
         ACTIVE_CALORIES_BURNED,
+        ACTIVITY_INTENSITY,
         DISTANCE,
         ELEVATION_GAINED,
         EXERCISE,
diff --git a/framework/java/android/health/connect/HealthPermissions.java b/framework/java/android/health/connect/HealthPermissions.java
index efa609a..6b9868e 100644
--- a/framework/java/android/health/connect/HealthPermissions.java
+++ b/framework/java/android/health/connect/HealthPermissions.java
@@ -57,6 +57,7 @@
 import static android.health.connect.HealthPermissionCategory.WHEELCHAIR_PUSHES;
 
 import static com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled;
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
 import static com.android.healthfitness.flags.Flags.FLAG_MINDFULNESS;
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
 
@@ -66,7 +67,9 @@
 import android.annotation.SystemApi;
 import android.content.Context;
 import android.content.pm.PackageInfo;
+import android.content.pm.PermissionInfo;
 import android.health.connect.datatypes.ExerciseRoute;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 
@@ -161,6 +164,15 @@
             "android.permission.health.READ_ACTIVE_CALORIES_BURNED";
 
     /**
+     * Allows an application to read the user's activity intensity data.
+     *
+     * <p>Protection level: dangerous.
+     */
+    @FlaggedApi(FLAG_ACTIVITY_INTENSITY)
+    public static final String READ_ACTIVITY_INTENSITY =
+            "android.permission.health.READ_ACTIVITY_INTENSITY";
+
+    /**
      * Allows an application to read the user's distance data.
      *
      * <p>Protection level: dangerous.
@@ -479,6 +491,15 @@
             "android.permission.health.WRITE_ACTIVE_CALORIES_BURNED";
 
     /**
+     * Allows an application to write the user's activity intensity data.
+     *
+     * <p>Protection level: dangerous.
+     */
+    @FlaggedApi(FLAG_ACTIVITY_INTENSITY)
+    public static final String WRITE_ACTIVITY_INTENSITY =
+            "android.permission.health.WRITE_ACTIVITY_INTENSITY";
+
+    /**
      * Allows an application to write the user's distance data.
      *
      * <p>Protection level: dangerous.
@@ -778,17 +799,17 @@
      * <p>Protection level: dangerous.
      */
     @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
-    public static final String READ_MEDICAL_DATA_ALLERGY_INTOLERANCE =
-            "android.permission.health.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE";
+    public static final String READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES =
+            "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES";
 
     /**
-     * Allows an application to read the user's data about immunizations and vaccinations.
+     * Allows an application to read the user's data about medical conditions.
      *
      * <p>Protection level: dangerous.
      */
     @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
-    public static final String READ_MEDICAL_DATA_IMMUNIZATION =
-            "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION";
+    public static final String READ_MEDICAL_DATA_CONDITIONS =
+            "android.permission.health.READ_MEDICAL_DATA_CONDITIONS";
 
     /**
      * Allows an application to read the user's laboratory result data.
@@ -809,6 +830,31 @@
             "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS";
 
     /**
+     * Allows an application to read the user's personal details.
+     *
+     * <p>This is demographic information such as name, date of birth, contact details like address
+     * or telephone number and so on. For more examples see the <a
+     * href="https://www.hl7.org/fhir/patient.html">FHIR Patient resource</a>.
+     *
+     * <p>Protection level: dangerous.
+     */
+    @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
+    public static final String READ_MEDICAL_DATA_PERSONAL_DETAILS =
+            "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS";
+
+    /**
+     * Allows an application to read the user's data about the practitioners who have interacted
+     * with them in their medical record. This is the information about the clinicians (doctors,
+     * nurses, etc) but also other practitioners (masseurs, physiotherapists, etc) who have been
+     * involved with the patient.
+     *
+     * <p>Protection level: dangerous.
+     */
+    @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
+    public static final String READ_MEDICAL_DATA_PRACTITIONER_DETAILS =
+            "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS";
+
+    /**
      * Allows an application to read the user's pregnancy data.
      *
      * <p>Protection level: dangerous.
@@ -818,15 +864,6 @@
             "android.permission.health.READ_MEDICAL_DATA_PREGNANCY";
 
     /**
-     * Allows an application to read the user's data about medical problems.
-     *
-     * <p>Protection level: dangerous.
-     */
-    @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
-    public static final String READ_MEDICAL_DATA_PROBLEMS =
-            "android.permission.health.READ_MEDICAL_DATA_PROBLEMS";
-
-    /**
      * Allows an application to read the user's data about medical procedures.
      *
      * <p>Protection level: dangerous.
@@ -845,6 +882,27 @@
             "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY";
 
     /**
+     * Allows an application to read the user's data about immunizations and vaccinations.
+     *
+     * <p>Protection level: dangerous.
+     */
+    @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
+    public static final String READ_MEDICAL_DATA_VACCINES =
+            "android.permission.health.READ_MEDICAL_DATA_VACCINES";
+
+    /**
+     * Allows an application to read the user's information about their encounters with health care
+     * practitioners, including things like location, time of appointment, and name of organization
+     * the visit was with. Despite the name visit it covers remote encounters such as telephone or
+     * videoconference appointments.
+     *
+     * <p>Protection level: dangerous.
+     */
+    @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
+    public static final String READ_MEDICAL_DATA_VISITS =
+            "android.permission.health.READ_MEDICAL_DATA_VISITS";
+
+    /**
      * Allows an application to read the user's vital signs data.
      *
      * <p>Protection level: dangerous.
@@ -917,7 +975,9 @@
     /**
      * @return true if {@code permissionName} is a write-permission
      * @hide
+     * @deprecated use {@link HealthConnectMappings#isWritePermission(String)}
      */
+    @Deprecated
     public static boolean isWritePermission(@NonNull String permissionName) {
         Objects.requireNonNull(permissionName);
 
@@ -925,10 +985,12 @@
     }
 
     /**
+     * @deprecated Use {@link HealthConnectMappings#getHealthDataCategoryForWritePermission(String)}
      * @return {@link HealthDataCategory} for a WRITE {@code permissionName}. -1 if permission
      *     category for {@code permissionName} is not found (or if {@code permissionName} is READ)
      * @hide
      */
+    @Deprecated
     @HealthDataCategory.Type
     public static int getHealthDataCategoryForWritePermission(@Nullable String permissionName) {
         if (sWriteHealthPermissionToHealthDataCategoryMap.isEmpty()) {
@@ -942,8 +1004,10 @@
     /**
      * @return {@link HealthDataCategory} for {@code permissionName}. -1 if permission category for
      *     {@code permissionName} is not found
+     * @deprecated Use {@link HealthConnectMappings#getWriteHealthPermissionsFor(int)}
      * @hide
      */
+    @Deprecated
     public static String[] getWriteHealthPermissionsFor(@HealthDataCategory.Type int dataCategory) {
         if (sDataCategoryToWritePermissionsMap.isEmpty()) {
             populateWriteHealthPermissionToHealthDataCategoryMap();
@@ -952,8 +1016,12 @@
         return sDataCategoryToWritePermissionsMap.getOrDefault(dataCategory, new String[] {});
     }
 
-    /** @hide */
+    /**
+     * @deprecated Use {@link HealthConnectMappings#getHealthReadPermission(int)}.
+     * @hide
+     */
     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
+    @Deprecated
     public static String getHealthReadPermission(
             @HealthPermissionCategory.Type int permissionCategory) {
         if (sHealthCategoryToReadPermissionMap.isEmpty()) {
@@ -963,7 +1031,11 @@
         return sHealthCategoryToReadPermissionMap.get(permissionCategory);
     }
 
-    /** @hide */
+    /**
+     * @deprecated Use {@link HealthConnectMappings#getHealthWritePermission(int)}.
+     * @hide
+     */
+    @Deprecated
     public static String getHealthWritePermission(
             @HealthPermissionCategory.Type int permissionCategory) {
         if (sHealthCategoryToWritePermissionMap.isEmpty()) {
@@ -991,14 +1063,17 @@
 
         Set<String> permissions = new ArraySet<>();
         permissions.add(WRITE_MEDICAL_DATA);
-        permissions.add(READ_MEDICAL_DATA_ALLERGY_INTOLERANCE);
-        permissions.add(READ_MEDICAL_DATA_IMMUNIZATION);
+        permissions.add(READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES);
+        permissions.add(READ_MEDICAL_DATA_CONDITIONS);
         permissions.add(READ_MEDICAL_DATA_LABORATORY_RESULTS);
         permissions.add(READ_MEDICAL_DATA_MEDICATIONS);
+        permissions.add(READ_MEDICAL_DATA_PERSONAL_DETAILS);
+        permissions.add(READ_MEDICAL_DATA_PRACTITIONER_DETAILS);
         permissions.add(READ_MEDICAL_DATA_PREGNANCY);
-        permissions.add(READ_MEDICAL_DATA_PROBLEMS);
         permissions.add(READ_MEDICAL_DATA_PROCEDURES);
         permissions.add(READ_MEDICAL_DATA_SOCIAL_HISTORY);
+        permissions.add(READ_MEDICAL_DATA_VACCINES);
+        permissions.add(READ_MEDICAL_DATA_VISITS);
         permissions.add(READ_MEDICAL_DATA_VITAL_SIGNS);
         return permissions;
     }
@@ -1047,6 +1122,21 @@
                 .contains(dataCategory);
     }
 
+    /** @hide */
+    public static boolean isValidHealthPermission(PermissionInfo permissionInfo) {
+        return HEALTH_PERMISSION_GROUP.equals(permissionInfo.group)
+                && isPermissionEnabled(permissionInfo.name);
+    }
+
+    /** @hide */
+    // TODO(b/377285620): flag the permissions in the Manifest when fully supported.
+    static boolean isPermissionEnabled(@NonNull String permission) {
+        return switch (permission) {
+            case READ_ACTIVITY_INTENSITY, WRITE_ACTIVITY_INTENSITY -> Flags.activityIntensity();
+            default -> true;
+        };
+    }
+
     private static synchronized void populateHealthPermissionToHealthPermissionCategoryMap() {
         if (!sHealthCategoryToWritePermissionMap.isEmpty()) {
             return;
diff --git a/framework/java/android/health/connect/HealthServicesInitializer.java b/framework/java/android/health/connect/HealthServicesInitializer.java
index 6525825..afa46a6 100644
--- a/framework/java/android/health/connect/HealthServicesInitializer.java
+++ b/framework/java/android/health/connect/HealthServicesInitializer.java
@@ -20,8 +20,11 @@
 import android.app.SystemServiceRegistry;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.health.connect.HealthPermissions;
 import android.health.connect.aidl.IHealthConnectService;
 
+import com.android.healthfitness.flags.Flags;
+
 /**
  * Class for performing registration for Health services.
  *
@@ -43,20 +46,31 @@
                 Context.HEALTHCONNECT_SERVICE,
                 HealthConnectManager.class,
                 (context, serviceBinder) -> {
-                    if (!isHardwareSupported(context)) {
+                    if (!shouldReturnHealthConnectManager(context)) {
                         return null;
                     }
+
                     IHealthConnectService service =
                             IHealthConnectService.Stub.asInterface(serviceBinder);
                     return new HealthConnectManager(context, service);
                 });
     }
 
-    private static boolean isHardwareSupported(Context context) {
+    private static boolean shouldReturnHealthConnectManager(Context context) {
         PackageManager pm = context.getPackageManager();
-        return (!pm.hasSystemFeature(PackageManager.FEATURE_EMBEDDED)
-                && !pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
-                && !pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
-                && !pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE));
+        // Not available on embedded/tv/auto.
+        if (pm.hasSystemFeature(PackageManager.FEATURE_EMBEDDED)
+                || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
+                || pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
+            return false;
+        }
+        // Only available on Wear for permission management.
+        if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+            return Flags.replaceBodySensorPermissionEnabled()
+                    && context.checkSelfPermission(HealthPermissions.MANAGE_HEALTH_PERMISSIONS)
+                            == PackageManager.PERMISSION_GRANTED;
+        }
+        // Supported everywhere else.
+        return true;
     }
-}
+}
\ No newline at end of file
diff --git a/framework/java/android/health/connect/MedicalResourceId.java b/framework/java/android/health/connect/MedicalResourceId.java
index 9e1728b..bcfdb6e 100644
--- a/framework/java/android/health/connect/MedicalResourceId.java
+++ b/framework/java/android/health/connect/MedicalResourceId.java
@@ -17,6 +17,7 @@
 package android.health.connect;
 
 import static android.health.connect.datatypes.FhirResource.validateFhirResourceType;
+import static android.health.connect.datatypes.MedicalDataSource.validateMedicalDataSourceIds;
 import static android.health.connect.internal.datatypes.utils.FhirResourceTypeStringToIntMapper.getFhirResourceTypeInt;
 
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
@@ -26,10 +27,13 @@
 
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
+import android.health.connect.datatypes.FhirResource;
 import android.health.connect.datatypes.FhirResource.FhirResourceType;
+import android.health.connect.datatypes.MedicalDataSource;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -53,11 +57,16 @@
     private static final String FHIR_REFERENCE_REGEX = "([A-Za-z]+)/([A-Za-z0-9-.]+)";
 
     /**
-     * @param dataSourceId The unique identifier of where the data comes from.
+     * Constructs a new {@link MedicalResourceId} instance.
+     *
+     * @param dataSourceId The unique identifier of the existing {@link MedicalDataSource},
+     *     representing where the data comes from.
      * @param fhirResourceType The FHIR resource type. This is the "resourceType" field from a JSON
      *     representation of FHIR resource data.
      * @param fhirResourceId The FHIR resource ID. This is the "id" field from a JSON representation
      *     of FHIR resource data.
+     * @throws IllegalArgumentException if the provided {@code dataSourceId} is not a valid ID, or
+     *     {@code fhirResourceType} is not a valid supported type.
      */
     public MedicalResourceId(
             @NonNull String dataSourceId,
@@ -66,6 +75,7 @@
         requireNonNull(dataSourceId);
         requireNonNull(fhirResourceId);
         validateFhirResourceType(fhirResourceType);
+        validateMedicalDataSourceIds(Set.of(dataSourceId));
         mDataSourceId = dataSourceId;
         mFhirResourceType = fhirResourceType;
         mFhirResourceId = fhirResourceId;
@@ -75,16 +85,25 @@
      * Creates a {@link MedicalResourceId} instance from {@code dataSourceId} and {@code
      * fhirReference}.
      *
-     * @param dataSourceId The unique identifier of a data source where the data comes from.
+     * @param dataSourceId The unique identifier of the existing {@link MedicalDataSource},
+     *     representing where the data comes from.
      * @param fhirReference The FHIR reference string typically extracted from the "reference" field
      *     in one FHIR resource (source), pointing to another FHIR resource (target) within the same
      *     data source, for example "Patient/034AB16".
+     * @throws IllegalArgumentException if the provided {@code dataSourceId} is not a valid ID, the
+     *     referenced resource type is not a valid {@link FhirResource} type supported by Health
+     *     Connect, or {@code fhirReference} does not match with the pattern of {@code
+     *     $fhir_resource_type/$fhir_resource_id}, where the FHIR resource type should align with
+     *     the resource list in <a href="https://build.fhir.org/resourcelist.html">the official FHIR
+     *     website</a>, and the FHIR resource ID should also follow the pattern described in <a
+     *     href="https://build.fhir.org/datatypes.html#id">the official FHIR datatypes</a>.
      */
     @NonNull
     public static MedicalResourceId fromFhirReference(
             @NonNull String dataSourceId, @NonNull String fhirReference) {
         requireNonNull(dataSourceId);
         requireNonNull(fhirReference);
+        validateMedicalDataSourceIds(Set.of(dataSourceId));
         Pattern pattern = Pattern.compile(FHIR_REFERENCE_REGEX);
         Matcher matcher = pattern.matcher(fhirReference);
         if (!matcher.matches()) {
@@ -106,6 +125,7 @@
     private MedicalResourceId(@NonNull Parcel in) {
         requireNonNull(in);
         mDataSourceId = requireNonNull(in.readString());
+        validateMedicalDataSourceIds(Set.of(mDataSourceId));
         mFhirResourceType = in.readInt();
         validateFhirResourceType(mFhirResourceType);
         mFhirResourceId = requireNonNull(in.readString());
@@ -129,7 +149,7 @@
                 }
             };
 
-    /** Returns the unique identifier of where the data comes from. */
+    /** Returns the unique {@link MedicalDataSource} ID of where the data comes from. */
     @NonNull
     public String getDataSourceId() {
         return mDataSourceId;
@@ -152,7 +172,6 @@
         return 0;
     }
 
-    /** Populates a {@link Parcel} with the self information. */
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         requireNonNull(dest);
@@ -161,7 +180,6 @@
         dest.writeString(getFhirResourceId());
     }
 
-    /** Indicates whether some other object is "equal to" this one. */
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -171,13 +189,11 @@
                 && getFhirResourceId().equals(that.getFhirResourceId());
     }
 
-    /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
         return hash(getDataSourceId(), getFhirResourceType(), getFhirResourceId());
     }
 
-    /** Returns a string representation of this {@link MedicalResourceId}. */
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
diff --git a/framework/java/android/health/connect/ReadMedicalResourcesInitialRequest.java b/framework/java/android/health/connect/ReadMedicalResourcesInitialRequest.java
index 360eb7d..f553e09 100644
--- a/framework/java/android/health/connect/ReadMedicalResourcesInitialRequest.java
+++ b/framework/java/android/health/connect/ReadMedicalResourcesInitialRequest.java
@@ -40,7 +40,7 @@
 import java.util.Set;
 
 /**
- * Class to represent an initial read request with specified filters for {@link
+ * An initial read request with specified filters for {@link
  * HealthConnectManager#readMedicalResources}.
  *
  * <p>On receiving the response, if {@link ReadMedicalResourcesResponse#getNextPageToken()} is not
@@ -68,15 +68,8 @@
     @NonNull private final Set<String> mDataSourceIds;
 
     /**
-     * @param medicalResourceType The medical resource type to request to read.
-     * @param dataSourceIds The {@link MedicalDataSource}s filter based on which the read operation
-     *     is to be performed. An empty set means no filter.
-     * @param pageSize The maximum number of {@code MedicalResource}s to be returned by the read
-     *     operation.
-     * @throws IllegalArgumentException if the provided {@code medicalResourceType} is not a
-     *     supported type; or {@code dataSourceIds} is null or any IDs in it are invalid; or {@code
-     *     pageSize} is less than 1 or more than 5000.
-     * @throws NullPointerException if {@code dataSourceIds} is null.
+     * Creates a new instance of {@link ReadMedicalResourcesInitialRequest}. Please see {@link
+     * ReadMedicalResourcesInitialRequest.Builder} for more detailed parameters information.
      */
     private ReadMedicalResourcesInitialRequest(
             @MedicalResourceType int medicalResourceType,
@@ -106,7 +99,6 @@
         return new ArraySet<>(mDataSourceIds);
     }
 
-    /** Indicates whether some other object is "equal to" this one. */
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -117,13 +109,11 @@
                 && getPageSize() == that.getPageSize();
     }
 
-    /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
         return hash(getMedicalResourceType(), getDataSourceIds(), getPageSize());
     }
 
-    /** Returns a string representation of this {@link ReadMedicalResourcesInitialRequest}. */
     @Override
     public String toString() {
         return this.getClass().getSimpleName()
@@ -146,13 +136,15 @@
         return new ReadMedicalResourcesRequestParcel(this);
     }
 
-    /** Builder class for {@link ReadMedicalResourcesInitialRequest} */
+    /** Builder class for {@link ReadMedicalResourcesInitialRequest}. */
     public static final class Builder {
         @MedicalResourceType private int mMedicalResourceType;
         @NonNull private Set<String> mDataSourceIds = new HashSet<>();
         private int mPageSize = DEFAULT_PAGE_SIZE;
 
         /**
+         * Constructs a new {@link ReadMedicalResourcesInitialRequest.Builder} instance.
+         *
          * @param medicalResourceType The medical resource type.
          * @throws IllegalArgumentException if the provided {@code medicalResourceType} is not a
          *     supported type.
@@ -162,24 +154,18 @@
             mMedicalResourceType = medicalResourceType;
         }
 
-        /**
-         * @param original The other {@link Builder} to provide data to construct this new instance
-         *     from.
-         */
-        public Builder(@NonNull Builder original) {
-            mMedicalResourceType = original.mMedicalResourceType;
-            mDataSourceIds.addAll(original.mDataSourceIds);
-            mPageSize = original.mPageSize;
+        /** Constructs a clone of the other {@link ReadMedicalResourcesInitialRequest.Builder}. */
+        public Builder(@NonNull Builder other) {
+            mMedicalResourceType = other.mMedicalResourceType;
+            mDataSourceIds.addAll(other.mDataSourceIds);
+            mPageSize = other.mPageSize;
         }
 
-        /**
-         * @param original The other {@link ReadMedicalResourcesInitialRequest} instance to provide
-         *     data to construct this new instance from.
-         */
-        public Builder(@NonNull ReadMedicalResourcesInitialRequest original) {
-            mMedicalResourceType = original.getMedicalResourceType();
-            mDataSourceIds.addAll(original.getDataSourceIds());
-            mPageSize = original.getPageSize();
+        /** Constructs a clone of the other {@link ReadMedicalResourcesInitialRequest} instance. */
+        public Builder(@NonNull ReadMedicalResourcesInitialRequest other) {
+            mMedicalResourceType = other.getMedicalResourceType();
+            mDataSourceIds.addAll(other.getDataSourceIds());
+            mPageSize = other.getPageSize();
         }
 
         /**
@@ -196,15 +182,13 @@
         }
 
         /**
-         * Adds the {@link MedicalDataSource} filter based on which the read operation is to be
-         * performed.
+         * Adds the data source ID based on which the read operation is to be performed. This should
+         * be an ID of the existing {@link MedicalDataSource}.
          *
-         * @param dataSourceId The ID of an existing {@link MedicalDataSource} from which to read
-         *     {@link MedicalResource}s.
-         *     <p>If no {@link MedicalDataSource} ID is added, then {@link MedicalResource}s from
-         *     all {@link MedicalDataSource}s will be read.
-         * @throws IllegalArgumentException if the provided {@code dataSourceId} is null, or is not
-         *     a valid ID.
+         * <p>If no {@link MedicalDataSource} ID is added, then {@link MedicalResource}s from all
+         * {@link MedicalDataSource}s will be read.
+         *
+         * @throws IllegalArgumentException if the provided {@code dataSourceId} is not a valid ID.
          */
         @NonNull
         public Builder addDataSourceId(@NonNull String dataSourceId) {
@@ -215,13 +199,12 @@
         }
 
         /**
-         * Adds all {@link MedicalDataSource}s filter based on which the read operation is to be
-         * performed.
+         * Adds all data source IDs based on which the read operation is to be performed. This
+         * should all be IDs of existing {@link MedicalDataSource}s.
          *
-         * @param dataSourceIds the set of IDs of the existing {@link MedicalDataSource}s from which
-         *     to read {@link MedicalResource}s.
-         *     <p>If no {@link MedicalDataSource} ID is added, then {@link MedicalResource}s from
-         *     all {@link MedicalDataSource}s will be read.
+         * <p>If no {@link MedicalDataSource} IDs are added, then {@link MedicalResource}s from all
+         * {@link MedicalDataSource}s will be read.
+         *
          * @throws IllegalArgumentException if the provided {@code dataSourceIds} is null, or any ID
          *     in it is not valid.
          */
diff --git a/framework/java/android/health/connect/ReadMedicalResourcesPageRequest.java b/framework/java/android/health/connect/ReadMedicalResourcesPageRequest.java
index ab860f1..f93de0a 100644
--- a/framework/java/android/health/connect/ReadMedicalResourcesPageRequest.java
+++ b/framework/java/android/health/connect/ReadMedicalResourcesPageRequest.java
@@ -31,7 +31,7 @@
 import android.health.connect.aidl.ReadMedicalResourcesRequestParcel;
 
 /**
- * Class to represent a page read request with specified {@code pageToken} for {@link
+ * A page read request with specified {@code pageToken} for {@link
  * HealthConnectManager#readMedicalResources}.
  *
  * <p>When making a new initial request with new filters, use {@link
@@ -57,11 +57,8 @@
     @NonNull private final String mPageToken;
 
     /**
-     * @param pageToken The page token to read the requested page of the result.
-     * @param pageSize The maximum number of {@code MedicalResource}s to be returned by the read
-     *     operation.
-     * @throws IllegalArgumentException if {@code pageSize} is less than 1 or more than 5000.
-     * @throws NullPointerException if {@code pageToken} is null.
+     * Creates a new instance of {@link ReadMedicalResourcesPageRequest}. Please see {@link
+     * ReadMedicalResourcesPageRequest.Builder} for more detailed parameters information.
      */
     private ReadMedicalResourcesPageRequest(
             @NonNull String pageToken,
@@ -77,7 +74,6 @@
         return mPageToken;
     }
 
-    /** Indicates whether some other object is "equal to" this one. */
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -85,13 +81,11 @@
         return getPageToken().equals(that.getPageToken()) && getPageSize() == that.getPageSize();
     }
 
-    /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
         return hash(getPageToken(), getPageSize());
     }
 
-    /** Returns a string representation of this {@link ReadMedicalResourcesPageRequest}. */
     @Override
     public String toString() {
         return this.getClass().getSimpleName()
@@ -112,44 +106,37 @@
         return new ReadMedicalResourcesRequestParcel(this);
     }
 
-    /** Builder class for {@link ReadMedicalResourcesPageRequest} */
+    /** Builder class for {@link ReadMedicalResourcesPageRequest}. */
     public static final class Builder {
         @NonNull private String mPageToken;
         private int mPageSize = DEFAULT_PAGE_SIZE;
 
         /**
+         * Constructs a new {@link ReadMedicalResourcesPageRequest} instance.
+         *
          * @param pageToken The page token to read the requested page of the result, from the
          *     previous {@link ReadMedicalResourcesResponse#getNextPageToken()}.
-         * @throws IllegalArgumentException if the provided {@code pageToken} is null.
          */
         public Builder(@NonNull String pageToken) {
             requireNonNull(pageToken);
             mPageToken = pageToken;
         }
 
-        /**
-         * @param original The other {@link Builder} to provide data to construct this new instance
-         *     from.
-         */
-        public Builder(@NonNull Builder original) {
-            mPageToken = original.mPageToken;
-            mPageSize = original.mPageSize;
+        /** Constructs a clone of the other {@link ReadMedicalResourcesPageRequest.Builder}. */
+        public Builder(@NonNull Builder other) {
+            mPageToken = other.mPageToken;
+            mPageSize = other.mPageSize;
         }
 
-        /**
-         * @param original The other {@link ReadMedicalResourcesPageRequest} instance to provide
-         *     data to construct this new instance from.
-         */
-        public Builder(@NonNull ReadMedicalResourcesPageRequest original) {
-            mPageToken = original.getPageToken();
-            mPageSize = original.getPageSize();
+        /** Constructs a clone of the other {@link ReadMedicalResourcesPageRequest} instance. */
+        public Builder(@NonNull ReadMedicalResourcesPageRequest other) {
+            mPageToken = other.getPageToken();
+            mPageSize = other.getPageSize();
         }
 
         /**
          * Sets page token to read the requested page of the result, from the previous {@link
          * ReadMedicalResourcesResponse#getNextPageToken()}.
-         *
-         * @throws NullPointerException if {@code pageToken} is null.
          */
         @NonNull
         public Builder setPageToken(@NonNull String pageToken) {
diff --git a/framework/java/android/health/connect/ReadMedicalResourcesRequest.aidl b/framework/java/android/health/connect/ReadMedicalResourcesRequest.aidl
deleted file mode 100644
index 72222af..0000000
--- a/framework/java/android/health/connect/ReadMedicalResourcesRequest.aidl
+++ /dev/null
@@ -1,4 +0,0 @@
-package android.health.connect;
-
-/** @hide */
-parcelable ReadMedicalResourcesRequest;
\ No newline at end of file
diff --git a/framework/java/android/health/connect/ReadMedicalResourcesResponse.java b/framework/java/android/health/connect/ReadMedicalResourcesResponse.java
index 5d9494d..5e95704 100644
--- a/framework/java/android/health/connect/ReadMedicalResourcesResponse.java
+++ b/framework/java/android/health/connect/ReadMedicalResourcesResponse.java
@@ -33,22 +33,39 @@
 import java.util.List;
 import java.util.Objects;
 
-/** A class to represent a read response for {@link HealthConnectManager#readMedicalResources}. */
+/** A read response for {@link HealthConnectManager#readMedicalResources}. */
 @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
 public final class ReadMedicalResourcesResponse implements Parcelable {
     @NonNull private final List<MedicalResource> mMedicalResources;
     @Nullable private final String mNextPageToken;
+    private final int mRemainingCount;
 
     /**
+     * Constructs a new {@link ReadMedicalResourcesResponse} instance.
+     *
      * @param medicalResources List of {@link MedicalResource}s.
      * @param nextPageToken The token value of the read result which can be used as input token for
      *     next read request. {@code null} if there are no more pages available.
+     * @param remainingCount the total number of medical resources remaining, excluding the ones in
+     *     this response
      */
     public ReadMedicalResourcesResponse(
-            @NonNull List<MedicalResource> medicalResources, @Nullable String nextPageToken) {
+            @NonNull List<MedicalResource> medicalResources,
+            @Nullable String nextPageToken,
+            int remainingCount) {
         requireNonNull(medicalResources);
+        if (nextPageToken == null && remainingCount > 0) {
+            throw new IllegalArgumentException(
+                    String.format(
+                            "Remaining count must be 0 to have a null next page token, but was %d",
+                            remainingCount));
+        }
+        if (nextPageToken != null && remainingCount == 0) {
+            throw new IllegalArgumentException("Next page token provided with no remaining data");
+        }
         mMedicalResources = medicalResources;
         mNextPageToken = nextPageToken;
+        mRemainingCount = remainingCount;
     }
 
     private ReadMedicalResourcesResponse(@NonNull Parcel in) {
@@ -58,6 +75,7 @@
         in.readParcelableList(
                 mMedicalResources, MedicalResource.class.getClassLoader(), MedicalResource.class);
         mNextPageToken = in.readString();
+        mRemainingCount = in.readInt();
     }
 
     @NonNull
@@ -89,6 +107,18 @@
         return mNextPageToken;
     }
 
+    /**
+     * Returns the count of medical resources still remaining which were not returned due to
+     * pagination.
+     *
+     * <p>For a response with a null next page token, this will be 0. This result is accurate at the
+     * time the request was made, and with the permissions when the request was made. However, the
+     * actual results may change if permissions change or resources are inserted or deleted.
+     */
+    public int getRemainingCount() {
+        return mRemainingCount;
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -104,20 +134,30 @@
         requireNonNull(dest);
         dest.writeParcelableList(mMedicalResources, 0);
         dest.writeString(mNextPageToken);
+        dest.writeInt(mRemainingCount);
     }
 
-    /** Indicates whether some other object is "equal to" this one. */
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (!(o instanceof ReadMedicalResourcesResponse that)) return false;
         return getMedicalResources().equals(that.getMedicalResources())
-                && Objects.equals(getNextPageToken(), that.getNextPageToken());
+                && Objects.equals(getNextPageToken(), that.getNextPageToken())
+                && mRemainingCount == that.getRemainingCount();
     }
 
-    /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
-        return hash(getMedicalResources(), getNextPageToken());
+        return hash(getMedicalResources(), getNextPageToken(), mRemainingCount);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(this.getClass().getSimpleName()).append("{");
+        sb.append("medicalResources=").append(getMedicalResources());
+        sb.append(",nextPageToken=").append(getNextPageToken());
+        sb.append("}");
+        return sb.toString();
     }
 }
diff --git a/framework/java/android/health/connect/UpsertMedicalResourceRequest.java b/framework/java/android/health/connect/UpsertMedicalResourceRequest.java
index f0c9318..aade28d 100644
--- a/framework/java/android/health/connect/UpsertMedicalResourceRequest.java
+++ b/framework/java/android/health/connect/UpsertMedicalResourceRequest.java
@@ -16,6 +16,8 @@
 
 package android.health.connect;
 
+import static android.health.connect.datatypes.MedicalDataSource.validateMedicalDataSourceIds;
+
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
 
 import static java.util.Objects.hash;
@@ -28,8 +30,12 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import com.android.healthfitness.flags.Flags;
+
+import java.util.Set;
+
 /**
- * Class used to create requests for {@link HealthConnectManager#upsertMedicalResources}.
+ * An upsert request for {@link HealthConnectManager#upsertMedicalResources}.
  *
  * <p>Medical data is represented using the <a href="https://hl7.org/fhir/">Fast Healthcare
  * Interoperability Resources (FHIR)</a> standard.
@@ -39,7 +45,7 @@
     @NonNull private final String mDataSourceId;
     @NonNull private final FhirVersion mFhirVersion;
     @NonNull private final String mData;
-    private long mDataSize;
+    private int mDataSize;
 
     @NonNull
     public static final Creator<UpsertMedicalResourceRequest> CREATOR =
@@ -56,16 +62,15 @@
             };
 
     /**
-     * @param dataSourceId The id associated with the existing {@link MedicalDataSource}.
-     * @param fhirVersion The {@link FhirVersion} object that represents the FHIR version being used
-     *     for {@code data}.
-     * @param data The FHIR resource data in JSON representation.
+     * Creates a new instance of {@link UpsertMedicalResourceRequest}. Please see {@link
+     * UpsertMedicalResourceRequest.Builder} for more detailed parameters information.
      */
     private UpsertMedicalResourceRequest(
             @NonNull String dataSourceId, @NonNull FhirVersion fhirVersion, @NonNull String data) {
         requireNonNull(dataSourceId);
         requireNonNull(fhirVersion);
         requireNonNull(data);
+        validateMedicalDataSourceIds(Set.of(dataSourceId));
 
         mDataSourceId = dataSourceId;
         mFhirVersion = fhirVersion;
@@ -74,17 +79,25 @@
 
     private UpsertMedicalResourceRequest(@NonNull Parcel in) {
         requireNonNull(in);
-        mDataSize = in.dataSize();
+        int dataAvailStartPosition = in.dataAvail();
+
         mDataSourceId = requireNonNull(in.readString());
+        validateMedicalDataSourceIds(Set.of(mDataSourceId));
         mFhirVersion =
                 requireNonNull(
                         in.readParcelable(FhirVersion.class.getClassLoader(), FhirVersion.class));
         mData = requireNonNull(in.readString());
+
+        if (Flags.phrUpsertFixParcelSizeCalculation()) {
+            mDataSize = dataAvailStartPosition - in.dataAvail();
+        } else {
+            mDataSize = in.dataSize();
+        }
     }
 
     /**
-     * Returns the id of the existing {@link MedicalDataSource}, to represent where the data is
-     * coming from.
+     * Returns the unique ID of the existing {@link MedicalDataSource}, to represent where the
+     * {@code data} is coming from.
      */
     @NonNull
     public String getDataSourceId() {
@@ -92,8 +105,9 @@
     }
 
     /**
-     * Returns the {@link FhirVersion} object that represents the FHIR version being used for {@code
-     * data}.
+     * Returns the FHIR version being used for {@code data}. For the request to succeed this must
+     * match the {@link MedicalDataSource#getFhirVersion()} FHIR version of the {@link
+     * MedicalDataSource} with the provided {@code dataSourceId}.
      */
     @NonNull
     public FhirVersion getFhirVersion() {
@@ -120,7 +134,6 @@
         return 0;
     }
 
-    /** Populates a {@link Parcel} with the self information. */
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         requireNonNull(dest);
@@ -129,13 +142,11 @@
         dest.writeString(mData);
     }
 
-    /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
         return hash(getDataSourceId(), getFhirVersion(), getData());
     }
 
-    /** Returns whether an object is equal to the current one. */
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -145,6 +156,17 @@
                 && getData().equals(that.getData());
     }
 
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(this.getClass().getSimpleName()).append("{");
+        sb.append("dataSourceId=").append(mDataSourceId);
+        sb.append(",fhirVersion=").append(mFhirVersion);
+        sb.append(",data=").append(mData);
+        sb.append("}");
+        return sb.toString();
+    }
+
     /** Builder class for {@link UpsertMedicalResourceRequest}. */
     public static final class Builder {
         private String mDataSourceId;
@@ -152,10 +174,15 @@
         private String mData;
 
         /**
-         * @param dataSourceId The id associated with the existing {@link MedicalDataSource}.
+         * Constructs a new {@link UpsertMedicalResourceRequest.Builder} instance.
+         *
+         * @param dataSourceId The unique identifier of the existing {@link MedicalDataSource},
+         *     representing where the data comes from.
          * @param fhirVersion The {@link FhirVersion} object that represents the FHIR version being
-         *     used for {@code data}.
+         *     used for {@code data}. This has to match the FHIR version of the {@link
+         *     MedicalDataSource}.
          * @param data The FHIR resource data in JSON representation.
+         * @throws IllegalArgumentException if the provided {@code dataSourceId} is not a valid ID.
          */
         public Builder(
                 @NonNull String dataSourceId,
@@ -164,39 +191,47 @@
             requireNonNull(dataSourceId);
             requireNonNull(fhirVersion);
             requireNonNull(data);
+            validateMedicalDataSourceIds(Set.of(dataSourceId));
 
             mDataSourceId = dataSourceId;
             mFhirVersion = fhirVersion;
             mData = data;
         }
 
-        public Builder(@NonNull Builder original) {
-            requireNonNull(original);
-            mDataSourceId = original.mDataSourceId;
-            mFhirVersion = original.mFhirVersion;
-            mData = original.mData;
+        /** Constructs a clone of the other {@link UpsertMedicalResourceRequest.Builder}. */
+        public Builder(@NonNull Builder other) {
+            requireNonNull(other);
+            mDataSourceId = other.mDataSourceId;
+            mFhirVersion = other.mFhirVersion;
+            mData = other.mData;
         }
 
-        public Builder(@NonNull UpsertMedicalResourceRequest original) {
-            requireNonNull(original);
-            mDataSourceId = original.getDataSourceId();
-            mFhirVersion = original.getFhirVersion();
-            mData = original.getData();
+        /** Constructs a clone of the other {@link UpsertMedicalResourceRequest} instance. */
+        public Builder(@NonNull UpsertMedicalResourceRequest other) {
+            requireNonNull(other);
+            mDataSourceId = other.getDataSourceId();
+            mFhirVersion = other.getFhirVersion();
+            mData = other.getData();
         }
 
         /**
-         * @param dataSourceId The id associated with the existing {@link MedicalDataSource}.
+         * Sets the unique ID of the existing {@link MedicalDataSource}, to represent where the
+         * {@code data} is coming from.
+         *
+         * @throws IllegalArgumentException if the provided {@code dataSourceId} is not a valid ID.
          */
         @NonNull
         public Builder setDataSourceId(@NonNull String dataSourceId) {
             requireNonNull(dataSourceId);
+            validateMedicalDataSourceIds(Set.of(dataSourceId));
             mDataSourceId = dataSourceId;
             return this;
         }
 
         /**
-         * @param fhirVersion The {@link FhirVersion} object that represents the FHIR version being
-         *     used for {@code data}.
+         * Sets the FHIR version being used for {@code data}. For the request to succeed this must
+         * match the {@link MedicalDataSource#getFhirVersion()} FHIR version} of the {@link
+         * MedicalDataSource} with the provided {@code dataSourceId}.
          */
         @NonNull
         public Builder setFhirVersion(@NonNull FhirVersion fhirVersion) {
@@ -205,9 +240,7 @@
             return this;
         }
 
-        /**
-         * @param data represents the FHIR resource data in JSON format.
-         */
+        /** Sets the FHIR resource data in JSON format. */
         @NonNull
         public Builder setData(@NonNull String data) {
             requireNonNull(data);
@@ -215,7 +248,10 @@
             return this;
         }
 
-        /** Returns the Object of {@link UpsertMedicalResourceRequest}. */
+        /**
+         * Returns a new instance of {@link UpsertMedicalResourceRequest} with the specified
+         * parameters.
+         */
         @NonNull
         public UpsertMedicalResourceRequest build() {
             return new UpsertMedicalResourceRequest(mDataSourceId, mFhirVersion, mData);
diff --git a/framework/java/android/health/connect/accesslog/AccessLog.java b/framework/java/android/health/connect/accesslog/AccessLog.java
index f8e6f9e..eef5244 100644
--- a/framework/java/android/health/connect/accesslog/AccessLog.java
+++ b/framework/java/android/health/connect/accesslog/AccessLog.java
@@ -33,7 +33,7 @@
 import android.health.connect.datatypes.MedicalResource.MedicalResourceType;
 import android.health.connect.datatypes.Record;
 import android.health.connect.datatypes.RecordTypeIdentifier;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -79,10 +79,10 @@
         requireNonNull(recordTypes);
 
         mPackageName = packageName;
-        RecordMapper recordMapper = RecordMapper.getInstance();
+        HealthConnectMappings healthConnectMappings = HealthConnectMappings.getInstance();
         for (@RecordTypeIdentifier.RecordType int recordType : recordTypes) {
             mRecordTypesList.add(
-                    recordMapper.getRecordIdToExternalRecordClassMap().get(recordType));
+                    healthConnectMappings.getRecordIdToExternalRecordClassMap().get(recordType));
         }
         mAccessTime = Instant.ofEpochMilli(accessTimeInMillis);
         mOperationType = operationType;
@@ -123,11 +123,12 @@
     }
 
     private AccessLog(Parcel in) {
-        RecordMapper recordMapper = RecordMapper.getInstance();
+        HealthConnectMappings healthConnectMappings = HealthConnectMappings.getInstance();
+
         int[] recordTypes = requireNonNull(in.createIntArray());
         for (@RecordTypeIdentifier.RecordType int recordType : recordTypes) {
             mRecordTypesList.add(
-                    recordMapper.getRecordIdToExternalRecordClassMap().get(recordType));
+                    healthConnectMappings.getRecordIdToExternalRecordClassMap().get(recordType));
         }
         mPackageName = requireNonNull(in.readString());
         mAccessTime = Instant.ofEpochMilli(in.readLong());
@@ -240,10 +241,10 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         int recordTypeCount = mRecordTypesList.size();
-        RecordMapper recordMapper = RecordMapper.getInstance();
+        HealthConnectMappings healthConnectMappings = HealthConnectMappings.getInstance();
         @RecordTypeIdentifier.RecordType int[] recordTypes = new int[recordTypeCount];
         for (int i = 0; i < recordTypeCount; i++) {
-            recordTypes[i] = recordMapper.getRecordType(mRecordTypesList.get(i));
+            recordTypes[i] = healthConnectMappings.getRecordType(mRecordTypesList.get(i));
         }
         dest.writeIntArray(recordTypes);
         dest.writeString(mPackageName);
diff --git a/framework/java/android/health/connect/aidl/ActivityDatesRequestParcel.java b/framework/java/android/health/connect/aidl/ActivityDatesRequestParcel.java
index 3d888b6..15e2fc4 100644
--- a/framework/java/android/health/connect/aidl/ActivityDatesRequestParcel.java
+++ b/framework/java/android/health/connect/aidl/ActivityDatesRequestParcel.java
@@ -18,7 +18,7 @@
 
 import android.annotation.NonNull;
 import android.health.connect.datatypes.Record;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -52,9 +52,11 @@
 
     public ActivityDatesRequestParcel(@NonNull List<Class<? extends Record>> recordTypes) {
         Objects.requireNonNull(recordTypes);
-        RecordMapper recordMapper = RecordMapper.getInstance();
+        HealthConnectMappings healthConnectMappings = HealthConnectMappings.getInstance();
         mRecordTypes =
-                recordTypes.stream().map(recordMapper::getRecordType).collect(Collectors.toList());
+                recordTypes.stream()
+                        .map(healthConnectMappings::getRecordType)
+                        .collect(Collectors.toList());
     }
 
     private ActivityDatesRequestParcel(Parcel in) {
@@ -89,7 +91,7 @@
     @NonNull
     public List<Class<? extends Record>> getRecordTypes() {
         final Map<Integer, Class<? extends Record>> mRecordIdToExternalRecordClassMap =
-                RecordMapper.getInstance().getRecordIdToExternalRecordClassMap();
+                HealthConnectMappings.getInstance().getRecordIdToExternalRecordClassMap();
         return mRecordTypes.stream()
                 .map(mRecordIdToExternalRecordClassMap::get)
                 .collect(Collectors.toList());
diff --git a/framework/java/android/health/connect/aidl/DeleteUsingFiltersRequestParcel.java b/framework/java/android/health/connect/aidl/DeleteUsingFiltersRequestParcel.java
index 233f2f8..b269631 100644
--- a/framework/java/android/health/connect/aidl/DeleteUsingFiltersRequestParcel.java
+++ b/framework/java/android/health/connect/aidl/DeleteUsingFiltersRequestParcel.java
@@ -22,7 +22,7 @@
 import android.health.connect.DeleteUsingFiltersRequest;
 import android.health.connect.TimeRangeFilterHelper;
 import android.health.connect.datatypes.DataOrigin;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -76,7 +76,9 @@
         mRecordTypeFilters =
                 request.getRecordTypes().stream()
                         .mapToInt(
-                                recordType -> RecordMapper.getInstance().getRecordType(recordType))
+                                recordType ->
+                                        HealthConnectMappings.getInstance()
+                                                .getRecordType(recordType))
                         .toArray();
 
         if (request.getTimeRangeFilter() == null) {
@@ -122,7 +124,7 @@
             return mRecordIdFiltersParcel.getRecordIdFilters().stream()
                     .map(
                             (recordIdFilter) ->
-                                    RecordMapper.getInstance()
+                                    HealthConnectMappings.getInstance()
                                             .getRecordType(recordIdFilter.getRecordType()))
                     .toList()
                     .stream()
diff --git a/framework/java/android/health/connect/aidl/IGetChangesForBackupResponseCallback.aidl b/framework/java/android/health/connect/aidl/IGetChangesForBackupResponseCallback.aidl
new file mode 100644
index 0000000..554d9dd
--- /dev/null
+++ b/framework/java/android/health/connect/aidl/IGetChangesForBackupResponseCallback.aidl
@@ -0,0 +1,15 @@
+package android.health.connect.aidl;
+
+import android.health.connect.backuprestore.GetChangesForBackupResponse;
+import android.health.connect.aidl.HealthConnectExceptionParcel;
+
+/**
+ * Callback for {@link HealthConnectManager#getChangesForBackup}
+ * {@hide}
+ */
+interface IGetChangesForBackupResponseCallback {
+    // Called on a successful operation
+    oneway void onResult(in GetChangesForBackupResponse parcel);
+    // Called when an error is hit
+    oneway void onError(in HealthConnectExceptionParcel exception);
+}
diff --git a/framework/java/android/health/connect/aidl/IGetSettingsForBackupResponseCallback.aidl b/framework/java/android/health/connect/aidl/IGetSettingsForBackupResponseCallback.aidl
new file mode 100644
index 0000000..873f055
--- /dev/null
+++ b/framework/java/android/health/connect/aidl/IGetSettingsForBackupResponseCallback.aidl
@@ -0,0 +1,15 @@
+package android.health.connect.aidl;
+
+import android.health.connect.backuprestore.GetSettingsForBackupResponse;
+import android.health.connect.aidl.HealthConnectExceptionParcel;
+
+/**
+ * Callback for {@link HealthConnectManager#getSettingsForBackup}
+ * {@hide}
+ */
+interface IGetSettingsForBackupResponseCallback {
+    // Called on a successful operation
+    oneway void onResult(in GetSettingsForBackupResponse parcel);
+    // Called when an error is hit
+    oneway void onError(in HealthConnectExceptionParcel exception);
+}
diff --git a/framework/java/android/health/connect/aidl/IHealthConnectService.aidl b/framework/java/android/health/connect/aidl/IHealthConnectService.aidl
index 3184df2..fc91787 100644
--- a/framework/java/android/health/connect/aidl/IHealthConnectService.aidl
+++ b/framework/java/android/health/connect/aidl/IHealthConnectService.aidl
@@ -20,6 +20,8 @@
 import android.health.connect.aidl.IEmptyResponseCallback;
 import android.health.connect.aidl.IGetChangeLogTokenCallback;
 import android.health.connect.aidl.IGetHealthConnectDataStateCallback;
+import android.health.connect.aidl.IGetChangesForBackupResponseCallback;
+import android.health.connect.aidl.IGetSettingsForBackupResponseCallback;
 import android.health.connect.aidl.IGetHealthConnectMigrationUiStateCallback;
 import android.health.connect.aidl.IGetPriorityResponseCallback;
 import android.health.connect.aidl.IInsertRecordsResponseCallback;
@@ -27,6 +29,7 @@
 import android.health.connect.aidl.IMedicalDataSourcesResponseCallback;
 import android.health.connect.aidl.ReadMedicalResourcesRequestParcel;
 import android.health.connect.aidl.IMedicalResourcesResponseCallback;
+import android.health.connect.aidl.IMedicalResourceListParcelResponseCallback;
 import android.health.connect.aidl.IMedicalResourceTypeInfosCallback;
 import android.health.connect.aidl.IMigrationCallback;
 import android.health.connect.aidl.IReadMedicalResourcesResponseCallback;
@@ -36,6 +39,8 @@
 import android.health.connect.aidl.RecordsParcel;
 import android.health.connect.aidl.RecordsParcel;
 import android.health.connect.aidl.UpdatePriorityRequestParcel;
+import android.health.connect.aidl.UpsertMedicalResourceRequestsParcel;
+import android.health.connect.backuprestore.BackupSettings;
 import android.health.connect.changelog.ChangeLogTokenRequest;
 import android.health.connect.changelog.ChangeLogsRequest;
 import android.health.connect.datatypes.MedicalDataSource;
@@ -167,22 +172,19 @@
         in IEmptyResponseCallback callback);
 
     /**
-     * @param packageName Calling package's name
      * @param permissionCategory PermissionCategory corresponding to which priority is requested
      * @param callback Callback to receive result of performing this operation
      */
     void getCurrentPriority(
-        String packageName,
         int permissionCategory,
         in IGetPriorityResponseCallback callback);
 
     /**
      * @param packageName Calling package's name
-     * @param request Delete request using the mentioned filters
+     * @param request Update request with the required priority changes
      * @param callback Callback to receive result of performing this operation
      */
     void updatePriority(
-        String packageName,
         in UpdatePriorityRequestParcel request,
         in IEmptyResponseCallback callback);
 
@@ -397,6 +399,13 @@
     void runImport(in UserHandle userHandle, in Uri file, in IEmptyResponseCallback callback);
 
     /**
+    * Triggers an immediate export of health connect data.
+    *
+    * @hide
+    */
+    void runImmediateExport(in Uri file, in IEmptyResponseCallback callback);
+
+    /**
      * Creates a {@code MedicalDataSource} in HealthConnect based on the {@code request} values.
      *
      * @param attributionSource attribution source for the data.
@@ -460,6 +469,19 @@
         in IMedicalResourcesResponseCallback callback);
 
     /**
+     * Upserts {@link MedicalResource}s in HealthConnect based on a {@link
+     * UpsertMedicalResourceRequestsParcel}.
+     *
+     * @param attributionSource attribution source for the data.
+     * @param requestsParcel Contains the list of upsert requests.
+     * @param callback Callback to receive result of performing this operation.
+     */
+    void upsertMedicalResourcesFromRequestsParcel(
+        in AttributionSource attributionSource,
+        in UpsertMedicalResourceRequestsParcel requestsParcel,
+        in IMedicalResourceListParcelResponseCallback callback);
+
+    /**
      * Reads from the HealthConnect database.
      *
      * @param attributionSource attribution source for the data.
@@ -514,4 +536,13 @@
      * @param callback Callback to receive result of performing this operation.
      */
     void queryAllMedicalResourceTypeInfos(in IMedicalResourceTypeInfosCallback callback);
+
+    /** @hide */
+    void getChangesForBackup(in @nullable String changeToken, in IGetChangesForBackupResponseCallback callback);
+
+    /** @hide */
+    void getSettingsForBackup(in IGetSettingsForBackupResponseCallback callback);
+
+    /** @hide */
+    void pushSettingsForRestore(in BackupSettings backupSettings, in IEmptyResponseCallback callback);
 }
diff --git a/framework/java/android/health/connect/aidl/IMedicalResourceListParcelResponseCallback.aidl b/framework/java/android/health/connect/aidl/IMedicalResourceListParcelResponseCallback.aidl
new file mode 100644
index 0000000..ac06cdb
--- /dev/null
+++ b/framework/java/android/health/connect/aidl/IMedicalResourceListParcelResponseCallback.aidl
@@ -0,0 +1,17 @@
+package android.health.connect.aidl;
+
+import android.health.connect.aidl.HealthConnectExceptionParcel;
+import android.health.connect.aidl.MedicalResourceListParcel;
+import android.health.connect.datatypes.MedicalResource;
+
+/**
+ * Callback for {@link IHealthConnectService#upsertMedicalResourcesFromRequestsParcel}
+ *
+ * @hide
+ */
+interface IMedicalResourceListParcelResponseCallback {
+    // Called on a successful operation
+    oneway void onResult(in MedicalResourceListParcel result);
+    // Called when an error is hit
+    oneway void onError(in HealthConnectExceptionParcel exception);
+}
diff --git a/framework/java/android/health/connect/aidl/MedicalResourceListParcel.aidl b/framework/java/android/health/connect/aidl/MedicalResourceListParcel.aidl
new file mode 100644
index 0000000..dcd9235
--- /dev/null
+++ b/framework/java/android/health/connect/aidl/MedicalResourceListParcel.aidl
@@ -0,0 +1,4 @@
+package android.health.connect.aidl;
+
+/** @hide */
+parcelable  MedicalResourceListParcel;
\ No newline at end of file
diff --git a/framework/java/android/health/connect/aidl/MedicalResourceListParcel.java b/framework/java/android/health/connect/aidl/MedicalResourceListParcel.java
new file mode 100644
index 0000000..f212cf4
--- /dev/null
+++ b/framework/java/android/health/connect/aidl/MedicalResourceListParcel.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.health.connect.aidl;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.FlaggedApi;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalResource;
+import android.health.connect.internal.ParcelUtils;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A wrapper to carry a list of entries of type {@link MedicalResource} from and to {@link
+ * HealthConnectManager} and write the parcel to shared memory.
+ *
+ * @hide
+ */
+@FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
+public class MedicalResourceListParcel implements Parcelable {
+    private final List<MedicalResource> mMedicalResources;
+
+    public MedicalResourceListParcel(List<MedicalResource> medicalResources) {
+        requireNonNull(medicalResources);
+        mMedicalResources = medicalResources;
+    }
+
+    private MedicalResourceListParcel(Parcel in) {
+        requireNonNull(in);
+        in = ParcelUtils.getParcelForSharedMemoryIfRequired(in);
+        mMedicalResources = new ArrayList<>();
+        in.readParcelableList(
+                mMedicalResources, MedicalResource.class.getClassLoader(), MedicalResource.class);
+    }
+
+    public static final Creator<MedicalResourceListParcel> CREATOR =
+            new Creator<MedicalResourceListParcel>() {
+                @Override
+                public MedicalResourceListParcel createFromParcel(Parcel in) {
+                    return new MedicalResourceListParcel(in);
+                }
+
+                @Override
+                public MedicalResourceListParcel[] newArray(int size) {
+                    return new MedicalResourceListParcel[size];
+                }
+            };
+
+    /** Returns the list of {@link MedicalResource}s. */
+    public List<MedicalResource> getMedicalResources() {
+        return mMedicalResources;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        requireNonNull(dest);
+        ParcelUtils.putToRequiredMemory(dest, flags, this::writeToParcelInternal);
+    }
+
+    private void writeToParcelInternal(Parcel dest) {
+        dest.writeParcelableList(mMedicalResources, 0);
+    }
+}
diff --git a/framework/java/android/health/connect/aidl/ReadMedicalResourcesRequestParcel.java b/framework/java/android/health/connect/aidl/ReadMedicalResourcesRequestParcel.java
index 5dd9132..f72ffd6 100644
--- a/framework/java/android/health/connect/aidl/ReadMedicalResourcesRequestParcel.java
+++ b/framework/java/android/health/connect/aidl/ReadMedicalResourcesRequestParcel.java
@@ -46,30 +46,40 @@
  * @hide
  */
 public class ReadMedicalResourcesRequestParcel implements Parcelable {
+    private final boolean mIsPageRequest;
     @MedicalResource.MedicalResourceType private int mMedicalResourceType;
     @NonNull private Set<String> mDataSourceIds = Set.of();
     @Nullable private String mPageToken = null;
     private final int mPageSize;
 
     public ReadMedicalResourcesRequestParcel(ReadMedicalResourcesInitialRequest request) {
+        mIsPageRequest = false;
         mMedicalResourceType = request.getMedicalResourceType();
         mDataSourceIds = request.getDataSourceIds();
         mPageSize = request.getPageSize();
     }
 
     public ReadMedicalResourcesRequestParcel(ReadMedicalResourcesPageRequest request) {
+        mIsPageRequest = true;
         mPageToken = request.getPageToken();
         mPageSize = request.getPageSize();
     }
 
     private ReadMedicalResourcesRequestParcel(Parcel in) {
+        mIsPageRequest = in.readBoolean();
         mMedicalResourceType = in.readInt();
-        validateMedicalResourceType(mMedicalResourceType);
         mDataSourceIds = new HashSet<>(requireNonNull(in.createStringArrayList()));
         validateMedicalDataSourceIds(mDataSourceIds);
         mPageToken = in.readString();
         mPageSize = in.readInt();
         requireInRange(mPageSize, MINIMUM_PAGE_SIZE, MAXIMUM_PAGE_SIZE, "pageSize");
+
+        if (mIsPageRequest && mPageToken == null) {
+            throw new IllegalArgumentException(
+                    "pageToken cannot be null when reading Parcel from page request.");
+        } else if (!mIsPageRequest) {
+            validateMedicalResourceType(mMedicalResourceType);
+        }
     }
 
     public static final Creator<ReadMedicalResourcesRequestParcel> CREATOR =
@@ -112,6 +122,7 @@
 
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeBoolean(mIsPageRequest);
         dest.writeInt(mMedicalResourceType);
         dest.writeStringList(new ArrayList<>(mDataSourceIds));
         dest.writeString(mPageToken);
diff --git a/framework/java/android/health/connect/aidl/ReadRecordsRequestParcel.java b/framework/java/android/health/connect/aidl/ReadRecordsRequestParcel.java
index a3a881d..ba5da6f 100644
--- a/framework/java/android/health/connect/aidl/ReadRecordsRequestParcel.java
+++ b/framework/java/android/health/connect/aidl/ReadRecordsRequestParcel.java
@@ -25,7 +25,7 @@
 import android.health.connect.TimeRangeFilterHelper;
 import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.RecordTypeIdentifier;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -81,7 +81,7 @@
         mRecordIdFiltersParcel = new RecordIdFiltersParcel(request.getRecordIdFilters());
         mStartTime = DEFAULT_LONG;
         mEndTime = DEFAULT_LONG;
-        mRecordType = RecordMapper.getInstance().getRecordType(request.getRecordType());
+        mRecordType = HealthConnectMappings.getInstance().getRecordType(request.getRecordType());
         mPageSize = DEFAULT_INT;
         mLocalTimeFilter = false;
 
@@ -108,7 +108,7 @@
         }
 
         mLocalTimeFilter = TimeRangeFilterHelper.isLocalTimeFilter(request.getTimeRangeFilter());
-        mRecordType = RecordMapper.getInstance().getRecordType(request.getRecordType());
+        mRecordType = HealthConnectMappings.getInstance().getRecordType(request.getRecordType());
         mPageSize = request.getPageSize();
         mPageToken = request.getPageToken();
         mAscending = request.isAscending();
diff --git a/framework/java/android/health/connect/aidl/RecordIdFiltersParcel.java b/framework/java/android/health/connect/aidl/RecordIdFiltersParcel.java
index 8c2ea97..d62d035 100644
--- a/framework/java/android/health/connect/aidl/RecordIdFiltersParcel.java
+++ b/framework/java/android/health/connect/aidl/RecordIdFiltersParcel.java
@@ -18,7 +18,7 @@
 
 import android.annotation.NonNull;
 import android.health.connect.RecordIdFilter;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -58,14 +58,14 @@
             if (id != null) {
                 mRecordIdFilters.add(
                         RecordIdFilter.fromId(
-                                RecordMapper.getInstance()
+                                HealthConnectMappings.getInstance()
                                         .getRecordIdToExternalRecordClassMap()
                                         .get(in.readInt()),
                                 id));
             } else {
                 mRecordIdFilters.add(
                         RecordIdFilter.fromClientRecordId(
-                                RecordMapper.getInstance()
+                                HealthConnectMappings.getInstance()
                                         .getRecordIdToExternalRecordClassMap()
                                         .get(in.readInt()),
                                 clientRecordId));
@@ -90,7 +90,8 @@
                     dest.writeString(recordId.getId());
                     dest.writeString(recordId.getClientRecordId());
                     dest.writeInt(
-                            RecordMapper.getInstance().getRecordType(recordId.getRecordType()));
+                            HealthConnectMappings.getInstance()
+                                    .getRecordType(recordId.getRecordType()));
                 }));
     }
 }
diff --git a/framework/java/android/health/connect/aidl/RecordTypeInfoResponseParcel.java b/framework/java/android/health/connect/aidl/RecordTypeInfoResponseParcel.java
index ff1661f..779044d 100644
--- a/framework/java/android/health/connect/aidl/RecordTypeInfoResponseParcel.java
+++ b/framework/java/android/health/connect/aidl/RecordTypeInfoResponseParcel.java
@@ -21,9 +21,7 @@
 import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.Record;
 import android.health.connect.datatypes.RecordTypeIdentifier;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
-import android.health.connect.internal.datatypes.utils.RecordTypePermissionCategoryMapper;
-import android.health.connect.internal.datatypes.utils.RecordTypeRecordCategoryMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -102,17 +100,18 @@
     public Map<Class<? extends Record>, RecordTypeInfoResponse> getRecordTypeInfoResponses() {
         Map<Class<? extends Record>, RecordTypeInfoResponse> responses =
                 new HashMap<>(mRecordTypeInfoResponses.size());
+        HealthConnectMappings healthConnectMappings = HealthConnectMappings.getInstance();
         mRecordTypeInfoResponses.forEach(
                 (recordType, contributingPackages) -> {
                     RecordTypeInfoResponse res =
                             new RecordTypeInfoResponse(
-                                    RecordTypePermissionCategoryMapper
-                                            .getHealthPermissionCategoryForRecordType(recordType),
-                                    RecordTypeRecordCategoryMapper.getRecordCategoryForRecordType(
+                                    healthConnectMappings.getHealthPermissionCategoryForRecordType(
+                                            recordType),
+                                    healthConnectMappings.getRecordCategoryForRecordType(
                                             recordType),
                                     getContributingPackagesAsDataOrigin(contributingPackages));
                     Class<? extends Record> recordTypeClass =
-                            RecordMapper.getInstance()
+                            healthConnectMappings
                                     .getRecordIdToExternalRecordClassMap()
                                     .get(recordType);
                     responses.put(recordTypeClass, res);
diff --git a/framework/java/android/health/connect/aidl/UpsertMedicalResourceRequestsParcel.aidl b/framework/java/android/health/connect/aidl/UpsertMedicalResourceRequestsParcel.aidl
new file mode 100644
index 0000000..c153796
--- /dev/null
+++ b/framework/java/android/health/connect/aidl/UpsertMedicalResourceRequestsParcel.aidl
@@ -0,0 +1,4 @@
+package android.health.connect.aidl;
+
+/** @hide */
+parcelable UpsertMedicalResourceRequestsParcel;
\ No newline at end of file
diff --git a/framework/java/android/health/connect/aidl/UpsertMedicalResourceRequestsParcel.java b/framework/java/android/health/connect/aidl/UpsertMedicalResourceRequestsParcel.java
new file mode 100644
index 0000000..11c28c0
--- /dev/null
+++ b/framework/java/android/health/connect/aidl/UpsertMedicalResourceRequestsParcel.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.health.connect.aidl;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.UpsertMedicalResourceRequest;
+import android.health.connect.internal.ParcelUtils;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A wrapper to carry a list of entries of type {@link UpsertMedicalResourceRequest} from and to
+ * {@link HealthConnectManager} and write the parcel to shared memory.
+ *
+ * @hide
+ */
+@FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
+public class UpsertMedicalResourceRequestsParcel implements Parcelable {
+    private final List<UpsertMedicalResourceRequest> mUpsertRequests;
+
+    public UpsertMedicalResourceRequestsParcel(List<UpsertMedicalResourceRequest> upsertRequests) {
+        requireNonNull(upsertRequests);
+        mUpsertRequests = upsertRequests;
+    }
+
+    private UpsertMedicalResourceRequestsParcel(Parcel in) {
+        requireNonNull(in);
+        in = ParcelUtils.getParcelForSharedMemoryIfRequired(in);
+
+        mUpsertRequests = new ArrayList<>();
+        in.readParcelableList(
+                mUpsertRequests,
+                UpsertMedicalResourceRequest.class.getClassLoader(),
+                UpsertMedicalResourceRequest.class);
+    }
+
+    public static final Creator<UpsertMedicalResourceRequestsParcel> CREATOR =
+            new Creator<>() {
+                @Override
+                public UpsertMedicalResourceRequestsParcel createFromParcel(Parcel in) {
+                    return new UpsertMedicalResourceRequestsParcel(in);
+                }
+
+                @Override
+                public UpsertMedicalResourceRequestsParcel[] newArray(int size) {
+                    return new UpsertMedicalResourceRequestsParcel[size];
+                }
+            };
+
+    /** Returns a list of {@link UpsertMedicalResourceRequest}s. */
+    public List<UpsertMedicalResourceRequest> getUpsertRequests() {
+        return mUpsertRequests;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        requireNonNull(dest);
+        ParcelUtils.putToRequiredMemory(dest, flags, this::writeToParcelInternal);
+    }
+
+    private void writeToParcelInternal(@NonNull Parcel dest) {
+        dest.writeParcelableList(mUpsertRequests, 0);
+    }
+}
diff --git a/framework/java/android/health/connect/backuprestore/BackupChange.aidl b/framework/java/android/health/connect/backuprestore/BackupChange.aidl
new file mode 100644
index 0000000..0f109df
--- /dev/null
+++ b/framework/java/android/health/connect/backuprestore/BackupChange.aidl
@@ -0,0 +1,4 @@
+package android.health.connect.backuprestore;
+
+/** @hide */
+parcelable BackupChange;
diff --git a/framework/java/android/health/connect/backuprestore/BackupChange.java b/framework/java/android/health/connect/backuprestore/BackupChange.java
new file mode 100644
index 0000000..b7849e6
--- /dev/null
+++ b/framework/java/android/health/connect/backuprestore/BackupChange.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.health.connect.backuprestore;
+
+import static com.android.healthfitness.flags.Flags.FLAG_CLOUD_BACKUP_AND_RESTORE;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/** @hide */
+@FlaggedApi(FLAG_CLOUD_BACKUP_AND_RESTORE)
+public final class BackupChange implements Parcelable {
+
+    // A uid that identifies the specific data point this change refers to.
+    // Note: The module should ensure that this uid doesn't allow us to infer any user data.
+    @NonNull private final String mUid;
+
+    // Version how the data was encoded.
+    private final int mVersion;
+
+    private final boolean mIsDeletion;
+
+    // Only present if isDeletion is false.
+    // The data is returned as bytes rather than records to keep the data opaque from GMSCore.
+    // As long as GMSCore doesn't parse the data, it doesn't know what type of data this is.
+    @Nullable private final byte[] mData;
+
+    public BackupChange(
+            @NonNull String uid, int version, boolean isDeletion, @Nullable byte[] data) {
+        mUid = uid;
+        mVersion = version;
+        mIsDeletion = isDeletion;
+        mData = data;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof BackupChange that)) return false;
+        return mVersion == that.mVersion
+                && mIsDeletion == that.mIsDeletion
+                && mUid.equals(that.mUid)
+                && Arrays.equals(mData, that.mData);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = Objects.hash(mUid, mVersion, mIsDeletion);
+        result = 31 * result + Arrays.hashCode(mData);
+        return result;
+    }
+
+    private BackupChange(Parcel in) {
+        mUid = in.readString();
+        mVersion = in.readInt();
+        mIsDeletion = in.readByte() != 0;
+        mData = in.readBlob();
+    }
+
+    @NonNull
+    public static final Creator<BackupChange> CREATOR =
+            new Creator<BackupChange>() {
+                @Override
+                public BackupChange createFromParcel(Parcel in) {
+                    return new BackupChange(in);
+                }
+
+                @Override
+                public BackupChange[] newArray(int size) {
+                    return new BackupChange[size];
+                }
+            };
+
+    @NonNull
+    public String getUid() {
+        return mUid;
+    }
+
+    public int getVersion() {
+        return mVersion;
+    }
+
+    public boolean isDeletion() {
+        return mIsDeletion;
+    }
+
+    @Nullable
+    public byte[] getData() {
+        return mData;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeString(mUid);
+        dest.writeInt(mVersion);
+        dest.writeByte((byte) (mIsDeletion ? 1 : 0));
+        dest.writeBlob(mData);
+    }
+}
diff --git a/framework/java/android/health/connect/backuprestore/BackupSettings.aidl b/framework/java/android/health/connect/backuprestore/BackupSettings.aidl
new file mode 100644
index 0000000..a46bba9
--- /dev/null
+++ b/framework/java/android/health/connect/backuprestore/BackupSettings.aidl
@@ -0,0 +1,4 @@
+package android.health.connect.backuprestore;
+
+/** @hide */
+parcelable BackupSettings;
diff --git a/framework/java/android/health/connect/backuprestore/BackupSettings.java b/framework/java/android/health/connect/backuprestore/BackupSettings.java
new file mode 100644
index 0000000..f105159
--- /dev/null
+++ b/framework/java/android/health/connect/backuprestore/BackupSettings.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.health.connect.backuprestore;
+
+import static com.android.healthfitness.flags.Flags.FLAG_CLOUD_BACKUP_AND_RESTORE;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/** @hide */
+@FlaggedApi(FLAG_CLOUD_BACKUP_AND_RESTORE)
+public final class BackupSettings implements Parcelable {
+
+    // Version how the data was encoded.
+    private final int mVersion;
+
+    @NonNull private final byte[] mData;
+
+    public BackupSettings(int version, @NonNull byte[] data) {
+        mVersion = version;
+        mData = data;
+    }
+
+    private BackupSettings(Parcel in) {
+        mVersion = in.readInt();
+        mData = in.readBlob();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof BackupSettings that)) return false;
+        return mVersion == that.mVersion && Arrays.equals(mData, that.mData);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = Objects.hash(mVersion);
+        result = 31 * result + Arrays.hashCode(mData);
+        return result;
+    }
+
+    @NonNull
+    public static final Creator<BackupSettings> CREATOR =
+            new Creator<BackupSettings>() {
+                @Override
+                public BackupSettings createFromParcel(Parcel in) {
+                    return new BackupSettings(in);
+                }
+
+                @Override
+                public BackupSettings[] newArray(int size) {
+                    return new BackupSettings[size];
+                }
+            };
+
+    @NonNull
+    public int getVersion() {
+        return mVersion;
+    }
+
+    @NonNull
+    public byte[] getData() {
+        return mData;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeInt(mVersion);
+        dest.writeBlob(mData);
+    }
+}
diff --git a/framework/java/android/health/connect/backuprestore/GetChangesForBackupResponse.aidl b/framework/java/android/health/connect/backuprestore/GetChangesForBackupResponse.aidl
new file mode 100644
index 0000000..5c6cb81
--- /dev/null
+++ b/framework/java/android/health/connect/backuprestore/GetChangesForBackupResponse.aidl
@@ -0,0 +1,4 @@
+package android.health.connect.backuprestore;
+
+/** @hide */
+parcelable GetChangesForBackupResponse;
diff --git a/framework/java/android/health/connect/backuprestore/GetChangesForBackupResponse.java b/framework/java/android/health/connect/backuprestore/GetChangesForBackupResponse.java
new file mode 100644
index 0000000..df56f56
--- /dev/null
+++ b/framework/java/android/health/connect/backuprestore/GetChangesForBackupResponse.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.health.connect.backuprestore;
+
+import static com.android.healthfitness.flags.Flags.FLAG_CLOUD_BACKUP_AND_RESTORE;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.List;
+import java.util.Objects;
+
+/** @hide */
+@FlaggedApi(FLAG_CLOUD_BACKUP_AND_RESTORE)
+public final class GetChangesForBackupResponse implements Parcelable {
+
+    @NonNull private final List<BackupChange> mChanges;
+
+    // The changeToken to be used for the next call to resume the backup.
+    @NonNull private final String mNextChangeToken;
+
+    public GetChangesForBackupResponse(
+            @NonNull List<BackupChange> changes, @NonNull String nextChangeToken) {
+        mChanges = changes;
+        mNextChangeToken = nextChangeToken;
+    }
+
+    private GetChangesForBackupResponse(Parcel in) {
+        mChanges = in.createTypedArrayList(BackupChange.CREATOR);
+        mNextChangeToken = in.readString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof GetChangesForBackupResponse that)) return false;
+        return mChanges.equals(that.mChanges) && mNextChangeToken.equals(that.mNextChangeToken);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mChanges, mNextChangeToken);
+    }
+
+    @NonNull
+    public static final Creator<GetChangesForBackupResponse> CREATOR =
+            new Creator<GetChangesForBackupResponse>() {
+                @Override
+                public GetChangesForBackupResponse createFromParcel(Parcel in) {
+                    return new GetChangesForBackupResponse(in);
+                }
+
+                @Override
+                public GetChangesForBackupResponse[] newArray(int size) {
+                    return new GetChangesForBackupResponse[size];
+                }
+            };
+
+    @NonNull
+    public List<BackupChange> getChanges() {
+        return mChanges;
+    }
+
+    @NonNull
+    public String getNextChangeToken() {
+        return mNextChangeToken;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeTypedList(mChanges);
+        dest.writeString(mNextChangeToken);
+    }
+}
diff --git a/framework/java/android/health/connect/backuprestore/GetSettingsForBackupResponse.aidl b/framework/java/android/health/connect/backuprestore/GetSettingsForBackupResponse.aidl
new file mode 100644
index 0000000..67147da
--- /dev/null
+++ b/framework/java/android/health/connect/backuprestore/GetSettingsForBackupResponse.aidl
@@ -0,0 +1,4 @@
+package android.health.connect.backuprestore;
+
+/** @hide */
+parcelable GetSettingsForBackupResponse;
diff --git a/framework/java/android/health/connect/backuprestore/GetSettingsForBackupResponse.java b/framework/java/android/health/connect/backuprestore/GetSettingsForBackupResponse.java
new file mode 100644
index 0000000..90d8935
--- /dev/null
+++ b/framework/java/android/health/connect/backuprestore/GetSettingsForBackupResponse.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.health.connect.backuprestore;
+
+import static com.android.healthfitness.flags.Flags.FLAG_CLOUD_BACKUP_AND_RESTORE;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/** @hide */
+@FlaggedApi(FLAG_CLOUD_BACKUP_AND_RESTORE)
+public final class GetSettingsForBackupResponse implements Parcelable {
+
+    @NonNull private final BackupSettings mSettings;
+
+    public GetSettingsForBackupResponse(@NonNull BackupSettings settings) {
+        mSettings = settings;
+    }
+
+    private GetSettingsForBackupResponse(Parcel in) {
+        mSettings = in.readParcelable(BackupSettings.class.getClassLoader());
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof GetSettingsForBackupResponse that)) return false;
+        return mSettings.equals(that.mSettings);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mSettings);
+    }
+
+    @NonNull
+    public static final Creator<GetSettingsForBackupResponse> CREATOR =
+            new Creator<GetSettingsForBackupResponse>() {
+                @Override
+                public GetSettingsForBackupResponse createFromParcel(Parcel in) {
+                    return new GetSettingsForBackupResponse(in);
+                }
+
+                @Override
+                public GetSettingsForBackupResponse[] newArray(int size) {
+                    return new GetSettingsForBackupResponse[size];
+                }
+            };
+
+    @NonNull
+    public BackupSettings getSettings() {
+        return mSettings;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeParcelable(mSettings, flags);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+}
diff --git a/framework/java/android/health/connect/changelog/ChangeLogTokenRequest.java b/framework/java/android/health/connect/changelog/ChangeLogTokenRequest.java
index 1604c21..d8de1fe 100644
--- a/framework/java/android/health/connect/changelog/ChangeLogTokenRequest.java
+++ b/framework/java/android/health/connect/changelog/ChangeLogTokenRequest.java
@@ -21,7 +21,7 @@
 import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.Record;
 import android.health.connect.datatypes.RecordTypeIdentifier;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.util.ArraySet;
@@ -63,7 +63,10 @@
         }
         Set<String> invalidRecordTypes =
                 recordTypes.stream()
-                        .filter(recordType -> !RecordMapper.getInstance().hasRecordType(recordType))
+                        .filter(
+                                recordType ->
+                                        !HealthConnectMappings.getInstance()
+                                                .hasRecordType(recordType))
                         .map(Class::getName)
                         .collect(Collectors.toSet());
         if (!invalidRecordTypes.isEmpty()) {
@@ -73,10 +76,11 @@
     }
 
     private ChangeLogTokenRequest(@NonNull Parcel in) {
-        RecordMapper recordMapper = RecordMapper.getInstance();
+        HealthConnectMappings healthConnectMappings = HealthConnectMappings.getInstance();
         Set<Class<? extends Record>> recordTypes = new ArraySet<>();
         for (@RecordTypeIdentifier.RecordType int recordType : in.createIntArray()) {
-            recordTypes.add(recordMapper.getRecordIdToExternalRecordClassMap().get(recordType));
+            recordTypes.add(
+                    healthConnectMappings.getRecordIdToExternalRecordClassMap().get(recordType));
         }
         mRecordTypes = recordTypes;
         Set<DataOrigin> dataOrigin = new ArraySet<>();
@@ -158,7 +162,7 @@
         int[] recordTypes = new int[mRecordTypes.size()];
         int index = 0;
         for (Class<? extends Record> recordClass : mRecordTypes) {
-            recordTypes[index++] = RecordMapper.getInstance().getRecordType(recordClass);
+            recordTypes[index++] = HealthConnectMappings.getInstance().getRecordType(recordClass);
         }
         return recordTypes;
     }
diff --git a/framework/java/android/health/connect/datatypes/ActivityIntensityRecord.java b/framework/java/android/health/connect/datatypes/ActivityIntensityRecord.java
new file mode 100644
index 0000000..21b6250
--- /dev/null
+++ b/framework/java/android/health/connect/datatypes/ActivityIntensityRecord.java
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.health.connect.datatypes;
+
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY;
+import static android.health.connect.datatypes.validation.ValidationUtils.validateIntDefValue;
+
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier;
+import android.health.connect.internal.datatypes.ActivityIntensityRecordInternal;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Represents intensity of an activity.
+ *
+ * <p>Intensity can be either moderate or vigorous.
+ *
+ * <p>Each record requires the start time, the end time and the activity intensity type.
+ */
+@FlaggedApi(FLAG_ACTIVITY_INTENSITY)
+@Identifier(recordIdentifier = RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY)
+public final class ActivityIntensityRecord extends IntervalRecord {
+
+    /** Moderate activity intensity. */
+    public static final int ACTIVITY_INTENSITY_TYPE_MODERATE = 0;
+
+    /** Vigorous activity intensity. */
+    public static final int ACTIVITY_INTENSITY_TYPE_VIGOROUS = 1;
+
+    /**
+     * Metric identifier to retrieve the total duration of moderate activity intensity using
+     * aggregate APIs in {@link android.health.connect.HealthConnectManager}.
+     */
+    @NonNull
+    public static final AggregationType<Duration> MODERATE_DURATION_TOTAL =
+            new AggregationType<>(
+                    AggregationTypeIdentifier.ACTIVITY_INTENSITY_MODERATE_DURATION_TOTAL,
+                    AggregationType.SUM,
+                    RECORD_TYPE_ACTIVITY_INTENSITY,
+                    Duration.class);
+
+    /**
+     * Metric identifier to retrieve the total duration of vigorous activity intensity using
+     * aggregate APIs in {@link android.health.connect.HealthConnectManager}.
+     */
+    @NonNull
+    public static final AggregationType<Duration> VIGOROUS_DURATION_TOTAL =
+            new AggregationType<>(
+                    AggregationTypeIdentifier.ACTIVITY_INTENSITY_VIGOROUS_DURATION_TOTAL,
+                    AggregationType.SUM,
+                    RECORD_TYPE_ACTIVITY_INTENSITY,
+                    Duration.class);
+
+    /**
+     * Metric identifier to retrieve the total duration of activity intensity regardless of the type
+     * using aggregate APIs in {@link android.health.connect.HealthConnectManager}.
+     *
+     * <p>Equivalent to {@link #MODERATE_DURATION_TOTAL} + {@link #VIGOROUS_DURATION_TOTAL}.
+     */
+    @NonNull
+    public static final AggregationType<Duration> DURATION_TOTAL =
+            new AggregationType<>(
+                    AggregationTypeIdentifier.ACTIVITY_INTENSITY_DURATION_TOTAL,
+                    AggregationType.SUM,
+                    RECORD_TYPE_ACTIVITY_INTENSITY,
+                    Duration.class);
+
+    /**
+     * Metric identifier to retrieve the number of weighted intensity minutes using aggregate APIs
+     * in {@link android.health.connect.HealthConnectManager}.
+     *
+     * <p>Records of type {@link #ACTIVITY_INTENSITY_TYPE_MODERATE} contribute their full duration
+     * to the result, while records of type {@link #ACTIVITY_INTENSITY_TYPE_VIGOROUS} contribute
+     * double their duration.
+     *
+     * <p>Equivalent to {@link #MODERATE_DURATION_TOTAL} + 2 * {@link #VIGOROUS_DURATION_TOTAL}
+     * rounded to minutes.
+     *
+     * <p>Calculated in minutes.
+     */
+    @NonNull
+    public static final AggregationType<Long> INTENSITY_MINUTES_TOTAL =
+            new AggregationType<>(
+                    AggregationTypeIdentifier.ACTIVITY_INTENSITY_MINUTES_TOTAL,
+                    AggregationType.SUM,
+                    RECORD_TYPE_ACTIVITY_INTENSITY,
+                    Long.class);
+
+    /**
+     * Valid set of values for {@link ActivityIntensityType}. Update this set when add a new type or
+     * deprecate an existing type.
+     */
+    private static final Set<Integer> VALID_ACTIVITY_INTENSITY_TYPES =
+            Set.of(ACTIVITY_INTENSITY_TYPE_MODERATE, ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+
+    private final int mActivityIntensityType;
+
+    /**
+     * Builds {@link ActivityIntensityRecord} instance
+     *
+     * @param metadata Metadata to be associated with the record. See {@link Metadata}.
+     * @param startTime Start time of this activity
+     * @param startZoneOffset Zone offset of the user when the session started
+     * @param endTime End time of this activity
+     * @param endZoneOffset Zone offset of the user when the session finished
+     * @param activityIntensityType type of the session.
+     * @param skipValidation Boolean flag to skip validation of record values.
+     */
+    private ActivityIntensityRecord(
+            @NonNull Metadata metadata,
+            @NonNull Instant startTime,
+            @NonNull ZoneOffset startZoneOffset,
+            @NonNull Instant endTime,
+            @NonNull ZoneOffset endZoneOffset,
+            @ActivityIntensityType int activityIntensityType,
+            boolean skipValidation) {
+        super(
+                metadata,
+                startTime,
+                startZoneOffset,
+                endTime,
+                endZoneOffset,
+                skipValidation,
+                /* enforceFutureTimeRestrictions= */ true);
+        if (!skipValidation) {
+            validateIntDefValue(
+                    activityIntensityType,
+                    VALID_ACTIVITY_INTENSITY_TYPES,
+                    ActivityIntensityType.class.getSimpleName());
+        }
+        mActivityIntensityType = activityIntensityType;
+    }
+
+    /** Returns the type of the activity intensity. */
+    @ActivityIntensityType
+    public int getActivityIntensityType() {
+        return mActivityIntensityType;
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ActivityIntensityRecord)) return false;
+        if (!super.equals(o)) return false;
+        ActivityIntensityRecord that = (ActivityIntensityRecord) o;
+        return getActivityIntensityType() == that.getActivityIntensityType();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), getActivityIntensityType());
+    }
+
+    /** @hide */
+    @IntDef({ACTIVITY_INTENSITY_TYPE_MODERATE, ACTIVITY_INTENSITY_TYPE_VIGOROUS})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ActivityIntensityType {}
+
+    /** Builder class for {@link ActivityIntensityRecord} */
+    public static final class Builder {
+        private final Metadata mMetadata;
+        private final Instant mStartTime;
+        private final Instant mEndTime;
+        private ZoneOffset mStartZoneOffset;
+        private ZoneOffset mEndZoneOffset;
+        private final int mActivityIntensityType;
+
+        /**
+         * @param metadata Metadata to be associated with the record. See {@link Metadata}.
+         * @param startTime Start time of this activity instensity record.
+         * @param endTime End time of this activity intensity record.
+         */
+        public Builder(
+                @NonNull Metadata metadata,
+                @NonNull Instant startTime,
+                @NonNull Instant endTime,
+                @ActivityIntensityType int activityIntensityType) {
+            Objects.requireNonNull(metadata);
+            Objects.requireNonNull(startTime);
+            Objects.requireNonNull(endTime);
+            mMetadata = metadata;
+            mStartTime = startTime;
+            mEndTime = endTime;
+            mActivityIntensityType = activityIntensityType;
+            mStartZoneOffset = ZoneOffset.systemDefault().getRules().getOffset(startTime);
+            mEndZoneOffset = ZoneOffset.systemDefault().getRules().getOffset(endTime);
+        }
+
+        /**
+         * Sets the {@link ZoneOffset} of the user when the activity started.
+         *
+         * <p>Defaults to the system zone offset if not set.
+         */
+        @NonNull
+        public Builder setStartZoneOffset(@NonNull ZoneOffset startZoneOffset) {
+            Objects.requireNonNull(startZoneOffset);
+
+            mStartZoneOffset = startZoneOffset;
+            return this;
+        }
+
+        /**
+         * Sets the {@link ZoneOffset} of the user when the activity ended.
+         *
+         * <p>Defaults to the system zone offset if not set.
+         */
+        @NonNull
+        public Builder setEndZoneOffset(@NonNull ZoneOffset endZoneOffset) {
+            Objects.requireNonNull(endZoneOffset);
+            mEndZoneOffset = endZoneOffset;
+            return this;
+        }
+
+        /**
+         * @return Object of {@link ActivityIntensityRecord} without validating the values.
+         * @hide
+         */
+        @NonNull
+        public ActivityIntensityRecord buildWithoutValidation() {
+            return new ActivityIntensityRecord(
+                    mMetadata,
+                    mStartTime,
+                    mStartZoneOffset,
+                    mEndTime,
+                    mEndZoneOffset,
+                    mActivityIntensityType,
+                    true);
+        }
+
+        /** Returns {@link ActivityIntensityRecord} */
+        @NonNull
+        public ActivityIntensityRecord build() {
+            return new ActivityIntensityRecord(
+                    mMetadata,
+                    mStartTime,
+                    mStartZoneOffset,
+                    mEndTime,
+                    mEndZoneOffset,
+                    mActivityIntensityType,
+                    false);
+        }
+    }
+
+    /** @hide */
+    @Override
+    public ActivityIntensityRecordInternal toRecordInternal() {
+        ActivityIntensityRecordInternal recordInternal =
+                (ActivityIntensityRecordInternal)
+                        new ActivityIntensityRecordInternal()
+                                .setUuid(getMetadata().getId())
+                                .setPackageName(getMetadata().getDataOrigin().getPackageName())
+                                .setLastModifiedTime(
+                                        getMetadata().getLastModifiedTime().toEpochMilli())
+                                .setClientRecordId(getMetadata().getClientRecordId())
+                                .setClientRecordVersion(getMetadata().getClientRecordVersion())
+                                .setManufacturer(getMetadata().getDevice().getManufacturer())
+                                .setModel(getMetadata().getDevice().getModel())
+                                .setDeviceType(getMetadata().getDevice().getType())
+                                .setRecordingMethod(getMetadata().getRecordingMethod());
+        recordInternal.setStartTime(getStartTime().toEpochMilli());
+        recordInternal.setEndTime(getEndTime().toEpochMilli());
+        recordInternal.setStartZoneOffset(getStartZoneOffset().getTotalSeconds());
+        recordInternal.setEndZoneOffset(getEndZoneOffset().getTotalSeconds());
+        recordInternal.setActivityIntensityType(getActivityIntensityType());
+        return recordInternal;
+    }
+}
diff --git a/framework/java/android/health/connect/datatypes/AggregationType.java b/framework/java/android/health/connect/datatypes/AggregationType.java
index 4e9cb42..82ee72f 100644
--- a/framework/java/android/health/connect/datatypes/AggregationType.java
+++ b/framework/java/android/health/connect/datatypes/AggregationType.java
@@ -194,6 +194,10 @@
         int SKIN_TEMPERATURE_RECORD_DELTA_MIN = 85;
         int SKIN_TEMPERATURE_RECORD_DELTA_MAX = 86;
         int MINDFULNESS_SESSION_DURATION_TOTAL = 87;
+        int ACTIVITY_INTENSITY_MODERATE_DURATION_TOTAL = 88;
+        int ACTIVITY_INTENSITY_VIGOROUS_DURATION_TOTAL = 89;
+        int ACTIVITY_INTENSITY_DURATION_TOTAL = 90;
+        int ACTIVITY_INTENSITY_MINUTES_TOTAL = 91;
 
         /**
          * Valid set of values for this IntDef. Update this set when add new type or deprecate
@@ -290,7 +294,11 @@
                         SKIN_TEMPERATURE_RECORD_DELTA_AVG,
                         SKIN_TEMPERATURE_RECORD_DELTA_MIN,
                         SKIN_TEMPERATURE_RECORD_DELTA_MAX,
-                        MINDFULNESS_SESSION_DURATION_TOTAL);
+                        MINDFULNESS_SESSION_DURATION_TOTAL,
+                        ACTIVITY_INTENSITY_MODERATE_DURATION_TOTAL,
+                        ACTIVITY_INTENSITY_VIGOROUS_DURATION_TOTAL,
+                        ACTIVITY_INTENSITY_DURATION_TOTAL,
+                        ACTIVITY_INTENSITY_MINUTES_TOTAL);
 
         /** @hide */
         @IntDef({
@@ -381,7 +389,11 @@
             SKIN_TEMPERATURE_RECORD_DELTA_AVG,
             SKIN_TEMPERATURE_RECORD_DELTA_MIN,
             SKIN_TEMPERATURE_RECORD_DELTA_MAX,
-            MINDFULNESS_SESSION_DURATION_TOTAL
+            MINDFULNESS_SESSION_DURATION_TOTAL,
+            ACTIVITY_INTENSITY_MODERATE_DURATION_TOTAL,
+            ACTIVITY_INTENSITY_VIGOROUS_DURATION_TOTAL,
+            ACTIVITY_INTENSITY_DURATION_TOTAL,
+            ACTIVITY_INTENSITY_MINUTES_TOTAL
         })
         @Retention(RetentionPolicy.SOURCE)
         @interface Id {}
diff --git a/framework/java/android/health/connect/datatypes/ExerciseSessionType.java b/framework/java/android/health/connect/datatypes/ExerciseSessionType.java
index fedc771..fa6dd9f 100644
--- a/framework/java/android/health/connect/datatypes/ExerciseSessionType.java
+++ b/framework/java/android/health/connect/datatypes/ExerciseSessionType.java
@@ -16,6 +16,9 @@
 
 package android.health.connect.datatypes;
 
+import static com.android.healthfitness.flags.Flags.FLAG_DEPRECATE_EXERCISE_SESSION_TYPE_BREATHING;
+
+import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 
 import java.lang.annotation.Retention;
@@ -78,7 +81,14 @@
     /** Use this type for the golf playing session. */
     public static final int EXERCISE_SESSION_TYPE_GOLF = 16;
 
-    /** Use this type for the guided breathing session. */
+    /**
+     * Use this type for the guided breathing session.
+     *
+     * @deprecated Use {@link MindfulnessSessionRecord} of the corresponding type {@link
+     *     MindfulnessSessionRecord#MINDFULNESS_SESSION_TYPE_BREATHING}.
+     */
+    @FlaggedApi(FLAG_DEPRECATE_EXERCISE_SESSION_TYPE_BREATHING)
+    @Deprecated
     public static final int EXERCISE_SESSION_TYPE_GUIDED_BREATHING = 17;
 
     /** Use this type for the gymnastics session. */
diff --git a/framework/java/android/health/connect/datatypes/FhirResource.java b/framework/java/android/health/connect/datatypes/FhirResource.java
index db36462..bdf7229 100644
--- a/framework/java/android/health/connect/datatypes/FhirResource.java
+++ b/framework/java/android/health/connect/datatypes/FhirResource.java
@@ -34,18 +34,17 @@
 import java.util.Set;
 
 /**
- * Captures the FHIR resource data. This is the class used for all supported FHIR resource types,
- * which is a subset of the resource list in <a href="https://build.fhir.org/resourcelist.html">the
- * official FHIR website</a>.
+ * A class to capture the FHIR resource data. This is the class used for all supported FHIR resource
+ * types, which is a subset of the resource list on <a
+ * href="https://build.fhir.org/resourcelist.html">the official FHIR website</a>. The list of
+ * supported types will likely expand in future releases.
  *
  * <p>FHIR stands for the <a href="https://hl7.org/fhir/">Fast Healthcare Interoperability Resources
  * </a> standard.
  */
 @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
 public final class FhirResource implements Parcelable {
-    /** Unknown FHIR resource type. */
-    public static final int FHIR_RESOURCE_TYPE_UNKNOWN = 0;
-
+    // LINT.IfChange
     /**
      * FHIR resource type for <a href="https://www.hl7.org/fhir/immunization.html">Immunization</a>.
      */
@@ -93,9 +92,44 @@
      */
     public static final int FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT = 8;
 
+    /**
+     * FHIR resource type for a <a href="https://www.hl7.org/fhir/patient.html">FHIR Patient</a>.
+     */
+    public static final int FHIR_RESOURCE_TYPE_PATIENT = 9;
+
+    /**
+     * FHIR resource type for a <a href="https://www.hl7.org/fhir/practitioner.html">FHIR
+     * Practitioner</a>.
+     */
+    public static final int FHIR_RESOURCE_TYPE_PRACTITIONER = 10;
+
+    /**
+     * FHIR resource type for a <a href="https://www.hl7.org/fhir/practitionerrole.html">FHIR
+     * PractitionerRole</a>.
+     */
+    public static final int FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE = 11;
+
+    /**
+     * FHIR resource type for a <a href="https://www.hl7.org/fhir/encounter.html">FHIR
+     * Encounter</a>.
+     */
+    public static final int FHIR_RESOURCE_TYPE_ENCOUNTER = 12;
+
+    /**
+     * FHIR resource type for a <a href="https://www.hl7.org/fhir/location.html">FHIR Location</a>.
+     */
+    public static final int FHIR_RESOURCE_TYPE_LOCATION = 13;
+
+    /**
+     * FHIR resource type for a <a href="https://www.hl7.org/fhir/organization.html">FHIR
+     * Organization</a>.
+     */
+    public static final int FHIR_RESOURCE_TYPE_ORGANIZATION = 14;
+
+    // LINT.ThenChange(/service/proto/phr/fhir_spec_extractor.py:fhir_resource_type_mapping)
+
     /** @hide */
     @IntDef({
-        FHIR_RESOURCE_TYPE_UNKNOWN,
         FHIR_RESOURCE_TYPE_IMMUNIZATION,
         FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
         FHIR_RESOURCE_TYPE_OBSERVATION,
@@ -103,7 +137,13 @@
         FHIR_RESOURCE_TYPE_PROCEDURE,
         FHIR_RESOURCE_TYPE_MEDICATION,
         FHIR_RESOURCE_TYPE_MEDICATION_REQUEST,
-        FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT
+        FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT,
+        FHIR_RESOURCE_TYPE_PATIENT,
+        FHIR_RESOURCE_TYPE_PRACTITIONER,
+        FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE,
+        FHIR_RESOURCE_TYPE_ENCOUNTER,
+        FHIR_RESOURCE_TYPE_LOCATION,
+        FHIR_RESOURCE_TYPE_ORGANIZATION,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface FhirResourceType {}
@@ -112,6 +152,10 @@
     @NonNull private final String mId;
     @NonNull private final String mData;
 
+    /**
+     * Creates a new instance of {@link FhirResource}. Please see {@link FhirResource.Builder} for
+     * more detailed parameters information.
+     */
     private FhirResource(@FhirResourceType int type, @NonNull String id, @NonNull String data) {
         validateFhirResourceType(type);
         requireNonNull(id);
@@ -151,6 +195,12 @@
     /**
      * Returns the FHIR resource type. This is extracted from the "resourceType" field in {@link
      * #getData}.
+     *
+     * <p>The list of supported types is a subset of the resource list on <a
+     * href="https://build.fhir.org/resourcelist.html">the official FHIR website</a>. For a list of
+     * supported types, see the {@link FhirResource} constants, such as {@link
+     * #FHIR_RESOURCE_TYPE_IMMUNIZATION}. Clients should be aware that this list is non exhaustive
+     * and may increase in future releases when additional types will need to be handled.
      */
     @FhirResourceType
     public int getType() {
@@ -177,7 +227,6 @@
         return 0;
     }
 
-    /** Populates a {@link Parcel} with the self information. */
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         requireNonNull(dest);
@@ -192,7 +241,6 @@
      */
     private static final Set<Integer> VALID_TYPES =
             Set.of(
-                    FHIR_RESOURCE_TYPE_UNKNOWN,
                     FHIR_RESOURCE_TYPE_IMMUNIZATION,
                     FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
                     FHIR_RESOURCE_TYPE_OBSERVATION,
@@ -200,7 +248,13 @@
                     FHIR_RESOURCE_TYPE_PROCEDURE,
                     FHIR_RESOURCE_TYPE_MEDICATION,
                     FHIR_RESOURCE_TYPE_MEDICATION_REQUEST,
-                    FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT);
+                    FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT,
+                    FHIR_RESOURCE_TYPE_PATIENT,
+                    FHIR_RESOURCE_TYPE_PRACTITIONER,
+                    FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE,
+                    FHIR_RESOURCE_TYPE_ENCOUNTER,
+                    FHIR_RESOURCE_TYPE_LOCATION,
+                    FHIR_RESOURCE_TYPE_ORGANIZATION);
 
     /**
      * Validates the provided {@code fhirResourceType} is in the {@link FhirResource#VALID_TYPES}
@@ -214,7 +268,6 @@
         validateIntDefValue(fhirResourceType, VALID_TYPES, FhirResourceType.class.getSimpleName());
     }
 
-    /** Indicates whether some other object is "equal to" this one. */
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -224,13 +277,11 @@
                 && getData().equals(that.getData());
     }
 
-    /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
         return hash(getType(), getId(), getData());
     }
 
-    /** Returns a string representation of this {@link FhirResource}. */
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -242,13 +293,15 @@
         return sb.toString();
     }
 
-    /** Builder class for {@link FhirResource} */
+    /** Builder class for {@link FhirResource}. */
     public static final class Builder {
         @FhirResourceType private int mType;
         @NonNull private String mId;
         @NonNull private String mData;
 
         /**
+         * Constructs a new {@link FhirResource.Builder} instance.
+         *
          * @param type The FHIR resource type extracted from the "resourceType" field in {@code
          *     data}.
          * @param id The FHIR resource ID extracted from the "id" field in {@code data}.
@@ -266,26 +319,20 @@
             mData = data;
         }
 
-        /**
-         * @param original The other {@link FhirResource.Builder} to provide data to construct this
-         *     new instance from.
-         */
-        public Builder(@NonNull Builder original) {
-            requireNonNull(original);
-            mType = original.mType;
-            mId = original.mId;
-            mData = original.mData;
+        /** Constructs a clone of the other {@link FhirResource.Builder}. */
+        public Builder(@NonNull Builder other) {
+            requireNonNull(other);
+            mType = other.mType;
+            mId = other.mId;
+            mData = other.mData;
         }
 
-        /**
-         * @param original The other {@link FhirResource} instance to provide data to construct this
-         *     new instance from.
-         */
-        public Builder(@NonNull FhirResource original) {
-            requireNonNull(original);
-            mType = original.getType();
-            mId = original.getId();
-            mData = original.getData();
+        /** Constructs a clone of the other {@link FhirResource} instance. */
+        public Builder(@NonNull FhirResource other) {
+            requireNonNull(other);
+            mType = other.getType();
+            mId = other.getId();
+            mData = other.getData();
         }
 
         /**
diff --git a/framework/java/android/health/connect/datatypes/FhirVersion.java b/framework/java/android/health/connect/datatypes/FhirVersion.java
index 7b7d587..e870273 100644
--- a/framework/java/android/health/connect/datatypes/FhirVersion.java
+++ b/framework/java/android/health/connect/datatypes/FhirVersion.java
@@ -26,6 +26,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -34,9 +35,16 @@
  * href="https://build.fhir.org/versions.html#versions">the official FHIR versions</a> of the Fast
  * Healthcare Interoperability Resources (FHIR) standard. "label", which represents a 'working'
  * version, is not supported for now.
+ *
+ * <p>The versions R4 (4.0.1) and R4B (4.3.0) are supported in Health Connect.
  */
 @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
 public final class FhirVersion implements Parcelable {
+    private static final FhirVersion R4_FHIR_VERSION = FhirVersion.parseFhirVersion("4.0.1");
+    private static final FhirVersion R4B_FHIR_VERSION = FhirVersion.parseFhirVersion("4.3.0");
+    private static final Set<FhirVersion> SUPPORTED_FHIR_VERSIONS =
+            Set.of(R4_FHIR_VERSION, R4B_FHIR_VERSION);
+
     private final int mMajor;
     private final int mMinor;
     private final int mPatch;
@@ -47,6 +55,7 @@
         mMajor = major;
         mMinor = minor;
         mPatch = patch;
+        validateVersionNumbersNotNegative();
     }
 
     /**
@@ -58,6 +67,7 @@
         mMajor = in.readInt();
         mMinor = in.readInt();
         mPatch = in.readInt();
+        validateVersionNumbersNotNegative();
     }
 
     @NonNull
@@ -145,4 +155,15 @@
     public String toString() {
         return String.format("%d.%d.%d", mMajor, mMinor, mPatch);
     }
+
+    /** Returns {@code true} if the {@link FhirVersion} is supported by Health Connect. */
+    public boolean isSupportedFhirVersion() {
+        return SUPPORTED_FHIR_VERSIONS.contains(this);
+    }
+
+    private void validateVersionNumbersNotNegative() {
+        if (mMajor < 0 || mMinor < 0 || mPatch < 0) {
+            throw new IllegalArgumentException("Version numbers can not be negative.");
+        }
+    }
 }
diff --git a/framework/java/android/health/connect/datatypes/MedicalDataSource.java b/framework/java/android/health/connect/datatypes/MedicalDataSource.java
index 236bb0b..4b51378 100644
--- a/framework/java/android/health/connect/datatypes/MedicalDataSource.java
+++ b/framework/java/android/health/connect/datatypes/MedicalDataSource.java
@@ -47,6 +47,7 @@
     @NonNull private final String mPackageName;
     @NonNull private final Uri mFhirBaseUri;
     @NonNull private final String mDisplayName;
+    @NonNull private final FhirVersion mFhirVersion;
     @Nullable private final Instant mLastDataUpdateTime;
 
     @NonNull
@@ -66,30 +67,27 @@
             };
 
     /**
-     * @param id The unique identifier of this data source, assigned by the Android Health Platform
-     *     at insertion time.
-     * @param packageName The package name of the contributing package. Auto-populated by the
-     *     platform at source creation time.
-     * @param fhirBaseUri The fhir base URI of this data source.
-     * @param displayName The display name that describes this data source.
-     * @param lastDataUpdateTime The time {@link MedicalResource}s linked to this data source were
-     *     last updated in Health Connect.
+     * Creates a new instance of {@link MedicalDataSource}. Please see {@link
+     * MedicalDataSource.Builder} for more detailed parameters information.
      */
     private MedicalDataSource(
             @NonNull String id,
             @NonNull String packageName,
             @NonNull Uri fhirBaseUri,
             @NonNull String displayName,
+            @NonNull FhirVersion fhirVersion,
             @Nullable Instant lastDataUpdateTime) {
         requireNonNull(id);
         requireNonNull(packageName);
         requireNonNull(fhirBaseUri);
         requireNonNull(displayName);
+        requireNonNull(fhirVersion);
 
         mId = id;
         mPackageName = packageName;
         mFhirBaseUri = fhirBaseUri;
         mDisplayName = displayName;
+        mFhirVersion = fhirVersion;
         mLastDataUpdateTime = lastDataUpdateTime;
     }
 
@@ -99,6 +97,9 @@
         mPackageName = requireNonNull(in.readString());
         mFhirBaseUri = requireNonNull(in.readParcelable(Uri.class.getClassLoader(), Uri.class));
         mDisplayName = requireNonNull(in.readString());
+        mFhirVersion =
+                requireNonNull(
+                        in.readParcelable(FhirVersion.class.getClassLoader(), FhirVersion.class));
         long lastDataUpdateTimeMillis = in.readLong();
         mLastDataUpdateTime =
                 lastDataUpdateTimeMillis == 0
@@ -106,13 +107,13 @@
                         : Instant.ofEpochMilli(lastDataUpdateTimeMillis);
     }
 
-    /** Returns the identifier. */
+    /** Returns the unique identifier, assigned by the Android Health Platform at insertion time. */
     @NonNull
     public String getId() {
         return mId;
     }
 
-    /** Returns the corresponding package name. */
+    /** Returns the corresponding package name of the owning app. */
     @NonNull
     public String getPackageName() {
         return mPackageName;
@@ -124,9 +125,18 @@
         return mDisplayName;
     }
 
+    /** Returns the FHIR version of {@link MedicalResource}s from this source. */
+    @NonNull
+    public FhirVersion getFhirVersion() {
+        return mFhirVersion;
+    }
+
     /**
      * Returns the time {@link MedicalResource}s linked to this data source were last updated, or
-     * null if no data has been written yet.
+     * {@code null} if the data source has no linked resources.
+     *
+     * <p>This time is based on resources that currently exist in HealthConnect, so does not reflect
+     * data deletion.
      */
     @Nullable
     public Instant getLastDataUpdateTime() {
@@ -150,6 +160,7 @@
         dest.writeString(mPackageName);
         dest.writeParcelable(mFhirBaseUri, 0);
         dest.writeString(mDisplayName);
+        dest.writeParcelable(mFhirVersion, 0);
         dest.writeLong(mLastDataUpdateTime == null ? 0 : mLastDataUpdateTime.toEpochMilli());
     }
 
@@ -185,6 +196,7 @@
                 && getPackageName().equals(that.getPackageName())
                 && getFhirBaseUri().equals(that.getFhirBaseUri())
                 && getDisplayName().equals(that.getDisplayName())
+                && getFhirVersion().equals(that.getFhirVersion())
                 && Objects.equals(getLastDataUpdateTime(), that.getLastDataUpdateTime());
     }
 
@@ -196,6 +208,7 @@
                 getPackageName(),
                 getFhirBaseUri(),
                 getDisplayName(),
+                getFhirVersion(),
                 getLastDataUpdateTime());
     }
 
@@ -208,65 +221,72 @@
         sb.append(",packageName=").append(getPackageName());
         sb.append(",fhirBaseUri=").append(getFhirBaseUri());
         sb.append(",displayName=").append(getDisplayName());
+        sb.append(",fhirVersion=").append(getFhirVersion());
         sb.append(",lastDataUpdateTime=").append(getLastDataUpdateTime());
         sb.append("}");
         return sb.toString();
     }
 
-    /** Builder class for {@link MedicalDataSource} */
+    /** Builder class for {@link MedicalDataSource}. */
     public static final class Builder {
         @NonNull private String mId;
         @NonNull private String mPackageName;
         @NonNull private Uri mFhirBaseUri;
         @NonNull private String mDisplayName;
+        @NonNull private FhirVersion mFhirVersion;
         @Nullable private Instant mLastDataUpdateTime;
 
         /**
-         * @param id The unique identifier of this data source, assigned by the Android Health
-         *     Platform at insertion time.
-         * @param packageName The package name of the contributing package. Auto-populated by the
-         *     platform at source creation time.
-         * @param fhirBaseUri The fhir base URI of the data source.
+         * Constructs a new {@link MedicalDataSource.Builder} instance.
+         *
+         * @param id The unique identifier of this data source.
+         * @param packageName The package name of the owning app.
+         * @param fhirBaseUri The FHIR base URI of the data source.
          * @param displayName The display name that describes the data source.
+         * @param fhirVersion The FHIR version of {@link MedicalResource}s linked to this source.
          */
         public Builder(
                 @NonNull String id,
                 @NonNull String packageName,
                 @NonNull Uri fhirBaseUri,
-                @NonNull String displayName) {
+                @NonNull String displayName,
+                @NonNull FhirVersion fhirVersion) {
             requireNonNull(id);
             requireNonNull(packageName);
             requireNonNull(fhirBaseUri);
             requireNonNull(displayName);
+            requireNonNull(fhirVersion);
 
             mId = id;
             mPackageName = packageName;
             mFhirBaseUri = fhirBaseUri;
             mDisplayName = displayName;
+            mFhirVersion = fhirVersion;
         }
 
-        public Builder(@NonNull Builder original) {
-            requireNonNull(original);
-            mId = original.mId;
-            mPackageName = original.mPackageName;
-            mFhirBaseUri = original.mFhirBaseUri;
-            mDisplayName = original.mDisplayName;
-            mLastDataUpdateTime = original.mLastDataUpdateTime;
+        /** Constructs a clone of the other {@link MedicalDataSource.Builder}. */
+        public Builder(@NonNull Builder other) {
+            requireNonNull(other);
+            mId = other.mId;
+            mPackageName = other.mPackageName;
+            mFhirBaseUri = other.mFhirBaseUri;
+            mDisplayName = other.mDisplayName;
+            mFhirVersion = other.mFhirVersion;
+            mLastDataUpdateTime = other.mLastDataUpdateTime;
         }
 
-        public Builder(@NonNull MedicalDataSource original) {
-            requireNonNull(original);
-            mId = original.getId();
-            mPackageName = original.getPackageName();
-            mFhirBaseUri = original.getFhirBaseUri();
-            mDisplayName = original.getDisplayName();
-            mLastDataUpdateTime = original.getLastDataUpdateTime();
+        /** Constructs a clone of the other {@link MedicalDataSource} instance. */
+        public Builder(@NonNull MedicalDataSource other) {
+            requireNonNull(other);
+            mId = other.getId();
+            mPackageName = other.getPackageName();
+            mFhirBaseUri = other.getFhirBaseUri();
+            mDisplayName = other.getDisplayName();
+            mFhirVersion = other.getFhirVersion();
+            mLastDataUpdateTime = other.getLastDataUpdateTime();
         }
 
-        /**
-         * Sets unique identifier of this data source, assigned by the Android Health Platform at
-         * insertion time.
-         */
+        /** Sets unique identifier of this data source. */
         @NonNull
         public Builder setId(@NonNull String id) {
             requireNonNull(id);
@@ -285,7 +305,7 @@
             return this;
         }
 
-        /** Sets the fhir base URI of this data source. */
+        /** Sets the FHIR base URI of this data source. */
         @NonNull
         public Builder setFhirBaseUri(@NonNull Uri fhirBaseUri) {
             requireNonNull(fhirBaseUri);
@@ -301,6 +321,14 @@
             return this;
         }
 
+        /** Sets the FHIR version of {@link MedicalResource}s linked to this source. */
+        @NonNull
+        public Builder setFhirVersion(@NonNull FhirVersion fhirVersion) {
+            requireNonNull(fhirVersion);
+            mFhirVersion = fhirVersion;
+            return this;
+        }
+
         /** Sets the time {@link MedicalResource}s linked to this data source were last updated. */
         @NonNull
         public Builder setLastDataUpdateTime(@Nullable Instant lastDataUpdateTime) {
@@ -312,7 +340,12 @@
         @NonNull
         public MedicalDataSource build() {
             return new MedicalDataSource(
-                    mId, mPackageName, mFhirBaseUri, mDisplayName, mLastDataUpdateTime);
+                    mId,
+                    mPackageName,
+                    mFhirBaseUri,
+                    mDisplayName,
+                    mFhirVersion,
+                    mLastDataUpdateTime);
         }
     }
 }
diff --git a/framework/java/android/health/connect/datatypes/MedicalResource.java b/framework/java/android/health/connect/datatypes/MedicalResource.java
index 9a98ccc..8e89d6e 100644
--- a/framework/java/android/health/connect/datatypes/MedicalResource.java
+++ b/framework/java/android/health/connect/datatypes/MedicalResource.java
@@ -16,6 +16,7 @@
 
 package android.health.connect.datatypes;
 
+import static android.health.connect.datatypes.MedicalDataSource.validateMedicalDataSourceIds;
 import static android.health.connect.datatypes.validation.ValidationUtils.validateIntDefValue;
 
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
@@ -35,22 +36,20 @@
 import java.util.Set;
 
 /**
- * Captures the user's medical data. This is the class used for all medical resource types, and the
- * type is specified via {@link MedicalResourceType}.
+ * A class to capture the user's medical data. This is the class used for all medical resource
+ * types.
  *
  * <p>The data representation follows the <a href="https://hl7.org/fhir/">Fast Healthcare
  * Interoperability Resources (FHIR)</a> standard.
  */
 @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD)
 public final class MedicalResource implements Parcelable {
-    /** Unknown medical resource type. */
-    public static final int MEDICAL_RESOURCE_TYPE_UNKNOWN = 0;
 
-    /** Medical resource type to capture the Immunization data. */
-    public static final int MEDICAL_RESOURCE_TYPE_IMMUNIZATION = 1;
+    /** Medical resource type labelling data as vaccines. */
+    public static final int MEDICAL_RESOURCE_TYPE_VACCINES = 1;
 
-    /** Medical resource type to capture the AllergyIntolerance data. */
-    public static final int MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE = 2;
+    /** Medical resource type labelling data as allergies or intolerances. */
+    public static final int MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES = 2;
 
     /** Medical resource type labelling data as to do with pregnancy. */
     public static final int MEDICAL_RESOURCE_TYPE_PREGNANCY = 3;
@@ -65,10 +64,10 @@
     public static final int MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS = 6;
 
     /**
-     * Medical resource type labelling data as problems (clinical condition, problem, diagnosis
-     * etc).
+     * Medical resource type labelling data as medical conditions (clinical condition, problem,
+     * diagnosis etc).
      */
-    public static final int MEDICAL_RESOURCE_TYPE_PROBLEMS = 7;
+    public static final int MEDICAL_RESOURCE_TYPE_CONDITIONS = 7;
 
     /** Medical resource type labelling data as procedures (actions taken on or for a patient). */
     public static final int MEDICAL_RESOURCE_TYPE_PROCEDURES = 8;
@@ -76,17 +75,40 @@
     /** Medical resource type labelling data as medication related. */
     public static final int MEDICAL_RESOURCE_TYPE_MEDICATIONS = 9;
 
+    /**
+     * Medical resource type labelling data as related to personal details, including demographic
+     * information such as name, date of birth, and contact details such as address or telephone
+     * numbers.
+     */
+    public static final int MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS = 10;
+
+    /**
+     * Medical resource type labelling data as related to practitioners. This is information about
+     * the doctors, nurses, masseurs, physios, etc who have been involved with the user.
+     */
+    public static final int MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS = 11;
+
+    /**
+     * Medical resource type labelling data as related to an encounter with a practitioner. This
+     * includes visits to healthcare providers and remote encounters such as telephone and
+     * videoconference appointments, and information about the time, location and organization who
+     * is being met.
+     */
+    public static final int MEDICAL_RESOURCE_TYPE_VISITS = 12;
+
     /** @hide */
     @IntDef({
-        MEDICAL_RESOURCE_TYPE_UNKNOWN,
-        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+        MEDICAL_RESOURCE_TYPE_CONDITIONS,
         MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
         MEDICAL_RESOURCE_TYPE_MEDICATIONS,
+        MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS,
+        MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS,
         MEDICAL_RESOURCE_TYPE_PREGNANCY,
-        MEDICAL_RESOURCE_TYPE_PROBLEMS,
         MEDICAL_RESOURCE_TYPE_PROCEDURES,
         MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY,
+        MEDICAL_RESOURCE_TYPE_VACCINES,
+        MEDICAL_RESOURCE_TYPE_VISITS,
         MEDICAL_RESOURCE_TYPE_VITAL_SIGNS,
     })
     @Retention(RetentionPolicy.SOURCE)
@@ -98,12 +120,30 @@
     @NonNull private final FhirVersion mFhirVersion;
     @NonNull private final FhirResource mFhirResource;
 
+    /** @hide */
+    private long mLastModifiedTimestamp;
+
     /**
-     * @param type The medical resource type assigned by the Android Health Platform at insertion
-     *     time.
-     * @param dataSourceId Where the data comes from.
-     * @param fhirVersion The {@link FhirVersion} object that represents the FHIR version.
-     * @param fhirResource The enclosed {@link FhirResource} object.
+     * Creates a new instance of {@link MedicalResource} which takes in {@code
+     * lastModifiedTimestamp} as a parameter as well. The {@code lastModifiedTimestamp} is currently
+     * only used internally to ensure D2D merge process, copies over the exact timestamp of when the
+     * {@link MedicalResource} was modified.
+     *
+     * @hide
+     */
+    public MedicalResource(
+            @MedicalResourceType int type,
+            @NonNull String dataSourceId,
+            @NonNull FhirVersion fhirVersion,
+            @NonNull FhirResource fhirResource,
+            long lastModifiedTimestamp) {
+        this(type, dataSourceId, fhirVersion, fhirResource);
+        mLastModifiedTimestamp = lastModifiedTimestamp;
+    }
+
+    /**
+     * Creates a new instance of {@link MedicalResource}. Please see {@link MedicalResource.Builder}
+     * for more detailed parameters information.
      */
     private MedicalResource(
             @MedicalResourceType int type,
@@ -114,6 +154,7 @@
         requireNonNull(fhirVersion);
         requireNonNull(fhirResource);
         validateMedicalResourceType(type);
+        validateMedicalDataSourceIds(Set.of(dataSourceId));
 
         mType = type;
         mDataSourceId = dataSourceId;
@@ -131,6 +172,7 @@
         mType = in.readInt();
         validateMedicalResourceType(mType);
         mDataSourceId = requireNonNull(in.readString());
+        validateMedicalDataSourceIds(Set.of(mDataSourceId));
         mFhirVersion =
                 requireNonNull(
                         in.readParcelable(FhirVersion.class.getClassLoader(), FhirVersion.class));
@@ -143,10 +185,6 @@
     @NonNull
     public static final Creator<MedicalResource> CREATOR =
             new Creator<>() {
-                /**
-                 * Reading from the {@link Parcel} should have the same order as {@link
-                 * MedicalResource#writeToParcel}.
-                 */
                 @Override
                 public MedicalResource createFromParcel(Parcel in) {
                     return new MedicalResource(in);
@@ -158,7 +196,13 @@
                 }
             };
 
-    /** Returns the medical resource type. */
+    /**
+     * Returns the medical resource type, assigned by the Android Health Platform at insertion time.
+     *
+     * <p>For a list of supported types, see the {@link MedicalResource} type constants, such as
+     * {@link #MEDICAL_RESOURCE_TYPE_VACCINES}. Clients should be aware that this list is non
+     * exhaustive and may increase in future releases when additional types will need to be handled.
+     */
     @MedicalResourceType
     public int getType() {
         return mType;
@@ -170,13 +214,13 @@
         return mId;
     }
 
-    /** Returns The data source ID where the data comes from. */
+    /** Returns the unique {@link MedicalDataSource} ID of where the data comes from. */
     @NonNull
     public String getDataSourceId() {
         return mDataSourceId;
     }
 
-    /** Returns the {@link FhirVersion} object that represents the FHIR version. */
+    /** Returns the FHIR version being used for {@code mFhirResource} */
     @NonNull
     public FhirVersion getFhirVersion() {
         return mFhirVersion;
@@ -188,12 +232,20 @@
         return mFhirResource;
     }
 
+    /**
+     * Returns the last modified timestamp for this {@link MedicalResource}.
+     *
+     * @hide
+     */
+    public long getLastModifiedTimestamp() {
+        return mLastModifiedTimestamp;
+    }
+
     @Override
     public int describeContents() {
         return 0;
     }
 
-    /** Populates a {@link Parcel} with the self information. */
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         requireNonNull(dest);
@@ -211,15 +263,17 @@
      */
     public static final Set<Integer> VALID_TYPES =
             Set.of(
-                    MEDICAL_RESOURCE_TYPE_UNKNOWN,
-                    MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                    MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                    MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                    MEDICAL_RESOURCE_TYPE_CONDITIONS,
                     MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
                     MEDICAL_RESOURCE_TYPE_MEDICATIONS,
+                    MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS,
+                    MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS,
                     MEDICAL_RESOURCE_TYPE_PREGNANCY,
-                    MEDICAL_RESOURCE_TYPE_PROBLEMS,
                     MEDICAL_RESOURCE_TYPE_PROCEDURES,
                     MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY,
+                    MEDICAL_RESOURCE_TYPE_VACCINES,
+                    MEDICAL_RESOURCE_TYPE_VISITS,
                     MEDICAL_RESOURCE_TYPE_VITAL_SIGNS);
 
     /**
@@ -235,7 +289,6 @@
                 medicalResourceType, VALID_TYPES, MedicalResourceType.class.getSimpleName());
     }
 
-    /** Indicates whether some other object is "equal to" this one. */
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -246,13 +299,11 @@
                 && getFhirResource().equals(that.getFhirResource());
     }
 
-    /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
         return hash(getType(), getDataSourceId(), getFhirVersion(), getFhirResource());
     }
 
-    /** Returns a string representation of this {@link MedicalResource}. */
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -265,7 +316,7 @@
         return sb.toString();
     }
 
-    /** Builder class for {@link MedicalResource} */
+    /** Builder class for {@link MedicalResource}. */
     public static final class Builder {
         @MedicalResourceType private int mType;
         @NonNull private String mDataSourceId;
@@ -273,11 +324,14 @@
         @NonNull private FhirResource mFhirResource;
 
         /**
-         * @param type The medical resource type assigned by the Android Health Platform at
-         *     insertion time.
-         * @param dataSourceId Where the data comes from.
-         * @param fhirVersion The enclosed {@link FhirVersion} object.
+         * Constructs a new {@link MedicalResource.Builder} instance.
+         *
+         * @param type The medical resource type.
+         * @param dataSourceId The unique {@link MedicalDataSource} ID of where the data comes from.
+         * @param fhirVersion the FHIR version being used for {@code fhirResource}.
          * @param fhirResource The enclosed {@link FhirResource} object.
+         * @throws IllegalArgumentException if the provided medical resource {@code type} is not a
+         *     valid supported type, or {@code dataSourceId} is not a valid ID.
          */
         public Builder(
                 @MedicalResourceType int type,
@@ -288,6 +342,7 @@
             requireNonNull(fhirVersion);
             requireNonNull(fhirResource);
             validateMedicalResourceType(type);
+            validateMedicalDataSourceIds(Set.of(dataSourceId));
 
             mType = type;
             mDataSourceId = dataSourceId;
@@ -295,33 +350,29 @@
             mFhirResource = fhirResource;
         }
 
-        /**
-         * @param original The other {@link MedicalResource.Builder} to provide data to construct
-         *     this new instance from.
-         */
-        public Builder(@NonNull Builder original) {
-            requireNonNull(original);
-            mType = original.mType;
-            mDataSourceId = original.mDataSourceId;
-            mFhirVersion = original.mFhirVersion;
-            mFhirResource = original.mFhirResource;
+        /** Constructs a clone of the other {@link MedicalResource.Builder}. */
+        public Builder(@NonNull Builder other) {
+            requireNonNull(other);
+            mType = other.mType;
+            mDataSourceId = other.mDataSourceId;
+            mFhirVersion = other.mFhirVersion;
+            mFhirResource = other.mFhirResource;
+        }
+
+        /** Constructs a clone of the other {@link MedicalResource} instance. */
+        public Builder(@NonNull MedicalResource other) {
+            requireNonNull(other);
+            mType = other.getType();
+            mDataSourceId = other.getDataSourceId();
+            mFhirVersion = other.getFhirVersion();
+            mFhirResource = other.getFhirResource();
         }
 
         /**
-         * @param original The other {@link MedicalResource} instance to provide data to construct
-         *     this new instance from.
-         */
-        public Builder(@NonNull MedicalResource original) {
-            requireNonNull(original);
-            mType = original.getType();
-            mDataSourceId = original.getDataSourceId();
-            mFhirVersion = original.getFhirVersion();
-            mFhirResource = original.getFhirResource();
-        }
-
-        /**
-         * Sets the medical resource type, assigned by the Android Health Platform at insertion
-         * time.
+         * Sets the medical resource type.
+         *
+         * @throws IllegalArgumentException if the provided medical resource {@code type} is not a
+         *     valid supported type.
          */
         @NonNull
         public Builder setType(@MedicalResourceType int type) {
@@ -330,15 +381,20 @@
             return this;
         }
 
-        /** Sets the data source ID where the data comes from. */
+        /**
+         * Sets the unique {@link MedicalDataSource} ID of where the data comes from.
+         *
+         * @throws IllegalArgumentException if the provided {@code dataSourceId} is not a valid ID.
+         */
         @NonNull
         public Builder setDataSourceId(@NonNull String dataSourceId) {
             requireNonNull(dataSourceId);
+            validateMedicalDataSourceIds(Set.of(dataSourceId));
             mDataSourceId = dataSourceId;
             return this;
         }
 
-        /** Sets the {@link FhirVersion} object that represents the FHIR version. */
+        /** Sets the FHIR version being used for {@code fhirResource}. */
         @NonNull
         public Builder setFhirVersion(@NonNull FhirVersion fhirVersion) {
             requireNonNull(fhirVersion);
@@ -346,7 +402,7 @@
             return this;
         }
 
-        /** Sets the enclosed {@link FhirResource} object */
+        /** Sets the enclosed {@link FhirResource} object. */
         @NonNull
         public Builder setFhirResource(@NonNull FhirResource fhirResource) {
             requireNonNull(fhirResource);
diff --git a/framework/java/android/health/connect/datatypes/Record.java b/framework/java/android/health/connect/datatypes/Record.java
index 1526152..32eb223 100644
--- a/framework/java/android/health/connect/datatypes/Record.java
+++ b/framework/java/android/health/connect/datatypes/Record.java
@@ -22,6 +22,7 @@
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.health.connect.internal.datatypes.RecordInternal;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 
 import java.util.Objects;
 
@@ -40,7 +41,7 @@
         Objects.requireNonNull(annotation);
         validateIntDefValue(
                 annotation.recordIdentifier(),
-                RecordTypeIdentifier.VALID_TYPES,
+                HealthConnectMappings.getInstance().getAllRecordTypeIdentifiers(),
                 RecordTypeIdentifier.class.getSimpleName());
         mRecordIdentifier = annotation.recordIdentifier();
         mMetadata = metadata;
diff --git a/framework/java/android/health/connect/datatypes/RecordTypeIdentifier.java b/framework/java/android/health/connect/datatypes/RecordTypeIdentifier.java
index 07a4e0f..23ed922 100644
--- a/framework/java/android/health/connect/datatypes/RecordTypeIdentifier.java
+++ b/framework/java/android/health/connect/datatypes/RecordTypeIdentifier.java
@@ -16,11 +16,13 @@
 
 package android.health.connect.datatypes;
 
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
 import static com.android.healthfitness.flags.Flags.FLAG_MINDFULNESS;
 
 import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.SystemApi;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -374,11 +376,19 @@
     public static final int RECORD_TYPE_MINDFULNESS_SESSION = 41;
 
     /**
+     * @see ActivityIntensityRecord
+     */
+    @FlaggedApi(FLAG_ACTIVITY_INTENSITY)
+    public static final int RECORD_TYPE_ACTIVITY_INTENSITY = 42;
+
+    /**
      * Valid set of values for this IntDef. Update this set when add new type or deprecate existing
      * type.
      *
+     * @deprecated Use {@link HealthConnectMappings#getAllRecordTypeIdentifiers()}
      * @hide
      */
+    @Deprecated
     public static final Set<Integer> VALID_TYPES =
             Set.of(
                     RECORD_TYPE_UNKNOWN,
@@ -469,7 +479,8 @@
         RECORD_TYPE_SLEEP_SESSION,
         RECORD_TYPE_SKIN_TEMPERATURE,
         RECORD_TYPE_PLANNED_EXERCISE_SESSION,
-        RECORD_TYPE_MINDFULNESS_SESSION
+        RECORD_TYPE_MINDFULNESS_SESSION,
+        RECORD_TYPE_ACTIVITY_INTENSITY
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface RecordType {}
diff --git a/framework/java/android/health/connect/exportimport/ScheduledExportStatus.java b/framework/java/android/health/connect/exportimport/ScheduledExportStatus.java
index bd09618..fc48daf 100644
--- a/framework/java/android/health/connect/exportimport/ScheduledExportStatus.java
+++ b/framework/java/android/health/connect/exportimport/ScheduledExportStatus.java
@@ -82,6 +82,14 @@
      */
     public static final int DATA_EXPORT_ERROR_CLEARING_LOG_TABLES = 4;
 
+    /**
+     * Indicates that the last export failed while trying to clear the PHR tables. Probably because
+     * the file was corrupted during the copy, and it was not a valid HealthConnectDatabase anymore.
+     *
+     * @hide
+     */
+    public static final int DATA_EXPORT_ERROR_CLEARING_PHR_TABLES = 5;
+
     /** @hide */
     // TODO(b/356393172) rename to Status & include DATA_EXPORT_STARTED during Statuses cleanup.
     @Retention(RetentionPolicy.SOURCE)
diff --git a/framework/java/android/health/connect/internal/datatypes/ActivityIntensityRecordInternal.java b/framework/java/android/health/connect/internal/datatypes/ActivityIntensityRecordInternal.java
new file mode 100644
index 0000000..5cb024b
--- /dev/null
+++ b/framework/java/android/health/connect/internal/datatypes/ActivityIntensityRecordInternal.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.health.connect.internal.datatypes;
+
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.Identifier;
+import android.health.connect.datatypes.RecordTypeIdentifier;
+import android.os.Parcel;
+
+/**
+ * @see ActivityIntensityRecord
+ * @hide
+ */
+@FlaggedApi(FLAG_ACTIVITY_INTENSITY)
+@Identifier(recordIdentifier = RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY)
+public final class ActivityIntensityRecordInternal
+        extends IntervalRecordInternal<ActivityIntensityRecord> {
+
+    private int mActivityIntensityType;
+
+    @Override
+    void populateIntervalRecordFrom(@NonNull Parcel parcel) {
+        mActivityIntensityType = parcel.readInt();
+    }
+
+    @Override
+    void populateIntervalRecordTo(@NonNull Parcel parcel) {
+        parcel.writeInt(mActivityIntensityType);
+    }
+
+    @Override
+    public ActivityIntensityRecord toExternalRecord() {
+        ActivityIntensityRecord.Builder builder =
+                new ActivityIntensityRecord.Builder(
+                        buildMetaData(), getStartTime(), getEndTime(), mActivityIntensityType);
+
+        if (getStartZoneOffset() != null) {
+            builder.setStartZoneOffset(getStartZoneOffset());
+        }
+
+        if (getEndZoneOffset() != null) {
+            builder.setEndZoneOffset(getEndZoneOffset());
+        }
+
+        return builder.buildWithoutValidation();
+    }
+
+    @ActivityIntensityRecord.ActivityIntensityType
+    public int getActivityIntensityType() {
+        return mActivityIntensityType;
+    }
+
+    /**
+     * @return this object with the measurement location.
+     */
+    @NonNull
+    public ActivityIntensityRecordInternal setActivityIntensityType(int activityIntensityType) {
+        mActivityIntensityType = activityIntensityType;
+        return this;
+    }
+}
diff --git a/framework/java/android/health/connect/internal/datatypes/AppInfoInternal.java b/framework/java/android/health/connect/internal/datatypes/AppInfoInternal.java
index 7c3edcd..370fbbd 100644
--- a/framework/java/android/health/connect/internal/datatypes/AppInfoInternal.java
+++ b/framework/java/android/health/connect/internal/datatypes/AppInfoInternal.java
@@ -29,15 +29,13 @@
 public final class AppInfoInternal {
     private long mId;
     private final String mPackageName;
-    private final String mName;
-    private final Bitmap mIcon;
+    @Nullable private final String mName;
+    @Nullable private final Bitmap mIcon;
+    @Nullable private Set<Integer> mRecordTypesUsed;
 
-    private Set<Integer> mRecordTypesUsed;
-
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     public AppInfoInternal(
-            @NonNull long id,
-            @NonNull String packageName,
+            long id,
+            String packageName,
             @Nullable String name,
             @Nullable Bitmap icon,
             @Nullable Set<Integer> recordTypesUsed) {
@@ -61,7 +59,6 @@
     }
 
     /** sets or updates the value of recordTypesUsed for app info. */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     public void setRecordTypesUsed(@Nullable Set<Integer> recordTypesUsed) {
         mRecordTypesUsed = recordTypesUsed;
     }
diff --git a/framework/java/android/health/connect/internal/datatypes/InstantRecordInternal.java b/framework/java/android/health/connect/internal/datatypes/InstantRecordInternal.java
index 60a85a9..977e0a2 100644
--- a/framework/java/android/health/connect/internal/datatypes/InstantRecordInternal.java
+++ b/framework/java/android/health/connect/internal/datatypes/InstantRecordInternal.java
@@ -67,6 +67,11 @@
         populateInstantRecordTo(parcel);
     }
 
+    @Override
+    public long getRecordTime() {
+        return getTimeInMillis();
+    }
+
     Instant getTime() {
         return Instant.ofEpochMilli(mTime);
     }
diff --git a/framework/java/android/health/connect/internal/datatypes/IntervalRecordInternal.java b/framework/java/android/health/connect/internal/datatypes/IntervalRecordInternal.java
index eb8bb56..8990d5b 100644
--- a/framework/java/android/health/connect/internal/datatypes/IntervalRecordInternal.java
+++ b/framework/java/android/health/connect/internal/datatypes/IntervalRecordInternal.java
@@ -123,6 +123,11 @@
         return LocalDate.ofInstant(this.getStartTime(), this.getStartZoneOffset());
     }
 
+    @Override
+    public long getRecordTime() {
+        return getEndTimeInMillis();
+    }
+
     /**
      * Child class must implement this method and populates itself with the data present in {@param
      * bundle}. Reads should be in the same order as write
diff --git a/framework/java/android/health/connect/internal/datatypes/RecordInternal.java b/framework/java/android/health/connect/internal/datatypes/RecordInternal.java
index 69978de..6428d67 100644
--- a/framework/java/android/health/connect/internal/datatypes/RecordInternal.java
+++ b/framework/java/android/health/connect/internal/datatypes/RecordInternal.java
@@ -29,6 +29,7 @@
 import android.health.connect.datatypes.RecordTypeIdentifier;
 import android.os.Parcel;
 
+import java.io.Serializable;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.util.Objects;
@@ -37,9 +38,10 @@
 /**
  * Base class for all health connect datatype records.
  *
+ * @param <T> The record type.
  * @hide
  */
-public abstract class RecordInternal<T extends Record> {
+public abstract class RecordInternal<T extends Record> implements Serializable {
     private final int mRecordIdentifier;
     private UUID mUuid;
     private String mPackageName;
@@ -139,9 +141,8 @@
         return mPackageName;
     }
 
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     @NonNull
-    public RecordInternal<T> setPackageName(@Nullable String packageName) {
+    public RecordInternal<T> setPackageName(String packageName) {
         this.mPackageName = packageName;
         return this;
     }
@@ -303,6 +304,12 @@
     public abstract LocalDate getLocalDate();
 
     /**
+     * @return the time at which the record ended. This matches the end time for an InstantRecord
+     *     and time for IntervalRecord.
+     */
+    public abstract long getRecordTime();
+
+    /**
      * Populate {@code bundle} with the data required to un-bundle self. This is used suring IPC
      * transmissions
      */
diff --git a/framework/java/android/health/connect/internal/datatypes/SkinTemperatureRecordInternal.java b/framework/java/android/health/connect/internal/datatypes/SkinTemperatureRecordInternal.java
index f2e0f34..ea4e387 100644
--- a/framework/java/android/health/connect/internal/datatypes/SkinTemperatureRecordInternal.java
+++ b/framework/java/android/health/connect/internal/datatypes/SkinTemperatureRecordInternal.java
@@ -131,8 +131,40 @@
         return this;
     }
 
-    public record SkinTemperatureDeltaSample(double mTemperatureDeltaInCelsius, long mEpochMillis)
-            implements Sample {}
+    // TODO: b/378992079 - Use "java record" class when supported by ApiDocs.
+    public static final class SkinTemperatureDeltaSample implements Sample {
+        private final double mTemperatureDeltaInCelsius;
+        private final long mEpochMillis;
+
+        public SkinTemperatureDeltaSample(double temperatureDeltaInCelsius, long epochMillis) {
+            mTemperatureDeltaInCelsius = temperatureDeltaInCelsius;
+            mEpochMillis = epochMillis;
+        }
+
+        public double mTemperatureDeltaInCelsius() {
+            return mTemperatureDeltaInCelsius;
+        }
+
+        public long mEpochMillis() {
+            return mEpochMillis;
+        }
+
+        @Override
+        public boolean equals(@Nullable Object object) {
+            if (super.equals(object)
+                    && object instanceof SkinTemperatureRecordInternal.SkinTemperatureDeltaSample) {
+                SkinTemperatureRecordInternal.SkinTemperatureDeltaSample other =
+                        (SkinTemperatureRecordInternal.SkinTemperatureDeltaSample) object;
+                return mEpochMillis() == other.mEpochMillis();
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mEpochMillis());
+        }
+    }
 
     private List<SkinTemperatureRecord.Delta> getExternalDeltas() {
         List<SkinTemperatureRecord.Delta> skinTemperatureDeltas =
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/AggregationTypeIdMapper.java b/framework/java/android/health/connect/internal/datatypes/utils/AggregationTypeIdMapper.java
index e036cc9..c6f5677 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/AggregationTypeIdMapper.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/AggregationTypeIdMapper.java
@@ -17,6 +17,10 @@
 package android.health.connect.internal.datatypes.utils;
 
 import static android.health.connect.datatypes.ActiveCaloriesBurnedRecord.ACTIVE_CALORIES_TOTAL;
+import static android.health.connect.datatypes.ActivityIntensityRecord.DURATION_TOTAL;
+import static android.health.connect.datatypes.ActivityIntensityRecord.INTENSITY_MINUTES_TOTAL;
+import static android.health.connect.datatypes.ActivityIntensityRecord.MODERATE_DURATION_TOTAL;
+import static android.health.connect.datatypes.ActivityIntensityRecord.VIGOROUS_DURATION_TOTAL;
 import static android.health.connect.datatypes.BasalMetabolicRateRecord.BASAL_CALORIES_TOTAL;
 import static android.health.connect.datatypes.BloodPressureRecord.DIASTOLIC_AVG;
 import static android.health.connect.datatypes.BloodPressureRecord.DIASTOLIC_MAX;
@@ -116,8 +120,10 @@
 import android.health.connect.datatypes.units.Volume;
 import android.os.Parcel;
 
+import com.android.healthfitness.flags.AconfigFlagHelper;
 import com.android.healthfitness.flags.Flags;
 
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -157,11 +163,20 @@
                                 HEART_MEASUREMENTS_COUNT,
                                 SLEEP_DURATION_TOTAL,
                                 EXERCISE_DURATION_TOTAL));
+        List<AggregationType<?>> durationAggregations = new ArrayList<>();
 
         if (Flags.mindfulness()) {
             longAggregations.add(MINDFULNESS_DURATION_TOTAL);
         }
 
+        // Redundantly explicitly checking the flag to satisfy the linter.
+        if (Flags.activityIntensity() && AconfigFlagHelper.isActivityIntensityEnabled()) {
+            durationAggregations.add(MODERATE_DURATION_TOTAL);
+            durationAggregations.add(VIGOROUS_DURATION_TOTAL);
+            durationAggregations.add(DURATION_TOTAL);
+            longAggregations.add(INTENSITY_MINUTES_TOTAL);
+        }
+
         addLongIdsToAggregateResultMap(longAggregations);
         addDoubleIdsToAggregateResultMap(
                 Arrays.asList(
@@ -247,6 +262,7 @@
                         SYSTOLIC_AVG,
                         SYSTOLIC_MAX,
                         SYSTOLIC_MIN));
+        addDurationIdsToAggregateResultMap(durationAggregations);
     }
 
     @NonNull
@@ -329,6 +345,11 @@
         return new AggregateResult<>(Velocity.fromMetersPerSecond(result));
     }
 
+    @NonNull
+    private AggregateResult<Duration> getDurationResult(long resultMillis) {
+        return new AggregateResult<>(Duration.ofMillis(resultMillis));
+    }
+
     private void addLongIdsToAggregateResultMap(
             @NonNull List<AggregationType<?>> aggregationTypeList) {
         for (AggregationType<?> aggregationType : aggregationTypeList) {
@@ -429,6 +450,16 @@
         }
     }
 
+    private void addDurationIdsToAggregateResultMap(
+            @NonNull List<AggregationType<?>> aggregationTypeList) {
+        for (AggregationType<?> aggregationType : aggregationTypeList) {
+            mIdToAggregateResult.put(
+                    aggregationType.getAggregationTypeIdentifier(),
+                    result -> getDurationResult(result.readLong()));
+            populateIdDataAggregationType(aggregationType);
+        }
+    }
+
     private void populateIdDataAggregationType(AggregationType<?> aggregationType) {
         mIdDataAggregationTypeMap.put(
                 aggregationType.getAggregationTypeIdentifier(), aggregationType);
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/DataTypeDescriptors.java b/framework/java/android/health/connect/internal/datatypes/utils/DataTypeDescriptors.java
index 7b1c8c0..6a2b81d 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/DataTypeDescriptors.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/DataTypeDescriptors.java
@@ -17,6 +17,7 @@
 package android.health.connect.internal.datatypes.utils;
 
 import static android.health.connect.HealthPermissions.READ_ACTIVE_CALORIES_BURNED;
+import static android.health.connect.HealthPermissions.READ_ACTIVITY_INTENSITY;
 import static android.health.connect.HealthPermissions.READ_BASAL_BODY_TEMPERATURE;
 import static android.health.connect.HealthPermissions.READ_BASAL_METABOLIC_RATE;
 import static android.health.connect.HealthPermissions.READ_BLOOD_GLUCOSE;
@@ -55,6 +56,7 @@
 import static android.health.connect.HealthPermissions.READ_WEIGHT;
 import static android.health.connect.HealthPermissions.READ_WHEELCHAIR_PUSHES;
 import static android.health.connect.HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED;
+import static android.health.connect.HealthPermissions.WRITE_ACTIVITY_INTENSITY;
 import static android.health.connect.HealthPermissions.WRITE_BASAL_BODY_TEMPERATURE;
 import static android.health.connect.HealthPermissions.WRITE_BASAL_METABOLIC_RATE;
 import static android.health.connect.HealthPermissions.WRITE_BLOOD_GLUCOSE;
@@ -93,6 +95,7 @@
 import static android.health.connect.HealthPermissions.WRITE_WEIGHT;
 import static android.health.connect.HealthPermissions.WRITE_WHEELCHAIR_PUSHES;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVE_CALORIES_BURNED;
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BASAL_BODY_TEMPERATURE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BASAL_METABOLIC_RATE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BLOOD_GLUCOSE;
@@ -139,6 +142,7 @@
 import android.health.connect.HealthDataCategory;
 import android.health.connect.HealthPermissionCategory;
 import android.health.connect.datatypes.ActiveCaloriesBurnedRecord;
+import android.health.connect.datatypes.ActivityIntensityRecord;
 import android.health.connect.datatypes.BasalBodyTemperatureRecord;
 import android.health.connect.datatypes.BasalMetabolicRateRecord;
 import android.health.connect.datatypes.BloodGlucoseRecord;
@@ -180,6 +184,7 @@
 import android.health.connect.datatypes.WeightRecord;
 import android.health.connect.datatypes.WheelchairPushesRecord;
 import android.health.connect.internal.datatypes.ActiveCaloriesBurnedRecordInternal;
+import android.health.connect.internal.datatypes.ActivityIntensityRecordInternal;
 import android.health.connect.internal.datatypes.BasalBodyTemperatureRecordInternal;
 import android.health.connect.internal.datatypes.BasalMetabolicRateRecordInternal;
 import android.health.connect.internal.datatypes.BloodGlucoseRecordInternal;
@@ -221,9 +226,13 @@
 import android.health.connect.internal.datatypes.WeightRecordInternal;
 import android.health.connect.internal.datatypes.WheelchairPushesRecordInternal;
 
+import com.android.healthfitness.flags.AconfigFlagHelper;
+import com.android.healthfitness.flags.Flags;
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
 
 /** @hide */
 @VisibleForTesting(visibility = PACKAGE)
@@ -232,375 +241,402 @@
     /** Returns descriptors for all supported data types. */
     @VisibleForTesting(visibility = PACKAGE)
     public static List<DataTypeDescriptor> getAllDataTypeDescriptors() {
-        return List.of(
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_ACTIVE_CALORIES_BURNED)
-                        .setPermissionCategory(HealthPermissionCategory.ACTIVE_CALORIES_BURNED)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_ACTIVE_CALORIES_BURNED)
-                        .setWritePermission(WRITE_ACTIVE_CALORIES_BURNED)
-                        .setRecordClass(ActiveCaloriesBurnedRecord.class)
-                        .setRecordInternalClass(ActiveCaloriesBurnedRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_BASAL_BODY_TEMPERATURE)
-                        .setPermissionCategory(HealthPermissionCategory.BASAL_BODY_TEMPERATURE)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_BASAL_BODY_TEMPERATURE)
-                        .setWritePermission(WRITE_BASAL_BODY_TEMPERATURE)
-                        .setRecordClass(BasalBodyTemperatureRecord.class)
-                        .setRecordInternalClass(BasalBodyTemperatureRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_BASAL_METABOLIC_RATE)
-                        .setPermissionCategory(HealthPermissionCategory.BASAL_METABOLIC_RATE)
-                        .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
-                        .setReadPermission(READ_BASAL_METABOLIC_RATE)
-                        .setWritePermission(WRITE_BASAL_METABOLIC_RATE)
-                        .setRecordClass(BasalMetabolicRateRecord.class)
-                        .setRecordInternalClass(BasalMetabolicRateRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_BLOOD_GLUCOSE)
-                        .setPermissionCategory(HealthPermissionCategory.BLOOD_GLUCOSE)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_BLOOD_GLUCOSE)
-                        .setWritePermission(WRITE_BLOOD_GLUCOSE)
-                        .setRecordClass(BloodGlucoseRecord.class)
-                        .setRecordInternalClass(BloodGlucoseRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_BLOOD_PRESSURE)
-                        .setPermissionCategory(HealthPermissionCategory.BLOOD_PRESSURE)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_BLOOD_PRESSURE)
-                        .setWritePermission(WRITE_BLOOD_PRESSURE)
-                        .setRecordClass(BloodPressureRecord.class)
-                        .setRecordInternalClass(BloodPressureRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_BODY_FAT)
-                        .setPermissionCategory(HealthPermissionCategory.BODY_FAT)
-                        .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
-                        .setReadPermission(READ_BODY_FAT)
-                        .setWritePermission(WRITE_BODY_FAT)
-                        .setRecordClass(BodyFatRecord.class)
-                        .setRecordInternalClass(BodyFatRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_BODY_TEMPERATURE)
-                        .setPermissionCategory(HealthPermissionCategory.BODY_TEMPERATURE)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_BODY_TEMPERATURE)
-                        .setWritePermission(WRITE_BODY_TEMPERATURE)
-                        .setRecordClass(BodyTemperatureRecord.class)
-                        .setRecordInternalClass(BodyTemperatureRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_BODY_WATER_MASS)
-                        .setPermissionCategory(HealthPermissionCategory.BODY_WATER_MASS)
-                        .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
-                        .setReadPermission(READ_BODY_WATER_MASS)
-                        .setWritePermission(WRITE_BODY_WATER_MASS)
-                        .setRecordClass(BodyWaterMassRecord.class)
-                        .setRecordInternalClass(BodyWaterMassRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_BONE_MASS)
-                        .setPermissionCategory(HealthPermissionCategory.BONE_MASS)
-                        .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
-                        .setReadPermission(READ_BONE_MASS)
-                        .setWritePermission(WRITE_BONE_MASS)
-                        .setRecordClass(BoneMassRecord.class)
-                        .setRecordInternalClass(BoneMassRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_CERVICAL_MUCUS)
-                        .setPermissionCategory(HealthPermissionCategory.CERVICAL_MUCUS)
-                        .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
-                        .setReadPermission(READ_CERVICAL_MUCUS)
-                        .setWritePermission(WRITE_CERVICAL_MUCUS)
-                        .setRecordClass(CervicalMucusRecord.class)
-                        .setRecordInternalClass(CervicalMucusRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_CYCLING_PEDALING_CADENCE)
-                        .setPermissionCategory(HealthPermissionCategory.EXERCISE)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_EXERCISE)
-                        .setWritePermission(WRITE_EXERCISE)
-                        .setRecordClass(CyclingPedalingCadenceRecord.class)
-                        .setRecordInternalClass(CyclingPedalingCadenceRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_DISTANCE)
-                        .setPermissionCategory(HealthPermissionCategory.DISTANCE)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_DISTANCE)
-                        .setWritePermission(WRITE_DISTANCE)
-                        .setRecordClass(DistanceRecord.class)
-                        .setRecordInternalClass(DistanceRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_ELEVATION_GAINED)
-                        .setPermissionCategory(HealthPermissionCategory.ELEVATION_GAINED)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_ELEVATION_GAINED)
-                        .setWritePermission(WRITE_ELEVATION_GAINED)
-                        .setRecordClass(ElevationGainedRecord.class)
-                        .setRecordInternalClass(ElevationGainedRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_EXERCISE_SESSION)
-                        .setPermissionCategory(HealthPermissionCategory.EXERCISE)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_EXERCISE)
-                        .setWritePermission(WRITE_EXERCISE)
-                        .setRecordClass(ExerciseSessionRecord.class)
-                        .setRecordInternalClass(ExerciseSessionRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_FLOORS_CLIMBED)
-                        .setPermissionCategory(HealthPermissionCategory.FLOORS_CLIMBED)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_FLOORS_CLIMBED)
-                        .setWritePermission(WRITE_FLOORS_CLIMBED)
-                        .setRecordClass(FloorsClimbedRecord.class)
-                        .setRecordInternalClass(FloorsClimbedRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_HEART_RATE)
-                        .setPermissionCategory(HealthPermissionCategory.HEART_RATE)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_HEART_RATE)
-                        .setWritePermission(WRITE_HEART_RATE)
-                        .setRecordClass(HeartRateRecord.class)
-                        .setRecordInternalClass(HeartRateRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_HEART_RATE_VARIABILITY_RMSSD)
-                        .setPermissionCategory(HealthPermissionCategory.HEART_RATE_VARIABILITY)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_HEART_RATE_VARIABILITY)
-                        .setWritePermission(WRITE_HEART_RATE_VARIABILITY)
-                        .setRecordClass(HeartRateVariabilityRmssdRecord.class)
-                        .setRecordInternalClass(HeartRateVariabilityRmssdRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_HEIGHT)
-                        .setPermissionCategory(HealthPermissionCategory.HEIGHT)
-                        .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
-                        .setReadPermission(READ_HEIGHT)
-                        .setWritePermission(WRITE_HEIGHT)
-                        .setRecordClass(HeightRecord.class)
-                        .setRecordInternalClass(HeightRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_HYDRATION)
-                        .setPermissionCategory(HealthPermissionCategory.HYDRATION)
-                        .setDataCategory(HealthDataCategory.NUTRITION)
-                        .setReadPermission(READ_HYDRATION)
-                        .setWritePermission(WRITE_HYDRATION)
-                        .setRecordClass(HydrationRecord.class)
-                        .setRecordInternalClass(HydrationRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_INTERMENSTRUAL_BLEEDING)
-                        .setPermissionCategory(HealthPermissionCategory.INTERMENSTRUAL_BLEEDING)
-                        .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
-                        .setReadPermission(READ_INTERMENSTRUAL_BLEEDING)
-                        .setWritePermission(WRITE_INTERMENSTRUAL_BLEEDING)
-                        .setRecordClass(IntermenstrualBleedingRecord.class)
-                        .setRecordInternalClass(IntermenstrualBleedingRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_LEAN_BODY_MASS)
-                        .setPermissionCategory(HealthPermissionCategory.LEAN_BODY_MASS)
-                        .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
-                        .setReadPermission(READ_LEAN_BODY_MASS)
-                        .setWritePermission(WRITE_LEAN_BODY_MASS)
-                        .setRecordClass(LeanBodyMassRecord.class)
-                        .setRecordInternalClass(LeanBodyMassRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_MENSTRUATION_FLOW)
-                        .setPermissionCategory(HealthPermissionCategory.MENSTRUATION)
-                        .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
-                        .setReadPermission(READ_MENSTRUATION)
-                        .setWritePermission(WRITE_MENSTRUATION)
-                        .setRecordClass(MenstruationFlowRecord.class)
-                        .setRecordInternalClass(MenstruationFlowRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_MENSTRUATION_PERIOD)
-                        .setPermissionCategory(HealthPermissionCategory.MENSTRUATION)
-                        .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
-                        .setReadPermission(READ_MENSTRUATION)
-                        .setWritePermission(WRITE_MENSTRUATION)
-                        .setRecordClass(MenstruationPeriodRecord.class)
-                        .setRecordInternalClass(MenstruationPeriodRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_MINDFULNESS_SESSION)
-                        .setPermissionCategory(HealthPermissionCategory.MINDFULNESS)
-                        .setDataCategory(HealthDataCategory.WELLNESS)
-                        .setReadPermission(READ_MINDFULNESS)
-                        .setWritePermission(WRITE_MINDFULNESS)
-                        .setRecordClass(MindfulnessSessionRecord.class)
-                        .setRecordInternalClass(MindfulnessSessionRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_NUTRITION)
-                        .setPermissionCategory(HealthPermissionCategory.NUTRITION)
-                        .setDataCategory(HealthDataCategory.NUTRITION)
-                        .setReadPermission(READ_NUTRITION)
-                        .setWritePermission(WRITE_NUTRITION)
-                        .setRecordClass(NutritionRecord.class)
-                        .setRecordInternalClass(NutritionRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_OVULATION_TEST)
-                        .setPermissionCategory(HealthPermissionCategory.OVULATION_TEST)
-                        .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
-                        .setReadPermission(READ_OVULATION_TEST)
-                        .setWritePermission(WRITE_OVULATION_TEST)
-                        .setRecordClass(OvulationTestRecord.class)
-                        .setRecordInternalClass(OvulationTestRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_OXYGEN_SATURATION)
-                        .setPermissionCategory(HealthPermissionCategory.OXYGEN_SATURATION)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_OXYGEN_SATURATION)
-                        .setWritePermission(WRITE_OXYGEN_SATURATION)
-                        .setRecordClass(OxygenSaturationRecord.class)
-                        .setRecordInternalClass(OxygenSaturationRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_PLANNED_EXERCISE_SESSION)
-                        .setPermissionCategory(HealthPermissionCategory.PLANNED_EXERCISE)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_PLANNED_EXERCISE)
-                        .setWritePermission(WRITE_PLANNED_EXERCISE)
-                        .setRecordClass(PlannedExerciseSessionRecord.class)
-                        .setRecordInternalClass(PlannedExerciseSessionRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_POWER)
-                        .setPermissionCategory(HealthPermissionCategory.POWER)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_POWER)
-                        .setWritePermission(WRITE_POWER)
-                        .setRecordClass(PowerRecord.class)
-                        .setRecordInternalClass(PowerRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_RESPIRATORY_RATE)
-                        .setPermissionCategory(HealthPermissionCategory.RESPIRATORY_RATE)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_RESPIRATORY_RATE)
-                        .setWritePermission(WRITE_RESPIRATORY_RATE)
-                        .setRecordClass(RespiratoryRateRecord.class)
-                        .setRecordInternalClass(RespiratoryRateRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_RESTING_HEART_RATE)
-                        .setPermissionCategory(HealthPermissionCategory.RESTING_HEART_RATE)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_RESTING_HEART_RATE)
-                        .setWritePermission(WRITE_RESTING_HEART_RATE)
-                        .setRecordClass(RestingHeartRateRecord.class)
-                        .setRecordInternalClass(RestingHeartRateRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_SEXUAL_ACTIVITY)
-                        .setPermissionCategory(HealthPermissionCategory.SEXUAL_ACTIVITY)
-                        .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
-                        .setReadPermission(READ_SEXUAL_ACTIVITY)
-                        .setWritePermission(WRITE_SEXUAL_ACTIVITY)
-                        .setRecordClass(SexualActivityRecord.class)
-                        .setRecordInternalClass(SexualActivityRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_SKIN_TEMPERATURE)
-                        .setPermissionCategory(HealthPermissionCategory.SKIN_TEMPERATURE)
-                        .setDataCategory(HealthDataCategory.VITALS)
-                        .setReadPermission(READ_SKIN_TEMPERATURE)
-                        .setWritePermission(WRITE_SKIN_TEMPERATURE)
-                        .setRecordClass(SkinTemperatureRecord.class)
-                        .setRecordInternalClass(SkinTemperatureRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_SLEEP_SESSION)
-                        .setPermissionCategory(HealthPermissionCategory.SLEEP)
-                        .setDataCategory(HealthDataCategory.SLEEP)
-                        .setReadPermission(READ_SLEEP)
-                        .setWritePermission(WRITE_SLEEP)
-                        .setRecordClass(SleepSessionRecord.class)
-                        .setRecordInternalClass(SleepSessionRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_SPEED)
-                        .setPermissionCategory(HealthPermissionCategory.SPEED)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_SPEED)
-                        .setWritePermission(WRITE_SPEED)
-                        .setRecordClass(SpeedRecord.class)
-                        .setRecordInternalClass(SpeedRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_STEPS)
-                        .setPermissionCategory(HealthPermissionCategory.STEPS)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_STEPS)
-                        .setWritePermission(WRITE_STEPS)
-                        .setRecordClass(StepsRecord.class)
-                        .setRecordInternalClass(StepsRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_STEPS_CADENCE)
-                        .setPermissionCategory(HealthPermissionCategory.STEPS)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_STEPS)
-                        .setWritePermission(WRITE_STEPS)
-                        .setRecordClass(StepsCadenceRecord.class)
-                        .setRecordInternalClass(StepsCadenceRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_TOTAL_CALORIES_BURNED)
-                        .setPermissionCategory(HealthPermissionCategory.TOTAL_CALORIES_BURNED)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_TOTAL_CALORIES_BURNED)
-                        .setWritePermission(WRITE_TOTAL_CALORIES_BURNED)
-                        .setRecordClass(TotalCaloriesBurnedRecord.class)
-                        .setRecordInternalClass(TotalCaloriesBurnedRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_VO2_MAX)
-                        .setPermissionCategory(HealthPermissionCategory.VO2_MAX)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_VO2_MAX)
-                        .setWritePermission(WRITE_VO2_MAX)
-                        .setRecordClass(Vo2MaxRecord.class)
-                        .setRecordInternalClass(Vo2MaxRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_WEIGHT)
-                        .setPermissionCategory(HealthPermissionCategory.WEIGHT)
-                        .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
-                        .setReadPermission(READ_WEIGHT)
-                        .setWritePermission(WRITE_WEIGHT)
-                        .setRecordClass(WeightRecord.class)
-                        .setRecordInternalClass(WeightRecordInternal.class)
-                        .build(),
-                DataTypeDescriptor.builder()
-                        .setRecordTypeIdentifier(RECORD_TYPE_WHEELCHAIR_PUSHES)
-                        .setPermissionCategory(HealthPermissionCategory.WHEELCHAIR_PUSHES)
-                        .setDataCategory(HealthDataCategory.ACTIVITY)
-                        .setReadPermission(READ_WHEELCHAIR_PUSHES)
-                        .setWritePermission(WRITE_WHEELCHAIR_PUSHES)
-                        .setRecordClass(WheelchairPushesRecord.class)
-                        .setRecordInternalClass(WheelchairPushesRecordInternal.class)
-                        .build());
+        if (!Flags.healthConnectMappings()) {
+            return List.of();
+        }
+
+        return Stream.of(
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_ACTIVE_CALORIES_BURNED)
+                                .setPermissionCategory(
+                                        HealthPermissionCategory.ACTIVE_CALORIES_BURNED)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_ACTIVE_CALORIES_BURNED)
+                                .setWritePermission(WRITE_ACTIVE_CALORIES_BURNED)
+                                .setRecordClass(ActiveCaloriesBurnedRecord.class)
+                                .setRecordInternalClass(ActiveCaloriesBurnedRecordInternal.class)
+                                .build(),
+                        // Redundantly explicitly checking the flag to satisfy the linter.
+                        Flags.activityIntensity() && AconfigFlagHelper.isActivityIntensityEnabled()
+                                ? DataTypeDescriptor.builder()
+                                        .setRecordTypeIdentifier(RECORD_TYPE_ACTIVITY_INTENSITY)
+                                        .setPermissionCategory(
+                                                HealthPermissionCategory.ACTIVITY_INTENSITY)
+                                        .setDataCategory(HealthDataCategory.ACTIVITY)
+                                        .setReadPermission(READ_ACTIVITY_INTENSITY)
+                                        .setWritePermission(WRITE_ACTIVITY_INTENSITY)
+                                        .setRecordClass(ActivityIntensityRecord.class)
+                                        .setRecordInternalClass(
+                                                ActivityIntensityRecordInternal.class)
+                                        .build()
+                                : null,
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_BASAL_BODY_TEMPERATURE)
+                                .setPermissionCategory(
+                                        HealthPermissionCategory.BASAL_BODY_TEMPERATURE)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_BASAL_BODY_TEMPERATURE)
+                                .setWritePermission(WRITE_BASAL_BODY_TEMPERATURE)
+                                .setRecordClass(BasalBodyTemperatureRecord.class)
+                                .setRecordInternalClass(BasalBodyTemperatureRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_BASAL_METABOLIC_RATE)
+                                .setPermissionCategory(
+                                        HealthPermissionCategory.BASAL_METABOLIC_RATE)
+                                .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
+                                .setReadPermission(READ_BASAL_METABOLIC_RATE)
+                                .setWritePermission(WRITE_BASAL_METABOLIC_RATE)
+                                .setRecordClass(BasalMetabolicRateRecord.class)
+                                .setRecordInternalClass(BasalMetabolicRateRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_BLOOD_GLUCOSE)
+                                .setPermissionCategory(HealthPermissionCategory.BLOOD_GLUCOSE)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_BLOOD_GLUCOSE)
+                                .setWritePermission(WRITE_BLOOD_GLUCOSE)
+                                .setRecordClass(BloodGlucoseRecord.class)
+                                .setRecordInternalClass(BloodGlucoseRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_BLOOD_PRESSURE)
+                                .setPermissionCategory(HealthPermissionCategory.BLOOD_PRESSURE)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_BLOOD_PRESSURE)
+                                .setWritePermission(WRITE_BLOOD_PRESSURE)
+                                .setRecordClass(BloodPressureRecord.class)
+                                .setRecordInternalClass(BloodPressureRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_BODY_FAT)
+                                .setPermissionCategory(HealthPermissionCategory.BODY_FAT)
+                                .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
+                                .setReadPermission(READ_BODY_FAT)
+                                .setWritePermission(WRITE_BODY_FAT)
+                                .setRecordClass(BodyFatRecord.class)
+                                .setRecordInternalClass(BodyFatRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_BODY_TEMPERATURE)
+                                .setPermissionCategory(HealthPermissionCategory.BODY_TEMPERATURE)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_BODY_TEMPERATURE)
+                                .setWritePermission(WRITE_BODY_TEMPERATURE)
+                                .setRecordClass(BodyTemperatureRecord.class)
+                                .setRecordInternalClass(BodyTemperatureRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_BODY_WATER_MASS)
+                                .setPermissionCategory(HealthPermissionCategory.BODY_WATER_MASS)
+                                .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
+                                .setReadPermission(READ_BODY_WATER_MASS)
+                                .setWritePermission(WRITE_BODY_WATER_MASS)
+                                .setRecordClass(BodyWaterMassRecord.class)
+                                .setRecordInternalClass(BodyWaterMassRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_BONE_MASS)
+                                .setPermissionCategory(HealthPermissionCategory.BONE_MASS)
+                                .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
+                                .setReadPermission(READ_BONE_MASS)
+                                .setWritePermission(WRITE_BONE_MASS)
+                                .setRecordClass(BoneMassRecord.class)
+                                .setRecordInternalClass(BoneMassRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_CERVICAL_MUCUS)
+                                .setPermissionCategory(HealthPermissionCategory.CERVICAL_MUCUS)
+                                .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
+                                .setReadPermission(READ_CERVICAL_MUCUS)
+                                .setWritePermission(WRITE_CERVICAL_MUCUS)
+                                .setRecordClass(CervicalMucusRecord.class)
+                                .setRecordInternalClass(CervicalMucusRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_CYCLING_PEDALING_CADENCE)
+                                .setPermissionCategory(HealthPermissionCategory.EXERCISE)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_EXERCISE)
+                                .setWritePermission(WRITE_EXERCISE)
+                                .setRecordClass(CyclingPedalingCadenceRecord.class)
+                                .setRecordInternalClass(CyclingPedalingCadenceRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_DISTANCE)
+                                .setPermissionCategory(HealthPermissionCategory.DISTANCE)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_DISTANCE)
+                                .setWritePermission(WRITE_DISTANCE)
+                                .setRecordClass(DistanceRecord.class)
+                                .setRecordInternalClass(DistanceRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_ELEVATION_GAINED)
+                                .setPermissionCategory(HealthPermissionCategory.ELEVATION_GAINED)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_ELEVATION_GAINED)
+                                .setWritePermission(WRITE_ELEVATION_GAINED)
+                                .setRecordClass(ElevationGainedRecord.class)
+                                .setRecordInternalClass(ElevationGainedRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_EXERCISE_SESSION)
+                                .setPermissionCategory(HealthPermissionCategory.EXERCISE)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_EXERCISE)
+                                .setWritePermission(WRITE_EXERCISE)
+                                .setRecordClass(ExerciseSessionRecord.class)
+                                .setRecordInternalClass(ExerciseSessionRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_FLOORS_CLIMBED)
+                                .setPermissionCategory(HealthPermissionCategory.FLOORS_CLIMBED)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_FLOORS_CLIMBED)
+                                .setWritePermission(WRITE_FLOORS_CLIMBED)
+                                .setRecordClass(FloorsClimbedRecord.class)
+                                .setRecordInternalClass(FloorsClimbedRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_HEART_RATE)
+                                .setPermissionCategory(HealthPermissionCategory.HEART_RATE)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_HEART_RATE)
+                                .setWritePermission(WRITE_HEART_RATE)
+                                .setRecordClass(HeartRateRecord.class)
+                                .setRecordInternalClass(HeartRateRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_HEART_RATE_VARIABILITY_RMSSD)
+                                .setPermissionCategory(
+                                        HealthPermissionCategory.HEART_RATE_VARIABILITY)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_HEART_RATE_VARIABILITY)
+                                .setWritePermission(WRITE_HEART_RATE_VARIABILITY)
+                                .setRecordClass(HeartRateVariabilityRmssdRecord.class)
+                                .setRecordInternalClass(
+                                        HeartRateVariabilityRmssdRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_HEIGHT)
+                                .setPermissionCategory(HealthPermissionCategory.HEIGHT)
+                                .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
+                                .setReadPermission(READ_HEIGHT)
+                                .setWritePermission(WRITE_HEIGHT)
+                                .setRecordClass(HeightRecord.class)
+                                .setRecordInternalClass(HeightRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_HYDRATION)
+                                .setPermissionCategory(HealthPermissionCategory.HYDRATION)
+                                .setDataCategory(HealthDataCategory.NUTRITION)
+                                .setReadPermission(READ_HYDRATION)
+                                .setWritePermission(WRITE_HYDRATION)
+                                .setRecordClass(HydrationRecord.class)
+                                .setRecordInternalClass(HydrationRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_INTERMENSTRUAL_BLEEDING)
+                                .setPermissionCategory(
+                                        HealthPermissionCategory.INTERMENSTRUAL_BLEEDING)
+                                .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
+                                .setReadPermission(READ_INTERMENSTRUAL_BLEEDING)
+                                .setWritePermission(WRITE_INTERMENSTRUAL_BLEEDING)
+                                .setRecordClass(IntermenstrualBleedingRecord.class)
+                                .setRecordInternalClass(IntermenstrualBleedingRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_LEAN_BODY_MASS)
+                                .setPermissionCategory(HealthPermissionCategory.LEAN_BODY_MASS)
+                                .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
+                                .setReadPermission(READ_LEAN_BODY_MASS)
+                                .setWritePermission(WRITE_LEAN_BODY_MASS)
+                                .setRecordClass(LeanBodyMassRecord.class)
+                                .setRecordInternalClass(LeanBodyMassRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_MENSTRUATION_FLOW)
+                                .setPermissionCategory(HealthPermissionCategory.MENSTRUATION)
+                                .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
+                                .setReadPermission(READ_MENSTRUATION)
+                                .setWritePermission(WRITE_MENSTRUATION)
+                                .setRecordClass(MenstruationFlowRecord.class)
+                                .setRecordInternalClass(MenstruationFlowRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_MENSTRUATION_PERIOD)
+                                .setPermissionCategory(HealthPermissionCategory.MENSTRUATION)
+                                .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
+                                .setReadPermission(READ_MENSTRUATION)
+                                .setWritePermission(WRITE_MENSTRUATION)
+                                .setRecordClass(MenstruationPeriodRecord.class)
+                                .setRecordInternalClass(MenstruationPeriodRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_MINDFULNESS_SESSION)
+                                .setPermissionCategory(HealthPermissionCategory.MINDFULNESS)
+                                .setDataCategory(HealthDataCategory.WELLNESS)
+                                .setReadPermission(READ_MINDFULNESS)
+                                .setWritePermission(WRITE_MINDFULNESS)
+                                .setRecordClass(MindfulnessSessionRecord.class)
+                                .setRecordInternalClass(MindfulnessSessionRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_NUTRITION)
+                                .setPermissionCategory(HealthPermissionCategory.NUTRITION)
+                                .setDataCategory(HealthDataCategory.NUTRITION)
+                                .setReadPermission(READ_NUTRITION)
+                                .setWritePermission(WRITE_NUTRITION)
+                                .setRecordClass(NutritionRecord.class)
+                                .setRecordInternalClass(NutritionRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_OVULATION_TEST)
+                                .setPermissionCategory(HealthPermissionCategory.OVULATION_TEST)
+                                .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
+                                .setReadPermission(READ_OVULATION_TEST)
+                                .setWritePermission(WRITE_OVULATION_TEST)
+                                .setRecordClass(OvulationTestRecord.class)
+                                .setRecordInternalClass(OvulationTestRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_OXYGEN_SATURATION)
+                                .setPermissionCategory(HealthPermissionCategory.OXYGEN_SATURATION)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_OXYGEN_SATURATION)
+                                .setWritePermission(WRITE_OXYGEN_SATURATION)
+                                .setRecordClass(OxygenSaturationRecord.class)
+                                .setRecordInternalClass(OxygenSaturationRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_PLANNED_EXERCISE_SESSION)
+                                .setPermissionCategory(HealthPermissionCategory.PLANNED_EXERCISE)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_PLANNED_EXERCISE)
+                                .setWritePermission(WRITE_PLANNED_EXERCISE)
+                                .setRecordClass(PlannedExerciseSessionRecord.class)
+                                .setRecordInternalClass(PlannedExerciseSessionRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_POWER)
+                                .setPermissionCategory(HealthPermissionCategory.POWER)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_POWER)
+                                .setWritePermission(WRITE_POWER)
+                                .setRecordClass(PowerRecord.class)
+                                .setRecordInternalClass(PowerRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_RESPIRATORY_RATE)
+                                .setPermissionCategory(HealthPermissionCategory.RESPIRATORY_RATE)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_RESPIRATORY_RATE)
+                                .setWritePermission(WRITE_RESPIRATORY_RATE)
+                                .setRecordClass(RespiratoryRateRecord.class)
+                                .setRecordInternalClass(RespiratoryRateRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_RESTING_HEART_RATE)
+                                .setPermissionCategory(HealthPermissionCategory.RESTING_HEART_RATE)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_RESTING_HEART_RATE)
+                                .setWritePermission(WRITE_RESTING_HEART_RATE)
+                                .setRecordClass(RestingHeartRateRecord.class)
+                                .setRecordInternalClass(RestingHeartRateRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_SEXUAL_ACTIVITY)
+                                .setPermissionCategory(HealthPermissionCategory.SEXUAL_ACTIVITY)
+                                .setDataCategory(HealthDataCategory.CYCLE_TRACKING)
+                                .setReadPermission(READ_SEXUAL_ACTIVITY)
+                                .setWritePermission(WRITE_SEXUAL_ACTIVITY)
+                                .setRecordClass(SexualActivityRecord.class)
+                                .setRecordInternalClass(SexualActivityRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_SKIN_TEMPERATURE)
+                                .setPermissionCategory(HealthPermissionCategory.SKIN_TEMPERATURE)
+                                .setDataCategory(HealthDataCategory.VITALS)
+                                .setReadPermission(READ_SKIN_TEMPERATURE)
+                                .setWritePermission(WRITE_SKIN_TEMPERATURE)
+                                .setRecordClass(SkinTemperatureRecord.class)
+                                .setRecordInternalClass(SkinTemperatureRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_SLEEP_SESSION)
+                                .setPermissionCategory(HealthPermissionCategory.SLEEP)
+                                .setDataCategory(HealthDataCategory.SLEEP)
+                                .setReadPermission(READ_SLEEP)
+                                .setWritePermission(WRITE_SLEEP)
+                                .setRecordClass(SleepSessionRecord.class)
+                                .setRecordInternalClass(SleepSessionRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_SPEED)
+                                .setPermissionCategory(HealthPermissionCategory.SPEED)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_SPEED)
+                                .setWritePermission(WRITE_SPEED)
+                                .setRecordClass(SpeedRecord.class)
+                                .setRecordInternalClass(SpeedRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_STEPS)
+                                .setPermissionCategory(HealthPermissionCategory.STEPS)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_STEPS)
+                                .setWritePermission(WRITE_STEPS)
+                                .setRecordClass(StepsRecord.class)
+                                .setRecordInternalClass(StepsRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_STEPS_CADENCE)
+                                .setPermissionCategory(HealthPermissionCategory.STEPS)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_STEPS)
+                                .setWritePermission(WRITE_STEPS)
+                                .setRecordClass(StepsCadenceRecord.class)
+                                .setRecordInternalClass(StepsCadenceRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_TOTAL_CALORIES_BURNED)
+                                .setPermissionCategory(
+                                        HealthPermissionCategory.TOTAL_CALORIES_BURNED)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_TOTAL_CALORIES_BURNED)
+                                .setWritePermission(WRITE_TOTAL_CALORIES_BURNED)
+                                .setRecordClass(TotalCaloriesBurnedRecord.class)
+                                .setRecordInternalClass(TotalCaloriesBurnedRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_VO2_MAX)
+                                .setPermissionCategory(HealthPermissionCategory.VO2_MAX)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_VO2_MAX)
+                                .setWritePermission(WRITE_VO2_MAX)
+                                .setRecordClass(Vo2MaxRecord.class)
+                                .setRecordInternalClass(Vo2MaxRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_WEIGHT)
+                                .setPermissionCategory(HealthPermissionCategory.WEIGHT)
+                                .setDataCategory(HealthDataCategory.BODY_MEASUREMENTS)
+                                .setReadPermission(READ_WEIGHT)
+                                .setWritePermission(WRITE_WEIGHT)
+                                .setRecordClass(WeightRecord.class)
+                                .setRecordInternalClass(WeightRecordInternal.class)
+                                .build(),
+                        DataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_WHEELCHAIR_PUSHES)
+                                .setPermissionCategory(HealthPermissionCategory.WHEELCHAIR_PUSHES)
+                                .setDataCategory(HealthDataCategory.ACTIVITY)
+                                .setReadPermission(READ_WHEELCHAIR_PUSHES)
+                                .setWritePermission(WRITE_WHEELCHAIR_PUSHES)
+                                .setRecordClass(WheelchairPushesRecord.class)
+                                .setRecordInternalClass(WheelchairPushesRecordInternal.class)
+                                .build())
+                .filter(Objects::nonNull)
+                .toList();
     }
 }
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/FhirResourceTypeStringToIntMapper.java b/framework/java/android/health/connect/internal/datatypes/utils/FhirResourceTypeStringToIntMapper.java
index 6a0a9e8..5253b4e 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/FhirResourceTypeStringToIntMapper.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/FhirResourceTypeStringToIntMapper.java
@@ -37,10 +37,18 @@
     private static final String FHIR_RESOURCE_TYPE_MEDICATION_STR = "MEDICATION";
     private static final String FHIR_RESOURCE_TYPE_MEDICATION_REQUEST_STR = "MEDICATIONREQUEST";
     private static final String FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT_STR = "MEDICATIONSTATEMENT";
+    private static final String FHIR_RESOURCE_TYPE_PATIENT_STR = "PATIENT";
+    private static final String FHIR_RESOURCE_TYPE_PRACTITIONER_STR = "PRACTITIONER";
+    private static final String FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE_STR = "PRACTITIONERROLE";
+    private static final String FHIR_RESOURCE_TYPE_ENCOUNTER_STR = "ENCOUNTER";
+    private static final String FHIR_RESOURCE_TYPE_LOCATION_STR = "LOCATION";
+    private static final String FHIR_RESOURCE_TYPE_ORGANIZATION_STR = "ORGANIZATION";
 
     /**
      * Returns the corresponding {@code IntDef} {@link FhirResourceType} from a {@code String}
      * {@code fhirResourceType}.
+     *
+     * @throws IllegalArgumentException if the type is not supported.
      */
     @FhirResourceType
     public static int getFhirResourceTypeInt(@NonNull String fhirResourceType) {
@@ -50,8 +58,14 @@
 
         populateFhirResourceTypeStringToIntMap();
 
-        return sFhirResourceTypeStringToIntMap.getOrDefault(
-                fhirResourceType.toUpperCase(Locale.ROOT), FhirResource.FHIR_RESOURCE_TYPE_UNKNOWN);
+        Integer fhirResourceTypeInt =
+                sFhirResourceTypeStringToIntMap.get(fhirResourceType.toUpperCase(Locale.ROOT));
+        if (fhirResourceTypeInt == null) {
+            throw new IllegalArgumentException(
+                    "Unsupported FHIR resource type: " + fhirResourceType);
+        }
+
+        return fhirResourceTypeInt;
     }
 
     @SuppressWarnings("FlaggedApi") // Initial if statement checks flag, but lint can't know that
@@ -84,5 +98,18 @@
         sFhirResourceTypeStringToIntMap.put(
                 FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT_STR,
                 FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT);
+        sFhirResourceTypeStringToIntMap.put(
+                FHIR_RESOURCE_TYPE_PATIENT_STR, FhirResource.FHIR_RESOURCE_TYPE_PATIENT);
+        sFhirResourceTypeStringToIntMap.put(
+                FHIR_RESOURCE_TYPE_PRACTITIONER_STR, FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER);
+        sFhirResourceTypeStringToIntMap.put(
+                FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE_STR,
+                FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE);
+        sFhirResourceTypeStringToIntMap.put(
+                FHIR_RESOURCE_TYPE_ENCOUNTER_STR, FhirResource.FHIR_RESOURCE_TYPE_ENCOUNTER);
+        sFhirResourceTypeStringToIntMap.put(
+                FHIR_RESOURCE_TYPE_LOCATION_STR, FhirResource.FHIR_RESOURCE_TYPE_LOCATION);
+        sFhirResourceTypeStringToIntMap.put(
+                FHIR_RESOURCE_TYPE_ORGANIZATION_STR, FhirResource.FHIR_RESOURCE_TYPE_ORGANIZATION);
     }
 }
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/HealthConnectMappings.java b/framework/java/android/health/connect/internal/datatypes/utils/HealthConnectMappings.java
index ad9f834..a2a70b3 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/HealthConnectMappings.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/HealthConnectMappings.java
@@ -33,6 +33,7 @@
 import android.util.ArraySet;
 
 import com.android.healthfitness.flags.Flags;
+import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.Collection;
 import java.util.List;
@@ -57,56 +58,100 @@
 
     private final RecordMapper mRecordMapper = RecordMapper.getInstance();
 
+    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
+    private static volatile HealthConnectMappings sHealthConnectMappings;
+
+    /** Exists for compatibility with classes which don't support injections yet. */
+    // TODO(b/353283052): inject where possible instead of using the singleton.
+    public static HealthConnectMappings getInstance() {
+        if (sHealthConnectMappings == null) {
+            sHealthConnectMappings = new HealthConnectMappings();
+        }
+        return sHealthConnectMappings;
+    }
+
+    /**
+     * Resets the singleton instance.
+     *
+     * <p>Useful for unit tests where flag values might change between test cases.
+     */
+    @VisibleForTesting
+    public static void resetInstanceForTesting() {
+        sHealthConnectMappings = new HealthConnectMappings();
+    }
+
+    /**
+     * Use {@link #getInstance()} to avoid creating multiple instances until it gets migrated off.
+     */
+    @VisibleForTesting
     public HealthConnectMappings() {
         var dataTypeDescriptors = DataTypeDescriptors.getAllDataTypeDescriptors();
 
         mRecordIdToDescriptorMap =
-                toArrayMap(
-                        dataTypeDescriptors,
-                        DataTypeDescriptor::getRecordTypeIdentifier,
-                        Function.identity());
+                Flags.healthConnectMappings()
+                        ? toArrayMap(
+                                dataTypeDescriptors,
+                                DataTypeDescriptor::getRecordTypeIdentifier,
+                                Function.identity())
+                        : new ArrayMap<>();
 
         mPermissionCategoryToReadPermissionMap =
-                toArrayMap(
-                        dataTypeDescriptors,
-                        DataTypeDescriptor::getPermissionCategory,
-                        DataTypeDescriptor::getReadPermission);
+                Flags.healthConnectMappings()
+                        ? toArrayMap(
+                                dataTypeDescriptors,
+                                DataTypeDescriptor::getPermissionCategory,
+                                DataTypeDescriptor::getReadPermission)
+                        : new ArrayMap<>();
 
         mPermissionCategoryToWritePermissionMap =
-                toArrayMap(
-                        dataTypeDescriptors,
-                        DataTypeDescriptor::getPermissionCategory,
-                        DataTypeDescriptor::getWritePermission);
+                Flags.healthConnectMappings()
+                        ? toArrayMap(
+                                dataTypeDescriptors,
+                                DataTypeDescriptor::getPermissionCategory,
+                                DataTypeDescriptor::getWritePermission)
+                        : new ArrayMap<>();
 
         mWritePermissionToDataCategoryMap =
-                toArrayMap(
-                        dataTypeDescriptors,
-                        DataTypeDescriptor::getWritePermission,
-                        DataTypeDescriptor::getDataCategory);
+                Flags.healthConnectMappings()
+                        ? toArrayMap(
+                                dataTypeDescriptors,
+                                DataTypeDescriptor::getWritePermission,
+                                DataTypeDescriptor::getDataCategory)
+                        : new ArrayMap<>();
 
         mDataCategoryToWritePermissionsMap =
-                getDataCategoryToWritePermissionsMap(dataTypeDescriptors);
+                Flags.healthConnectMappings()
+                        ? getDataCategoryToWritePermissionsMap(dataTypeDescriptors)
+                        : new ArrayMap<>();
 
         mRecordIdToInternalRecordClassMap =
-                toArrayMap(
-                        dataTypeDescriptors,
-                        DataTypeDescriptor::getRecordTypeIdentifier,
-                        DataTypeDescriptor::getRecordInternalClass);
+                Flags.healthConnectMappings()
+                        ? toArrayMap(
+                                dataTypeDescriptors,
+                                DataTypeDescriptor::getRecordTypeIdentifier,
+                                DataTypeDescriptor::getRecordInternalClass)
+                        : new ArrayMap<>();
 
         mRecordIdToRecordClassMap =
-                toArrayMap(
-                        dataTypeDescriptors,
-                        DataTypeDescriptor::getRecordTypeIdentifier,
-                        DataTypeDescriptor::getRecordClass);
+                Flags.healthConnectMappings()
+                        ? toArrayMap(
+                                dataTypeDescriptors,
+                                DataTypeDescriptor::getRecordTypeIdentifier,
+                                DataTypeDescriptor::getRecordClass)
+                        : new ArrayMap<>();
 
         mRecordClassToRecordIdMap =
-                toArrayMap(
-                        dataTypeDescriptors,
-                        DataTypeDescriptor::getRecordClass,
-                        DataTypeDescriptor::getRecordTypeIdentifier);
+                Flags.healthConnectMappings()
+                        ? toArrayMap(
+                                dataTypeDescriptors,
+                                DataTypeDescriptor::getRecordClass,
+                                DataTypeDescriptor::getRecordTypeIdentifier)
+                        : new ArrayMap<>();
 
         mHealthDataCategories =
-                toArraySet(dataTypeDescriptors, DataTypeDescriptor::getDataCategory);
+                Flags.healthConnectMappings()
+                        ? toArraySet(dataTypeDescriptors, DataTypeDescriptor::getDataCategory)
+                        : new ArraySet<>();
     }
 
     /**
@@ -205,7 +250,7 @@
     /** Returns record type id for give record class. */
     @RecordTypeIdentifier.RecordType
     public int getRecordType(Class<? extends Record> recordClass) {
-        if (Flags.healthConnectMappings()) {
+        if (!Flags.healthConnectMappings()) {
             return mRecordMapper.getRecordType(recordClass);
         }
 
@@ -252,7 +297,7 @@
     /** Returns a set of all supported data categories. */
     public Set<Integer> getAllHealthDataCategories() {
         if (!Flags.healthConnectMappings()) {
-            List.of(
+            return Set.of(
                     HealthDataCategory.ACTIVITY,
                     HealthDataCategory.BODY_MEASUREMENTS,
                     HealthDataCategory.CYCLE_TRACKING,
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/InternalExternalRecordConverter.java b/framework/java/android/health/connect/internal/datatypes/utils/InternalExternalRecordConverter.java
index 27ad129..f2c065e 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/InternalExternalRecordConverter.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/InternalExternalRecordConverter.java
@@ -40,14 +40,11 @@
 
     private final Map<Integer, Class<? extends RecordInternal<?>>>
             mRecordIdToInternalRecordClassMap;
-    private final Map<Integer, Class<? extends Record>> mRecordIdToExternalRecordClassMap;
 
     private InternalExternalRecordConverter() {
         // Add any new data type here to facilitate its conversion.
         mRecordIdToInternalRecordClassMap =
-                RecordMapper.getInstance().getRecordIdToInternalRecordClassMap();
-        mRecordIdToExternalRecordClassMap =
-                RecordMapper.getInstance().getRecordIdToExternalRecordClassMap();
+                HealthConnectMappings.getInstance().getRecordIdToInternalRecordClassMap();
     }
 
     @NonNull
@@ -86,7 +83,7 @@
 
         for (RecordInternal<?> recordInternal : recordInternals) {
             try {
-            externalRecordList.add(recordInternal.toExternalRecord());
+                externalRecordList.add(recordInternal.toExternalRecord());
             } catch (IllegalArgumentException illegalArgumentException) {
                 if (!illegalArgumentException
                         .getMessage()
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/MedicalResourceTypePermissionMapper.java b/framework/java/android/health/connect/internal/datatypes/utils/MedicalResourceTypePermissionMapper.java
index f003814..b0a4ea5 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/MedicalResourceTypePermissionMapper.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/MedicalResourceTypePermissionMapper.java
@@ -16,14 +16,17 @@
 
 package android.health.connect.internal.datatypes.utils;
 
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROBLEMS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
 
 import static com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled;
@@ -57,26 +60,33 @@
 
         // Populate sMedicalResourceTypeToReadPermissionMap.
         sMedicalResourceTypeToReadPermissionMap.put(
-                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE);
+                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES);
         sMedicalResourceTypeToReadPermissionMap.put(
-                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION);
+                MEDICAL_RESOURCE_TYPE_CONDITIONS, HealthPermissions.READ_MEDICAL_DATA_CONDITIONS);
         sMedicalResourceTypeToReadPermissionMap.put(
                 MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
                 HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS);
         sMedicalResourceTypeToReadPermissionMap.put(
-                MEDICAL_RESOURCE_TYPE_PREGNANCY, HealthPermissions.READ_MEDICAL_DATA_PREGNANCY);
-        sMedicalResourceTypeToReadPermissionMap.put(
                 MEDICAL_RESOURCE_TYPE_MEDICATIONS, HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS);
         sMedicalResourceTypeToReadPermissionMap.put(
-                MEDICAL_RESOURCE_TYPE_PROBLEMS, HealthPermissions.READ_MEDICAL_DATA_PROBLEMS);
+                MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS,
+                HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS);
+        sMedicalResourceTypeToReadPermissionMap.put(
+                MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS,
+                HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS);
+        sMedicalResourceTypeToReadPermissionMap.put(
+                MEDICAL_RESOURCE_TYPE_PREGNANCY, HealthPermissions.READ_MEDICAL_DATA_PREGNANCY);
         sMedicalResourceTypeToReadPermissionMap.put(
                 MEDICAL_RESOURCE_TYPE_PROCEDURES, HealthPermissions.READ_MEDICAL_DATA_PROCEDURES);
         sMedicalResourceTypeToReadPermissionMap.put(
                 MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY,
                 HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY);
         sMedicalResourceTypeToReadPermissionMap.put(
+                MEDICAL_RESOURCE_TYPE_VACCINES, HealthPermissions.READ_MEDICAL_DATA_VACCINES);
+        sMedicalResourceTypeToReadPermissionMap.put(
+                MEDICAL_RESOURCE_TYPE_VISITS, HealthPermissions.READ_MEDICAL_DATA_VISITS);
+        sMedicalResourceTypeToReadPermissionMap.put(
                 MEDICAL_RESOURCE_TYPE_VITAL_SIGNS, HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS);
 
         // Populate sMedicalResourceTypeToReadPermissionMap.
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/ParcelRecordConverter.java b/framework/java/android/health/connect/internal/datatypes/utils/ParcelRecordConverter.java
index d7c8791..08937a6 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/ParcelRecordConverter.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/ParcelRecordConverter.java
@@ -38,7 +38,8 @@
 
     private ParcelRecordConverter() {
         // Add any new data type here to facilitate its conversion.
-        mDataTypeClassMap = RecordMapper.getInstance().getRecordIdToInternalRecordClassMap();
+        mDataTypeClassMap =
+                HealthConnectMappings.getInstance().getRecordIdToInternalRecordClassMap();
     }
 
     @NonNull
@@ -54,7 +55,9 @@
     @NonNull
     public RecordInternal<?> getRecord(
             @NonNull Parcel parcel, @RecordTypeIdentifier.RecordType int type)
-            throws InstantiationException, IllegalAccessException, NoSuchMethodException,
+            throws InstantiationException,
+                    IllegalAccessException,
+                    NoSuchMethodException,
                     InvocationTargetException {
         Class<? extends RecordInternal<?>> recordClass = mDataTypeClassMap.get(type);
         Objects.requireNonNull(recordClass);
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/RecordMapper.java b/framework/java/android/health/connect/internal/datatypes/utils/RecordMapper.java
index 04ef596..f2f3f59 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/RecordMapper.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/RecordMapper.java
@@ -104,9 +104,14 @@
 import android.health.connect.internal.datatypes.WheelchairPushesRecordInternal;
 import android.util.ArrayMap;
 
+import java.util.LinkedHashMap;
 import java.util.Map;
 
-/** @hide */
+/**
+ * @deprecated Use {@link HealthConnectMappings}
+ * @hide
+ */
+@Deprecated
 public final class RecordMapper {
     private static final int NUM_ENTRIES = 35;
 
@@ -119,7 +124,9 @@
     private final Map<Class<? extends Record>, Integer> mExternalRecordClassToRecordIdMap;
 
     private RecordMapper() {
-        mRecordIdToInternalRecordClassMap = new ArrayMap<>(NUM_ENTRIES);
+        // Use LinkedHashMap to guarantee the order of different records types when reading data for
+        // backup & restore.
+        mRecordIdToInternalRecordClassMap = new LinkedHashMap<>(NUM_ENTRIES);
         mRecordIdToInternalRecordClassMap.put(
                 RecordTypeIdentifier.RECORD_TYPE_STEPS, StepsRecordInternal.class);
         mRecordIdToInternalRecordClassMap.put(
@@ -214,12 +221,12 @@
         mRecordIdToInternalRecordClassMap.put(
                 RecordTypeIdentifier.RECORD_TYPE_LEAN_BODY_MASS, LeanBodyMassRecordInternal.class);
         mRecordIdToInternalRecordClassMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION,
-                ExerciseSessionRecordInternal.class);
-        mRecordIdToInternalRecordClassMap.put(
                 RecordTypeIdentifier.RECORD_TYPE_PLANNED_EXERCISE_SESSION,
                 PlannedExerciseSessionRecordInternal.class);
         mRecordIdToInternalRecordClassMap.put(
+                RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION,
+                ExerciseSessionRecordInternal.class);
+        mRecordIdToInternalRecordClassMap.put(
                 RecordTypeIdentifier.RECORD_TYPE_SLEEP_SESSION, SleepSessionRecordInternal.class);
         mRecordIdToInternalRecordClassMap.put(
                 RecordTypeIdentifier.RECORD_TYPE_SKIN_TEMPERATURE,
@@ -341,23 +348,40 @@
         return sRecordMapper;
     }
 
+    /**
+     * @deprecated {@link HealthConnectMappings#getRecordIdToInternalRecordClassMap()}
+     */
+    @Deprecated
     @NonNull
     public Map<Integer, Class<? extends RecordInternal<?>>> getRecordIdToInternalRecordClassMap() {
         return mRecordIdToInternalRecordClassMap;
     }
 
+    /**
+     * @deprecated {@link HealthConnectMappings#getRecordIdToExternalRecordClassMap()}
+     */
+    @Deprecated
     @NonNull
     public Map<Integer, Class<? extends Record>> getRecordIdToExternalRecordClassMap() {
         return mRecordIdToExternalRecordClassMap;
     }
 
+    /**
+     * @deprecated {@link HealthConnectMappings#getRecordType(Class)}
+     */
     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
+    @Deprecated
     @RecordTypeIdentifier.RecordType
     public int getRecordType(Class<? extends Record> recordClass) {
         return mExternalRecordClassToRecordIdMap.get(recordClass);
     }
 
-    /** Checks whether the given {@code recordClass} can be mapped. */
+    /**
+     * Checks whether the given {@code recordClass} can be mapped.
+     *
+     * @deprecated Use {@link HealthConnectMappings#hasRecordType(Class)}
+     */
+    @Deprecated
     public boolean hasRecordType(Class<? extends Record> recordClass) {
         return mExternalRecordClassToRecordIdMap.containsKey(recordClass);
     }
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/RecordTypePermissionCategoryMapper.java b/framework/java/android/health/connect/internal/datatypes/utils/RecordTypePermissionCategoryMapper.java
index ec7e282..405afa3 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/RecordTypePermissionCategoryMapper.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/RecordTypePermissionCategoryMapper.java
@@ -153,7 +153,11 @@
                 };
     }
 
-    /** Returns {@link HealthDataCategory} for the input {@link RecordTypeIdentifier.RecordType}. */
+    /**
+     * Returns {@link HealthDataCategory} for the input {@link RecordTypeIdentifier.RecordType}.
+     *
+     * @deprecated Use {@link HealthConnectMappings#getHealthPermissionCategoryForRecordType(int)}.
+     */
     @SuppressLint("LongLogTag")
     @HealthPermissionCategory.Type
     public static int getHealthPermissionCategoryForRecordType(
diff --git a/framework/java/android/health/connect/internal/datatypes/utils/RecordTypeRecordCategoryMapper.java b/framework/java/android/health/connect/internal/datatypes/utils/RecordTypeRecordCategoryMapper.java
index e23e02b..e0db63d 100644
--- a/framework/java/android/health/connect/internal/datatypes/utils/RecordTypeRecordCategoryMapper.java
+++ b/framework/java/android/health/connect/internal/datatypes/utils/RecordTypeRecordCategoryMapper.java
@@ -128,8 +128,13 @@
                 };
     }
 
-    /** Returns {@link HealthDataCategory} for the input {@link RecordTypeIdentifier.RecordType}. */
+    /**
+     * Returns {@link HealthDataCategory} for the input {@link RecordTypeIdentifier.RecordType}.
+     *
+     * @deprecated Use {@link HealthConnectMappings#getRecordCategoryForRecordType(int)}
+     */
     @SuppressLint("LongLogTag")
+    @Deprecated
     @HealthDataCategory.Type
     public static int getRecordCategoryForRecordType(
             @RecordTypeIdentifier.RecordType int recordType) {
diff --git a/framework/java/android/health/connect/ratelimiter/Quota.java b/framework/java/android/health/connect/ratelimiter/Quota.java
index 21f5a4c..d285140 100644
--- a/framework/java/android/health/connect/ratelimiter/Quota.java
+++ b/framework/java/android/health/connect/ratelimiter/Quota.java
@@ -16,11 +16,6 @@
 
 package android.health.connect.ratelimiter;
 
-import android.annotation.NonNull;
-
-import java.time.Instant;
-import java.util.Objects;
-
 /**
  * Object to store the last update time and remaining quota for quota buckets as used in {@link
  * RateLimiter}.
@@ -28,27 +23,24 @@
  * @hide
  */
 public final class Quota {
-    private Instant mLastUpdatedTime;
+    private long mLastUpdatedTimeMillis;
     private float mRemainingQuota;
 
-    public Quota(@NonNull Instant lastUpdatedTime, float remainingQuota) {
-        Objects.requireNonNull(lastUpdatedTime);
-
-        mLastUpdatedTime = lastUpdatedTime;
+    public Quota(long lastUpdatedTimeMillis, float remainingQuota) {
+        mLastUpdatedTimeMillis = lastUpdatedTimeMillis;
         mRemainingQuota = remainingQuota;
     }
 
-    @NonNull
-    public Instant getLastUpdatedTime() {
-        return mLastUpdatedTime;
+    public long getLastUpdatedTimeMillis() {
+        return mLastUpdatedTimeMillis;
     }
 
     public float getRemainingQuota() {
         return mRemainingQuota;
     }
 
-    public void setLastUpdatedTime(Instant lastUpdatedTime) {
-        mLastUpdatedTime = lastUpdatedTime;
+    public void setLastUpdatedTimeMillis(long lastUpdatedTimeMillis) {
+        mLastUpdatedTimeMillis = lastUpdatedTimeMillis;
     }
 
     public void setRemainingQuota(Float remainingQuota) {
diff --git a/framework/java/android/health/connect/ratelimiter/RateLimiter.java b/framework/java/android/health/connect/ratelimiter/RateLimiter.java
index 1b9ecea..15105f6 100644
--- a/framework/java/android/health/connect/ratelimiter/RateLimiter.java
+++ b/framework/java/android/health/connect/ratelimiter/RateLimiter.java
@@ -18,13 +18,11 @@
 
 import android.annotation.IntDef;
 import android.health.connect.HealthConnectException;
-
-import com.android.internal.annotations.GuardedBy;
+import android.os.SystemClock;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.time.Duration;
-import java.time.Instant;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -58,10 +56,6 @@
             new HashMap<>();
     private static final Map<String, Integer> QUOTA_BUCKET_TO_MAX_MEMORY_QUOTA_MAP =
             new HashMap<>();
-    private static final ReentrantReadWriteLock sLock = new ReentrantReadWriteLock();
-
-    @GuardedBy("sLock")
-    private static boolean sRateLimiterEnabled;
 
     public static final int QUOTA_BUCKET_READS_PER_15M_FOREGROUND_DEFAULT_FLAG_VALUE = 2000;
     public static final int QUOTA_BUCKET_READS_PER_24H_FOREGROUND_DEFAULT_FLAG_VALUE = 16000;
@@ -131,14 +125,6 @@
 
     public static void tryAcquireApiCallQuota(
             int uid, @QuotaCategory.Type int quotaCategory, boolean isInForeground) {
-        sLock.readLock().lock();
-        try {
-            if (!sRateLimiterEnabled) {
-                return;
-            }
-        } finally {
-            sLock.readLock().unlock();
-        }
         if (quotaCategory == QuotaCategory.QUOTA_CATEGORY_UNDEFINED) {
             throw new IllegalArgumentException("Quota category not defined.");
         }
@@ -161,14 +147,6 @@
             @QuotaCategory.Type int quotaCategory,
             boolean isInForeground,
             long memoryCost) {
-        sLock.readLock().lock();
-        try {
-            if (!sRateLimiterEnabled) {
-                return;
-            }
-        } finally {
-            sLock.readLock().unlock();
-        }
         if (quotaCategory == QuotaCategory.QUOTA_CATEGORY_UNDEFINED) {
             throw new IllegalArgumentException("Quota category not defined.");
         }
@@ -197,14 +175,6 @@
     }
 
     public static void checkMaxChunkMemoryUsage(long memoryCost) {
-        sLock.readLock().lock();
-        try {
-            if (!sRateLimiterEnabled) {
-                return;
-            }
-        } finally {
-            sLock.readLock().unlock();
-        }
         long memoryLimit = getConfiguredMaxApiMemoryQuota(CHUNK_SIZE_LIMIT_IN_BYTES);
         if (memoryCost > memoryLimit) {
             throw new HealthConnectException(
@@ -217,14 +187,6 @@
     }
 
     public static void checkMaxRecordMemoryUsage(long memoryCost) {
-        sLock.readLock().lock();
-        try {
-            if (!sRateLimiterEnabled) {
-                return;
-            }
-        } finally {
-            sLock.readLock().unlock();
-        }
         long memoryLimit = getConfiguredMaxApiMemoryQuota(RECORD_SIZE_LIMIT_IN_BYTES);
         if (memoryCost > memoryLimit) {
             throw new HealthConnectException(
@@ -241,15 +203,6 @@
         sQuotaBucketToAcrossAppsRemainingMemoryQuota.clear();
     }
 
-    public static void updateEnableRateLimiterFlag(boolean enableRateLimiter) {
-        sLock.writeLock().lock();
-        try {
-            sRateLimiterEnabled = enableRateLimiter;
-        } finally {
-            sLock.writeLock().unlock();
-        }
-    }
-
     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     private static Object getLockObject(int uid) {
         sLocks.putIfAbsent(uid, uid);
@@ -309,7 +262,7 @@
 
     private static void spendAvailableResources(Quota quota, Integer quotaBucket, long memoryCost) {
         quota.setRemainingQuota(getAvailableQuota(quotaBucket, quota) - memoryCost);
-        quota.setLastUpdatedTime(Instant.now());
+        quota.setLastUpdatedTimeMillis(SystemClock.elapsedRealtime());
     }
 
     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
@@ -328,7 +281,11 @@
             int uid, @QuotaBucket.Type int quotaBucket, float availableQuota, long cost) {
         sUserIdToQuotasMap
                 .get(uid)
-                .put(quotaBucket, new Quota(Instant.now(), availableQuota - cost));
+                .put(
+                        quotaBucket,
+                        new Quota(
+                                /* lastUpdatedTimeMillis= */ SystemClock.elapsedRealtime(),
+                                availableQuota - cost));
     }
 
     private static Map<Integer, Float> getQuotaBucketToAvailableQuotaMap(
@@ -356,12 +313,12 @@
     }
 
     private static float getAvailableQuota(@QuotaBucket.Type int quotaBucket, Quota quota) {
-        Instant lastUpdatedTime = quota.getLastUpdatedTime();
-        Instant currentTime = Instant.now();
-        Duration timeSinceLastQuotaSpend = Duration.between(lastUpdatedTime, currentTime);
+        long lastUpdatedTimeMillis = quota.getLastUpdatedTimeMillis();
+        long currentTimeMillis = SystemClock.elapsedRealtime();
+        long timeSinceLastQuotaSpendMillis = currentTimeMillis - lastUpdatedTimeMillis;
         Duration window = getWindowDuration(quotaBucket);
         float accumulated =
-                timeSinceLastQuotaSpend.toMillis()
+                timeSinceLastQuotaSpendMillis
                         * (getConfiguredMaxRollingQuota(quotaBucket) / (float) window.toMillis());
         // Cannot accumulate more than the configured max quota.
         return Math.min(
@@ -386,13 +343,17 @@
         if (!sQuotaBucketToAcrossAppsRemainingMemoryQuota.containsKey(quotaBucket)) {
             sQuotaBucketToAcrossAppsRemainingMemoryQuota.put(
                     quotaBucket,
-                    new Quota(Instant.now(), getConfiguredMaxRollingQuota(quotaBucket)));
+                    new Quota(
+                            /* lastUpdatedTimeMillis= */ SystemClock.elapsedRealtime(),
+                            getConfiguredMaxRollingQuota(quotaBucket)));
         }
         return sQuotaBucketToAcrossAppsRemainingMemoryQuota.get(quotaBucket);
     }
 
     private static Quota getInitialQuota(@QuotaBucket.Type int bucket) {
-        return new Quota(Instant.now(), getConfiguredMaxRollingQuota(bucket));
+        return new Quota(
+                /* lastUpdatedTimeMillis= */ SystemClock.elapsedRealtime(),
+                getConfiguredMaxRollingQuota(bucket));
     }
 
     private static Duration getWindowDuration(@QuotaBucket.Type int quotaBucket) {
diff --git a/service/Android.bp b/service/Android.bp
index a4643cb..f2137c0 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -53,6 +53,7 @@
     ],
     static_libs: [
         "modules-utils-backgroundthread",
+        "fhirspec-java-proto-lite",
     ],
     jarjar_rules: "jarjar-rules.txt",
     installable: true,
@@ -75,4 +76,8 @@
             "-XepOpt:NullAway:AnnotatedPackages=com.android.server.healthconnect",
         ],
     },
+    java_resources: select(release_flag("RELEASE_HC_PHR_FHIR_STRUCTURAL_VALIDATION"), {
+        true: [":generate-fhir-spec-r4-binarypb"],
+        default: [],
+    }),
 }
diff --git a/service/jarjar-rules.txt b/service/jarjar-rules.txt
index e51e75f..7d77d8a 100644
--- a/service/jarjar-rules.txt
+++ b/service/jarjar-rules.txt
@@ -1 +1,2 @@
 rule com.android.modules.utils.** com.android.server.healthconnect.jarjar.modules.utils.@1
+rule com.google.protobuf.** com.android.server.healthconnect.jarjar.protobuf.@1
diff --git a/service/java/com/android/server/healthconnect/HealthConnectDailyJobs.java b/service/java/com/android/server/healthconnect/HealthConnectDailyJobs.java
index 013829c..eb0d212 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectDailyJobs.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectDailyJobs.java
@@ -16,14 +16,10 @@
 
 package com.android.server.healthconnect;
 
-import static android.health.connect.Constants.DEFAULT_INT;
-
 import static com.android.server.healthconnect.HealthConnectDailyService.EXTRA_JOB_NAME_KEY;
 import static com.android.server.healthconnect.HealthConnectDailyService.EXTRA_USER_ID;
 
-import android.annotation.UserIdInt;
 import android.app.job.JobInfo;
-import android.app.job.JobParameters;
 import android.app.job.JobScheduler;
 import android.content.ComponentName;
 import android.content.Context;
@@ -31,12 +27,9 @@
 import android.os.UserHandle;
 
 import com.android.server.healthconnect.logging.DailyLoggingService;
-import com.android.server.healthconnect.storage.AutoDeleteService;
-import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.logging.UsageStatsCollector;
+import com.android.server.healthconnect.storage.DailyCleanupJob;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseStatsCollector;
 
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
@@ -48,13 +41,14 @@
     private static final long JOB_RUN_INTERVAL = TimeUnit.DAYS.toMillis(1);
     private static final String HEALTH_CONNECT_NAMESPACE = "HEALTH_CONNECT_DAILY_JOB";
 
-    public static void schedule(Context context, @UserIdInt int userId) {
+    /** Schedule the daily job */
+    public static void schedule(Context context, UserHandle userHandle) {
         ComponentName componentName = new ComponentName(context, HealthConnectDailyService.class);
         final PersistableBundle extras = new PersistableBundle();
-        extras.putInt(EXTRA_USER_ID, userId);
+        extras.putInt(EXTRA_USER_ID, userHandle.getIdentifier());
         extras.putString(EXTRA_JOB_NAME_KEY, HC_DAILY_JOB);
         JobInfo.Builder builder =
-                new JobInfo.Builder(MIN_JOB_ID + userId, componentName)
+                new JobInfo.Builder(MIN_JOB_ID + userHandle.getIdentifier(), componentName)
                         .setExtras(extras)
                         .setRequiresCharging(true)
                         .setRequiresDeviceIdle(true)
@@ -63,7 +57,7 @@
         HealthConnectDailyService.schedule(
                 Objects.requireNonNull(context.getSystemService(JobScheduler.class))
                         .forNamespace(HEALTH_CONNECT_NAMESPACE),
-                userId,
+                userHandle,
                 builder.build());
     }
 
@@ -75,26 +69,10 @@
 
     /** Auto deletes the data and uploads critical daily metrics. */
     public static void execute(
-            Context context,
-            JobParameters params,
-            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
-            PreferenceHelper preferenceHelper,
-            AppInfoHelper appInfoHelper,
-            AccessLogsHelper accessLogsHelper,
-            TransactionManager transactionManager) {
-        int userId = params.getExtras().getInt(EXTRA_USER_ID, /* defaultValue= */ DEFAULT_INT);
-
-        AutoDeleteService.startAutoDelete(
-                context,
-                healthDataCategoryPriorityHelper,
-                preferenceHelper,
-                appInfoHelper,
-                transactionManager,
-                accessLogsHelper);
-        DailyLoggingService.logDailyMetrics(
-                context,
-                UserHandle.getUserHandleForUid(userId),
-                preferenceHelper,
-                accessLogsHelper);
+            UsageStatsCollector usageStatsCollector,
+            DatabaseStatsCollector databaseStatsCollector,
+            DailyCleanupJob dailyCleanupJob) {
+        dailyCleanupJob.startDailyCleanup();
+        DailyLoggingService.logDailyMetrics(usageStatsCollector, databaseStatsCollector);
     }
 }
diff --git a/service/java/com/android/server/healthconnect/HealthConnectDailyService.java b/service/java/com/android/server/healthconnect/HealthConnectDailyService.java
index 19dd07b..3ac7f37 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectDailyService.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectDailyService.java
@@ -23,28 +23,28 @@
 import static com.android.server.healthconnect.migration.MigrationConstants.MIGRATION_COMPLETE_JOB_NAME;
 import static com.android.server.healthconnect.migration.MigrationConstants.MIGRATION_PAUSE_JOB_NAME;
 
-import android.annotation.UserIdInt;
+import android.annotation.Nullable;
 import android.app.job.JobInfo;
 import android.app.job.JobParameters;
 import android.app.job.JobScheduler;
 import android.app.job.JobService;
+import android.content.Context;
 import android.health.connect.Constants;
+import android.os.UserHandle;
 import android.util.Slog;
 
-import com.android.healthfitness.flags.Flags;
 import com.android.server.healthconnect.exportimport.ExportImportJobs;
 import com.android.server.healthconnect.exportimport.ExportManager;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.logging.UsageStatsCollector;
 import com.android.server.healthconnect.migration.MigrationStateChangeJob;
 import com.android.server.healthconnect.migration.MigrationStateManager;
+import com.android.server.healthconnect.storage.DailyCleanupJob;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
-import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.StorageContext;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseStatsCollector;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 
-import java.time.Clock;
 import java.util.Objects;
 
 /**
@@ -56,7 +56,7 @@
     public static final String EXTRA_USER_ID = "user_id";
     public static final String EXTRA_JOB_NAME_KEY = "job_name";
     private static final String TAG = "HealthConnectDailyService";
-    @UserIdInt private static volatile int sCurrentUserId;
+    @Nullable private static volatile UserHandle sUserHandle;
 
     /**
      * Routes the job to the right place based on the job name, after performing common checks.,
@@ -68,7 +68,8 @@
     public boolean onStartJob(JobParameters params) {
         int userId = params.getExtras().getInt(EXTRA_USER_ID, /* defaultValue= */ DEFAULT_INT);
         String jobName = params.getExtras().getString(EXTRA_JOB_NAME_KEY);
-        if (userId == DEFAULT_INT || userId != sCurrentUserId) {
+        Context context = getApplicationContext();
+        if (userId == DEFAULT_INT || sUserHandle == null || userId != sUserHandle.getIdentifier()) {
             // This job is no longer valid, the service for this user should have been stopped.
             // Just ignore this request in case we still got the request.
             return false;
@@ -78,46 +79,19 @@
             return false;
         }
 
-        HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper;
-        ExportImportSettingsStorage exportImportSettingsStorage;
-        PreferenceHelper preferenceHelper;
-        ExportManager exportManager;
-        HealthConnectDeviceConfigManager healthConnectDeviceConfigManager;
-        MigrationStateManager migrationStateManager;
-        AppInfoHelper appInfoHelper;
-        AccessLogsHelper accessLogsHelper;
-        TransactionManager transactionManager;
-
-        if (Flags.dependencyInjection()) {
-            HealthConnectInjector healthConnectInjector = HealthConnectInjector.getInstance();
-            healthDataCategoryPriorityHelper =
-                    healthConnectInjector.getHealthDataCategoryPriorityHelper();
-            exportImportSettingsStorage = healthConnectInjector.getExportImportSettingsStorage();
-            exportManager = healthConnectInjector.getExportManager();
-            preferenceHelper = healthConnectInjector.getPreferenceHelper();
-            healthConnectDeviceConfigManager =
-                    healthConnectInjector.getHealthConnectDeviceConfigManager();
-            migrationStateManager = healthConnectInjector.getMigrationStateManager();
-            appInfoHelper = healthConnectInjector.getAppInfoHelper();
-            accessLogsHelper = healthConnectInjector.getAccessLogsHelper();
-            transactionManager = healthConnectInjector.getTransactionManager();
-        } else {
-            transactionManager = TransactionManager.getInitialisedInstance();
-            healthDataCategoryPriorityHelper = HealthDataCategoryPriorityHelper.getInstance();
-            preferenceHelper = PreferenceHelper.getInstance();
-            exportImportSettingsStorage = new ExportImportSettingsStorage(preferenceHelper);
-            healthConnectDeviceConfigManager =
-                    HealthConnectDeviceConfigManager.getInitialisedInstance();
-            exportManager =
-                    new ExportManager(
-                            getApplicationContext(),
-                            Clock.systemUTC(),
-                            exportImportSettingsStorage,
-                            transactionManager);
-            migrationStateManager = MigrationStateManager.getInitialisedInstance();
-            appInfoHelper = AppInfoHelper.getInstance();
-            accessLogsHelper = AccessLogsHelper.getInstance();
-        }
+        HealthConnectInjector healthConnectInjector = HealthConnectInjector.getInstance();
+        DailyCleanupJob dailyCleanupJob = healthConnectInjector.getDailyCleanupJob();
+        ExportImportSettingsStorage exportImportSettingsStorage =
+                healthConnectInjector.getExportImportSettingsStorage();
+        ExportManager exportManager = healthConnectInjector.getExportManager();
+        PreferenceHelper preferenceHelper = healthConnectInjector.getPreferenceHelper();
+        MigrationStateManager migrationStateManager =
+                healthConnectInjector.getMigrationStateManager();
+        UsageStatsCollector usageStatsCollector =
+                healthConnectInjector.getUsageStatsCollector(
+                        StorageContext.create(context, sUserHandle));
+        DatabaseStatsCollector databaseStatsCollector =
+                healthConnectInjector.getDatabaseStatsCollector();
 
         // This service executes each incoming job on a Handler running on the application's
         // main thread. This means that we must offload the execution logic to background executor.
@@ -126,13 +100,7 @@
                 HealthConnectThreadScheduler.scheduleInternalTask(
                         () -> {
                             HealthConnectDailyJobs.execute(
-                                    getApplicationContext(),
-                                    params,
-                                    healthDataCategoryPriorityHelper,
-                                    preferenceHelper,
-                                    appInfoHelper,
-                                    accessLogsHelper,
-                                    transactionManager);
+                                    usageStatsCollector, databaseStatsCollector, dailyCleanupJob);
                             jobFinished(params, false);
                         });
                 return true;
@@ -140,10 +108,7 @@
                 HealthConnectThreadScheduler.scheduleInternalTask(
                         () -> {
                             MigrationStateChangeJob.executeMigrationCompletionJob(
-                                    getApplicationContext(),
-                                    preferenceHelper,
-                                    healthConnectDeviceConfigManager,
-                                    migrationStateManager);
+                                    context, preferenceHelper, migrationStateManager);
                             jobFinished(params, false);
                         });
                 return true;
@@ -151,10 +116,7 @@
                 HealthConnectThreadScheduler.scheduleInternalTask(
                         () -> {
                             MigrationStateChangeJob.executeMigrationPauseJob(
-                                    getApplicationContext(),
-                                    preferenceHelper,
-                                    healthConnectDeviceConfigManager,
-                                    migrationStateManager);
+                                    context, preferenceHelper, migrationStateManager);
                             jobFinished(params, false);
                         });
                 return true;
@@ -163,8 +125,8 @@
                         () -> {
                             boolean isExportSuccessful =
                                     ExportImportJobs.executePeriodicExportJob(
-                                            getApplicationContext(),
-                                            userId,
+                                            context,
+                                            Objects.requireNonNull(sUserHandle),
                                             params.getExtras(),
                                             exportManager,
                                             exportImportSettingsStorage);
@@ -186,9 +148,9 @@
     }
 
     /** Start periodically scheduling this service for {@code userId}. */
-    public static void schedule(JobScheduler jobScheduler, @UserIdInt int userId, JobInfo jobInfo) {
+    public static void schedule(JobScheduler jobScheduler, UserHandle userHandle, JobInfo jobInfo) {
         Objects.requireNonNull(jobScheduler);
-        sCurrentUserId = userId;
+        sUserHandle = userHandle;
 
         int result = jobScheduler.schedule(jobInfo);
         if (result != JobScheduler.RESULT_SUCCESS) {
diff --git a/service/java/com/android/server/healthconnect/HealthConnectDeviceConfigManager.java b/service/java/com/android/server/healthconnect/HealthConnectDeviceConfigManager.java
deleted file mode 100644
index 8046173..0000000
--- a/service/java/com/android/server/healthconnect/HealthConnectDeviceConfigManager.java
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.healthconnect;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.health.connect.ratelimiter.RateLimiter;
-import android.provider.DeviceConfig;
-import android.util.ArraySet;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.time.Duration;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-/**
- * Singleton class to provide values and listen changes of settings flags.
- *
- * @hide
- */
-@SuppressLint("MissingPermission")
-public class HealthConnectDeviceConfigManager implements DeviceConfig.OnPropertiesChangedListener {
-    private static Set<String> sFlagsToTrack = new ArraySet<>();
-    public static final String ENABLE_RATE_LIMITER_FLAG = "enable_rate_limiter";
-
-    @VisibleForTesting
-    public static final String COUNT_MIGRATION_STATE_IN_PROGRESS_FLAG =
-            "count_migration_state_in_progress";
-
-    @VisibleForTesting
-    public static final String COUNT_MIGRATION_STATE_ALLOWED_FLAG = "count_migration_state_allowed";
-
-    @VisibleForTesting
-    public static final String MAX_START_MIGRATION_CALLS_ALLOWED_FLAG =
-            "max_start_migration_calls_allowed";
-
-    @VisibleForTesting
-    public static final String IDLE_STATE_TIMEOUT_DAYS_FLAG = "idle_state_timeout_days";
-
-    @VisibleForTesting
-    public static final String NON_IDLE_STATE_TIMEOUT_DAYS_FLAG = "non_idle_state_timeout_days";
-
-    @VisibleForTesting
-    public static final String IN_PROGRESS_STATE_TIMEOUT_HOURS_FLAG =
-            "in_progress_state_timeout_hours";
-
-    @VisibleForTesting
-    public static final String EXECUTION_TIME_BUFFER_MINUTES_FLAG = "execution_time_buffer_minutes";
-
-    @VisibleForTesting
-    public static final String MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_FLAG =
-            "migration_completion_job_run_interval_days";
-
-    @VisibleForTesting
-    public static final String MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_FLAG =
-            "migration_pause_job_run_interval_hours";
-
-    @VisibleForTesting
-    public static final String ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG =
-            "enable_pause_state_change_jobs";
-
-    @VisibleForTesting
-    public static final String ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG =
-            "enable_complete_state_change_jobs";
-
-    @VisibleForTesting
-    public static final String ENABLE_MIGRATION_NOTIFICATIONS_FLAG =
-            "enable_migration_notifications";
-
-    @VisibleForTesting
-    public static final String BACKGROUND_READ_FEATURE_FLAG = "background_read_enable";
-
-    @VisibleForTesting public static final String HISTORY_READ_FEATURE_FLAG = "history_read_enable";
-
-    @VisibleForTesting
-    public static final String ENABLE_AGGREGATION_SOURCE_CONTROLS_FLAG =
-            "aggregation_source_controls_enable";
-
-    public static final boolean ENABLE_RATE_LIMITER_DEFAULT_FLAG_VALUE = true;
-
-    @VisibleForTesting
-    public static final int MIGRATION_STATE_IN_PROGRESS_COUNT_DEFAULT_FLAG_VALUE = 5;
-
-    @VisibleForTesting public static final int MIGRATION_STATE_ALLOWED_COUNT_DEFAULT_FLAG_VALUE = 5;
-    @VisibleForTesting public static final int MAX_START_MIGRATION_CALLS_DEFAULT_FLAG_VALUE = 6;
-    @VisibleForTesting public static final int IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE = 120;
-    @VisibleForTesting public static final int NON_IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE = 15;
-
-    @VisibleForTesting
-    public static final int IN_PROGRESS_STATE_TIMEOUT_HOURS_DEFAULT_FLAG_VALUE = 12;
-
-    @VisibleForTesting
-    public static final int EXECUTION_TIME_BUFFER_MINUTES_DEFAULT_FLAG_VALUE = 30;
-
-    @VisibleForTesting
-    public static final int MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_DEFAULT_FLAG_VALUE = 1;
-
-    @VisibleForTesting
-    public static final int MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_DEFAULT_FLAG_VALUE = 4;
-
-    @VisibleForTesting
-    public static final boolean ENABLE_PAUSE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE = true;
-
-    @VisibleForTesting
-    public static final boolean ENABLE_COMPLETE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE = false;
-
-    @VisibleForTesting
-    public static final boolean ENABLE_MIGRATION_NOTIFICATIONS_DEFAULT_FLAG_VALUE = true;
-
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private static HealthConnectDeviceConfigManager sDeviceConfigManager;
-
-    private final ReentrantReadWriteLock mLock = new ReentrantReadWriteLock();
-    private static final String HEALTH_FITNESS_NAMESPACE = DeviceConfig.NAMESPACE_HEALTH_FITNESS;
-
-    @GuardedBy("mLock")
-    private int mMigrationStateInProgressCount =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    COUNT_MIGRATION_STATE_IN_PROGRESS_FLAG,
-                    MIGRATION_STATE_IN_PROGRESS_COUNT_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private int mMigrationStateAllowedCount =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    COUNT_MIGRATION_STATE_ALLOWED_FLAG,
-                    MIGRATION_STATE_ALLOWED_COUNT_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private int mMaxStartMigrationCalls =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    MAX_START_MIGRATION_CALLS_ALLOWED_FLAG,
-                    MAX_START_MIGRATION_CALLS_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private int mIdleStateTimeoutPeriod =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    IDLE_STATE_TIMEOUT_DAYS_FLAG,
-                    IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private int mNonIdleStateTimeoutPeriod =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    NON_IDLE_STATE_TIMEOUT_DAYS_FLAG,
-                    NON_IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private int mInProgressStateTimeoutPeriod =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    IN_PROGRESS_STATE_TIMEOUT_HOURS_FLAG,
-                    IN_PROGRESS_STATE_TIMEOUT_HOURS_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private int mExecutionTimeBuffer =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    EXECUTION_TIME_BUFFER_MINUTES_FLAG,
-                    EXECUTION_TIME_BUFFER_MINUTES_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private int mMigrationCompletionJobRunInterval =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_FLAG,
-                    MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private int mMigrationPauseJobRunInterval =
-            DeviceConfig.getInt(
-                    HEALTH_FITNESS_NAMESPACE,
-                    MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_FLAG,
-                    MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private boolean mEnablePauseStateChangeJob =
-            DeviceConfig.getBoolean(
-                    HEALTH_FITNESS_NAMESPACE,
-                    ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG,
-                    ENABLE_PAUSE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private boolean mEnableCompleteStateChangeJob =
-            DeviceConfig.getBoolean(
-                    HEALTH_FITNESS_NAMESPACE,
-                    ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG,
-                    ENABLE_COMPLETE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private boolean mEnableMigrationNotifications =
-            DeviceConfig.getBoolean(
-                    HEALTH_FITNESS_NAMESPACE,
-                    ENABLE_MIGRATION_NOTIFICATIONS_FLAG,
-                    ENABLE_MIGRATION_NOTIFICATIONS_DEFAULT_FLAG_VALUE);
-
-    @GuardedBy("mLock")
-    private boolean mBackgroundReadFeatureEnabled = true;
-
-    @GuardedBy("mLock")
-    private boolean mHistoryReadFeatureEnabled = true;
-
-    @GuardedBy("mLock")
-    private boolean mAggregationSourceControlsEnabled = true;
-
-    public static HealthConnectDeviceConfigManager initializeInstance(Context context) {
-        if (sDeviceConfigManager == null) {
-            sDeviceConfigManager = new HealthConnectDeviceConfigManager();
-            DeviceConfig.addOnPropertiesChangedListener(
-                    HEALTH_FITNESS_NAMESPACE, context.getMainExecutor(), sDeviceConfigManager);
-            addFlagsToTrack();
-        }
-        return sDeviceConfigManager;
-    }
-
-    /** Returns initialised instance of this class. */
-    public static HealthConnectDeviceConfigManager getInitialisedInstance() {
-        Objects.requireNonNull(sDeviceConfigManager);
-
-        return sDeviceConfigManager;
-    }
-
-    /** Adds flags that need to be updated if their values are changed on the server. */
-    private static void addFlagsToTrack() {
-        sFlagsToTrack.add(ENABLE_RATE_LIMITER_FLAG);
-        sFlagsToTrack.add(COUNT_MIGRATION_STATE_IN_PROGRESS_FLAG);
-        sFlagsToTrack.add(COUNT_MIGRATION_STATE_ALLOWED_FLAG);
-        sFlagsToTrack.add(MAX_START_MIGRATION_CALLS_ALLOWED_FLAG);
-        sFlagsToTrack.add(IDLE_STATE_TIMEOUT_DAYS_FLAG);
-        sFlagsToTrack.add(NON_IDLE_STATE_TIMEOUT_DAYS_FLAG);
-        sFlagsToTrack.add(IN_PROGRESS_STATE_TIMEOUT_HOURS_FLAG);
-        sFlagsToTrack.add(EXECUTION_TIME_BUFFER_MINUTES_FLAG);
-        sFlagsToTrack.add(MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_FLAG);
-        sFlagsToTrack.add(MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_FLAG);
-        sFlagsToTrack.add(ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG);
-        sFlagsToTrack.add(ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG);
-        sFlagsToTrack.add(ENABLE_MIGRATION_NOTIFICATIONS_FLAG);
-        sFlagsToTrack.add(BACKGROUND_READ_FEATURE_FLAG);
-        sFlagsToTrack.add(HISTORY_READ_FEATURE_FLAG);
-        sFlagsToTrack.add(ENABLE_AGGREGATION_SOURCE_CONTROLS_FLAG);
-    }
-
-    @GuardedBy("mLock")
-    private boolean mRateLimiterEnabled =
-            DeviceConfig.getBoolean(
-                    DeviceConfig.NAMESPACE_HEALTH_FITNESS,
-                    ENABLE_RATE_LIMITER_FLAG,
-                    ENABLE_RATE_LIMITER_DEFAULT_FLAG_VALUE);
-
-    /**
-     * Returns the required count for {@link
-     * android.health.connect.HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS}.
-     */
-    public int getMigrationStateInProgressCount() {
-        mLock.readLock().lock();
-        try {
-            return mMigrationStateInProgressCount;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /**
-     * Returns the required count for {@link
-     * android.health.connect.HealthConnectDataState.MIGRATION_STATE_ALLOWED}.
-     */
-    public int getMigrationStateAllowedCount() {
-        mLock.readLock().lock();
-        try {
-            return mMigrationStateAllowedCount;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns the maximum number of start migration calls allowed. */
-    public int getMaxStartMigrationCalls() {
-        mLock.readLock().lock();
-        try {
-            return mMaxStartMigrationCalls;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /**
-     * Returns the timeout period of {@link
-     * android.health.connect.HealthConnectDataState.MIGRATION_STATE_IDLE}.
-     */
-    public Duration getIdleStateTimeoutPeriod() {
-        mLock.readLock().lock();
-        try {
-            return Duration.ofDays(mIdleStateTimeoutPeriod);
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns the timeout period of non-idle migration states. */
-    public Duration getNonIdleStateTimeoutPeriod() {
-        mLock.readLock().lock();
-        try {
-            return Duration.ofDays(mNonIdleStateTimeoutPeriod);
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /**
-     * Returns the timeout period of {@link
-     * android.health.connect.HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS}.
-     */
-    public Duration getInProgressStateTimeoutPeriod() {
-        mLock.readLock().lock();
-        try {
-            return Duration.ofHours(mInProgressStateTimeoutPeriod);
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns the time buffer kept to ensure that job execution is not skipped. */
-    public long getExecutionTimeBuffer() {
-        mLock.readLock().lock();
-        try {
-            return TimeUnit.MINUTES.toMillis(mExecutionTimeBuffer);
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns the time interval at which the migration completion job will run periodically. */
-    public long getMigrationCompletionJobRunInterval() {
-        mLock.readLock().lock();
-        try {
-            return TimeUnit.DAYS.toMillis(mMigrationCompletionJobRunInterval);
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns the time interval at which the migration pause job will run periodically. */
-    public long getMigrationPauseJobRunInterval() {
-        mLock.readLock().lock();
-        try {
-            return TimeUnit.HOURS.toMillis(mMigrationPauseJobRunInterval);
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns if migration pause change jobs are enabled. */
-    public boolean isPauseStateChangeJobEnabled() {
-        mLock.readLock().lock();
-        try {
-            return mEnablePauseStateChangeJob;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns if migration completion jobs are enabled. */
-    public boolean isCompleteStateChangeJobEnabled() {
-        mLock.readLock().lock();
-        try {
-            return mEnableCompleteStateChangeJob;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns if migration notifications are enabled. */
-    public boolean areMigrationNotificationsEnabled() {
-        mLock.readLock().lock();
-        try {
-            return mEnableMigrationNotifications;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns whether reading in background is enabled or not. */
-    public boolean isBackgroundReadFeatureEnabled() {
-        mLock.readLock().lock();
-        try {
-            return mBackgroundReadFeatureEnabled;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns whether full history reading is enabled or not. */
-    public boolean isHistoryReadFeatureEnabled() {
-        mLock.readLock().lock();
-        try {
-            return mHistoryReadFeatureEnabled;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Returns whether the new aggregation source control feature is enabled or not. */
-    public boolean isAggregationSourceControlsEnabled() {
-        mLock.readLock().lock();
-        try {
-            return mAggregationSourceControlsEnabled;
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    /** Updates rate limiting quota values. */
-    public void updateRateLimiterValues() {
-        mLock.readLock().lock();
-        try {
-            RateLimiter.updateEnableRateLimiterFlag(mRateLimiterEnabled);
-        } finally {
-            mLock.readLock().unlock();
-        }
-    }
-
-    @Override
-    public void onPropertiesChanged(DeviceConfig.Properties properties) {
-        if (!properties.getNamespace().equals(HEALTH_FITNESS_NAMESPACE)) {
-            return;
-        }
-
-        Set<String> changedFlags = new ArraySet<>(properties.getKeyset());
-        changedFlags.retainAll(sFlagsToTrack);
-
-        for (String name : changedFlags) {
-            try {
-                mLock.writeLock().lock();
-                switch (name) {
-                    case ENABLE_RATE_LIMITER_FLAG:
-                        mRateLimiterEnabled =
-                                properties.getBoolean(
-                                        ENABLE_RATE_LIMITER_FLAG,
-                                        ENABLE_RATE_LIMITER_DEFAULT_FLAG_VALUE);
-                        RateLimiter.updateEnableRateLimiterFlag(mRateLimiterEnabled);
-                        break;
-                    case COUNT_MIGRATION_STATE_IN_PROGRESS_FLAG:
-                        mMigrationStateInProgressCount =
-                                properties.getInt(
-                                        COUNT_MIGRATION_STATE_IN_PROGRESS_FLAG,
-                                        MIGRATION_STATE_IN_PROGRESS_COUNT_DEFAULT_FLAG_VALUE);
-                        break;
-                    case COUNT_MIGRATION_STATE_ALLOWED_FLAG:
-                        mMigrationStateAllowedCount =
-                                properties.getInt(
-                                        COUNT_MIGRATION_STATE_ALLOWED_FLAG,
-                                        MIGRATION_STATE_ALLOWED_COUNT_DEFAULT_FLAG_VALUE);
-                        break;
-                    case MAX_START_MIGRATION_CALLS_ALLOWED_FLAG:
-                        mMaxStartMigrationCalls =
-                                properties.getInt(
-                                        MAX_START_MIGRATION_CALLS_ALLOWED_FLAG,
-                                        MAX_START_MIGRATION_CALLS_DEFAULT_FLAG_VALUE);
-                        break;
-                    case IDLE_STATE_TIMEOUT_DAYS_FLAG:
-                        mIdleStateTimeoutPeriod =
-                                properties.getInt(
-                                        IDLE_STATE_TIMEOUT_DAYS_FLAG,
-                                        IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE);
-                        break;
-                    case NON_IDLE_STATE_TIMEOUT_DAYS_FLAG:
-                        mNonIdleStateTimeoutPeriod =
-                                properties.getInt(
-                                        NON_IDLE_STATE_TIMEOUT_DAYS_FLAG,
-                                        NON_IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE);
-                        break;
-                    case IN_PROGRESS_STATE_TIMEOUT_HOURS_FLAG:
-                        mInProgressStateTimeoutPeriod =
-                                properties.getInt(
-                                        IN_PROGRESS_STATE_TIMEOUT_HOURS_FLAG,
-                                        IN_PROGRESS_STATE_TIMEOUT_HOURS_DEFAULT_FLAG_VALUE);
-                        break;
-                    case EXECUTION_TIME_BUFFER_MINUTES_FLAG:
-                        mExecutionTimeBuffer =
-                                properties.getInt(
-                                        EXECUTION_TIME_BUFFER_MINUTES_FLAG,
-                                        EXECUTION_TIME_BUFFER_MINUTES_DEFAULT_FLAG_VALUE);
-                        break;
-                    case MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_FLAG:
-                        mMigrationCompletionJobRunInterval =
-                                properties.getInt(
-                                        MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_FLAG,
-                                        MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_DEFAULT_FLAG_VALUE);
-                        break;
-                    case MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_FLAG:
-                        mMigrationPauseJobRunInterval =
-                                properties.getInt(
-                                        MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_FLAG,
-                                        MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_DEFAULT_FLAG_VALUE);
-                        break;
-                    case ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG:
-                        mEnablePauseStateChangeJob =
-                                properties.getBoolean(
-                                        ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG,
-                                        ENABLE_PAUSE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE);
-                        break;
-                    case ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG:
-                        mEnableCompleteStateChangeJob =
-                                properties.getBoolean(
-                                        ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG,
-                                        ENABLE_COMPLETE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE);
-                        break;
-                    case ENABLE_MIGRATION_NOTIFICATIONS_FLAG:
-                        mEnableMigrationNotifications =
-                                properties.getBoolean(
-                                        ENABLE_MIGRATION_NOTIFICATIONS_FLAG,
-                                        ENABLE_MIGRATION_NOTIFICATIONS_DEFAULT_FLAG_VALUE);
-                        break;
-                    case BACKGROUND_READ_FEATURE_FLAG:
-                        mBackgroundReadFeatureEnabled = true;
-                        break;
-                    case HISTORY_READ_FEATURE_FLAG:
-                        mHistoryReadFeatureEnabled = true;
-                        break;
-                    case ENABLE_AGGREGATION_SOURCE_CONTROLS_FLAG:
-                        mAggregationSourceControlsEnabled = true;
-                }
-            } finally {
-                mLock.writeLock().unlock();
-            }
-        }
-    }
-}
diff --git a/service/java/com/android/server/healthconnect/HealthConnectManagerService.java b/service/java/com/android/server/healthconnect/HealthConnectManagerService.java
index 19bf9b7..5360bd5 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectManagerService.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectManagerService.java
@@ -18,7 +18,6 @@
 
 import android.annotation.Nullable;
 import android.content.Context;
-import android.health.connect.HealthConnectManager;
 import android.health.connect.ratelimiter.RateLimiter;
 import android.os.Process;
 import android.os.UserHandle;
@@ -32,31 +31,16 @@
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
 import com.android.server.healthconnect.migration.MigrationBroadcastScheduler;
-import com.android.server.healthconnect.migration.MigrationCleaner;
 import com.android.server.healthconnect.migration.MigrationStateManager;
 import com.android.server.healthconnect.migration.MigrationUiStateManager;
 import com.android.server.healthconnect.migration.MigratorPackageChangesReceiver;
-import com.android.server.healthconnect.migration.PriorityMigrationHelper;
-import com.android.server.healthconnect.migration.notification.MigrationNotificationSender;
-import com.android.server.healthconnect.permission.FirstGrantTimeDatastore;
-import com.android.server.healthconnect.permission.FirstGrantTimeManager;
-import com.android.server.healthconnect.permission.HealthConnectPermissionHelper;
-import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
-import com.android.server.healthconnect.permission.PackageInfoUtils;
 import com.android.server.healthconnect.permission.PermissionPackageChangesOrchestrator;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper.DatabaseHelpers;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
-import com.android.server.healthconnect.utils.TimeSource;
-import com.android.server.healthconnect.utils.TimeSourceImpl;
 
-import java.time.Clock;
 import java.util.Objects;
 
 /**
@@ -72,170 +56,62 @@
     private final TransactionManager mTransactionManager;
     private final UserManager mUserManager;
     private final MigrationBroadcastScheduler mMigrationBroadcastScheduler;
-    private UserHandle mCurrentForegroundUser;
-    private MigrationUiStateManager mMigrationUiStateManager;
-    private final MigrationNotificationSender mMigrationNotificationSender;
+    private final MigrationUiStateManager mMigrationUiStateManager;
     private final ExportImportSettingsStorage mExportImportSettingsStorage;
     private final ExportManager mExportManager;
     private final PreferenceHelper mPreferenceHelper;
-    private final HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
     private final MigrationStateManager mMigrationStateManager;
+    private final DatabaseHelpers mDatabaseHelpers;
+    private final HealthConnectInjector mHealthConnectInjector;
 
-    @Nullable private HealthConnectInjector mHealthConnectInjector;
+    private UserHandle mCurrentForegroundUser;
 
     public HealthConnectManagerService(Context context) {
         super(context);
         mContext = context;
         mCurrentForegroundUser = context.getUser();
-        // This is needed now because MigrationStatedManager uses PreferenceHelper and
-        // PreferenceHelper after refactoring needs TransactionManager in the constructor.
-        // This will be cleaned up once DI is launched.
-        if (Flags.dependencyInjection()) {
-            HealthConnectInjector.setInstance(new HealthConnectInjectorImpl(context));
-            mHealthConnectInjector = HealthConnectInjector.getInstance();
-            mHealthConnectDeviceConfigManager =
-                    mHealthConnectInjector.getHealthConnectDeviceConfigManager();
-            mTransactionManager = mHealthConnectInjector.getTransactionManager();
-            mPreferenceHelper = mHealthConnectInjector.getPreferenceHelper();
-            mMigrationStateManager = mHealthConnectInjector.getMigrationStateManager();
-        } else {
-            mHealthConnectDeviceConfigManager =
-                    HealthConnectDeviceConfigManager.initializeInstance(context);
-            mTransactionManager =
-                    TransactionManager.initializeInstance(
-                            new HealthConnectUserContext(mContext, mCurrentForegroundUser));
-            mPreferenceHelper = PreferenceHelper.getInstance();
-            mMigrationStateManager =
-                    MigrationStateManager.initializeInstance(
-                            mCurrentForegroundUser.getIdentifier(),
-                            mHealthConnectDeviceConfigManager,
-                            mPreferenceHelper);
-        }
-
-        HealthPermissionIntentAppsTracker permissionIntentTracker =
-                new HealthPermissionIntentAppsTracker(context);
-        FirstGrantTimeManager firstGrantTimeManager;
-        HealthConnectPermissionHelper permissionHelper;
-        MigrationCleaner migrationCleaner;
-        AppInfoHelper appInfoHelper;
-        AccessLogsHelper accessLogsHelper;
-        HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper;
-
-        if (Flags.dependencyInjection()) {
-            Objects.requireNonNull(mHealthConnectInjector);
-            appInfoHelper = mHealthConnectInjector.getAppInfoHelper();
-            accessLogsHelper = mHealthConnectInjector.getAccessLogsHelper();
-            healthDataCategoryPriorityHelper =
-                    mHealthConnectInjector.getHealthDataCategoryPriorityHelper();
-            firstGrantTimeManager =
-                    new FirstGrantTimeManager(
-                            context,
-                            permissionIntentTracker,
-                            FirstGrantTimeDatastore.createInstance(),
-                            mHealthConnectInjector.getPackageInfoUtils(),
-                            healthDataCategoryPriorityHelper,
-                            mMigrationStateManager);
-            permissionHelper =
-                    new HealthConnectPermissionHelper(
-                            context,
-                            context.getPackageManager(),
-                            HealthConnectManager.getHealthPermissions(context),
-                            permissionIntentTracker,
-                            firstGrantTimeManager,
-                            healthDataCategoryPriorityHelper,
-                            appInfoHelper);
-            mPermissionPackageChangesOrchestrator =
-                    new PermissionPackageChangesOrchestrator(
-                            permissionIntentTracker,
-                            firstGrantTimeManager,
-                            permissionHelper,
-                            mCurrentForegroundUser,
-                            healthDataCategoryPriorityHelper);
-            migrationCleaner =
-                    new MigrationCleaner(
-                            mHealthConnectInjector.getTransactionManager(),
-                            mHealthConnectInjector.getPriorityMigrationHelper());
-            mExportImportSettingsStorage = mHealthConnectInjector.getExportImportSettingsStorage();
-            mExportManager = mHealthConnectInjector.getExportManager();
-        } else {
-            appInfoHelper = AppInfoHelper.getInstance(mTransactionManager);
-            accessLogsHelper = AccessLogsHelper.getInstance(mTransactionManager, appInfoHelper);
-            healthDataCategoryPriorityHelper = HealthDataCategoryPriorityHelper.getInstance();
-            firstGrantTimeManager =
-                    new FirstGrantTimeManager(
-                            context,
-                            permissionIntentTracker,
-                            FirstGrantTimeDatastore.createInstance(),
-                            PackageInfoUtils.getInstance(),
-                            healthDataCategoryPriorityHelper,
-                            mMigrationStateManager);
-            permissionHelper =
-                    new HealthConnectPermissionHelper(
-                            context,
-                            context.getPackageManager(),
-                            HealthConnectManager.getHealthPermissions(context),
-                            permissionIntentTracker,
-                            firstGrantTimeManager,
-                            appInfoHelper);
-            mPermissionPackageChangesOrchestrator =
-                    new PermissionPackageChangesOrchestrator(
-                            permissionIntentTracker,
-                            firstGrantTimeManager,
-                            permissionHelper,
-                            mCurrentForegroundUser,
-                            healthDataCategoryPriorityHelper);
-            migrationCleaner =
-                    new MigrationCleaner(
-                            mTransactionManager, PriorityMigrationHelper.getInstance());
-            mExportImportSettingsStorage = new ExportImportSettingsStorage(mPreferenceHelper);
-            mExportManager =
-                    new ExportManager(
-                            context,
-                            Clock.systemUTC(),
-                            mExportImportSettingsStorage,
-                            mTransactionManager);
-        }
-
         mUserManager = context.getSystemService(UserManager.class);
-        mMigrationBroadcastScheduler =
-                new MigrationBroadcastScheduler(
-                        mCurrentForegroundUser.getIdentifier(),
-                        mHealthConnectDeviceConfigManager,
-                        mMigrationStateManager);
-        mMigrationStateManager.setMigrationBroadcastScheduler(mMigrationBroadcastScheduler);
-        mMigrationNotificationSender =
-                new MigrationNotificationSender(context, mHealthConnectDeviceConfigManager);
-        mMigrationUiStateManager =
-                new MigrationUiStateManager(
-                        mContext,
-                        mCurrentForegroundUser,
-                        mMigrationStateManager,
-                        mMigrationNotificationSender);
-        TimeSource timeSource = new TimeSourceImpl();
-        MedicalDataSourceHelper medicalDataSourceHelper =
-                new MedicalDataSourceHelper(
-                        mTransactionManager, appInfoHelper, timeSource, accessLogsHelper);
+
+        HealthConnectInjector.setInstance(new HealthConnectInjectorImpl(context));
+        mHealthConnectInjector = HealthConnectInjector.getInstance();
+        mTransactionManager = mHealthConnectInjector.getTransactionManager();
+        mPreferenceHelper = mHealthConnectInjector.getPreferenceHelper();
+        mMigrationStateManager = mHealthConnectInjector.getMigrationStateManager();
+        mPermissionPackageChangesOrchestrator =
+                mHealthConnectInjector.getPermissionPackageChangesOrchestrator();
+        mExportImportSettingsStorage = mHealthConnectInjector.getExportImportSettingsStorage();
+        mExportManager = mHealthConnectInjector.getExportManager();
+        mMigrationBroadcastScheduler = mHealthConnectInjector.getMigrationBroadcastScheduler();
+        mMigrationUiStateManager = mHealthConnectInjector.getMigrationUiStateManager();
+        mDatabaseHelpers = mHealthConnectInjector.getDatabaseHelpers();
         mHealthConnectService =
                 new HealthConnectServiceImpl(
+                        mContext,
+                        mHealthConnectInjector.getTimeSource(),
+                        mHealthConnectInjector.getInternalHealthConnectMappings(),
                         mTransactionManager,
-                        mHealthConnectDeviceConfigManager,
-                        permissionHelper,
-                        migrationCleaner,
-                        firstGrantTimeManager,
+                        mHealthConnectInjector.getHealthConnectPermissionHelper(),
+                        mHealthConnectInjector.getFirstGrantTimeManager(),
+                        mHealthConnectInjector.getMigrationEntityHelper(),
                         mMigrationStateManager,
                         mMigrationUiStateManager,
-                        new MedicalResourceHelper(
-                                mTransactionManager,
-                                appInfoHelper,
-                                medicalDataSourceHelper,
-                                timeSource,
-                                accessLogsHelper),
-                        medicalDataSourceHelper,
-                        mContext,
+                        mHealthConnectInjector.getMigrationCleaner(),
+                        mHealthConnectInjector.getMedicalResourceHelper(),
+                        mHealthConnectInjector.getMedicalDataSourceHelper(),
                         mExportManager,
                         mExportImportSettingsStorage,
-                        accessLogsHelper,
-                        healthDataCategoryPriorityHelper);
+                        mHealthConnectInjector.getBackupRestore(),
+                        mHealthConnectInjector.getAccessLogsHelper(),
+                        mHealthConnectInjector.getHealthDataCategoryPriorityHelper(),
+                        mHealthConnectInjector.getActivityDateHelper(),
+                        mHealthConnectInjector.getChangeLogsHelper(),
+                        mHealthConnectInjector.getChangeLogsRequestHelper(),
+                        mHealthConnectInjector.getPriorityMigrationHelper(),
+                        mHealthConnectInjector.getAppInfoHelper(),
+                        mHealthConnectInjector.getDeviceInfoHelper(),
+                        mPreferenceHelper,
+                        mDatabaseHelpers,
+                        mHealthConnectInjector.getPreferencesManager());
     }
 
     @Override
@@ -244,7 +120,6 @@
         new MigratorPackageChangesReceiver(mMigrationStateManager)
                 .registerBroadcastReceiver(mContext);
         publishBinderService(Context.HEALTHCONNECT_SERVICE, mHealthConnectService);
-        mHealthConnectDeviceConfigManager.updateRateLimiterValues();
     }
 
     /**
@@ -260,12 +135,11 @@
         }
 
         HealthConnectThreadScheduler.shutdownThreadPools();
-        DatabaseHelper.clearAllCache();
+        mDatabaseHelpers.clearAllCache();
         mTransactionManager.onUserSwitching();
         RateLimiter.clearCache();
         HealthConnectThreadScheduler.resetThreadPools();
-        mMigrationStateManager.onUserSwitching(mContext, to.getUserHandle().getIdentifier());
-
+        mMigrationStateManager.onUserSwitching(mContext, to.getUserHandle());
         mCurrentForegroundUser = to.getUserHandle();
 
         if (mUserManager.isUserUnlocked(to.getUserHandle())) {
@@ -299,14 +173,20 @@
     }
 
     private void switchToSetupForUser(UserHandle user) {
-        // Note: This is for test setup debugging, please don't surround with DEBUG flag
         Slog.d(TAG, "switchToSetupForUser: " + user);
-        mTransactionManager.onUserUnlocked(
-                new HealthConnectUserContext(mContext, mCurrentForegroundUser));
+        StorageContext storageContext = StorageContext.create(mContext, mCurrentForegroundUser);
+        mTransactionManager.onUserUnlocked(storageContext);
         mHealthConnectService.onUserSwitching(mCurrentForegroundUser);
-        mMigrationBroadcastScheduler.setUserId(mCurrentForegroundUser.getIdentifier());
+        mMigrationBroadcastScheduler.setUserId(mCurrentForegroundUser);
         mMigrationUiStateManager.setUserHandle(mCurrentForegroundUser);
         mPermissionPackageChangesOrchestrator.setUserHandle(mCurrentForegroundUser);
+        mHealthConnectInjector
+                .getHealthPermissionIntentAppsTracker()
+                .onUserUnlocked(mCurrentForegroundUser);
+
+        mHealthConnectInjector.getBackupRestore().setupForUser(mCurrentForegroundUser);
+        mHealthConnectInjector.getAppInfoHelper().setupForUser(storageContext);
+        mHealthConnectInjector.getHealthDataCategoryPriorityHelper().setupForUser(storageContext);
 
         if (Flags.clearCachesAfterSwitchingUser()) {
             // Clear preferences cache again after the user switching is done as there's a race
@@ -320,8 +200,7 @@
         HealthConnectThreadScheduler.scheduleInternalTask(
                 () -> {
                     try {
-                        HealthConnectDailyJobs.schedule(
-                                mContext, mCurrentForegroundUser.getIdentifier());
+                        HealthConnectDailyJobs.schedule(mContext, mCurrentForegroundUser);
                     } catch (Exception e) {
                         Slog.e(TAG, "Failed to schedule Health Connect daily service.", e);
                     }
@@ -330,7 +209,8 @@
         HealthConnectThreadScheduler.scheduleInternalTask(
                 () -> {
                     try {
-                        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+                        mMigrationBroadcastScheduler.scheduleNewJobs(
+                                mContext, mMigrationStateManager);
                     } catch (Exception e) {
                         Slog.e(TAG, "Migration broadcast schedule failed", e);
                     }
@@ -357,7 +237,7 @@
                 () -> {
                     try {
                         ExportImportJobs.schedulePeriodicJobIfNotScheduled(
-                                mCurrentForegroundUser.getIdentifier(),
+                                mCurrentForegroundUser,
                                 mContext,
                                 mExportImportSettingsStorage,
                                 mExportManager);
diff --git a/service/java/com/android/server/healthconnect/HealthConnectServiceImpl.java b/service/java/com/android/server/healthconnect/HealthConnectServiceImpl.java
index adacc81..5807189 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectServiceImpl.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectServiceImpl.java
@@ -23,7 +23,9 @@
 import static android.health.connect.Constants.READ;
 import static android.health.connect.HealthConnectException.ERROR_INTERNAL;
 import static android.health.connect.HealthConnectException.ERROR_INVALID_ARGUMENT;
+import static android.health.connect.HealthConnectException.ERROR_IO;
 import static android.health.connect.HealthConnectException.ERROR_SECURITY;
+import static android.health.connect.HealthConnectException.ERROR_UNKNOWN;
 import static android.health.connect.HealthConnectException.ERROR_UNSUPPORTED_OPERATION;
 import static android.health.connect.HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION;
 import static android.health.connect.HealthPermissions.READ_HEALTH_DATA_HISTORY;
@@ -32,13 +34,24 @@
 import static android.health.connect.datatypes.MedicalDataSource.validateMedicalDataSourceIds;
 
 import static com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled;
+import static com.android.healthfitness.flags.Flags.cloudBackupAndRestore;
+import static com.android.healthfitness.flags.Flags.personalHealthRecordTelemetry;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.CREATE_MEDICAL_DATA_SOURCE;
 import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_DATA;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_DATA_SOURCE_WITH_DATA;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_RESOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_RESOURCES_BY_REQUESTS;
 import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.GET_CHANGES;
 import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.GET_CHANGES_TOKEN;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.GET_MEDICAL_DATA_SOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.GET_MEDICAL_DATA_SOURCES_BY_REQUESTS;
 import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.INSERT_DATA;
 import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.READ_AGGREGATED_DATA;
 import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.READ_DATA;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.READ_MEDICAL_RESOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.READ_MEDICAL_RESOURCES_BY_REQUESTS;
 import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.UPDATE_DATA;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.UPSERT_MEDICAL_RESOURCES;
 
 import static java.util.Collections.singletonList;
 import static java.util.stream.Collectors.toList;
@@ -62,12 +75,10 @@
 import android.health.connect.HealthConnectManager;
 import android.health.connect.HealthConnectManager.DataDownloadState;
 import android.health.connect.HealthDataCategory;
-import android.health.connect.HealthPermissions;
 import android.health.connect.MedicalResourceId;
 import android.health.connect.MedicalResourceTypeInfo;
 import android.health.connect.PageTokenWrapper;
 import android.health.connect.ReadMedicalResourcesResponse;
-import android.health.connect.RecordTypeInfoResponse;
 import android.health.connect.UpsertMedicalResourceRequest;
 import android.health.connect.accesslog.AccessLog;
 import android.health.connect.accesslog.AccessLogsResponseParcel;
@@ -86,13 +97,16 @@
 import android.health.connect.aidl.IDataStagingFinishedCallback;
 import android.health.connect.aidl.IEmptyResponseCallback;
 import android.health.connect.aidl.IGetChangeLogTokenCallback;
+import android.health.connect.aidl.IGetChangesForBackupResponseCallback;
 import android.health.connect.aidl.IGetHealthConnectDataStateCallback;
 import android.health.connect.aidl.IGetHealthConnectMigrationUiStateCallback;
 import android.health.connect.aidl.IGetPriorityResponseCallback;
+import android.health.connect.aidl.IGetSettingsForBackupResponseCallback;
 import android.health.connect.aidl.IHealthConnectService;
 import android.health.connect.aidl.IInsertRecordsResponseCallback;
 import android.health.connect.aidl.IMedicalDataSourceResponseCallback;
 import android.health.connect.aidl.IMedicalDataSourcesResponseCallback;
+import android.health.connect.aidl.IMedicalResourceListParcelResponseCallback;
 import android.health.connect.aidl.IMedicalResourceTypeInfosCallback;
 import android.health.connect.aidl.IMedicalResourcesResponseCallback;
 import android.health.connect.aidl.IMigrationCallback;
@@ -100,13 +114,15 @@
 import android.health.connect.aidl.IReadRecordsResponseCallback;
 import android.health.connect.aidl.IRecordTypeInfoResponseCallback;
 import android.health.connect.aidl.InsertRecordsResponseParcel;
+import android.health.connect.aidl.MedicalResourceListParcel;
 import android.health.connect.aidl.ReadMedicalResourcesRequestParcel;
 import android.health.connect.aidl.ReadRecordsRequestParcel;
 import android.health.connect.aidl.ReadRecordsResponseParcel;
-import android.health.connect.aidl.RecordIdFiltersParcel;
 import android.health.connect.aidl.RecordTypeInfoResponseParcel;
 import android.health.connect.aidl.RecordsParcel;
 import android.health.connect.aidl.UpdatePriorityRequestParcel;
+import android.health.connect.aidl.UpsertMedicalResourceRequestsParcel;
+import android.health.connect.backuprestore.BackupSettings;
 import android.health.connect.changelog.ChangeLogTokenRequest;
 import android.health.connect.changelog.ChangeLogTokenResponse;
 import android.health.connect.changelog.ChangeLogsRequest;
@@ -126,8 +142,8 @@
 import android.health.connect.exportimport.ScheduledExportStatus;
 import android.health.connect.internal.datatypes.RecordInternal;
 import android.health.connect.internal.datatypes.utils.AggregationTypeIdMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.health.connect.internal.datatypes.utils.MedicalResourceTypePermissionMapper;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
 import android.health.connect.migration.HealthConnectMigrationUiState;
 import android.health.connect.migration.MigrationEntityParcel;
 import android.health.connect.migration.MigrationException;
@@ -139,7 +155,6 @@
 import android.health.connect.restore.StageRemoteDataRequest;
 import android.net.Uri;
 import android.os.Binder;
-import android.os.OutcomeReceiver;
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
 import android.os.RemoteException;
@@ -151,10 +166,11 @@
 import android.util.Slog;
 
 import com.android.healthfitness.flags.Flags;
-import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.LocalManagerRegistry;
 import com.android.server.appop.AppOpsManagerLocal;
 import com.android.server.healthconnect.backuprestore.BackupRestore;
+import com.android.server.healthconnect.backuprestore.CloudBackupManager;
+import com.android.server.healthconnect.backuprestore.CloudRestoreManager;
 import com.android.server.healthconnect.exportimport.DocumentProvidersManager;
 import com.android.server.healthconnect.exportimport.ExportImportJobs;
 import com.android.server.healthconnect.exportimport.ExportManager;
@@ -171,8 +187,8 @@
 import com.android.server.healthconnect.permission.MedicalDataPermissionEnforcer;
 import com.android.server.healthconnect.phr.PhrPageTokenWrapper;
 import com.android.server.healthconnect.phr.ReadMedicalResourcesInternalResponse;
+import com.android.server.healthconnect.phr.validations.FhirResourceValidator;
 import com.android.server.healthconnect.phr.validations.MedicalResourceValidator;
-import com.android.server.healthconnect.storage.AutoDeleteService;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
@@ -180,11 +196,12 @@
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper.DatabaseHelpers;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MigrationEntityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
 import com.android.server.healthconnect.storage.request.AggregateTransactionRequest;
@@ -192,12 +209,17 @@
 import com.android.server.healthconnect.storage.request.ReadTransactionRequest;
 import com.android.server.healthconnect.storage.request.UpsertMedicalResourceInternalRequest;
 import com.android.server.healthconnect.storage.request.UpsertTransactionRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
+import com.android.server.healthconnect.utils.TimeSource;
 
 import org.json.JSONException;
 
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.time.Clock;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.util.ArrayList;
@@ -211,7 +233,6 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.Executor;
 import java.util.stream.Collectors;
 
 /**
@@ -231,7 +252,8 @@
     @Nullable private final ImportManager mImportManager;
 
     private final TransactionManager mTransactionManager;
-    private final HealthConnectDeviceConfigManager mDeviceConfigManager;
+    @Nullable private final CloudBackupManager mCloudBackupManager;
+    @Nullable private final CloudRestoreManager mCloudRestoreManager;
     private final HealthConnectPermissionHelper mPermissionHelper;
     private final FirstGrantTimeManager mFirstGrantTimeManager;
     private final Context mContext;
@@ -250,7 +272,6 @@
     private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
     private final AppInfoHelper mAppInfoHelper;
     private final PriorityMigrationHelper mPriorityMigrationHelper;
-    private final RecordMapper mRecordMapper;
     private final AggregationTypeIdMapper mAggregationTypeIdMapper;
     private final DeviceInfoHelper mDeviceInfoHelper;
     private final ExportImportSettingsStorage mExportImportSettingsStorage;
@@ -259,113 +280,124 @@
     private MedicalDataSourceHelper mMedicalDataSourceHelper;
     private final ExportManager mExportManager;
     private final AccessLogsHelper mAccessLogsHelper;
+    private final ActivityDateHelper mActivityDateHelper;
+    private final ChangeLogsHelper mChangeLogsHelper;
+    private final ChangeLogsRequestHelper mChangeLogsRequestHelper;
+    private final MigrationEntityHelper mMigrationEntityHelper;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings;
+    private final HealthConnectMappings mHealthConnectMappings;
+    private final TimeSource mTimeSource;
+    private final DatabaseHelpers mDatabaseHelpers;
+    private final PreferencesManager mPreferencesManager;
+    // This will be null if the phr_fhir_structural_validation flag is false.
+    @Nullable private FhirResourceValidator mFhirResourceValidator;
 
     private volatile UserHandle mCurrentForegroundUser;
 
     HealthConnectServiceImpl(
+            Context context,
+            TimeSource timeSource,
+            InternalHealthConnectMappings internalHealthConnectMappings,
             TransactionManager transactionManager,
-            HealthConnectDeviceConfigManager deviceConfigManager,
             HealthConnectPermissionHelper permissionHelper,
-            MigrationCleaner migrationCleaner,
             FirstGrantTimeManager firstGrantTimeManager,
+            MigrationEntityHelper migrationEntityHelper,
             MigrationStateManager migrationStateManager,
             MigrationUiStateManager migrationUiStateManager,
-            MedicalResourceHelper medicalResourceHelper,
-            MedicalDataSourceHelper medicalDataSourceHelper,
-            Context context,
-            ExportManager exportManager,
-            ExportImportSettingsStorage exportImportSettingsStorage,
-            AccessLogsHelper accessLogsHelper,
-            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper) {
-        this(
-                transactionManager,
-                deviceConfigManager,
-                permissionHelper,
-                migrationCleaner,
-                firstGrantTimeManager,
-                migrationStateManager,
-                migrationUiStateManager,
-                context,
-                medicalResourceHelper,
-                medicalDataSourceHelper,
-                exportManager,
-                exportImportSettingsStorage,
-                accessLogsHelper,
-                healthDataCategoryPriorityHelper);
-    }
-
-    @VisibleForTesting
-    HealthConnectServiceImpl(
-            TransactionManager transactionManager,
-            HealthConnectDeviceConfigManager deviceConfigManager,
-            HealthConnectPermissionHelper permissionHelper,
             MigrationCleaner migrationCleaner,
-            FirstGrantTimeManager firstGrantTimeManager,
-            MigrationStateManager migrationStateManager,
-            MigrationUiStateManager migrationUiStateManager,
-            Context context,
             MedicalResourceHelper medicalResourceHelper,
             MedicalDataSourceHelper medicalDataSourceHelper,
             ExportManager exportManager,
             ExportImportSettingsStorage exportImportSettingsStorage,
+            BackupRestore backupRestore,
             AccessLogsHelper accessLogsHelper,
-            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper) {
-        mAccessLogsHelper = accessLogsHelper;
-        mTransactionManager = transactionManager;
-        mPreferenceHelper = PreferenceHelper.getInstance();
-        mDeviceConfigManager = deviceConfigManager;
-        mPermissionHelper = permissionHelper;
-        mFirstGrantTimeManager = firstGrantTimeManager;
+            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
+            ActivityDateHelper activityDateHelper,
+            ChangeLogsHelper changeLogsHelper,
+            ChangeLogsRequestHelper changeLogsRequestHelper,
+            PriorityMigrationHelper priorityMigrationHelper,
+            AppInfoHelper appInfoHelper,
+            DeviceInfoHelper deviceInfoHelper,
+            PreferenceHelper preferenceHelper,
+            DatabaseHelpers databaseHelpers,
+            PreferencesManager preferencesManager) {
         mContext = context;
         mCurrentForegroundUser = context.getUser();
-        mPermissionManager = mContext.getSystemService(PermissionManager.class);
-        mMigrationStateManager = migrationStateManager;
-        mDeviceInfoHelper = DeviceInfoHelper.getInstance();
-        mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
-        mDataPermissionEnforcer =
-                new DataPermissionEnforcer(mPermissionManager, mContext, deviceConfigManager);
-        mMedicalDataPermissionEnforcer = new MedicalDataPermissionEnforcer(mPermissionManager);
-        mAppOpsManagerLocal = LocalManagerRegistry.getManager(AppOpsManagerLocal.class);
-        mAppInfoHelper = AppInfoHelper.getInstance();
-        mBackupRestore =
-                new BackupRestore(
-                        mAppInfoHelper,
-                        mFirstGrantTimeManager,
-                        mMigrationStateManager,
-                        mPreferenceHelper,
-                        mTransactionManager,
-                        mContext,
-                        mDeviceInfoHelper,
-                        mHealthDataCategoryPriorityHelper);
-        mMigrationUiStateManager = migrationUiStateManager;
-        mExportImportSettingsStorage = exportImportSettingsStorage;
-        mImportManager =
-                Flags.exportImport()
-                        ? new ImportManager(
-                                mAppInfoHelper,
-                                mContext,
-                                mExportImportSettingsStorage,
-                                mTransactionManager,
-                                mDeviceInfoHelper,
-                                mHealthDataCategoryPriorityHelper)
-                        : null;
-        mExportManager = exportManager;
-        migrationCleaner.attachTo(migrationStateManager);
-        mMigrationUiStateManager.attachTo(migrationStateManager);
-        mPriorityMigrationHelper = PriorityMigrationHelper.getInstance();
-        mRecordMapper = RecordMapper.getInstance();
+        mTimeSource = timeSource;
+
+        mInternalHealthConnectMappings = internalHealthConnectMappings;
+        mHealthConnectMappings = internalHealthConnectMappings.getExternalMappings();
         mAggregationTypeIdMapper = AggregationTypeIdMapper.getInstance();
+
+        mTransactionManager = transactionManager;
+        mPermissionHelper = permissionHelper;
+        mFirstGrantTimeManager = firstGrantTimeManager;
+
+        mMigrationEntityHelper = migrationEntityHelper;
+        mMigrationStateManager = migrationStateManager;
+        mMigrationUiStateManager = migrationUiStateManager;
+        mMigrationUiStateManager.attachTo(migrationStateManager);
+        migrationCleaner.attachTo(migrationStateManager);
+
         mMedicalResourceHelper = medicalResourceHelper;
         mMedicalDataSourceHelper = medicalDataSourceHelper;
+
+        mExportManager = exportManager;
+        mExportImportSettingsStorage = exportImportSettingsStorage;
+        mBackupRestore = backupRestore;
+
+        mAccessLogsHelper = accessLogsHelper;
+        mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
+        mActivityDateHelper = activityDateHelper;
+        mChangeLogsHelper = changeLogsHelper;
+        mChangeLogsRequestHelper = changeLogsRequestHelper;
+        mPriorityMigrationHelper = priorityMigrationHelper;
+        mAppInfoHelper = appInfoHelper;
+        mDeviceInfoHelper = deviceInfoHelper;
+        mPreferenceHelper = preferenceHelper;
+        mDatabaseHelpers = databaseHelpers;
+        mPreferencesManager = preferencesManager;
+
+        mPermissionManager = mContext.getSystemService(PermissionManager.class);
+        mAppOpsManagerLocal = LocalManagerRegistry.getManager(AppOpsManagerLocal.class);
+        mMedicalDataPermissionEnforcer = new MedicalDataPermissionEnforcer(mPermissionManager);
+        mDataPermissionEnforcer =
+                new DataPermissionEnforcer(
+                        mPermissionManager, mContext, internalHealthConnectMappings);
+        if (Flags.exportImport()) {
+            Clock clockForLogging = Flags.exportImportFastFollow() ? Clock.systemUTC() : null;
+            mImportManager =
+                    new ImportManager(
+                            mAppInfoHelper,
+                            mContext,
+                            mExportImportSettingsStorage,
+                            mTransactionManager,
+                            mDeviceInfoHelper,
+                            mHealthDataCategoryPriorityHelper,
+                            clockForLogging);
+        } else {
+            mImportManager = null;
+        }
+        mCloudBackupManager =
+                Flags.cloudBackupAndRestore()
+                        ? new CloudBackupManager(
+                                mTransactionManager,
+                                mAppInfoHelper,
+                                mAccessLogsHelper,
+                                mDeviceInfoHelper,
+                                mHealthConnectMappings,
+                                mInternalHealthConnectMappings,
+                                mChangeLogsHelper,
+                                mChangeLogsRequestHelper,
+                                mHealthDataCategoryPriorityHelper,
+                                mPreferenceHelper,
+                                mExportImportSettingsStorage)
+                        : null;
+        mCloudRestoreManager = Flags.cloudBackupAndRestore() ? new CloudRestoreManager() : null;
     }
 
     public void onUserSwitching(UserHandle currentForegroundUser) {
         mCurrentForegroundUser = currentForegroundUser;
-        mBackupRestore.setupForUser(currentForegroundUser);
-        HealthConnectThreadScheduler.scheduleInternalTask(
-                () ->
-                        mHealthDataCategoryPriorityHelper.maybeAddContributingAppsToPriorityList(
-                                mContext));
     }
 
     @Override
@@ -486,17 +518,15 @@
                     mDataPermissionEnforcer.enforceRecordsWritePermissions(
                             recordInternals, attributionSource);
                     UpsertTransactionRequest insertRequest =
-                            new UpsertTransactionRequest(
-                                    attributionSource.getPackageName(),
+                            UpsertTransactionRequest.createForInsert(
+                                    Objects.requireNonNull(attributionSource.getPackageName()),
                                     recordInternals,
                                     mDeviceInfoHelper,
-                                    mContext,
-                                    /* isInsertRequest */ true,
+                                    mAppInfoHelper,
                                     mDataPermissionEnforcer.collectExtraWritePermissionStateMapping(
-                                            recordInternals, attributionSource),
-                                    mAppInfoHelper);
+                                            recordInternals, attributionSource));
                     List<String> uuids =
-                            mTransactionManager.insertAll(
+                            mTransactionManager.insertAllRecords(
                                     mAppInfoHelper, mAccessLogsHelper, insertRequest);
                     tryAndReturnResult(callback, uuids, logger);
 
@@ -514,7 +544,7 @@
     }
 
     private void postInsertTasks(AttributionSource attributionSource, RecordsParcel recordsParcel) {
-        ActivityDateHelper.insertRecordDate(recordsParcel.getRecords());
+        mActivityDateHelper.insertRecordDate(recordsParcel.getRecords());
         Set<Integer> recordsTypesInsertedSet =
                 recordsParcel.getRecords().stream()
                         .map(RecordInternal::getRecordType)
@@ -569,10 +599,11 @@
                         logger.setCallerForegroundState(isInForeground);
 
                         if (!isInForeground) {
-                            mDataPermissionEnforcer.enforceBackgroundReadRestrictions(
-                                    uid,
+                            mContext.enforcePermission(
+                                    READ_HEALTH_DATA_IN_BACKGROUND,
                                     pid,
-                                    /* errorMessage= */ attributionSource.getPackageName()
+                                    uid,
+                                    attributionSource.getPackageName()
                                             + "must be in foreground to call aggregate method");
                         }
                         tryAcquireApiCallQuota(
@@ -583,7 +614,7 @@
                         boolean enforceSelfRead =
                                 mDataPermissionEnforcer.enforceReadAccessAndGetEnforceSelfRead(
                                         recordTypesToTest, attributionSource);
-                        if (!hasReadHistoryPermission(uid, pid)) {
+                        if (!isPermissionGranted(READ_HEALTH_DATA_HISTORY, uid, pid)) {
                             startDateAccess =
                                     mPermissionHelper
                                             .getHealthDataStartDateAccessOrThrow(
@@ -601,14 +632,18 @@
                                                                 ::getAggregationTypeFor)
                                                 .collect(Collectors.toList()));
                     }
+                    boolean shouldRecordAccessLog = !holdsDataManagementPermission;
                     callback.onResult(
                             new AggregateTransactionRequest(
                                             mAppInfoHelper,
                                             attributionSource.getPackageName(),
                                             request,
                                             mHealthDataCategoryPriorityHelper,
+                                            mInternalHealthConnectMappings,
+                                            mTransactionManager,
                                             startDateAccess)
-                                    .getAggregateDataResponseParcel(mAccessLogsHelper));
+                                    .getAggregateDataResponseParcel(
+                                            mAccessLogsHelper, shouldRecordAccessLog));
                     logger.setDataTypesFromRecordTypes(recordTypesToTest)
                             .setHealthDataServiceApiStatusSuccess();
                 },
@@ -669,10 +704,10 @@
                             // then enforce self read
                             enforceSelfRead = true;
                         } else if (!isInForeground) {
-                            // If Background Read feature is disabled
-                            // or READ_HEALTH_DATA_IN_BACKGROUND permission is not granted,
+                            // If READ_HEALTH_DATA_IN_BACKGROUND permission is not granted,
                             // then enforce self read
-                            enforceSelfRead = isOnlySelfReadInBackgroundAllowed(uid, pid);
+                            enforceSelfRead =
+                                    !isPermissionGranted(READ_HEALTH_DATA_IN_BACKGROUND, uid, pid);
                         }
                         if (request.getRecordIdFiltersParcel() == null) {
                             // Only enforce requested packages if this is a
@@ -684,7 +719,7 @@
                                     callingPackageName,
                                     enforceSelfRead,
                                     "recordType: "
-                                            + mRecordMapper
+                                            + mHealthConnectMappings
                                                     .getRecordIdToExternalRecordClassMap()
                                                     .get(request.getRecordType()));
                         }
@@ -705,7 +740,8 @@
                     try {
                         long startDateAccessEpochMilli = request.getStartTime();
 
-                        if (!holdsDataManagementPermission && !hasReadHistoryPermission(uid, pid)) {
+                        if (!holdsDataManagementPermission
+                                && !isPermissionGranted(READ_HEALTH_DATA_HISTORY, uid, pid)) {
                             Instant startDateAccessInstant =
                                     mPermissionHelper.getHealthDataStartDateAccessOrThrow(
                                             callingPackageName, userHandle);
@@ -738,13 +774,15 @@
 
                         List<RecordInternal<?>> records;
                         long pageToken;
+                        boolean shouldRecordAccessLog = !holdsDataManagementPermission;
                         if (request.getRecordIdFiltersParcel() != null) {
                             records =
                                     mTransactionManager.readRecordsByIds(
                                             readTransactionRequest,
                                             mAppInfoHelper,
                                             mAccessLogsHelper,
-                                            mDeviceInfoHelper);
+                                            mDeviceInfoHelper,
+                                            shouldRecordAccessLog);
                             pageToken = DEFAULT_LONG;
                         } else {
                             Pair<List<RecordInternal<?>>, PageTokenWrapper> readRecordsResponse =
@@ -752,7 +790,8 @@
                                             readTransactionRequest,
                                             mAppInfoHelper,
                                             mAccessLogsHelper,
-                                            mDeviceInfoHelper);
+                                            mDeviceInfoHelper,
+                                            shouldRecordAccessLog);
                             records = readRecordsResponse.first;
                             pageToken = readRecordsResponse.second.encode();
                         }
@@ -866,15 +905,13 @@
                     mDataPermissionEnforcer.enforceRecordsWritePermissions(
                             recordInternals, attributionSource);
                     UpsertTransactionRequest request =
-                            new UpsertTransactionRequest(
-                                    attributionSource.getPackageName(),
+                            UpsertTransactionRequest.createForUpdate(
+                                    Objects.requireNonNull(attributionSource.getPackageName()),
                                     recordInternals,
                                     mDeviceInfoHelper,
-                                    mContext,
-                                    /* isInsertRequest */ false,
+                                    mAppInfoHelper,
                                     mDataPermissionEnforcer.collectExtraWritePermissionStateMapping(
-                                            recordInternals, attributionSource),
-                                    mAppInfoHelper);
+                                            recordInternals, attributionSource));
                     mTransactionManager.updateAll(mAppInfoHelper, mAccessLogsHelper, request);
                     tryAndReturnResult(callback, logger);
                     logRecordTypeSpecificUpsertMetrics(
@@ -883,7 +920,7 @@
                     // Update activity dates table
                     HealthConnectThreadScheduler.scheduleInternalTask(
                             () ->
-                                    ActivityDateHelper.reSyncByRecordTypeIds(
+                                    mActivityDateHelper.reSyncByRecordTypeIds(
                                             recordInternals.stream()
                                                     .map(RecordInternal::getRecordType)
                                                     .toList()));
@@ -929,8 +966,10 @@
                             request.getRecordTypesList(), attributionSource);
                     callback.onResult(
                             new ChangeLogTokenResponse(
-                                    ChangeLogsRequestHelper.getToken(
-                                            attributionSource.getPackageName(), request)));
+                                    mChangeLogsRequestHelper.getToken(
+                                            mChangeLogsHelper.getLatestRowId(),
+                                            attributionSource.getPackageName(),
+                                            request)));
                     logger.setHealthDataServiceApiStatusSuccess();
                 },
                 logger,
@@ -970,15 +1009,16 @@
                     logger.setCallerForegroundState(isInForeground);
 
                     if (!isInForeground) {
-                        mDataPermissionEnforcer.enforceBackgroundReadRestrictions(
-                                uid,
+                        mContext.enforcePermission(
+                                READ_HEALTH_DATA_IN_BACKGROUND,
                                 pid,
-                                /* errorMessage= */ callerPackageName
+                                uid,
+                                callerPackageName
                                         + "must be in foreground to call getChangeLogs method");
                     }
 
                     ChangeLogsRequestHelper.TokenRequest changeLogsTokenRequest =
-                            ChangeLogsRequestHelper.getRequest(
+                            mChangeLogsRequestHelper.getRequest(
                                     callerPackageName, request.getToken());
                     tryAcquireApiCallQuota(
                             uid, QuotaCategory.QUOTA_CATEGORY_READ, isInForeground, logger);
@@ -989,7 +1029,7 @@
                     mDataPermissionEnforcer.enforceRecordIdsReadPermissions(
                             changeLogsTokenRequest.getRecordTypes(), attributionSource);
                     long startDateAccessEpochMilli = DEFAULT_LONG;
-                    if (!hasReadHistoryPermission(uid, pid)) {
+                    if (!isPermissionGranted(READ_HEALTH_DATA_HISTORY, uid, pid)) {
                         startDateAccessEpochMilli =
                                 mPermissionHelper
                                         .getHealthDataStartDateAccessOrThrow(
@@ -997,8 +1037,11 @@
                                         .toEpochMilli();
                     }
                     final ChangeLogsHelper.ChangeLogsResponse changeLogsResponse =
-                            ChangeLogsHelper.getChangeLogs(
-                                    mAppInfoHelper, changeLogsTokenRequest, request);
+                            mChangeLogsHelper.getChangeLogs(
+                                    mAppInfoHelper,
+                                    changeLogsTokenRequest,
+                                    request,
+                                    mChangeLogsRequestHelper);
 
                     Map<Integer, List<UUID>> recordTypeToInsertedUuids =
                             ChangeLogsHelper.getRecordTypeToInsertedUuids(
@@ -1024,7 +1067,8 @@
                                             isReadingSelfData),
                                     mAppInfoHelper,
                                     mAccessLogsHelper,
-                                    mDeviceInfoHelper);
+                                    mDeviceInfoHelper,
+                                    /* shouldRecordAccessLog= */ true);
 
                     List<DeletedLog> deletedLogs =
                             ChangeLogsHelper.getDeletedLogs(changeLogsResponse.getChangeLogsMap());
@@ -1078,7 +1122,7 @@
                             (!request.getRecordTypeFilters().isEmpty())
                                     ? request.getRecordTypeFilters()
                                     : new ArrayList<>(
-                                            mRecordMapper
+                                            mHealthConnectMappings
                                                     .getRecordIdToExternalRecordClassMap()
                                                     .keySet());
                     // Requests from non controller apps are not allowed to use non-id
@@ -1146,7 +1190,7 @@
                             (!request.getRecordTypeFilters().isEmpty())
                                     ? request.getRecordTypeFilters()
                                     : new ArrayList<>(
-                                            mRecordMapper
+                                            mHealthConnectMappings
                                                     .getRecordIdToExternalRecordClassMap()
                                                     .keySet());
 
@@ -1184,7 +1228,7 @@
                                 attributionSource.getPackageName(), request, mAppInfoHelper)
                         .setHasManageHealthDataPermission(hasDataManagementPermission(uid, pid));
         int numberOfRecordsDeleted =
-                mTransactionManager.deleteAll(
+                mTransactionManager.deleteAllRecords(
                         deleteTransactionRequest, shouldRecordDeleteAccessLogs, mAccessLogsHelper);
         tryAndReturnResult(callback, logger);
         HealthConnectThreadScheduler.scheduleInternalTask(
@@ -1197,10 +1241,8 @@
     /** API to get Priority for {@code dataCategory} */
     @Override
     public void getCurrentPriority(
-            String packageName,
-            @HealthDataCategory.Type int dataCategory,
-            IGetPriorityResponseCallback callback) {
-        checkParamsNonNull(packageName, callback);
+            @HealthDataCategory.Type int dataCategory, IGetPriorityResponseCallback callback) {
+        checkParamsNonNull(callback);
         ErrorCallback errorCallback = callback::onError;
 
         final int uid = Binder.getCallingUid();
@@ -1214,7 +1256,7 @@
                         throwExceptionIfDataSyncInProgress();
                         List<DataOrigin> dataOriginInPriorityOrder =
                                 mHealthDataCategoryPriorityHelper
-                                        .getPriorityOrder(dataCategory, mContext)
+                                        .syncAndGetPriorityOrder(dataCategory)
                                         .stream()
                                         .map(
                                                 (name) ->
@@ -1228,8 +1270,7 @@
                                                 dataOriginInPriorityOrder)));
                     } catch (SQLiteException sqLiteException) {
                         Slog.e(TAG, "SQLiteException: ", sqLiteException);
-                        tryAndThrowException(
-                                errorCallback, sqLiteException, HealthConnectException.ERROR_IO);
+                        tryAndThrowException(errorCallback, sqLiteException, ERROR_IO);
                     } catch (SecurityException securityException) {
                         Slog.e(TAG, "SecurityException: ", securityException);
                         tryAndThrowException(errorCallback, securityException, ERROR_SECURITY);
@@ -1249,10 +1290,8 @@
     /** API to update priority for permission category(ies) */
     @Override
     public void updatePriority(
-            String packageName,
-            UpdatePriorityRequestParcel updatePriorityRequest,
-            IEmptyResponseCallback callback) {
-        checkParamsNonNull(packageName, updatePriorityRequest, callback);
+            UpdatePriorityRequestParcel updatePriorityRequest, IEmptyResponseCallback callback) {
+        checkParamsNonNull(updatePriorityRequest, callback);
         ErrorCallback errorCallback = callback::onError;
 
         final int uid = Binder.getCallingUid();
@@ -1270,8 +1309,7 @@
                         callback.onResult();
                     } catch (SQLiteException sqLiteException) {
                         Slog.e(TAG, "SQLiteException: ", sqLiteException);
-                        tryAndThrowException(
-                                errorCallback, sqLiteException, HealthConnectException.ERROR_IO);
+                        tryAndThrowException(errorCallback, sqLiteException, ERROR_IO);
                     } catch (SecurityException securityException) {
                         Slog.e(TAG, "SecurityException: ", securityException);
                         tryAndThrowException(errorCallback, securityException, ERROR_SECURITY);
@@ -1303,12 +1341,11 @@
                         enforceIsForegroundUser(userHandle);
                         mContext.enforcePermission(MANAGE_HEALTH_DATA_PERMISSION, pid, uid, null);
                         throwExceptionIfDataSyncInProgress();
-                        AutoDeleteService.setRecordRetentionPeriodInDays(days, mPreferenceHelper);
+                        mPreferencesManager.setRecordRetentionPeriodInDays(days);
                         callback.onResult();
                     } catch (SQLiteException sqLiteException) {
                         Slog.e(TAG, "SQLiteException: ", sqLiteException);
-                        tryAndThrowException(
-                                wrappedCallback, sqLiteException, HealthConnectException.ERROR_IO);
+                        tryAndThrowException(wrappedCallback, sqLiteException, ERROR_IO);
                     } catch (SecurityException securityException) {
                         Slog.e(TAG, "SecurityException: ", securityException);
                         tryAndThrowException(wrappedCallback, securityException, ERROR_SECURITY);
@@ -1333,7 +1370,7 @@
         throwExceptionIfDataSyncInProgress();
         try {
             mContext.enforceCallingPermission(MANAGE_HEALTH_DATA_PERMISSION, null);
-            return AutoDeleteService.getRecordRetentionPeriodInDays(mPreferenceHelper);
+            return mPreferencesManager.getRecordRetentionPeriodInDays();
         } catch (Exception e) {
             if (e instanceof SecurityException) {
                 throw e;
@@ -1380,8 +1417,7 @@
                                 new ApplicationInfoResponseParcel(applicationInfosWithData));
                     } catch (SQLiteException sqLiteException) {
                         Slog.e(TAG, "SqlException: ", sqLiteException);
-                        tryAndThrowException(
-                                errorCallback, sqLiteException, HealthConnectException.ERROR_IO);
+                        tryAndThrowException(errorCallback, sqLiteException, ERROR_IO);
                     } catch (SecurityException securityException) {
                         Slog.e(TAG, "SecurityException: ", securityException);
                         tryAndThrowException(errorCallback, securityException, ERROR_SECURITY);
@@ -1417,8 +1453,7 @@
                                 new RecordTypeInfoResponseParcel(
                                         getPopulatedRecordTypeInfoResponses()));
                     } catch (SQLiteException sqLiteException) {
-                        tryAndThrowException(
-                                errorCallback, sqLiteException, HealthConnectException.ERROR_IO);
+                        tryAndThrowException(errorCallback, sqLiteException, ERROR_IO);
                     } catch (SecurityException securityException) {
                         Slog.e(TAG, "SecurityException: ", securityException);
                         tryAndThrowException(errorCallback, securityException, ERROR_SECURITY);
@@ -1497,14 +1532,13 @@
                         mContext.enforcePermission(MANAGE_HEALTH_DATA_PERMISSION, pid, uid, null);
                         throwExceptionIfDataSyncInProgress();
                         List<LocalDate> localDates =
-                                ActivityDateHelper.getActivityDates(
+                                mActivityDateHelper.getActivityDates(
                                         activityDatesRequestParcel.getRecordTypes());
 
                         callback.onResult(new ActivityDatesResponseParcel(localDates));
                     } catch (SQLiteException sqLiteException) {
                         Slog.e(TAG, "SqlException: ", sqLiteException);
-                        tryAndThrowException(
-                                errorCallback, sqLiteException, HealthConnectException.ERROR_IO);
+                        tryAndThrowException(errorCallback, sqLiteException, ERROR_IO);
                     } catch (SecurityException securityException) {
                         Slog.e(TAG, "SecurityException: ", securityException);
                         tryAndThrowException(errorCallback, securityException, ERROR_SECURITY);
@@ -1716,9 +1750,7 @@
                 } catch (IOException e) {
                     Slog.e(TAG, "IOException: ", e);
                     exceptionsByFileName.put(
-                            entry.getKey(),
-                            new HealthConnectException(
-                                    HealthConnectException.ERROR_IO, e.getMessage()));
+                            entry.getKey(), new HealthConnectException(ERROR_IO, e.getMessage()));
                 }
             }
 
@@ -1786,7 +1818,7 @@
                 DELETE_STAGED_HEALTH_CONNECT_REMOTE_DATA_PERMISSION, null);
         mBackupRestore.deleteAndResetEverything(userHandle);
         mMigrationStateManager.clearCaches(mContext);
-        DatabaseHelper.clearAllData(mTransactionManager);
+        mDatabaseHelpers.clearAllData(mTransactionManager);
         RateLimiter.clearCache();
         String[] packageNames = mContext.getPackageManager().getPackagesForUid(getCallingUid());
         for (String packageName : packageNames) {
@@ -1855,8 +1887,7 @@
                                 callback.onError(
                                         new HealthConnectExceptionParcel(
                                                 new HealthConnectException(
-                                                        HealthConnectException.ERROR_IO,
-                                                        e.getMessage())));
+                                                        ERROR_IO, e.getMessage())));
                             } catch (RemoteException remoteException) {
                                 Log.e(
                                         TAG,
@@ -1928,9 +1959,7 @@
                         try {
                             callback.onError(
                                     new HealthConnectExceptionParcel(
-                                            new HealthConnectException(
-                                                    HealthConnectException.ERROR_IO,
-                                                    e.getMessage())));
+                                            new HealthConnectException(ERROR_IO, e.getMessage())));
                         } catch (RemoteException remoteException) {
                             Log.e(
                                     TAG,
@@ -1959,7 +1988,7 @@
                     () -> {
                         try {
                             ExportImportJobs.schedulePeriodicExportJob(
-                                    userHandle.getIdentifier(),
+                                    userHandle,
                                     mContext,
                                     mExportImportSettingsStorage,
                                     mExportManager);
@@ -1969,8 +1998,7 @@
                     });
         } catch (SQLiteException sqLiteException) {
             Slog.e(TAG, "SQLiteException: ", sqLiteException);
-            throw new HealthConnectException(
-                    HealthConnectException.ERROR_IO, sqLiteException.toString());
+            throw new HealthConnectException(ERROR_IO, sqLiteException.toString());
         } catch (SecurityException securityException) {
             Slog.e(TAG, "SecurityException: ", securityException);
             throw new HealthConnectException(
@@ -2079,8 +2107,28 @@
                         mImportManager.runImport(userHandle, file);
                         callback.onResult();
                     } catch (Exception exception) {
-                        throw new HealthConnectException(
-                                HealthConnectException.ERROR_IO, exception.toString());
+                        throw new HealthConnectException(ERROR_IO, exception.toString());
+                    }
+                });
+    }
+
+    @Override
+    public void runImmediateExport(Uri file, IEmptyResponseCallback callback) {
+        checkParamsNonNull(file);
+
+        final int uid = Binder.getCallingUid();
+        final int pid = Binder.getCallingPid();
+        final UserHandle userHandle = Binder.getCallingUserHandle();
+        HealthConnectThreadScheduler.scheduleControllerTask(
+                () -> {
+                    try {
+                        enforceIsForegroundUser(userHandle);
+                        mContext.enforcePermission(MANAGE_HEALTH_DATA_PERMISSION, pid, uid, null);
+                        // TODO(b/370954019): Modify runExport to use specific file.
+                        mExportManager.runExport(userHandle);
+                        callback.onResult();
+                    } catch (Exception exception) {
+                        throw new HealthConnectException(ERROR_IO, exception.toString());
                     }
                 });
     }
@@ -2136,7 +2184,8 @@
         boolean holdsDataManagementPermission = hasDataManagementPermission(uid, pid);
         String packageName = attributionSource.getPackageName();
         HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, INSERT_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, CREATE_MEDICAL_DATA_SOURCE)
                         .setPackageName(packageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2205,7 +2254,8 @@
         final String callingPackageName =
                 Objects.requireNonNull(attributionSource.getPackageName());
         final HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, READ_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, GET_MEDICAL_DATA_SOURCES_BY_IDS)
                         .setPackageName(callingPackageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2222,6 +2272,19 @@
                                 unsupportedException.getErrorCode());
                         return;
                     }
+
+                    if (ids.size() > MAXIMUM_PAGE_SIZE) {
+                        HealthConnectException invalidSizeException =
+                                new HealthConnectException(
+                                        ERROR_INVALID_ARGUMENT,
+                                        "The number of requested IDs must be <= "
+                                                + MAXIMUM_PAGE_SIZE);
+                        tryAndThrowException(
+                                errorCallback,
+                                invalidSizeException,
+                                invalidSizeException.getErrorCode());
+                        return;
+                    }
                     List<UUID> dataSourceUuids =
                             validateMedicalDataSourceIds(ids.stream().collect(toSet())).stream()
                                     .toList();
@@ -2254,11 +2317,12 @@
                                             + " data");
                         }
 
-                        // If reading from background while Background Read feature is disabled
-                        // or READ_HEALTH_DATA_IN_BACKGROUND permission is not granted, then
-                        // enforce self read.
+                        // If reading from background while READ_HEALTH_DATA_IN_BACKGROUND
+                        // permission is not granted, then enforce self read.
                         boolean isCalledFromBgWithoutBgRead =
-                                !isInForeground && isOnlySelfReadInBackgroundAllowed(uid, pid);
+                                !isInForeground
+                                        && !isPermissionGranted(
+                                                READ_HEALTH_DATA_IN_BACKGROUND, uid, pid);
 
                         if (Constants.DEBUG) {
                             Slog.d(
@@ -2281,7 +2345,6 @@
                                                         WRITE_MEDICAL_DATA),
                                                 isCalledFromBgWithoutBgRead,
                                                 mAppInfoHelper);
-                        // TODO(b/343921816): Creates access logs if necessary.
                     }
                     logger.setNumberOfRecords(medicalDataSources.size());
                     tryAndReturnResult(callback, medicalDataSources, logger);
@@ -2311,7 +2374,8 @@
         final String callingPackageName =
                 Objects.requireNonNull(attributionSource.getPackageName());
         final HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, READ_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, GET_MEDICAL_DATA_SOURCES_BY_REQUESTS)
                         .setPackageName(callingPackageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2357,11 +2421,12 @@
                                             + " data");
                         }
 
-                        // If reading from background while Background Read feature is disabled
-                        // or READ_HEALTH_DATA_IN_BACKGROUND permission is not granted, then
-                        // enforce self read.
+                        // If reading from background while READ_HEALTH_DATA_IN_BACKGROUND
+                        // permission is not granted, then enforce self read.
                         boolean isCalledFromBgWithoutBgRead =
-                                !isInForeground && isOnlySelfReadInBackgroundAllowed(uid, pid);
+                                !isInForeground
+                                        && !isPermissionGranted(
+                                                READ_HEALTH_DATA_IN_BACKGROUND, uid, pid);
 
                         if (Constants.DEBUG) {
                             Slog.d(
@@ -2383,7 +2448,6 @@
                                                 grantedMedicalPermissions.contains(
                                                         WRITE_MEDICAL_DATA),
                                                 isCalledFromBgWithoutBgRead);
-                        // TODO(b/343921816): Creates access logs if necessary.
                     }
                     logger.setNumberOfRecords(medicalDataSources.size());
                     tryAndReturnResult(callback, medicalDataSources, logger);
@@ -2407,7 +2471,8 @@
         final String callingPackageName =
                 Objects.requireNonNull(attributionSource.getPackageName());
         final HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, DELETE_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, DELETE_MEDICAL_DATA_SOURCE_WITH_DATA)
                         .setPackageName(callingPackageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2437,9 +2502,9 @@
                     enforceIsForegroundUser(userHandle);
                     verifyPackageNameFromUid(uid, attributionSource);
                     throwExceptionIfDataSyncInProgress();
-                    Long appInfoIdRestriction;
                     if (holdsDataManagementPermission) {
-                        appInfoIdRestriction = null;
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(
+                                uuid);
                     } else {
                         boolean isInForeground = mAppOpsManagerLocal.isUidInForeground(uid);
                         logger.setCallerForegroundState(isInForeground);
@@ -2447,17 +2512,11 @@
                                 uid, QuotaCategory.QUOTA_CATEGORY_WRITE, isInForeground, logger);
                         mMedicalDataPermissionEnforcer.enforceWriteMedicalDataPermission(
                                 attributionSource);
-                        appInfoIdRestriction =
-                                mAppInfoHelper.getAppInfoId(attributionSource.getPackageName());
-                        if (appInfoIdRestriction == Constants.DEFAULT_LONG) {
-                            throw new IllegalArgumentException(
-                                    "Deletion not permitted as app has inserted no data.");
-                        }
+                        // This also deletes the contained data, because they are referenced
+                        // by foreign key, and so are handled by ON DELETE CASCADE in the db.
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                                uuid, attributionSource.getPackageName());
                     }
-
-                    // This also deletes the contained data, because they are referenced
-                    // by foreign key, and so are handled by ON DELETE CASCADE in the db.
-                    mMedicalDataSourceHelper.deleteMedicalDataSource(uuid, appInfoIdRestriction);
                     tryAndReturnResult(callback, logger);
                 },
                 logger,
@@ -2466,13 +2525,47 @@
                 /* isController= */ holdsDataManagementPermission);
     }
 
+    /**
+     * Service implementation of {@link HealthConnectManager#upsertMedicalResources} when the flag
+     * PHR_UPSERT_FIX_USE_SHARED_MEMORY is enabled.
+     *
+     * <p>The {@link UpsertMedicalResourceRequestsParcel} will be written to shared memory if
+     * required, so more data can be sent.
+     */
+    @Override
+    public void upsertMedicalResourcesFromRequestsParcel(
+            AttributionSource attributionSource,
+            UpsertMedicalResourceRequestsParcel requestsParcel,
+            IMedicalResourceListParcelResponseCallback callback) {
+        checkParamsNonNull(attributionSource, requestsParcel, callback);
+
+        final ErrorCallback errorCallback = callback::onError;
+
+        upsertMedicalResources(
+                attributionSource, requestsParcel.getUpsertRequests(), callback, errorCallback);
+    }
+
+    /**
+     * Service implementation of {@link HealthConnectManager#upsertMedicalResources} when the flag
+     * PHR_UPSERT_FIX_USE_SHARED_MEMORY is disabled.
+     */
     @Override
     public void upsertMedicalResources(
             AttributionSource attributionSource,
             List<UpsertMedicalResourceRequest> requests,
             IMedicalResourcesResponseCallback callback) {
         checkParamsNonNull(attributionSource, requests, callback);
+
         final ErrorCallback errorCallback = callback::onError;
+
+        upsertMedicalResources(attributionSource, requests, callback, errorCallback);
+    }
+
+    private void upsertMedicalResources(
+            AttributionSource attributionSource,
+            List<UpsertMedicalResourceRequest> requests,
+            android.os.IInterface callback,
+            ErrorCallback errorCallback) {
         final int uid = Binder.getCallingUid();
         final int pid = Binder.getCallingPid();
         final UserHandle userHandle = Binder.getCallingUserHandle();
@@ -2480,7 +2573,8 @@
         final String callingPackageName =
                 Objects.requireNonNull(attributionSource.getPackageName());
         final HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, INSERT_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, UPSERT_MEDICAL_RESOURCES)
                         .setPackageName(callingPackageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2499,7 +2593,7 @@
                     }
 
                     if (requests.isEmpty()) {
-                        tryAndReturnResult(callback, List.of(), logger);
+                        tryAndReturnMedicalResourcesResult(callback, List.of(), logger);
                     }
 
                     enforceIsForegroundUser(userHandle);
@@ -2527,20 +2621,43 @@
                     mMedicalDataPermissionEnforcer.enforceWriteMedicalDataPermission(
                             attributionSource);
 
+                    // Initialise validator when upsertMedicalResources is called for the
+                    // first time to avoid unnecessary initialisation when PHR apis are not used.
+                    if (Flags.phrFhirStructuralValidation() && mFhirResourceValidator == null) {
+                        mFhirResourceValidator = new FhirResourceValidator();
+                    }
+
                     List<UpsertMedicalResourceInternalRequest> validatedMedicalResourcesToUpsert =
                             new ArrayList<>();
                     for (UpsertMedicalResourceRequest upsertMedicalResourceRequest : requests) {
                         MedicalResourceValidator validator =
-                                new MedicalResourceValidator(upsertMedicalResourceRequest);
+                                new MedicalResourceValidator(
+                                        upsertMedicalResourceRequest, mFhirResourceValidator);
                         validatedMedicalResourcesToUpsert.add(
                                 validator.validateAndCreateInternalRequest());
                     }
+
+                    // Check that ids within the list of upsert requests are unique
+                    Set<MedicalResourceId> idsToUpsert =
+                            validatedMedicalResourcesToUpsert.stream()
+                                    .map(UpsertMedicalResourceInternalRequest::getMedicalResourceId)
+                                    .collect(toSet());
+                    if (idsToUpsert.size() != validatedMedicalResourcesToUpsert.size()) {
+                        throw new IllegalArgumentException(
+                                "Found multiple upsert requests with the same FHIR resource id,"
+                                        + " type and data source id.");
+                    }
+
                     List<MedicalResource> medicalResources =
                             mMedicalResourceHelper.upsertMedicalResources(
                                     callingPackageName, validatedMedicalResourcesToUpsert);
+                    logger.setMedicalResourceTypes(
+                            medicalResources.stream()
+                                    .map(MedicalResource::getType)
+                                    .collect(toSet()));
                     logger.setNumberOfRecords(medicalResources.size());
 
-                    tryAndReturnResult(callback, medicalResources, logger);
+                    tryAndReturnMedicalResourcesResult(callback, medicalResources, logger);
                 },
                 logger,
                 errorCallback,
@@ -2562,7 +2679,8 @@
         final String callingPackageName =
                 Objects.requireNonNull(attributionSource.getPackageName());
         final HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, READ_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, READ_MEDICAL_RESOURCES_BY_IDS)
                         .setPackageName(callingPackageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2580,8 +2698,15 @@
                         return;
                     }
 
+                    if (personalHealthRecordTelemetry()) {
+                        // Stores the timestamp for calls made by ANY client, including the
+                        // controller
+                        mPreferencesManager.setLastPhrReadMedicalResourcesApiTimeStamp(
+                                mTimeSource.getInstantNow());
+                    }
+
                     if (medicalResourceIds.isEmpty()) {
-                        callback.onResult(new ReadMedicalResourcesResponse(List.of(), null));
+                        callback.onResult(new ReadMedicalResourcesResponse(List.of(), null, 0));
                         return;
                     }
 
@@ -2629,11 +2754,12 @@
                                             + " data");
                         }
 
-                        // If reading from background while Background Read feature is disabled
-                        // or READ_HEALTH_DATA_IN_BACKGROUND permission is not granted, then
-                        // enforce self read.
+                        // If reading from background while READ_HEALTH_DATA_IN_BACKGROUND
+                        // permission is not granted, then enforce self read.
                         boolean isCalledFromBgWithoutBgRead =
-                                !isInForeground && isOnlySelfReadInBackgroundAllowed(uid, pid);
+                                !isInForeground
+                                        && !isPermissionGranted(
+                                                READ_HEALTH_DATA_IN_BACKGROUND, uid, pid);
 
                         if (Constants.DEBUG) {
                             Slog.d(
@@ -2658,10 +2784,7 @@
                     }
 
                     logger.setNumberOfRecords(medicalResources.size());
-
-                    // TODO(b/343921816): Creates access log.
-
-                    callback.onResult(new ReadMedicalResourcesResponse(medicalResources, null));
+                    callback.onResult(new ReadMedicalResourcesResponse(medicalResources, null, 0));
                     logger.setHealthDataServiceApiStatusSuccess();
                 },
                 logger,
@@ -2684,7 +2807,8 @@
         final String callingPackageName =
                 Objects.requireNonNull(attributionSource.getPackageName());
         final HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, READ_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, READ_MEDICAL_RESOURCES_BY_REQUESTS)
                         .setPackageName(callingPackageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2702,11 +2826,23 @@
                         return;
                     }
 
+                    if (personalHealthRecordTelemetry()) {
+                        // Stores the timestamp for calls made by ANY client, including the
+                        // controller
+                        mPreferencesManager.setLastPhrReadMedicalResourcesApiTimeStamp(
+                                mTimeSource.getInstantNow());
+                    }
+
                     enforceIsForegroundUser(userHandle);
                     verifyPackageNameFromUid(uid, attributionSource);
                     throwExceptionIfDataSyncInProgress();
 
                     PhrPageTokenWrapper pageTokenWrapper = PhrPageTokenWrapper.from(request);
+                    if (pageTokenWrapper.getRequest() == null) {
+                        throw new IllegalStateException("The request can not be null.");
+                    }
+                    logger.setMedicalResourceTypes(
+                            Set.of(pageTokenWrapper.getRequest().getMedicalResourceType()));
                     ReadMedicalResourcesInternalResponse response;
 
                     if (holdsDataManagementPermission) {
@@ -2733,10 +2869,10 @@
                             enforceSelfRead = true;
                         } else if (!isInForeground) {
                             // This is when read permission is granted but the app is reading from
-                            // the background. Then we enforce self read if Background Read feature
-                            // is disabled or READ_HEALTH_DATA_IN_BACKGROUND permission is not
-                            // granted.
-                            enforceSelfRead = isOnlySelfReadInBackgroundAllowed(uid, pid);
+                            // the background. Then we enforce self read if
+                            // READ_HEALTH_DATA_IN_BACKGROUND permission is not granted.
+                            enforceSelfRead =
+                                    !isPermissionGranted(READ_HEALTH_DATA_IN_BACKGROUND, uid, pid);
                         }
                         if (Constants.DEBUG) {
                             Slog.d(
@@ -2761,7 +2897,9 @@
 
                     callback.onResult(
                             new ReadMedicalResourcesResponse(
-                                    medicalResources, response.getPageToken()));
+                                    medicalResources,
+                                    response.getPageToken(),
+                                    response.getRemainingCount()));
                     logger.setHealthDataServiceApiStatusSuccess();
                 },
                 logger,
@@ -2793,7 +2931,8 @@
         final String callingPackageName =
                 Objects.requireNonNull(attributionSource.getPackageName());
         final HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, DELETE_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, DELETE_MEDICAL_RESOURCES_BY_IDS)
                         .setPackageName(callingPackageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2863,7 +3002,8 @@
         final String callingPackageName =
                 Objects.requireNonNull(attributionSource.getPackageName());
         final HealthConnectServiceLogger.Builder logger =
-                new HealthConnectServiceLogger.Builder(holdsDataManagementPermission, DELETE_DATA)
+                new HealthConnectServiceLogger.Builder(
+                                holdsDataManagementPermission, DELETE_MEDICAL_RESOURCES_BY_REQUESTS)
                         .setPackageName(callingPackageName);
 
         scheduleLoggingHealthDataApiErrors(
@@ -2881,8 +3021,9 @@
                         return;
                     }
 
-                    if (request.getDataSourceIds().isEmpty()
-                            && request.getMedicalResourceTypes().isEmpty()) {
+                    Set<Integer> medicalResourceTypes = request.getMedicalResourceTypes();
+                    logger.setMedicalResourceTypes(medicalResourceTypes);
+                    if (request.getDataSourceIds().isEmpty() && medicalResourceTypes.isEmpty()) {
                         tryAndReturnResult(callback, logger);
                         return;
                     }
@@ -2922,48 +3063,44 @@
         HealthConnectThreadScheduler.schedule(
                 mContext,
                 () -> {
+                    int errorCode = ERROR_UNKNOWN;
+                    Exception exception = null;
                     try {
                         task.execute();
-                    } catch (JSONException jsonException) {
-                        logger.setHealthDataServiceApiStatusError(HealthConnectException.ERROR_IO);
-                        Slog.e(TAG, "JSONException: ", jsonException);
-                        tryAndThrowException(
-                                errorCallback, jsonException, HealthConnectException.ERROR_IO);
-                    } catch (SQLiteException sqLiteException) {
-                        logger.setHealthDataServiceApiStatusError(HealthConnectException.ERROR_IO);
-                        Slog.e(TAG, "SQLiteException: ", sqLiteException);
-                        tryAndThrowException(
-                                errorCallback, sqLiteException, HealthConnectException.ERROR_IO);
+                    } catch (JSONException | SQLiteException jsonException) {
+                        errorCode = ERROR_IO;
+                        exception = jsonException;
                     } catch (SecurityException securityException) {
-                        logger.setHealthDataServiceApiStatusError(ERROR_SECURITY);
-                        Slog.e(TAG, "SecurityException: ", securityException);
-                        tryAndThrowException(errorCallback, securityException, ERROR_SECURITY);
+                        errorCode = ERROR_SECURITY;
+                        exception = securityException;
                     } catch (IllegalArgumentException illegalArgumentException) {
-                        logger.setHealthDataServiceApiStatusError(
-                                HealthConnectException.ERROR_INVALID_ARGUMENT);
-                        Slog.e(TAG, "IllegalArgumentException: ", illegalArgumentException);
-                        tryAndThrowException(
-                                errorCallback,
-                                illegalArgumentException,
-                                HealthConnectException.ERROR_INVALID_ARGUMENT);
-                    } catch (IllegalStateException illegalStateException) {
-                        logger.setHealthDataServiceApiStatusError(ERROR_INTERNAL);
-                        Slog.e(TAG, "IllegalStateException: ", illegalStateException);
-                        tryAndThrowException(errorCallback, illegalStateException, ERROR_INTERNAL);
+                        errorCode = ERROR_INVALID_ARGUMENT;
+                        exception = illegalArgumentException;
                     } catch (HealthConnectException healthConnectException) {
-                        logger.setHealthDataServiceApiStatusError(
-                                healthConnectException.getErrorCode());
-                        Slog.e(TAG, "HealthConnectException: ", healthConnectException);
-                        tryAndThrowException(
-                                errorCallback,
-                                healthConnectException,
-                                healthConnectException.getErrorCode());
-                    } catch (Exception e) {
-                        logger.setHealthDataServiceApiStatusError(ERROR_INTERNAL);
-                        Slog.e(TAG, "Exception: ", e);
-                        tryAndThrowException(errorCallback, e, ERROR_INTERNAL);
+                        errorCode = healthConnectException.getErrorCode();
+                        exception = healthConnectException;
+                    } catch (Exception e) { // including IllegalStateException
+                        errorCode = ERROR_INTERNAL;
+                        exception = e;
                     } finally {
-                        logger.build().log();
+                        try {
+                            if (exception != null) {
+                                String msg = exception.getClass().getSimpleName() + ": ";
+                                if (exception instanceof IllegalArgumentException
+                                        && Flags.logcatCensorIae()) {
+                                    Slog.e(TAG, getStackTraceOnlyString(exception));
+                                } else {
+                                    Slog.e(TAG, msg, exception);
+                                }
+                                if (errorCode == ERROR_UNKNOWN) {
+                                    Slog.e(TAG, "errorCode should not be ERROR_UNKNOWN!");
+                                }
+                                logger.setHealthDataServiceApiStatusError(errorCode);
+                                tryAndThrowException(errorCallback, exception, errorCode);
+                            }
+                        } finally {
+                            logger.build().log();
+                        }
                     }
                 },
                 uid,
@@ -2971,6 +3108,42 @@
     }
 
     /**
+     * Returns a string from an exception that contains the stack trace but not the message.
+     *
+     * <p>The message for an exception may reveal privacy sensitive information. So this method
+     * returns the stack trace as a string including the cause chain for the exception, if it
+     * exists. The stack trace is not communicated through Binder, so is lost to if it is not
+     * logged.
+     */
+    private static String getStackTraceOnlyString(Throwable ex) {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw, false);
+        pw.println(ex.getClass().getName());
+        printStackTrace(ex, pw);
+        Throwable cause = ex.getCause();
+        while (cause != null) {
+            pw.println(String.format("Caused by: %s", cause.getClass().getName()));
+            printStackTrace(cause, pw);
+            cause = cause.getCause();
+        }
+        pw.flush();
+        return sw.toString();
+    }
+
+    private static void printStackTrace(Throwable ex, PrintWriter pw) {
+        StackTraceElement[] stackTraceElements = ex.getStackTrace();
+        for (StackTraceElement element : stackTraceElements) {
+            pw.println(
+                    String.format(
+                            " at %s.%s(%s:%s)",
+                            element.getClassName(),
+                            element.getMethodName(),
+                            element.getFileName(),
+                            element.getLineNumber()));
+        }
+    }
+
+    /**
      * Retrieves {@link MedicalResourceTypeInfo} for each {@link
      * MedicalResource.MedicalResourceType}.
      */
@@ -3002,8 +3175,7 @@
                         throwExceptionIfDataSyncInProgress();
                         callback.onResult(getPopulatedMedicalResourceTypeInfos());
                     } catch (SQLiteException sqLiteException) {
-                        tryAndThrowException(
-                                errorCallback, sqLiteException, HealthConnectException.ERROR_IO);
+                        tryAndThrowException(errorCallback, sqLiteException, ERROR_IO);
                     } catch (SecurityException securityException) {
                         Slog.e(TAG, "SecurityException: ", securityException);
                         tryAndThrowException(errorCallback, securityException, ERROR_SECURITY);
@@ -3019,6 +3191,56 @@
                 });
     }
 
+    @Override
+    public void getChangesForBackup(
+            @Nullable String changeToken, IGetChangesForBackupResponseCallback callback) {
+        if (mCloudBackupManager == null) return;
+        checkParamsNonNull(callback);
+        final ErrorCallback errorCallback = callback::onError;
+        HealthConnectThreadScheduler.scheduleControllerTask(
+                () -> {
+                    try {
+                        callback.onResult(mCloudBackupManager.getChangesForBackup(changeToken));
+                    } catch (Exception e) {
+                        tryAndThrowException(errorCallback, e, ERROR_INTERNAL);
+                    }
+                });
+    }
+
+    @Override
+    public void getSettingsForBackup(IGetSettingsForBackupResponseCallback callback) {
+        if (mCloudBackupManager == null) return;
+        checkParamsNonNull(callback);
+        final ErrorCallback errorCallback = callback::onError;
+        HealthConnectThreadScheduler.scheduleControllerTask(
+                () -> {
+                    try {
+                        callback.onResult(mCloudBackupManager.getSettingsForBackup());
+                    } catch (Exception e) {
+                        tryAndThrowException(errorCallback, e, ERROR_INTERNAL);
+                    }
+                });
+    }
+
+    @Override
+    public void pushSettingsForRestore(
+            BackupSettings backupSettings, IEmptyResponseCallback callback) {
+        if (mCloudRestoreManager == null) return;
+        if (!cloudBackupAndRestore()) return;
+        checkParamsNonNull(backupSettings);
+        checkParamsNonNull(callback);
+        final ErrorCallback errorCallback = callback::onError;
+        HealthConnectThreadScheduler.scheduleControllerTask(
+                () -> {
+                    try {
+                        mCloudRestoreManager.pushSettingsForRestore(backupSettings);
+                        callback.onResult();
+                    } catch (Exception e) {
+                        tryAndThrowException(errorCallback, e, ERROR_INTERNAL);
+                    }
+                });
+    }
+
     // Cancel BR timeouts - this might be needed when a user is going into background.
     void cancelBackupRestoreTimeouts() {
         mBackupRestore.cancelAllJobs();
@@ -3083,11 +3305,6 @@
                 || mBackupRestore.isRestoreMergingInProgress();
     }
 
-    @VisibleForTesting
-    Set<String> getStagedRemoteFileNames(UserHandle userHandle) {
-        return mBackupRestore.getStagedRemoteFileNames(userHandle);
-    }
-
     private DataMigrationManager getDataMigrationManager(UserHandle userHandle) {
         final Context userContext = mContext.createContextAsUser(userHandle, 0);
 
@@ -3100,16 +3317,14 @@
                 mAppInfoHelper,
                 mHealthDataCategoryPriorityHelper,
                 mPriorityMigrationHelper,
-                mPreferenceHelper);
+                mMigrationEntityHelper,
+                mPreferencesManager);
     }
 
     private void enforceCallingPackageBelongsToUid(String packageName, int callingUid) {
         int packageUid;
         try {
-            packageUid =
-                    mContext.getPackageManager()
-                            .getPackageUid(
-                                    packageName, /* flags */ PackageManager.PackageInfoFlags.of(0));
+            packageUid = mContext.getPackageManager().getPackageUid(packageName, /* flags */ 0);
         } catch (PackageManager.NameNotFoundException e) {
             throw new IllegalStateException(packageName + " not found");
         }
@@ -3146,7 +3361,11 @@
         int claimedCallingUid = getPackageUid(actualCallingUserContext, claimedCallingPackage);
         if (claimedCallingUid != actualCallingUid) {
             throw new SecurityException(
-                    claimedCallingPackage + " does not belong to uid " + actualCallingUid);
+                    claimedCallingPackage
+                            + ", with uid "
+                            + claimedCallingUid
+                            + " does not belong to uid "
+                            + actualCallingUid);
         }
     }
 
@@ -3181,7 +3400,7 @@
 
     private Map<Integer, List<DataOrigin>> getPopulatedRecordTypeInfoResponses() {
         Map<Integer, Class<? extends Record>> recordIdToExternalRecordClassMap =
-                mRecordMapper.getRecordIdToExternalRecordClassMap();
+                mHealthConnectMappings.getRecordIdToExternalRecordClassMap();
         Map<Integer, List<DataOrigin>> recordTypeInfoResponses =
                 new ArrayMap<>(recordIdToExternalRecordClassMap.size());
         Map<Integer, Set<String>> recordTypeToContributingPackagesMap =
@@ -3211,7 +3430,6 @@
         Map<Integer, Set<MedicalDataSource>> resourceTypeToDataSourcesMap =
                 mMedicalResourceHelper.getMedicalResourceTypeToContributingDataSourcesMap();
         return MedicalResource.VALID_TYPES.stream()
-                .filter(type -> type != MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN)
                 .map(
                         medicalResourceType ->
                                 new MedicalResourceTypeInfo(
@@ -3233,21 +3451,6 @@
         return isPermissionGranted(MANAGE_HEALTH_DATA_PERMISSION, uid, pid);
     }
 
-    private boolean hasReadHistoryPermission(int uid, int pid) {
-        return mDeviceConfigManager.isHistoryReadFeatureEnabled()
-                && isPermissionGranted(READ_HEALTH_DATA_HISTORY, uid, pid);
-    }
-
-    /**
-     * Returns true if Background Read feature is disabled or {@link
-     * HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND} permission is not granted for the provided
-     * uid and pid, false otherwise.
-     */
-    private boolean isOnlySelfReadInBackgroundAllowed(int uid, int pid) {
-        return !mDeviceConfigManager.isBackgroundReadFeatureEnabled()
-                || !isPermissionGranted(READ_HEALTH_DATA_IN_BACKGROUND, uid, pid);
-    }
-
     private boolean isPermissionGranted(String permission, int uid, int pid) {
         return mContext.checkPermission(permission, pid, uid) == PERMISSION_GRANTED;
     }
@@ -3261,7 +3464,8 @@
         for (Entry<Integer, List<RecordInternal<?>>> recordTypeToRecordInternalsEntry :
                 recordTypeToRecordInternals.entrySet()) {
             RecordHelper<?> recordHelper =
-                    RecordHelperProvider.getRecordHelper(recordTypeToRecordInternalsEntry.getKey());
+                    mInternalHealthConnectMappings.getRecordHelper(
+                            recordTypeToRecordInternalsEntry.getKey());
             recordHelper.logUpsertMetrics(recordTypeToRecordInternalsEntry.getValue(), packageName);
         }
     }
@@ -3275,7 +3479,8 @@
         for (Entry<Integer, List<RecordInternal<?>>> recordTypeToRecordInternalsEntry :
                 recordTypeToRecordInternals.entrySet()) {
             RecordHelper<?> recordHelper =
-                    RecordHelperProvider.getRecordHelper(recordTypeToRecordInternalsEntry.getKey());
+                    mInternalHealthConnectMappings.getRecordHelper(
+                            recordTypeToRecordInternalsEntry.getKey());
             recordHelper.logReadMetrics(recordTypeToRecordInternalsEntry.getValue(), packageName);
         }
     }
@@ -3310,7 +3515,7 @@
     private void postDeleteTasks(List<Integer> recordTypeIdsToDelete) {
         if (recordTypeIdsToDelete != null && !recordTypeIdsToDelete.isEmpty()) {
             mAppInfoHelper.syncAppInfoRecordTypesUsed(new HashSet<>(recordTypeIdsToDelete));
-            ActivityDateHelper.reSyncByRecordTypeIds(recordTypeIdsToDelete);
+            mActivityDateHelper.reSyncByRecordTypeIds(recordTypeIdsToDelete);
         }
     }
 
@@ -3364,6 +3569,23 @@
         }
     }
 
+    private static void tryAndReturnMedicalResourcesResult(
+            android.os.IInterface callback,
+            List<MedicalResource> medicalResources,
+            HealthConnectServiceLogger.Builder logger) {
+        if (callback instanceof IMedicalResourcesResponseCallback) {
+            tryAndReturnResult(
+                    (IMedicalResourcesResponseCallback) callback, medicalResources, logger);
+        } else if (callback instanceof IMedicalResourceListParcelResponseCallback) {
+            tryAndReturnResult(
+                    (IMedicalResourceListParcelResponseCallback) callback,
+                    new MedicalResourceListParcel(medicalResources),
+                    logger);
+        } else {
+            throw new IllegalStateException("Unexpected callback type for upsertMedicalResources");
+        }
+    }
+
     private static void tryAndReturnResult(
             IMedicalResourcesResponseCallback callback,
             List<MedicalResource> medicalResources,
@@ -3377,6 +3599,19 @@
         }
     }
 
+    private static void tryAndReturnResult(
+            IMedicalResourceListParcelResponseCallback callback,
+            MedicalResourceListParcel medicalResourceListParcel,
+            HealthConnectServiceLogger.Builder logger) {
+        try {
+            callback.onResult(medicalResourceListParcel);
+            logger.setHealthDataServiceApiStatusSuccess();
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Remote call to return UpsertMedicalResourcesResponse failed", e);
+            logger.setHealthDataServiceApiStatusError(ERROR_INTERNAL);
+        }
+    }
+
     private static void tryAndThrowException(
             IMigrationCallback callback,
             Exception exception,
diff --git a/service/java/com/android/server/healthconnect/HealthConnectThreadScheduler.java b/service/java/com/android/server/healthconnect/HealthConnectThreadScheduler.java
index a2d8ebf..860c14e 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectThreadScheduler.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectThreadScheduler.java
@@ -24,10 +24,13 @@
 
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.Executors;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * A scheduler class to schedule task on the most relevant thread-pool.
@@ -52,79 +55,70 @@
 
     // Executor to run HC background tasks
     @VisibleForTesting
-    static volatile ThreadPoolExecutor sBackgroundThreadExecutor =
-            new ThreadPoolExecutor(
-                    NUM_EXECUTOR_THREADS_BACKGROUND,
-                    NUM_EXECUTOR_THREADS_BACKGROUND,
-                    KEEP_ALIVE_TIME_BACKGROUND,
-                    TimeUnit.SECONDS,
-                    new LinkedBlockingQueue<>());
+    static volatile ThreadPoolExecutor sBackgroundThreadExecutor = createBackgroundExecutor();
 
     // Executor to run HC background tasks
     @VisibleForTesting
     static volatile ThreadPoolExecutor sInternalBackgroundExecutor =
-            new ThreadPoolExecutor(
-                    NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
-                    NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
-                    KEEP_ALIVE_TIME_INTERNAL_BACKGROUND,
-                    TimeUnit.SECONDS,
-                    new LinkedBlockingQueue<>());
+            createInternalBackgroundExecutor();
 
     // Executor to run HC tasks for clients
     @VisibleForTesting
-    static volatile ThreadPoolExecutor sForegroundExecutor =
-            new ThreadPoolExecutor(
-                    NUM_EXECUTOR_THREADS_FOREGROUND,
-                    NUM_EXECUTOR_THREADS_FOREGROUND,
-                    KEEP_ALIVE_TIME_SHARED,
-                    TimeUnit.SECONDS,
-                    new LinkedBlockingQueue<>());
+    static volatile ThreadPoolExecutor sForegroundExecutor = createForegroundExecutor();
 
     // Executor to run HC controller tasks
     @VisibleForTesting
-    static volatile ThreadPoolExecutor sControllerExecutor =
-            new ThreadPoolExecutor(
-                    NUM_EXECUTOR_THREADS_CONTROLLER,
-                    NUM_EXECUTOR_THREADS_CONTROLLER,
-                    KEEP_ALIVE_TIME_CONTROLLER,
-                    TimeUnit.SECONDS,
-                    new LinkedBlockingQueue<>());
+    static volatile ThreadPoolExecutor sControllerExecutor = createControllerExecutor();
 
     public static void resetThreadPools() {
-        sInternalBackgroundExecutor =
-                new ThreadPoolExecutor(
-                        NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
-                        NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
-                        KEEP_ALIVE_TIME_INTERNAL_BACKGROUND,
-                        TimeUnit.SECONDS,
-                        new LinkedBlockingQueue<>());
+        sInternalBackgroundExecutor = createInternalBackgroundExecutor();
+        sBackgroundThreadExecutor = createBackgroundExecutor();
+        sForegroundExecutor = createForegroundExecutor();
+        sControllerExecutor = createControllerExecutor();
 
-        sBackgroundThreadExecutor =
-                new ThreadPoolExecutor(
-                        NUM_EXECUTOR_THREADS_BACKGROUND,
-                        NUM_EXECUTOR_THREADS_BACKGROUND,
-                        KEEP_ALIVE_TIME_BACKGROUND,
-                        TimeUnit.SECONDS,
-                        new LinkedBlockingQueue<>());
-
-        sForegroundExecutor =
-                new ThreadPoolExecutor(
-                        NUM_EXECUTOR_THREADS_FOREGROUND,
-                        NUM_EXECUTOR_THREADS_FOREGROUND,
-                        KEEP_ALIVE_TIME_SHARED,
-                        TimeUnit.SECONDS,
-                        new LinkedBlockingQueue<>());
-
-        sControllerExecutor =
-                new ThreadPoolExecutor(
-                        NUM_EXECUTOR_THREADS_CONTROLLER,
-                        NUM_EXECUTOR_THREADS_CONTROLLER,
-                        KEEP_ALIVE_TIME_CONTROLLER,
-                        TimeUnit.SECONDS,
-                        new LinkedBlockingQueue<>());
         HEALTH_CONNECT_BACKGROUND_ROUND_ROBIN_SCHEDULER.resume();
     }
 
+    private static ThreadPoolExecutor createInternalBackgroundExecutor() {
+        return new ThreadPoolExecutor(
+                NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
+                NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
+                KEEP_ALIVE_TIME_INTERNAL_BACKGROUND,
+                TimeUnit.SECONDS,
+                new LinkedBlockingQueue<>(),
+                new NamedThreadFactory("hc-int-bg-"));
+    }
+
+    private static ThreadPoolExecutor createBackgroundExecutor() {
+        return new ThreadPoolExecutor(
+                NUM_EXECUTOR_THREADS_BACKGROUND,
+                NUM_EXECUTOR_THREADS_BACKGROUND,
+                KEEP_ALIVE_TIME_BACKGROUND,
+                TimeUnit.SECONDS,
+                new LinkedBlockingQueue<>(),
+                new NamedThreadFactory("hc-bg-"));
+    }
+
+    private static ThreadPoolExecutor createForegroundExecutor() {
+        return new ThreadPoolExecutor(
+                NUM_EXECUTOR_THREADS_FOREGROUND,
+                NUM_EXECUTOR_THREADS_FOREGROUND,
+                KEEP_ALIVE_TIME_SHARED,
+                TimeUnit.SECONDS,
+                new LinkedBlockingQueue<>(),
+                new NamedThreadFactory("hc-fg-"));
+    }
+
+    private static ThreadPoolExecutor createControllerExecutor() {
+        return new ThreadPoolExecutor(
+                NUM_EXECUTOR_THREADS_CONTROLLER,
+                NUM_EXECUTOR_THREADS_CONTROLLER,
+                KEEP_ALIVE_TIME_CONTROLLER,
+                TimeUnit.SECONDS,
+                new LinkedBlockingQueue<>(),
+                new NamedThreadFactory("hc-ctrl-"));
+    }
+
     static void shutdownThreadPools() {
         HEALTH_CONNECT_BACKGROUND_ROUND_ROBIN_SCHEDULER.killTasksAndPauseScheduler();
 
@@ -224,4 +218,21 @@
             }
         };
     }
+
+    private static class NamedThreadFactory implements ThreadFactory {
+        private final ThreadFactory mDefaultFactory = Executors.defaultThreadFactory();
+        private final AtomicInteger mCount = new AtomicInteger();
+        private final String mPrefix;
+
+        NamedThreadFactory(String prefix) {
+            mPrefix = prefix;
+        }
+
+        @Override
+        public Thread newThread(Runnable runnable) {
+            Thread thread = mDefaultFactory.newThread(runnable);
+            thread.setName(mPrefix + mCount.getAndIncrement());
+            return thread;
+        }
+    }
 }
diff --git a/service/java/com/android/server/healthconnect/HealthConnectUserContext.java b/service/java/com/android/server/healthconnect/HealthConnectUserContext.java
deleted file mode 100644
index 9c859ea..0000000
--- a/service/java/com/android/server/healthconnect/HealthConnectUserContext.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.healthconnect;
-
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.os.UserHandle;
-
-import com.android.server.healthconnect.utils.FilesUtil;
-
-import java.io.File;
-import java.util.Objects;
-
-/** @hide */
-public class HealthConnectUserContext extends ContextWrapper {
-    private final UserHandle mUserHandle;
-
-    public HealthConnectUserContext(Context context, UserHandle userHandle) {
-        super(context);
-        Objects.requireNonNull(context);
-        Objects.requireNonNull(userHandle);
-
-        mUserHandle = userHandle;
-    }
-
-    public UserHandle getCurrentUserHandle() {
-        return mUserHandle;
-    }
-
-    @Override
-    public File getDatabasePath(String name) {
-        File systemCeUserHcDir =
-                FilesUtil.getDataSystemCeHCDirectoryForUser(mUserHandle.getIdentifier());
-        systemCeUserHcDir.mkdirs();
-
-        return new File(systemCeUserHcDir, name);
-    }
-}
diff --git a/service/java/com/android/server/healthconnect/backuprestore/BackupRestore.java b/service/java/com/android/server/healthconnect/backuprestore/BackupRestore.java
index e5f3564..87c64c3 100644
--- a/service/java/com/android/server/healthconnect/backuprestore/BackupRestore.java
+++ b/service/java/com/android/server/healthconnect/backuprestore/BackupRestore.java
@@ -64,17 +64,20 @@
 import com.android.healthfitness.flags.Flags;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.healthconnect.HealthConnectThreadScheduler;
-import com.android.server.healthconnect.exportimport.DatabaseContext;
 import com.android.server.healthconnect.exportimport.DatabaseMerger;
 import com.android.server.healthconnect.migration.MigrationStateManager;
 import com.android.server.healthconnect.permission.FirstGrantTimeManager;
 import com.android.server.healthconnect.permission.GrantTimeXmlHelper;
 import com.android.server.healthconnect.permission.UserGrantTimeState;
 import com.android.server.healthconnect.storage.HealthConnectDatabase;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 import com.android.server.healthconnect.utils.FilesUtil;
 import com.android.server.healthconnect.utils.RunnableWithThrowable;
@@ -91,6 +94,7 @@
 import java.nio.file.StandardCopyOption;
 import java.time.Instant;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
@@ -178,6 +182,14 @@
 
     @VisibleForTesting static final String STAGED_DATABASE_NAME = "healthconnect_staged.db";
 
+    private static final String DATABASE_BACKUP_FILE_NAME = "healthconnect_backup.db";
+    private static final String BACKUP_DIR = "backup";
+    private static final List<String> PHR_TABLES_TO_CLEAR =
+            List.of(
+                    MedicalDataSourceHelper.getMainTableName(),
+                    MedicalResourceHelper.getMainTableName(),
+                    MedicalResourceIndicesHelper.getTableName());
+
     private static final String TAG = "HealthConnectBackupRestore";
     private final ReentrantReadWriteLock mStatesLock = new ReentrantReadWriteLock(true);
     private final FirstGrantTimeManager mFirstGrantTimeManager;
@@ -212,7 +224,6 @@
         mDatabaseMerger =
                 new DatabaseMerger(
                         appInfoHelper,
-                        context,
                         deviceInfoHelper,
                         healthDataCategoryPriorityHelper,
                         transactionManager);
@@ -265,9 +276,8 @@
             Map<String, HealthConnectException> exceptionsByFileName,
             UserHandle userHandle,
             IDataStagingFinishedCallback callback) {
-        DatabaseContext dbContext =
-                DatabaseContext.create(mContext, STAGED_DATABASE_DIR, userHandle);
-        File stagedRemoteDataDir = dbContext.getDatabaseDir();
+        StorageContext dbContext = StorageContext.create(mContext, userHandle, STAGED_DATABASE_DIR);
+        File stagedRemoteDataDir = dbContext.getDataDir();
         try {
             stagedRemoteDataDir.mkdirs();
 
@@ -358,7 +368,34 @@
         Map<String, ParcelFileDescriptor> pfdsByFileName =
                 stageRemoteDataRequest.getPfdsByFileName();
 
-        var backupFilesByFileNames = getBackupFilesByFileNames(userHandle);
+        // If PERSONAL_HEALTH_RECORD_DISABLE_D2D is enabled, create a temporary copy of the
+        // HC database and delete all the PHR tables content.
+        // Set the default to the original database path, if the PERSONAL_HEALTH_RECORD_DISABLE_D2D
+        // is enabled, it will be updated to be database copy path.
+        File databasePath = mTransactionManager.getDatabasePath();
+        StorageContext dbContext = StorageContext.create(mContext, userHandle, BACKUP_DIR);
+        File backupDataDir = dbContext.getDataDir();
+        if (Flags.personalHealthRecordDisableD2d()) {
+            databasePath = new File(backupDataDir, DATABASE_BACKUP_FILE_NAME);
+            try {
+                // Copies the HC database to the temp file.
+                copyDatabase(databasePath);
+            } catch (Exception e) {
+                Slog.e(TAG, "Failed to create local file for backup", e);
+                return;
+            }
+
+            try {
+                // Deletes the PHR tables content from the temp file.
+                deletePhrTablesContent(dbContext);
+            } catch (Exception e) {
+                Slog.e(TAG, "Failed to clear PHR tables.", e);
+                return;
+            }
+        }
+
+        var backupFilesByFileNames =
+                getBackupFilesByFileNames(userHandle, backupDataDir, databasePath);
         pfdsByFileName.forEach(
                 (fileName, pfd) -> {
                     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
@@ -378,7 +415,7 @@
                 });
 
         if (Flags.d2dFileDeletionBugFix()) {
-            deleteBackupFiles(userHandle);
+            deleteBackupFiles(backupDataDir);
         }
     }
 
@@ -393,6 +430,35 @@
         return new BackupFileNamesSet(backupFileNames);
     }
 
+    private void copyDatabase(File destination) throws IOException {
+        Slog.i(TAG, "Database copying started.");
+
+        if (!destination.exists() && !destination.mkdirs()) {
+            throw new IOException("Unable to create directory for the database copy.");
+        }
+
+        Files.copy(
+                mTransactionManager.getDatabasePath().toPath(),
+                destination.toPath(),
+                StandardCopyOption.REPLACE_EXISTING);
+
+        Slog.i(TAG, "Database copying completed: " + destination.toPath().toAbsolutePath());
+    }
+
+    private void deletePhrTablesContent(StorageContext dbContext) {
+        // Throwing a exception when calling this method implies that it was not possible to
+        // create a HC database from the file and, therefore, most probably the database was
+        // corrupted during the file copy.
+        try (HealthConnectDatabase exportDatabase =
+                new HealthConnectDatabase(dbContext, DATABASE_BACKUP_FILE_NAME)) {
+            SQLiteDatabase db = exportDatabase.getReadableDatabase();
+            for (String tableName : PHR_TABLES_TO_CLEAR) {
+                db.execSQL("DELETE FROM " + tableName + ";");
+            }
+        }
+        Slog.i(TAG, "Drop PHR tables completed.");
+    }
+
     /** Updates the download state of the remote data. */
     public void updateDataDownloadState(@DataDownloadState int downloadState) {
         setDataDownloadState(downloadState, false /* force */);
@@ -408,13 +474,12 @@
     /** Deletes all the staged data and resets all the states. */
     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     public void deleteAndResetEverything(UserHandle userHandle) {
-        DatabaseContext dbContext =
-                DatabaseContext.create(mContext, STAGED_DATABASE_DIR, userHandle);
+        StorageContext dbContext = StorageContext.create(mContext, userHandle, STAGED_DATABASE_DIR);
 
         // Don't delete anything while we are in the process of merging staged data.
         synchronized (mMergingLock) {
             dbContext.deleteDatabase(STAGED_DATABASE_NAME);
-            FilesUtil.deleteDir(dbContext.getDatabaseDir());
+            FilesUtil.deleteDir(dbContext.getDataDir());
         }
         setDataDownloadState(DATA_DOWNLOAD_STATE_UNKNOWN, true /* force */);
         setInternalRestoreState(INTERNAL_RESTORE_STATE_UNKNOWN, true /* force */);
@@ -464,9 +529,8 @@
     /** Returns the file names of all the staged files. */
     @VisibleForTesting
     public Set<String> getStagedRemoteFileNames(UserHandle userHandle) {
-        DatabaseContext dbContext =
-                DatabaseContext.create(mContext, STAGED_DATABASE_DIR, userHandle);
-        File[] allFiles = dbContext.getDatabaseDir().listFiles();
+        StorageContext dbContext = StorageContext.create(mContext, userHandle, STAGED_DATABASE_DIR);
+        File[] allFiles = dbContext.getDataDir().listFiles();
         if (allFiles == null) {
             return Collections.emptySet();
         }
@@ -605,8 +669,8 @@
         }
 
         int currentDbVersion = mTransactionManager.getDatabaseVersion();
-        DatabaseContext dbContext =
-                DatabaseContext.create(mContext, STAGED_DATABASE_DIR, mCurrentForegroundUser);
+        StorageContext dbContext =
+                StorageContext.create(mContext, mCurrentForegroundUser, STAGED_DATABASE_DIR);
         File stagedDbFile = dbContext.getDatabasePath(STAGED_DATABASE_NAME);
         if (stagedDbFile.exists()) {
             try (SQLiteDatabase stagedDb =
@@ -642,14 +706,12 @@
         }
     }
 
-    private Map<String, File> getBackupFilesByFileNames(UserHandle userHandle) {
+    private Map<String, File> getBackupFilesByFileNames(
+            UserHandle userHandle, File backupDataDir, File databasePath) {
         ArrayMap<String, File> backupFilesByFileNames = new ArrayMap<>();
 
-        File databasePath = mTransactionManager.getDatabasePath();
         backupFilesByFileNames.put(STAGED_DATABASE_NAME, databasePath);
 
-        File backupDataDir = getBackupDataDirectoryForUser(userHandle.getIdentifier());
-        backupDataDir.mkdirs();
         File grantTimeFile = new File(backupDataDir, GRANT_TIME_FILE_NAME);
         try {
             grantTimeFile.createNewFile();
@@ -663,9 +725,12 @@
         return backupFilesByFileNames;
     }
 
-    private void deleteBackupFiles(UserHandle userHandle) {
+    private void deleteBackupFiles(File backupDataDir) {
+        if (Flags.personalHealthRecordDisableD2d()) {
+            File databaseBackupFile = new File(backupDataDir, DATABASE_BACKUP_FILE_NAME);
+            databaseBackupFile.delete();
+        }
         // We only create a backup copy for grant times. DB is copied from source.
-        File backupDataDir = getBackupDataDirectoryForUser(userHandle.getIdentifier());
         File grantTimeFile = new File(backupDataDir, GRANT_TIME_FILE_NAME);
         grantTimeFile.delete();
     }
@@ -969,17 +1034,8 @@
         }
     }
 
-    private static File getBackupDataDirectoryForUser(int userId) {
-        return getNamedHcDirectoryForUser("backup", userId);
-    }
-
-    private static File getNamedHcDirectoryForUser(String dirName, int userId) {
-        File hcDirectoryForUser = FilesUtil.getDataSystemCeHCDirectoryForUser(userId);
-        return new File(hcDirectoryForUser, dirName);
-    }
-
-    private void mergeGrantTimes(DatabaseContext dbContext) {
-        File restoredGrantTimeFile = new File(dbContext.getDatabaseDir(), GRANT_TIME_FILE_NAME);
+    private void mergeGrantTimes(StorageContext dbContext) {
+        File restoredGrantTimeFile = new File(dbContext.getDataDir(), GRANT_TIME_FILE_NAME);
         Slog.i(TAG, "Merging grant times.");
 
         UserGrantTimeState userGrantTimeState =
@@ -993,7 +1049,7 @@
         }
     }
 
-    private void mergeDatabase(DatabaseContext dbContext) {
+    private void mergeDatabase(StorageContext dbContext) {
         synchronized (mMergingLock) {
             if (!dbContext.getDatabasePath(STAGED_DATABASE_NAME).exists()) {
                 Slog.i(TAG, "No staged db found.");
diff --git a/service/java/com/android/server/healthconnect/backuprestore/BackupRestoreDatabaseHelper.java b/service/java/com/android/server/healthconnect/backuprestore/BackupRestoreDatabaseHelper.java
new file mode 100644
index 0000000..f88a201
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/backuprestore/BackupRestoreDatabaseHelper.java
@@ -0,0 +1,345 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.healthconnect.backuprestore;
+
+import static android.health.connect.Constants.DEFAULT_LONG;
+import static android.health.connect.PageTokenWrapper.EMPTY_PAGE_TOKEN;
+
+import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.PRIMARY_COLUMN_NAME;
+import static com.android.server.healthconnect.storage.utils.WhereClauses.LogicalOperator.AND;
+
+import android.annotation.Nullable;
+import android.database.Cursor;
+import android.health.connect.PageTokenWrapper;
+import android.health.connect.ReadRecordsRequestUsingFilters;
+import android.health.connect.backuprestore.BackupChange;
+import android.health.connect.backuprestore.GetChangesForBackupResponse;
+import android.health.connect.changelog.ChangeLogsRequest;
+import android.health.connect.changelog.ChangeLogsResponse;
+import android.health.connect.datatypes.Record;
+import android.health.connect.internal.datatypes.RecordInternal;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
+import android.util.Pair;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.BackupChangeTokenHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
+import com.android.server.healthconnect.storage.request.ReadTableRequest;
+import com.android.server.healthconnect.storage.request.ReadTransactionRequest;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+import com.android.server.healthconnect.storage.utils.WhereClauses;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * Performs various operations on the Health Connect database for cloud backup and restore.
+ *
+ * @hide
+ */
+public class BackupRestoreDatabaseHelper {
+    private final AppInfoHelper mAppInfoHelper;
+    private final TransactionManager mTransactionManager;
+    private final AccessLogsHelper mAccessLogsHelper;
+    private final DeviceInfoHelper mDeviceInfoHelper;
+    private final HealthConnectMappings mHealthConnectMappings;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings;
+    private final ChangeLogsHelper mChangeLogsHelper;
+    private final ChangeLogsRequestHelper mChangeLogsRequestHelper;
+
+    // TODO: b/377648858 - maybe also allow client passes its own page size.
+    @VisibleForTesting static final int MAXIMUM_PAGE_SIZE = 5000;
+    private static final String TAG = "BackupRestoreDatabaseHelper";
+
+    public BackupRestoreDatabaseHelper(
+            TransactionManager transactionManager,
+            AppInfoHelper appInfoHelper,
+            AccessLogsHelper accessLogsHelper,
+            DeviceInfoHelper deviceInfoHelper,
+            HealthConnectMappings healthConnectMappings,
+            InternalHealthConnectMappings internalHealthConnectMappings,
+            ChangeLogsHelper changeLogsHelper,
+            ChangeLogsRequestHelper changeLogsRequestHelper) {
+        mTransactionManager = transactionManager;
+        mAppInfoHelper = appInfoHelper;
+        mAccessLogsHelper = accessLogsHelper;
+        mDeviceInfoHelper = deviceInfoHelper;
+        mHealthConnectMappings = healthConnectMappings;
+        mInternalHealthConnectMappings = internalHealthConnectMappings;
+        mChangeLogsHelper = changeLogsHelper;
+        mChangeLogsRequestHelper = changeLogsRequestHelper;
+    }
+
+    /**
+     * Verifies whether the provided change logs token is still valid. The token is valid if the
+     * next change log still exists or the token points to the end of the change logs table.
+     */
+    boolean isChangeLogsTokenValid(@Nullable String changeLogsPageToken) {
+        if (changeLogsPageToken == null) {
+            return false;
+        }
+        ChangeLogsRequestHelper.TokenRequest tokenRequest =
+                mChangeLogsRequestHelper.getRequest(/* packageName= */ "", changeLogsPageToken);
+        if (tokenRequest.getRowIdChangeLogs() == mChangeLogsHelper.getLatestRowId()) {
+            return true;
+        }
+        WhereClauses whereClauses =
+                new WhereClauses(AND)
+                        .addWhereEqualsClause(
+                                PRIMARY_COLUMN_NAME,
+                                String.valueOf(tokenRequest.getRowIdChangeLogs() + 1));
+        ReadTableRequest readTableRequest =
+                new ReadTableRequest(ChangeLogsHelper.TABLE_NAME).setWhereClause(whereClauses);
+        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
+            return cursor.getCount() == 1;
+        }
+    }
+
+    /**
+     * Retrieves backup changes from the data tables, used for the initial call of a full data
+     * backup.
+     */
+    GetChangesForBackupResponse getChangesAndTokenFromDataTables() {
+        return getChangesAndTokenFromDataTables(null, EMPTY_PAGE_TOKEN.encode(), null);
+    }
+
+    /**
+     * Retrieves backup changes from data tables, used for the subsequent calls of a full data
+     * backup.
+     */
+    GetChangesForBackupResponse getChangesAndTokenFromDataTables(
+            @Nullable String dataTableName,
+            long dataTablePageToken,
+            @Nullable String changeLogsPageToken) {
+        // For the first call of a full data backup, page token of the chane logs is passed as null
+        // so we generate one to be used for incremental backups. In subsequent calls of a full data
+        // backup, we just need to preserve the previous page token instead of creating a new one.
+        String changeLogsTablePageToken =
+                changeLogsPageToken == null ? getChangeLogsPageToken() : changeLogsPageToken;
+
+        //  TODO: b/377648858 - find a better approach to force the dependent data type orders
+        List<Integer> recordTypes = getRecordTypes();
+
+        List<BackupChange> backupChanges = new ArrayList<>();
+        long nextDataTablePageToken = dataTablePageToken;
+        int pageSize = MAXIMUM_PAGE_SIZE;
+        String nextDataTableName = dataTableName;
+
+        for (var recordType : recordTypes) {
+            RecordHelper<?> recordHelper =
+                    mInternalHealthConnectMappings.getRecordHelper(recordType);
+            if (nextDataTableName != null
+                    && !recordHelper.getMainTableName().equals(nextDataTableName)) {
+                // Skip the current record type as it has already been backed up.
+                continue;
+            }
+            Set<String> grantedExtraReadPermissions =
+                    Set.copyOf(recordHelper.getExtraReadPermissions());
+            while (pageSize > 0) {
+                ReadRecordsRequestUsingFilters<? extends Record> readRecordsRequest =
+                        new ReadRecordsRequestUsingFilters.Builder<>(
+                                        mHealthConnectMappings
+                                                .getRecordIdToExternalRecordClassMap()
+                                                .get(recordType))
+                                .setPageSize(pageSize)
+                                .setPageToken(nextDataTablePageToken)
+                                .build();
+                ReadTransactionRequest readTransactionRequest =
+                        new ReadTransactionRequest(
+                                mAppInfoHelper,
+                                // Keep as empty to avoid package name filters.
+                                /* callingPackageName= */ "",
+                                readRecordsRequest.toReadRecordsRequestParcel(),
+                                // Avoid start date access based filters.
+                                /* startDateAccessMillis= */ DEFAULT_LONG,
+                                // Avoid package name filters.
+                                /* enforceSelfRead= */ false,
+                                grantedExtraReadPermissions,
+                                // Only used when querying the API call quota. Cloud backup &
+                                // restore APIs enforce no quota limits so this value is irrelevant.
+                                /* isInForeground= */ true);
+                Pair<List<RecordInternal<?>>, PageTokenWrapper> readResult =
+                        mTransactionManager.readRecordsAndPageToken(
+                                readTransactionRequest,
+                                mAppInfoHelper,
+                                mAccessLogsHelper,
+                                mDeviceInfoHelper,
+                                /* shouldRecordAccessLog= */ false);
+                backupChanges.addAll(convertRecordsToBackupChange(readResult.first));
+                nextDataTablePageToken = readResult.second.encode();
+                pageSize = MAXIMUM_PAGE_SIZE - backupChanges.size();
+                nextDataTableName = recordHelper.getMainTableName();
+                if (nextDataTablePageToken == EMPTY_PAGE_TOKEN.encode()) {
+                    int recordIndex = recordTypes.indexOf(recordType);
+                    // An empty page token indicates no more data in one data table, update the
+                    // table name to the next data type.
+                    if (recordIndex + 1 >= recordTypes.size()) {
+                        nextDataTableName = null;
+                    } else {
+                        RecordHelper<?> nextRecordHelper =
+                                mInternalHealthConnectMappings.getRecordHelper(
+                                        recordTypes.get(recordIndex + 1));
+                        nextDataTableName = nextRecordHelper.getMainTableName();
+                    }
+                    break;
+                }
+            }
+            // Retrieved data reaches the max page size.
+            if (pageSize <= 0) {
+                break;
+            }
+        }
+        String backupChangeTokenRowId =
+                BackupChangeTokenHelper.getBackupChangeTokenRowId(
+                        mTransactionManager,
+                        nextDataTableName,
+                        nextDataTablePageToken,
+                        changeLogsTablePageToken);
+        return new GetChangesForBackupResponse(backupChanges, backupChangeTokenRowId);
+    }
+
+    private String getChangeLogsPageToken() {
+        long rowId = mChangeLogsHelper.getLatestRowId();
+        ChangeLogsRequestHelper.TokenRequest tokenRequest =
+                new ChangeLogsRequestHelper.TokenRequest(
+                        List.of(),
+                        getRecordTypes(),
+                        // Pass empty string to avoid package filters.
+                        /* requestingPackageName= */ "",
+                        rowId);
+        return mChangeLogsRequestHelper.getNextPageToken(tokenRequest, rowId);
+    }
+
+    /** Gets incremental data changes based on change logs. */
+    GetChangesForBackupResponse getIncrementalChanges(@Nullable String changeLogsPageToken) {
+        if (changeLogsPageToken == null) {
+            throw new IllegalStateException("No proper change logs token");
+        }
+        ChangeLogsRequestHelper.TokenRequest changeLogsTokenRequest =
+                mChangeLogsRequestHelper.getRequest(/* packageName= */ "", changeLogsPageToken);
+        // Use the default page size (1000) for now.
+        ChangeLogsRequest request = new ChangeLogsRequest.Builder(changeLogsPageToken).build();
+        ChangeLogsHelper.ChangeLogsResponse changeLogsResponse =
+                mChangeLogsHelper.getChangeLogs(
+                        mAppInfoHelper, changeLogsTokenRequest, request, mChangeLogsRequestHelper);
+
+        // Only UUIDs for upsert requests are returned.
+        Map<Integer, List<UUID>> recordTypeToInsertedUuids =
+                ChangeLogsHelper.getRecordTypeToInsertedUuids(
+                        changeLogsResponse.getChangeLogsMap());
+
+        Set<String> grantedExtraReadPermissions =
+                recordTypeToInsertedUuids.keySet().stream()
+                        .map(mInternalHealthConnectMappings::getRecordHelper)
+                        .flatMap(recordHelper -> recordHelper.getExtraReadPermissions().stream())
+                        .collect(Collectors.toSet());
+
+        List<RecordInternal<?>> recordInternals =
+                mTransactionManager.readRecordsByIds(
+                        new ReadTransactionRequest(
+                                mAppInfoHelper,
+                                /* packageName= */ "",
+                                recordTypeToInsertedUuids,
+                                DEFAULT_LONG,
+                                grantedExtraReadPermissions,
+                                /* isInForeground= */ true,
+                                /* isReadingSelfData= */ false),
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
+
+        List<BackupChange> backupChanges =
+                new ArrayList<>(convertRecordsToBackupChange(recordInternals));
+
+        // Include UUIDs for all deleted records.
+        List<ChangeLogsResponse.DeletedLog> deletedLogs =
+                ChangeLogsHelper.getDeletedLogs(changeLogsResponse.getChangeLogsMap());
+        backupChanges.addAll(convertDeletedLogsToBackupChange(deletedLogs));
+
+        String backupChangeTokenRowId =
+                BackupChangeTokenHelper.getBackupChangeTokenRowId(
+                        mTransactionManager,
+                        null,
+                        EMPTY_PAGE_TOKEN.encode(),
+                        changeLogsResponse.getNextPageToken());
+        return new GetChangesForBackupResponse(backupChanges, backupChangeTokenRowId);
+    }
+
+    private List<BackupChange> convertRecordsToBackupChange(List<RecordInternal<?>> records) {
+        return records.stream()
+                .map(
+                        record -> {
+                            if (record.getUuid() == null) {
+                                throw new IllegalStateException(
+                                        "Record does not have a UUID, this should not happen");
+                            }
+                            return new BackupChange(
+                                    record.getUuid().toString(),
+                                    // TODO: b/377648858 - add proper encryption version.
+                                    /* version= */ 0,
+                                    /* isDeletion= */ false,
+                                    serializeRecordInternal(record));
+                        })
+                .toList();
+    }
+
+    private List<BackupChange> convertDeletedLogsToBackupChange(
+            List<ChangeLogsResponse.DeletedLog> deletedLogs) {
+        return deletedLogs.stream()
+                .map(
+                        deletedLog ->
+                                new BackupChange(
+                                        deletedLog.getDeletedRecordId(),
+                                        // TODO: b/369799948 - add proper encryption version.
+                                        /* version= */ 0,
+                                        /* isDeletion= */ true,
+                                        null))
+                .toList();
+    }
+
+    private List<Integer> getRecordTypes() {
+        return mHealthConnectMappings.getRecordIdToExternalRecordClassMap().keySet().stream()
+                .toList();
+    }
+
+    private static byte[] serializeRecordInternal(RecordInternal<?> recordInternal) {
+        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+                ObjectOutputStream objectOutputStream =
+                        new ObjectOutputStream(byteArrayOutputStream)) {
+            objectOutputStream.writeObject(recordInternal);
+            objectOutputStream.flush();
+            return byteArrayOutputStream.toByteArray();
+        } catch (IOException e) {
+            Slog.e(TAG, "Failed to serialize an internal record", e);
+            return new byte[0];
+        }
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/backuprestore/BackupSettingsHelper.java b/service/java/com/android/server/healthconnect/backuprestore/BackupSettingsHelper.java
new file mode 100644
index 0000000..09e43fe
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/backuprestore/BackupSettingsHelper.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.backuprestore;
+
+import android.annotation.Nullable;
+import android.health.connect.exportimport.ScheduledExportSettings;
+import android.util.Slog;
+
+import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
+import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Class that manages compiling the user settings into a CloudBackupSettings object.
+ *
+ * @hide
+ */
+public final class BackupSettingsHelper {
+
+    private final HealthDataCategoryPriorityHelper mPriorityHelper;
+    private final PreferenceHelper mPreferenceHelper;
+    private final ExportImportSettingsStorage mExportImportSettingsStorage;
+
+    public static final String TAG = "BackupSettingsHelper";
+
+    public static final String ENERGY_UNIT_PREF_KEY = "ENERGY_UNIT_KEY";
+    public static final String TEMPERATURE_UNIT_PREF_KEY = "TEMPERATURE_UNIT_KEY";
+    public static final String HEIGHT_UNIT_PREF_KEY = "HEIGHT_UNIT_KEY";
+    public static final String WEIGHT_UNIT_PREF_KEY = "WEIGHT_UNIT_KEY";
+    public static final String DISTANCE_UNIT_PREF_KEY = "DISTANCE_UNIT_KEY";
+    public static final String AUTO_DELETE_PREF_KEY = "auto_delete_range_picker";
+
+    public BackupSettingsHelper(
+            HealthDataCategoryPriorityHelper priorityHelper,
+            PreferenceHelper preferenceHelper,
+            ExportImportSettingsStorage exportImportSettingsStorage) {
+        mPriorityHelper = priorityHelper;
+        mPreferenceHelper = preferenceHelper;
+        mExportImportSettingsStorage = exportImportSettingsStorage;
+    }
+
+    /**
+     * Collate the user's priority list and unit preferences into a single object.
+     *
+     * @return the user's settings as a {@code CloudBackupSettings} object
+     */
+    public CloudBackupSettings collectUserSettings() {
+        return new CloudBackupSettings.Builder()
+                .setPriorityList(getPriorityList())
+                .setAutoDeleteSetting(getAutoDeleteSetting())
+                .setExportSettings(getExportSettings())
+                .setEnergyUnitPreference(getEnergyPreference())
+                .setTemperatureUnitPreference(getTemperaturePreference())
+                .setHeightUnitPreference(getHeightPreference())
+                .setWeightUnitPreference(getWeightPreference())
+                .setDistanceUnitPreference(getDistancePreference())
+                .build();
+    }
+
+    private Map<Integer, List<Long>> getPriorityList() {
+        Map<Integer, List<Long>> priorityListMap =
+                mPriorityHelper.getHealthDataCategoryToAppIdPriorityMapImmutable();
+        if (priorityListMap.isEmpty()) {
+            Slog.d(TAG, "Priority list is empty.");
+            return Map.of();
+        }
+        return priorityListMap;
+    }
+
+    @Nullable
+    private CloudBackupSettings.AutoDeleteFrequency getAutoDeleteSetting() {
+        String preference = mPreferenceHelper.getPreference(AUTO_DELETE_PREF_KEY);
+        return preference == null
+                ? null
+                : CloudBackupSettings.AutoDeleteFrequency.valueOf(preference);
+    }
+
+    private ScheduledExportSettings getExportSettings() {
+        ScheduledExportSettings.Builder scheduledExportSettingsBuilder =
+                new ScheduledExportSettings.Builder();
+        scheduledExportSettingsBuilder.setPeriodInDays(
+                mExportImportSettingsStorage.getScheduledExportPeriodInDays());
+        scheduledExportSettingsBuilder.setUri(mExportImportSettingsStorage.getUri());
+        return scheduledExportSettingsBuilder.build();
+    }
+
+    @Nullable
+    private CloudBackupSettings.TemperatureUnit getTemperaturePreference() {
+        String preference = mPreferenceHelper.getPreference(TEMPERATURE_UNIT_PREF_KEY);
+        return preference == null ? null : CloudBackupSettings.TemperatureUnit.valueOf(preference);
+    }
+
+    @Nullable
+    private CloudBackupSettings.EnergyUnit getEnergyPreference() {
+        String preference = mPreferenceHelper.getPreference(ENERGY_UNIT_PREF_KEY);
+        return preference == null ? null : CloudBackupSettings.EnergyUnit.valueOf(preference);
+    }
+
+    @Nullable
+    private CloudBackupSettings.HeightUnit getHeightPreference() {
+        String preference = mPreferenceHelper.getPreference(HEIGHT_UNIT_PREF_KEY);
+        return preference == null ? null : CloudBackupSettings.HeightUnit.valueOf(preference);
+    }
+
+    @Nullable
+    private CloudBackupSettings.WeightUnit getWeightPreference() {
+        String preference = mPreferenceHelper.getPreference(WEIGHT_UNIT_PREF_KEY);
+        return preference == null ? null : CloudBackupSettings.WeightUnit.valueOf(preference);
+    }
+
+    @Nullable
+    private CloudBackupSettings.DistanceUnit getDistancePreference() {
+        String preference = mPreferenceHelper.getPreference(DISTANCE_UNIT_PREF_KEY);
+        return preference == null ? null : CloudBackupSettings.DistanceUnit.valueOf(preference);
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/backuprestore/CloudBackupManager.java b/service/java/com/android/server/healthconnect/backuprestore/CloudBackupManager.java
new file mode 100644
index 0000000..e8a854f
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/backuprestore/CloudBackupManager.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.healthconnect.backuprestore;
+
+import static android.health.connect.PageTokenWrapper.EMPTY_PAGE_TOKEN;
+
+import static com.android.healthfitness.flags.Flags.FLAG_CLOUD_BACKUP_AND_RESTORE;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.database.sqlite.SQLiteException;
+import android.health.connect.backuprestore.BackupSettings;
+import android.health.connect.backuprestore.GetChangesForBackupResponse;
+import android.health.connect.backuprestore.GetSettingsForBackupResponse;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
+import android.util.Slog;
+
+import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.BackupChangeTokenHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+
+import java.util.List;
+
+/**
+ * Manages Cloud Backup operations.
+ *
+ * @hide
+ */
+@FlaggedApi(FLAG_CLOUD_BACKUP_AND_RESTORE)
+public final class CloudBackupManager {
+
+    private static final String TAG = "CloudBackupManager";
+
+    private final TransactionManager mTransactionManager;
+    private final BackupRestoreDatabaseHelper mDatabaseHelper;
+    private final HealthDataCategoryPriorityHelper mPriorityHelper;
+    private final PreferenceHelper mPreferenceHelper;
+    private final ExportImportSettingsStorage mExportImportSettingsStorage;
+
+    public CloudBackupManager(
+            TransactionManager transactionManager,
+            AppInfoHelper appInfoHelper,
+            AccessLogsHelper accessLogsHelper,
+            DeviceInfoHelper deviceInfoHelper,
+            HealthConnectMappings healthConnectMappings,
+            InternalHealthConnectMappings internalHealthConnectMappings,
+            ChangeLogsHelper changeLogsHelper,
+            ChangeLogsRequestHelper changeLogsRequestHelper,
+            HealthDataCategoryPriorityHelper priorityHelper,
+            PreferenceHelper preferenceHelper,
+            ExportImportSettingsStorage exportImportSettingsStorage) {
+        mTransactionManager = transactionManager;
+        mPriorityHelper = priorityHelper;
+        mPreferenceHelper = preferenceHelper;
+        mExportImportSettingsStorage = exportImportSettingsStorage;
+        mDatabaseHelper =
+                new BackupRestoreDatabaseHelper(
+                        transactionManager,
+                        appInfoHelper,
+                        accessLogsHelper,
+                        deviceInfoHelper,
+                        healthConnectMappings,
+                        internalHealthConnectMappings,
+                        changeLogsHelper,
+                        changeLogsRequestHelper);
+    }
+
+    /**
+     * The changeToken returned by the previous call should be passed in to resume the upload. A
+     * null or empty changeToken means we are doing a fresh backup, and should start from the
+     * beginning.
+     *
+     * <p>If the changeToken is not found, it means that HealthConnect can no longer resume the
+     * backup from this point, and will respond with an Exception. The caller should restart the
+     * backup in this case.
+     *
+     * <p>If no changes are returned by the API, this means that the client has synced all changes
+     * as of now.
+     */
+    @NonNull
+    public GetChangesForBackupResponse getChangesForBackup(@Nullable String changeToken) {
+        try {
+            if (changeToken == null) {
+                return mDatabaseHelper.getChangesAndTokenFromDataTables();
+            }
+            BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                    BackupChangeTokenHelper.getBackupChangeToken(mTransactionManager, changeToken);
+            boolean isChangeLogsTokenValid =
+                    mDatabaseHelper.isChangeLogsTokenValid(
+                            backupChangeToken.getChangeLogsRequestToken());
+            if (!isChangeLogsTokenValid) {
+                String emptyChangeToken =
+                        BackupChangeTokenHelper.getBackupChangeTokenRowId(
+                                mTransactionManager, null, EMPTY_PAGE_TOKEN.encode(), null);
+                return new GetChangesForBackupResponse(List.of(), emptyChangeToken);
+            }
+            if (backupChangeToken.getDataTableName() != null) {
+                return mDatabaseHelper.getChangesAndTokenFromDataTables(
+                        backupChangeToken.getDataTableName(),
+                        backupChangeToken.getDataTablePageToken(),
+                        backupChangeToken.getChangeLogsRequestToken());
+            }
+            return mDatabaseHelper.getIncrementalChanges(
+                    backupChangeToken.getChangeLogsRequestToken());
+        } catch (SQLiteException exception) {
+            Slog.e(TAG, "Failed to read or write to database", exception);
+            throw exception;
+        } catch (IllegalStateException exception) {
+            // This case is impossible because the database enforces uuid's non-nullity but
+            // within the RecordInternal class this is defined as nullable.
+            Slog.e(TAG, "Missing uuid for record", exception);
+            throw exception;
+        }
+    }
+
+    /** Returns all user settings bundled as a single byte array. */
+    @NonNull
+    public GetSettingsForBackupResponse getSettingsForBackup() {
+        Slog.i(TAG, "Formatting user settings for export.");
+        BackupSettingsHelper backupSettingsHelper =
+                new BackupSettingsHelper(
+                        mPriorityHelper, mPreferenceHelper, mExportImportSettingsStorage);
+
+        int version = 0;
+        byte[] data = backupSettingsHelper.collectUserSettings().toByteArray();
+
+        return new GetSettingsForBackupResponse(new BackupSettings(version, data));
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/backuprestore/CloudBackupSettings.java b/service/java/com/android/server/healthconnect/backuprestore/CloudBackupSettings.java
new file mode 100644
index 0000000..0b5b33b
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/backuprestore/CloudBackupSettings.java
@@ -0,0 +1,312 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.backuprestore;
+
+import android.annotation.Nullable;
+import android.health.connect.exportimport.ScheduledExportSettings;
+import android.util.Slog;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/** @hide */
+public class CloudBackupSettings {
+
+    private static final String TAG = "CloudBackupSettings";
+
+    /** Builder class for {@link CloudBackupSettings} */
+    public static final class Builder {
+        private Map<Integer, List<Long>> mPriorityListMap;
+        @Nullable private AutoDeleteFrequency mAutoDeletePreference;
+        @Nullable private ScheduledExportSettings mExportSettings;
+        @Nullable private EnergyUnit mEnergyUnitPreference;
+        @Nullable private TemperatureUnit mTemperatureUnitPreference;
+        @Nullable private HeightUnit mHeightUnitPreference;
+        @Nullable private WeightUnit mWeightUnitPreference;
+        @Nullable private DistanceUnit mDistanceUnitPreference;
+
+        public Builder() {
+            this(
+                    Map.of(),
+                    null,
+                    null,
+                    DEFAULT_ENERGY_UNIT,
+                    DEFAULT_TEMPERATURE_UNIT,
+                    DEFAULT_HEIGHT_UNIT,
+                    DEFAULT_WEIGHT_UNIT,
+                    DEFAULT_DISTANCE_UNIT);
+        }
+
+        public Builder(
+                Map<Integer, List<Long>> priorityListMap,
+                @Nullable AutoDeleteFrequency autoDeletePreference,
+                @Nullable ScheduledExportSettings exportSettings,
+                @Nullable EnergyUnit energyUnitPreference,
+                @Nullable TemperatureUnit temperatureUnitPreference,
+                @Nullable HeightUnit heightUnitPreference,
+                @Nullable WeightUnit weightUnitPreference,
+                @Nullable DistanceUnit distanceUnitPreference) {
+            Objects.requireNonNull(priorityListMap);
+            mPriorityListMap = priorityListMap;
+            mAutoDeletePreference = autoDeletePreference;
+            mExportSettings =
+                    exportSettings != null
+                            ? exportSettings
+                            : new ScheduledExportSettings.Builder().build();
+            mEnergyUnitPreference =
+                    energyUnitPreference != null ? energyUnitPreference : DEFAULT_ENERGY_UNIT;
+            mTemperatureUnitPreference =
+                    temperatureUnitPreference != null
+                            ? temperatureUnitPreference
+                            : DEFAULT_TEMPERATURE_UNIT;
+            mHeightUnitPreference =
+                    heightUnitPreference != null ? heightUnitPreference : DEFAULT_HEIGHT_UNIT;
+            mWeightUnitPreference =
+                    weightUnitPreference != null ? weightUnitPreference : DEFAULT_WEIGHT_UNIT;
+            mDistanceUnitPreference =
+                    distanceUnitPreference != null ? distanceUnitPreference : DEFAULT_DISTANCE_UNIT;
+        }
+
+        /** Saves the user's priority list and returns the Builder for chaining. */
+        public Builder setPriorityList(Map<Integer, List<Long>> priorityListMap) {
+            Objects.requireNonNull(priorityListMap);
+            mPriorityListMap = priorityListMap;
+            return this;
+        }
+
+        /** Saves the user's auto-delete setting and returns the Builder for chaining. */
+        public Builder setAutoDeleteSetting(@Nullable AutoDeleteFrequency autoDeletePreference) {
+            mAutoDeletePreference = autoDeletePreference;
+            return this;
+        }
+
+        /** Saves the user's export settings and returns the Builder for chaining. */
+        public Builder setExportSettings(
+                @Nullable ScheduledExportSettings scheduledExportSettings) {
+            mExportSettings = scheduledExportSettings;
+            return this;
+        }
+
+        /** Saves the user's energy unit preference and returns the Builder for chaining. */
+        public Builder setEnergyUnitPreference(@Nullable EnergyUnit energyUnitPreference) {
+            mEnergyUnitPreference =
+                    energyUnitPreference != null ? energyUnitPreference : DEFAULT_ENERGY_UNIT;
+            return this;
+        }
+
+        /** Saves the user's temperature unit preference and returns the Builder for chaining. */
+        public Builder setTemperatureUnitPreference(
+                @Nullable TemperatureUnit temperatureUnitPreference) {
+            mTemperatureUnitPreference =
+                    temperatureUnitPreference != null
+                            ? temperatureUnitPreference
+                            : DEFAULT_TEMPERATURE_UNIT;
+            return this;
+        }
+
+        /** Saves the user's weight unit preference and returns the Builder for chaining. */
+        public Builder setWeightUnitPreference(@Nullable WeightUnit weightUnitPreference) {
+            mWeightUnitPreference =
+                    weightUnitPreference != null ? weightUnitPreference : DEFAULT_WEIGHT_UNIT;
+            return this;
+        }
+
+        /** Saves the user's height unit preference and returns the Builder for chaining. */
+        public Builder setHeightUnitPreference(@Nullable HeightUnit heightUnitPreference) {
+            mHeightUnitPreference =
+                    heightUnitPreference != null ? heightUnitPreference : DEFAULT_HEIGHT_UNIT;
+            return this;
+        }
+
+        /** Saves the user's distance unit preference and returns the Builder for chaining. */
+        public Builder setDistanceUnitPreference(@Nullable DistanceUnit distanceUnitPreference) {
+            mDistanceUnitPreference =
+                    distanceUnitPreference != null ? distanceUnitPreference : DEFAULT_DISTANCE_UNIT;
+            return this;
+        }
+
+        /** Builds a CloudBackupSettings object with the set (or default) values. */
+        public CloudBackupSettings build() {
+            return new CloudBackupSettings(
+                    mPriorityListMap,
+                    mAutoDeletePreference,
+                    mExportSettings,
+                    mEnergyUnitPreference,
+                    mTemperatureUnitPreference,
+                    mHeightUnitPreference,
+                    mWeightUnitPreference,
+                    mDistanceUnitPreference);
+        }
+    }
+
+    private final Map<Integer, List<Long>> mPriorityListMapSetting;
+    @Nullable private final AutoDeleteFrequency mAutoDeleteSetting;
+    @Nullable private final ScheduledExportSettings mExportSettings;
+    @Nullable private final EnergyUnit mEnergyUnitSetting;
+    @Nullable private final TemperatureUnit mTemperatureUnitSetting;
+    @Nullable private final HeightUnit mHeightUnitSetting;
+    @Nullable private final WeightUnit mWeightUnitSetting;
+    @Nullable private final DistanceUnit mDistanceUnitSetting;
+
+    private CloudBackupSettings(
+            Map<Integer, List<Long>> priorityList,
+            @Nullable AutoDeleteFrequency autoDeleteSetting,
+            @Nullable ScheduledExportSettings exportSettings,
+            @Nullable EnergyUnit energyUnit,
+            @Nullable TemperatureUnit temperatureUnit,
+            @Nullable HeightUnit heightUnit,
+            @Nullable WeightUnit weightUnit,
+            @Nullable DistanceUnit distanceUnit) {
+        mPriorityListMapSetting = priorityList;
+        mAutoDeleteSetting = autoDeleteSetting;
+        mExportSettings = exportSettings;
+        mEnergyUnitSetting = energyUnit;
+        mTemperatureUnitSetting = temperatureUnit;
+        mHeightUnitSetting = heightUnit;
+        mWeightUnitSetting = weightUnit;
+        mDistanceUnitSetting = distanceUnit;
+    }
+
+    /**
+     * @return the {@code CloudBackupSettings} object as a byte array.
+     */
+    public byte[] toByteArray() {
+        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+                ObjectOutputStream out = new ObjectOutputStream(byteArrayOutputStream)) {
+            out.writeObject(this);
+            return byteArrayOutputStream.toByteArray();
+        } catch (IOException e) {
+            Slog.d(TAG, "Unable to convert CloudBackupSettings to byte array.");
+            return new byte[0];
+        }
+    }
+
+    /**
+     * @return the user's priority list setting.
+     */
+    public Map<Integer, List<Long>> getPriorityListMapSetting() {
+        return mPriorityListMapSetting;
+    }
+
+    /**
+     * @return the user's auto delete preference setting.
+     */
+    @Nullable
+    public AutoDeleteFrequency getAutoDeleteSetting() {
+        return mAutoDeleteSetting;
+    }
+
+    /**
+     * @return the user's scheduled export settings.
+     */
+    @Nullable
+    public ScheduledExportSettings getScheduledExportSettings() {
+        return mExportSettings;
+    }
+
+    /**
+     * @return the user's energy unit preference setting.
+     */
+    @Nullable
+    public EnergyUnit getEnergyUnitSetting() {
+        return mEnergyUnitSetting;
+    }
+
+    /**
+     * @return the user's temperature unit preference setting.
+     */
+    @Nullable
+    public TemperatureUnit getTemperatureUnitSetting() {
+        return mTemperatureUnitSetting;
+    }
+
+    /**
+     * @return the user's height unit preference setting.
+     */
+    @Nullable
+    public HeightUnit getHeightUnitSetting() {
+        return mHeightUnitSetting;
+    }
+
+    /**
+     * @return the user's weight unit preference setting.
+     */
+    @Nullable
+    public WeightUnit getWeightUnitSetting() {
+        return mWeightUnitSetting;
+    }
+
+    /**
+     * @return the user's distance unit preference setting.
+     */
+    @Nullable
+    public DistanceUnit getDistanceUnitSetting() {
+        return mDistanceUnitSetting;
+    }
+
+    /** Class grouping the individual unit preferences. */
+    public interface UnitPreference {}
+
+    /** The available unit options for energy measurements. */
+    public enum EnergyUnit implements UnitPreference {
+        CALORIE,
+        KILOJOULE
+    }
+
+    /** The available unit options for temperature measurements. */
+    public enum TemperatureUnit implements UnitPreference {
+        CELSIUS,
+        FAHRENHEIT,
+        KELVIN
+    }
+
+    /** The available unit options for height measurements. */
+    public enum HeightUnit implements UnitPreference {
+        CENTIMETERS,
+        FEET
+    }
+
+    /** The available unit options for weight measurements. */
+    public enum WeightUnit implements UnitPreference {
+        POUND,
+        KILOGRAM,
+        STONE
+    }
+
+    /** The available unit options for distance measurements. */
+    public enum DistanceUnit implements UnitPreference {
+        KILOMETERS,
+        MILES
+    }
+
+    /** The available auto-delete frequency options for auto-delete preference. */
+    public enum AutoDeleteFrequency {
+        AUTO_DELETE_RANGE_NEVER,
+        AUTO_DELETE_RANGE_THREE_MONTHS,
+        AUTO_DELETE_RANGE_EIGHTEEN_MONTHS
+    }
+
+    public static final EnergyUnit DEFAULT_ENERGY_UNIT = EnergyUnit.CALORIE;
+    public static final TemperatureUnit DEFAULT_TEMPERATURE_UNIT = TemperatureUnit.FAHRENHEIT;
+    public static final HeightUnit DEFAULT_HEIGHT_UNIT = HeightUnit.CENTIMETERS;
+    public static final WeightUnit DEFAULT_WEIGHT_UNIT = WeightUnit.KILOGRAM;
+    public static final DistanceUnit DEFAULT_DISTANCE_UNIT = DistanceUnit.KILOMETERS;
+}
diff --git a/service/java/com/android/server/healthconnect/backuprestore/CloudRestoreManager.java b/service/java/com/android/server/healthconnect/backuprestore/CloudRestoreManager.java
new file mode 100644
index 0000000..09c8e0f
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/backuprestore/CloudRestoreManager.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.backuprestore;
+
+import static com.android.healthfitness.flags.Flags.FLAG_CLOUD_BACKUP_AND_RESTORE;
+
+import android.annotation.FlaggedApi;
+import android.health.connect.backuprestore.BackupSettings;
+import android.util.Slog;
+
+/**
+ * Manages Cloud Restore operations.
+ *
+ * @hide
+ */
+@FlaggedApi(FLAG_CLOUD_BACKUP_AND_RESTORE)
+public class CloudRestoreManager {
+
+    private static final String TAG = "CloudRestoreManager";
+
+    public CloudRestoreManager() {}
+
+    /** Takes the serialized user settings and overwrites existing settings. */
+    public void pushSettingsForRestore(BackupSettings newSettings) {
+        Slog.i(TAG, "Restoring user settings.");
+        throw new UnsupportedOperationException("Not implemented yet.");
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/exportimport/DatabaseContext.java b/service/java/com/android/server/healthconnect/exportimport/DatabaseContext.java
deleted file mode 100644
index 89645aa..0000000
--- a/service/java/com/android/server/healthconnect/exportimport/DatabaseContext.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.healthconnect.exportimport;
-
-import static java.util.Objects.requireNonNull;
-
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.database.sqlite.SQLiteDatabase;
-import android.os.UserHandle;
-import android.util.Slog;
-
-import com.android.healthfitness.flags.Flags;
-import com.android.server.healthconnect.utils.FilesUtil;
-
-import java.io.File;
-
-/**
- * {@link Context} for the staged health connect db.
- *
- * @hide
- */
-public final class DatabaseContext extends ContextWrapper {
-
-    private static final String TAG = "HealthConnectDatabaseContext";
-
-    private final String mDatabaseDirName;
-
-    private File mDatabaseDir;
-
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private DatabaseContext(Context context, String databaseDirName, UserHandle userHandle) {
-        super(context);
-        requireNonNull(context);
-        mDatabaseDirName = databaseDirName;
-        setupForUser(userHandle);
-    }
-
-    /** Updates the DB directory */
-    public void setupForUser(UserHandle userHandle) {
-        File hcDirectory = FilesUtil.getDataSystemCeHCDirectoryForUser(userHandle.getIdentifier());
-        mDatabaseDir = new File(hcDirectory, mDatabaseDirName);
-        mDatabaseDir.mkdirs();
-    }
-
-    /** Returns the directory of the staged database */
-    public File getDatabaseDir() {
-        return mDatabaseDir;
-    }
-
-    @Override
-    public boolean deleteDatabase(String name) {
-        if (Flags.d2dFileDeletionBugFix()) {
-            try {
-                File f = getDatabasePath(name);
-                return SQLiteDatabase.deleteDatabase(f);
-            } catch (Exception e) {
-                Slog.e(TAG, "Failed to delete database = " + getDatabasePath(name));
-            }
-            return false;
-        } else {
-            return super.deleteDatabase(name);
-        }
-    }
-
-    /** Returns the file of the staged database with the given name */
-    @Override
-    public File getDatabasePath(String name) {
-        return new File(mDatabaseDir, name);
-    }
-
-    /** Factory method */
-    public static DatabaseContext create(
-            Context context, String databaseDirName, UserHandle userHandle) {
-        return new DatabaseContext(context, databaseDirName, userHandle);
-    }
-}
diff --git a/service/java/com/android/server/healthconnect/exportimport/DatabaseMerger.java b/service/java/com/android/server/healthconnect/exportimport/DatabaseMerger.java
index 2a262d7..7643ec6 100644
--- a/service/java/com/android/server/healthconnect/exportimport/DatabaseMerger.java
+++ b/service/java/com/android/server/healthconnect/exportimport/DatabaseMerger.java
@@ -22,39 +22,52 @@
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_PLANNED_EXERCISE_SESSION;
 
+import static com.android.healthfitness.flags.Flags.cloudBackupAndRestore;
 import static com.android.healthfitness.flags.Flags.exportImport;
 import static com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper.APP_ID_PRIORITY_ORDER_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper.HEALTH_DATA_CATEGORY_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper.PRIORITY_TABLE_NAME;
+import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.getReadQueryForDataSourcesUsingUniqueIds;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.DELIMITER;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.checkTableExists;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorLong;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorString;
 
 import static java.util.Objects.requireNonNull;
 
-import android.content.Context;
+import android.content.ContentValues;
 import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
 import android.health.connect.PageTokenWrapper;
 import android.health.connect.ReadRecordsRequestUsingFilters;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.Record;
 import android.health.connect.internal.datatypes.PlannedExerciseSessionRecordInternal;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.util.ArrayMap;
 import android.util.Pair;
 import android.util.Slog;
 
+import com.android.healthfitness.flags.Flags;
+import com.android.server.healthconnect.phr.PhrPageTokenWrapper;
+import com.android.server.healthconnect.phr.ReadMedicalResourcesInternalResponse;
 import com.android.server.healthconnect.storage.HealthConnectDatabase;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
 import com.android.server.healthconnect.storage.request.DeleteTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTransactionRequest;
 import com.android.server.healthconnect.storage.request.UpsertTransactionRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 
 import java.util.ArrayList;
@@ -74,10 +87,10 @@
 
     private static final String TAG = "HealthConnectDatabaseMerger";
 
-    private final Context mContext;
     private final TransactionManager mTransactionManager;
     private final AppInfoHelper mAppInfoHelper;
-    private final RecordMapper mRecordMapper;
+    private final HealthConnectMappings mHealthConnectMappings;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings;
     private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
     private final DeviceInfoHelper mDeviceInfoHelper;
 
@@ -94,17 +107,21 @@
                     // exist so that the foreign key constraints are not violated.
                     List.of(RECORD_TYPE_PLANNED_EXERCISE_SESSION, RECORD_TYPE_EXERCISE_SESSION));
 
+    private static final List<String> PHR_TABLES_TO_MERGE =
+            List.of(
+                    MedicalDataSourceHelper.getMainTableName(),
+                    MedicalResourceHelper.getMainTableName(),
+                    MedicalResourceIndicesHelper.getTableName());
+
     public DatabaseMerger(
             AppInfoHelper appInfoHelper,
-            Context context,
             DeviceInfoHelper deviceInfoHelper,
             HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
             TransactionManager transactionManager) {
-        requireNonNull(context);
-        mContext = context;
         mTransactionManager = transactionManager;
         mAppInfoHelper = appInfoHelper;
-        mRecordMapper = RecordMapper.getInstance();
+        mHealthConnectMappings = HealthConnectMappings.getInstance();
+        mInternalHealthConnectMappings = InternalHealthConnectMappings.getInstance();
         mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
         mDeviceInfoHelper = deviceInfoHelper;
     }
@@ -125,8 +142,21 @@
                 // If this package is not installed on the target device and is not present in the
                 // health db, then fill the health db with the info from source db. According to the
                 // security review b/341253579, we should not parse the imported icon.
-                mAppInfoHelper.addOrUpdateAppInfoIfNoAppInfoEntryExists(
-                        mContext, packageName, appName);
+                mAppInfoHelper.addOrUpdateAppInfoIfNoAppInfoEntryExists(packageName, appName);
+            }
+        }
+
+        // Similar to current HC behaviour, we honour what is on the target device. This means
+        // that if a MedicalResource or MedicalDataSource of the same unique ids as the
+        // stagedDatabase exists on the targetDatabase, we ignore the one in stagedDatabase.
+        // TODO(b/376645901): Verify that there's no timeout with large datasets on actual
+        // devices.
+        if (Flags.personalHealthRecordEnableD2dAndExportImport()) {
+            Slog.i(TAG, "Merging PHR data");
+            try {
+                mergePhrContent(stagedDatabase.getReadableDatabase());
+            } catch (Exception e) {
+                Slog.e(TAG, "Failed to transfer PHR data from staged database", e);
             }
         }
 
@@ -138,7 +168,7 @@
         List<Integer> recordTypesWithOrderingOverrides =
                 RECORD_TYPE_MIGRATION_ORDERING_OVERRIDES.stream().flatMap(List::stream).toList();
         List<Integer> recordTypesWithoutOrderingOverrides =
-                mRecordMapper.getRecordIdToExternalRecordClassMap().keySet().stream()
+                mHealthConnectMappings.getRecordIdToExternalRecordClassMap().keySet().stream()
                         .filter(it -> !recordTypesWithOrderingOverrides.contains(it))
                         .toList();
 
@@ -149,7 +179,7 @@
                         stagedDatabase,
                         stagedPackageNamesByAppIds,
                         recordTypeToMigrate,
-                        mRecordMapper
+                        mHealthConnectMappings
                                 .getRecordIdToExternalRecordClassMap()
                                 .get(recordTypeToMigrate));
             }
@@ -160,7 +190,7 @@
                 deleteRecordsOfType(
                         stagedDatabase,
                         recordTypeToMigrate,
-                        mRecordMapper
+                        mHealthConnectMappings
                                 .getRecordIdToExternalRecordClassMap()
                                 .get(recordTypeToMigrate));
             }
@@ -168,9 +198,13 @@
         // Migrate remaining record types in no particular order.
         for (Integer recordTypeToMigrate : recordTypesWithoutOrderingOverrides) {
             Class<? extends Record> recordClass =
-                    mRecordMapper.getRecordIdToExternalRecordClassMap().get(recordTypeToMigrate);
+                    mHealthConnectMappings
+                            .getRecordIdToExternalRecordClassMap()
+                            .get(recordTypeToMigrate);
+
             mergeRecordsOfType(
                     stagedDatabase, stagedPackageNamesByAppIds, recordTypeToMigrate, recordClass);
+
             deleteRecordsOfType(stagedDatabase, recordTypeToMigrate, recordClass);
         }
 
@@ -185,6 +219,153 @@
         Slog.i(TAG, "Merging done");
     }
 
+    private void mergePhrContent(SQLiteDatabase stagedDatabase) {
+        if (!checkPhrTablesExist(stagedDatabase)) {
+            return;
+        }
+        // We have made the decision to not transfer partial PHR data to the target device.
+        // Hence why we wrap it in a transaction to ensure either all or none of the PHR
+        // data is transferred to the target device.
+        mTransactionManager.runAsTransaction(
+                targetDatabase -> {
+                    Map<String, Long> dataSourceUuidToRowId =
+                            mergeMedicalDataSourceTable(stagedDatabase, targetDatabase);
+                    mergeMedicalResourceAndIndices(
+                            stagedDatabase, targetDatabase, dataSourceUuidToRowId);
+                });
+    }
+
+    private boolean checkPhrTablesExist(SQLiteDatabase stagedDatabase) {
+        for (String table : PHR_TABLES_TO_MERGE) {
+            if (!checkTableExists(stagedDatabase, table)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private Map<String, Long> mergeMedicalDataSourceTable(
+            SQLiteDatabase stagedDatabase, SQLiteDatabase targetDatabase) {
+        // Read the dataSources from the staged database along with their lastModifiedTimestamp.
+        // We don't want to update the lastModifiedTimestamp, as this currently holds a different
+        // meaning in PHR. We use the lastModifiedTimestamp columns in MedicalResource and
+        // MedicalDataSource to understand when an app has updated the MedicalResource/DataSource.
+        // Since the merge process is not the source app writing the data, we write the
+        // lastModifiedTimestamp using what is in the stagedDatabase rather than based on the
+        // current merge time.
+        List<Pair<MedicalDataSource, Long>> dataSourceTimestampPairs =
+                readMedicalDataSources(stagedDatabase);
+        // To map dataSource uuid string to its rowId in the targetDatabase.
+        Map<String, Long> uuidToRowId = new ArrayMap<>();
+        for (Pair<MedicalDataSource, Long> dataSourceAndTimestamp : dataSourceTimestampPairs) {
+            MedicalDataSource dataSource = dataSourceAndTimestamp.first;
+            long lastModifiedTime = dataSourceAndTimestamp.second;
+            // Get the appId from the target database.
+            long appInfoId = mAppInfoHelper.getAppInfoId(dataSource.getPackageName());
+            if (appInfoId == DEFAULT_LONG) {
+                throw new IllegalStateException("App id does not exist.");
+            }
+
+            long insertedRowId =
+                    targetDatabase.insertWithOnConflict(
+                            MedicalDataSourceHelper.getMainTableName(),
+                            /* nullColumnHack= */ null,
+                            MedicalDataSourceHelper.getContentValues(
+                                    dataSource, appInfoId, lastModifiedTime),
+                            SQLiteDatabase.CONFLICT_IGNORE);
+
+            // If insertedRowId is -1, there probably was a conflict. In this case, we need to do
+            // a read on the targetDatabase, to find out the rowId of the existing dataSource
+            // with the same unique ids as the one we were trying to insert.
+            if (insertedRowId == DEFAULT_LONG) {
+                insertedRowId =
+                        readMedicalDataSourcesUsingDisplayNameAndAppId(
+                                targetDatabase, dataSource.getDisplayName(), appInfoId);
+            }
+
+            uuidToRowId.put(dataSource.getId(), insertedRowId);
+        }
+
+        return uuidToRowId;
+    }
+
+    private void mergeMedicalResourceAndIndices(
+            SQLiteDatabase stagedDatabase,
+            SQLiteDatabase targetDatabase,
+            Map<String, Long> uuidToRowId) {
+        String nextPageToken = null;
+        do {
+            // Read MedicalResources from staged database.
+            ReadMedicalResourcesInternalResponse response =
+                    readMedicalResources(
+                            stagedDatabase,
+                            PhrPageTokenWrapper.fromPageTokenAllowingNull(nextPageToken));
+
+            // Write MedicalResources to the target database.
+            for (MedicalResource medicalResource : response.getMedicalResources()) {
+                String dataSourceUuid = medicalResource.getDataSourceId();
+                Long dataSourceRowId = uuidToRowId.get(dataSourceUuid);
+                if (dataSourceRowId == null) {
+                    throw new IllegalStateException("DataSource UUID was not found");
+                }
+
+                ContentValues contentValues =
+                        MedicalResourceHelper.getContentValues(
+                                dataSourceRowId,
+                                medicalResource.getLastModifiedTimestamp(),
+                                medicalResource);
+                long medicalResourceRowId =
+                        targetDatabase.insertWithOnConflict(
+                                MedicalResourceHelper.getMainTableName(),
+                                /* nullColumnHack= */ null,
+                                contentValues,
+                                SQLiteDatabase.CONFLICT_IGNORE);
+
+                // With CONFLICT_IGNORE, if there already exists a row with the same unique ids
+                // the insertion would be ignored and -1 is returned. In this case, we would
+                // want to continue with copying the rest of the data.
+                if (medicalResourceRowId != DEFAULT_LONG) {
+                    targetDatabase.insertWithOnConflict(
+                            MedicalResourceIndicesHelper.getTableName(),
+                            /* nullColumnHack= */ null,
+                            MedicalResourceIndicesHelper.getContentValues(
+                                    medicalResourceRowId, medicalResource.getType()),
+                            SQLiteDatabase.CONFLICT_IGNORE);
+                }
+            }
+
+            nextPageToken = response.getPageToken();
+
+        } while (nextPageToken != null);
+    }
+
+    private List<Pair<MedicalDataSource, Long>> readMedicalDataSources(
+            SQLiteDatabase stagedDatabase) {
+        try (Cursor cursor =
+                read(stagedDatabase, MedicalDataSourceHelper.getReadQueryForDataSources())) {
+            return MedicalDataSourceHelper.getMedicalDataSourcesWithTimestamps(cursor);
+        }
+    }
+
+    private long readMedicalDataSourcesUsingDisplayNameAndAppId(
+            SQLiteDatabase targetDatabase, String displayName, long appId) {
+        try (Cursor cursor =
+                mTransactionManager.read(
+                        targetDatabase,
+                        getReadQueryForDataSourcesUsingUniqueIds(displayName, appId))) {
+            return MedicalDataSourceHelper.readDisplayNameAndAppIdFromCursor(cursor);
+        }
+    }
+
+    private ReadMedicalResourcesInternalResponse readMedicalResources(
+            SQLiteDatabase stagedDatabase, PhrPageTokenWrapper pageTokenWrapper) {
+        ReadTableRequest readTableRequest =
+                MedicalResourceHelper.getReadTableRequestUsingRequestFilters(
+                        pageTokenWrapper, MAXIMUM_PAGE_SIZE);
+        return MedicalResourceHelper.getMedicalResources(
+                stagedDatabase, readTableRequest, pageTokenWrapper, MAXIMUM_PAGE_SIZE);
+    }
+
     private void mergePriorityList(
             HealthConnectDatabase stagedDatabase, Map<Long, String> importedAppInfo) {
         Map<Integer, List<String>> importPriorityMap = new HashMap<>();
@@ -209,7 +390,7 @@
                     }
 
                     List<String> currentPriorityList =
-                            mHealthDataCategoryPriorityHelper.getPriorityOrder(category, mContext);
+                            mHealthDataCategoryPriorityHelper.syncAndGetPriorityOrder(category);
                     List<String> newPriorityList =
                             Stream.concat(currentPriorityList.stream(), importPriorityList.stream())
                                     .distinct()
@@ -229,8 +410,9 @@
             Map<Long, String> stagedPackageNamesByAppIds,
             int recordType,
             Class<T> recordTypeClass) {
-        RecordHelper<?> recordHelper = RecordHelperProvider.getRecordHelper(recordType);
-        if (!StorageUtils.checkTableExists(stagedDatabase, recordHelper.getMainTableName())) {
+        RecordHelper<?> recordHelper = mInternalHealthConnectMappings.getRecordHelper(recordType);
+        if (!checkTableExists(
+                stagedDatabase.getReadableDatabase(), recordHelper.getMainTableName())) {
             return;
         }
 
@@ -268,25 +450,34 @@
             // 2. we don't want to update the package name in the records as they already have the
             //    correct package name.
             UpsertTransactionRequest upsertTransactionRequest =
-                    new UpsertTransactionRequest(
-                            null /* packageName */,
-                            records,
-                            mDeviceInfoHelper,
-                            mContext,
-                            true /* isInsertRequest */,
-                            true /* useProvidedUuid */,
-                            true /* skipPackageName */,
-                            mAppInfoHelper);
-            mTransactionManager.insertAll(upsertTransactionRequest.getUpsertRequests());
+                    UpsertTransactionRequest.createForRestore(
+                            records, mDeviceInfoHelper, mAppInfoHelper);
 
+            // Both methods use ON CONFLICT IGNORE strategy, which means that if the source data
+            // being inserted into target db already exists, the source data will be ignored. We
+            // won't apply updates to the target data.
+            //
+            // Only generate change logs when any change logs token are present. Client apps can
+            // only read change logs if they have ever requested a change logs token.
+            if (cloudBackupAndRestore()
+                    && mTransactionManager.checkTableExists(ChangeLogsRequestHelper.TABLE_NAME)
+                    && mTransactionManager.queryNumEntries(ChangeLogsRequestHelper.TABLE_NAME)
+                            != 0) {
+                mTransactionManager.insertAllRecords(
+                        mAppInfoHelper, /* accessLogsHelper */ null, upsertTransactionRequest);
+            } else {
+                mTransactionManager.insertOrIgnoreOnConflict(
+                        upsertTransactionRequest.getUpsertRequests());
+            }
             currentToken = token;
         } while (!currentToken.isEmpty());
     }
 
     private <T extends Record> void deleteRecordsOfType(
             HealthConnectDatabase stagedDatabase, int recordType, Class<T> recordTypeClass) {
-        RecordHelper<?> recordHelper = RecordHelperProvider.getRecordHelper(recordType);
-        if (!StorageUtils.checkTableExists(stagedDatabase, recordHelper.getMainTableName())) {
+        RecordHelper<?> recordHelper = mInternalHealthConnectMappings.getRecordHelper(recordType);
+        if (!checkTableExists(
+                stagedDatabase.getReadableDatabase(), recordHelper.getMainTableName())) {
             return;
         }
 
@@ -350,14 +541,12 @@
             recordInternalList = readResult.first;
             token = readResult.second;
             if (readTableRequest.getExtraReadRequests() != null) {
+                RecordHelper<?> mainRecordHelper =
+                        requireNonNull(readTableRequest.getRecordHelper());
                 for (ReadTableRequest extraDataRequest : readTableRequest.getExtraReadRequests()) {
                     Cursor cursorExtraData = read(stagedDatabase, extraDataRequest);
-                    readTableRequest
-                            .getRecordHelper()
-                            .updateInternalRecordsWithExtraFields(
-                                    recordInternalList,
-                                    cursorExtraData,
-                                    extraDataRequest.getTableName());
+                    mainRecordHelper.updateInternalRecordsWithExtraFields(
+                            recordInternalList, cursorExtraData, extraDataRequest.getTableName());
                 }
             }
         }
@@ -366,9 +555,16 @@
 
     private synchronized Cursor read(
             HealthConnectDatabase stagedDatabase, ReadTableRequest request) {
-        Slog.d(TAG, "Running command: " + request.getReadCommand());
-        Cursor cursor =
-                stagedDatabase.getReadableDatabase().rawQuery(request.getReadCommand(), null);
+        return read(stagedDatabase.getReadableDatabase(), request.getReadCommand());
+    }
+
+    private synchronized Cursor read(SQLiteDatabase stagedDatabase, ReadTableRequest request) {
+        return read(stagedDatabase, request.getReadCommand());
+    }
+
+    private synchronized Cursor read(SQLiteDatabase stagedDatabase, String query) {
+        Slog.d(TAG, "Running command: " + query);
+        Cursor cursor = stagedDatabase.rawQuery(query, null);
         Slog.d(TAG, "Cursor count: " + cursor.getCount());
         return cursor;
     }
diff --git a/service/java/com/android/server/healthconnect/exportimport/ExportImportJobs.java b/service/java/com/android/server/healthconnect/exportimport/ExportImportJobs.java
index a2db6a6..898621e 100644
--- a/service/java/com/android/server/healthconnect/exportimport/ExportImportJobs.java
+++ b/service/java/com/android/server/healthconnect/exportimport/ExportImportJobs.java
@@ -24,6 +24,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.PersistableBundle;
+import android.os.UserHandle;
 import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -49,7 +50,7 @@
 
     /** Checks if the rescheduling is needed and schedules the periodic export job if so. */
     public static void schedulePeriodicJobIfNotScheduled(
-            int userId,
+            UserHandle userHandle,
             Context context,
             ExportImportSettingsStorage exportImportSettingsStorage,
             ExportManager exportManager) {
@@ -58,13 +59,14 @@
                         .forNamespace(NAMESPACE)
                         .getAllPendingJobs()
                         .isEmpty()) {
-            schedulePeriodicExportJob(userId, context, exportImportSettingsStorage, exportManager);
+            schedulePeriodicExportJob(
+                    userHandle, context, exportImportSettingsStorage, exportManager);
         }
     }
 
     /** Schedule the periodic export job. */
     public static void schedulePeriodicExportJob(
-            int userId,
+            UserHandle userHandle,
             Context context,
             ExportImportSettingsStorage exportImportSettingsStorage,
             ExportManager exportManager) {
@@ -74,9 +76,13 @@
             Objects.requireNonNull(context.getSystemService(JobScheduler.class))
                     .forNamespace(NAMESPACE)
                     .cancelAll();
+
+            // TODO(b/364855153): Move to next condition once fast follow flag is enabled.
             // If export is off we try to delete the local files, just in case it happened the
             // rare case where those files weren't delete after the last export.
-            exportManager.deleteLocalExportFiles();
+            if (periodInDays <= 0) {
+                exportManager.deleteLocalExportFiles(userHandle);
+            }
         }
         // If period is 0 the user has turned export off, we should no longer schedule a new job
         if (periodInDays <= 0) {
@@ -84,7 +90,7 @@
         }
 
         PersistableBundle extras = new PersistableBundle();
-        extras.putInt(HealthConnectDailyService.EXTRA_USER_ID, userId);
+        extras.putInt(HealthConnectDailyService.EXTRA_USER_ID, userHandle.getIdentifier());
         extras.putString(HealthConnectDailyService.EXTRA_JOB_NAME_KEY, PERIODIC_EXPORT_JOB_NAME);
 
         long periodInMillis = Duration.ofDays(periodInDays).toMillis();
@@ -114,7 +120,7 @@
 
         ComponentName componentName = new ComponentName(context, HealthConnectDailyService.class);
         JobInfo.Builder builder =
-                new JobInfo.Builder(MIN_JOB_ID + userId, componentName)
+                new JobInfo.Builder(MIN_JOB_ID + userHandle.getIdentifier(), componentName)
                         .setRequiresCharging(true)
                         .setRequiresDeviceIdle(true)
                         .setPeriodic(
@@ -131,7 +137,7 @@
         HealthConnectDailyService.schedule(
                 Objects.requireNonNull(context.getSystemService(JobScheduler.class))
                         .forNamespace(NAMESPACE),
-                userId,
+                userHandle,
                 builder.build());
     }
 
@@ -142,7 +148,7 @@
     // TODO(b/318484778): Use dependency injection instead of passing an instance to the method.
     public static boolean executePeriodicExportJob(
             Context context,
-            int userId,
+            UserHandle userHandle,
             PersistableBundle extras,
             ExportManager exportManager,
             ExportImportSettingsStorage exportImportSettingsStorage) {
@@ -152,10 +158,11 @@
             return true;
         }
 
-        boolean exportSuccess = exportManager.runExport();
+        boolean exportSuccess = exportManager.runExport(userHandle);
         boolean firstExport = extras.getBoolean(IS_FIRST_EXPORT, false);
         if (exportSuccess && firstExport) {
-            schedulePeriodicExportJob(userId, context, exportImportSettingsStorage, exportManager);
+            schedulePeriodicExportJob(
+                    userHandle, context, exportImportSettingsStorage, exportManager);
         }
         return exportSuccess;
 
diff --git a/service/java/com/android/server/healthconnect/exportimport/ExportImportNotificationFactory.java b/service/java/com/android/server/healthconnect/exportimport/ExportImportNotificationFactory.java
index 4b3379b..17f8286 100644
--- a/service/java/com/android/server/healthconnect/exportimport/ExportImportNotificationFactory.java
+++ b/service/java/com/android/server/healthconnect/exportimport/ExportImportNotificationFactory.java
@@ -32,6 +32,7 @@
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Icon;
+import android.health.connect.HealthConnectManager;
 import android.os.Binder;
 import android.util.Slog;
 
@@ -105,15 +106,14 @@
     private static final String EXPORT_NOTIFICATION_FREE_UP_SPACE_INTENT_BUTTON =
             "export_notification_free_up_space_intent_button";
 
-    private static final String HEALTH_CONNECT_HOME_ACTION =
-            "android.health.connect.action.HEALTH_HOME_SETTINGS";
     private static final String HEALTH_CONNECT_RESTART_IMPORT_ACTION =
             "android.health.connect.action.START_IMPORT_FLOW";
     private static final String HEALTH_CONNECT_RESTART_EXPORT_SETUP =
             "android.health.connect.action.START_EXPORT_SETUP";
     private static final String HEALTH_CONNECT_UPDATE_ACTION =
             "android.settings.SYSTEM_UPDATE_SETTINGS";
-    private static final Intent FALLBACK_INTENT = new Intent(HEALTH_CONNECT_HOME_ACTION);
+    private static final Intent FALLBACK_INTENT =
+            new Intent(HealthConnectManager.ACTION_HEALTH_HOME_SETTINGS);
 
     @VisibleForTesting static final String APP_ICON_DRAWABLE_NAME = "health_connect_logo";
 
@@ -290,7 +290,7 @@
     }
 
     private PendingIntent getImportCompletePendingIntent() {
-        Intent intent = new Intent(HEALTH_CONNECT_HOME_ACTION);
+        Intent intent = new Intent(HealthConnectManager.ACTION_MANAGE_HEALTH_DATA);
         ResolveInfo result = mContext.getPackageManager().resolveActivity(intent, 0);
         return result == null ? getPendingIntent(FALLBACK_INTENT) : getPendingIntent(intent);
     }
@@ -324,6 +324,8 @@
 
     @Override
     public String[] getNotificationStringResources() {
+        // Resources referenced here must be explicitly kept in apk/res/raw/keep.xml to avoid
+        // removal during shrinking
         return new String[] {
             IMPORT_IN_PROGRESS_NOTIFICATION_TITLE,
             IMPORT_COMPLETE_NOTIFICATION_TITLE,
diff --git a/service/java/com/android/server/healthconnect/exportimport/ExportManager.java b/service/java/com/android/server/healthconnect/exportimport/ExportManager.java
index 94b544e..db1c2b7 100644
--- a/service/java/com/android/server/healthconnect/exportimport/ExportManager.java
+++ b/service/java/com/android/server/healthconnect/exportimport/ExportManager.java
@@ -17,6 +17,7 @@
 package com.android.server.healthconnect.exportimport;
 
 import static android.health.connect.exportimport.ScheduledExportStatus.DATA_EXPORT_ERROR_CLEARING_LOG_TABLES;
+import static android.health.connect.exportimport.ScheduledExportStatus.DATA_EXPORT_ERROR_CLEARING_PHR_TABLES;
 import static android.health.connect.exportimport.ScheduledExportStatus.DATA_EXPORT_ERROR_NONE;
 import static android.health.connect.exportimport.ScheduledExportStatus.DATA_EXPORT_ERROR_UNKNOWN;
 import static android.health.connect.exportimport.ScheduledExportStatus.DATA_EXPORT_LOST_FILE_ACCESS;
@@ -26,22 +27,25 @@
 import static com.android.server.healthconnect.exportimport.ExportImportNotificationSender.NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR;
 import static com.android.server.healthconnect.logging.ExportImportLogger.NO_VALUE_RECORDED;
 
-import static java.util.Objects.requireNonNull;
-
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
 import android.os.UserHandle;
 import android.util.Slog;
 
+import com.android.healthfitness.flags.Flags;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.healthconnect.logging.ExportImportLogger;
 import com.android.server.healthconnect.notifications.HealthConnectNotificationSender;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
 import com.android.server.healthconnect.storage.HealthConnectDatabase;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -68,15 +72,14 @@
 
     private static final String TAG = "HealthConnectExportImport";
 
+    private final Context mContext;
     private final Clock mClock;
     private final TransactionManager mTransactionManager;
-    private final UserHandle mUserHandle;
-    private final File mLocalExportDbFile;
-    private final File mLocalExportZipFile;
     private final ExportImportSettingsStorage mExportImportSettingsStorage;
 
-    // Tables to drop instead of tables to keep to avoid risk of bugs if new data types are added.
+    private final HealthConnectNotificationSender mNotificationSender;
 
+    // Tables to drop instead of tables to keep to avoid risk of bugs if new data types are added.
     /**
      * Logs size is non-trivial, exporting them would make the process slower and the upload file
      * would need more storage. Furthermore, logs from a previous device don't provide the user with
@@ -86,137 +89,143 @@
     public static final List<String> TABLES_TO_CLEAR =
             List.of(AccessLogsHelper.TABLE_NAME, ChangeLogsHelper.TABLE_NAME);
 
-    private final DatabaseContext mDatabaseContext;
-    private final HealthConnectNotificationSender mNotificationSender;
+    private static final List<String> PHR_TABLES_TO_CLEAR =
+            List.of(
+                    MedicalDataSourceHelper.getMainTableName(),
+                    MedicalResourceHelper.getMainTableName(),
+                    MedicalResourceIndicesHelper.getTableName());
 
     public ExportManager(
             Context context,
             Clock clock,
             ExportImportSettingsStorage exportImportSettingsStorage,
             TransactionManager transactionManager) {
-        this(
-                context,
-                clock,
-                ExportImportNotificationSender.createSender(context),
-                exportImportSettingsStorage,
-                transactionManager);
-    }
-
-    public ExportManager(
-            Context context,
-            Clock clock,
-            HealthConnectNotificationSender notificationSender,
-            ExportImportSettingsStorage exportImportSettingsStorage,
-            TransactionManager transactionManager) {
-        requireNonNull(context);
-        requireNonNull(clock);
-        requireNonNull(notificationSender);
-
-        mUserHandle = context.getUser();
-        Context userContext = context.createContextAsUser(mUserHandle, 0);
-
+        mContext = context;
         mClock = clock;
-        mDatabaseContext = DatabaseContext.create(userContext, LOCAL_EXPORT_DIR_NAME, mUserHandle);
-        mTransactionManager = transactionManager;
-        mNotificationSender = notificationSender;
-        mLocalExportDbFile =
-                new File(mDatabaseContext.getDatabaseDir(), LOCAL_EXPORT_DATABASE_FILE_NAME);
-        mLocalExportZipFile =
-                new File(mDatabaseContext.getDatabaseDir(), LOCAL_EXPORT_ZIP_FILE_NAME);
         mExportImportSettingsStorage = exportImportSettingsStorage;
+        mTransactionManager = transactionManager;
+        mNotificationSender = ExportImportNotificationSender.createSender(context);
     }
 
     /**
      * Makes a local copy of the HC database, deletes the unnecessary data for export and sends the
      * data to a cloud provider.
      */
-    public synchronized boolean runExport() {
+    public synchronized boolean runExport(UserHandle userHandle) {
+        Slog.i(TAG, "Export started.");
         long startTimeMillis = mClock.millis();
         ExportImportLogger.logExportStatus(
                 DATA_EXPORT_STARTED, NO_VALUE_RECORDED, NO_VALUE_RECORDED, NO_VALUE_RECORDED);
-        Slog.i(TAG, "Export started.");
+
+        StorageContext dbContext =
+                StorageContext.create(mContext, userHandle, LOCAL_EXPORT_DIR_NAME);
+        File localExportDbFile = getLocalExportDbFile(dbContext);
+        File localExportZipFile = getLocalExportZipFile(dbContext);
 
         try {
             try {
-                exportLocally(mLocalExportDbFile);
+                exportLocally(localExportDbFile);
             } catch (Exception e) {
                 Slog.e(TAG, "Failed to create local file for export", e);
-                Slog.d(TAG, "original file size: " + intSizeInKb(mLocalExportDbFile));
+                Slog.d(TAG, "original file size: " + intSizeInKb(localExportDbFile));
                 recordError(
                         DATA_EXPORT_ERROR_UNKNOWN,
                         startTimeMillis,
-                        intSizeInKb(mLocalExportDbFile),
+                        intSizeInKb(localExportDbFile),
                         /* Compressed size will be 0, not yet compressed */
-                        intSizeInKb(mLocalExportZipFile));
-                sendNotificationIfEnabled(NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
+                        intSizeInKb(localExportZipFile));
+                sendNotificationIfEnabled(
+                        userHandle, NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
                 return false;
             }
 
             try {
-                deleteLogTablesContent();
+                deleteLogTablesContent(dbContext);
             } catch (Exception e) {
                 Slog.e(TAG, "Failed to clear log tables in preparation for export", e);
-                Slog.d(TAG, "Original file size: " + intSizeInKb(mLocalExportDbFile));
+                Slog.d(TAG, "Original file size: " + intSizeInKb(localExportDbFile));
                 recordError(
                         DATA_EXPORT_ERROR_CLEARING_LOG_TABLES,
                         startTimeMillis,
-                        intSizeInKb(mLocalExportDbFile),
+                        intSizeInKb(localExportDbFile),
                         /* Compressed size will be 0, not yet compressed */
-                        intSizeInKb(mLocalExportZipFile));
-                sendNotificationIfEnabled(NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
+                        intSizeInKb(localExportZipFile));
+                sendNotificationIfEnabled(
+                        userHandle, NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
                 return false;
             }
 
+            if (Flags.personalHealthRecordDisableExportImport()) {
+                try {
+                    deletePhrTablesContent(dbContext);
+                } catch (Exception e) {
+                    Slog.e(TAG, "Failed to clear phr tables in preparation for export", e);
+                    Slog.d(TAG, "Original file size: " + intSizeInKb(localExportDbFile));
+                    recordError(
+                            DATA_EXPORT_ERROR_CLEARING_PHR_TABLES,
+                            startTimeMillis,
+                            intSizeInKb(localExportDbFile),
+                            /* Compressed size will be 0, not yet compressed */
+                            intSizeInKb(localExportZipFile));
+                    sendNotificationIfEnabled(
+                            userHandle, NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
+                    return false;
+                }
+            }
+
             try {
                 Compressor.compress(
-                        mLocalExportDbFile, LOCAL_EXPORT_DATABASE_FILE_NAME, mLocalExportZipFile);
+                        localExportDbFile, LOCAL_EXPORT_DATABASE_FILE_NAME, localExportZipFile);
             } catch (Exception e) {
                 Slog.e(TAG, "Failed to compress local file for export", e);
-                Slog.d(TAG, "Original file size: " + intSizeInKb(mLocalExportDbFile));
+                Slog.d(TAG, "Original file size: " + intSizeInKb(localExportDbFile));
                 recordError(
                         DATA_EXPORT_ERROR_UNKNOWN,
                         startTimeMillis,
-                        intSizeInKb(mLocalExportDbFile),
+                        intSizeInKb(localExportDbFile),
                         /* Compressed size will be 0, not yet compressed */
-                        intSizeInKb(mLocalExportZipFile));
-                sendNotificationIfEnabled(NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
+                        intSizeInKb(localExportZipFile));
+                sendNotificationIfEnabled(
+                        userHandle, NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
                 return false;
             }
 
             Uri destinationUri = mExportImportSettingsStorage.getUri();
             try {
-                exportToUri(mLocalExportZipFile, destinationUri);
+                exportToUri(dbContext, localExportZipFile, destinationUri);
             } catch (FileNotFoundException e) {
                 Slog.e(TAG, "Lost access to export location", e);
-                Slog.d(TAG, "Original file size: " + intSizeInKb(mLocalExportDbFile));
+                Slog.d(TAG, "Original file size: " + intSizeInKb(localExportDbFile));
                 recordError(
                         DATA_EXPORT_LOST_FILE_ACCESS,
                         startTimeMillis,
-                        intSizeInKb(mLocalExportDbFile),
-                        intSizeInKb(mLocalExportZipFile));
-                sendNotificationIfEnabled(NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
+                        intSizeInKb(localExportDbFile),
+                        intSizeInKb(localExportZipFile));
+                sendNotificationIfEnabled(
+                        userHandle, NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
                 return false;
             } catch (Exception e) {
                 Slog.e(TAG, "Failed to export to URI", e);
-                Slog.d(TAG, "Original file size: " + intSizeInKb(mLocalExportDbFile));
+                Slog.d(TAG, "Original file size: " + intSizeInKb(localExportDbFile));
                 recordError(
                         DATA_EXPORT_ERROR_UNKNOWN,
                         startTimeMillis,
-                        intSizeInKb(mLocalExportDbFile),
-                        intSizeInKb(mLocalExportZipFile));
-                sendNotificationIfEnabled(NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
+                        intSizeInKb(localExportDbFile),
+                        intSizeInKb(localExportZipFile));
+                sendNotificationIfEnabled(
+                        userHandle, NOTIFICATION_TYPE_EXPORT_UNSUCCESSFUL_GENERIC_ERROR);
                 return false;
             }
             Slog.i(TAG, "Export completed.");
-            Slog.d(TAG, "Original file size: " + intSizeInKb(mLocalExportDbFile));
+            Slog.d(TAG, "Original file size: " + intSizeInKb(localExportDbFile));
             recordSuccess(
                     startTimeMillis,
-                    intSizeInKb(mLocalExportDbFile),
-                    intSizeInKb(mLocalExportZipFile),
+                    intSizeInKb(localExportDbFile),
+                    intSizeInKb(localExportZipFile),
                     destinationUri);
             return true;
         } finally {
-            deleteLocalExportFiles();
+            deleteLocalExportFiles(userHandle);
         }
     }
 
@@ -251,17 +260,29 @@
                 exportStatus, timeToErrorMillis, originalDataSizeKb, compressedDataSizeKb);
     }
 
-    void deleteLocalExportFiles() {
+    void deleteLocalExportFiles(UserHandle userHandle) {
         Slog.i(TAG, "Delete local export files started.");
-        if (mLocalExportDbFile.exists()) {
-            SQLiteDatabase.deleteDatabase(mLocalExportDbFile);
+        StorageContext dbContext =
+                StorageContext.create(mContext, userHandle, LOCAL_EXPORT_DIR_NAME);
+        File localExportDbFile = getLocalExportDbFile(dbContext);
+        File localExportZipFile = getLocalExportZipFile(dbContext);
+        if (localExportDbFile.exists()) {
+            SQLiteDatabase.deleteDatabase(localExportDbFile);
         }
-        if (mLocalExportZipFile.exists()) {
-            mLocalExportZipFile.delete();
+        if (localExportZipFile.exists()) {
+            localExportZipFile.delete();
         }
         Slog.i(TAG, "Delete local export files completed.");
     }
 
+    private File getLocalExportDbFile(StorageContext dbContext) {
+        return new File(dbContext.getDataDir(), LOCAL_EXPORT_DATABASE_FILE_NAME);
+    }
+
+    private File getLocalExportZipFile(StorageContext dbContext) {
+        return new File(dbContext.getDataDir(), LOCAL_EXPORT_ZIP_FILE_NAME);
+    }
+
     private void exportLocally(File destination) throws IOException {
         Slog.i(TAG, "Local export started.");
 
@@ -277,10 +298,11 @@
         Slog.i(TAG, "Local export completed: " + destination.toPath().toAbsolutePath());
     }
 
-    private void exportToUri(File source, Uri destination) throws IOException {
+    private void exportToUri(StorageContext dbContext, File source, Uri destination)
+            throws IOException {
         Slog.i(TAG, "Export to URI started.");
         try (OutputStream outputStream =
-                mDatabaseContext.getContentResolver().openOutputStream(destination)) {
+                dbContext.getContentResolver().openOutputStream(destination)) {
             if (outputStream == null) {
                 throw new IOException("Unable to copy data to URI for export.");
             }
@@ -290,12 +312,12 @@
     }
 
     // TODO(b/325599879): Double check if we need to vacuum the database after clearing the tables.
-    private void deleteLogTablesContent() {
+    private void deleteLogTablesContent(StorageContext dbContext) {
         // Throwing a exception when calling this method implies that it was not possible to
         // create a HC database from the file and, therefore, most probably the database was
         // corrupted during the file copy.
         try (HealthConnectDatabase exportDatabase =
-                new HealthConnectDatabase(mDatabaseContext, LOCAL_EXPORT_DATABASE_FILE_NAME)) {
+                new HealthConnectDatabase(dbContext, LOCAL_EXPORT_DATABASE_FILE_NAME)) {
             for (String tableName : TABLES_TO_CLEAR) {
                 exportDatabase.getWritableDatabase().execSQL("DELETE FROM " + tableName + ";");
             }
@@ -303,6 +325,16 @@
         Slog.i(TAG, "Drop log tables completed.");
     }
 
+    private void deletePhrTablesContent(StorageContext dbContext) {
+        try (HealthConnectDatabase exportDatabase =
+                new HealthConnectDatabase(dbContext, LOCAL_EXPORT_DATABASE_FILE_NAME)) {
+            for (String tableName : PHR_TABLES_TO_CLEAR) {
+                exportDatabase.getWritableDatabase().execSQL("DELETE FROM " + tableName + ";");
+            }
+        }
+        Slog.i(TAG, "Drop phr tables completed.");
+    }
+
     /***
      * Returns the size of a file in Kb for logging
      *
@@ -314,9 +346,9 @@
     }
 
     /** Sends export status notification if export_import_fast_follow flag enabled. */
-    private void sendNotificationIfEnabled(int notificationType) {
+    private void sendNotificationIfEnabled(UserHandle userHandle, int notificationType) {
         if (exportImportFastFollow()) {
-            mNotificationSender.sendNotificationAsUser(notificationType, mUserHandle);
+            mNotificationSender.sendNotificationAsUser(notificationType, userHandle);
         }
     }
 }
diff --git a/service/java/com/android/server/healthconnect/exportimport/ImportManager.java b/service/java/com/android/server/healthconnect/exportimport/ImportManager.java
index 67f3faa..edeae66 100644
--- a/service/java/com/android/server/healthconnect/exportimport/ImportManager.java
+++ b/service/java/com/android/server/healthconnect/exportimport/ImportManager.java
@@ -20,6 +20,7 @@
 import static android.health.connect.exportimport.ImportStatus.DATA_IMPORT_ERROR_UNKNOWN;
 import static android.health.connect.exportimport.ImportStatus.DATA_IMPORT_ERROR_VERSION_MISMATCH;
 import static android.health.connect.exportimport.ImportStatus.DATA_IMPORT_ERROR_WRONG_FILE;
+import static android.health.connect.exportimport.ImportStatus.DATA_IMPORT_STARTED;
 
 import static com.android.server.healthconnect.exportimport.ExportImportNotificationSender.NOTIFICATION_TYPE_IMPORT_COMPLETE;
 import static com.android.server.healthconnect.exportimport.ExportImportNotificationSender.NOTIFICATION_TYPE_IMPORT_IN_PROGRESS;
@@ -28,19 +29,24 @@
 import static com.android.server.healthconnect.exportimport.ExportImportNotificationSender.NOTIFICATION_TYPE_IMPORT_UNSUCCESSFUL_VERSION_MISMATCH;
 import static com.android.server.healthconnect.exportimport.ExportManager.LOCAL_EXPORT_DATABASE_FILE_NAME;
 
-import static java.util.Objects.requireNonNull;
-
+import android.annotation.Nullable;
+import android.content.ContentResolver;
 import android.content.Context;
+import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteException;
 import android.net.Uri;
 import android.os.UserHandle;
+import android.provider.OpenableColumns;
 import android.util.Slog;
 
+import com.android.healthfitness.flags.Flags;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.healthconnect.logging.ExportImportLogger;
 import com.android.server.healthconnect.notifications.HealthConnectNotificationSender;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
 import com.android.server.healthconnect.storage.HealthConnectDatabase;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
@@ -48,13 +54,16 @@
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.time.Clock;
+import java.util.zip.ZipException;
 
 /**
  * Manages import related tasks.
  *
  * @hide
  */
-public final class ImportManager {
+public class ImportManager {
 
     @VisibleForTesting static final String IMPORT_DATABASE_DIR_NAME = "export_import";
 
@@ -67,82 +76,113 @@
     private final TransactionManager mTransactionManager;
     private final HealthConnectNotificationSender mNotificationSender;
     private final ExportImportSettingsStorage mExportImportSettingsStorage;
+    @Nullable private final Clock mClock;
 
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     public ImportManager(
             AppInfoHelper appInfoHelper,
             Context context,
             ExportImportSettingsStorage exportImportSettingsStorage,
             TransactionManager transactionManager,
             DeviceInfoHelper deviceInfoHelper,
-            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper) {
+            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
+            @Nullable Clock clock) {
         this(
                 appInfoHelper,
                 context,
-                ExportImportNotificationSender.createSender(context),
                 exportImportSettingsStorage,
                 transactionManager,
                 deviceInfoHelper,
-                healthDataCategoryPriorityHelper);
+                healthDataCategoryPriorityHelper,
+                clock,
+                ExportImportNotificationSender.createSender(context));
     }
 
+    @VisibleForTesting
     public ImportManager(
             AppInfoHelper appInfoHelper,
             Context context,
-            HealthConnectNotificationSender notificationSender,
             ExportImportSettingsStorage exportImportSettingsStorage,
             TransactionManager transactionManager,
             DeviceInfoHelper deviceInfoHelper,
-            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper) {
-        requireNonNull(context);
+            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
+            @Nullable Clock clock,
+            HealthConnectNotificationSender notificationSender) {
         mContext = context;
         mDatabaseMerger =
                 new DatabaseMerger(
                         appInfoHelper,
-                        context,
                         deviceInfoHelper,
                         healthDataCategoryPriorityHelper,
                         transactionManager);
         mTransactionManager = transactionManager;
-        mNotificationSender = notificationSender;
         mExportImportSettingsStorage = exportImportSettingsStorage;
+        mClock = clock;
+        mNotificationSender = notificationSender;
     }
 
     /** Reads and merges the backup data from a local file. */
     public synchronized void runImport(UserHandle userHandle, Uri uri) {
         Slog.i(TAG, "Import started.");
+        long startTimeMillis = mClock != null ? mClock.millis() : -1;
         mExportImportSettingsStorage.setImportOngoing(true);
         mNotificationSender.sendNotificationAsUser(
                 NOTIFICATION_TYPE_IMPORT_IN_PROGRESS, userHandle);
+
+        ExportImportLogger.logImportStatus(
+                DATA_IMPORT_STARTED,
+                ExportImportLogger.NO_VALUE_RECORDED,
+                ExportImportLogger.NO_VALUE_RECORDED,
+                ExportImportLogger.NO_VALUE_RECORDED);
+
         Context userContext = mContext.createContextAsUser(userHandle, 0);
-        DatabaseContext dbContext =
-                DatabaseContext.create(mContext, IMPORT_DATABASE_DIR_NAME, userHandle);
+        StorageContext dbContext =
+                StorageContext.create(mContext, userHandle, IMPORT_DATABASE_DIR_NAME);
         File importDbFile = dbContext.getDatabasePath(IMPORT_DATABASE_FILE_NAME);
 
+        int zipFileSize = getZipFileSize(userContext, uri);
+
         try {
             try {
                 Compressor.decompress(
                         uri, LOCAL_EXPORT_DATABASE_FILE_NAME, importDbFile, userContext);
                 Slog.i(TAG, "Import file unzipped: " + importDbFile.getAbsolutePath());
             } catch (IllegalArgumentException e) {
-                Slog.e(TAG, "Failed to decompress file ", e);
-                mNotificationSender.clearNotificationsAsUser(userHandle);
-                mNotificationSender.sendNotificationAsUser(
-                        NOTIFICATION_TYPE_IMPORT_UNSUCCESSFUL_INVALID_FILE, userHandle);
-                mExportImportSettingsStorage.setLastImportError(DATA_IMPORT_ERROR_WRONG_FILE);
+                Slog.e(
+                        TAG,
+                        "Failed to decompress zip file as a null-value entry was found and could "
+                                + "not be processed. The file may be corrupted. Details: ",
+                        e);
+                notifyAndLogInvalidFileError(
+                        userHandle, startTimeMillis, intSizeInKb(importDbFile), zipFileSize);
                 return;
+            } catch (ZipException e) {
+                Slog.d(
+                        TAG,
+                        "Failed to decompress zip file due to a zip file format error occurring "
+                                + "whilst attempting to process the input/output streams. The "
+                                + "file may be corrupted. Details: ",
+                        e);
+                notifyAndLogInvalidFileError(
+                        userHandle, startTimeMillis, intSizeInKb(importDbFile), zipFileSize);
+            } catch (IOException e) {
+                Slog.d(
+                        TAG,
+                        "Failed to decompress zip file due to an unknown IO error occurring "
+                                + "whilst attempting to process the input/output streams. The "
+                                + "file may be corrupted. Details: ",
+                        e);
+                notifyAndLogInvalidFileError(
+                        userHandle, startTimeMillis, intSizeInKb(importDbFile), zipFileSize);
             } catch (Exception e) {
                 Slog.e(
                         TAG,
-                        "Failed to get copy to destination: " + importDbFile.getAbsolutePath(),
+                        "Failed to decompress zip file. Was unable to get a copy to the "
+                                + "destination: "
+                                + importDbFile.getAbsolutePath(),
                         e);
-                mNotificationSender.clearNotificationsAsUser(userHandle);
-                mNotificationSender.sendNotificationAsUser(
-                        NOTIFICATION_TYPE_IMPORT_UNSUCCESSFUL_GENERIC_ERROR, userHandle);
-                mExportImportSettingsStorage.setLastImportError(DATA_IMPORT_ERROR_UNKNOWN);
-                return;
+                notifyAndLogUnknownError(
+                        userHandle, startTimeMillis, intSizeInKb(importDbFile), zipFileSize);
             }
-
             try {
                 if (canMerge(importDbFile)) {
                     HealthConnectDatabase stagedDatabase =
@@ -150,32 +190,40 @@
                     mDatabaseMerger.merge(stagedDatabase);
                 }
             } catch (SQLiteException e) {
-                Slog.i(TAG, "Import failed, not a database: " + e);
-                mNotificationSender.clearNotificationsAsUser(userHandle);
-                mNotificationSender.sendNotificationAsUser(
-                        NOTIFICATION_TYPE_IMPORT_UNSUCCESSFUL_INVALID_FILE, userHandle);
-                mExportImportSettingsStorage.setLastImportError(DATA_IMPORT_ERROR_WRONG_FILE);
+                Slog.d(
+                        TAG,
+                        "Import failed during database merge. Selected import file is not"
+                                + "a database. Details: "
+                                + e);
+                notifyAndLogInvalidFileError(
+                        userHandle, startTimeMillis, intSizeInKb(importDbFile), zipFileSize);
                 return;
             } catch (IllegalStateException e) {
-                Slog.i(TAG, "Import failed: " + e);
-                mNotificationSender.clearNotificationsAsUser(userHandle);
-                mNotificationSender.sendNotificationAsUser(
+                Slog.d(
+                        TAG,
+                        "Import failed during database merge. Existing database has a smaller"
+                                + " version number than the database being imported. Details: ",
+                        e);
+                sendNotificationAsUser(
                         NOTIFICATION_TYPE_IMPORT_UNSUCCESSFUL_VERSION_MISMATCH, userHandle);
-                mExportImportSettingsStorage.setLastImportError(DATA_IMPORT_ERROR_VERSION_MISMATCH);
+                recordError(
+                        DATA_IMPORT_ERROR_VERSION_MISMATCH,
+                        startTimeMillis,
+                        intSizeInKb(importDbFile),
+                        zipFileSize);
                 return;
             } catch (Exception e) {
-                Slog.i(TAG, "Import failed: " + e);
-                mNotificationSender.clearNotificationsAsUser(userHandle);
-                mNotificationSender.sendNotificationAsUser(
-                        NOTIFICATION_TYPE_IMPORT_UNSUCCESSFUL_GENERIC_ERROR, userHandle);
-                mExportImportSettingsStorage.setLastImportError(DATA_IMPORT_ERROR_UNKNOWN);
+                Slog.d(
+                        TAG,
+                        "Import failed during database merge due to an unknown error. Details: "
+                                + e);
+                notifyAndLogUnknownError(
+                        userHandle, startTimeMillis, intSizeInKb(importDbFile), zipFileSize);
                 return;
             }
-            mExportImportSettingsStorage.setLastImportError(DATA_IMPORT_ERROR_NONE);
             Slog.i(TAG, "Import completed");
-            mNotificationSender.clearNotificationsAsUser(userHandle);
-            mNotificationSender.sendNotificationAsUser(
-                    NOTIFICATION_TYPE_IMPORT_COMPLETE, userHandle);
+            sendNotificationAsUser(NOTIFICATION_TYPE_IMPORT_COMPLETE, userHandle);
+            recordSuccess(startTimeMillis, intSizeInKb(importDbFile), zipFileSize);
         } finally {
             // Delete the staged db as we are done merging.
             Slog.i(TAG, "Deleting staged db after merging");
@@ -184,6 +232,32 @@
         }
     }
 
+    private int getZipFileSize(Context userContext, Uri uri) {
+        if (Flags.exportImportFastFollow()) {
+            try {
+                return getFileSizeInKb(userContext.getContentResolver(), uri);
+            } catch (IllegalArgumentException e) {
+                Slog.d(
+                        TAG,
+                        "Unable to get the file size of the zip file due to a null-value"
+                                + " cursor being found. File may be corrupted. Setting to -1 as"
+                                + " currently only used for logging. Details: ",
+                        e);
+                return -1;
+            } catch (Exception e) {
+                Slog.d(
+                        TAG,
+                        "Unable to get the file size of the zip file due to an unknown"
+                                + " error. Setting to -1 as currently only used for logging."
+                                + " Details: ",
+                        e);
+                return -1;
+            }
+        } else {
+            return -1;
+        }
+    }
+
     private boolean canMerge(File importDbFile)
             throws FileNotFoundException, IllegalStateException, SQLiteException {
         int currentDbVersion = mTransactionManager.getDatabaseVersion();
@@ -199,14 +273,101 @@
                                 + ", staged version = "
                                 + stagedDbVersion);
                 if (currentDbVersion < stagedDbVersion) {
-                    throw new IllegalStateException("Module needs upgrade for merging to version.");
+                    Slog.d(
+                            TAG,
+                            "Import failed when attempting to start merge. The imported database"
+                                    + " has a greater version number than the existing database.");
+                    throw new IllegalStateException(
+                            "Unable to merge database - module needs"
+                                    + "upgrade for merging to version. Current database has smaller"
+                                    + "version number than database being imported.");
                 }
             }
         } else {
+            Slog.d(
+                    TAG,
+                    "Import failed when attempting to start merge, as database file was"
+                            + "not found.");
             throw new FileNotFoundException("No database file found to merge.");
         }
 
         Slog.i(TAG, "File can be merged.");
         return true;
     }
+
+    /***
+     * Returns the size of a file in Kb for logging
+     * To keep the log size small, the data type is an int32 rather than a long (int64).
+     * Using an int allows logging sizes up to 2TB, which is sufficient for our use cases,
+     */
+    private int intSizeInKb(File file) {
+        return (int) (file.length() / 1024.0);
+    }
+
+    @VisibleForTesting
+    int getFileSizeInKb(ContentResolver contentResolver, Uri zip) {
+        try (Cursor cursor = contentResolver.query(zip, null, null, null, null)) {
+            if (cursor != null) {
+                int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
+                cursor.moveToFirst();
+                return (int) (cursor.getLong(sizeIndex) / 1024.0);
+            } else {
+                throw new IllegalArgumentException("Unable to find cursor, returned null.");
+            }
+        }
+    }
+
+    private void recordError(
+            int importStatus,
+            long startTimeMillis,
+            int originalDataSizeKb,
+            int compressedDataSizeKb) {
+        mExportImportSettingsStorage.setLastImportError(importStatus);
+        if (!Flags.exportImportFastFollow()) return;
+        // Convert to int to save on logs storage, int can hold about 68 years
+        int timeToErrorMillis = mClock != null ? (int) (mClock.millis() - startTimeMillis) : -1;
+        ExportImportLogger.logImportStatus(
+                importStatus, timeToErrorMillis, originalDataSizeKb, compressedDataSizeKb);
+    }
+
+    private void recordSuccess(
+            long startTimeMillis, int originalDataSizeKb, int compressedDataSizeKb) {
+        mExportImportSettingsStorage.setLastImportError(DATA_IMPORT_ERROR_NONE);
+        if (!Flags.exportImportFastFollow()) return;
+        // Convert to int to save on logs storage, int can hold about 68 years
+        int timeToErrorMillis = mClock != null ? (int) (mClock.millis() - startTimeMillis) : -1;
+        ExportImportLogger.logImportStatus(
+                DATA_IMPORT_ERROR_NONE,
+                timeToErrorMillis,
+                originalDataSizeKb,
+                compressedDataSizeKb);
+    }
+
+    private void sendNotificationAsUser(int notificationType, UserHandle userHandle) {
+        mNotificationSender.clearNotificationsAsUser(userHandle);
+        mNotificationSender.sendNotificationAsUser(notificationType, userHandle);
+    }
+
+    private void notifyAndLogUnknownError(
+            UserHandle userHandle,
+            long startTimeMillis,
+            int originalFileSize,
+            int compressedFileSize) {
+        sendNotificationAsUser(NOTIFICATION_TYPE_IMPORT_UNSUCCESSFUL_GENERIC_ERROR, userHandle);
+        recordError(
+                DATA_IMPORT_ERROR_UNKNOWN, startTimeMillis, originalFileSize, compressedFileSize);
+    }
+
+    private void notifyAndLogInvalidFileError(
+            UserHandle userHandle,
+            long startTimeMillis,
+            int originalFileSize,
+            int compressedFileSize) {
+        sendNotificationAsUser(NOTIFICATION_TYPE_IMPORT_UNSUCCESSFUL_INVALID_FILE, userHandle);
+        recordError(
+                DATA_IMPORT_ERROR_WRONG_FILE,
+                startTimeMillis,
+                originalFileSize,
+                compressedFileSize);
+    }
 }
diff --git a/service/java/com/android/server/healthconnect/injector/HealthConnectInjector.java b/service/java/com/android/server/healthconnect/injector/HealthConnectInjector.java
index dc63eeb..d109933 100644
--- a/service/java/com/android/server/healthconnect/injector/HealthConnectInjector.java
+++ b/service/java/com/android/server/healthconnect/injector/HealthConnectInjector.java
@@ -16,21 +16,45 @@
 
 package com.android.server.healthconnect.injector;
 
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
+
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
+import com.android.server.healthconnect.backuprestore.BackupRestore;
 import com.android.server.healthconnect.exportimport.ExportManager;
+import com.android.server.healthconnect.logging.UsageStatsCollector;
+import com.android.server.healthconnect.migration.MigrationBroadcastScheduler;
+import com.android.server.healthconnect.migration.MigrationCleaner;
 import com.android.server.healthconnect.migration.MigrationStateManager;
+import com.android.server.healthconnect.migration.MigrationUiStateManager;
 import com.android.server.healthconnect.migration.PriorityMigrationHelper;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthConnectPermissionHelper;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.permission.PackageInfoUtils;
+import com.android.server.healthconnect.permission.PermissionPackageChangesOrchestrator;
+import com.android.server.healthconnect.storage.DailyCleanupJob;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ActivityDateHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper.DatabaseHelpers;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseStatsCollector;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MigrationEntityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ReadAccessLogsHelper;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
+import com.android.server.healthconnect.utils.TimeSource;
 
 /**
  * Interface for Health Connect Dependency Injector.
@@ -41,50 +65,165 @@
 
     @Nullable private static HealthConnectInjector sHealthConnectInjector;
 
-    /** Getter for PackageInfoUtils instance initialised by the Health Connect Injector. */
+    /** Getter for {@link PackageInfoUtils} instance initialised by the Health Connect Injector. */
     public abstract PackageInfoUtils getPackageInfoUtils();
 
-    /** Getter for TransactionManager instance initialised by the Health Connect Injector. */
+    /**
+     * Getter for {@link TransactionManager} instance initialised by the Health Connect Injector.
+     */
     public abstract TransactionManager getTransactionManager();
 
     /**
-     * Getter for HealthDataCategoryPriorityHelper instance initialised by the Health Connect
-     * Injector.
+     * Getter for {@link HealthDataCategoryPriorityHelper} instance initialised by the Health
+     * Connect Injector.
      */
     public abstract HealthDataCategoryPriorityHelper getHealthDataCategoryPriorityHelper();
 
-    /** Getter for PriorityMigrationHelper instance initialised by the Health Connect Injector. */
+    /**
+     * Getter for {@link PriorityMigrationHelper} instance initialised by the Health Connect
+     * Injector.
+     */
     public abstract PriorityMigrationHelper getPriorityMigrationHelper();
 
-    /** Getter for PreferenceHelper instance initialised by the Health Connect Injector. */
+    /** Getter for {@link PreferenceHelper} instance initialised by the Health Connect Injector. */
     public abstract PreferenceHelper getPreferenceHelper();
 
     /**
-     * Getter for ExportImportSettingsStorage instance initialised by the Health Connect Injector.
+     * Getter for {@link ExportImportSettingsStorage} instance initialised by the Health Connect
+     * Injector.
      */
     public abstract ExportImportSettingsStorage getExportImportSettingsStorage();
 
-    /** Getter for ExportManager instance initialised by the Health Connect Injector. */
+    /** Getter for {@link ExportManager} instance initialised by the Health Connect Injector. */
     public abstract ExportManager getExportManager();
 
-    /** Getter for MigrationStateManager instance initialised by the Health Connect Injector. */
+    /**
+     * Getter for {@link MigrationStateManager} instance initialised by the Health Connect Injector.
+     */
     public abstract MigrationStateManager getMigrationStateManager();
 
-    /**
-     * Getter for HealthConnectDeviceConfigManager instance initialised by the Health Connect
-     * Injector.
-     */
-    public abstract HealthConnectDeviceConfigManager getHealthConnectDeviceConfigManager();
-
-    /** Getter for DeviceInfoHelper instance initialised by the Health Connect Injector. */
+    /** Getter for {@link DeviceInfoHelper} instance initialised by the Health Connect Injector. */
     public abstract DeviceInfoHelper getDeviceInfoHelper();
 
-    /** Getter for AppInfoHelper instance initialised by the Health Connect Injector. */
+    /** Getter for {@link AppInfoHelper} instance initialised by the Health Connect Injector. */
     public abstract AppInfoHelper getAppInfoHelper();
 
-    /** Getter for AccessLogsHelper instance initialised by the Health Connect Injector. */
+    /** Getter for {@link AccessLogsHelper} instance initialised by the Health Connect Injector. */
     public abstract AccessLogsHelper getAccessLogsHelper();
 
+    /**
+     * Getter for {@link ActivityDateHelper} instance initialised by the Health Connect Injector.
+     */
+    public abstract ActivityDateHelper getActivityDateHelper();
+
+    /** Getter for {@link ChangeLogsHelper} instance initialised by the Health Connect Injector. */
+    public abstract ChangeLogsHelper getChangeLogsHelper();
+
+    /**
+     * Getter for {@link ChangeLogsRequestHelper} instance initialised by the Health Connect
+     * Injector.
+     */
+    public abstract ChangeLogsRequestHelper getChangeLogsRequestHelper();
+
+    /**
+     * Returns an instance of {@link HealthConnectMappings} initialised by the Health Connect
+     * Injector.
+     */
+    public abstract HealthConnectMappings getHealthConnectMappings();
+
+    /**
+     * Returns an instance of {@link InternalHealthConnectMappings} initialised by the Health
+     * Connect Injector.
+     */
+    public abstract InternalHealthConnectMappings getInternalHealthConnectMappings();
+
+    /**
+     * Getter for {@link FirstGrantTimeManager} instance initialised by the Health Connect Injector.
+     */
+    public abstract FirstGrantTimeManager getFirstGrantTimeManager();
+
+    /**
+     * Getter for {@link HealthPermissionIntentAppsTracker} instance initialised by the Health
+     * Connect Injector.
+     */
+    public abstract HealthPermissionIntentAppsTracker getHealthPermissionIntentAppsTracker();
+
+    /**
+     * Getter for {@link PermissionPackageChangesOrchestrator} instance initialised by the Health
+     * Connect Injector.
+     */
+    public abstract PermissionPackageChangesOrchestrator getPermissionPackageChangesOrchestrator();
+
+    /**
+     * Getter for {@link HealthConnectPermissionHelper} instance initialised by the Health Connect
+     * Injector.
+     */
+    public abstract HealthConnectPermissionHelper getHealthConnectPermissionHelper();
+
+    /** Getter for {@link MigrationCleaner} instance initialised by the Health Connect Injector. */
+    public abstract MigrationCleaner getMigrationCleaner();
+
+    /**
+     * Getter for {@link MedicalResourceHelper} instance initialised by the Health Connect Injector.
+     */
+    public abstract MedicalResourceHelper getMedicalResourceHelper();
+
+    /**
+     * Getter for {@link MedicalDataSourceHelper} instance initialised by the Health Connect
+     * Injector.
+     */
+    public abstract MedicalDataSourceHelper getMedicalDataSourceHelper();
+
+    /** Getter for {@link TimeSource} instance initialised by the Health Connect Injector. */
+    public abstract TimeSource getTimeSource();
+
+    /**
+     * Getter for {@link MigrationBroadcastScheduler} instance initialised by the Health Connect
+     * Injector.
+     */
+    public abstract MigrationBroadcastScheduler getMigrationBroadcastScheduler();
+
+    /**
+     * Getter for {@link MigrationUiStateManager} instance initialised by the Health Connect
+     * Injector.
+     */
+    public abstract MigrationUiStateManager getMigrationUiStateManager();
+
+    /** Getter for {@link DatabaseHelpers} instance initialised by the Health Connect Injector. */
+    public abstract DatabaseHelpers getDatabaseHelpers();
+
+    /**
+     * Getter for {@link MigrationEntityHelper} instance initialised by the Health Connect Injector.
+     */
+    public abstract MigrationEntityHelper getMigrationEntityHelper();
+
+    /** Getter for {@link BackupRestore} instance initialised by the Health Connect Injector. */
+    public abstract BackupRestore getBackupRestore();
+
+    /**
+     * Getter for {@link PreferencesManager} instance initialised by the Health Connect Injector.
+     */
+    public abstract PreferencesManager getPreferencesManager();
+
+    /** Getter for {@link DailyCleanupJob} instance initialised by the Health Connect Injector. */
+    public abstract DailyCleanupJob getDailyCleanupJob();
+
+    /**
+     * Getter for {@link DatabaseStatsCollector} instance initialised by the Health Connect
+     * Injector.
+     */
+    public abstract DatabaseStatsCollector getDatabaseStatsCollector();
+
+    /**
+     * Getter for {@link UsageStatsCollector} instance initialised by the Health Connect Injector.
+     */
+    public abstract UsageStatsCollector getUsageStatsCollector(StorageContext storageContext);
+
+    /**
+     * Getter for {@link ReadAccessLogsHelper} instance initialised by the Health Connect Injector.
+     */
+    public abstract ReadAccessLogsHelper getReadAccessLogsHelper();
+
     /** Used to initialize the Injector. */
     public static void setInstance(HealthConnectInjector healthConnectInjector) {
         if (sHealthConnectInjector != null) {
diff --git a/service/java/com/android/server/healthconnect/injector/HealthConnectInjectorImpl.java b/service/java/com/android/server/healthconnect/injector/HealthConnectInjectorImpl.java
index 3472fed..7a144a5 100644
--- a/service/java/com/android/server/healthconnect/injector/HealthConnectInjectorImpl.java
+++ b/service/java/com/android/server/healthconnect/injector/HealthConnectInjectorImpl.java
@@ -17,22 +17,48 @@
 package com.android.server.healthconnect.injector;
 
 import android.content.Context;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
+import android.os.UserHandle;
 
 import androidx.annotation.Nullable;
 
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.backuprestore.BackupRestore;
 import com.android.server.healthconnect.exportimport.ExportManager;
+import com.android.server.healthconnect.logging.UsageStatsCollector;
+import com.android.server.healthconnect.migration.MigrationBroadcastScheduler;
+import com.android.server.healthconnect.migration.MigrationCleaner;
 import com.android.server.healthconnect.migration.MigrationStateManager;
+import com.android.server.healthconnect.migration.MigrationUiStateManager;
 import com.android.server.healthconnect.migration.PriorityMigrationHelper;
+import com.android.server.healthconnect.migration.notification.MigrationNotificationSender;
+import com.android.server.healthconnect.permission.FirstGrantTimeDatastore;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthConnectPermissionHelper;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.permission.PackageInfoUtils;
+import com.android.server.healthconnect.permission.PermissionPackageChangesOrchestrator;
+import com.android.server.healthconnect.storage.DailyCleanupJob;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ActivityDateHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper.DatabaseHelpers;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseStatsCollector;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MigrationEntityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ReadAccessLogsHelper;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
+import com.android.server.healthconnect.utils.TimeSource;
+import com.android.server.healthconnect.utils.TimeSourceImpl;
 
 import java.time.Clock;
 import java.util.Objects;
@@ -45,6 +71,8 @@
  */
 public class HealthConnectInjectorImpl extends HealthConnectInjector {
 
+    private final Builder mBuilder;
+
     private final PackageInfoUtils mPackageInfoUtils;
     private final TransactionManager mTransactionManager;
     private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
@@ -52,52 +80,90 @@
     private final PreferenceHelper mPreferenceHelper;
     private final ExportImportSettingsStorage mExportImportSettingsStorage;
     private final ExportManager mExportManager;
-    private final HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
     private final MigrationStateManager mMigrationStateManager;
     private final DeviceInfoHelper mDeviceInfoHelper;
     private final AppInfoHelper mAppInfoHelper;
     private final AccessLogsHelper mAccessLogsHelper;
+    private final ActivityDateHelper mActivityDateHelper;
+    private final HealthConnectMappings mHealthConnectMappings;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings;
+    private final ChangeLogsHelper mChangeLogsHelper;
+    private final ChangeLogsRequestHelper mChangeLogsRequestHelper;
+    private final FirstGrantTimeManager mFirstGrantTimeManager;
+    private final HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+    private final PermissionPackageChangesOrchestrator mPermissionPackageChangesOrchestrator;
+    private final HealthConnectPermissionHelper mHealthConnectPermissionHelper;
+    private final MigrationCleaner mMigrationCleaner;
+    private final TimeSource mTimeSource;
+    private final MedicalDataSourceHelper mMedicalDataSourceHelper;
+    private final MedicalResourceHelper mMedicalResourceHelper;
+    private final MigrationBroadcastScheduler mMigrationBroadcastScheduler;
+    private final MigrationUiStateManager mMigrationUiStateManager;
+    private final DatabaseHelpers mDatabaseHelpers;
+    private final MigrationEntityHelper mMigrationEntityHelper;
+    private final BackupRestore mBackupRestore;
+    private final PreferencesManager mPreferencesManager;
+    private final ReadAccessLogsHelper mReadAccessLogsHelper;
 
     public HealthConnectInjectorImpl(Context context) {
         this(new Builder(context));
     }
 
     private HealthConnectInjectorImpl(Builder builder) {
-        HealthConnectUserContext healthConnectUserContext = builder.mHealthConnectUserContext;
-        mHealthConnectDeviceConfigManager =
-                builder.mHealthConnectDeviceConfigManager == null
-                        ? HealthConnectDeviceConfigManager.initializeInstance(
-                                healthConnectUserContext)
-                        : builder.mHealthConnectDeviceConfigManager;
+        Context context = builder.mContext;
+        mBuilder = builder;
+        // Don't store the user and make it available via the injector, as this user is always
+        // the first / system user, and doesn't change after that.
+        // Any class that is using this user below are responsible for making sure that they
+        // update any reference to user when it changes.
+        UserHandle userHandle = builder.mUserHandle;
+        StorageContext storageContext = StorageContext.create(context, userHandle);
+
+        mDatabaseHelpers = new DatabaseHelpers();
+        mInternalHealthConnectMappings = InternalHealthConnectMappings.getInstance();
+        mHealthConnectMappings = HealthConnectMappings.getInstance();
+        mTimeSource = builder.mTimeSource == null ? new TimeSourceImpl() : builder.mTimeSource;
+        mMigrationEntityHelper =
+                builder.mMigrationEntityHelper == null
+                        ? new MigrationEntityHelper(mDatabaseHelpers)
+                        : builder.mMigrationEntityHelper;
         mTransactionManager =
                 builder.mTransactionManager == null
-                        ? TransactionManager.initializeInstance(healthConnectUserContext)
+                        ? new TransactionManager(storageContext, mInternalHealthConnectMappings)
                         : builder.mTransactionManager;
         mAppInfoHelper =
                 builder.mAppInfoHelper == null
-                        ? AppInfoHelper.getInstance(mTransactionManager)
+                        ? new AppInfoHelper(
+                                storageContext,
+                                mTransactionManager,
+                                mHealthConnectMappings,
+                                mDatabaseHelpers)
                         : builder.mAppInfoHelper;
         mPackageInfoUtils =
                 builder.mPackageInfoUtils == null
-                        ? PackageInfoUtils.getInstance()
+                        ? new PackageInfoUtils()
                         : builder.mPackageInfoUtils;
         mPreferenceHelper =
                 builder.mPreferenceHelper == null
-                        ? PreferenceHelper.getInstance(mTransactionManager)
+                        ? new PreferenceHelper(mTransactionManager, mDatabaseHelpers)
                         : builder.mPreferenceHelper;
         mHealthDataCategoryPriorityHelper =
                 builder.mHealthDataCategoryPriorityHelper == null
-                        ? HealthDataCategoryPriorityHelper.getInstance(
+                        ? new HealthDataCategoryPriorityHelper(
+                                storageContext,
                                 mAppInfoHelper,
                                 mTransactionManager,
-                                mHealthConnectDeviceConfigManager,
                                 mPreferenceHelper,
-                                mPackageInfoUtils)
+                                mPackageInfoUtils,
+                                mHealthConnectMappings,
+                                mDatabaseHelpers)
                         : builder.mHealthDataCategoryPriorityHelper;
         mPriorityMigrationHelper =
                 builder.mPriorityMigrationHelper == null
-                        ? PriorityMigrationHelper.getInstance(
-                                mHealthDataCategoryPriorityHelper, mTransactionManager)
+                        ? new PriorityMigrationHelper(
+                                mHealthDataCategoryPriorityHelper,
+                                mTransactionManager,
+                                mDatabaseHelpers)
                         : builder.mPriorityMigrationHelper;
         mExportImportSettingsStorage =
                 builder.mExportImportSettingsStorage == null
@@ -106,26 +172,128 @@
         mExportManager =
                 builder.mExportManager == null
                         ? new ExportManager(
-                                healthConnectUserContext,
+                                context,
                                 Clock.systemUTC(),
                                 mExportImportSettingsStorage,
                                 mTransactionManager)
                         : builder.mExportManager;
+        mMigrationBroadcastScheduler =
+                builder.mMigrationBroadcastScheduler == null
+                        ? new MigrationBroadcastScheduler(userHandle)
+                        : builder.mMigrationBroadcastScheduler;
         mMigrationStateManager =
                 builder.mMigrationStateManager == null
-                        ? MigrationStateManager.initializeInstance(
-                                healthConnectUserContext.getUser().getIdentifier(),
-                                mHealthConnectDeviceConfigManager,
-                                mPreferenceHelper)
+                        ? new MigrationStateManager(
+                                userHandle, mPreferenceHelper, mMigrationBroadcastScheduler)
                         : builder.mMigrationStateManager;
         mDeviceInfoHelper =
                 builder.mDeviceInfoHelper == null
-                        ? DeviceInfoHelper.getInstance(mTransactionManager)
+                        ? new DeviceInfoHelper(mTransactionManager, mDatabaseHelpers)
                         : builder.mDeviceInfoHelper;
         mAccessLogsHelper =
                 builder.mAccessLogsHelper == null
-                        ? AccessLogsHelper.getInstance(mTransactionManager, mAppInfoHelper)
+                        ? new AccessLogsHelper(
+                                mTransactionManager, mAppInfoHelper, mDatabaseHelpers)
                         : builder.mAccessLogsHelper;
+        mActivityDateHelper =
+                builder.mActivityDateHelper == null
+                        ? new ActivityDateHelper(
+                                mTransactionManager,
+                                mInternalHealthConnectMappings,
+                                mDatabaseHelpers)
+                        : builder.mActivityDateHelper;
+        mChangeLogsHelper =
+                builder.mChangeLogsHelper == null
+                        ? new ChangeLogsHelper(mTransactionManager, mDatabaseHelpers)
+                        : builder.mChangeLogsHelper;
+        mChangeLogsRequestHelper =
+                builder.mChangeLogsRequestHelper == null
+                        ? new ChangeLogsRequestHelper(mTransactionManager, mDatabaseHelpers)
+                        : builder.mChangeLogsRequestHelper;
+        mPermissionIntentAppsTracker =
+                builder.mPermissionIntentAppsTracker == null
+                        ? new HealthPermissionIntentAppsTracker(context)
+                        : builder.mPermissionIntentAppsTracker;
+        mFirstGrantTimeManager =
+                builder.mFirstGrantTimeManager == null
+                        ? new FirstGrantTimeManager(
+                                context,
+                                mPermissionIntentAppsTracker,
+                                builder.mFirstGrantTimeDatastore == null
+                                        ? FirstGrantTimeDatastore.createInstance()
+                                        : builder.mFirstGrantTimeDatastore,
+                                mPackageInfoUtils,
+                                mHealthDataCategoryPriorityHelper,
+                                mMigrationStateManager)
+                        : builder.mFirstGrantTimeManager;
+        mHealthConnectPermissionHelper =
+                builder.mHealthConnectPermissionHelper == null
+                        ? new HealthConnectPermissionHelper(
+                                context,
+                                context.getPackageManager(),
+                                mPermissionIntentAppsTracker,
+                                mFirstGrantTimeManager,
+                                mHealthDataCategoryPriorityHelper,
+                                mAppInfoHelper,
+                                mHealthConnectMappings)
+                        : builder.mHealthConnectPermissionHelper;
+        mPermissionPackageChangesOrchestrator =
+                builder.mPermissionPackageChangesOrchestrator == null
+                        ? new PermissionPackageChangesOrchestrator(
+                                mPermissionIntentAppsTracker,
+                                mFirstGrantTimeManager,
+                                mHealthConnectPermissionHelper,
+                                userHandle,
+                                mHealthDataCategoryPriorityHelper)
+                        : builder.mPermissionPackageChangesOrchestrator;
+        mMigrationCleaner =
+                builder.mMigrationCleaner == null
+                        ? new MigrationCleaner(
+                                mTransactionManager,
+                                mPriorityMigrationHelper,
+                                mMigrationEntityHelper)
+                        : builder.mMigrationCleaner;
+        mMedicalDataSourceHelper =
+                builder.mMedicalDataSourceHelper == null
+                        ? new MedicalDataSourceHelper(
+                                mTransactionManager, mAppInfoHelper, mTimeSource, mAccessLogsHelper)
+                        : builder.mMedicalDataSourceHelper;
+        mMedicalResourceHelper =
+                builder.mMedicalResourceHelper == null
+                        ? new MedicalResourceHelper(
+                                mTransactionManager,
+                                mAppInfoHelper,
+                                mMedicalDataSourceHelper,
+                                mTimeSource,
+                                getAccessLogsHelper())
+                        : builder.mMedicalResourceHelper;
+        mMigrationUiStateManager =
+                builder.mMigrationUiStateManager == null
+                        ? new MigrationUiStateManager(
+                                context,
+                                userHandle,
+                                mMigrationStateManager,
+                                new MigrationNotificationSender(context))
+                        : builder.mMigrationUiStateManager;
+        mBackupRestore =
+                new BackupRestore(
+                        mAppInfoHelper,
+                        mFirstGrantTimeManager,
+                        mMigrationStateManager,
+                        mPreferenceHelper,
+                        mTransactionManager,
+                        context,
+                        mDeviceInfoHelper,
+                        mHealthDataCategoryPriorityHelper);
+        mPreferencesManager =
+                builder.mPreferencesManager == null
+                        ? new PreferencesManager(mPreferenceHelper)
+                        : builder.mPreferencesManager;
+        mReadAccessLogsHelper =
+                builder.mReadAccessLogsHelper == null
+                        ? new ReadAccessLogsHelper(
+                                mAppInfoHelper, mTransactionManager, mDatabaseHelpers)
+                        : builder.mReadAccessLogsHelper;
     }
 
     @Override
@@ -164,11 +332,6 @@
     }
 
     @Override
-    public HealthConnectDeviceConfigManager getHealthConnectDeviceConfigManager() {
-        return mHealthConnectDeviceConfigManager;
-    }
-
-    @Override
     public MigrationStateManager getMigrationStateManager() {
         return mMigrationStateManager;
     }
@@ -188,6 +351,139 @@
         return mAccessLogsHelper;
     }
 
+    @Override
+    public ActivityDateHelper getActivityDateHelper() {
+        return mActivityDateHelper;
+    }
+
+    @Override
+    public ChangeLogsHelper getChangeLogsHelper() {
+        return mChangeLogsHelper;
+    }
+
+    @Override
+    public ChangeLogsRequestHelper getChangeLogsRequestHelper() {
+        return mChangeLogsRequestHelper;
+    }
+
+    @Override
+    public HealthConnectMappings getHealthConnectMappings() {
+        return mHealthConnectMappings;
+    }
+
+    @Override
+    public InternalHealthConnectMappings getInternalHealthConnectMappings() {
+        return mInternalHealthConnectMappings;
+    }
+
+    @Override
+    public FirstGrantTimeManager getFirstGrantTimeManager() {
+        return mFirstGrantTimeManager;
+    }
+
+    @Override
+    public HealthPermissionIntentAppsTracker getHealthPermissionIntentAppsTracker() {
+        return mPermissionIntentAppsTracker;
+    }
+
+    @Override
+    public PermissionPackageChangesOrchestrator getPermissionPackageChangesOrchestrator() {
+        return mPermissionPackageChangesOrchestrator;
+    }
+
+    @Override
+    public HealthConnectPermissionHelper getHealthConnectPermissionHelper() {
+        return mHealthConnectPermissionHelper;
+    }
+
+    @Override
+    public MigrationCleaner getMigrationCleaner() {
+        return mMigrationCleaner;
+    }
+
+    @Override
+    public MedicalDataSourceHelper getMedicalDataSourceHelper() {
+        return mMedicalDataSourceHelper;
+    }
+
+    @Override
+    public MedicalResourceHelper getMedicalResourceHelper() {
+        return mMedicalResourceHelper;
+    }
+
+    @Override
+    public TimeSource getTimeSource() {
+        return mTimeSource;
+    }
+
+    @Override
+    public MigrationBroadcastScheduler getMigrationBroadcastScheduler() {
+        return mMigrationBroadcastScheduler;
+    }
+
+    @Override
+    public MigrationUiStateManager getMigrationUiStateManager() {
+        return mMigrationUiStateManager;
+    }
+
+    @Override
+    public DatabaseHelpers getDatabaseHelpers() {
+        return mDatabaseHelpers;
+    }
+
+    @Override
+    public MigrationEntityHelper getMigrationEntityHelper() {
+        return mMigrationEntityHelper;
+    }
+
+    @Override
+    public BackupRestore getBackupRestore() {
+        return mBackupRestore;
+    }
+
+    @Override
+    public PreferencesManager getPreferencesManager() {
+        return mPreferencesManager;
+    }
+
+    @Override
+    public DailyCleanupJob getDailyCleanupJob() {
+        return new DailyCleanupJob(
+                getHealthDataCategoryPriorityHelper(),
+                getPreferencesManager(),
+                getAppInfoHelper(),
+                getTransactionManager(),
+                getAccessLogsHelper(),
+                getActivityDateHelper());
+    }
+
+    @Override
+    public DatabaseStatsCollector getDatabaseStatsCollector() {
+        return mBuilder.mDatabaseStatsCollector == null
+                ? new DatabaseStatsCollector(getTransactionManager())
+                : mBuilder.mDatabaseStatsCollector;
+    }
+
+    @Override
+    public UsageStatsCollector getUsageStatsCollector(StorageContext storageContext) {
+        return mBuilder.mUsageStatsCollector == null
+                ? new UsageStatsCollector(
+                        storageContext,
+                        mPreferenceHelper,
+                        mPreferencesManager,
+                        mAccessLogsHelper,
+                        mTimeSource,
+                        mMedicalResourceHelper,
+                        mMedicalDataSourceHelper,
+                        mPackageInfoUtils)
+                : mBuilder.mUsageStatsCollector;
+    }
+
+    @Override
+    public ReadAccessLogsHelper getReadAccessLogsHelper() {
+        return mReadAccessLogsHelper;
+    }
+
     /**
      * Returns a new Builder of Health Connect Injector
      *
@@ -205,7 +501,8 @@
      */
     public static class Builder {
 
-        private final HealthConnectUserContext mHealthConnectUserContext;
+        private final Context mContext;
+        private final UserHandle mUserHandle;
 
         @Nullable private PackageInfoUtils mPackageInfoUtils;
         @Nullable private TransactionManager mTransactionManager;
@@ -214,31 +511,53 @@
         @Nullable private PreferenceHelper mPreferenceHelper;
         @Nullable private ExportImportSettingsStorage mExportImportSettingsStorage;
         @Nullable private ExportManager mExportManager;
-        @Nullable private HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
         @Nullable private MigrationStateManager mMigrationStateManager;
         @Nullable private DeviceInfoHelper mDeviceInfoHelper;
         @Nullable private AppInfoHelper mAppInfoHelper;
         @Nullable private AccessLogsHelper mAccessLogsHelper;
+        @Nullable private ActivityDateHelper mActivityDateHelper;
+        @Nullable private ChangeLogsHelper mChangeLogsHelper;
+        @Nullable private ChangeLogsRequestHelper mChangeLogsRequestHelper;
+        @Nullable private FirstGrantTimeManager mFirstGrantTimeManager;
+        @Nullable private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+        @Nullable private FirstGrantTimeDatastore mFirstGrantTimeDatastore;
+
+        @Nullable
+        private PermissionPackageChangesOrchestrator mPermissionPackageChangesOrchestrator;
+
+        @Nullable private HealthConnectPermissionHelper mHealthConnectPermissionHelper;
+        @Nullable private MigrationCleaner mMigrationCleaner;
+        @Nullable private TimeSource mTimeSource;
+        @Nullable private MedicalDataSourceHelper mMedicalDataSourceHelper;
+        @Nullable private MedicalResourceHelper mMedicalResourceHelper;
+        @Nullable private MigrationBroadcastScheduler mMigrationBroadcastScheduler;
+        @Nullable private MigrationUiStateManager mMigrationUiStateManager;
+        @Nullable private MigrationEntityHelper mMigrationEntityHelper;
+        @Nullable private PreferencesManager mPreferencesManager;
+        @Nullable private DatabaseStatsCollector mDatabaseStatsCollector;
+        @Nullable private UsageStatsCollector mUsageStatsCollector;
+        @Nullable private ReadAccessLogsHelper mReadAccessLogsHelper;
 
         private Builder(Context context) {
-            mHealthConnectUserContext = new HealthConnectUserContext(context, context.getUser());
+            mContext = context;
+            mUserHandle = context.getUser();
         }
 
-        /** Set fake or custom PackageInfoUtils */
+        /** Set fake or custom {@link PackageInfoUtils} */
         public Builder setPackageInfoUtils(PackageInfoUtils packageInfoUtils) {
             Objects.requireNonNull(packageInfoUtils);
             mPackageInfoUtils = packageInfoUtils;
             return this;
         }
 
-        /** Set fake or custom TransactionManager */
+        /** Set fake or custom {@link TransactionManager} */
         public Builder setTransactionManager(TransactionManager transactionManager) {
             Objects.requireNonNull(transactionManager);
             mTransactionManager = transactionManager;
             return this;
         }
 
-        /** Set fake or custom HealthDataCategoryPriorityHelper */
+        /** Set fake or custom {@link HealthDataCategoryPriorityHelper} */
         public Builder setHealthDataCategoryPriorityHelper(
                 HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper) {
             Objects.requireNonNull(healthDataCategoryPriorityHelper);
@@ -246,21 +565,21 @@
             return this;
         }
 
-        /** Set fake or custom PriorityMigrationHelper */
+        /** Set fake or custom {@link PriorityMigrationHelper} */
         public Builder setPriorityMigrationHelper(PriorityMigrationHelper priorityMigrationHelper) {
             Objects.requireNonNull(priorityMigrationHelper);
             mPriorityMigrationHelper = priorityMigrationHelper;
             return this;
         }
 
-        /** Set fake or custom PreferenceHelper */
+        /** Set fake or custom {@link PreferenceHelper} */
         public Builder setPreferenceHelper(PreferenceHelper preferenceHelper) {
             Objects.requireNonNull(preferenceHelper);
             mPreferenceHelper = preferenceHelper;
             return this;
         }
 
-        /** Set fake or custom ExportImportSettingsStorage */
+        /** Set fake or custom {@link ExportImportSettingsStorage} */
         public Builder setExportImportSettingsStorage(
                 ExportImportSettingsStorage exportImportSettingsStorage) {
             Objects.requireNonNull(exportImportSettingsStorage);
@@ -268,49 +587,178 @@
             return this;
         }
 
-        /** Set fake or custom ExportManager */
+        /** Set fake or custom {@link ExportManager} */
         public Builder setExportManager(ExportManager exportManager) {
             Objects.requireNonNull(exportManager);
             mExportManager = exportManager;
             return this;
         }
 
-        /** Set fake or custom HealthConnectDeviceConfigManager */
-        public Builder setHealthConnectDeviceConfigManager(
-                HealthConnectDeviceConfigManager healthConnectDeviceConfigManager) {
-            Objects.requireNonNull(healthConnectDeviceConfigManager);
-            mHealthConnectDeviceConfigManager = healthConnectDeviceConfigManager;
-            return this;
-        }
-
-        /** Set fake or custom MigrationStateManager */
+        /** Set fake or custom {@link MigrationStateManager} */
         public Builder setMigrationStateManager(MigrationStateManager migrationStateManager) {
             Objects.requireNonNull(migrationStateManager);
             mMigrationStateManager = migrationStateManager;
             return this;
         }
 
-        /** Set fake or custom DeviceInfoHelper */
+        /** Set fake or custom {@link DeviceInfoHelper} */
         public Builder setDeviceInfoHelper(DeviceInfoHelper deviceInfoHelper) {
             Objects.requireNonNull(deviceInfoHelper);
             mDeviceInfoHelper = deviceInfoHelper;
             return this;
         }
 
-        /** Set fake or custom AppInfoHelper */
+        /** Set fake or custom {@link AppInfoHelper} */
         public Builder setAppInfoHelper(AppInfoHelper appInfoHelper) {
             Objects.requireNonNull(appInfoHelper);
             mAppInfoHelper = appInfoHelper;
             return this;
         }
 
-        /** Set fake or custom AccessLogsHelper */
+        /** Set fake or custom {@link AccessLogsHelper} */
         public Builder setAccessLogsHelper(AccessLogsHelper accessLogsHelper) {
             Objects.requireNonNull(accessLogsHelper);
             mAccessLogsHelper = accessLogsHelper;
             return this;
         }
 
+        /** Set fake or custom {@link ActivityDateHelper} */
+        public Builder setActivityDateHelper(ActivityDateHelper activityDateHelper) {
+            Objects.requireNonNull(activityDateHelper);
+            mActivityDateHelper = activityDateHelper;
+            return this;
+        }
+
+        /** Set fake or custom {@link ChangeLogsHelper} */
+        public Builder setChangeLogsHelper(ChangeLogsHelper changeLogsHelper) {
+            Objects.requireNonNull(changeLogsHelper);
+            mChangeLogsHelper = changeLogsHelper;
+            return this;
+        }
+
+        /** Set fake or custom {@link ChangeLogsRequestHelper} */
+        public Builder setChangeLogsRequestHelper(ChangeLogsRequestHelper changeLogsRequestHelper) {
+            Objects.requireNonNull(changeLogsRequestHelper);
+            mChangeLogsRequestHelper = changeLogsRequestHelper;
+            return this;
+        }
+
+        /** Set fake or custom {@link FirstGrantTimeManager} */
+        public Builder setFirstGrantTimeManager(FirstGrantTimeManager firstGrantTimeManager) {
+            Objects.requireNonNull(firstGrantTimeManager);
+            mFirstGrantTimeManager = firstGrantTimeManager;
+            return this;
+        }
+
+        /** Set fake or custom {@link FirstGrantTimeDatastore} */
+        public Builder setFirstGrantTimeDatastore(FirstGrantTimeDatastore firstGrantTimeDatastore) {
+            Objects.requireNonNull(firstGrantTimeDatastore);
+            mFirstGrantTimeDatastore = firstGrantTimeDatastore;
+            return this;
+        }
+
+        /** Set fake or custom {@link HealthPermissionIntentAppsTracker} */
+        public Builder setHealthPermissionIntentAppsTracker(
+                HealthPermissionIntentAppsTracker healthPermissionIntentAppsTracker) {
+            Objects.requireNonNull(healthPermissionIntentAppsTracker);
+            mPermissionIntentAppsTracker = healthPermissionIntentAppsTracker;
+            return this;
+        }
+
+        /** Set fake or custom {@link PermissionPackageChangesOrchestrator} */
+        public Builder setPermissionPackageChangesOrchestrator(
+                PermissionPackageChangesOrchestrator permissionPackageChangesOrchestrator) {
+            Objects.requireNonNull(permissionPackageChangesOrchestrator);
+            mPermissionPackageChangesOrchestrator = permissionPackageChangesOrchestrator;
+            return this;
+        }
+
+        /** Set fake or custom {@link HealthConnectPermissionHelper} */
+        public Builder setHealthConnectPermissionHelper(
+                HealthConnectPermissionHelper healthConnectPermissionHelper) {
+            Objects.requireNonNull(healthConnectPermissionHelper);
+            mHealthConnectPermissionHelper = healthConnectPermissionHelper;
+            return this;
+        }
+
+        /** Set fake or custom {@link MigrationCleaner} */
+        public Builder setMigrationCleaner(MigrationCleaner migrationCleaner) {
+            Objects.requireNonNull(migrationCleaner);
+            mMigrationCleaner = migrationCleaner;
+            return this;
+        }
+
+        /** Set fake or custom {@link TimeSource} */
+        public Builder setTimeSource(TimeSource timeSource) {
+            Objects.requireNonNull(timeSource);
+            mTimeSource = timeSource;
+            return this;
+        }
+
+        /** Set fake or custom {@link MedicalDataSourceHelper} */
+        public Builder setMedicalDataSourceHelper(MedicalDataSourceHelper medicalDataSourceHelper) {
+            Objects.requireNonNull(medicalDataSourceHelper);
+            mMedicalDataSourceHelper = medicalDataSourceHelper;
+            return this;
+        }
+
+        /** Set fake or custom {@link MedicalResourceHelper} */
+        public Builder setMedicalResourceHelper(MedicalResourceHelper medicalResourceHelper) {
+            Objects.requireNonNull(medicalResourceHelper);
+            mMedicalResourceHelper = medicalResourceHelper;
+            return this;
+        }
+
+        /** Set fake or custom {@link MigrationBroadcastScheduler} */
+        public Builder setMigrationBroadcastScheduler(
+                MigrationBroadcastScheduler migrationBroadcastScheduler) {
+            Objects.requireNonNull(migrationBroadcastScheduler);
+            mMigrationBroadcastScheduler = migrationBroadcastScheduler;
+            return this;
+        }
+
+        /** Set fake or custom {@link MigrationUiStateManager} */
+        public Builder setMigrationUiStateManager(MigrationUiStateManager migrationUiStateManager) {
+            Objects.requireNonNull(migrationUiStateManager);
+            mMigrationUiStateManager = migrationUiStateManager;
+            return this;
+        }
+
+        /** Set fake or custom {@link MigrationEntityHelper} */
+        public Builder setMigrationEntityHelper(MigrationEntityHelper migrationEntityHelper) {
+            Objects.requireNonNull(migrationEntityHelper);
+            mMigrationEntityHelper = migrationEntityHelper;
+            return this;
+        }
+
+        /** Set fake or custom {@link PreferencesManager} */
+        public Builder setPreferencesManager(PreferencesManager preferencesManager) {
+            Objects.requireNonNull(preferencesManager);
+            mPreferencesManager = preferencesManager;
+            return this;
+        }
+
+        /** Set fake or custom {@link DatabaseStatsCollector} */
+        public Builder setDatabaseStatsCollector(DatabaseStatsCollector databaseStatsCollector) {
+            Objects.requireNonNull(databaseStatsCollector);
+            mDatabaseStatsCollector = databaseStatsCollector;
+            return this;
+        }
+
+        /** Set fake or custom {@link UsageStatsCollector} */
+        public Builder setUsageStatsCollector(UsageStatsCollector usageStatsCollector) {
+            Objects.requireNonNull(usageStatsCollector);
+            mUsageStatsCollector = usageStatsCollector;
+            return this;
+        }
+
+        /** Set fake or custom {@link ReadAccessLogsHelper} */
+        public Builder setReadAccessLogsHelper(ReadAccessLogsHelper readAccessLogsHelper) {
+            Objects.requireNonNull(readAccessLogsHelper);
+            mReadAccessLogsHelper = readAccessLogsHelper;
+            return this;
+        }
+
         /** Build HealthConnectInjector */
         public HealthConnectInjector build() {
             return new HealthConnectInjectorImpl(this);
diff --git a/service/java/com/android/server/healthconnect/logging/DailyLoggingService.java b/service/java/com/android/server/healthconnect/logging/DailyLoggingService.java
index 46f6fe3..11047c5 100644
--- a/service/java/com/android/server/healthconnect/logging/DailyLoggingService.java
+++ b/service/java/com/android/server/healthconnect/logging/DailyLoggingService.java
@@ -16,14 +16,9 @@
 
 package com.android.server.healthconnect.logging;
 
-import android.content.Context;
-import android.os.UserHandle;
 import android.util.Slog;
 
-import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
-
-import java.util.Objects;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseStatsCollector;
 
 /**
  * Class to log Health Connect metrics logged every 24hrs.
@@ -37,32 +32,25 @@
 
     /** Log daily metrics. */
     public static void logDailyMetrics(
-            Context context,
-            UserHandle userHandle,
-            PreferenceHelper preferenceHelper,
-            AccessLogsHelper accessLogsHelper) {
-        Objects.requireNonNull(context);
-        Objects.requireNonNull(userHandle);
-
-        logDatabaseStats(context);
-        logUsageStats(context, userHandle, preferenceHelper, accessLogsHelper);
+            UsageStatsCollector usageStatsCollector,
+            DatabaseStatsCollector databaseStatsCollector) {
+        logDatabaseStats(databaseStatsCollector, usageStatsCollector);
+        logUsageStats(usageStatsCollector);
     }
 
-    private static void logDatabaseStats(Context context) {
+    private static void logDatabaseStats(
+            DatabaseStatsCollector databaseStatsCollector,
+            UsageStatsCollector usageStatsCollector) {
         try {
-            DatabaseStatsLogger.log(context);
+            DatabaseStatsLogger.log(databaseStatsCollector, usageStatsCollector);
         } catch (Exception exception) {
             Slog.e(HEALTH_CONNECT_DAILY_LOGGING_SERVICE, "Failed to log database stats", exception);
         }
     }
 
-    private static void logUsageStats(
-            Context context,
-            UserHandle userHandle,
-            PreferenceHelper preferenceHelper,
-            AccessLogsHelper accessLogsHelper) {
+    private static void logUsageStats(UsageStatsCollector usageStatsCollector) {
         try {
-            UsageStatsLogger.log(context, userHandle, preferenceHelper, accessLogsHelper);
+            UsageStatsLogger.log(usageStatsCollector);
         } catch (Exception exception) {
             Slog.e(HEALTH_CONNECT_DAILY_LOGGING_SERVICE, "Failed to log usage stats", exception);
         }
diff --git a/service/java/com/android/server/healthconnect/logging/DatabaseStatsLogger.java b/service/java/com/android/server/healthconnect/logging/DatabaseStatsLogger.java
index 200c8cd..1d4fd56 100644
--- a/service/java/com/android/server/healthconnect/logging/DatabaseStatsLogger.java
+++ b/service/java/com/android/server/healthconnect/logging/DatabaseStatsLogger.java
@@ -16,12 +16,18 @@
 
 package com.android.server.healthconnect.logging;
 
-import android.content.Context;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_STORAGE_STATS;
+
+import static com.android.healthfitness.flags.Flags.personalHealthRecordTelemetry;
+
 import android.health.HealthFitnessStatsLog;
 
 import com.android.server.healthconnect.storage.datatypehelpers.DatabaseStatsCollector;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
 
-import java.util.Objects;
+import java.util.Set;
 
 /**
  * Class to log Health Connect database stats.
@@ -31,12 +37,18 @@
 class DatabaseStatsLogger {
 
     /** Write Health Connect database stats to statsd. */
-    static void log(Context context) {
+    static void log(
+            DatabaseStatsCollector databaseStatsCollector,
+            UsageStatsCollector usageStatsCollector) {
+        logGeneralDatabaseStats(databaseStatsCollector);
+        logPhrDatabaseStats(databaseStatsCollector, usageStatsCollector);
+    }
 
-        long numberOfInstantRecords = DatabaseStatsCollector.getNumberOfInstantRecordRows();
-        long numberOfIntervalRecords = DatabaseStatsCollector.getNumberOfIntervalRecordRows();
-        long numberOfSeriesRecords = DatabaseStatsCollector.getNumberOfSeriesRecordRows();
-        long numberOfChangeLogs = DatabaseStatsCollector.getNumberOfChangeLogs();
+    private static void logGeneralDatabaseStats(DatabaseStatsCollector databaseStatsCollector) {
+        long numberOfInstantRecords = databaseStatsCollector.getNumberOfInstantRecordRows();
+        long numberOfIntervalRecords = databaseStatsCollector.getNumberOfIntervalRecordRows();
+        long numberOfSeriesRecords = databaseStatsCollector.getNumberOfSeriesRecordRows();
+        long numberOfChangeLogs = databaseStatsCollector.getNumberOfChangeLogs();
 
         // If this condition is true then the user does not uses HC and we should not collect data.
         // This will reduce the load on logging service otherwise we will get daily data from
@@ -48,13 +60,33 @@
             return;
         }
 
-        Objects.requireNonNull(context);
         HealthFitnessStatsLog.write(
                 HealthFitnessStatsLog.HEALTH_CONNECT_STORAGE_STATS,
-                DatabaseStatsCollector.getDatabaseSize(context),
+                databaseStatsCollector.getDatabaseSize(),
                 numberOfInstantRecords,
                 numberOfIntervalRecords,
                 numberOfSeriesRecords,
                 numberOfChangeLogs);
     }
+
+    /** Writes PHR database stats to statsd. */
+    private static void logPhrDatabaseStats(
+            DatabaseStatsCollector databaseStatsCollector,
+            UsageStatsCollector usageStatsCollector) {
+        if (!personalHealthRecordTelemetry()
+                || (usageStatsCollector.getMedicalResourcesCount() == 0
+                        && usageStatsCollector.getMedicalDataSourcesCount() == 0)) {
+            return;
+        }
+
+        Long phrDbSizeLong =
+                databaseStatsCollector.getFileBytes(
+                        Set.of(
+                                MedicalDataSourceHelper.getMainTableName(),
+                                MedicalResourceHelper.getMainTableName(),
+                                MedicalResourceIndicesHelper.getTableName()));
+        if (phrDbSizeLong != null) {
+            HealthFitnessStatsLog.write(HEALTH_CONNECT_PHR_STORAGE_STATS, phrDbSizeLong);
+        }
+    }
 }
diff --git a/service/java/com/android/server/healthconnect/logging/HealthConnectServiceLogger.java b/service/java/com/android/server/healthconnect/logging/HealthConnectServiceLogger.java
index 33b74c2..d2c9343 100644
--- a/service/java/com/android/server/healthconnect/logging/HealthConnectServiceLogger.java
+++ b/service/java/com/android/server/healthconnect/logging/HealthConnectServiceLogger.java
@@ -18,15 +18,24 @@
 
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__API_METHOD_UNKNOWN;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__CREATE_MEDICAL_DATA_SOURCE;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__DELETE_DATA;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__DELETE_MEDICAL_DATA_SOURCE_WITH_DATA;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__DELETE_MEDICAL_RESOURCES_BY_IDS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__DELETE_MEDICAL_RESOURCES_BY_REQUESTS;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__GET_CHANGES;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__GET_CHANGES_TOKEN;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__GET_GRANTED_PERMISSIONS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__GET_MEDICAL_DATA_SOURCES_BY_IDS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__GET_MEDICAL_DATA_SOURCES_BY_REQUESTS;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__INSERT_DATA;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__READ_AGGREGATED_DATA;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__READ_DATA;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__READ_MEDICAL_RESOURCES_BY_IDS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__READ_MEDICAL_RESOURCES_BY_REQUESTS;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__REVOKE_ALL_PERMISSIONS;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__UPDATE_DATA;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_METHOD__UPSERT_MEDICAL_RESOURCES;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_STATUS__ERROR;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_STATUS__STATUS_UNKNOWN;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS;
@@ -101,6 +110,32 @@
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__VO2_MAX;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__WEIGHT;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__WHEELCHAIR_PUSHES;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_CONDITIONS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_PREGNANCY;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_PROCEDURES;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_UNKNOWN;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_VISITS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVE_CALORIES_BURNED;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BASAL_BODY_TEMPERATURE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BASAL_METABOLIC_RATE;
@@ -152,11 +187,25 @@
 import static android.health.connect.ratelimiter.RateLimiter.QuotaBucket.QUOTA_BUCKET_WRITES_PER_24H_BACKGROUND;
 import static android.health.connect.ratelimiter.RateLimiter.QuotaBucket.QUOTA_BUCKET_WRITES_PER_24H_FOREGROUND;
 
+import static com.android.healthfitness.flags.Flags.personalHealthRecordTelemetry;
+import static com.android.healthfitness.flags.Flags.personalHealthRecordTelemetryPrivateWw;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.CREATE_MEDICAL_DATA_SOURCE;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_DATA_SOURCE_WITH_DATA;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_RESOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_RESOURCES_BY_REQUESTS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.GET_MEDICAL_DATA_SOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.GET_MEDICAL_DATA_SOURCES_BY_REQUESTS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.READ_MEDICAL_RESOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.READ_MEDICAL_RESOURCES_BY_REQUESTS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.UPSERT_MEDICAL_RESOURCES;
+
 import android.annotation.IntDef;
 import android.health.HealthFitnessStatsLog;
+import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.internal.datatypes.RecordInternal;
 import android.health.connect.ratelimiter.RateLimiter;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 
 import java.lang.annotation.Retention;
@@ -169,6 +218,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
+import java.util.Set;
 
 /**
  * Class to log metrics from HealthConnectService
@@ -185,11 +235,15 @@
     private final int mRateLimit;
     private final int mNumberOfRecords;
     private final int[] mRecordTypes;
+    private Set<Integer> mMedicalResourceTypes;
     private final String mPackageName;
     private final int mCallerForegroundState;
     private static final int MAX_NUMBER_OF_LOGGED_DATA_TYPES = 6;
     private static final int RECORD_TYPE_NOT_ASSIGNED_DEFAULT_VALUE = -1;
 
+    @VisibleForTesting
+    public static final int MEDICAL_RESOURCE_TYPE_NOT_ASSIGNED_DEFAULT_VALUE = -1;
+
     /**
      * HealthConnectService ApiMethods supported by logging.
      *
@@ -212,6 +266,26 @@
         public static final int REVOKE_ALL_PERMISSIONS =
                 HEALTH_CONNECT_API_CALLED__API_METHOD__REVOKE_ALL_PERMISSIONS;
         public static final int UPDATE_DATA = HEALTH_CONNECT_API_CALLED__API_METHOD__UPDATE_DATA;
+        // PHR data source APIs
+        public static final int CREATE_MEDICAL_DATA_SOURCE =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__CREATE_MEDICAL_DATA_SOURCE;
+        public static final int GET_MEDICAL_DATA_SOURCES_BY_IDS =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__GET_MEDICAL_DATA_SOURCES_BY_IDS;
+        public static final int GET_MEDICAL_DATA_SOURCES_BY_REQUESTS =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__GET_MEDICAL_DATA_SOURCES_BY_REQUESTS;
+        public static final int DELETE_MEDICAL_DATA_SOURCE_WITH_DATA =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__DELETE_MEDICAL_DATA_SOURCE_WITH_DATA;
+        // PHR medical resource APIs
+        public static final int UPSERT_MEDICAL_RESOURCES =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__UPSERT_MEDICAL_RESOURCES;
+        public static final int READ_MEDICAL_RESOURCES_BY_IDS =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__READ_MEDICAL_RESOURCES_BY_IDS;
+        public static final int READ_MEDICAL_RESOURCES_BY_REQUESTS =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__READ_MEDICAL_RESOURCES_BY_REQUESTS;
+        public static final int DELETE_MEDICAL_RESOURCES_BY_IDS =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__DELETE_MEDICAL_RESOURCES_BY_IDS;
+        public static final int DELETE_MEDICAL_RESOURCES_BY_REQUESTS =
+                HEALTH_CONNECT_API_CALLED__API_METHOD__DELETE_MEDICAL_RESOURCES_BY_REQUESTS;
 
         @IntDef({
             API_METHOD_UNKNOWN,
@@ -224,11 +298,36 @@
             READ_DATA,
             REVOKE_ALL_PERMISSIONS,
             UPDATE_DATA,
+            // PHR data source APIs
+            CREATE_MEDICAL_DATA_SOURCE,
+            GET_MEDICAL_DATA_SOURCES_BY_IDS,
+            GET_MEDICAL_DATA_SOURCES_BY_REQUESTS,
+            DELETE_MEDICAL_DATA_SOURCE_WITH_DATA,
+            // PHR medical resource APIs
+            UPSERT_MEDICAL_RESOURCES,
+            READ_MEDICAL_RESOURCES_BY_IDS,
+            READ_MEDICAL_RESOURCES_BY_REQUESTS,
+            DELETE_MEDICAL_RESOURCES_BY_IDS,
+            DELETE_MEDICAL_RESOURCES_BY_REQUESTS
         })
         @Retention(RetentionPolicy.SOURCE)
         public @interface ApiMethod {}
     }
 
+    private static final Set<Integer> PHR_APIS =
+            Set.of(
+                    // PHR data source APIs
+                    CREATE_MEDICAL_DATA_SOURCE,
+                    GET_MEDICAL_DATA_SOURCES_BY_IDS,
+                    GET_MEDICAL_DATA_SOURCES_BY_REQUESTS,
+                    DELETE_MEDICAL_DATA_SOURCE_WITH_DATA,
+                    // PHR medical resource APIs
+                    UPSERT_MEDICAL_RESOURCES,
+                    READ_MEDICAL_RESOURCES_BY_IDS,
+                    READ_MEDICAL_RESOURCES_BY_REQUESTS,
+                    DELETE_MEDICAL_RESOURCES_BY_IDS,
+                    DELETE_MEDICAL_RESOURCES_BY_REQUESTS);
+
     /**
      * Rate limiting ranges differentiated by Foreground/Background.
      *
@@ -376,6 +475,7 @@
         private int mNumberOfRecords;
         private final boolean mHoldsDataManagementPermission;
         private int[] mRecordTypes;
+        private Set<Integer> mMedicalResourceTypes;
         private String mPackageName;
         private int mCallerForegroundState;
 
@@ -389,6 +489,7 @@
             mNumberOfRecords = 0;
             mRecordTypes = new int[MAX_NUMBER_OF_LOGGED_DATA_TYPES];
             Arrays.fill(mRecordTypes, RECORD_TYPE_NOT_ASSIGNED_DEFAULT_VALUE);
+            mMedicalResourceTypes = new HashSet<>();
             mPackageName = "UNKNOWN";
             mCallerForegroundState =
                     HEALTH_CONNECT_API_CALLED__CALLER_FOREGROUND_STATE__UNSPECIFIED;
@@ -461,6 +562,12 @@
             return this;
         }
 
+        /** Sets medical resource types to be logged. */
+        public Builder setMedicalResourceTypes(Set<Integer> medicalResourceTypes) {
+            mMedicalResourceTypes = new HashSet<>(medicalResourceTypes);
+            return this;
+        }
+
         /**
          * Set the types of records.
          *
@@ -544,7 +651,12 @@
             return RateLimitingRanges.NOT_DEFINED;
         }
 
-        /** Public so that it can be used by {@link InternalHealthConnectMappings}. */
+        /**
+         * Public so that it can be used by {@link InternalHealthConnectMappings}.
+         *
+         * @deprecated Use {@link InternalHealthConnectMappings#getLoggingEnumForRecordTypeId(int)}.
+         */
+        @Deprecated
         public static int getDataTypeEnumFromRecordType(int recordType) {
             switch (recordType) {
                 case RECORD_TYPE_STEPS:
@@ -647,17 +759,24 @@
         mRateLimit = builder.mRateLimit;
         mNumberOfRecords = builder.mNumberOfRecords;
         mRecordTypes = builder.mRecordTypes;
+        mMedicalResourceTypes = builder.mMedicalResourceTypes;
         mPackageName = builder.mPackageName;
         mCallerForegroundState = builder.mCallerForegroundState;
     }
 
     /** Log to statsd. */
     public void log() {
-
         // Do not log API calls made from the controller
         if (mHoldsDataManagementPermission) {
             return;
         }
+
+        boolean isPhrApi = PHR_APIS.contains(mHealthDataServiceApiMethod);
+        if (isPhrApi) {
+            writePhrLogs();
+            return;
+        }
+
         HealthFitnessStatsLog.write(
                 HEALTH_CONNECT_API_CALLED,
                 mHealthDataServiceApiMethod,
@@ -666,7 +785,8 @@
                 mDuration,
                 mNumberOfRecords,
                 mRateLimit,
-                mCallerForegroundState);
+                mCallerForegroundState,
+                mPackageName);
 
         // For private logging, max 6 data types per request are being logged
         // rest will be ignored
@@ -685,6 +805,72 @@
                 getRecordTypeEnumToLog(mRecordTypes, 5));
     }
 
+    private void writePhrLogs() {
+        if (personalHealthRecordTelemetry()) { // normal WW
+            HealthFitnessStatsLog.write(
+                    HEALTH_CONNECT_API_CALLED,
+                    mHealthDataServiceApiMethod,
+                    mHealthDataServiceApiStatus,
+                    mErrorCode,
+                    mDuration,
+                    mNumberOfRecords,
+                    mRateLimit,
+                    mCallerForegroundState,
+                    mPackageName);
+        }
+
+        if (personalHealthRecordTelemetryPrivateWw()) { // private WW
+            if (mMedicalResourceTypes.isEmpty()) {
+                writePhrApiInvoked(MEDICAL_RESOURCE_TYPE_NOT_ASSIGNED_DEFAULT_VALUE);
+            } else {
+                for (int medicalResourceType : mMedicalResourceTypes) {
+                    writePhrApiInvoked(getMedicalResourceTypeLoggingEnum(medicalResourceType));
+                }
+            }
+        }
+    }
+
+    private void writePhrApiInvoked(int medicalResourceTypeLoggingEnum) {
+        HealthFitnessStatsLog.write(
+                HEALTH_CONNECT_PHR_API_INVOKED,
+                mHealthDataServiceApiMethod,
+                mHealthDataServiceApiStatus,
+                mPackageName,
+                medicalResourceTypeLoggingEnum);
+    }
+
+    private static int getMedicalResourceTypeLoggingEnum(
+            @MedicalResource.MedicalResourceType int medicalResourceType) {
+        return switch (medicalResourceType) {
+            case MEDICAL_RESOURCE_TYPE_VACCINES ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_VACCINES;
+            case MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+            case MEDICAL_RESOURCE_TYPE_PREGNANCY ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_PREGNANCY;
+            case MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+            case MEDICAL_RESOURCE_TYPE_VITAL_SIGNS ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
+            case MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
+            case MEDICAL_RESOURCE_TYPE_CONDITIONS ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_CONDITIONS;
+            case MEDICAL_RESOURCE_TYPE_PROCEDURES ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_PROCEDURES;
+            case MEDICAL_RESOURCE_TYPE_MEDICATIONS ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+            case MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+            case MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
+            case MEDICAL_RESOURCE_TYPE_VISITS ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_VISITS;
+            default ->
+                    HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_UNKNOWN;
+        };
+    }
+
     private int getRecordTypeEnumToLog(int[] recordTypes, int index) {
         if (recordTypes[index] == RECORD_TYPE_NOT_ASSIGNED_DEFAULT_VALUE) {
             return HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__DATA_TYPE_NOT_ASSIGNED;
diff --git a/service/java/com/android/server/healthconnect/logging/UsageStatsCollector.java b/service/java/com/android/server/healthconnect/logging/UsageStatsCollector.java
index 5c05533..8c0a612 100644
--- a/service/java/com/android/server/healthconnect/logging/UsageStatsCollector.java
+++ b/service/java/com/android/server/healthconnect/logging/UsageStatsCollector.java
@@ -16,54 +16,78 @@
 
 package com.android.server.healthconnect.logging;
 
-import static android.content.pm.PackageManager.GET_PERMISSIONS;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
 
-import android.content.Context;
+import static com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled;
+
 import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.health.connect.HealthConnectManager;
-import android.os.UserHandle;
+import android.health.connect.HealthPermissions;
 
+import androidx.annotation.Nullable;
+
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.healthconnect.permission.PackageInfoUtils;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
+import com.android.server.healthconnect.utils.TimeSource;
 
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Objects;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Collects Health Connect usage stats.
  *
  * @hide
  */
-final class UsageStatsCollector {
-    private static final String USER_MOST_RECENT_ACCESS_LOG_TIME =
-            "USER_MOST_RECENT_ACCESS_LOG_TIME";
-    private static final String EXPORT_PERIOD_PREFERENCE_KEY = "export_period_key";
+public final class UsageStatsCollector {
+
+    @VisibleForTesting static final String EXPORT_PERIOD_PREFERENCE_KEY = "export_period_key";
+
+    @VisibleForTesting
+    static final String USER_MOST_RECENT_ACCESS_LOG_TIME = "USER_MOST_RECENT_ACCESS_LOG_TIME";
+
+    /**
+     * A client is considered as "monthly active" by PHR if it has made any read medical resources
+     * API call within this number of days.
+     */
+    private static final long PHR_MONTHLY_ACTIVE_USER_DURATION = 30; // 30 days
     private static final int NUMBER_OF_DAYS_FOR_USER_TO_BE_MONTHLY_ACTIVE = 30;
-    private final Context mContext;
-    private final List<PackageInfo> mAllPackagesInstalledForUser;
-
+    private final StorageContext mStorageContext;
     private final PreferenceHelper mPreferenceHelper;
+    private final PreferencesManager mPreferencesManager;
     private final AccessLogsHelper mAccessLogsHelper;
+    private final MedicalDataSourceHelper mMedicalDataSourceHelper;
+    private final MedicalResourceHelper mMedicalResourceHelper;
+    private final PackageInfoUtils mPackageInfoUtils;
+    private final TimeSource mTimeSource;
 
-    UsageStatsCollector(
-            Context context,
-            UserHandle userHandle,
+    @Nullable private Map<String, PackageInfo> mPackageNameToPackageInfo;
+
+    public UsageStatsCollector(
+            StorageContext storageContext,
             PreferenceHelper preferenceHelper,
-            AccessLogsHelper accessLogsHelper) {
-        Objects.requireNonNull(userHandle);
-        Objects.requireNonNull(context);
-
-        mContext = context;
-        mAllPackagesInstalledForUser =
-                context.createContextAsUser(userHandle, /* flag= */ 0)
-                        .getPackageManager()
-                        .getInstalledPackages(PackageManager.PackageInfoFlags.of(GET_PERMISSIONS));
+            PreferencesManager preferencesManager,
+            AccessLogsHelper accessLogsHelper,
+            TimeSource timeSource,
+            MedicalResourceHelper medicalResourceHelper,
+            MedicalDataSourceHelper medicalDataSourceHelper,
+            PackageInfoUtils packageInfoUtils) {
+        mStorageContext = storageContext;
         mPreferenceHelper = preferenceHelper;
+        mPreferencesManager = preferencesManager;
         mAccessLogsHelper = accessLogsHelper;
+        mTimeSource = timeSource;
+        mMedicalDataSourceHelper = medicalDataSourceHelper;
+        mMedicalResourceHelper = medicalResourceHelper;
+        mPackageInfoUtils = packageInfoUtils;
     }
 
     /**
@@ -75,30 +99,78 @@
      * @return Number of apps that can be connected (not necessarily connected) to Health Connect
      */
     int getNumberOfAppsCompatibleWithHealthConnect() {
-        int numberOfAppsGrantedHealthPermissions = 0;
-        for (PackageInfo info : mAllPackagesInstalledForUser) {
-            if (hasRequestedHealthPermission(info)) {
-                numberOfAppsGrantedHealthPermissions++;
-            }
-        }
-        return numberOfAppsGrantedHealthPermissions;
+        return mPackageInfoUtils
+                .getPackagesCompatibleWithHealthConnect(mStorageContext, mStorageContext.getUser())
+                .size();
     }
 
     /**
-     * Returns the number of apps that are connected to Health Connect.
+     * Returns the list of apps that are connected to Health Connect.
      *
-     * @return Number of apps that are connected (have read/write) to Health Connect
+     * @return Map of package name to permissions granted for apps that are connected (have
+     *     read/write) to Health Connect
      */
-    int getPackagesHoldingHealthPermissions() {
-        // TODO(b/260707328): replace with getPackagesHoldingPermissions
-        int count = 0;
-
-        for (PackageInfo info : mAllPackagesInstalledForUser) {
-            if (PackageInfoUtils.anyRequestedHealthPermissionGranted(mContext, info)) {
-                count++;
+    public Map<String, List<String>> getPackagesHoldingHealthPermissions() {
+        Map<String, List<String>> packageNameToPermissionsGranted = new HashMap<>();
+        List<PackageInfo> packagesConnectedToHealthConnect =
+                mPackageInfoUtils.getPackagesHoldingHealthPermissions(
+                        mStorageContext.getUser(), mStorageContext);
+        for (PackageInfo info : packagesConnectedToHealthConnect) {
+            List<String> grantedHealthPermissions =
+                    PackageInfoUtils.getGrantedHealthPermissions(mStorageContext, info);
+            if (!grantedHealthPermissions.isEmpty()) {
+                packageNameToPermissionsGranted.put(info.packageName, grantedHealthPermissions);
             }
         }
-        return count;
+        return packageNameToPermissionsGranted;
+    }
+
+    /** Returns whether the current user is considered as a PHR monthly active user. */
+    public boolean isPhrMonthlyActiveUser() {
+        Instant lastReadMedicalResourcesApiTimeStamp =
+                mPreferencesManager.getPhrLastReadMedicalResourcesApiTimeStamp();
+        if (lastReadMedicalResourcesApiTimeStamp == null) {
+            return false;
+        }
+        return mTimeSource
+                .getInstantNow()
+                .minus(PHR_MONTHLY_ACTIVE_USER_DURATION, ChronoUnit.DAYS)
+                .isBefore(lastReadMedicalResourcesApiTimeStamp);
+    }
+
+    /** Returns the number of clients that are granted at least one PHR <b>read</b> permission. */
+    public long getGrantedPhrAppsCount() {
+        Map<String, List<String>> packageNameToPermissionsGranted =
+                getPackagesHoldingHealthPermissions();
+        // isPersonalHealthRecordEnabled() should be enabled when PHR telemetry flag is enabled,
+        // however, without this check, getAllMedicalPermissions() might throw an exception. 0
+        // should be returned instead of an exception.
+        if (!isPersonalHealthRecordEnabled()) {
+            return 0;
+        }
+
+        // note that this set includes WRITE_MEDICAL_DATA
+        Set<String> medicalPermissions = HealthPermissions.getAllMedicalPermissions();
+
+        return packageNameToPermissionsGranted.values().stream()
+                .map(
+                        grantedPermissions -> {
+                            for (String grantedPerm : grantedPermissions) {
+                                // excluding WRITE_MEDICAL_DATA because we are only counting read
+                                // perms
+                                if (WRITE_MEDICAL_DATA.equals(grantedPerm)) {
+                                    continue;
+                                }
+                                if (medicalPermissions.contains(grantedPerm)) {
+                                    // we just need to find one granted medical perm that is not
+                                    // WRITE, hence returning early.
+                                    return 1;
+                                }
+                            }
+                            return 0;
+                        })
+                .filter(count -> count > 0)
+                .count();
     }
 
     /**
@@ -143,17 +215,11 @@
         }
     }
 
-    private boolean hasRequestedHealthPermission(PackageInfo packageInfo) {
-        if (packageInfo == null || packageInfo.requestedPermissions == null) {
-            return false;
-        }
+    int getMedicalResourcesCount() {
+        return mMedicalResourceHelper.getMedicalResourcesCount();
+    }
 
-        for (int i = 0; i < packageInfo.requestedPermissions.length; i++) {
-            if (HealthConnectManager.isHealthPermission(
-                    mContext, packageInfo.requestedPermissions[i])) {
-                return true;
-            }
-        }
-        return false;
+    int getMedicalDataSourcesCount() {
+        return mMedicalDataSourceHelper.getMedicalDataSourcesCount();
     }
 }
diff --git a/service/java/com/android/server/healthconnect/logging/UsageStatsLogger.java b/service/java/com/android/server/healthconnect/logging/UsageStatsLogger.java
index 618adcf..99b54d5 100644
--- a/service/java/com/android/server/healthconnect/logging/UsageStatsLogger.java
+++ b/service/java/com/android/server/healthconnect/logging/UsageStatsLogger.java
@@ -16,14 +16,16 @@
 
 package com.android.server.healthconnect.logging;
 
-import android.content.Context;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PERMISSION_STATS;
+
+import static com.android.healthfitness.flags.Flags.personalHealthRecordTelemetry;
+
 import android.health.HealthFitnessStatsLog;
-import android.os.UserHandle;
 
-import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.healthfitness.flags.Flags;
 
-import java.util.Objects;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Logs Health Connect usage stats.
@@ -33,18 +35,11 @@
 final class UsageStatsLogger {
 
     /** Write Health Connect usage stats to statsd. */
-    static void log(
-            Context context,
-            UserHandle userHandle,
-            PreferenceHelper preferenceHelper,
-            AccessLogsHelper accessLogsHelper) {
-        Objects.requireNonNull(userHandle);
-        Objects.requireNonNull(context);
-
-        UsageStatsCollector usageStatsCollector =
-                new UsageStatsCollector(context, userHandle, preferenceHelper, accessLogsHelper);
+    static void log(UsageStatsCollector usageStatsCollector) {
         usageStatsCollector.upsertLastAccessLogTimeStamp();
-        int numberOfConnectedApps = usageStatsCollector.getPackagesHoldingHealthPermissions();
+        Map<String, List<String>> packageNameToPermissionsGranted =
+                usageStatsCollector.getPackagesHoldingHealthPermissions();
+        int numberOfConnectedApps = packageNameToPermissionsGranted.size();
         int numberOfAvailableApps =
                 usageStatsCollector.getNumberOfAppsCompatibleWithHealthConnect();
         boolean isUserMonthlyActive = usageStatsCollector.isUserMonthlyActive();
@@ -57,6 +52,8 @@
         }
 
         logExportImportStats(usageStatsCollector);
+        logPermissionStats(packageNameToPermissionsGranted);
+        logPhrStats(usageStatsCollector);
 
         HealthFitnessStatsLog.write(
                 HealthFitnessStatsLog.HEALTH_CONNECT_USAGE_STATS,
@@ -65,9 +62,53 @@
                 isUserMonthlyActive);
     }
 
+    private static void logPhrStats(UsageStatsCollector usageStatsCollector) {
+        if (!personalHealthRecordTelemetry()) {
+            return;
+        }
+
+        int medicalDataSourcesCount = usageStatsCollector.getMedicalDataSourcesCount();
+        int medicalResourcesCount = usageStatsCollector.getMedicalResourcesCount();
+        HealthFitnessStatsLog.write(
+                HealthFitnessStatsLog.HEALTH_CONNECT_PHR_USAGE_STATS,
+                medicalDataSourcesCount,
+                medicalResourcesCount,
+                usageStatsCollector.isPhrMonthlyActiveUser(),
+                (int) usageStatsCollector.getGrantedPhrAppsCount());
+    }
+
     static void logExportImportStats(UsageStatsCollector usageStatsCollector) {
         int exportFrequency = usageStatsCollector.getExportFrequency();
         HealthFitnessStatsLog.write(
                 HealthFitnessStatsLog.HEALTH_CONNECT_EXPORT_IMPORT_STATS_REPORTED, exportFrequency);
     }
+
+    static void logPermissionStats(Map<String, List<String>> packageNameToPermissionsGranted) {
+
+        if (!Flags.permissionMetrics()) {
+            return;
+        }
+
+        for (Map.Entry<String, List<String>> connectedAppToPermissionsGranted :
+                packageNameToPermissionsGranted.entrySet()) {
+
+            List<String> grantedPermissions = connectedAppToPermissionsGranted.getValue();
+
+            // This is done to remove the common prefix android.permission.health from all
+            // permissions
+            String[] grantedPermissionsShortened = new String[grantedPermissions.size()];
+            for (int permissionIndex = 0;
+                    permissionIndex < grantedPermissions.size();
+                    permissionIndex++) {
+                String grantedPermission = grantedPermissions.get(permissionIndex);
+                grantedPermissionsShortened[permissionIndex] =
+                        grantedPermission.substring(grantedPermission.lastIndexOf('.') + 1);
+            }
+
+            HealthFitnessStatsLog.write(
+                    HEALTH_CONNECT_PERMISSION_STATS,
+                    connectedAppToPermissionsGranted.getKey(),
+                    grantedPermissionsShortened);
+        }
+    }
 }
diff --git a/service/java/com/android/server/healthconnect/migration/DataMigrationManager.java b/service/java/com/android/server/healthconnect/migration/DataMigrationManager.java
index 70fed5b..46ab8c2 100644
--- a/service/java/com/android/server/healthconnect/migration/DataMigrationManager.java
+++ b/service/java/com/android/server/healthconnect/migration/DataMigrationManager.java
@@ -32,16 +32,15 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.server.healthconnect.permission.FirstGrantTimeManager;
 import com.android.server.healthconnect.permission.HealthConnectPermissionHelper;
-import com.android.server.healthconnect.storage.AutoDeleteService;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.ActivityDateHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MigrationEntityHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 import com.android.server.healthconnect.storage.request.UpsertTableRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 
 import java.util.ArrayList;
@@ -67,7 +66,8 @@
     private final AppInfoHelper mAppInfoHelper;
     private final PriorityMigrationHelper mPriorityMigrationHelper;
     private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
-    private final PreferenceHelper mPreferenceHelper;
+    private final MigrationEntityHelper mMigrationEntityHelper;
+    private final PreferencesManager mPreferencesManager;
 
     public DataMigrationManager(
             Context userContext,
@@ -78,7 +78,8 @@
             AppInfoHelper appInfoHelper,
             HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
             PriorityMigrationHelper priorityMigrationHelper,
-            PreferenceHelper preferenceHelper) {
+            MigrationEntityHelper migrationEntityHelper,
+            PreferencesManager preferencesManager) {
         mUserContext = userContext;
         mTransactionManager = transactionManager;
         mPermissionHelper = permissionHelper;
@@ -87,7 +88,8 @@
         mAppInfoHelper = appInfoHelper;
         mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
         mPriorityMigrationHelper = priorityMigrationHelper;
-        mPreferenceHelper = preferenceHelper;
+        mMigrationEntityHelper = migrationEntityHelper;
+        mPreferencesManager = preferencesManager;
     }
 
     /**
@@ -140,23 +142,24 @@
 
     @GuardedBy("sLock")
     private void migrateRecord(SQLiteDatabase db, RecordMigrationPayload payload) {
-        long recordRowId = mTransactionManager.insertOrIgnore(db, parseRecord(payload));
+        long recordRowId = mTransactionManager.insertOrIgnoreOnConflict(db, parseRecord(payload));
         if (recordRowId != -1) {
-            mTransactionManager.insertOrIgnore(
+            mTransactionManager.insertOrIgnoreOnConflict(
                     db, ActivityDateHelper.getUpsertTableRequest(payload.getRecordInternal()));
         }
     }
 
     private UpsertTableRequest parseRecord(RecordMigrationPayload payload) {
         final RecordInternal<?> record = payload.getRecordInternal();
-        mAppInfoHelper.populateAppInfoId(record, mUserContext, false);
+        mAppInfoHelper.populateAppInfoId(record, /* requireAllFields */ false);
         mDeviceInfoHelper.populateDeviceInfoId(record);
 
         if (record.getUuid() == null) {
             StorageUtils.addNameBasedUUIDTo(record);
         }
 
-        return RecordHelperProvider.getRecordHelper(record.getRecordType())
+        return InternalHealthConnectMappings.getInstance()
+                .getRecordHelper(record.getRecordType())
                 .getUpsertTableRequest(record);
     }
 
@@ -202,7 +205,6 @@
     @GuardedBy("sLock")
     private void migrateAppInfo(AppInfoMigrationPayload payload) {
         mAppInfoHelper.addOrUpdateAppInfoIfNotInstalled(
-                mUserContext,
                 payload.getPackageName(),
                 payload.getAppName(),
                 payload.getAppIcon(),
@@ -238,8 +240,8 @@
      */
     @GuardedBy("sLock")
     private boolean insertEntityIdIfNotPresent(SQLiteDatabase db, String entityId) {
-        final UpsertTableRequest request = MigrationEntityHelper.getInsertRequest(entityId);
-        return mTransactionManager.insertOrIgnore(db, request) != -1;
+        final UpsertTableRequest request = mMigrationEntityHelper.getInsertRequest(entityId);
+        return mTransactionManager.insertOrIgnoreOnConflict(db, request) != -1;
     }
 
     /** Indicates an error during entity migration. */
@@ -306,7 +308,6 @@
      * @param payload of type MetadataMigrationPayload having retention period.
      */
     private void migrateMetadata(MetadataMigrationPayload payload) {
-        AutoDeleteService.setRecordRetentionPeriodInDays(
-                payload.getRecordRetentionPeriodDays(), mPreferenceHelper);
+        mPreferencesManager.setRecordRetentionPeriodInDays(payload.getRecordRetentionPeriodDays());
     }
 }
diff --git a/service/java/com/android/server/healthconnect/migration/MigrationBroadcastScheduler.java b/service/java/com/android/server/healthconnect/migration/MigrationBroadcastScheduler.java
index ce83cf6..6791a20 100644
--- a/service/java/com/android/server/healthconnect/migration/MigrationBroadcastScheduler.java
+++ b/service/java/com/android/server/healthconnect/migration/MigrationBroadcastScheduler.java
@@ -29,11 +29,11 @@
 import android.content.Context;
 import android.health.connect.Constants;
 import android.os.PersistableBundle;
+import android.os.UserHandle;
 import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 
 import java.time.Duration;
 import java.util.Objects;
@@ -52,25 +52,18 @@
     static final String MIGRATION_BROADCAST_NAMESPACE = "HEALTH_CONNECT_MIGRATION_BROADCAST";
 
     private final Object mLock = new Object();
-    private final HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
-    private final MigrationStateManager mMigrationStateManager;
 
     @GuardedBy("mLock")
-    private int mUserId;
+    private UserHandle mUserHandle;
 
-    public MigrationBroadcastScheduler(
-            int userId,
-            HealthConnectDeviceConfigManager healthConnectDeviceConfigManager,
-            MigrationStateManager migrationStateManager) {
-        mUserId = userId;
-        mHealthConnectDeviceConfigManager = healthConnectDeviceConfigManager;
-        mMigrationStateManager = migrationStateManager;
+    public MigrationBroadcastScheduler(UserHandle userHandle) {
+        mUserHandle = userHandle;
     }
 
     /** Sets userId. Invoked when the user is switched. */
-    public void setUserId(int userId) {
+    public void setUserId(UserHandle userHandle) {
         synchronized (mLock) {
-            mUserId = userId;
+            mUserHandle = userHandle;
         }
     }
 
@@ -82,13 +75,13 @@
      * periodic jobs, a periodic job is scheduled, else a set of non-periodic jobs are
      * pre-scheduled.
      */
-    public void scheduleNewJobs(Context context) {
+    public void scheduleNewJobs(Context context, MigrationStateManager migrationStateManager) {
         synchronized (mLock) {
-            int migrationState = mMigrationStateManager.getMigrationState();
+            int migrationState = migrationStateManager.getMigrationState();
 
             if (Constants.DEBUG) {
                 Slog.d(TAG, "Current migration state: " + migrationState);
-                Slog.d(TAG, "Current user: " + mUserId);
+                Slog.d(TAG, "Current user: " + mUserHandle.getIdentifier());
             }
 
             Objects.requireNonNull(context.getSystemService(JobScheduler.class))
@@ -127,10 +120,10 @@
                 new ComponentName(context, MigrationBroadcastJobService.class);
 
         int uuid = UUID.randomUUID().toString().hashCode();
-        int jobId = String.valueOf(mUserId + uuid).hashCode();
+        int jobId = String.valueOf(mUserHandle.getIdentifier() + uuid).hashCode();
 
         final PersistableBundle extras = new PersistableBundle();
-        extras.putInt(EXTRA_USER_ID, mUserId);
+        extras.putInt(EXTRA_USER_ID, mUserHandle.getIdentifier());
 
         JobInfo.Builder builder =
                 new JobInfo.Builder(jobId, schedulerServiceComponent).setExtras(extras);
@@ -157,9 +150,9 @@
     int getRequiredCount(int migrationState) {
         switch (migrationState) {
             case MIGRATION_STATE_IN_PROGRESS:
-                return mHealthConnectDeviceConfigManager.getMigrationStateInProgressCount();
+                return MigrationConstants.MIGRATION_STATE_IN_PROGRESS_COUNT;
             case MIGRATION_STATE_ALLOWED:
-                return mHealthConnectDeviceConfigManager.getMigrationStateAllowedCount();
+                return MigrationConstants.MIGRATION_STATE_ALLOWED_COUNT;
             default:
                 return COUNT_DEFAULT;
         }
@@ -171,11 +164,11 @@
         switch (migrationState) {
             case MIGRATION_STATE_IN_PROGRESS:
                 return calculateRequiredInterval(
-                        mHealthConnectDeviceConfigManager.getInProgressStateTimeoutPeriod(),
+                        MigrationConstants.IN_PROGRESS_STATE_TIMEOUT_HOURS,
                         getRequiredCount(MIGRATION_STATE_IN_PROGRESS));
             case MIGRATION_STATE_ALLOWED:
                 return calculateRequiredInterval(
-                        mHealthConnectDeviceConfigManager.getNonIdleStateTimeoutPeriod(),
+                        MigrationConstants.NON_IDLE_STATE_TIMEOUT_DAYS,
                         getRequiredCount(MIGRATION_STATE_ALLOWED));
             default:
                 return INTERVAL_DEFAULT;
diff --git a/service/java/com/android/server/healthconnect/migration/MigrationCleaner.java b/service/java/com/android/server/healthconnect/migration/MigrationCleaner.java
index 51425bb..640c695 100644
--- a/service/java/com/android/server/healthconnect/migration/MigrationCleaner.java
+++ b/service/java/com/android/server/healthconnect/migration/MigrationCleaner.java
@@ -37,8 +37,9 @@
 
     public MigrationCleaner(
             TransactionManager transactionManager,
-            PriorityMigrationHelper priorityMigrationHelper) {
-        mMigrationEntityHelper = new MigrationEntityHelper();
+            PriorityMigrationHelper priorityMigrationHelper,
+            MigrationEntityHelper migrationEntityHelper) {
+        mMigrationEntityHelper = migrationEntityHelper;
         mTransactionManager = transactionManager;
         mPriorityMigrationHelper = priorityMigrationHelper;
     }
diff --git a/service/java/com/android/server/healthconnect/migration/MigrationConstants.java b/service/java/com/android/server/healthconnect/migration/MigrationConstants.java
index 2bec53b..9b8e58c 100644
--- a/service/java/com/android/server/healthconnect/migration/MigrationConstants.java
+++ b/service/java/com/android/server/healthconnect/migration/MigrationConstants.java
@@ -16,6 +16,7 @@
 
 package com.android.server.healthconnect.migration;
 
+import java.time.Duration;
 import java.time.LocalDate;
 
 /**
@@ -41,7 +42,6 @@
     static final String MIN_DATA_MIGRATION_SDK_EXTENSION_VERSION_KEY =
             "min_data_migration_sdk_extension_version";
     static final String MIGRATION_STARTS_COUNT_KEY = "migration_starts_count";
-    static final String HAVE_CANCELED_OLD_MIGRATION_JOBS_KEY = "have_canceled_old_migration_jobs";
     static final String HAVE_RESET_MIGRATION_STATE_KEY = "have_reset_migration_state";
     static final String MIGRATION_STATE_CHANGE_NAMESPACE = MigrationStateChangeJob.class.toString();
 
@@ -49,4 +49,14 @@
     public static final String IDLE_TIMEOUT_REACHED_KEY = "idle_timeout_reached_key";
 
     static final LocalDate PREMATURE_MIGRATION_TIMEOUT_DATE = LocalDate.of(2023, 6, 15);
+
+    static final int MIGRATION_STATE_IN_PROGRESS_COUNT = 5;
+    static final int MIGRATION_STATE_ALLOWED_COUNT = 5;
+    static final int MAX_START_MIGRATION_CALLS = 6;
+    static final Duration IDLE_STATE_TIMEOUT_DAYS = Duration.ofDays(120);
+    static final Duration NON_IDLE_STATE_TIMEOUT_DAYS = Duration.ofDays(15);
+    static final Duration IN_PROGRESS_STATE_TIMEOUT_HOURS = Duration.ofHours(12);
+    static final Duration EXECUTION_TIME_BUFFER_MINUTES = Duration.ofMinutes(30);
+    static final Duration MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS = Duration.ofDays(1);
+    static final Duration MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS = Duration.ofHours(4);
 }
diff --git a/service/java/com/android/server/healthconnect/migration/MigrationStateChangeJob.java b/service/java/com/android/server/healthconnect/migration/MigrationStateChangeJob.java
index cbc44fa..7f5deef 100644
--- a/service/java/com/android/server/healthconnect/migration/MigrationStateChangeJob.java
+++ b/service/java/com/android/server/healthconnect/migration/MigrationStateChangeJob.java
@@ -33,9 +33,9 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.PersistableBundle;
+import android.os.UserHandle;
 
 import com.android.server.healthconnect.HealthConnectDailyService;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 
 import java.time.Instant;
@@ -52,45 +52,41 @@
     static final int MIN_JOB_ID = MigrationStateChangeJob.class.hashCode();
 
     /** Schedules a job to complete migration. */
-    public static void scheduleMigrationCompletionJob(
-            HealthConnectDeviceConfigManager deviceConfigManager, Context context, int userId) {
-        if (!deviceConfigManager.isCompleteStateChangeJobEnabled()) {
-            return;
-        }
+    public static void scheduleMigrationCompletionJob(Context context, UserHandle userHandle) {
         ComponentName componentName = new ComponentName(context, HealthConnectDailyService.class);
         final PersistableBundle extras = new PersistableBundle();
-        extras.putInt(EXTRA_USER_ID, userId);
+        extras.putInt(EXTRA_USER_ID, userHandle.getIdentifier());
         extras.putString(EXTRA_JOB_NAME_KEY, MIGRATION_COMPLETE_JOB_NAME);
         JobInfo.Builder builder =
-                new JobInfo.Builder(MIN_JOB_ID + userId, componentName)
-                        .setPeriodic(deviceConfigManager.getMigrationCompletionJobRunInterval())
+                new JobInfo.Builder(MIN_JOB_ID + userHandle.getIdentifier(), componentName)
+                        .setPeriodic(
+                                MigrationConstants.MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS
+                                        .toMillis())
                         .setExtras(extras);
 
         HealthConnectDailyService.schedule(
                 Objects.requireNonNull(context.getSystemService(JobScheduler.class))
                         .forNamespace(MIGRATION_STATE_CHANGE_NAMESPACE),
-                userId,
+                userHandle,
                 builder.build());
     }
 
     /** Schedules a job to pause migration. */
-    public static void scheduleMigrationPauseJob(
-            HealthConnectDeviceConfigManager deviceConfigManager, Context context, int userId) {
-        if (!deviceConfigManager.isPauseStateChangeJobEnabled()) {
-            return;
-        }
+    public static void scheduleMigrationPauseJob(Context context, UserHandle userHandle) {
         ComponentName componentName = new ComponentName(context, HealthConnectDailyService.class);
         final PersistableBundle extras = new PersistableBundle();
-        extras.putInt(EXTRA_USER_ID, userId);
+        extras.putInt(EXTRA_USER_ID, userHandle.getIdentifier());
         extras.putString(EXTRA_JOB_NAME_KEY, MIGRATION_PAUSE_JOB_NAME);
         JobInfo.Builder builder =
-                new JobInfo.Builder(MIN_JOB_ID + userId, componentName)
-                        .setPeriodic(deviceConfigManager.getMigrationPauseJobRunInterval())
+                new JobInfo.Builder(MIN_JOB_ID + userHandle.getIdentifier(), componentName)
+                        .setPeriodic(
+                                MigrationConstants.MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS
+                                        .toMillis())
                         .setExtras(extras);
         HealthConnectDailyService.schedule(
                 Objects.requireNonNull(context.getSystemService(JobScheduler.class))
                         .forNamespace(MIGRATION_STATE_CHANGE_NAMESPACE),
-                userId,
+                userHandle,
                 builder.build());
     }
 
@@ -98,11 +94,7 @@
     public static void executeMigrationCompletionJob(
             Context context,
             PreferenceHelper preferenceHelper,
-            HealthConnectDeviceConfigManager deviceConfigManager,
             MigrationStateManager migrationStateManager) {
-        if (!deviceConfigManager.isCompleteStateChangeJobEnabled()) {
-            return;
-        }
         if (migrationStateManager.getMigrationState() == MIGRATION_STATE_COMPLETE) {
             return;
         }
@@ -119,11 +111,9 @@
                 Instant.parse(currentStateStartTime)
                         .plusMillis(
                                 migrationStateManager.getMigrationState() == MIGRATION_STATE_IDLE
-                                        ? deviceConfigManager.getIdleStateTimeoutPeriod().toMillis()
-                                        : deviceConfigManager
-                                                .getNonIdleStateTimeoutPeriod()
-                                                .toMillis())
-                        .minusMillis(deviceConfigManager.getExecutionTimeBuffer());
+                                        ? MigrationConstants.IDLE_STATE_TIMEOUT_DAYS.toMillis()
+                                        : MigrationConstants.NON_IDLE_STATE_TIMEOUT_DAYS.toMillis())
+                        .minusMillis(MigrationConstants.EXECUTION_TIME_BUFFER_MINUTES.toMillis());
 
         if (migrationStateManager.getMigrationState() == MIGRATION_STATE_ALLOWED
                 || migrationStateManager.getMigrationState() == MIGRATION_STATE_IN_PROGRESS) {
@@ -131,7 +121,9 @@
             if (!Objects.isNull(allowedStateTimeout)) {
                 Instant parsedAllowedStateTimeout =
                         Instant.parse(allowedStateTimeout)
-                                .minusMillis(deviceConfigManager.getExecutionTimeBuffer());
+                                .minusMillis(
+                                        MigrationConstants.EXECUTION_TIME_BUFFER_MINUTES
+                                                .toMillis());
                 executionTime =
                         executionTime.isAfter(parsedAllowedStateTimeout)
                                 ? parsedAllowedStateTimeout
@@ -149,11 +141,7 @@
     public static void executeMigrationPauseJob(
             Context context,
             PreferenceHelper preferenceHelper,
-            HealthConnectDeviceConfigManager deviceConfigManager,
             MigrationStateManager migrationStateManager) {
-        if (!deviceConfigManager.isPauseStateChangeJobEnabled()) {
-            return;
-        }
         if (migrationStateManager.getMigrationState() != MIGRATION_STATE_IN_PROGRESS) {
             return;
         }
@@ -167,9 +155,8 @@
 
         Instant executionTime =
                 Instant.parse(currentStateStartTime)
-                        .plusMillis(
-                                deviceConfigManager.getInProgressStateTimeoutPeriod().toMillis())
-                        .minusMillis(deviceConfigManager.getExecutionTimeBuffer());
+                        .plusMillis(MigrationConstants.IN_PROGRESS_STATE_TIMEOUT_HOURS.toMillis())
+                        .minusMillis(MigrationConstants.EXECUTION_TIME_BUFFER_MINUTES.toMillis());
 
         if (Instant.now().isAfter(executionTime)) {
             // If we move to ALLOWED from IN_PROGRESS, then we have reached the IN_PROGRESS_TIMEOUT
diff --git a/service/java/com/android/server/healthconnect/migration/MigrationStateManager.java b/service/java/com/android/server/healthconnect/migration/MigrationStateManager.java
index 934e234..a2ed679 100644
--- a/service/java/com/android/server/healthconnect/migration/MigrationStateManager.java
+++ b/service/java/com/android/server/healthconnect/migration/MigrationStateManager.java
@@ -39,7 +39,6 @@
 import static com.android.server.healthconnect.migration.MigrationUtils.filterIntent;
 import static com.android.server.healthconnect.migration.MigrationUtils.filterPermissions;
 
-import android.annotation.UserIdInt;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageInfo;
@@ -50,12 +49,11 @@
 import android.health.connect.HealthConnectDataState;
 import android.health.connect.HealthConnectManager;
 import android.os.Build;
+import android.os.UserHandle;
 import android.os.ext.SdkExtensions;
 import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.HealthConnectThreadScheduler;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 
@@ -78,76 +76,31 @@
  * @hide
  */
 public final class MigrationStateManager {
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    @GuardedBy("sInstanceLock")
-    private static MigrationStateManager sMigrationStateManager;
 
-    private static final Object sInstanceLock = new Object();
     private static final String TAG = "MigrationStateManager";
-    private final HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
     private final PreferenceHelper mPreferenceHelper;
 
     @GuardedBy("mLock")
     private final Set<StateChangedListener> mStateChangedListeners = new CopyOnWriteArraySet<>();
 
     private final Object mLock = new Object();
-    private volatile MigrationBroadcastScheduler mMigrationBroadcastScheduler;
-    private int mUserId;
+    private final MigrationBroadcastScheduler mMigrationBroadcastScheduler;
+    private UserHandle mUserHandle;
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private MigrationStateManager(
-            @UserIdInt int userId,
-            HealthConnectDeviceConfigManager healthConnectDeviceConfigManager,
-            PreferenceHelper preferenceHelper) {
-        mUserId = userId;
-        mHealthConnectDeviceConfigManager = healthConnectDeviceConfigManager;
+    public MigrationStateManager(
+            UserHandle userHandle,
+            PreferenceHelper preferenceHelper,
+            MigrationBroadcastScheduler migrationBroadcastScheduler) {
+        mUserHandle = userHandle;
         mPreferenceHelper = preferenceHelper;
-    }
-
-    /**
-     * Initialises {@link MigrationStateManager} with the provided arguments and returns the
-     * instance.
-     */
-    public static MigrationStateManager initializeInstance(
-            @UserIdInt int userId,
-            HealthConnectDeviceConfigManager healthConnectDeviceConfigManager,
-            PreferenceHelper preferenceHelper) {
-        synchronized (sInstanceLock) {
-            if (Objects.isNull(sMigrationStateManager)) {
-                sMigrationStateManager =
-                        new MigrationStateManager(
-                                userId, healthConnectDeviceConfigManager, preferenceHelper);
-            }
-
-            return sMigrationStateManager;
-        }
+        mMigrationBroadcastScheduler = migrationBroadcastScheduler;
     }
 
     /** Re-initialize this class instance with the new user */
-    public void onUserSwitching(Context context, @UserIdInt int userId) {
+    public void onUserSwitching(Context context, UserHandle userHandle) {
         synchronized (mLock) {
             MigrationStateChangeJob.cancelAllJobs(context);
-            mUserId = userId;
-        }
-    }
-
-    /** Returns initialised instance of this class. */
-    public static MigrationStateManager getInitialisedInstance() {
-        synchronized (sInstanceLock) {
-            Objects.requireNonNull(sMigrationStateManager);
-            return sMigrationStateManager;
-        }
-    }
-
-    /**
-     * Clears the initialized instance such that {@link #initializeInstance} will create a new
-     * instance, for use in tests.
-     */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    @VisibleForTesting
-    public static void resetInitializedInstanceForTest() {
-        synchronized (sInstanceLock) {
-            sMigrationStateManager = null;
+            mUserHandle = userHandle;
         }
     }
 
@@ -158,11 +111,6 @@
         }
     }
 
-    public void setMigrationBroadcastScheduler(
-            MigrationBroadcastScheduler migrationBroadcastScheduler) {
-        mMigrationBroadcastScheduler = migrationBroadcastScheduler;
-    }
-
     /**
      * Adds the min data migration sdk and updates the migration state to pending.
      *
@@ -252,28 +200,25 @@
             case MIGRATION_STATE_MODULE_UPGRADE_REQUIRED:
                 MigrationStateChangeJob.cancelAllJobs(context);
                 updateMigrationStatePreference(context, state, timeoutReached);
-                MigrationStateChangeJob.scheduleMigrationCompletionJob(
-                        mHealthConnectDeviceConfigManager, context, mUserId);
+                MigrationStateChangeJob.scheduleMigrationCompletionJob(context, mUserHandle);
                 return;
             case MIGRATION_STATE_IN_PROGRESS:
                 MigrationStateChangeJob.cancelAllJobs(context);
                 updateMigrationStatePreference(
                         context, MIGRATION_STATE_IN_PROGRESS, timeoutReached);
-                MigrationStateChangeJob.scheduleMigrationPauseJob(
-                        mHealthConnectDeviceConfigManager, context, mUserId);
+                MigrationStateChangeJob.scheduleMigrationPauseJob(context, mUserHandle);
                 updateMigrationStartsCount();
                 return;
             case MIGRATION_STATE_ALLOWED:
                 if (hasAllowedStateTimedOut()
                         || getStartMigrationCount()
-                                >= mHealthConnectDeviceConfigManager.getMaxStartMigrationCalls()) {
+                                >= MigrationConstants.MAX_START_MIGRATION_CALLS) {
                     updateMigrationState(context, MIGRATION_STATE_COMPLETE);
                     return;
                 }
                 MigrationStateChangeJob.cancelAllJobs(context);
                 updateMigrationStatePreference(context, MIGRATION_STATE_ALLOWED, timeoutReached);
-                MigrationStateChangeJob.scheduleMigrationCompletionJob(
-                        mHealthConnectDeviceConfigManager, context, mUserId);
+                MigrationStateChangeJob.scheduleMigrationCompletionJob(context, mUserHandle);
                 return;
             case MIGRATION_STATE_COMPLETE:
                 updateMigrationStatePreference(context, MIGRATION_STATE_COMPLETE, timeoutReached);
@@ -475,25 +420,19 @@
         }
         mPreferenceHelper.insertOrReplacePreferencesTransaction(preferences);
 
-        if (mMigrationBroadcastScheduler != null) {
-            //noinspection Convert2Lambda
-            HealthConnectThreadScheduler.scheduleInternalTask(
-                    new Runnable() {
-                        @Override
-                        public void run() {
-                            try {
-                                mMigrationBroadcastScheduler.scheduleNewJobs(context);
-                            } catch (Exception e) {
-                                Slog.e(TAG, "Migration broadcast schedule failed", e);
-                            }
+        //noinspection Convert2Lambda
+        HealthConnectThreadScheduler.scheduleInternalTask(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            mMigrationBroadcastScheduler.scheduleNewJobs(
+                                    context, MigrationStateManager.this);
+                        } catch (Exception e) {
+                            Slog.e(TAG, "Migration broadcast schedule failed", e);
                         }
-                    });
-        } else if (Constants.DEBUG) {
-            Slog.d(
-                    TAG,
-                    "Unable to schedule migration broadcasts: "
-                            + "MigrationBroadcastScheduler object is null");
-        }
+                    }
+                });
 
         for (StateChangedListener listener : mStateChangedListeners) {
             listener.onChanged(migrationState);
@@ -581,8 +520,7 @@
             case MIGRATION_STATE_ALLOWED:
                 if (!MigrationStateChangeJob.existsAStateChangeJob(
                         context, MIGRATION_COMPLETE_JOB_NAME)) {
-                    MigrationStateChangeJob.scheduleMigrationCompletionJob(
-                            mHealthConnectDeviceConfigManager, context, mUserId);
+                    MigrationStateChangeJob.scheduleMigrationCompletionJob(context, mUserHandle);
                 }
                 return;
             case MIGRATION_STATE_MODULE_UPGRADE_REQUIRED:
@@ -592,8 +530,7 @@
             case MIGRATION_STATE_IN_PROGRESS:
                 if (!MigrationStateChangeJob.existsAStateChangeJob(
                         context, MIGRATION_PAUSE_JOB_NAME)) {
-                    MigrationStateChangeJob.scheduleMigrationPauseJob(
-                            mHealthConnectDeviceConfigManager, context, mUserId);
+                    MigrationStateChangeJob.scheduleMigrationPauseJob(context, mUserHandle);
                 }
                 return;
 
@@ -617,8 +554,7 @@
             return;
         }
         if (!MigrationStateChangeJob.existsAStateChangeJob(context, MIGRATION_COMPLETE_JOB_NAME)) {
-            MigrationStateChangeJob.scheduleMigrationCompletionJob(
-                    mHealthConnectDeviceConfigManager, context, mUserId);
+            MigrationStateChangeJob.scheduleMigrationCompletionJob(context, mUserHandle);
         }
     }
 
@@ -629,10 +565,7 @@
                 mPreferenceHelper.getPreference(ALLOWED_STATE_START_TIME_KEY);
         if (allowedStateStartTime != null) {
             return Instant.parse(allowedStateStartTime)
-                    .plusMillis(
-                            mHealthConnectDeviceConfigManager
-                                    .getNonIdleStateTimeoutPeriod()
-                                    .toMillis())
+                    .plusMillis(MigrationConstants.NON_IDLE_STATE_TIMEOUT_DAYS.toMillis())
                     .toString();
         }
         return null;
diff --git a/service/java/com/android/server/healthconnect/migration/PriorityMigrationHelper.java b/service/java/com/android/server/healthconnect/migration/PriorityMigrationHelper.java
index 172148e..142f73f 100644
--- a/service/java/com/android/server/healthconnect/migration/PriorityMigrationHelper.java
+++ b/service/java/com/android/server/healthconnect/migration/PriorityMigrationHelper.java
@@ -60,19 +60,16 @@
 
     private static final Object sPriorityMigrationHelperLock = new Object();
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private static volatile PriorityMigrationHelper sPriorityMigrationHelper;
-
-    private final Object mPriorityMigrationHelperInstanceLock = new Object();
     @Nullable private Map<Integer, List<Long>> mPreMigrationPriorityCache;
 
     private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
     private final TransactionManager mTransactionManager;
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private PriorityMigrationHelper(
+    public PriorityMigrationHelper(
             HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
-            TransactionManager transactionManager) {
+            TransactionManager transactionManager,
+            DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
         mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
         mTransactionManager = transactionManager;
     }
@@ -81,27 +78,23 @@
      * Populate the pre-migration priority table by copying entries from priority table at the start
      * of migration.
      */
-    public void populatePreMigrationPriority() {
-        synchronized (mPriorityMigrationHelperInstanceLock) {
-            // Populating table only if it was not already populated.
-            if (mTransactionManager.getNumberOfEntriesInTheTable(PRE_MIGRATION_TABLE_NAME) == 0) {
-                populatePreMigrationTable();
-            }
+    public synchronized void populatePreMigrationPriority() {
+        // Populating table only if it was not already populated.
+        if (mTransactionManager.queryNumEntries(PRE_MIGRATION_TABLE_NAME) == 0) {
+            populatePreMigrationTable();
         }
     }
 
     /**
      * Returns priority order stored for data category in module at the time migration was started.
      */
-    public List<Long> getPreMigrationPriority(int dataCategory) {
-        synchronized (mPriorityMigrationHelperInstanceLock) {
-            if (mPreMigrationPriorityCache == null) {
-                mPreMigrationPriorityCache = createPreMigrationTable();
-            }
-
-            return Collections.unmodifiableList(
-                    mPreMigrationPriorityCache.getOrDefault(dataCategory, new ArrayList<>()));
+    public synchronized List<Long> getPreMigrationPriority(int dataCategory) {
+        if (mPreMigrationPriorityCache == null) {
+            mPreMigrationPriorityCache = createPreMigrationTable();
         }
+
+        return Collections.unmodifiableList(
+                mPreMigrationPriorityCache.getOrDefault(dataCategory, new ArrayList<>()));
     }
 
     /**
@@ -124,17 +117,8 @@
     }
 
     @Override
-    public void clearData(TransactionManager transactionManager) {
-        synchronized (mPriorityMigrationHelperInstanceLock) {
-            super.clearData(transactionManager);
-        }
-    }
-
-    @Override
-    protected void clearCache() {
-        synchronized (mPriorityMigrationHelperInstanceLock) {
-            mPreMigrationPriorityCache = null;
-        }
+    protected synchronized void clearCache() {
+        mPreMigrationPriorityCache = null;
     }
 
     /** Returns a requests for creating pre-migration priority table. */
@@ -205,37 +189,4 @@
 
         return contentValues;
     }
-
-    /** Creates(if it was not already created) and returns instance of PriorityMigrationHelper. */
-    public static PriorityMigrationHelper getInstance() {
-        return getInstance(
-                HealthDataCategoryPriorityHelper.getInstance(),
-                TransactionManager.getInitialisedInstance());
-    }
-
-    /** Creates(if it was not already created) and returns instance of PriorityMigrationHelper. */
-    public static PriorityMigrationHelper getInstance(
-            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
-            TransactionManager transactionManager) {
-        if (sPriorityMigrationHelper == null) {
-            synchronized (sPriorityMigrationHelperLock) {
-                if (sPriorityMigrationHelper == null) {
-                    sPriorityMigrationHelper =
-                            new PriorityMigrationHelper(
-                                    healthDataCategoryPriorityHelper, transactionManager);
-                }
-            }
-        }
-
-        return sPriorityMigrationHelper;
-    }
-
-    /** Used in testing to clear the instance to clear and re-reference the mocks. */
-    @VisibleForTesting
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    static void clearInstanceForTest() {
-        synchronized (sPriorityMigrationHelperLock) {
-            sPriorityMigrationHelper = null;
-        }
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/migration/notification/HealthConnectResourcesContext.java b/service/java/com/android/server/healthconnect/migration/notification/HealthConnectResourcesContext.java
index 690db4b..5fbd20b 100644
--- a/service/java/com/android/server/healthconnect/migration/notification/HealthConnectResourcesContext.java
+++ b/service/java/com/android/server/healthconnect/migration/notification/HealthConnectResourcesContext.java
@@ -78,18 +78,18 @@
         mResourcesApkAction = requireNonNull(resourcesApkAction);
         mResourcesApkPath = resourcesApkPath;
         mFlags = flags;
-
-        initialisePackageNames();
     }
 
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     private void initialisePackageNames() {
         ResolveInfo info = resolvePackageInfo();
 
         if (info != null) {
             mResourcesApkPkgName = info.activityInfo.applicationInfo.packageName;
             int iconResource = info.activityInfo.getIconResource();
-            mResourceLoadPackageName = getResources().getResourcePackageName(iconResource);
+            Resources resources = getResources();
+            if (resources != null) {
+                mResourceLoadPackageName = resources.getResourcePackageName(iconResource);
+            }
         }
     }
 
diff --git a/service/java/com/android/server/healthconnect/migration/notification/MigrationNotificationFactory.java b/service/java/com/android/server/healthconnect/migration/notification/MigrationNotificationFactory.java
index 1861e55..7826597 100644
--- a/service/java/com/android/server/healthconnect/migration/notification/MigrationNotificationFactory.java
+++ b/service/java/com/android/server/healthconnect/migration/notification/MigrationNotificationFactory.java
@@ -16,15 +16,8 @@
 
 package com.android.server.healthconnect.migration.notification;
 
-import static com.android.server.healthconnect.migration.MigrationConstants.HC_PACKAGE_NAME_CONFIG_NAME;
-import static com.android.server.healthconnect.migration.notification.MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_APP_UPDATE_NEEDED;
-import static com.android.server.healthconnect.migration.notification.MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_CANCELLED;
-import static com.android.server.healthconnect.migration.notification.MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_COMPLETE;
-import static com.android.server.healthconnect.migration.notification.MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_IN_PROGRESS;
 import static com.android.server.healthconnect.migration.notification.MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_MODULE_UPDATE_NEEDED;
-import static com.android.server.healthconnect.migration.notification.MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_MORE_SPACE_NEEDED;
 import static com.android.server.healthconnect.migration.notification.MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_PAUSED;
-import static com.android.server.healthconnect.migration.notification.MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_RESUME;
 
 import android.annotation.Nullable;
 import android.app.Notification;
@@ -49,54 +42,19 @@
     private Icon mAppIcon;
 
     // String names used to fetch resources
-    private static final String MIGRATION_IN_PROGRESS_NOTIFICATION_TITLE =
-            "migration_in_progress_notification_title";
-    private static final String MIGRATION_APP_UPDATE_NEEDED_NOTIFICATION_TITLE =
-            "migration_app_update_needed_notification_title";
     private static final String MIGRATION_MODULE_UPDATE_NEEDED_NOTIFICATION_TITLE =
             "migration_module_update_needed_notification_title";
     private static final String MIGRATION_UPDATE_NEEDED_NOTIFICATION_CONTENT =
             "migration_update_needed_notification_content";
-    private static final String MIGRATION_UPDATE_NEEDED_NOTIFICATION_ACTION =
-            "migration_update_needed_notification_action";
-    private static final String MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_TITLE =
-            "migration_more_space_needed_notification_title";
-    private static final String MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_CONTENT =
-            "migration_more_space_needed_notification_content";
-    private static final String MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_TRY_AGAIN_ACTION =
-            "try_again_button";
-    private static final String MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_FREE_UP_SPACE_ACTION =
-            "free_up_space_button";
 
     private static final String MIGRATION_PAUSED_NOTIFICATION_TITLE =
             "migration_paused_notification_title";
     private static final String MIGRATION_PAUSED_NOTIFICATION_CONTENT =
             "migration_paused_notification_content";
-    private static final String MIGRATION_PAUSED_NOTIFICATION_ACTION = "resume_button";
 
-    private static final String RESUME_MIGRATION_NOTIFICATION_TITLE =
-            "resume_migration_notification_title";
-    private static final String RESUME_MIGRATION_NOTIFICATION_CONTENT =
-            "resume_migration_notification_content";
-    private static final String RESUME_MIGRATION_NOTIFICATION_ACTION =
-            "resume_migration_banner_button";
-
-    private static final String MIGRATION_NOT_COMPLETE_NOTIFICATION_TITLE =
-            "migration_not_complete_notification_title";
-    private static final String MIGRATION_NOT_COMPLETE_NOTIFICATION_ACTION =
-            "migration_not_complete_notification_action";
-    private static final String MIGRATION_COMPLETE_NOTIFICATION_TITLE =
-            "migration_complete_notification_title";
-    private static final String MIGRATION_COMPLETE_NOTIFICATION_ACTION =
-            "migration_complete_notification_action";
-
-    private static final String HEALTH_HOME_ACTION =
-            "android.health.connect.action.HEALTH_HOME_SETTINGS";
     private static final String SHOW_MIGRATION_INFO_ACTION =
             "android.health.connect.action.SHOW_MIGRATION_INFO";
     private static final String SYSTEM_UPDATE_ACTION = "android.settings.SYSTEM_UPDATE_SETTINGS";
-    private static final String SYSTEM_STORAGE_ACTION =
-            "android.settings.INTERNAL_STORAGE_SETTINGS";
     private static final String SYSTEM_SETTINGS_FALLBACK_ACTION = "android.settings.SETTINGS";
     private static final Intent FALLBACK_INTENT = new Intent(SYSTEM_SETTINGS_FALLBACK_ACTION);
 
@@ -119,30 +77,12 @@
         Notification notification;
 
         switch (notificationType) {
-            case NOTIFICATION_TYPE_MIGRATION_IN_PROGRESS:
-                notification = getMigrationInProgressNotification(channelId);
-                break;
-            case NOTIFICATION_TYPE_MIGRATION_COMPLETE:
-                notification = getMigrationCompleteNotification(channelId);
-                break;
-            case NOTIFICATION_TYPE_MIGRATION_APP_UPDATE_NEEDED:
-                notification = getAppUpdateNeededNotification(channelId);
-                break;
             case NOTIFICATION_TYPE_MIGRATION_MODULE_UPDATE_NEEDED:
                 notification = getModuleUpdateNeededNotification(channelId);
                 break;
-            case NOTIFICATION_TYPE_MIGRATION_MORE_SPACE_NEEDED:
-                notification = getMoreSpaceNeededNotification(channelId);
-                break;
             case NOTIFICATION_TYPE_MIGRATION_PAUSED:
                 notification = getMigrationPausedNotification(channelId);
                 break;
-            case NOTIFICATION_TYPE_MIGRATION_RESUME:
-                notification = getResumeMigrationNotification(channelId);
-                break;
-            case NOTIFICATION_TYPE_MIGRATION_CANCELLED:
-                notification = getMigrationCancelledNotification(channelId);
-                break;
             default:
                 throw new IllegalMigrationNotificationStateException(
                         "Notification type not supported");
@@ -157,28 +97,6 @@
         return mResContext.getStringByName(name);
     }
 
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    private String getStringResourceWithArgs(String name, Object... formatArgs) {
-        return mResContext.getStringByNameWithArgs(name, formatArgs);
-    }
-
-    private Notification getMigrationInProgressNotification(String channelId) {
-        PendingIntent pendingIntent = getHealthHomeSettingsPendingIntent();
-        String notificationTitle = getStringResource(MIGRATION_IN_PROGRESS_NOTIFICATION_TITLE);
-
-        Notification notification =
-                new Notification.Builder(mContext, channelId)
-                        .setSmallIcon(getAppIcon())
-                        .setContentTitle(notificationTitle)
-                        .setContentIntent(pendingIntent)
-                        .setProgress(0, 0, true)
-                        .setOngoing(true)
-                        .build();
-
-        notification.flags = Notification.FLAG_NO_CLEAR;
-        return notification;
-    }
-
     private Notification getModuleUpdateNeededNotification(String channelId) {
         PendingIntent pendingIntent = getSystemUpdatePendingIntent();
 
@@ -199,118 +117,6 @@
         return notification;
     }
 
-    private Notification getAppUpdateNeededNotification(String channelId) {
-        PendingIntent pendingIntent = getAppStorePendingIntent();
-
-        String notificationTitle =
-                getStringResource(MIGRATION_APP_UPDATE_NEEDED_NOTIFICATION_TITLE);
-        String notificationContent =
-                getStringResource(MIGRATION_UPDATE_NEEDED_NOTIFICATION_CONTENT);
-
-        Notification notification =
-                new Notification.Builder(mContext, channelId)
-                        .setSmallIcon(getAppIcon())
-                        .setContentTitle(notificationTitle)
-                        .setContentText(notificationContent)
-                        .setContentIntent(pendingIntent)
-                        .setAutoCancel(true)
-                        .build();
-
-        return notification;
-    }
-
-    private Notification getMoreSpaceNeededNotification(String channelId) {
-        PendingIntent pendingIntent = getSystemStoragePendingIntent();
-
-        String notificationTitle =
-                getStringResource(MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_TITLE);
-        // TODO (b/271440427) replace with space needed
-        String notificationContent =
-                getStringResourceWithArgs(
-                        MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_CONTENT, "500MB");
-
-        String notificationTryAgainAction =
-                getStringResource(MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_TRY_AGAIN_ACTION);
-        String notificationFreeUpSpaceAction =
-                getStringResource(MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_FREE_UP_SPACE_ACTION);
-
-        Notification.Action tryAgainAction =
-                new Notification.Action.Builder(
-                                getAppIcon(), notificationTryAgainAction, pendingIntent)
-                        .build();
-
-        Notification.Action freeUpSpaceAction =
-                new Notification.Action.Builder(
-                                getAppIcon(), notificationFreeUpSpaceAction, pendingIntent)
-                        .build();
-
-        Notification notification =
-                new Notification.Builder(mContext, channelId)
-                        .setSmallIcon(getAppIcon())
-                        .setContentTitle(notificationTitle)
-                        .setContentText(notificationContent)
-                        .setContentIntent(pendingIntent)
-                        .setActions(tryAgainAction, freeUpSpaceAction)
-                        .setOngoing(true)
-                        .build();
-
-        notification.flags = Notification.FLAG_NO_CLEAR;
-        return notification;
-    }
-
-    private Notification getResumeMigrationNotification(String channelId) {
-        PendingIntent pendingIntent = getHealthHomeSettingsPendingIntent();
-
-        String notificationTitle = getStringResource(RESUME_MIGRATION_NOTIFICATION_TITLE);
-        // TODO (b/275685600) replace with timeout
-        String notificationContent =
-                getStringResourceWithArgs(RESUME_MIGRATION_NOTIFICATION_CONTENT, "1 day");
-
-        Notification notification =
-                new Notification.Builder(mContext, channelId)
-                        .setSmallIcon(getAppIcon())
-                        .setContentTitle(notificationTitle)
-                        .setContentText(notificationContent)
-                        .setOngoing(true)
-                        .build();
-
-        notification.flags = Notification.FLAG_NO_CLEAR;
-        return notification;
-    }
-
-    private Notification getMigrationCancelledNotification(String channelId) {
-        PendingIntent pendingIntent = getHealthHomeSettingsPendingIntent();
-
-        String notificationTitle = getStringResource(MIGRATION_NOT_COMPLETE_NOTIFICATION_TITLE);
-
-        Notification notification =
-                new Notification.Builder(mContext, channelId)
-                        .setSmallIcon(getAppIcon())
-                        .setContentTitle(notificationTitle)
-                        .setContentIntent(pendingIntent)
-                        .setOngoing(true)
-                        .build();
-
-        notification.flags = Notification.FLAG_NO_CLEAR;
-        return notification;
-    }
-
-    private Notification getMigrationCompleteNotification(String channelId) {
-        PendingIntent pendingIntent = getHealthHomeSettingsPendingIntent();
-        String notificationTitle = getStringResource(MIGRATION_COMPLETE_NOTIFICATION_TITLE);
-
-        Notification notification =
-                new Notification.Builder(mContext, channelId)
-                        .setSmallIcon(getAppIcon())
-                        .setContentTitle(notificationTitle)
-                        .setContentIntent(pendingIntent)
-                        .setOngoing(true)
-                        .build();
-
-        notification.flags = Notification.FLAG_NO_CLEAR;
-        return notification;
-    }
-
     private Notification getMigrationPausedNotification(String channelId) {
         PendingIntent pendingIntent = getMigrationInfoPendingIntent();
         String notificationTitle = getStringResource(MIGRATION_PAUSED_NOTIFICATION_TITLE);
@@ -350,16 +156,6 @@
     }
 
     @Nullable
-    private PendingIntent getHealthHomeSettingsPendingIntent() {
-        Intent intent = new Intent(HEALTH_HOME_ACTION);
-        ResolveInfo result = mContext.getPackageManager().resolveActivity(intent, 0);
-        if (result == null) {
-            return getPendingIntent(FALLBACK_INTENT);
-        }
-        return getPendingIntent(intent);
-    }
-
-    @Nullable
     private PendingIntent getSystemUpdatePendingIntent() {
         Intent intent = new Intent(SYSTEM_UPDATE_ACTION);
         ResolveInfo result = mContext.getPackageManager().resolveActivity(intent, 0);
@@ -370,27 +166,6 @@
     }
 
     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    @Nullable
-    private PendingIntent getAppStorePendingIntent() {
-        String dataMigratorPackageName =
-                mContext.getString(
-                        mContext.getResources()
-                                .getIdentifier(HC_PACKAGE_NAME_CONFIG_NAME, null, null));
-        Intent intent = IntentsUtil.createAppStoreIntent(mContext, dataMigratorPackageName);
-        return getPendingIntent(intent);
-    }
-
-    @Nullable
-    private PendingIntent getSystemStoragePendingIntent() {
-        Intent intent = new Intent(SYSTEM_STORAGE_ACTION);
-        ResolveInfo result = mContext.getPackageManager().resolveActivity(intent, 0);
-        if (result == null) {
-            return getPendingIntent(FALLBACK_INTENT);
-        }
-        return getPendingIntent(intent);
-    }
-
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     @VisibleForTesting
     @Nullable
     Icon getAppIcon() {
@@ -410,26 +185,13 @@
 
     @VisibleForTesting
     public static String[] getNotificationStringResources() {
+        // Resources referenced here must be explicitly kept in apk/res/raw/keep.xml to avoid
+        // removal during shrinking
         return new String[] {
-            MIGRATION_IN_PROGRESS_NOTIFICATION_TITLE,
-            MIGRATION_APP_UPDATE_NEEDED_NOTIFICATION_TITLE,
             MIGRATION_MODULE_UPDATE_NEEDED_NOTIFICATION_TITLE,
             MIGRATION_UPDATE_NEEDED_NOTIFICATION_CONTENT,
-            MIGRATION_UPDATE_NEEDED_NOTIFICATION_ACTION,
-            MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_TITLE,
-            MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_CONTENT,
-            MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_TRY_AGAIN_ACTION,
-            MIGRATION_MORE_SPACE_NEEDED_NOTIFICATION_FREE_UP_SPACE_ACTION,
             MIGRATION_PAUSED_NOTIFICATION_TITLE,
             MIGRATION_PAUSED_NOTIFICATION_CONTENT,
-            MIGRATION_PAUSED_NOTIFICATION_ACTION,
-            RESUME_MIGRATION_NOTIFICATION_TITLE,
-            RESUME_MIGRATION_NOTIFICATION_CONTENT,
-            RESUME_MIGRATION_NOTIFICATION_ACTION,
-            MIGRATION_NOT_COMPLETE_NOTIFICATION_TITLE,
-            MIGRATION_NOT_COMPLETE_NOTIFICATION_ACTION,
-            MIGRATION_COMPLETE_NOTIFICATION_TITLE,
-            MIGRATION_COMPLETE_NOTIFICATION_ACTION
         };
     }
 }
diff --git a/service/java/com/android/server/healthconnect/migration/notification/MigrationNotificationSender.java b/service/java/com/android/server/healthconnect/migration/notification/MigrationNotificationSender.java
index 37c631c..65bdaa9 100644
--- a/service/java/com/android/server/healthconnect/migration/notification/MigrationNotificationSender.java
+++ b/service/java/com/android/server/healthconnect/migration/notification/MigrationNotificationSender.java
@@ -27,8 +27,6 @@
 import android.os.UserHandle;
 import android.util.Log;
 
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -54,21 +52,15 @@
 
     private final Context mContext;
     private final MigrationNotificationFactory mNotificationFactory;
-    private final HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
 
-    public MigrationNotificationSender(
-            Context context, HealthConnectDeviceConfigManager healthConnectDeviceConfigManager) {
+    public MigrationNotificationSender(Context context) {
         mContext = context;
         mNotificationFactory = new MigrationNotificationFactory(mContext);
-        mHealthConnectDeviceConfigManager = healthConnectDeviceConfigManager;
     }
 
     /** Sends a notification to the current user based on the notification type. */
     public void sendNotification(
             @MigrationNotificationType int notificationType, UserHandle userHandle) {
-        if (!mHealthConnectDeviceConfigManager.areMigrationNotificationsEnabled()) {
-            return;
-        }
         createNotificationChannel(userHandle);
         try {
             Notification notification =
@@ -157,27 +149,15 @@
     }
 
     /** Constants used to identify migration notification types. */
-    public static final int NOTIFICATION_TYPE_MIGRATION_IN_PROGRESS = 0;
-
-    public static final int NOTIFICATION_TYPE_MIGRATION_COMPLETE = 1;
-    public static final int NOTIFICATION_TYPE_MIGRATION_APP_UPDATE_NEEDED = 2;
     public static final int NOTIFICATION_TYPE_MIGRATION_MODULE_UPDATE_NEEDED = 3;
-    public static final int NOTIFICATION_TYPE_MIGRATION_MORE_SPACE_NEEDED = 4;
+
     public static final int NOTIFICATION_TYPE_MIGRATION_PAUSED = 5;
-    public static final int NOTIFICATION_TYPE_MIGRATION_RESUME = 6;
-    public static final int NOTIFICATION_TYPE_MIGRATION_CANCELLED = 7;
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({
-        NOTIFICATION_TYPE_MIGRATION_IN_PROGRESS,
-        NOTIFICATION_TYPE_MIGRATION_COMPLETE,
-        NOTIFICATION_TYPE_MIGRATION_APP_UPDATE_NEEDED,
         NOTIFICATION_TYPE_MIGRATION_MODULE_UPDATE_NEEDED,
-        NOTIFICATION_TYPE_MIGRATION_MORE_SPACE_NEEDED,
         NOTIFICATION_TYPE_MIGRATION_PAUSED,
-        NOTIFICATION_TYPE_MIGRATION_RESUME,
-        NOTIFICATION_TYPE_MIGRATION_CANCELLED,
     })
     public @interface MigrationNotificationType {}
 }
diff --git a/service/java/com/android/server/healthconnect/permission/DataPermissionEnforcer.java b/service/java/com/android/server/healthconnect/permission/DataPermissionEnforcer.java
index 2c263e8..6657074 100644
--- a/service/java/com/android/server/healthconnect/permission/DataPermissionEnforcer.java
+++ b/service/java/com/android/server/healthconnect/permission/DataPermissionEnforcer.java
@@ -17,23 +17,19 @@
 package com.android.server.healthconnect.permission;
 
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND;
 
 import static java.util.stream.Collectors.toSet;
 
 import android.content.AttributionSource;
 import android.content.Context;
-import android.health.connect.HealthPermissions;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
-import android.health.connect.internal.datatypes.utils.RecordTypePermissionCategoryMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.permission.PermissionManager;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 
 import java.util.Collections;
 import java.util.List;
@@ -48,17 +44,17 @@
 public class DataPermissionEnforcer {
     private final PermissionManager mPermissionManager;
     private final Context mContext;
-    private final HealthConnectDeviceConfigManager mDeviceConfigManager;
-    private final RecordMapper mRecordMapper;
+    private final HealthConnectMappings mHealthConnectMappings;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings;
 
     public DataPermissionEnforcer(
             PermissionManager permissionManager,
             Context context,
-            HealthConnectDeviceConfigManager deviceConfigManager) {
+            InternalHealthConnectMappings internalHealthConnectMappings) {
         mPermissionManager = permissionManager;
         mContext = context;
-        mDeviceConfigManager = deviceConfigManager;
-        mRecordMapper = RecordMapper.getInstance();
+        mHealthConnectMappings = internalHealthConnectMappings.getExternalMappings();
+        mInternalHealthConnectMappings = internalHealthConnectMappings;
     }
 
     /** Enforces default write permissions for given recordTypeIds */
@@ -72,9 +68,9 @@
             List<Integer> recordTypeIds, AttributionSource attributionSource) {
         for (Integer recordTypeId : recordTypeIds) {
             String permissionName =
-                    HealthPermissions.getHealthReadPermission(
-                            RecordTypePermissionCategoryMapper
-                                    .getHealthPermissionCategoryForRecordType(recordTypeId));
+                    mHealthConnectMappings.getHealthReadPermission(
+                            mHealthConnectMappings.getHealthPermissionCategoryForRecordType(
+                                    recordTypeId));
             enforceRecordPermission(
                     permissionName, attributionSource, recordTypeId, /* isReadPermission= */ true);
         }
@@ -134,7 +130,8 @@
 
         for (RecordInternal<?> recordInternal : recordInternals) {
             int recordTypeId = recordInternal.getRecordType();
-            RecordHelper<?> recordHelper = RecordHelperProvider.getRecordHelper(recordTypeId);
+            RecordHelper<?> recordHelper =
+                    mInternalHealthConnectMappings.getRecordHelper(recordTypeId);
 
             if (!recordTypeIdToExtraPerms.containsKey(recordTypeId)) {
                 recordTypeIdToExtraPerms.put(recordTypeId, new ArraySet<>());
@@ -174,19 +171,6 @@
     }
 
     /**
-     * Checks the Background Read feature flags, enforces {@link
-     * HealthPermissions#READ_HEALTH_DATA_IN_BACKGROUND} permission if the flag is enabled,
-     * otherwise throws {@link SecurityException}.
-     */
-    public void enforceBackgroundReadRestrictions(int uid, int pid, String errorMessage) {
-        if (mDeviceConfigManager.isBackgroundReadFeatureEnabled()) {
-            mContext.enforcePermission(READ_HEALTH_DATA_IN_BACKGROUND, pid, uid, errorMessage);
-        } else {
-            throw new SecurityException(errorMessage);
-        }
-    }
-
-    /**
      * Returns granted extra read permissions.
      *
      * <p>Used to not expose extra data if caller doesn't have corresponding permission.
@@ -194,19 +178,20 @@
     public Set<String> collectGrantedExtraReadPermissions(
             Set<Integer> recordTypeIds, AttributionSource attributionSource) {
         return recordTypeIds.stream()
-                .map(RecordHelperProvider::getRecordHelper)
+                .map(mInternalHealthConnectMappings::getRecordHelper)
                 .flatMap(recordHelper -> recordHelper.getExtraReadPermissions().stream())
                 .distinct()
                 .filter(permission -> isPermissionGranted(permission, attributionSource))
                 .collect(toSet());
     }
 
-    public Map<String, Boolean> collectExtraWritePermissionStateMapping(
+    public ArrayMap<String, Boolean> collectExtraWritePermissionStateMapping(
             List<RecordInternal<?>> recordInternals, AttributionSource attributionSource) {
-        Map<String, Boolean> mapping = new ArrayMap<>();
+        ArrayMap<String, Boolean> mapping = new ArrayMap<>();
         for (RecordInternal<?> recordInternal : recordInternals) {
             int recordTypeId = recordInternal.getRecordType();
-            RecordHelper<?> recordHelper = RecordHelperProvider.getRecordHelper(recordTypeId);
+            RecordHelper<?> recordHelper =
+                    mInternalHealthConnectMappings.getRecordHelper(recordTypeId);
 
             for (String permName : recordHelper.getExtraWritePermissions()) {
                 mapping.put(permName, isPermissionGranted(permName, attributionSource));
@@ -219,9 +204,9 @@
             List<Integer> recordTypeIds, AttributionSource attributionSource) {
         for (Integer recordTypeId : recordTypeIds) {
             String permissionName =
-                    HealthPermissions.getHealthWritePermission(
-                            RecordTypePermissionCategoryMapper
-                                    .getHealthPermissionCategoryForRecordType(recordTypeId));
+                    mHealthConnectMappings.getHealthWritePermission(
+                            mHealthConnectMappings.getHealthPermissionCategoryForRecordType(
+                                    recordTypeId));
             enforceRecordPermission(
                     permissionName, attributionSource, recordTypeId, /* isReadPermission= */ false);
         }
@@ -234,12 +219,12 @@
             boolean isReadPermission) {
         if (!isPermissionGranted(permissionName, attributionSource)) {
             String prohibitedAction =
-                    isReadPermission ? "to read to record type" : " to write to record type ";
+                    isReadPermission ? " to read to record type" : " to write to record type ";
             throw new SecurityException(
                     "Caller doesn't have "
                             + permissionName
                             + prohibitedAction
-                            + mRecordMapper
+                            + mHealthConnectMappings
                                     .getRecordIdToExternalRecordClassMap()
                                     .get(recordTypeId));
         }
diff --git a/service/java/com/android/server/healthconnect/permission/FirstGrantTimeManager.java b/service/java/com/android/server/healthconnect/permission/FirstGrantTimeManager.java
index 8ebe53a..76c0609 100644
--- a/service/java/com/android/server/healthconnect/permission/FirstGrantTimeManager.java
+++ b/service/java/com/android/server/healthconnect/permission/FirstGrantTimeManager.java
@@ -82,15 +82,16 @@
             PackageInfoUtils packageInfoUtils,
             HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
             MigrationStateManager migrationStateManager) {
+        mContext = context;
         mTracker = tracker;
         mDatastore = datastore;
-        mPackageManager = context.getPackageManager();
-        mUserManager = context.getSystemService(UserManager.class);
-        mUidToGrantTimeCache = new UidToGrantTimeCache();
-        mContext = context;
         mPackageInfoHelper = packageInfoUtils;
         mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
         mMigrationStateManager = migrationStateManager;
+
+        mUidToGrantTimeCache = new UidToGrantTimeCache();
+        mUserManager = context.getSystemService(UserManager.class);
+        mPackageManager = context.getPackageManager();
         mPackageManager.addOnPermissionsChangeListener(this);
     }
 
@@ -106,7 +107,7 @@
     public Optional<Instant> getFirstGrantTime(String packageName, UserHandle user)
             throws IllegalArgumentException {
 
-        Integer uid = mPackageInfoHelper.getPackageUid(packageName, user, getUserContext(user));
+        Integer uid = mPackageInfoHelper.getPackageUid(packageName, user, mContext);
         if (uid == null) {
             throw new IllegalArgumentException(
                     "Package name "
@@ -124,14 +125,13 @@
 
         // Check and update the state in case health permission has been granted before
         // onPermissionsChanged callback was propagated.
-        updateFirstGrantTimesFromPermissionState(uid, true);
+        updateFirstGrantTimesFromPermissionState(user, uid, true);
         return getGrantTimeReadLocked(uid);
     }
 
     /** Sets the provided first grant time for the given {@code packageName}. */
     public void setFirstGrantTime(String packageName, Instant time, UserHandle user) {
-        final Integer uid =
-                mPackageInfoHelper.getPackageUid(packageName, user, getUserContext(user));
+        final Integer uid = mPackageInfoHelper.getPackageUid(packageName, user, mContext);
         if (uid == null) {
             throw new IllegalArgumentException(
                     "Package name "
@@ -156,7 +156,7 @@
 
     @Override
     public void onPermissionsChanged(int uid) {
-        updateFirstGrantTimesFromPermissionState(uid, false);
+        updateFirstGrantTimesFromPermissionState(UserHandle.getUserHandleForUid(uid), uid, false);
     }
 
     /**
@@ -165,8 +165,8 @@
      * the same thread where this method is called if {@code sync} is set to {@code true}, another
      * background thread otherwise.
      */
-    private void updateFirstGrantTimesFromPermissionState(int uid, boolean sync) {
-        if (!mUserManager.isUserUnlocked()) {
+    private void updateFirstGrantTimesFromPermissionState(UserHandle user, int uid, boolean sync) {
+        if (!mUserManager.isUserUnlocked(user)) {
             // this method is called in onPermissionsChanged(uid) which is called as soon as the
             // system boots up, even before the user has unlock the device for the first time.
             // Side note: onPermissionsChanged() is also called on both primary user and work
@@ -174,14 +174,12 @@
             return;
         }
 
-        final String[] packageNames = mPackageManager.getPackagesForUid(uid);
+        final String[] packageNames = mPackageInfoHelper.getPackagesForUid(mContext, user, uid);
         if (packageNames == null) {
             Log.w(TAG, "onPermissionsChanged: no known packages for UID: " + uid);
             return;
         }
 
-        final UserHandle user = UserHandle.getUserHandleForUid(uid);
-
         if (!checkSupportPermissionsUsageIntent(packageNames, user)) {
             logIfInDebugMode("Cannot find health intent declaration in ", packageNames[0]);
             return;
@@ -218,8 +216,7 @@
         mGrantTimeLock.writeLock().lock();
         try {
             boolean anyHealthPermissionGranted =
-                    mPackageInfoHelper.hasGrantedHealthPermissions(
-                            packageNames, user, getUserContext(user));
+                    mPackageInfoHelper.hasGrantedHealthPermissions(packageNames, user, mContext);
 
             boolean grantTimeRecorded = getGrantTimeReadLocked(uid).isPresent();
             if (grantTimeRecorded != anyHealthPermissionGranted) {
@@ -249,9 +246,12 @@
                 // take care of merging permissions
                 if (!mMigrationStateManager.isMigrationInProgress()) {
                     HealthConnectThreadScheduler.scheduleInternalTask(
-                            () ->
-                                    mHealthDataCategoryPriorityHelper.updateHealthDataPriority(
-                                            packageNames, user, getUserContext(user)));
+                            () -> {
+                                for (String packageName : packageNames) {
+                                    mHealthDataCategoryPriorityHelper
+                                            .maybeRemoveAppFromPriorityList(packageName, user);
+                                }
+                            });
                 }
             }
         } finally {
@@ -294,8 +294,7 @@
 
     void onPackageRemoved(String packageName, int removedPackageUid, UserHandle userHandle) {
         String[] leftSharedUidPackages =
-                mPackageInfoHelper.getPackagesForUid(
-                        removedPackageUid, userHandle, getUserContext(userHandle));
+                mPackageInfoHelper.getPackagesForUid(mContext, userHandle, removedPackageUid);
         if (leftSharedUidPackages != null && leftSharedUidPackages.length > 0) {
             // There are installed packages left with given UID,
             // don't need to update grant time state.
@@ -356,7 +355,8 @@
         }
 
         Instant stagedTime = null;
-        for (String packageName : mPackageInfoHelper.getPackageNamesForUid(uid)) {
+        for (String packageName :
+                mPackageInfoHelper.getPackagesForUidNonNull(mContext, user, uid)) {
             stagedTime = backupState.getPackageGrantTimes().get(packageName);
             if (stagedTime != null) {
                 break;
@@ -377,7 +377,8 @@
         }
 
         mUidToGrantTimeCache.put(uid, stagedTime);
-        for (String packageName : mPackageInfoHelper.getPackageNamesForUid(uid)) {
+        for (String packageName :
+                mPackageInfoHelper.getPackagesForUidNonNull(mContext, user, uid)) {
             backupState.getPackageGrantTimes().remove(packageName);
         }
         mDatastore.writeForUser(backupState, user, DATA_TYPE_STAGED);
@@ -386,7 +387,7 @@
 
     /** Initialize first grant time state for given user. */
     private void initAndValidateUserStateIfNeedLocked(UserHandle user) {
-        if (!mUserManager.isUserUnlocked()) {
+        if (!mUserManager.isUserUnlocked(user)) {
             // only init first grant time state when device is unlocked, because before that, we
             // cannot access any files, which leads to `mUidToGrantTimeCache` being empty and never
             // get re-initialized.
@@ -408,8 +409,7 @@
             UserGrantTimeState restoredState = restoreCurrentUserStateLocked(user);
 
             List<PackageInfo> validHealthApps =
-                    mPackageInfoHelper.getPackagesHoldingHealthPermissions(
-                            user, getUserContext(user));
+                    mPackageInfoHelper.getPackagesHoldingHealthPermissions(user, mContext);
 
             logIfInDebugMode(
                     "Packages holding health perms of user " + user + " :", validHealthApps);
@@ -418,8 +418,7 @@
 
             // TODO(b/260691599): consider removing mapping when getUidForSharedUser is
             Map<String, Set<Integer>> sharedUserNamesToUid =
-                    mPackageInfoHelper.collectSharedUserNameToUidsMappingForUser(
-                            validHealthApps, user);
+                    collectSharedUserNameToUidsMappingForUser(validHealthApps);
 
             mUidToGrantTimeCache.populateFromUserGrantTimeState(
                     restoredState, sharedUserNamesToUid, user);
@@ -432,6 +431,20 @@
         }
     }
 
+    private static Map<String, Set<Integer>> collectSharedUserNameToUidsMappingForUser(
+            List<PackageInfo> packageInfos) {
+        Map<String, Set<Integer>> sharedUserNameToUids = new ArrayMap<>();
+        for (PackageInfo info : packageInfos) {
+            if (info.sharedUserId != null) {
+                if (sharedUserNameToUids.get(info.sharedUserId) == null) {
+                    sharedUserNameToUids.put(info.sharedUserId, new ArraySet<>());
+                }
+                sharedUserNameToUids.get(info.sharedUserId).add(info.applicationInfo.uid);
+            }
+        }
+        return sharedUserNameToUids;
+    }
+
     private boolean userStateIsInitializedReadLocked(UserHandle user) {
         mGrantTimeLock.readLock().lock();
         try {
@@ -642,15 +655,15 @@
                     continue;
                 }
 
-                String sharedUserName =
-                        mPackageInfoHelper.getSharedUserNameFromUid(uid, getUserContext(user));
+                String sharedUserName = mPackageInfoHelper.getSharedUserNameFromUid(uid, mContext);
                 if (sharedUserName != null) {
                     sharedUserToGrantTime.put(sharedUserName, time);
                 } else {
-                    mPackageInfoHelper
-                            .getPackageNameFromUid(uid)
-                            .ifPresent(
-                                    packageName -> packageNameToGrantTime.put(packageName, time));
+                    String[] packageNames =
+                            mPackageInfoHelper.getPackagesForUid(mContext, user, uid);
+                    if (packageNames != null && packageNames.length == 1) {
+                        packageNameToGrantTime.put(packageNames[0], time);
+                    }
                 }
             }
 
@@ -676,7 +689,8 @@
                     continue;
                 }
 
-                for (String packageName : mPackageInfoHelper.getPackageNamesForUid(uid)) {
+                for (String packageName :
+                        mPackageInfoHelper.getPackagesForUidNonNull(mContext, user, uid)) {
                     packageNameToGrantTime.put(packageName, time);
                 }
             }
@@ -712,8 +726,7 @@
                 String packageName = entry.getKey();
                 Instant time = entry.getValue();
 
-                Integer uid =
-                        mPackageInfoHelper.getPackageUid(packageName, user, getUserContext(user));
+                Integer uid = mPackageInfoHelper.getPackageUid(packageName, user, mContext);
                 if (uid != null) {
                     put(uid, time);
                 }
@@ -727,8 +740,4 @@
                     packageName);
         }
     }
-
-    private Context getUserContext(UserHandle userHandle) {
-        return mContext.createContextAsUser(userHandle, /*flags*/ 0);
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/permission/HealthConnectPermissionHelper.java b/service/java/com/android/server/healthconnect/permission/HealthConnectPermissionHelper.java
index 5e35003..2e6aaa6 100644
--- a/service/java/com/android/server/healthconnect/permission/HealthConnectPermissionHelper.java
+++ b/service/java/com/android/server/healthconnect/permission/HealthConnectPermissionHelper.java
@@ -27,20 +27,20 @@
 import android.content.pm.PackageManager;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.HealthPermissions;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.Binder;
 import android.os.UserHandle;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 
+import com.android.healthfitness.flags.Flags;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 
 import java.time.Instant;
 import java.time.Period;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 
@@ -51,6 +51,7 @@
  */
 public final class HealthConnectPermissionHelper {
     private static final Period GRANT_TIME_TO_START_ACCESS_DATE_PERIOD = Period.ofDays(30);
+    private static final String UNKNOWN_REASON = "Unknown Reason";
 
     private static final int MASK_PERMISSION_FLAGS =
             PackageManager.FLAG_PERMISSION_USER_SET
@@ -59,19 +60,17 @@
 
     private final Context mContext;
     private final PackageManager mPackageManager;
-    private final Set<String> mHealthPermissions;
     private final HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
     private final FirstGrantTimeManager mFirstGrantTimeManager;
     private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
     private final AppInfoHelper mAppInfoHelper;
+    private final HealthConnectMappings mHealthConnectMappings;
 
     /**
      * Constructs a {@link HealthConnectPermissionHelper}.
      *
      * @param context the service context.
      * @param packageManager a {@link PackageManager} instance.
-     * @param healthPermissions a {@link Set} of permissions that are recognized as
-     *     HealthConnect-defined permissions.
      * @param permissionIntentTracker a {@link
      *     com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker} instance
      *     that tracks apps allowed to request health permissions.
@@ -79,35 +78,18 @@
     public HealthConnectPermissionHelper(
             Context context,
             PackageManager packageManager,
-            Set<String> healthPermissions,
-            HealthPermissionIntentAppsTracker permissionIntentTracker,
-            FirstGrantTimeManager firstGrantTimeManager,
-            AppInfoHelper appInfoHelper) {
-        this(
-                context,
-                packageManager,
-                healthPermissions,
-                permissionIntentTracker,
-                firstGrantTimeManager,
-                HealthDataCategoryPriorityHelper.getInstance(),
-                appInfoHelper);
-    }
-
-    public HealthConnectPermissionHelper(
-            Context context,
-            PackageManager packageManager,
-            Set<String> healthPermissions,
             HealthPermissionIntentAppsTracker permissionIntentTracker,
             FirstGrantTimeManager firstGrantTimeManager,
             HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
-            AppInfoHelper appInfoHelper) {
+            AppInfoHelper appInfoHelper,
+            HealthConnectMappings healthConnectMappings) {
         mContext = context;
         mPackageManager = packageManager;
-        mHealthPermissions = healthPermissions;
         mPermissionIntentAppsTracker = permissionIntentTracker;
         mFirstGrantTimeManager = firstGrantTimeManager;
         mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
         mAppInfoHelper = appInfoHelper;
+        mHealthConnectMappings = healthConnectMappings;
     }
 
     /**
@@ -118,8 +100,6 @@
      * category.
      */
     public void grantHealthPermission(String packageName, String permissionName, UserHandle user) {
-        Objects.requireNonNull(packageName);
-        Objects.requireNonNull(permissionName);
         enforceManageHealthPermissions(/* message= */ "grantHealthPermission");
         enforceValidHealthPermission(permissionName);
         UserHandle checkedUser = UserHandle.of(handleIncomingUser(user.getIdentifier()));
@@ -134,9 +114,8 @@
                     MASK_PERMISSION_FLAGS,
                     PackageManager.FLAG_PERMISSION_USER_SET,
                     checkedUser);
-            mAppInfoHelper.getOrInsertAppInfoId(packageName, mContext);
-            addToPriorityListIfRequired(packageName, permissionName);
-
+            mAppInfoHelper.getOrInsertAppInfoId(packageName);
+            addToPriorityListIfRequired(packageName, permissionName, user);
         } finally {
             Binder.restoreCallingIdentity(token);
         }
@@ -145,8 +124,6 @@
     /** See {@link HealthConnectManager#revokeHealthPermission}. */
     public void revokeHealthPermission(
             String packageName, String permissionName, @Nullable String reason, UserHandle user) {
-        Objects.requireNonNull(packageName);
-        Objects.requireNonNull(permissionName);
         enforceManageHealthPermissions(/* message= */ "revokeHealthPermission");
         enforceValidHealthPermission(permissionName);
         UserHandle checkedUser = UserHandle.of(handleIncomingUser(user.getIdentifier()));
@@ -159,8 +136,7 @@
             int permissionFlags =
                     mPackageManager.getPermissionFlags(permissionName, packageName, checkedUser);
             if (!isAlreadyDenied) {
-                mPackageManager.revokeRuntimePermission(
-                        packageName, permissionName, checkedUser, reason);
+                revokeRuntimePermission(packageName, checkedUser, permissionName, reason);
             }
             if (isAlreadyDenied
                     && (permissionFlags & PackageManager.FLAG_PERMISSION_USER_SET) != 0) {
@@ -176,7 +152,7 @@
                     permissionFlags,
                     checkedUser);
 
-            removeFromPriorityListIfRequired(packageName, permissionName);
+            removeFromPriorityListIfRequired(packageName, permissionName, user);
 
         } finally {
             Binder.restoreCallingIdentity(token);
@@ -184,10 +160,8 @@
     }
 
     /** See {@link HealthConnectManager#revokeAllHealthPermissions}. */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     public void revokeAllHealthPermissions(
             String packageName, @Nullable String reason, UserHandle user) {
-        Objects.requireNonNull(packageName);
         enforceManageHealthPermissions(/* message= */ "revokeAllHealthPermissions");
         UserHandle checkedUser = UserHandle.of(handleIncomingUser(user.getIdentifier()));
         enforceValidPackage(packageName, checkedUser);
@@ -201,13 +175,12 @@
 
     /** See {@link HealthConnectManager#getGrantedHealthPermissions}. */
     public List<String> getGrantedHealthPermissions(String packageName, UserHandle user) {
-        Objects.requireNonNull(packageName);
         enforceManageHealthPermissions(/* message= */ "getGrantedHealthPermissions");
         UserHandle checkedUser = UserHandle.of(handleIncomingUser(user.getIdentifier()));
         enforceValidPackage(packageName, checkedUser);
         final long token = Binder.clearCallingIdentity();
         try {
-            return getGrantedHealthPermissionsUnchecked(packageName, checkedUser);
+            return PackageInfoUtils.getGrantedHealthPermissions(mContext, packageName, checkedUser);
         } finally {
             Binder.restoreCallingIdentity(token);
         }
@@ -216,10 +189,6 @@
     /** See {@link HealthConnectManager#getHealthPermissionsFlags(String, List)}. */
     public Map<String, Integer> getHealthPermissionsFlags(
             String packageName, UserHandle user, List<String> permissions) {
-        Objects.requireNonNull(packageName);
-        Objects.requireNonNull(user);
-        Objects.requireNonNull(permissions);
-
         enforceManageHealthPermissions(/* message= */ "getHealthPermissionsFlags");
         UserHandle checkedUser = UserHandle.of(handleIncomingUser(user.getIdentifier()));
         enforceValidPackage(packageName, checkedUser);
@@ -234,10 +203,6 @@
     /** See {@link HealthConnectManager#setHealthPermissionsUserFixedFlagValue(String, List)}. */
     public void setHealthPermissionsUserFixedFlagValue(
             String packageName, UserHandle user, List<String> permissions, boolean value) {
-        Objects.requireNonNull(packageName);
-        Objects.requireNonNull(user);
-        Objects.requireNonNull(permissions);
-
         enforceManageHealthPermissions(/* message= */ "setHealthPermissionsUserFixedFlagValue");
         UserHandle checkedUser = UserHandle.of(handleIncomingUser(user.getIdentifier()));
         enforceValidPackage(packageName, checkedUser);
@@ -264,7 +229,6 @@
      */
     public Optional<Instant> getHealthDataStartDateAccess(String packageName, UserHandle user)
             throws IllegalArgumentException {
-        Objects.requireNonNull(packageName);
         enforceManageHealthPermissions(/* message= */ "getHealthDataStartDateAccess");
         UserHandle checkedUser = UserHandle.of(handleIncomingUser(user.getIdentifier()));
         enforceValidPackage(packageName, checkedUser);
@@ -297,50 +261,26 @@
                         + HealthConnectManager.CATEGORY_HEALTH_PERMISSIONS);
     }
 
-    private void addToPriorityListIfRequired(String packageName, String permissionName) {
-        if (HealthPermissions.isWritePermission(permissionName)) {
+    private void addToPriorityListIfRequired(
+            String packageName, String permissionName, UserHandle user) {
+        if (mHealthConnectMappings.isWritePermission(permissionName)) {
             mHealthDataCategoryPriorityHelper.appendToPriorityList(
                     packageName,
-                    HealthPermissions.getHealthDataCategoryForWritePermission(permissionName),
-                    mContext,
-                    /* isInactiveApp= */ false);
+                    mHealthConnectMappings.getHealthDataCategoryForWritePermission(permissionName),
+                    user);
         }
     }
 
-    private void removeFromPriorityListIfRequired(String packageName, String permissionName) {
-        if (HealthPermissions.isWritePermission(permissionName)) {
+    private void removeFromPriorityListIfRequired(
+            String packageName, String permissionName, UserHandle user) {
+        if (mHealthConnectMappings.isWritePermission(permissionName)) {
             mHealthDataCategoryPriorityHelper.maybeRemoveAppFromPriorityList(
                     packageName,
-                    HealthPermissions.getHealthDataCategoryForWritePermission(permissionName),
-                    this,
-                    mContext.getUser());
+                    mHealthConnectMappings.getHealthDataCategoryForWritePermission(permissionName),
+                    user);
         }
     }
 
-    private List<String> getGrantedHealthPermissionsUnchecked(String packageName, UserHandle user) {
-        PackageInfo packageInfo =
-                getPackageInfoUnchecked(
-                        packageName,
-                        user,
-                        PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS));
-
-        if (packageInfo.requestedPermissions == null) {
-            return List.of();
-        }
-
-        List<String> grantedHealthPerms = new ArrayList<>(packageInfo.requestedPermissions.length);
-        for (int i = 0; i < packageInfo.requestedPermissions.length; i++) {
-            String currPerm = packageInfo.requestedPermissions[i];
-            if (mHealthPermissions.contains(currPerm)
-                    && ((packageInfo.requestedPermissionsFlags[i]
-                                    & PackageInfo.REQUESTED_PERMISSION_GRANTED)
-                            != 0)) {
-                grantedHealthPerms.add(currPerm);
-            }
-        }
-        return grantedHealthPerms;
-    }
-
     private Map<String, Integer> getHealthPermissionsFlagsUnchecked(
             String packageName, UserHandle user, List<String> permissions) {
         enforceValidHealthPermissions(packageName, user, permissions);
@@ -369,41 +309,36 @@
     }
 
     private void revokeAllHealthPermissionsUnchecked(
-            String packageName, UserHandle user, String reason) {
+            String packageName, UserHandle user, @Nullable String reason) {
         List<String> grantedHealthPermissions =
-                getGrantedHealthPermissionsUnchecked(packageName, user);
+                PackageInfoUtils.getGrantedHealthPermissions(mContext, packageName, user);
         for (String perm : grantedHealthPermissions) {
-            mPackageManager.revokeRuntimePermission(packageName, perm, user, reason);
+            revokeRuntimePermission(packageName, user, perm, reason);
             mPackageManager.updatePermissionFlags(
                     perm,
                     packageName,
                     MASK_PERMISSION_FLAGS,
                     PackageManager.FLAG_PERMISSION_USER_SET,
                     user);
-            removeFromPriorityListIfRequired(packageName, perm);
+            removeFromPriorityListIfRequired(packageName, perm, user);
         }
     }
 
+    private void revokeRuntimePermission(
+            String packageName, UserHandle user, String permission, @Nullable String reason) {
+        mPackageManager.revokeRuntimePermission(
+                packageName, permission, user, reason == null ? UNKNOWN_REASON : reason);
+    }
+
     private void enforceValidHealthPermission(String permissionName) {
-        if (!mHealthPermissions.contains(permissionName)) {
+        if (!HealthConnectManager.getHealthPermissions(mContext).contains(permissionName)) {
             throw new IllegalArgumentException("invalid health permission");
         }
     }
 
-    private PackageInfo getPackageInfoUnchecked(
-            String packageName, UserHandle user, PackageManager.PackageInfoFlags flags) {
-        try {
-            PackageManager packageManager =
-                    mContext.createContextAsUser(user, /* flags= */ 0).getPackageManager();
-
-            return packageManager.getPackageInfo(packageName, flags);
-        } catch (PackageManager.NameNotFoundException e) {
-            throw new IllegalArgumentException("invalid package", e);
-        }
-    }
-
     private void enforceValidPackage(String packageName, UserHandle user) {
-        getPackageInfoUnchecked(packageName, user, PackageManager.PackageInfoFlags.of(0));
+        PackageInfoUtils.getPackageInfoUnchecked(
+                packageName, user, PackageManager.PackageInfoFlags.of(0), mContext);
     }
 
     private void enforceManageHealthPermissions(String message) {
@@ -412,6 +347,12 @@
     }
 
     private void enforceSupportPermissionsUsageIntent(String packageName, UserHandle userHandle) {
+        // Wear apps are not currently required to support the permission intent.
+        if (Flags.replaceBodySensorPermissionEnabled()
+                && mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+            return;
+        }
+
         if (!mPermissionIntentAppsTracker.supportsPermissionUsageIntent(packageName, userHandle)) {
             throw new SecurityException(
                     "Package "
@@ -457,10 +398,11 @@
     private void enforceValidHealthPermissions(
             String packageName, UserHandle user, List<String> permissions) {
         PackageInfo packageInfo =
-                getPackageInfoUnchecked(
+                PackageInfoUtils.getPackageInfoUnchecked(
                         packageName,
                         user,
-                        PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS));
+                        PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS),
+                        mContext);
 
         Set<String> requestedPermissions = new ArraySet<>(packageInfo.requestedPermissions);
 
diff --git a/service/java/com/android/server/healthconnect/permission/HealthPermissionIntentAppsTracker.java b/service/java/com/android/server/healthconnect/permission/HealthPermissionIntentAppsTracker.java
index 40dcfac..ee4d65f 100644
--- a/service/java/com/android/server/healthconnect/permission/HealthPermissionIntentAppsTracker.java
+++ b/service/java/com/android/server/healthconnect/permission/HealthPermissionIntentAppsTracker.java
@@ -27,6 +27,7 @@
 import android.util.ArraySet;
 import android.util.Log;
 
+import com.android.healthfitness.flags.Flags;
 import com.android.internal.annotations.GuardedBy;
 
 import java.util.HashMap;
@@ -38,6 +39,9 @@
  * Tracks apps which support {@link android.content.Intent#ACTION_VIEW_PERMISSION_USAGE} with {@link
  * HealthConnectManager#CATEGORY_HEALTH_PERMISSIONS}.
  *
+ * <p>This class stores a mapping for all UserHandles on the device, since this can be called for
+ * the non-foreground users.
+ *
  * @hide
  */
 public class HealthPermissionIntentAppsTracker {
@@ -48,11 +52,23 @@
     private final Object mLock = new Object();
 
     @GuardedBy("mLock")
-    private Map<UserHandle, Set<String>> mUserToHealthPackageNamesMap;
+    private final Map<UserHandle, Set<String>> mUserToHealthPackageNamesMap;
 
     public HealthPermissionIntentAppsTracker(Context context) {
         mPackageManager = context.getPackageManager();
-        initPerUserMapping(context);
+        synchronized (mLock) {
+            mUserToHealthPackageNamesMap = new HashMap<>();
+        }
+        if (!Flags.permissionTrackerFixMappingInit()) {
+            initPerUserMapping(context);
+        }
+    }
+
+    /** Setup the for the new user. */
+    public void onUserUnlocked(UserHandle userHandle) {
+        if (Flags.permissionTrackerFixMappingInit()) {
+            initPackageSetForUser(userHandle);
+        }
     }
 
     /**
@@ -63,22 +79,52 @@
      * @param userHandle: the user to query
      */
     boolean supportsPermissionUsageIntent(String packageName, UserHandle userHandle) {
-        // Consider readWrite lock if this is performance bottleneck.
         synchronized (mLock) {
             if (!mUserToHealthPackageNamesMap.containsKey(userHandle)) {
-                Log.w(
-                        TAG,
-                        "Requested user handle: "
-                                + userHandle.toString()
-                                + " is not present in the state.");
+                if (Flags.permissionTrackerFixMappingInit()) {
+                    mUserToHealthPackageNamesMap.put(userHandle, new ArraySet<>());
+                } else {
+                    Log.w(
+                            TAG,
+                            "Requested user handle: "
+                                    + userHandle.toString()
+                                    + " is not present in the state.");
+                    return false;
+                }
+            }
+
+            if (mUserToHealthPackageNamesMap.get(userHandle).contains(packageName)) {
+                return true;
+            }
+            return updateAndGetSupportsPackageUsageIntent(packageName, userHandle);
+        }
+    }
+
+    /**
+     * Updates package state if needed, returns whether activity for {@link
+     * android.content.Intent#ACTION_VIEW_PERMISSION_USAGE} with {@link
+     * HealthConnectManager#CATEGORY_HEALTH_PERMISSIONS} support is currently disabled.
+     */
+    boolean updateAndGetSupportsPackageUsageIntent(String packageName, UserHandle userHandle) {
+        synchronized (mLock) {
+            if (!mUserToHealthPackageNamesMap.containsKey(userHandle)) {
+                mUserToHealthPackageNamesMap.put(userHandle, new ArraySet<>());
+            }
+
+            Intent permissionPackageUsageIntent = getHealthPermissionsUsageIntent();
+            permissionPackageUsageIntent.setPackage(packageName);
+            if (mPackageManager
+                    .queryIntentActivitiesAsUser(
+                            permissionPackageUsageIntent,
+                            PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_ALL),
+                            userHandle)
+                    .isEmpty()) {
+                mUserToHealthPackageNamesMap.get(userHandle).remove(packageName);
                 return false;
+            } else {
+                mUserToHealthPackageNamesMap.get(userHandle).add(packageName);
+                return true;
             }
-
-            if (!mUserToHealthPackageNamesMap.get(userHandle).contains(packageName)) {
-                updateStateAndGetIfIntentWasRemoved(packageName, userHandle);
-            }
-
-            return mUserToHealthPackageNamesMap.get(userHandle).contains(packageName);
         }
     }
 
@@ -123,9 +169,6 @@
     }
 
     private void initPerUserMapping(Context context) {
-        synchronized (mLock) {
-            mUserToHealthPackageNamesMap = new HashMap<>();
-        }
         List<UserHandle> userHandles =
                 context.getSystemService(UserManager.class)
                         .getUserHandles(/* excludeDying= */ true);
diff --git a/service/java/com/android/server/healthconnect/permission/PackageInfoUtils.java b/service/java/com/android/server/healthconnect/permission/PackageInfoUtils.java
index c78a8a8..c745b5a 100644
--- a/service/java/com/android/server/healthconnect/permission/PackageInfoUtils.java
+++ b/service/java/com/android/server/healthconnect/permission/PackageInfoUtils.java
@@ -18,22 +18,16 @@
 
 import static android.content.pm.PackageManager.GET_PERMISSIONS;
 
-import static java.util.Objects.requireNonNull;
-
 import android.annotation.Nullable;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.health.connect.HealthConnectManager;
 import android.os.UserHandle;
-import android.util.ArrayMap;
-import android.util.ArraySet;
 import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -44,43 +38,12 @@
 public final class PackageInfoUtils {
     private static final String TAG = "HCPackageInfoUtils";
 
-    @Nullable private static volatile PackageInfoUtils sPackageInfoUtils;
-
-    /**
-     * Store PackageManager for each user. Keys are users, values are PackageManagers which get from
-     * each user.
-     */
-    private final Map<UserHandle, PackageManager> mUsersPackageManager = new ArrayMap<>();
-
-    private PackageInfoUtils() {}
-
-    /** Returns singleton instance of PackageInfoUtils */
-    public static synchronized PackageInfoUtils getInstance() {
-        if (sPackageInfoUtils == null) {
-            sPackageInfoUtils = new PackageInfoUtils();
-        }
-
-        return requireNonNull(sPackageInfoUtils);
-    }
-
-    Map<String, Set<Integer>> collectSharedUserNameToUidsMappingForUser(
-            List<PackageInfo> packageInfos, UserHandle user) {
-        Map<String, Set<Integer>> sharedUserNameToUids = new ArrayMap<>();
-        for (PackageInfo info : packageInfos) {
-            if (info.sharedUserId != null) {
-                if (sharedUserNameToUids.get(info.sharedUserId) == null) {
-                    sharedUserNameToUids.put(info.sharedUserId, new ArraySet<>());
-                }
-                sharedUserNameToUids.get(info.sharedUserId).add(info.applicationInfo.uid);
-            }
-        }
-        return sharedUserNameToUids;
-    }
+    public PackageInfoUtils() {}
 
     public List<PackageInfo> getPackagesHoldingHealthPermissions(UserHandle user, Context context) {
         // TODO(b/260707328): replace with getPackagesHoldingPermissions
         List<PackageInfo> allInfos =
-                getPackageManagerAsUser(user, context)
+                getPackageManagerAsUser(context, user)
                         .getInstalledPackages(PackageManager.PackageInfoFlags.of(GET_PERMISSIONS));
         List<PackageInfo> healthAppsInfos = new ArrayList<>();
 
@@ -92,12 +55,25 @@
         return healthAppsInfos;
     }
 
-    @SuppressWarnings("NullAway")
-    // TODO(b/317029272): fix this suppression
+    public List<PackageInfo> getPackagesCompatibleWithHealthConnect(
+            Context context, UserHandle user) {
+        List<PackageInfo> allInfos =
+                getPackageManagerAsUser(context, user)
+                        .getInstalledPackages(PackageManager.PackageInfoFlags.of(GET_PERMISSIONS));
+        List<PackageInfo> healthAppsInfos = new ArrayList<>();
+
+        for (PackageInfo info : allInfos) {
+            if (hasRequestedHealthPermission(context, info)) {
+                healthAppsInfos.add(info);
+            }
+        }
+        return healthAppsInfos;
+    }
+
     boolean hasGrantedHealthPermissions(String[] packageNames, UserHandle user, Context context) {
         for (String packageName : packageNames) {
             PackageInfo info = getPackageInfoWithPermissionsAsUser(packageName, user, context);
-            if (anyRequestedHealthPermissionGranted(context, info)) {
+            if (info != null && anyRequestedHealthPermissionGranted(context, info)) {
                 return true;
             }
         }
@@ -105,8 +81,13 @@
     }
 
     @Nullable
-    String[] getPackagesForUid(int packageUid, UserHandle user, Context context) {
-        return getPackageManagerAsUser(user, context).getPackagesForUid(packageUid);
+    String[] getPackagesForUid(Context context, UserHandle user, int packageUid) {
+        return getPackageManagerAsUser(context, user).getPackagesForUid(packageUid);
+    }
+
+    String[] getPackagesForUidNonNull(Context context, UserHandle user, int packageUid) {
+        String[] packages = getPackagesForUid(context, user, packageUid);
+        return packages != null ? packages : new String[] {};
     }
 
     /**
@@ -116,16 +97,16 @@
      * @param packageInfo Package to check
      * @return If the given package is connected to Health Connect.
      */
-    public static boolean anyRequestedHealthPermissionGranted(
-            @Nullable Context context, @Nullable PackageInfo packageInfo) {
-        if (context == null || packageInfo == null || packageInfo.requestedPermissions == null) {
-            Log.w(TAG, "Can't extract requested permissions from the package info.");
+    private static boolean anyRequestedHealthPermissionGranted(
+            Context context, PackageInfo packageInfo) {
+        if (packageInfo.requestedPermissions == null) {
             return false;
         }
+        Set<String> healthPermissions = HealthConnectManager.getHealthPermissions(context);
 
         for (int i = 0; i < packageInfo.requestedPermissions.length; i++) {
             String currPerm = packageInfo.requestedPermissions[i];
-            if (HealthConnectManager.isHealthPermission(context, currPerm)
+            if (healthPermissions.contains(currPerm)
                     && ((packageInfo.requestedPermissionsFlags[i]
                                     & PackageInfo.REQUESTED_PERMISSION_GRANTED)
                             != 0)) {
@@ -139,7 +120,7 @@
     public PackageInfo getPackageInfoWithPermissionsAsUser(
             String packageName, UserHandle user, Context context) {
         try {
-            return getPackageManagerAsUser(user, context)
+            return getPackageManagerAsUser(context, user)
                     .getPackageInfo(
                             packageName, PackageManager.PackageInfoFlags.of(GET_PERMISSIONS));
         } catch (PackageManager.NameNotFoundException e) {
@@ -152,7 +133,7 @@
     @Nullable
     String getSharedUserNameFromUid(int uid, Context context) {
         UserHandle user = UserHandle.getUserHandleForUid(uid);
-        PackageManager packageManager = getPackageManagerAsUser(user, context);
+        PackageManager packageManager = getPackageManagerAsUser(context, user);
         String[] packages = packageManager.getPackagesForUid(uid);
         if (packages == null || packages.length == 0) {
             Log.e(TAG, "Can't get package names for UID: " + uid);
@@ -169,31 +150,12 @@
         }
     }
 
-    Optional<String> getPackageNameFromUid(int uid) {
-        String[] packages = getPackageNamesForUid(uid);
-        if (packages.length != 1) {
-            Log.w(TAG, "Can't get one package name for UID: " + uid);
-            return Optional.empty();
-        }
-        return Optional.of(packages[0]);
-    }
-
-    String[] getPackageNamesForUid(int uid) {
-        PackageManager packageManager =
-                mUsersPackageManager.get(UserHandle.getUserHandleForUid(uid));
-        if (packageManager == null) {
-            return new String[] {};
-        }
-        String[] packages = packageManager.getPackagesForUid(uid);
-        return packages != null ? packages : new String[] {};
-    }
-
     @Nullable
     Integer getPackageUid(String packageName, UserHandle user, Context context) {
         Integer uid = null;
         try {
             uid =
-                    getPackageManagerAsUser(user, context)
+                    getPackageManagerAsUser(context, user)
                             .getPackageUid(
                                     packageName,
                                     PackageManager.PackageInfoFlags.of(/* flags= */ 0));
@@ -203,12 +165,76 @@
         return uid;
     }
 
-    private PackageManager getPackageManagerAsUser(UserHandle user, Context context) {
-        PackageManager packageManager = mUsersPackageManager.get(user);
-        if (packageManager == null) {
-            packageManager = context.getPackageManager();
-            mUsersPackageManager.put(user, packageManager);
+    /**
+     * Returns the list of health permissions granted to a given package name. It does not check if
+     * the given package name is valid.
+     */
+    public static List<String> getGrantedHealthPermissions(
+            Context context, String packageName, UserHandle user) {
+        PackageInfo packageInfo =
+                getPackageInfoUnchecked(
+                        packageName,
+                        user,
+                        PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS),
+                        context);
+
+        return getGrantedHealthPermissions(context, packageInfo);
+    }
+
+    /** Returns the list of health permissions granted to the given {@link PackageInfo}. */
+    public static List<String> getGrantedHealthPermissions(
+            Context context, PackageInfo packageInfo) {
+        Set<String> healthPermissions = HealthConnectManager.getHealthPermissions(context);
+
+        if (packageInfo.requestedPermissions == null) {
+            return List.of();
         }
-        return packageManager;
+
+        List<String> grantedHealthPerms = new ArrayList<>(packageInfo.requestedPermissions.length);
+        for (int i = 0; i < packageInfo.requestedPermissions.length; i++) {
+            String currPerm = packageInfo.requestedPermissions[i];
+            if (packageInfo.requestedPermissionsFlags != null
+                    && healthPermissions.contains(currPerm)
+                    && ((packageInfo.requestedPermissionsFlags[i]
+                                    & PackageInfo.REQUESTED_PERMISSION_GRANTED)
+                            != 0)) {
+                grantedHealthPerms.add(currPerm);
+            }
+        }
+        return grantedHealthPerms;
+    }
+
+    /**
+     * Returns the list of {@link PackageInfo} for a given package. It does not check if the given
+     * package name is valid.
+     */
+    public static PackageInfo getPackageInfoUnchecked(
+            String packageName,
+            UserHandle user,
+            PackageManager.PackageInfoFlags flags,
+            Context context) {
+        try {
+            return getPackageManagerAsUser(context, user).getPackageInfo(packageName, flags);
+        } catch (PackageManager.NameNotFoundException e) {
+            throw new IllegalArgumentException("invalid package", e);
+        }
+    }
+
+    private static PackageManager getPackageManagerAsUser(Context context, UserHandle user) {
+        return context.createContextAsUser(user, /* flags */ 0).getPackageManager();
+    }
+
+    private boolean hasRequestedHealthPermission(Context context, PackageInfo packageInfo) {
+        if (packageInfo == null || packageInfo.requestedPermissions == null) {
+            return false;
+        }
+
+        Set<String> healthPermissions = HealthConnectManager.getHealthPermissions(context);
+        for (int i = 0; i < packageInfo.requestedPermissions.length; i++) {
+            if (healthPermissions.contains(packageInfo.requestedPermissions[i])) {
+                return true;
+            }
+        }
+        return false;
     }
 }
diff --git a/service/java/com/android/server/healthconnect/permission/PermissionPackageChangesOrchestrator.java b/service/java/com/android/server/healthconnect/permission/PermissionPackageChangesOrchestrator.java
index 1c1bfaa..104b675 100644
--- a/service/java/com/android/server/healthconnect/permission/PermissionPackageChangesOrchestrator.java
+++ b/service/java/com/android/server/healthconnect/permission/PermissionPackageChangesOrchestrator.java
@@ -16,10 +16,12 @@
 
 package com.android.server.healthconnect.permission;
 
+import android.annotation.Nullable;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.health.connect.Constants;
 import android.net.Uri;
 import android.os.UserHandle;
@@ -27,6 +29,7 @@
 import android.util.Log;
 import android.util.Slog;
 
+import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.BackgroundThread;
 import com.android.server.healthconnect.HealthConnectThreadScheduler;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
@@ -73,6 +76,10 @@
     public void onReceive(Context context, Intent intent) {
         String packageName = getPackageName(intent);
         UserHandle userHandle = getUserHandle(intent);
+        if (packageName == null || userHandle == null) {
+            Log.w(TAG, "onReceive package change, can't extract info from the input intent");
+            return;
+        }
         if (Constants.DEBUG) {
             Slog.d(
                     TAG,
@@ -84,17 +91,29 @@
                             + intent.getAction());
         }
 
-        if (packageName == null || userHandle == null) {
-            Log.w(TAG, "can't extract info from the input intent");
-            return;
-        }
-
-        boolean isHealthIntentRemoved =
-                mPermissionIntentTracker.updateStateAndGetIfIntentWasRemoved(
-                        packageName, userHandle);
         boolean isPackageRemoved =
                 intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)
                         && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
+        // This call also has a (unintended?) positive side-effect of removing the package from
+        // the intent tracker, if the package was removed. Keep calling this even if
+        // isPackageRemoved is true.
+        boolean removePermissions;
+        if (Flags.permissionTrackerFixMappingInit()) {
+            removePermissions =
+                    !mPermissionIntentTracker.updateAndGetSupportsPackageUsageIntent(
+                            packageName, userHandle);
+        } else {
+            removePermissions =
+                    mPermissionIntentTracker.updateStateAndGetIfIntentWasRemoved(
+                            packageName, userHandle);
+        }
+
+        // Wear Apps don't require the permissions intent. No need to revoke the permissions if it
+        // is missing.
+        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH) &&
+            Flags.replaceBodySensorPermissionEnabled()) {
+            removePermissions = false;
+        }
         // If the package was removed, we reset grant time. If the package is present but the health
         // intent support removed we revoke all health permissions and also reset grant time
         // (is done via onPermissionChanged callback)
@@ -112,7 +131,7 @@
                                         .maybeRemoveAppWithoutWritePermissionsFromPriorityList(
                                                 packageName));
             }
-        } else if (isHealthIntentRemoved) {
+        } else if (removePermissions) {
             // Revoke all health permissions as we don't grant health permissions if permissions
             // usage intent is not supported.
             if (Constants.DEBUG) {
@@ -152,13 +171,13 @@
         return filter;
     }
 
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
+    @Nullable
     private String getPackageName(Intent intent) {
         Uri uri = intent.getData();
         return uri != null ? uri.getSchemeSpecificPart() : null;
     }
 
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
+    @Nullable
     private UserHandle getUserHandle(Intent intent) {
         final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
         if (uid >= 0) {
diff --git a/service/java/com/android/server/healthconnect/phr/PhrPageTokenWrapper.java b/service/java/com/android/server/healthconnect/phr/PhrPageTokenWrapper.java
index e038cbd..2ecabe1 100644
--- a/service/java/com/android/server/healthconnect/phr/PhrPageTokenWrapper.java
+++ b/service/java/com/android/server/healthconnect/phr/PhrPageTokenWrapper.java
@@ -23,6 +23,7 @@
 import static java.util.Objects.hash;
 import static java.util.stream.Collectors.toSet;
 
+import android.annotation.Nullable;
 import android.health.connect.ReadMedicalResourcesInitialRequest;
 import android.health.connect.aidl.ReadMedicalResourcesRequestParcel;
 
@@ -30,6 +31,7 @@
 
 import java.util.Arrays;
 import java.util.Base64;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -38,22 +40,36 @@
  * @hide
  */
 public class PhrPageTokenWrapper {
+    public static final PhrPageTokenWrapper EMPTY_PAGE_TOKEN = new PhrPageTokenWrapper();
     private static final String DELIMITER = ",";
     private static final String INNER_DELIMITER = ";";
+    // This is used for when we just encode the mLastRowId without using filters.
+    private static final int NUM_OF_ENCODED_FIELDS_WITHOUT_REQUEST_FILTERS = 1;
     // We currently encode mLastRowId, mRequest.getMedicalResourceType(), and
     // mRequest.getDataSourceIds(). As we add more filters and need to update the encoding logic, we
     // need to update this as well.
-    private static final int NUM_OF_ENCODED_FIELDS = 3;
+    private static final int NUM_OF_ENCODED_FIELDS_WITH_REQUEST_FILTERS = 3;
     // These are the indices at which we store and retrieve each field used for creating the
     // pageToken string.
     private static final int LAST_ROW_ID_INDEX = 0;
     private static final int MEDICAL_RESOURCE_TYPE_INDEX = 1;
     private static final int MEDICAL_DATA_SOURCE_IDS_INDEX = 2;
 
-    private final ReadMedicalResourcesInitialRequest mRequest;
+    @Nullable private final ReadMedicalResourcesInitialRequest mRequest;
     private long mLastRowId = DEFAULT_LONG;
 
     /**
+     * Creates a {@link PhrPageTokenWrapper} from the given {@code lastRowId}.
+     *
+     * <p>This is currently only used in D2D merge logic where we want to read all data out instead
+     * of using filters. So using this, we can build a {@link PhrPageTokenWrapper} from only {@code
+     * lastRowId} specified.
+     */
+    public static PhrPageTokenWrapper from(long lastRowId) {
+        return new PhrPageTokenWrapper(lastRowId);
+    }
+
+    /**
      * Creates a {@link PhrPageTokenWrapper} from the given {@link
      * ReadMedicalResourcesRequestParcel}.
      *
@@ -80,22 +96,40 @@
         return from(request.getPageToken());
     }
 
-    /** Creates a {@link PhrPageTokenWrapper} from the given {@code pageToken}. */
-    @VisibleForTesting
-    static PhrPageTokenWrapper from(String pageToken) {
+    /**
+     * Creates a {@link PhrPageTokenWrapper} from the given {@code pageToken}. Returns {@link
+     * #EMPTY_PAGE_TOKEN} if {@code pageToken} is empty or null.
+     */
+    public static PhrPageTokenWrapper fromPageTokenAllowingNull(@Nullable String pageToken) {
         if (pageToken == null || pageToken.isEmpty()) {
-            throw new IllegalArgumentException("pageToken can not be empty");
+            return EMPTY_PAGE_TOKEN;
         }
 
+        return from(pageToken);
+    }
+
+    /** Creates a {@link PhrPageTokenWrapper} from the given {@code pageToken}. */
+    @VisibleForTesting
+    static PhrPageTokenWrapper from(@Nullable String pageToken) {
         Base64.Decoder decoder = Base64.getDecoder();
         String decodedPageToken = new String(decoder.decode(pageToken));
         String[] pageTokenSplit = decodedPageToken.split(DELIMITER, /* limit= */ -1);
 
-        if (pageTokenSplit.length != NUM_OF_ENCODED_FIELDS) {
+        // If the pageToken was built from PhrPageTokenWrapper with request being
+        // null, this will only include the lastRowId.
+        if (pageTokenSplit.length == NUM_OF_ENCODED_FIELDS_WITHOUT_REQUEST_FILTERS) {
+            long lastRowId = Long.parseLong(decodedPageToken);
+            if (lastRowId < 0) {
+                throw new IllegalArgumentException("Invalid pageToken");
+            }
+            return new PhrPageTokenWrapper(lastRowId);
+        }
+
+        if (pageTokenSplit.length != NUM_OF_ENCODED_FIELDS_WITH_REQUEST_FILTERS) {
             throw new IllegalArgumentException("Invalid pageToken");
         }
 
-        int lastRowId = Integer.parseInt(pageTokenSplit[LAST_ROW_ID_INDEX]);
+        long lastRowId = Long.parseLong(pageTokenSplit[LAST_ROW_ID_INDEX]);
         if (lastRowId < 0) {
             throw new IllegalArgumentException("Invalid pageToken");
         }
@@ -147,9 +181,13 @@
      * PhrPageTokenWrapper#encode()}.
      */
     private String toReadableTokenString() {
+        String lastRowId = String.valueOf(mLastRowId);
+        if (mRequest == null) {
+            return lastRowId;
+        }
         return String.join(
                 DELIMITER,
-                String.valueOf(mLastRowId),
+                lastRowId,
                 String.valueOf(mRequest.getMedicalResourceType()),
                 String.join(INNER_DELIMITER, mRequest.getDataSourceIds()));
     }
@@ -180,6 +218,7 @@
     }
 
     /** Returns the initial request from which the {@link PhrPageTokenWrapper} is created from. */
+    @Nullable
     public ReadMedicalResourcesInitialRequest getRequest() {
         return mRequest;
     }
@@ -189,7 +228,7 @@
     public boolean equals(Object o) {
         if (this == o) return true;
         if (!(o instanceof PhrPageTokenWrapper that)) return false;
-        return mLastRowId == that.mLastRowId && mRequest.equals(that.mRequest);
+        return mLastRowId == that.mLastRowId && Objects.equals(mRequest, that.mRequest);
     }
 
     /** Returns a hash code value for the object. */
@@ -198,11 +237,21 @@
         return hash(getLastRowId(), getRequest());
     }
 
-    private PhrPageTokenWrapper(ReadMedicalResourcesInitialRequest request) {
+    private PhrPageTokenWrapper() {
+        this.mRequest = null;
+    }
+
+    private PhrPageTokenWrapper(long lastRowId) {
+        this.mRequest = null;
+        this.mLastRowId = lastRowId;
+    }
+
+    private PhrPageTokenWrapper(@Nullable ReadMedicalResourcesInitialRequest request) {
         this.mRequest = request;
     }
 
-    private PhrPageTokenWrapper(ReadMedicalResourcesInitialRequest request, long lastRowId) {
+    private PhrPageTokenWrapper(
+            @Nullable ReadMedicalResourcesInitialRequest request, long lastRowId) {
         this.mRequest = request;
         this.mLastRowId = lastRowId;
     }
diff --git a/service/java/com/android/server/healthconnect/phr/ReadMedicalResourcesInternalResponse.java b/service/java/com/android/server/healthconnect/phr/ReadMedicalResourcesInternalResponse.java
index 4c37c02..146b613 100644
--- a/service/java/com/android/server/healthconnect/phr/ReadMedicalResourcesInternalResponse.java
+++ b/service/java/com/android/server/healthconnect/phr/ReadMedicalResourcesInternalResponse.java
@@ -31,11 +31,24 @@
 public final class ReadMedicalResourcesInternalResponse {
     @Nullable String mPageToken;
     List<MedicalResource> mMedicalResources;
+    int mRemainingCount;
 
     public ReadMedicalResourcesInternalResponse(
-            List<MedicalResource> medicalResources, @Nullable String pageToken) {
-        this.mMedicalResources = medicalResources;
-        this.mPageToken = pageToken;
+            List<MedicalResource> medicalResources,
+            @Nullable String pageToken,
+            int remainingCount) {
+        if (pageToken == null && remainingCount > 0) {
+            throw new IllegalArgumentException(
+                    String.format(
+                            "Remaining count must be 0 to have a null next page token, but was %d",
+                            remainingCount));
+        }
+        if (pageToken != null && remainingCount == 0) {
+            throw new IllegalArgumentException("Next page token provided with no remaining data");
+        }
+        mMedicalResources = medicalResources;
+        mPageToken = pageToken;
+        mRemainingCount = remainingCount;
     }
 
     /** Returns the {@code mPageToken}. */
@@ -49,18 +62,31 @@
         return mMedicalResources;
     }
 
+    /**
+     * Returns the count of medical resources still remaining which were not returned due to
+     * pagination.
+     *
+     * <p>For a response with a null next page token, this will be 0. This result is accurate at the
+     * time the request was made, and with the permissions when the request was made. However, the
+     * actual results may change if permissions change or resources are inserted or deleted.
+     */
+    public int getRemainingCount() {
+        return mRemainingCount;
+    }
+
     /** Indicates whether some other object is "equal to" this one. */
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (!(o instanceof ReadMedicalResourcesInternalResponse that)) return false;
         return Objects.equals(mPageToken, that.mPageToken)
-                && Objects.equals(mMedicalResources, that.mMedicalResources);
+                && Objects.equals(mMedicalResources, that.mMedicalResources)
+                && mRemainingCount == that.mRemainingCount;
     }
 
     /** Returns a hash code value for the object. */
     @Override
     public int hashCode() {
-        return Objects.hash(mPageToken, mMedicalResources);
+        return Objects.hash(mPageToken, mMedicalResources, mRemainingCount);
     }
 }
diff --git a/service/java/com/android/server/healthconnect/phr/validations/FhirPrimitiveTypeValidator.java b/service/java/com/android/server/healthconnect/phr/validations/FhirPrimitiveTypeValidator.java
new file mode 100644
index 0000000..68511df
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/phr/validations/FhirPrimitiveTypeValidator.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.healthconnect.phr.validations;
+
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_BOOLEAN;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_CANONICAL;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_CODE;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_DATE;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_DATE_TIME;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_INSTANT;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_INTEGER;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_STRING;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_SYSTEM_STRING;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_TIME;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_URI;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.server.healthconnect.proto.R4FhirType;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Performs validation on FHIR primitive values.
+ *
+ * @hide
+ */
+public class FhirPrimitiveTypeValidator {
+    private static final Map<R4FhirType, Pattern> sR4PrimitiveStringTypeToPatternMap =
+            new HashMap<>();
+
+    // All regex below are copied from https://hl7.org/fhir/R4/datatypes.html. Please keep the regex
+    // patterns below SORTED.
+    // TODO(b/361775172): Support all primitive types from the website. The missing ones now are:
+    // base64Binary, decimal, integer64, markdown, oid, positiveInt, unsignedInt, url, uuid.
+    private static final Pattern CANONICAL_R4_PATTERN = Pattern.compile("\\S*");
+    private static final Pattern CODE_R4_PATTERN = Pattern.compile("[^\\s]+(\\s[^\\s]+)*");
+    private static final Pattern DATE_R4_PATTERN =
+            Pattern.compile(
+                    "([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)"
+                            + "(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2][0-9]|3[0-1]))?)?");
+    // With the R4 regex, if a time is specified, a timezone offset must be populated.
+    private static final Pattern DATE_TIME_R4_PATTERN =
+            Pattern.compile(
+                    "([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)"
+                            + "(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2][0-9]|3[0-1])"
+                            + "(T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)"
+                            + "(\\.[0-9]+)?(Z|(\\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00)))?)?)?");
+    private static final Pattern ID_R4_PATTERN = Pattern.compile("[A-Za-z0-9\\-\\.]{1,64}");
+    private static final Pattern INSTANT_R4_PATTERN =
+            Pattern.compile(
+                    "([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)"
+                            + "-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])"
+                            + "T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)"
+                            + "(\\.[0-9]+)?(Z|(\\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))");
+    private static final Pattern STRING_R4_PATTERN = Pattern.compile("[ \\r\\n\\t\\S]+");
+    private static final Pattern TIME_R4_PATTERN =
+            Pattern.compile("([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)(\\.[0-9]+)?");
+    private static final Pattern URI_R4_PATTERN = Pattern.compile("\\S*");
+
+    static void validate(Object fieldObject, String fieldName, R4FhirType type) {
+        if (!Flags.phrFhirPrimitiveTypeValidation()) {
+            throw new UnsupportedOperationException(
+                    "Validating FHIR primitive types is not supported.");
+        }
+        if (fieldObject == null) {
+            throw new IllegalStateException(
+                    "The fieldObject cannot be null in primitive kind field: " + fieldName);
+        }
+        populateR4PrimitiveStringTypeToPatternMap();
+        switch (type) {
+            case R4_FHIR_TYPE_BOOLEAN:
+                validateBooleanType(fieldObject, fieldName);
+                break;
+            case R4_FHIR_TYPE_INTEGER:
+                validateIntegerType(fieldObject, fieldName);
+                break;
+            case R4_FHIR_TYPE_CANONICAL:
+            case R4_FHIR_TYPE_CODE:
+            case R4_FHIR_TYPE_DATE:
+            case R4_FHIR_TYPE_DATE_TIME:
+            case R4_FHIR_TYPE_SYSTEM_STRING:
+            case R4_FHIR_TYPE_INSTANT:
+            case R4_FHIR_TYPE_STRING:
+            case R4_FHIR_TYPE_TIME:
+            case R4_FHIR_TYPE_URI:
+                validateStringType(fieldObject, fieldName);
+                validateValuePattern(
+                        fieldObject.toString(), getR4PrimitiveStringTypePattern(type), fieldName);
+                break;
+            default:
+                throw new IllegalStateException(
+                        "Type is not supported. Found unexpected type "
+                                + type.name()
+                                + " in primitive kind field: "
+                                + fieldName);
+        }
+    }
+
+    private static void validateBooleanType(Object fieldObject, String fieldName) {
+        if (!(fieldObject instanceof Boolean)) {
+            throw new IllegalArgumentException(
+                    "Invalid resource structure. Found non boolean object in field: " + fieldName);
+        }
+    }
+
+    private static void validateIntegerType(Object fieldObject, String fieldName) {
+        if (!(fieldObject instanceof Integer)) {
+            throw new IllegalArgumentException(
+                    "Invalid resource structure. Found non integer object in field: " + fieldName);
+        }
+    }
+
+    private static void validateStringType(Object fieldObject, String fieldName) {
+        if (!(fieldObject instanceof String)) {
+            throw new IllegalArgumentException(
+                    "Invalid resource structure. Found non string object in field: " + fieldName);
+        }
+    }
+
+    private static void validateValuePattern(String value, Pattern pattern, String fieldName) {
+        Matcher matcher = pattern.matcher(value);
+        if (!matcher.matches()) {
+            throw new IllegalArgumentException(
+                    "Found invalid field value in primitive field: "
+                            + fieldName
+                            + ". The value found is: "
+                            + value);
+        }
+    }
+
+    private static Pattern getR4PrimitiveStringTypePattern(R4FhirType type) {
+        populateR4PrimitiveStringTypeToPatternMap();
+
+        Pattern pattern = sR4PrimitiveStringTypeToPatternMap.get(type);
+        if (pattern != null) {
+            return pattern;
+        }
+
+        throw new IllegalStateException(
+                "Could not find the regex pattern for primitive string type " + type.name());
+    }
+
+    private static synchronized void populateR4PrimitiveStringTypeToPatternMap() {
+        if (!sR4PrimitiveStringTypeToPatternMap.isEmpty()) {
+            return;
+        }
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_CANONICAL, CANONICAL_R4_PATTERN);
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_CODE, CODE_R4_PATTERN);
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_DATE, DATE_R4_PATTERN);
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_DATE_TIME, DATE_TIME_R4_PATTERN);
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_SYSTEM_STRING, ID_R4_PATTERN);
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_INSTANT, INSTANT_R4_PATTERN);
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_STRING, STRING_R4_PATTERN);
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_TIME, TIME_R4_PATTERN);
+        sR4PrimitiveStringTypeToPatternMap.put(R4_FHIR_TYPE_URI, URI_R4_PATTERN);
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/phr/validations/FhirResourceValidator.java b/service/java/com/android/server/healthconnect/phr/validations/FhirResourceValidator.java
new file mode 100644
index 0000000..e415890
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/phr/validations/FhirResourceValidator.java
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.phr.validations;
+
+import static android.health.connect.datatypes.FhirResource.FhirResourceType;
+
+import static com.android.server.healthconnect.proto.Kind.KIND_PRIMITIVE_TYPE;
+
+import android.health.connect.datatypes.FhirVersion;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.server.healthconnect.proto.FhirDataTypeConfig;
+import com.android.server.healthconnect.proto.FhirFieldConfig;
+import com.android.server.healthconnect.proto.MultiTypeFieldConfig;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Performs validation on a FHIR JSON Object, based on the FHIR version R4.
+ *
+ * @hide
+ */
+public class FhirResourceValidator {
+
+    private final FhirSpecProvider mFhirSpec;
+
+    public FhirResourceValidator() {
+        if (!Flags.phrFhirStructuralValidation()) {
+            throw new UnsupportedOperationException("Validating FHIR resources is not supported.");
+        }
+
+        // TODO: b/374058373 - When we support R5 or other versions this needs to be updated to
+        //  support other fhir versions.
+        mFhirSpec = new FhirSpecProvider(FhirVersion.parseFhirVersion("4.0.1"));
+    }
+
+    /**
+     * Validates the provided {@code fhirJsonObject} against the schema of the provided {@code
+     * fhirResourceType}
+     *
+     * @throws IllegalArgumentException if the resource is invalid.
+     */
+    // TODO: b/374949383 - Improve this to validate each field content by type
+    public void validateFhirResource(
+            JSONObject fhirJsonObject, @FhirResourceType int fhirResourceType) {
+        FhirDataTypeConfig config =
+                mFhirSpec.getFhirDataTypeConfigForResourceType(fhirResourceType);
+
+        Map<String, FhirFieldConfig> fieldToConfig = config.getAllowedFieldNamesToConfigMap();
+
+        validatePresenceOfRequiredFields(
+                fhirJsonObject, config.getRequiredFieldsList(), fieldToConfig);
+
+        validateMultiTypeFields(fhirJsonObject, config.getMultiTypeFieldsList(), fieldToConfig);
+
+        validateResourceStructure(fhirJsonObject, fieldToConfig);
+    }
+
+    private void validatePresenceOfRequiredFields(
+            JSONObject fhirJsonObject,
+            List<String> requiredFields,
+            Map<String, FhirFieldConfig> fieldToConfig) {
+        for (String requiredField : requiredFields) {
+            FhirFieldConfig fieldConfig = fieldToConfig.get(requiredField);
+            if (fieldConfig == null) {
+                throw new IllegalStateException(
+                        "Could not find field config for required field " + requiredField);
+            }
+            boolean fieldIsPrimitiveType = fieldConfig.getKind().equals(KIND_PRIMITIVE_TYPE);
+
+            if (!fieldIsPresent(fhirJsonObject, requiredField, fieldIsPrimitiveType)) {
+                throw new IllegalArgumentException("Missing required field " + requiredField);
+            }
+        }
+
+        // TODO: b/377717422 -  If the field is an array also check that it's not empty.
+        // This case does not happen for top level resource field validation, so should be
+        // handled as part of implementing complex type validation.
+
+    }
+
+    private void validateMultiTypeFields(
+            JSONObject fhirJsonObject,
+            List<MultiTypeFieldConfig> multiTypeFieldConfigs,
+            Map<String, FhirFieldConfig> fieldToConfig) {
+        for (MultiTypeFieldConfig multiTypeFieldConfig : multiTypeFieldConfigs) {
+            int presentFieldCount = 0;
+            for (String typedField : multiTypeFieldConfig.getTypedFieldNamesList()) {
+                FhirFieldConfig fieldConfig = fieldToConfig.get(typedField);
+                if (fieldConfig == null) {
+                    throw new IllegalStateException(
+                            "Could not find field config for field " + typedField);
+                }
+                boolean fieldIsPrimitiveType = fieldConfig.getKind().equals(KIND_PRIMITIVE_TYPE);
+
+                if (fieldIsPresent(fhirJsonObject, typedField, fieldIsPrimitiveType)) {
+                    presentFieldCount++;
+                }
+            }
+
+            if (multiTypeFieldConfig.getIsRequired() && presentFieldCount == 0) {
+                throw new IllegalArgumentException(
+                        "Missing required field " + multiTypeFieldConfig.getName());
+            }
+
+            if (presentFieldCount > 1) {
+                throw new IllegalArgumentException(
+                        "Only one type should be set for field " + multiTypeFieldConfig.getName());
+            }
+        }
+    }
+
+    private void validateResourceStructure(
+            JSONObject fhirJsonObject, Map<String, FhirFieldConfig> fieldToConfig) {
+        Iterator<String> fieldIterator = fhirJsonObject.keys();
+
+        while (fieldIterator.hasNext()) {
+            String fieldName = fieldIterator.next();
+            boolean fieldStartsWithUnderscore = fieldName.startsWith("_");
+
+            // Strip leading underscore in case the field is a primitive type extension, which will
+            // have a leading underscore, e.g. _status, see
+            // https://build.fhir.org/json.html#primitive.
+            String fieldWithoutLeadingUnderscore =
+                    fieldStartsWithUnderscore ? fieldName.substring(1) : fieldName;
+
+            FhirFieldConfig fieldConfig = fieldToConfig.get(fieldWithoutLeadingUnderscore);
+            if (fieldConfig == null
+                    || (fieldStartsWithUnderscore
+                            && !fieldConfig.getKind().equals(KIND_PRIMITIVE_TYPE))) {
+                // TODO: b/374953896 - Improve error message to include type and id.
+                throw new IllegalArgumentException("Found unexpected field " + fieldName);
+            }
+
+            if (Flags.phrFhirBasicComplexTypeValidation()) {
+                Object fieldObject;
+                try {
+                    fieldObject = fhirJsonObject.get(fieldName);
+                } catch (JSONException exception) {
+                    throw new IllegalStateException(
+                            "Expected field to be present in json object: " + fieldName);
+                }
+
+                if (fieldConfig.getIsArray()) {
+                    validateArrayFieldAndContents(fieldObject, fieldName, fieldConfig);
+                } else {
+                    validateField(fieldObject, fieldName, fieldConfig);
+                }
+            }
+        }
+    }
+
+    private void validateArrayFieldAndContents(
+            Object fieldObject, String fieldName, FhirFieldConfig fieldConfig) {
+        if (!(fieldObject instanceof JSONArray)) {
+            throw new IllegalArgumentException(
+                    "Invalid resource structure. Expected array for field: " + fieldName);
+        }
+        JSONArray jsonArray = (JSONArray) fieldObject;
+
+        boolean isPrimitiveTypeExtension =
+                fieldConfig.getKind().equals(KIND_PRIMITIVE_TYPE) && fieldName.startsWith("_");
+
+        for (int i = 0; i < jsonArray.length(); i++) {
+            Object objectInArray;
+            try {
+                objectInArray = jsonArray.get(i);
+            } catch (JSONException exception) {
+                throw new IllegalStateException(
+                        "Expected item to be present in json array at index "
+                                + i
+                                + " for field "
+                                + fieldName);
+            }
+
+            if (isPrimitiveTypeExtension && objectInArray.equals(JSONObject.NULL)) {
+                // Arrays that contain primitive type extensions are allowed to contain null values
+                // (would be parsed to JSONObject.NULL). See
+                // https://hl7.org/fhir/R4/json.html#primitive for an explanation.
+                continue;
+            }
+
+            validateField(objectInArray, fieldName, fieldConfig);
+        }
+    }
+
+    /**
+     * Performs basic field validation according to the field type.
+     *
+     * <p>Null values are not allowed. Note that the fieldObject should not be an array. For
+     * validating arrays use {@link #validateArrayFieldAndContents}.
+     */
+    private void validateField(Object fieldObject, String fieldName, FhirFieldConfig fieldConfig) {
+        switch (fieldConfig.getKind()) {
+            case KIND_PRIMITIVE_TYPE:
+                // If the field is a primitive type extension, then it will be an object with
+                // fields "id" and/or "extension" fields.
+                if (fieldName.startsWith("_")) {
+                    validateObjectIsJSONObject(fieldObject, fieldName);
+                } else {
+                    if (fieldObject.equals(JSONObject.NULL)) {
+                        throw new IllegalArgumentException(
+                                "Found null value in field: " + fieldName);
+                    }
+                    if (fieldObject instanceof JSONObject) {
+                        throw new IllegalArgumentException(
+                                "Invalid resource structure. Found json object but expected"
+                                        + " primitive type in field: "
+                                        + fieldName);
+                    }
+                    if (fieldObject instanceof JSONArray) {
+                        throw new IllegalArgumentException(
+                                "Invalid resource structure. Found json array but expected"
+                                        + " primitive type in field: "
+                                        + fieldName);
+                    }
+
+                    if (Flags.phrFhirPrimitiveTypeValidation()) {
+                        FhirPrimitiveTypeValidator.validate(
+                                fieldObject, fieldName, fieldConfig.getR4Type());
+                    }
+                }
+                break;
+            case KIND_RESOURCE:
+            case KIND_COMPLEX_TYPE:
+                validateObjectIsJSONObject(fieldObject, fieldName);
+                break;
+            default:
+                throw new IllegalStateException(
+                        "Encountered unexpected type kind: " + fieldConfig.getKind().name());
+        }
+    }
+
+    private void validateObjectIsJSONObject(Object fieldObject, String fieldName) {
+        if (fieldObject.equals(JSONObject.NULL)) {
+            throw new IllegalArgumentException("Found null value in field: " + fieldName);
+        }
+        if (!(fieldObject instanceof JSONObject)) {
+            throw new IllegalArgumentException(
+                    "Invalid resource structure. Expected object in field: " + fieldName);
+        }
+    }
+
+    private boolean fieldIsPresent(
+            JSONObject fhirJsonObject, String fieldName, boolean isPrimitiveType) {
+        boolean fieldIsPresent = fhirJsonObject.has(fieldName);
+
+        // For primitive type fields, a primitive type extension with leading underscore may be
+        // present instead. See https://build.fhir.org/extensibility.html#primitives, which
+        // states that "extensions may appear in place of the value of the primitive datatype".
+        if (isPrimitiveType) {
+            fieldIsPresent = fieldIsPresent || fhirJsonObject.has("_" + fieldName);
+        }
+
+        return fieldIsPresent;
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/phr/validations/FhirSpecProvider.java b/service/java/com/android/server/healthconnect/phr/validations/FhirSpecProvider.java
new file mode 100644
index 0000000..7bc1eec
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/phr/validations/FhirSpecProvider.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.phr.validations;
+
+import static android.health.connect.datatypes.FhirResource.FhirResourceType;
+import static android.health.connect.datatypes.FhirResource.validateFhirResourceType;
+
+import android.health.connect.datatypes.FhirVersion;
+import android.util.ArrayMap;
+
+import com.android.server.healthconnect.proto.FhirDataTypeConfig;
+import com.android.server.healthconnect.proto.FhirResourceSpec;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+/**
+ * Contains the parsed Fhir resource spec, which can be used to validate FHIR resources against the
+ * spec.
+ *
+ * @hide
+ */
+public class FhirSpecProvider {
+    private static final String R4_FHIR_SPEC_FILE_NAME = "fhirspec-r4.binarypb";
+
+    private Map<Integer, FhirDataTypeConfig> mResourceTypeIntToFhirSpecMap = new ArrayMap<>();
+
+    /**
+     * Parses the {@link FhirResourceSpec} proto file for the provided {@link FhirVersion} *
+     *
+     * @throws IllegalArgumentException if the file cannot be read or if the provided {@code
+     *     fhirVersion} is not supported.
+     * @hide
+     */
+    public FhirSpecProvider(FhirVersion fhirVersion) {
+        if (!fhirVersion.isSupportedFhirVersion() || fhirVersion.getMajor() != 4) {
+            throw new IllegalArgumentException("Fhir version not supported in validator.");
+        }
+
+        FhirResourceSpec r4FhirResourceSpec;
+        try (InputStream stream =
+                this.getClass().getClassLoader().getResourceAsStream(R4_FHIR_SPEC_FILE_NAME)) {
+            if (stream == null) {
+                throw new IllegalStateException(R4_FHIR_SPEC_FILE_NAME + " not found.");
+            }
+            r4FhirResourceSpec = FhirResourceSpec.parseFrom(stream);
+        } catch (IOException e) {
+            throw new IllegalStateException("Could not parse file");
+        }
+        Map<Integer, FhirDataTypeConfig> resourceTypeToConfig =
+                r4FhirResourceSpec.getResourceTypeToConfigMap();
+        resourceTypeToConfig.forEach(
+                (resourceType, config) -> {
+                    validateFhirResourceType(resourceType);
+                    mResourceTypeIntToFhirSpecMap.put(resourceType, config);
+                });
+    }
+
+    /**
+     * Returns the {@link FhirDataTypeConfig} for the provided {@code resourceType}
+     *
+     * @throws IllegalArgumentException if no config exists for the specified type.
+     */
+    public FhirDataTypeConfig getFhirDataTypeConfigForResourceType(
+            @FhirResourceType int resourceType) {
+        validateFhirResourceType(resourceType);
+
+        FhirDataTypeConfig config = mResourceTypeIntToFhirSpecMap.get(resourceType);
+        if (config == null) {
+            throw new IllegalArgumentException(
+                    "Could not find config for resource type " + resourceType);
+        }
+        return config;
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/phr/validations/MedicalResourceValidator.java b/service/java/com/android/server/healthconnect/phr/validations/MedicalResourceValidator.java
index 80ca289..20a94d5 100644
--- a/service/java/com/android/server/healthconnect/phr/validations/MedicalResourceValidator.java
+++ b/service/java/com/android/server/healthconnect/phr/validations/MedicalResourceValidator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,22 +18,30 @@
 
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_CONDITION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ENCOUNTER;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_LOCATION;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_REQUEST;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_OBSERVATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ORGANIZATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PATIENT;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PROCEDURE;
-import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_UNKNOWN;
 import static android.health.connect.datatypes.FhirResource.FhirResourceType;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROBLEMS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
 import static android.health.connect.datatypes.MedicalResource.MedicalResourceType;
 import static android.health.connect.internal.datatypes.utils.FhirResourceTypeStringToIntMapper.getFhirResourceTypeInt;
@@ -42,6 +50,7 @@
 import android.health.connect.UpsertMedicalResourceRequest;
 import android.health.connect.datatypes.FhirVersion;
 
+import com.android.healthfitness.flags.Flags;
 import com.android.server.healthconnect.storage.request.UpsertMedicalResourceInternalRequest;
 
 import org.json.JSONArray;
@@ -50,7 +59,6 @@
 
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 /**
@@ -59,10 +67,8 @@
  * @hide
  */
 public class MedicalResourceValidator {
-    private static final FhirVersion R4_FHIR_VERSION = FhirVersion.parseFhirVersion("4.0.1");
-    private static final FhirVersion R4B_FHIR_VERSION = FhirVersion.parseFhirVersion("4.3.0");
-    private static final List<FhirVersion> SUPPORTED_FHIR_VERSIONS =
-            List.of(R4_FHIR_VERSION, R4B_FHIR_VERSION);
+    private static final String CONTAINED_FIELD = "contained";
+
     // For the values in these codes see
     // https://build.fhir.org/ig/HL7/fhir-ips/StructureDefinition-Observation-pregnancy-status-uv-ips.html
     private static final Set<String> PREGNANCY_LOINC_CODES =
@@ -83,21 +89,20 @@
     private static final String OBSERVATION_CATEGORY_SOCIAL_HISTORY = "social-history";
     private static final String OBSERVATION_CATEGORY_VITAL_SIGNS = "vital-signs";
     private static final String OBSERVATION_CATEGORY_LABORATORY = "laboratory";
-    private static final Set<Integer> MEDICATION_FHIR_RESOURCE_TYPES =
-            Set.of(
-                    FHIR_RESOURCE_TYPE_MEDICATION,
-                    FHIR_RESOURCE_TYPE_MEDICATION_REQUEST,
-                    FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT);
 
     private final String mFhirData;
     private final FhirVersion mFhirVersion;
     private final String mDataSourceId;
+    private @Nullable FhirResourceValidator mFhirResourceValidator;
 
     /** Returns a validator for the provided {@link UpsertMedicalResourceRequest}. */
-    public MedicalResourceValidator(UpsertMedicalResourceRequest request) {
+    public MedicalResourceValidator(
+            UpsertMedicalResourceRequest request,
+            @Nullable FhirResourceValidator fhirResourceValidator) {
         mFhirData = request.getData();
         mFhirVersion = request.getFhirVersion();
         mDataSourceId = request.getDataSourceId();
+        mFhirResourceValidator = fhirResourceValidator;
     }
 
     /**
@@ -109,6 +114,7 @@
      *   <li>The extracted FHIR resource id cannot be empty
      *   <li>Fhir version needs to be a supported version
      *   <li>The extracted FHIR resource type needs to be a supported type
+     *   <li>The FHIR resource id cannot contain any "contained" resources
      *   <li>The resource needs to map to one of our permission categories
      * </ul>
      *
@@ -127,14 +133,18 @@
 
         validateResourceId(extractedFhirResourceId);
         validateFhirVersion(mFhirVersion, extractedFhirResourceId);
+        if (Flags.phrFhirStructuralValidation()) {
+            validateNoContainedResourcesPresent(parsedFhirJsonObj, extractedFhirResourceId);
+        }
 
         @FhirResourceType
         int fhirResourceTypeInt =
                 validateAndGetResourceType(
                         extractedFhirResourceTypeString, extractedFhirResourceId);
 
-        // TODO(b/350010200) Perform structural FHIR validation after FhirResourceValidator is
-        // implemented.
+        if (mFhirResourceValidator != null) {
+            mFhirResourceValidator.validateFhirResource(parsedFhirJsonObj, fhirResourceTypeInt);
+        }
 
         @MedicalResourceType
         int medicalResourceTypeInt =
@@ -162,11 +172,21 @@
     }
 
     private static String extractResourceId(JSONObject fhirJsonObj) {
+        Object id;
         try {
-            return fhirJsonObj.getString("id");
+            id = fhirJsonObj.get("id");
         } catch (JSONException e) {
             throw new IllegalArgumentException("Resource is missing id field");
         }
+
+        // The FHIR spec expects this to be a string, so throw an error if this is not a json string
+        // to avoid cases where null leads to an id value "null" for example, if we were to use
+        // JSONObject.getString("id") instead.
+        if (!(id instanceof String)) {
+            throw new IllegalArgumentException("Resource id should be a string");
+        }
+
+        return (String) id;
     }
 
     private static String extractResourceType(JSONObject fhirJsonObj, String resourceId) {
@@ -185,7 +205,7 @@
     }
 
     private static void validateFhirVersion(FhirVersion fhirVersion, String resourceId) {
-        if (!SUPPORTED_FHIR_VERSIONS.contains(fhirVersion)) {
+        if (!fhirVersion.isSupportedFhirVersion()) {
             throw new IllegalArgumentException(
                     "Unsupported FHIR version "
                             + fhirVersion
@@ -194,6 +214,30 @@
         }
     }
 
+    private static void validateNoContainedResourcesPresent(
+            JSONObject fhirJsonObject, String resourceId) {
+        if (!fhirJsonObject.has(CONTAINED_FIELD)) {
+            return;
+        }
+
+        JSONArray contained;
+        try {
+            contained = fhirJsonObject.getJSONArray(CONTAINED_FIELD);
+        } catch (JSONException exception) {
+            throw new IllegalArgumentException(
+                    "Contained resources are not supported. Found contained field for resource"
+                            + " with id "
+                            + resourceId);
+        }
+
+        if (contained.length() != 0) {
+            throw new IllegalArgumentException(
+                    "Contained resources are not supported. Found contained resource for resource"
+                            + " with id "
+                            + resourceId);
+        }
+    }
+
     /**
      * Returns the corresponding {@code IntDef} {@link FhirResourceType} of the fhir resource.
      *
@@ -201,10 +245,12 @@
      */
     @FhirResourceType
     private static int validateAndGetResourceType(String fhirResourceType, String fhirResourceId) {
-        int fhirResourceTypeInt = getFhirResourceTypeInt(fhirResourceType);
-        if (fhirResourceTypeInt == FHIR_RESOURCE_TYPE_UNKNOWN) {
+        int fhirResourceTypeInt;
+        try {
+            fhirResourceTypeInt = getFhirResourceTypeInt(fhirResourceType);
+        } catch (IllegalArgumentException e) {
             throw new IllegalArgumentException(
-                    "Unsupported resource type "
+                    "Unsupported FHIR resource type "
                             + fhirResourceType
                             + " for resource with id "
                             + fhirResourceId);
@@ -226,26 +272,36 @@
             JSONObject json) {
         // TODO(b/342574702): add mapping logic for more FHIR resource types and improve error
         // message.
-        if (fhirResourceType == FHIR_RESOURCE_TYPE_IMMUNIZATION) {
-            return MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-        }
-        if (fhirResourceType == FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE) {
-            return MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-        }
-        if (fhirResourceType == FHIR_RESOURCE_TYPE_CONDITION) {
-            return MEDICAL_RESOURCE_TYPE_PROBLEMS;
-        }
-        if (fhirResourceType == FHIR_RESOURCE_TYPE_PROCEDURE) {
-            return MEDICAL_RESOURCE_TYPE_PROCEDURES;
-        }
-        if (MEDICATION_FHIR_RESOURCE_TYPES.contains(fhirResourceType)) {
-            return MEDICAL_RESOURCE_TYPE_MEDICATIONS;
-        }
-        if (fhirResourceType == FHIR_RESOURCE_TYPE_OBSERVATION) {
-            Integer classification = classifyObservation(json);
-            if (classification != null) {
-                return classification;
-            }
+        switch (fhirResourceType) {
+            case FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE:
+                return MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+            case FHIR_RESOURCE_TYPE_CONDITION:
+                return MEDICAL_RESOURCE_TYPE_CONDITIONS;
+            case FHIR_RESOURCE_TYPE_ENCOUNTER,
+                    FHIR_RESOURCE_TYPE_LOCATION,
+                    FHIR_RESOURCE_TYPE_ORGANIZATION:
+                return MEDICAL_RESOURCE_TYPE_VISITS;
+            case FHIR_RESOURCE_TYPE_IMMUNIZATION:
+                return MEDICAL_RESOURCE_TYPE_VACCINES;
+            case FHIR_RESOURCE_TYPE_OBSERVATION:
+                Integer classification = classifyObservation(json);
+                if (classification != null) {
+                    return classification;
+                } else {
+                    break;
+                }
+            case FHIR_RESOURCE_TYPE_PATIENT:
+                return MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+            case FHIR_RESOURCE_TYPE_PRACTITIONER, FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE:
+                return MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
+            case FHIR_RESOURCE_TYPE_PROCEDURE:
+                return MEDICAL_RESOURCE_TYPE_PROCEDURES;
+            case FHIR_RESOURCE_TYPE_MEDICATION,
+                    FHIR_RESOURCE_TYPE_MEDICATION_REQUEST,
+                    FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT:
+                return MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+            default:
+                break;
         }
         throw new IllegalArgumentException(
                 "Resource with type "
diff --git a/service/java/com/android/server/healthconnect/storage/AutoDeleteService.java b/service/java/com/android/server/healthconnect/storage/DailyCleanupJob.java
similarity index 60%
rename from service/java/com/android/server/healthconnect/storage/AutoDeleteService.java
rename to service/java/com/android/server/healthconnect/storage/DailyCleanupJob.java
index 0499fec..919b0af 100644
--- a/service/java/com/android/server/healthconnect/storage/AutoDeleteService.java
+++ b/service/java/com/android/server/healthconnect/storage/DailyCleanupJob.java
@@ -16,7 +16,6 @@
 
 package com.android.server.healthconnect.storage;
 
-import android.content.Context;
 import android.util.Slog;
 
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
@@ -25,10 +24,10 @@
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 import com.android.server.healthconnect.storage.request.DeleteTableRequest;
 import com.android.server.healthconnect.storage.request.DeleteTransactionRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -38,67 +37,59 @@
  *
  * @hide
  */
-// TODO(b/368073286): Add a constructor here (and remove service from the name).
-public class AutoDeleteService {
-    private static final String AUTO_DELETE_DURATION_RECORDS_KEY =
-            "auto_delete_duration_records_key";
+public class DailyCleanupJob {
+
     private static final String TAG = "HealthConnectAutoDelete";
 
-    /** Gets auto delete period for automatically deleting record entries */
-    public static int getRecordRetentionPeriodInDays(PreferenceHelper preferenceHelper) {
-        String result = preferenceHelper.getPreference(AUTO_DELETE_DURATION_RECORDS_KEY);
+    private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
+    private final PreferencesManager mPreferencesManager;
+    private final AppInfoHelper mAppInfoHelper;
+    private final TransactionManager mTransactionManager;
+    private final AccessLogsHelper mAccessLogsHelper;
+    private final ActivityDateHelper mActivityDateHelper;
 
-        if (result == null) return 0;
-        return Integer.parseInt(result);
-    }
-
-    /** Sets auto delete period for automatically deleting record entries */
-    public static void setRecordRetentionPeriodInDays(int days, PreferenceHelper preferenceHelper) {
-        preferenceHelper.insertOrReplacePreference(
-                AUTO_DELETE_DURATION_RECORDS_KEY, String.valueOf(days));
+    public DailyCleanupJob(
+            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
+            PreferencesManager preferencesManager,
+            AppInfoHelper appInfoHelper,
+            TransactionManager transactionManager,
+            AccessLogsHelper accessLogsHelper,
+            ActivityDateHelper activityDateHelper) {
+        mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
+        mPreferencesManager = preferencesManager;
+        mAppInfoHelper = appInfoHelper;
+        mTransactionManager = transactionManager;
+        mAccessLogsHelper = accessLogsHelper;
+        mActivityDateHelper = activityDateHelper;
     }
 
     /** Starts the Auto Deletion process. */
-    public static void startAutoDelete(
-            Context context,
-            HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
-            PreferenceHelper preferenceHelper,
-            AppInfoHelper appInfoHelper,
-            TransactionManager transactionManager,
-            AccessLogsHelper accessLogsHelper) {
+    public void startDailyCleanup() {
         try {
             // Only do transactional operations here - as this job might get cancelled for several
             // reasons, such as: User switch, low battery etc.
-            deleteStaleRecordEntries(preferenceHelper, transactionManager, accessLogsHelper);
-            deleteStaleChangeLogEntries(transactionManager);
-            deleteStaleAccessLogEntries(transactionManager);
+            deleteStaleRecordEntries();
+            deleteStaleChangeLogEntries();
+            deleteStaleAccessLogEntries();
             // Update the recordTypesUsed by packages if required after the deletion of records.
-            appInfoHelper.syncAppInfoRecordTypesUsed();
+            mAppInfoHelper.syncAppInfoRecordTypesUsed();
             // Re-sync activity dates table
-            ActivityDateHelper.reSyncForAllRecords();
+            mActivityDateHelper.reSyncForAllRecords();
             // Sync health data priority list table
-            healthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(context);
+            mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable();
         } catch (Exception e) {
             Slog.e(TAG, "Auto delete run failed", e);
             // Don't rethrow as that will crash system_server
         }
     }
 
-    private static void deleteStaleRecordEntries(
-            PreferenceHelper preferenceHelper,
-            TransactionManager transactionManager,
-            AccessLogsHelper accessLogsHelper) {
-        String recordAutoDeletePeriodString =
-                preferenceHelper.getPreference(AUTO_DELETE_DURATION_RECORDS_KEY);
-        int recordAutoDeletePeriod =
-                recordAutoDeletePeriodString == null
-                        ? 0
-                        : Integer.parseInt(recordAutoDeletePeriodString);
+    private void deleteStaleRecordEntries() {
+        int recordAutoDeletePeriod = mPreferencesManager.getRecordRetentionPeriodInDays();
         if (recordAutoDeletePeriod != 0) {
             // 0 represents that no period is set,to delete only if not 0 else don't do anything
             List<DeleteTableRequest> deleteTableRequests = new ArrayList<>();
-            RecordHelperProvider.getRecordHelpers()
-                    .values()
+            InternalHealthConnectMappings.getInstance()
+                    .getRecordHelpers()
                     .forEach(
                             (recordHelper) -> {
                                 DeleteTableRequest request =
@@ -107,10 +98,10 @@
                                 deleteTableRequests.add(request);
                             });
             try {
-                transactionManager.deleteAll(
+                mTransactionManager.deleteAllRecords(
                         new DeleteTransactionRequest(deleteTableRequests),
                         /* shouldRecordDeleteAccessLogs= */ false,
-                        accessLogsHelper);
+                        mAccessLogsHelper);
             } catch (Exception exception) {
                 Slog.e(TAG, "Auto delete for records failed", exception);
                 // Don't rethrow as that will crash system_server
@@ -118,9 +109,9 @@
         }
     }
 
-    private static void deleteStaleChangeLogEntries(TransactionManager transactionManager) {
+    private void deleteStaleChangeLogEntries() {
         try {
-            transactionManager.deleteWithoutChangeLogs(
+            mTransactionManager.deleteWithoutChangeLogs(
                     List.of(
                             ChangeLogsHelper.getDeleteRequestForAutoDelete(),
                             ChangeLogsRequestHelper.getDeleteRequestForAutoDelete()));
@@ -130,9 +121,9 @@
         }
     }
 
-    private static void deleteStaleAccessLogEntries(TransactionManager transactionManager) {
+    private void deleteStaleAccessLogEntries() {
         try {
-            transactionManager.deleteWithoutChangeLogs(
+            mTransactionManager.deleteWithoutChangeLogs(
                     List.of(AccessLogsHelper.getDeleteRequestForAutoDelete()));
         } catch (Exception exception) {
             Slog.e(TAG, "Auto delete for Access logs failed", exception);
diff --git a/service/java/com/android/server/healthconnect/storage/DatabaseUpgradeHelper.java b/service/java/com/android/server/healthconnect/storage/DatabaseUpgradeHelper.java
index d786815..9068d63 100644
--- a/service/java/com/android/server/healthconnect/storage/DatabaseUpgradeHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/DatabaseUpgradeHelper.java
@@ -16,42 +16,48 @@
 
 package com.android.server.healthconnect.storage;
 
-import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION;
-import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION;
-import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_PLANNED_EXERCISE_SESSION;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_SKIN_TEMPERATURE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_UNKNOWN;
 
+import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_ACTIVITY_INTENSITY;
+import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_ECOSYSTEM_METRICS;
 import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_GENERATED_LOCAL_TIME;
 import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_MINDFULNESS_SESSION;
+import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_PERSONAL_HEALTH_RECORD;
 import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_PLANNED_EXERCISE_SESSIONS;
 import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_SKIN_TEMPERATURE;
 import static com.android.healthfitness.flags.DatabaseVersions.MIN_SUPPORTED_DB_VERSION;
+import static com.android.server.healthconnect.storage.HealthConnectDatabase.createTable;
 import static com.android.server.healthconnect.storage.TransactionManager.runAsTransaction;
+import static com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper.getAlterTableRequestForPhrAccessLogs;
 import static com.android.server.healthconnect.storage.datatypehelpers.PlannedExerciseSessionRecordHelper.PLANNED_EXERCISE_SESSION_RECORD_TABLE_NAME;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.checkTableExists;
 
-import android.database.DatabaseUtils;
 import android.database.sqlite.SQLiteDatabase;
 
 import com.android.healthfitness.flags.Flags;
 import com.android.server.healthconnect.migration.PriorityMigrationHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ActivityDateHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ActivityIntensityRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ExerciseSessionRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MigrationEntityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MindfulnessSessionRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PlannedExerciseSessionRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ReadAccessLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.SkinTemperatureRecordHelper;
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
 import com.android.server.healthconnect.storage.request.DropTableRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -64,22 +70,25 @@
     private static final String SQLITE_MASTER_TABLE_NAME = "sqlite_master";
 
     private static final Upgrader UPGRADE_TO_GENERATED_LOCAL_TIME =
-            db -> forEachRecordHelper(it -> it.applyGeneratedLocalTimeUpgrade(db));
+            db -> forEachInitialRecordHelper(it -> it.applyGeneratedLocalTimeUpgrade(db));
 
     private static final Upgrader UPGRADE_TO_SKIN_TEMPERATURE =
-            db ->
-                    DatabaseUpgradeHelper.<SkinTemperatureRecordHelper>getRecordHelper(
-                                    RECORD_TYPE_SKIN_TEMPERATURE)
-                            .applySkinTemperatureUpgrade(db);
+            db -> new SkinTemperatureRecordHelper().applySkinTemperatureUpgrade(db);
 
     private static final Upgrader UPGRADE_TO_PLANNED_EXERCISE_SESSIONS =
             DatabaseUpgradeHelper::applyPlannedExerciseDatabaseUpgrade;
 
     private static final Upgrader UPGRADE_TO_MINDFULNESS_SESSION =
-            db ->
-                    DatabaseUpgradeHelper.<MindfulnessSessionRecordHelper>getRecordHelper(
-                                    RECORD_TYPE_MINDFULNESS_SESSION)
-                            .applyMindfulnessSessionUpgrade(db);
+            db -> new MindfulnessSessionRecordHelper().applyMindfulnessSessionUpgrade(db);
+
+    private static final Upgrader UPGRADE_TO_PERSONAL_HEALTH_RECORD =
+            DatabaseUpgradeHelper::applyPersonalHealthRecordDatabaseUpgrade;
+
+    private static final Upgrader UPGRADE_TO_ACTIVITY_INTENSITY =
+            db -> createTable(db, new ActivityIntensityRecordHelper().getCreateTableRequest());
+
+    private static final Upgrader UPGRADE_TO_ECOSYSTEM_METRICS =
+            db -> createTable(db, ReadAccessLogsHelper.getCreateTableRequest());
 
     /**
      * A list of db version -> Upgrader to upgrade the db from the previous version to the version.
@@ -92,7 +101,10 @@
                             DB_VERSION_SKIN_TEMPERATURE, UPGRADE_TO_SKIN_TEMPERATURE,
                             DB_VERSION_PLANNED_EXERCISE_SESSIONS,
                                     UPGRADE_TO_PLANNED_EXERCISE_SESSIONS,
-                            DB_VERSION_MINDFULNESS_SESSION, UPGRADE_TO_MINDFULNESS_SESSION));
+                            DB_VERSION_MINDFULNESS_SESSION, UPGRADE_TO_MINDFULNESS_SESSION,
+                            DB_VERSION_PERSONAL_HEALTH_RECORD, UPGRADE_TO_PERSONAL_HEALTH_RECORD,
+                            DB_VERSION_ACTIVITY_INTENSITY, UPGRADE_TO_ACTIVITY_INTENSITY,
+                            DB_VERSION_ECOSYSTEM_METRICS, UPGRADE_TO_ECOSYSTEM_METRICS));
 
     /**
      * Applies db upgrades to bring the current schema to the latest supported version.
@@ -108,34 +120,47 @@
      * <p>See go/hc-handling-database-upgrades for things to be taken care of when upgrading.
      */
     static void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-        if (isUnsupported(oldVersion)) {
+        if (isUnsupportedDbVersion(oldVersion)) {
             dropInitialSetOfTables(db);
         }
         if (oldVersion < MIN_SUPPORTED_DB_VERSION) {
             createTablesForMinSupportedVersion(db);
+            // Sets version to include local time upgrade as the table create steps includes
+            // these columns.
+            oldVersion = DB_VERSION_GENERATED_LOCAL_TIME;
         }
+        final int effectiveOldVersion = oldVersion;
 
         if (Flags.infraToGuardDbChanges()) {
             UPGRADERS.entrySet().stream()
-                    .filter(entry -> shouldUpgrade(entry.getKey(), oldVersion, newVersion))
+                    .filter(entry -> shouldUpgrade(entry.getKey(), effectiveOldVersion, newVersion))
                     .forEach(entry -> entry.getValue().upgrade(db));
         } else {
-            if (oldVersion < DB_VERSION_GENERATED_LOCAL_TIME) {
+            if (effectiveOldVersion < DB_VERSION_GENERATED_LOCAL_TIME) {
                 UPGRADE_TO_GENERATED_LOCAL_TIME.upgrade(db);
             }
-            if (oldVersion < DB_VERSION_SKIN_TEMPERATURE) {
+            if (effectiveOldVersion < DB_VERSION_SKIN_TEMPERATURE) {
                 UPGRADE_TO_SKIN_TEMPERATURE.upgrade(db);
             }
-            if (oldVersion < DB_VERSION_PLANNED_EXERCISE_SESSIONS) {
+            if (effectiveOldVersion < DB_VERSION_PLANNED_EXERCISE_SESSIONS) {
                 UPGRADE_TO_PLANNED_EXERCISE_SESSIONS.upgrade(db);
             }
-            if (oldVersion < DB_VERSION_MINDFULNESS_SESSION) {
+            if (effectiveOldVersion < DB_VERSION_MINDFULNESS_SESSION) {
                 UPGRADE_TO_MINDFULNESS_SESSION.upgrade(db);
             }
+            if (shouldUpgrade(DB_VERSION_PERSONAL_HEALTH_RECORD, effectiveOldVersion, newVersion)) {
+                UPGRADE_TO_PERSONAL_HEALTH_RECORD.upgrade(db);
+            }
+            if (effectiveOldVersion < DB_VERSION_ACTIVITY_INTENSITY) {
+                UPGRADE_TO_ACTIVITY_INTENSITY.upgrade(db);
+            }
+            if (effectiveOldVersion < DB_VERSION_ECOSYSTEM_METRICS) {
+                UPGRADE_TO_ECOSYSTEM_METRICS.upgrade(db);
+            }
         }
     }
 
-    private static boolean isUnsupported(int version) {
+    private static boolean isUnsupportedDbVersion(int version) {
         return version != 0 && version < MIN_SUPPORTED_DB_VERSION;
     }
 
@@ -145,7 +170,7 @@
 
     private static void createTablesForMinSupportedVersion(SQLiteDatabase db) {
         for (CreateTableRequest createTableRequest : getInitialCreateTableRequests()) {
-            HealthConnectDatabase.createTable(db, createTableRequest);
+            createTable(db, createTableRequest);
         }
     }
 
@@ -162,15 +187,7 @@
     private static List<CreateTableRequest> getInitialCreateTableRequests() {
         List<CreateTableRequest> requests = new ArrayList<>();
 
-        // Add all records that were part of the initial schema. This is everything added before
-        // SKIN_TEMPERATURE.
-        Map<Integer, RecordHelper<?>> recordHelperMap = RecordHelperProvider.getRecordHelpers();
-        recordHelperMap.entrySet().stream()
-                .filter(
-                        entry ->
-                                entry.getKey() > RECORD_TYPE_UNKNOWN
-                                        && entry.getKey() < RECORD_TYPE_SKIN_TEMPERATURE)
-                .forEach(entry -> requests.add(entry.getValue().getCreateTableRequest()));
+        forEachInitialRecordHelper(helper -> requests.add(helper.getCreateTableRequest()));
 
         requests.add(DeviceInfoHelper.getCreateTableRequest());
         requests.add(AppInfoHelper.getCreateTableRequest());
@@ -186,32 +203,33 @@
         return requests;
     }
 
-    private static void forEachRecordHelper(Consumer<RecordHelper<?>> action) {
-        RecordHelperProvider.getRecordHelpers().values().forEach(action);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> T getRecordHelper(int recordTypeIdentifier) {
-        return (T) RecordHelperProvider.getRecordHelper(recordTypeIdentifier);
+    // Retuurns all records that were part of the initial schema. This is everything added
+    // before SKIN_TEMPERATURE.
+    private static void forEachInitialRecordHelper(Consumer<RecordHelper<?>> action) {
+        InternalHealthConnectMappings.getInstance().getRecordHelpers().stream()
+                .filter(
+                        helper ->
+                                helper.getRecordIdentifier() > RECORD_TYPE_UNKNOWN
+                                        && helper.getRecordIdentifier()
+                                                < RECORD_TYPE_SKIN_TEMPERATURE)
+                .forEach(action);
     }
 
     private static void applyPlannedExerciseDatabaseUpgrade(SQLiteDatabase db) {
-        if (doesTableAlreadyExist(db, PLANNED_EXERCISE_SESSION_RECORD_TABLE_NAME)) {
+        if (checkTableExists(db, PLANNED_EXERCISE_SESSION_RECORD_TABLE_NAME)) {
             // Upgrade has already been applied. Return early.
             // This is necessary as the ALTER TABLE ... ADD COLUMN statements below are not
             // idempotent, as SQLite does not support ADD COLUMN IF NOT EXISTS.
             return;
         }
-        PlannedExerciseSessionRecordHelper recordHelper =
-                getRecordHelper(RECORD_TYPE_PLANNED_EXERCISE_SESSION);
-        HealthConnectDatabase.createTable(db, recordHelper.getCreateTableRequest());
+        PlannedExerciseSessionRecordHelper recordHelper = new PlannedExerciseSessionRecordHelper();
+        createTable(db, recordHelper.getCreateTableRequest());
         executeSqlStatements(
                 db,
                 recordHelper
                         .getAlterTableRequestForPlannedExerciseFeature()
                         .getAlterTableAddColumnsCommands());
-        ExerciseSessionRecordHelper exerciseRecordHelper =
-                getRecordHelper(RECORD_TYPE_EXERCISE_SESSION);
+        ExerciseSessionRecordHelper exerciseRecordHelper = new ExerciseSessionRecordHelper();
         executeSqlStatements(
                 db,
                 exerciseRecordHelper
@@ -219,21 +237,25 @@
                         .getAlterTableAddColumnsCommands());
     }
 
+    private static void applyPersonalHealthRecordDatabaseUpgrade(SQLiteDatabase db) {
+        if (checkTableExists(db, MedicalResourceHelper.getMainTableName())) {
+            // Upgrade has already been applied. Return early.
+            // This is necessary as the ALTER TABLE ... ADD COLUMN statements below are not
+            // idempotent, as SQLite does not support ADD COLUMN IF NOT EXISTS.
+            return;
+        }
+
+        MedicalDataSourceHelper.onInitialUpgrade(db);
+        MedicalResourceHelper.onInitialUpgrade(db);
+        DatabaseUpgradeHelper.executeSqlStatements(
+                db, getAlterTableRequestForPhrAccessLogs().getAlterTableAddColumnsCommands());
+    }
+
     /** Executes a list of SQL statements one after another, in a transaction. */
     public static void executeSqlStatements(SQLiteDatabase db, List<String> statements) {
         runAsTransaction(db, unused -> statements.forEach(db::execSQL));
     }
 
-    private static boolean doesTableAlreadyExist(SQLiteDatabase db, String tableName) {
-        long numEntries =
-                DatabaseUtils.queryNumEntries(
-                        db,
-                        SQLITE_MASTER_TABLE_NAME,
-                        /* selection= */ "type = 'table' AND name == '" + tableName + "'",
-                        /* selectionArgs= */ null);
-        return numEntries > 0;
-    }
-
     /** Interface to implement upgrade actions from one db version to the next. */
     private interface Upgrader {
         void upgrade(SQLiteDatabase db);
diff --git a/service/java/com/android/server/healthconnect/storage/DevelopmentDatabaseHelper.java b/service/java/com/android/server/healthconnect/storage/DevelopmentDatabaseHelper.java
index 980fa9d..6370803 100644
--- a/service/java/com/android/server/healthconnect/storage/DevelopmentDatabaseHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/DevelopmentDatabaseHelper.java
@@ -20,17 +20,10 @@
 import android.database.SQLException;
 import android.database.sqlite.SQLiteDatabase;
 import android.util.Log;
-import android.util.Pair;
 
 import com.android.healthfitness.flags.Flags;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
-import com.android.server.healthconnect.storage.request.AlterTableRequest;
-
-import java.util.List;
+import com.android.server.healthconnect.storage.datatypehelpers.BackupChangeTokenHelper;
 
 /**
  * Code to manage development features of the Health Connect database before they are ready for
@@ -49,7 +42,7 @@
      * The current version number for the development database features. Increment this whenever you
      * make a breaking schema change to a development feature.
      */
-    @VisibleForTesting static final int CURRENT_VERSION = 8;
+    @VisibleForTesting static final int CURRENT_VERSION = 10;
 
     /** The name of the table to store development specific key value pairs. */
     private static final String SETTINGS_TABLE_NAME = "development_database_settings";
@@ -95,7 +88,15 @@
 
         // Beyond this point are the development database changes
         dropAndCreateDevelopmentSettingsTable(db, CURRENT_VERSION);
-        phrForceUpdate(db);
+
+        // Code for under development schema changes goes in this method but below this comment
+        // TODO: b/375150124 - remove upgrade logic after DB schema is finalized
+        backupTokenForceUpgrade(db);
+    }
+
+    private static void backupTokenForceUpgrade(SQLiteDatabase db) {
+        dropTableIfExists(db, BackupChangeTokenHelper.getTableName());
+        BackupChangeTokenHelper.applyBackupTokenUpgrade(db);
     }
 
     @VisibleForTesting
@@ -117,38 +118,6 @@
         dropTableIfExists(db, SETTINGS_TABLE_NAME);
     }
 
-    private static void phrForceUpdate(SQLiteDatabase db) {
-        dropTableIfExists(db, MedicalResourceIndicesHelper.getTableName());
-        dropTableIfExists(db, MedicalResourceHelper.getMainTableName());
-        dropTableIfExists(db, MedicalDataSourceHelper.getMainTableName());
-        MedicalDataSourceHelper.onInitialUpgrade(db);
-        MedicalResourceHelper.onInitialUpgrade(db);
-        addPhrColumnsToAccessLogsTable(db);
-    }
-
-    private static void addPhrColumnsToAccessLogsTable(SQLiteDatabase db) {
-        // Alter the table to add new columns.
-        // Adding columns is not idempotent. When this is moved to production, this code
-        // should be guarded by checking the existence of a PHR table.
-        // For now in development, just catch any SQLite exception, and ignore anything with
-        // duplicate column name
-        List<Pair<String, String>> columns = AccessLogsHelper.getPhrAccessLogsColumnInfo();
-        for (Pair<String, String> columnInfo : columns) {
-            try {
-                DatabaseUpgradeHelper.executeSqlStatements(
-                        db,
-                        new AlterTableRequest(AccessLogsHelper.TABLE_NAME, List.of(columnInfo))
-                                .getAlterTableAddColumnsCommands());
-            } catch (SQLException ex) {
-                String message = ex.getMessage();
-                // swallow any duplicate column exceptions.
-                if (message == null || !message.contains("duplicate column name")) {
-                    throw ex;
-                }
-            }
-        }
-    }
-
     @VisibleForTesting
     static int getOldVersionIfExists(SQLiteDatabase db) {
         if (!settingsTableExists(db)) {
diff --git a/service/java/com/android/server/healthconnect/storage/HealthConnectDatabase.java b/service/java/com/android/server/healthconnect/storage/HealthConnectDatabase.java
index 2610df6..97b2e67 100644
--- a/service/java/com/android/server/healthconnect/storage/HealthConnectDatabase.java
+++ b/service/java/com/android/server/healthconnect/storage/HealthConnectDatabase.java
@@ -18,11 +18,12 @@
 
 import static com.android.healthfitness.flags.AconfigFlagHelper.getDbVersion;
 
-import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.util.Log;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
 
 import java.io.File;
@@ -36,14 +37,14 @@
 public final class HealthConnectDatabase extends SQLiteOpenHelper {
     private static final String TAG = "HealthConnectDatabase";
 
-    private static final String DEFAULT_DATABASE_NAME = "healthconnect.db";
-    private final Context mContext;
+    @VisibleForTesting public static final String DEFAULT_DATABASE_NAME = "healthconnect.db";
+    private final StorageContext mContext;
 
-    public HealthConnectDatabase(Context context) {
+    public HealthConnectDatabase(StorageContext context) {
         this(context, DEFAULT_DATABASE_NAME);
     }
 
-    public HealthConnectDatabase(Context context, String databaseName) {
+    public HealthConnectDatabase(StorageContext context, String databaseName) {
         super(context, databaseName, null, getDbVersion());
         mContext = context;
     }
diff --git a/service/java/com/android/server/healthconnect/storage/StorageContext.java b/service/java/com/android/server/healthconnect/storage/StorageContext.java
new file mode 100644
index 0000000..d6a0ae0
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/storage/StorageContext.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.database.sqlite.SQLiteDatabase;
+import android.os.UserHandle;
+import android.util.Slog;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.server.healthconnect.utils.FilesUtil;
+
+import java.io.File;
+
+/**
+ * {@link Context} for accessing storage directory for Health Connect.
+ *
+ * <p>It creates a different directory per user on the device, and provides data separation between
+ * users.
+ *
+ * <p>This is used to initialize {@link HealthConnectDatabase} to perform database operations.
+ *
+ * <p>Use cases that require creating an additional database (e.g. D2D, export/import) can pass in a
+ * sub-directory to create the database in that directory.
+ *
+ * @hide
+ */
+public final class StorageContext extends ContextWrapper {
+
+    private static final String TAG = "HealthConnectDatabaseContext";
+
+    private final File mDatabaseDir;
+
+    private StorageContext(
+            Context context, UserHandle userHandle, @Nullable String databaseDirName) {
+        super(context.createContextAsUser(userHandle, 0));
+
+        if (databaseDirName == null) {
+            mDatabaseDir = FilesUtil.getDataSystemCeHCDirectoryForUser(userHandle.getIdentifier());
+        } else {
+            File hcDirectory =
+                    FilesUtil.getDataSystemCeHCDirectoryForUser(userHandle.getIdentifier());
+            mDatabaseDir = new File(hcDirectory, databaseDirName);
+        }
+    }
+
+    /**
+     * Returns the data directory where files are stored.
+     *
+     * <p>HealthConnect stores files in the directory returned by this method, and doesn't use the
+     * files and cache sub-directories.
+     */
+    @Override
+    public File getDataDir() {
+        mDatabaseDir.mkdirs();
+        return mDatabaseDir;
+    }
+
+    @Override
+    public boolean deleteDatabase(String name) {
+        if (Flags.d2dFileDeletionBugFix()) {
+            try {
+                File f = getDatabasePath(name);
+                return SQLiteDatabase.deleteDatabase(f);
+            } catch (Exception e) {
+                Slog.e(TAG, "Failed to delete database = " + getDatabasePath(name));
+            }
+            return false;
+        } else {
+            return super.deleteDatabase(name);
+        }
+    }
+
+    /** Returns the file of the staged database with the given name */
+    @Override
+    public File getDatabasePath(String name) {
+        return new File(getDataDir(), name);
+    }
+
+    /** Factory method */
+    public static StorageContext create(Context context, UserHandle userHandle) {
+        return create(context, userHandle, null);
+    }
+
+    /** Factory method */
+    public static StorageContext create(
+            Context context, UserHandle userHandle, @Nullable String databaseDirName) {
+        return new StorageContext(context, userHandle, databaseDirName);
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/storage/TransactionManager.java b/service/java/com/android/server/healthconnect/storage/TransactionManager.java
index d4d7304..c76cefa 100644
--- a/service/java/com/android/server/healthconnect/storage/TransactionManager.java
+++ b/service/java/com/android/server/healthconnect/storage/TransactionManager.java
@@ -30,7 +30,6 @@
 
 import android.annotation.Nullable;
 import android.content.ContentValues;
-import android.content.Context;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
 import android.database.sqlite.SQLiteConstraintException;
@@ -40,14 +39,10 @@
 import android.health.connect.HealthConnectException;
 import android.health.connect.PageTokenWrapper;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.os.UserHandle;
 import android.util.Pair;
 import android.util.Slog;
 
-import androidx.annotation.VisibleForTesting;
-
 import com.android.healthfitness.flags.Flags;
-import com.android.server.healthconnect.HealthConnectUserContext;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
@@ -60,7 +55,7 @@
 import com.android.server.healthconnect.storage.request.ReadTransactionRequest;
 import com.android.server.healthconnect.storage.request.UpsertTableRequest;
 import com.android.server.healthconnect.storage.request.UpsertTransactionRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 import com.android.server.healthconnect.storage.utils.TableColumnPair;
 
@@ -71,10 +66,9 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.BiConsumer;
 
 /**
  * A class to handle all the DB transaction request from the clients. {@link TransactionManager}
@@ -85,31 +79,25 @@
  */
 public final class TransactionManager {
     private static final String TAG = "HealthConnectTransactionMan";
-    private static final ConcurrentHashMap<UserHandle, HealthConnectDatabase>
-            mUserHandleToDatabaseMap = new ConcurrentHashMap<>();
-
-    @Nullable private static volatile TransactionManager sTransactionManager;
 
     private volatile HealthConnectDatabase mHealthConnectDatabase;
-    private UserHandle mUserHandle;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings;
 
-    private TransactionManager(HealthConnectUserContext context) {
-        mHealthConnectDatabase = new HealthConnectDatabase(context);
-        mUserHandleToDatabaseMap.put(context.getCurrentUserHandle(), mHealthConnectDatabase);
-        mUserHandle = context.getCurrentUserHandle();
+    public TransactionManager(
+            StorageContext storageContext,
+            InternalHealthConnectMappings internalHealthConnectMappings) {
+        mHealthConnectDatabase = new HealthConnectDatabase(storageContext);
+        mInternalHealthConnectMappings = internalHealthConnectMappings;
     }
 
-    public void onUserUnlocked(HealthConnectUserContext healthConnectUserContext) {
-        if (!mUserHandleToDatabaseMap.containsKey(
-                healthConnectUserContext.getCurrentUserHandle())) {
-            mUserHandleToDatabaseMap.put(
-                    healthConnectUserContext.getCurrentUserHandle(),
-                    new HealthConnectDatabase(healthConnectUserContext));
-        }
+    /** Called when we are switching users. */
+    public void onUserSwitching() {
+        mHealthConnectDatabase.close();
+    }
 
-        mHealthConnectDatabase =
-                mUserHandleToDatabaseMap.get(healthConnectUserContext.getCurrentUserHandle());
-        mUserHandle = healthConnectUserContext.getCurrentUserHandle();
+    /** Setup the transaction manager for the new user. */
+    public void onUserUnlocked(StorageContext storageContext) {
+        mHealthConnectDatabase = new HealthConnectDatabase(storageContext);
     }
 
     /**
@@ -119,9 +107,10 @@
      * @return List of uids of the inserted {@link RecordInternal}, in the same order as they
      *     presented to {@code request}.
      */
-    public List<String> insertAll(
+    // TODO(b/382009199): Refactor this class so that the helpers can be send in the constructor.
+    public List<String> insertAllRecords(
             AppInfoHelper appInfoHelper,
-            AccessLogsHelper accessLogsHelper,
+            @Nullable AccessLogsHelper accessLogsHelper,
             UpsertTransactionRequest request)
             throws SQLiteException {
         if (Constants.DEBUG) {
@@ -146,33 +135,76 @@
                                         upsertRequest.getRecordInternal().getPackageName()),
                                 upsertRequest,
                                 modificationChangelogs);
-                        insertOrReplaceRecord(db, upsertRequest);
+                        if (request.shouldPreferNewRecord()) {
+                            insertOrReplaceOnConflict(db, upsertRequest);
+                        } else {
+                            insertOrIgnoreOnConflict(db, upsertRequest);
+                        }
                     }
-
                     for (UpsertTableRequest insertRequestsForChangeLog :
                             insertionChangelogs.getUpsertTableRequests()) {
-                        insertRecord(db, insertRequestsForChangeLog);
+                        insert(db, insertRequestsForChangeLog);
                     }
                     for (UpsertTableRequest modificationChangelog :
                             modificationChangelogs.getUpsertTableRequests()) {
-                        insertRecord(db, modificationChangelog);
+                        insert(db, modificationChangelog);
                     }
 
-                    accessLogsHelper.recordUpsertAccessLog(
-                            db, request.getPackageName(), request.getRecordTypeIds());
+                    if (request.shouldGenerateAccessLogs()) {
+                        Objects.requireNonNull(accessLogsHelper)
+                                .recordUpsertAccessLog(
+                                        db,
+                                        Objects.requireNonNull(request.getPackageName()),
+                                        request.getRecordTypeIds());
+                    }
                     return request.getUUIdsInOrder();
                 });
     }
 
     /**
-     * Ignores if a record is already present. This does not generate changelogs and should only be
-     * used for backup and restore.
+     * Inserts record into the table in {@code request} into the HealthConnect database.
+     *
+     * <p>NOTE: PLEASE ONLY USE THIS FUNCTION IF YOU WANT TO INSERT A SINGLE RECORD PER API. PLEASE
+     * DON'T USE THIS FUNCTION INSIDE A FOR LOOP OR REPEATEDLY: The reason is that this function
+     * tries to insert a record inside its own transaction and if you are trying to insert multiple
+     * things using this method in the same api call, they will all get inserted in their separate
+     * transactions and will be less performant. If at all, the requirement is to insert them in
+     * different transactions, as they are not related to each, then this method can be used.
+     *
+     * @param request an insert request.
+     * @return rowId of the inserted record.
      */
-    public void insertAll(List<UpsertTableRequest> requests) throws SQLiteException {
-        runAsTransaction(
-                db -> {
-                    requests.forEach(request -> insertOrIgnore(db, request));
-                });
+    public long insert(UpsertTableRequest request) {
+        final SQLiteDatabase db = getWritableDb();
+        return insert(db, request);
+    }
+
+    /**
+     * Inserts record into the table in {@code request} into the HealthConnect database using the
+     * given {@link SQLiteDatabase}.
+     *
+     * <p>Assumes that caller will be closing {@code db} and handling the transaction if required.
+     *
+     * <p>NOTE: PLEASE ONLY USE THIS FUNCTION IF YOU WANT TO INSERT A SINGLE RECORD PER API. PLEASE
+     * DON'T USE THIS FUNCTION INSIDE A FOR LOOP OR REPEATEDLY: The reason is that this function
+     * tries to insert a record inside its own transaction and if you are trying to insert multiple
+     * things using this method in the same api call, they will all get inserted in their separate
+     * transactions and will be less performant. If at all, the requirement is to insert them in
+     * different transactions, as they are not related to each, then this method can be used.
+     *
+     * @param db a {@link SQLiteDatabase}.
+     * @param request an insert request.
+     * @return rowId of the inserted record.
+     */
+    public long insert(SQLiteDatabase db, UpsertTableRequest request) {
+        long rowId = db.insertOrThrow(request.getTable(), null, request.getContentValues());
+        request.getChildTableRequests()
+                .forEach(childRequest -> insert(db, childRequest.withParentKey(rowId)));
+        for (String postUpsertCommand : request.getPostUpsertCommands()) {
+            db.execSQL(postUpsertCommand);
+        }
+
+        return rowId;
     }
 
     /**
@@ -180,20 +212,73 @@
      *
      * @param upsertTableRequests a list of insert table requests.
      */
-    public void insertOrReplaceAll(List<UpsertTableRequest> upsertTableRequests)
+    public void insertOrReplaceOnConflict(List<UpsertTableRequest> upsertTableRequests)
             throws SQLiteException {
-        insertAll(upsertTableRequests, this::insertOrReplaceRecord);
+        runAsTransaction(
+                db -> {
+                    upsertTableRequests.forEach(request -> insertOrReplaceOnConflict(db, request));
+                });
     }
 
     /**
-     * Inserts or replaces all the {@link UpsertTableRequest} into the given database.
+     * Inserts (or updates if the row exists) record into the table in {@code request} into the
+     * HealthConnect database.
      *
-     * @param db a {@link SQLiteDatabase}.
-     * @param upsertTableRequests a list of insert table requests.
+     * <p>NOTE: PLEASE ONLY USE THIS FUNCTION IF YOU WANT TO UPSERT A SINGLE RECORD. PLEASE DON'T
+     * USE THIS FUNCTION INSIDE A FOR LOOP OR REPEATEDLY: The reason is that this function tries to
+     * insert a record out of a transaction and if you are trying to insert a record before or after
+     * opening up a transaction please rethink if you really want to use this function.
+     *
+     * <p>NOTE: INSERT + WITH_CONFLICT_REPLACE only works on unique columns, else in case of
+     * conflict it leads to abort of the transaction.
+     *
+     * @param request an insert request.
+     * @return rowId of the inserted or updated record.
      */
-    public void insertOrReplaceAll(
-            SQLiteDatabase db, List<UpsertTableRequest> upsertTableRequests) {
-        insertRequests(db, upsertTableRequests, this::insertOrReplaceRecord);
+    public long insertOrReplaceOnConflict(UpsertTableRequest request) {
+        final SQLiteDatabase db = getWritableDb();
+        return insertOrReplaceOnConflict(db, request);
+    }
+
+    /**
+     * Assumes that caller will be closing {@code db}. Returns -1 in case the update was triggered
+     * and reading the row_id was not supported on the table.
+     *
+     * <p>Note: This function updates rather than the traditional delete + insert in SQLite
+     */
+    private long insertOrReplaceOnConflict(SQLiteDatabase db, UpsertTableRequest request) {
+        try {
+            if (request.getUniqueColumnsCount() == 0) {
+                throw new RuntimeException(
+                        "insertOrReplaceRecord should only be called with unique columns set");
+            }
+
+            long rowId =
+                    db.insertWithOnConflict(
+                            request.getTable(),
+                            null,
+                            request.getContentValues(),
+                            SQLiteDatabase.CONFLICT_FAIL);
+            insertChildTableRequest(request, rowId, db);
+            for (String postUpsertCommand : request.getPostUpsertCommands()) {
+                db.execSQL(postUpsertCommand);
+            }
+
+            return rowId;
+        } catch (SQLiteConstraintException e) {
+            try (Cursor cursor = db.rawQuery(request.getReadRequest().getReadCommand(), null)) {
+                if (!cursor.moveToFirst()) {
+                    throw new HealthConnectException(
+                            ERROR_INTERNAL, "Conflict found, but couldn't read the entry.", e);
+                }
+
+                long updateResult = updateEntriesIfRequired(db, request, cursor);
+                for (String postUpsertCommand : request.getPostUpsertCommands()) {
+                    db.execSQL(postUpsertCommand);
+                }
+                return updateResult;
+            }
+        }
     }
 
     /**
@@ -205,11 +290,37 @@
     public void insertOrIgnoreOnConflict(List<UpsertTableRequest> upsertTableRequests) {
         runAsTransaction(
                 db -> {
-                    upsertTableRequests.forEach(request -> insertOrIgnore(db, request));
+                    upsertTableRequests.forEach(request -> insertOrIgnoreOnConflict(db, request));
                 });
     }
 
     /**
+     * Inserts the provided {@link UpsertTableRequest} into the database.
+     *
+     * <p>Assumes that caller will be closing {@code db} and handling the transaction if required.
+     *
+     * @return the row ID of the newly inserted row or <code>-1</code> if an error occurred.
+     */
+    public long insertOrIgnoreOnConflict(SQLiteDatabase db, UpsertTableRequest request) {
+        long rowId =
+                db.insertWithOnConflict(
+                        request.getTable(),
+                        null,
+                        request.getContentValues(),
+                        SQLiteDatabase.CONFLICT_IGNORE);
+
+        if (rowId != -1) {
+            request.getChildTableRequests()
+                    .forEach(childRequest -> insert(db, childRequest.withParentKey(rowId)));
+            for (String postUpsertCommand : request.getPostUpsertCommands()) {
+                db.execSQL(postUpsertCommand);
+            }
+        }
+
+        return rowId;
+    }
+
+    /**
      * Deletes all the {@link RecordInternal} in {@code request} into the HealthConnect database.
      *
      * <p>NOTE: Please don't add logic to explicitly delete child table entries here as they should
@@ -217,9 +328,9 @@
      *
      * @param request a delete request.
      */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public int deleteAll(
+    public int deleteAllRecords(
             DeleteTransactionRequest request,
+            // TODO(b/382009199): Move this to the request.
             boolean shouldRecordDeleteAccessLogs,
             AccessLogsHelper accessLogsHelper)
             throws SQLiteException {
@@ -234,7 +345,7 @@
                     int numberOfRecordsDeleted = 0;
                     for (DeleteTableRequest deleteTableRequest : request.getDeleteTableRequests()) {
                         final RecordHelper<?> recordHelper =
-                                RecordHelperProvider.getRecordHelper(
+                                mInternalHealthConnectMappings.getRecordHelper(
                                         deleteTableRequest.getRecordType());
                         int innerRequestRecordsDeleted;
                         if (deleteTableRequest.requiresRead()) {
@@ -246,21 +357,21 @@
                                     db.rawQuery(deleteTableRequest.getReadCommand(), null)) {
                                 int numberOfUuidsToDelete = 0;
                                 while (cursor.moveToNext()) {
+                                    String packageColumnName =
+                                            requireNonNull(
+                                                    deleteTableRequest.getPackageColumnName());
+                                    String idColumnName =
+                                            requireNonNull(deleteTableRequest.getIdColumnName());
                                     numberOfUuidsToDelete++;
                                     long appInfoId =
-                                            StorageUtils.getCursorLong(
-                                                    cursor,
-                                                    deleteTableRequest.getPackageColumnName());
+                                            StorageUtils.getCursorLong(cursor, packageColumnName);
                                     if (deleteTableRequest.requiresPackageCheck()) {
                                         request.enforcePackageCheck(
-                                                StorageUtils.getCursorUUID(
-                                                        cursor,
-                                                        deleteTableRequest.getIdColumnName()),
+                                                StorageUtils.getCursorUUID(cursor, idColumnName),
                                                 appInfoId);
                                     }
                                     UUID deletedRecordUuid =
-                                            StorageUtils.getCursorUUID(
-                                                    cursor, deleteTableRequest.getIdColumnName());
+                                            StorageUtils.getCursorUUID(cursor, idColumnName);
                                     deletionChangelogs.addUUID(
                                             deleteTableRequest.getRecordType(),
                                             appInfoId,
@@ -277,8 +388,9 @@
                                                 read(additionalChangelogUuidRequest);
                                         while (cursorAdditionalUuids.moveToNext()) {
                                             modificationChangelogs.addUUID(
-                                                    additionalChangelogUuidRequest
-                                                            .getRecordHelper()
+                                                    requireNonNull(
+                                                                    additionalChangelogUuidRequest
+                                                                            .getRecordHelper())
                                                             .getRecordIdentifier(),
                                                     StorageUtils.getCursorLong(
                                                             cursorAdditionalUuids,
@@ -306,11 +418,11 @@
 
                     for (UpsertTableRequest insertRequestsForChangeLog :
                             deletionChangelogs.getUpsertTableRequests()) {
-                        insertRecord(db, insertRequestsForChangeLog);
+                        insert(db, insertRequestsForChangeLog);
                     }
                     for (UpsertTableRequest modificationChangelog :
                             modificationChangelogs.getUpsertTableRequests()) {
-                        insertRecord(db, modificationChangelog);
+                        insert(db, modificationChangelog);
                     }
                     if (Flags.addMissingAccessLogs() && shouldRecordDeleteAccessLogs) {
                         accessLogsHelper.recordDeleteAccessLog(
@@ -329,7 +441,8 @@
             AggregateTableRequest aggregateTableRequest,
             String packageName,
             Set<Integer> recordTypeIds,
-            AccessLogsHelper accessLogsHelper) {
+            AccessLogsHelper accessLogsHelper,
+            boolean shouldRecordAccessLog) {
         final SQLiteDatabase db = getReadableDb();
         try (Cursor cursor = db.rawQuery(aggregateTableRequest.getAggregationCommand(), null);
                 Cursor metaDataCursor =
@@ -337,7 +450,7 @@
                                 aggregateTableRequest.getCommandToFetchAggregateMetadata(), null)) {
             aggregateTableRequest.onResultsFetched(cursor, metaDataCursor);
         }
-        if (Flags.addMissingAccessLogs()) {
+        if (Flags.addMissingAccessLogs() && shouldRecordAccessLog) {
             accessLogsHelper.recordReadAccessLog(getWritableDb(), packageName, recordTypeIds);
         }
     }
@@ -355,7 +468,8 @@
             ReadTransactionRequest request,
             AppInfoHelper appInfoHelper,
             AccessLogsHelper accessLogsHelper,
-            DeviceInfoHelper deviceInfoHelper)
+            DeviceInfoHelper deviceInfoHelper,
+            boolean shouldRecordAccessLog)
             throws SQLiteException {
         // TODO(b/308158714): Make this build time check once we have different classes.
         checkArgument(
@@ -373,9 +487,11 @@
             }
         }
 
-        if (Flags.addMissingAccessLogs() && !request.isReadingSelfData()) {
-            accessLogsHelper.recordReadAccessLog(
-                    getWritableDb(), request.getPackageName(), request.getRecordTypeIds());
+        if (Flags.addMissingAccessLogs()) {
+            if (!request.isReadingSelfData() && shouldRecordAccessLog) {
+                accessLogsHelper.recordReadAccessLog(
+                        getWritableDb(), request.getPackageName(), request.getRecordTypeIds());
+            }
         }
         return recordInternals;
     }
@@ -396,7 +512,8 @@
             ReadTransactionRequest request,
             AppInfoHelper appInfoHelper,
             AccessLogsHelper accessLogsHelper,
-            DeviceInfoHelper deviceInfoHelper)
+            DeviceInfoHelper deviceInfoHelper,
+            boolean shouldRecordAccessLog)
             throws SQLiteException {
         // TODO(b/308158714): Make these build time checks once we have different classes.
         checkArgument(
@@ -425,51 +542,16 @@
             populateInternalRecordsWithExtraData(recordInternalList, readTableRequest);
         }
 
-        if (Flags.addMissingAccessLogs() && !request.isReadingSelfData()) {
-            accessLogsHelper.recordReadAccessLog(
-                    getWritableDb(), request.getPackageName(), request.getRecordTypeIds());
+        if (Flags.addMissingAccessLogs()) {
+            if (!request.isReadingSelfData() && shouldRecordAccessLog) {
+                accessLogsHelper.recordReadAccessLog(
+                        getWritableDb(), request.getPackageName(), request.getRecordTypeIds());
+            }
         }
         return Pair.create(recordInternalList, pageToken);
     }
 
     /**
-     * Inserts record into the table in {@code request} into the HealthConnect database.
-     *
-     * <p>NOTE: PLEASE ONLY USE THIS FUNCTION IF YOU WANT TO INSERT A SINGLE RECORD PER API. PLEASE
-     * DON'T USE THIS FUNCTION INSIDE A FOR LOOP OR REPEATEDLY: The reason is that this function
-     * tries to insert a record inside its own transaction and if you are trying to insert multiple
-     * things using this method in the same api call, they will all get inserted in their separate
-     * transactions and will be less performant. If at all, the requirement is to insert them in
-     * different transactions, as they are not related to each, then this method can be used.
-     *
-     * @param request an insert request.
-     * @return rowId of the inserted record.
-     */
-    public long insert(UpsertTableRequest request) {
-        final SQLiteDatabase db = getWritableDb();
-        return insertRecord(db, request);
-    }
-
-    /**
-     * Inserts record into the table in {@code request} into the HealthConnect database using the
-     * given {@link SQLiteDatabase}.
-     *
-     * <p>NOTE: PLEASE ONLY USE THIS FUNCTION IF YOU WANT TO INSERT A SINGLE RECORD PER API. PLEASE
-     * DON'T USE THIS FUNCTION INSIDE A FOR LOOP OR REPEATEDLY: The reason is that this function
-     * tries to insert a record inside its own transaction and if you are trying to insert multiple
-     * things using this method in the same api call, they will all get inserted in their separate
-     * transactions and will be less performant. If at all, the requirement is to insert them in
-     * different transactions, as they are not related to each, then this method can be used.
-     *
-     * @param db a {@link SQLiteDatabase}.
-     * @param request an insert request.
-     * @return rowId of the inserted record.
-     */
-    public long insert(SQLiteDatabase db, UpsertTableRequest request) {
-        return insertRecord(db, request);
-    }
-
-    /**
      * Update record into the table in {@code request} into the HealthConnect database.
      *
      * <p>NOTE: PLEASE ONLY USE THIS FUNCTION IF YOU WANT TO UPDATE A SINGLE RECORD PER API. PLEASE
@@ -486,26 +568,6 @@
         updateRecord(db, request);
     }
 
-    /**
-     * Inserts (or updates if the row exists) record into the table in {@code request} into the
-     * HealthConnect database.
-     *
-     * <p>NOTE: PLEASE ONLY USE THIS FUNCTION IF YOU WANT TO UPSERT A SINGLE RECORD. PLEASE DON'T
-     * USE THIS FUNCTION INSIDE A FOR LOOP OR REPEATEDLY: The reason is that this function tries to
-     * insert a record out of a transaction and if you are trying to insert a record before or after
-     * opening up a transaction please rethink if you really want to use this function.
-     *
-     * <p>NOTE: INSERT + WITH_CONFLICT_REPLACE only works on unique columns, else in case of
-     * conflict it leads to abort of the transaction.
-     *
-     * @param request an insert request.
-     * @return rowId of the inserted or updated record.
-     */
-    public long insertOrReplace(UpsertTableRequest request) {
-        final SQLiteDatabase db = getWritableDb();
-        return insertOrReplaceRecord(db, request);
-    }
-
     /** Note: It is the responsibility of the caller to close the returned cursor */
     public Cursor read(ReadTableRequest request) {
         if (Constants.DEBUG) {
@@ -514,6 +576,31 @@
         return getReadableDb().rawQuery(request.getReadCommand(), null);
     }
 
+    /** Returns the count of rows that would be returned by the given request. */
+    public int count(ReadTableRequest request) {
+        return count(request, getReadableDb());
+    }
+
+    /**
+     * Returns the count of rows that would be returned by the given request.
+     *
+     * <p>Use {@link #count(ReadTableRequest)} unless you already have the database from a
+     * transaction.
+     */
+    public static int count(ReadTableRequest request, SQLiteDatabase db) {
+        String countSql = request.getCountCommand();
+        if (Constants.DEBUG) {
+            Slog.d(TAG, "Count query: " + countSql);
+        }
+        try (Cursor cursor = db.rawQuery(countSql, null)) {
+            if (cursor.moveToFirst()) {
+                return cursor.getInt(0);
+            } else {
+                throw new RuntimeException("Bad count SQL:" + countSql);
+            }
+        }
+    }
+
     /**
      * Do a read using {@link SQLiteDatabase#rawQuery(String, String[])}. This method should be used
      * in preference to {@link ReadTableRequest} when it is necessary to read using a query with
@@ -554,7 +641,7 @@
      * @param tableName Name of table
      * @return Number of entries in the given table
      */
-    public long getNumberOfEntriesInTheTable(String tableName) {
+    public long queryNumEntries(String tableName) {
         requireNonNull(tableName);
         return DatabaseUtils.queryNumEntries(getReadableDb(), tableName);
     }
@@ -562,12 +649,10 @@
     /**
      * Size of Health Connect database in bytes.
      *
-     * @param context Context
      * @return Size of the database
      */
-    public long getDatabaseSize(Context context) {
-        requireNonNull(context);
-        return context.getDatabasePath(getReadableDb().getPath()).length();
+    public long getDatabaseSize() {
+        return mHealthConnectDatabase.getDatabasePath().length();
     }
 
     /**
@@ -622,15 +707,17 @@
 
                     for (UpsertTableRequest insertRequestsForChangeLog :
                             updateChangelogs.getUpsertTableRequests()) {
-                        insertRecord(db, insertRequestsForChangeLog);
+                        insert(db, insertRequestsForChangeLog);
                     }
                     for (UpsertTableRequest modificationChangelog :
                             modificationChangelogs.getUpsertTableRequests()) {
-                        insertRecord(db, modificationChangelog);
+                        insert(db, modificationChangelog);
                     }
 
                     accessLogsHelper.recordUpsertAccessLog(
-                            db, request.getPackageName(), request.getRecordTypeIds());
+                            db,
+                            Objects.requireNonNull(request.getPackageName()),
+                            request.getRecordTypeIds());
                 });
     }
 
@@ -643,7 +730,8 @@
         final SQLiteDatabase db = getReadableDb();
         HashMap<Integer, Set<Long>> recordTypeToPackageIdsMap = new HashMap<>();
         for (Integer recordType : recordTypes) {
-            RecordHelper<?> recordHelper = RecordHelperProvider.getRecordHelper(recordType);
+            RecordHelper<?> recordHelper =
+                    mInternalHealthConnectMappings.getRecordHelper(recordType);
             HashSet<Long> packageIds = new HashSet<>();
             try (Cursor cursorForDistinctPackageNames =
                     db.rawQuery(
@@ -670,8 +758,8 @@
     /**
      * ONLY DO OPERATIONS IN A SINGLE TRANSACTION HERE
      *
-     * <p>This is because this function is called from {@link AutoDeleteService}, and we want to
-     * make sure that either all its operation succeed or fail in a single run.
+     * <p>This is because this function is called from {@link DailyCleanupJob}, and we want to make
+     * sure that either all its operation succeed or fail in a single run.
      */
     public void deleteWithoutChangeLogs(List<DeleteTableRequest> deleteTableRequests) {
         requireNonNull(deleteTableRequests);
@@ -681,24 +769,9 @@
                 });
     }
 
-    public void onUserSwitching() {
-        mHealthConnectDatabase.close();
-    }
-
-    private void insertAll(
-            List<UpsertTableRequest> upsertTableRequests,
-            BiConsumer<SQLiteDatabase, UpsertTableRequest> insert) {
-        runAsTransaction(
-                db -> {
-                    insertRequests(db, upsertTableRequests, insert);
-                });
-    }
-
-    private void insertRequests(
-            SQLiteDatabase db,
-            List<UpsertTableRequest> upsertTableRequests,
-            BiConsumer<SQLiteDatabase, UpsertTableRequest> insert) {
-        upsertTableRequests.forEach((upsertTableRequest) -> insert.accept(db, upsertTableRequest));
+    /** Check if a table exists. */
+    public boolean checkTableExists(String tableName) {
+        return StorageUtils.checkTableExists(getReadableDb(), tableName);
     }
 
     /**
@@ -751,44 +824,6 @@
         }
     }
 
-    /** Assumes that caller will be closing {@code db} and handling the transaction if required */
-    public long insertRecord(SQLiteDatabase db, UpsertTableRequest request) {
-        long rowId = db.insertOrThrow(request.getTable(), null, request.getContentValues());
-        request.getChildTableRequests()
-                .forEach(childRequest -> insertRecord(db, childRequest.withParentKey(rowId)));
-        for (String postUpsertCommand : request.getPostUpsertCommands()) {
-            db.execSQL(postUpsertCommand);
-        }
-
-        return rowId;
-    }
-
-    /**
-     * Inserts the provided {@link UpsertTableRequest} into the database.
-     *
-     * <p>Assumes that caller will be closing {@code db} and handling the transaction if required.
-     *
-     * @return the row ID of the newly inserted row or <code>-1</code> if an error occurred.
-     */
-    public long insertOrIgnore(SQLiteDatabase db, UpsertTableRequest request) {
-        long rowId =
-                db.insertWithOnConflict(
-                        request.getTable(),
-                        null,
-                        request.getContentValues(),
-                        SQLiteDatabase.CONFLICT_IGNORE);
-
-        if (rowId != -1) {
-            request.getChildTableRequests()
-                    .forEach(childRequest -> insertRecord(db, childRequest.withParentKey(rowId)));
-            for (String postUpsertCommand : request.getPostUpsertCommands()) {
-                db.execSQL(postUpsertCommand);
-            }
-        }
-
-        return rowId;
-    }
-
     /** Note: NEVER close this DB */
     private SQLiteDatabase getReadableDb() {
         SQLiteDatabase sqLiteDatabase = mHealthConnectDatabase.getReadableDatabase();
@@ -884,50 +919,13 @@
         }
         for (ReadTableRequest extraDataRequest : request.getExtraReadRequests()) {
             Cursor cursorExtraData = read(extraDataRequest);
-            request.getRecordHelper()
-                    .updateInternalRecordsWithExtraFields(
-                            records, cursorExtraData, extraDataRequest.getTableName());
-        }
-    }
-
-    /**
-     * Assumes that caller will be closing {@code db}. Returns -1 in case the update was triggered
-     * and reading the row_id was not supported on the table.
-     *
-     * <p>Note: This function updates rather than the traditional delete + insert in SQLite
-     */
-    private long insertOrReplaceRecord(SQLiteDatabase db, UpsertTableRequest request) {
-        try {
-            if (request.getUniqueColumnsCount() == 0) {
-                throw new RuntimeException(
-                        "insertOrReplaceRecord should only be called with unique columns set");
+            RecordHelper<?> recordHelper = request.getRecordHelper();
+            if (recordHelper == null) {
+                throw new IllegalArgumentException(
+                        "Extra read request with no attached record helper.");
             }
-
-            long rowId =
-                    db.insertWithOnConflict(
-                            request.getTable(),
-                            null,
-                            request.getContentValues(),
-                            SQLiteDatabase.CONFLICT_FAIL);
-            insertChildTableRequest(request, rowId, db);
-            for (String postUpsertCommand : request.getPostUpsertCommands()) {
-                db.execSQL(postUpsertCommand);
-            }
-
-            return rowId;
-        } catch (SQLiteConstraintException e) {
-            try (Cursor cursor = db.rawQuery(request.getReadRequest().getReadCommand(), null)) {
-                if (!cursor.moveToFirst()) {
-                    throw new HealthConnectException(
-                            ERROR_INTERNAL, "Conflict found, but couldn't read the entry.", e);
-                }
-
-                long updateResult = updateEntriesIfRequired(db, request, cursor);
-                for (String postUpsertCommand : request.getPostUpsertCommands()) {
-                    db.execSQL(postUpsertCommand);
-                }
-                return updateResult;
-            }
+            recordHelper.updateInternalRecordsWithExtraFields(
+                    records, cursorExtraData, extraDataRequest.getTableName());
         }
     }
 
@@ -983,7 +981,7 @@
         // Carries out read requests provided by the record helper and uses the results to add
         // changelogs to the transaction.
         final RecordHelper<?> recordHelper =
-                RecordHelperProvider.getRecordHelper(upsertRequest.getRecordType());
+                mInternalHealthConnectMappings.getRecordHelper(upsertRequest.getRecordType());
         for (ReadTableRequest additionalChangelogUuidRequest :
                 recordHelper.getReadRequestsForRecordsModifiedByUpsertion(
                         upsertRequest.getRecordInternal().getUuid(),
@@ -991,8 +989,10 @@
                         callingPackageAppInfoId)) {
             Cursor cursorAdditionalUuids = read(additionalChangelogUuidRequest);
             while (cursorAdditionalUuids.moveToNext()) {
+                RecordHelper<?> extraRecordHelper =
+                        requireNonNull(additionalChangelogUuidRequest.getRecordHelper());
                 modificationChangelogs.addUUID(
-                        additionalChangelogUuidRequest.getRecordHelper().getRecordIdentifier(),
+                        extraRecordHelper.getRecordIdentifier(),
                         StorageUtils.getCursorLong(cursorAdditionalUuids, APP_INFO_ID_COLUMN_NAME),
                         StorageUtils.getCursorUUID(cursorAdditionalUuids, UUID_COLUMN_NAME));
             }
@@ -1015,42 +1015,4 @@
         /** Task to be executed that throws throwable of type E and returns type R. */
         R run(SQLiteDatabase db) throws E;
     }
-
-    public static synchronized TransactionManager initializeInstance(
-            HealthConnectUserContext context) {
-        if (sTransactionManager == null) {
-            sTransactionManager = new TransactionManager(context);
-        }
-
-        return sTransactionManager;
-    }
-
-    public static TransactionManager getInitialisedInstance() {
-        requireNonNull(sTransactionManager);
-
-        return sTransactionManager;
-    }
-
-    /** Used in testing to clear the instance to clear and re-reference the mocks. */
-    @com.android.internal.annotations.VisibleForTesting
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public static synchronized void clearInstanceForTest() {
-        sTransactionManager = null;
-    }
-
-    /** Cleans up the database and this manager, so unit tests can run correctly. */
-    @VisibleForTesting
-    public static void cleanUpForTest() {
-        if (sTransactionManager != null) {
-            // Close the DB before we delete the DB file to avoid the exception in b/333679690.
-            sTransactionManager.getWritableDb().close();
-            sTransactionManager.getReadableDb().close();
-            SQLiteDatabase.deleteDatabase(sTransactionManager.getDatabasePath());
-            sTransactionManager = null;
-        }
-    }
-
-    public UserHandle getCurrentUserHandle() {
-        return mUserHandle;
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/AccessLogsHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/AccessLogsHelper.java
index 09597dd..67ac875 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/AccessLogsHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/AccessLogsHelper.java
@@ -16,10 +16,12 @@
 
 package com.android.server.healthconnect.storage.datatypehelpers;
 
+import static android.health.connect.Constants.DEFAULT_LONG;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_DELETE;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_READ;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_UPSERT;
 
+import static com.android.internal.util.Preconditions.checkArgument;
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.PRIMARY_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.BOOLEAN_FALSE_VALUE;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.BOOLEAN_TRUE_VALUE;
@@ -85,13 +87,14 @@
     private static final int NUM_COLS = 5;
     private static final int DEFAULT_ACCESS_LOG_TIME_PERIOD_IN_DAYS = 7;
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private static volatile AccessLogsHelper sAccessLogsHelper;
-
     private final TransactionManager mTransactionManager;
     private final AppInfoHelper mAppInfoHelper;
 
-    private AccessLogsHelper(TransactionManager transactionManager, AppInfoHelper appInfoHelper) {
+    public AccessLogsHelper(
+            TransactionManager transactionManager,
+            AppInfoHelper appInfoHelper,
+            DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
         mTransactionManager = transactionManager;
         mAppInfoHelper = appInfoHelper;
     }
@@ -107,8 +110,7 @@
         final ReadTableRequest readTableRequest = new ReadTableRequest(TABLE_NAME);
 
         List<AccessLog> accessLogsList = new ArrayList<>();
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
-        try (Cursor cursor = transactionManager.read(readTableRequest)) {
+        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
             while (cursor.moveToNext()) {
                 String packageName =
                         mAppInfoHelper.getPackageName(getCursorLong(cursor, APP_ID_COLUMN_NAME));
@@ -190,8 +192,14 @@
             String packageName,
             @RecordTypeIdentifier.RecordType List<Integer> recordTypeList,
             @OperationType.OperationTypes int operationType) {
+        long appInfoId = mAppInfoHelper.getAppInfoId(packageName);
+        if (appInfoId == DEFAULT_LONG) {
+            // TODO(b/371210803): Add server side log for this error
+            Slog.w(TAG, "invalid package name " + packageName + " used for access log");
+            return;
+        }
         UpsertTableRequest request =
-                getUpsertTableRequest(packageName, recordTypeList, operationType);
+                getUpsertTableRequest(appInfoId, recordTypeList, operationType);
         mTransactionManager.insert(request);
     }
 
@@ -205,24 +213,28 @@
             @MedicalResourceType Set<Integer> medicalResourceTypes,
             @OperationType.OperationTypes int operationType,
             boolean accessedMedicalDataSource) {
+        long appInfoId = mAppInfoHelper.getAppInfoId(packageName);
+        if (appInfoId == DEFAULT_LONG) {
+            // TODO(b/371210803): Add server side log for this error
+            Slog.w(TAG, "invalid package name " + packageName + " used for access log");
+            return;
+        }
         UpsertTableRequest request =
                 getUpsertTableRequestForPhr(
-                        packageName,
-                        medicalResourceTypes,
-                        operationType,
-                        accessedMedicalDataSource);
+                        appInfoId, medicalResourceTypes, operationType, accessedMedicalDataSource);
         mTransactionManager.insert(db, request);
     }
 
-    private UpsertTableRequest getUpsertTableRequestForPhr(
-            String packageName,
+    private static UpsertTableRequest getUpsertTableRequestForPhr(
+            long appInfoId,
             Set<Integer> medicalResourceTypes,
             @OperationType.OperationTypes int operationType,
             boolean isMedicalDataSource) {
+        checkArgument(appInfoId != DEFAULT_LONG, "unknown app id");
         // We need to populate RECORD_TYPE_COLUMN_NAME with an empty list, as the column is set
         // to NOT_NULL.
         ContentValues contentValues =
-                populateCommonColumns(packageName, /* recordTypeList= */ List.of(), operationType);
+                populateCommonColumns(appInfoId, /* recordTypeList= */ List.of(), operationType);
         contentValues.put(
                 MEDICAL_RESOURCE_TYPE_COLUMN_NAME, concatDataTypeIds(medicalResourceTypes));
         contentValues.put(
@@ -231,12 +243,13 @@
         return new UpsertTableRequest(TABLE_NAME, contentValues);
     }
 
-    private UpsertTableRequest getUpsertTableRequest(
-            String packageName,
+    private static UpsertTableRequest getUpsertTableRequest(
+            long appInfoId,
             List<Integer> recordTypeList,
             @OperationType.OperationTypes int operationType) {
+        checkArgument(appInfoId != DEFAULT_LONG, "unknown app id");
         ContentValues contentValues =
-                populateCommonColumns(packageName, recordTypeList, operationType);
+                populateCommonColumns(appInfoId, recordTypeList, operationType);
         return new UpsertTableRequest(TABLE_NAME, contentValues);
     }
 
@@ -263,18 +276,27 @@
             String packageName,
             Set<Integer> recordTypeIds,
             @OperationType.OperationTypes int operationType) {
+        long appInfoId = mAppInfoHelper.getAppInfoId(packageName);
+        if (appInfoId == DEFAULT_LONG) {
+            // TODO(b/371210803): Add server side log for this error
+            Slog.w(TAG, "invalid package name " + packageName + " used for access log");
+            return;
+        }
         ContentValues contentValues =
-                populateCommonColumns(packageName, recordTypeIds.stream().toList(), operationType);
+                populateCommonColumns(appInfoId, recordTypeIds.stream().toList(), operationType);
         UpsertTableRequest request = new UpsertTableRequest(TABLE_NAME, contentValues);
-        mTransactionManager.insertRecord(db, request);
+        mTransactionManager.insert(db, request);
     }
 
-    private ContentValues populateCommonColumns(
-            String packageName,
+    @VisibleForTesting
+    static ContentValues populateCommonColumns(
+            long appInfoId,
             List<Integer> recordTypeList,
             @OperationType.OperationTypes int operationType) {
+        checkArgument(appInfoId != DEFAULT_LONG, "unknown app id");
+
         ContentValues contentValues = new ContentValues();
-        contentValues.put(APP_ID_COLUMN_NAME, mAppInfoHelper.getAppInfoId(packageName));
+        contentValues.put(APP_ID_COLUMN_NAME, appInfoId);
         contentValues.put(ACCESS_TIME_COLUMN_NAME, Instant.now().toEpochMilli());
         contentValues.put(OPERATION_TYPE_COLUMN_NAME, operationType);
         contentValues.put(
@@ -334,24 +356,4 @@
     protected String getMainTableName() {
         return TABLE_NAME;
     }
-
-    public static AccessLogsHelper getInstance() {
-        return getInstance(
-                TransactionManager.getInitialisedInstance(), AppInfoHelper.getInstance());
-    }
-
-    /** Returns an instance of AccessLogsHelper initialised using the given dependencies. */
-    public static synchronized AccessLogsHelper getInstance(
-            TransactionManager transactionManager, AppInfoHelper appInfoHelper) {
-        if (sAccessLogsHelper == null) {
-            sAccessLogsHelper = new AccessLogsHelper(transactionManager, appInfoHelper);
-        }
-        return sAccessLogsHelper;
-    }
-
-    /** Used in testing to clear the instance to clear and re-reference the mocks. */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public static synchronized void resetInstanceForTest() {
-        sAccessLogsHelper = null;
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ActivityDateHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ActivityDateHelper.java
index 2723f91..5b1cd74 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ActivityDateHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ActivityDateHelper.java
@@ -25,7 +25,7 @@
 import android.database.Cursor;
 import android.health.connect.datatypes.Record;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.util.Pair;
 
 import com.android.server.healthconnect.storage.TransactionManager;
@@ -33,7 +33,7 @@
 import com.android.server.healthconnect.storage.request.DeleteTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.request.UpsertTableRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.WhereClauses;
 
 import java.time.LocalDate;
@@ -56,6 +56,18 @@
     private static final String EPOCH_DAYS_COLUMN_NAME = "epoch_days";
     private static final String RECORD_TYPE_ID_COLUMN_NAME = "record_type_id";
 
+    private final TransactionManager mTransactionManager;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings;
+
+    public ActivityDateHelper(
+            TransactionManager transactionManager,
+            InternalHealthConnectMappings internalHealthConnectMappings,
+            DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
+        mTransactionManager = transactionManager;
+        mInternalHealthConnectMappings = internalHealthConnectMappings;
+    }
+
     /**
      * Returns a requests representing the tables that should be created corresponding to this
      * helper
@@ -71,23 +83,23 @@
     }
 
     /** Insert a new activity dates for the given records */
-    public static void insertRecordDate(List<RecordInternal<?>> recordInternals) {
+    public void insertRecordDate(List<RecordInternal<?>> recordInternals) {
         Objects.requireNonNull(recordInternals);
 
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
-
         List<UpsertTableRequest> upsertTableRequests = new ArrayList<>();
         recordInternals.forEach(
                 (recordInternal) -> upsertTableRequests.add(getUpsertTableRequest(recordInternal)));
 
-        transactionManager.insertOrIgnoreOnConflict(upsertTableRequests);
+        mTransactionManager.insertOrIgnoreOnConflict(upsertTableRequests);
     }
 
     /** Returns a list of all dates with database writes for the given record types */
-    public static List<LocalDate> getActivityDates(List<Class<? extends Record>> recordTypes) {
-        RecordMapper recordMapper = RecordMapper.getInstance();
+    public List<LocalDate> getActivityDates(List<Class<? extends Record>> recordTypes) {
+        HealthConnectMappings healthConnectMappings = HealthConnectMappings.getInstance();
         List<Integer> recordTypeIds =
-                recordTypes.stream().map(recordMapper::getRecordType).collect(Collectors.toList());
+                recordTypes.stream()
+                        .map(healthConnectMappings::getRecordType)
+                        .collect(Collectors.toList());
 
         return readDates(
                 new ReadTableRequest(TABLE_NAME)
@@ -100,18 +112,20 @@
     }
 
     /** Updates the activity dates cache for all records */
-    public static void reSyncForAllRecords() {
+    public void reSyncForAllRecords() {
         List<Integer> recordTypeIds =
-                RecordMapper.getInstance().getRecordIdToExternalRecordClassMap().keySet().stream()
+                HealthConnectMappings.getInstance()
+                        .getRecordIdToExternalRecordClassMap()
+                        .keySet()
+                        .stream()
                         .toList();
 
         reSyncByRecordTypeIds(recordTypeIds);
     }
 
     /** Updates the activity dates cache for the given record IDs */
-    public static void reSyncByRecordTypeIds(List<Integer> recordTypeIds) {
+    public void reSyncByRecordTypeIds(List<Integer> recordTypeIds) {
         List<UpsertTableRequest> upsertTableRequests = new ArrayList<>();
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
 
         DeleteTableRequest deleteTableRequest =
                 new DeleteTableRequest(TABLE_NAME)
@@ -120,8 +134,7 @@
                                 recordTypeIds.stream().map(String::valueOf).toList());
 
         // Fetch updated dates from respective record table and update the activity dates cache.
-        HashMap<Integer, List<Long>> recordTypeIdToEpochDays =
-                fetchUpdatedDates(recordTypeIds, transactionManager);
+        HashMap<Integer, List<Long>> recordTypeIdToEpochDays = fetchUpdatedDates(recordTypeIds);
 
         recordTypeIdToEpochDays.forEach(
                 (recordTypeId, epochDays) ->
@@ -130,12 +143,13 @@
                                         upsertTableRequests.add(
                                                 getUpsertTableRequest(recordTypeId, epochDay))));
 
-        transactionManager.runAsTransaction(
+        mTransactionManager.runAsTransaction(
                 db -> {
                     db.execSQL(deleteTableRequest.getDeleteCommand());
                     upsertTableRequests.forEach(
                             upsertTableRequest ->
-                                    transactionManager.insertOrIgnore(db, upsertTableRequest));
+                                    mTransactionManager.insertOrIgnoreOnConflict(
+                                            db, upsertTableRequest));
                 });
     }
 
@@ -146,19 +160,18 @@
                 new Pair<>(RECORD_TYPE_ID_COLUMN_NAME, INTEGER_NOT_NULL));
     }
 
-    private static HashMap<Integer, List<Long>> fetchUpdatedDates(
-            List<Integer> recordTypeIds, TransactionManager transactionManager) {
+    private HashMap<Integer, List<Long>> fetchUpdatedDates(List<Integer> recordTypeIds) {
 
         ReadTableRequest request;
         RecordHelper<?> recordHelper;
         HashMap<Integer, List<Long>> recordTypeIdToEpochDays = new HashMap<>();
         for (int recordTypeId : recordTypeIds) {
-            recordHelper = RecordHelperProvider.getRecordHelper(recordTypeId);
+            recordHelper = mInternalHealthConnectMappings.getRecordHelper(recordTypeId);
             request =
                     new ReadTableRequest(recordHelper.getMainTableName())
                             .setColumnNames(List.of(recordHelper.getPeriodGroupByColumnName()))
                             .setDistinctClause(true);
-            try (Cursor cursor = transactionManager.read(request)) {
+            try (Cursor cursor = mTransactionManager.read(request)) {
                 List<Long> distinctDates = new ArrayList<>();
                 while (cursor.moveToNext()) {
                     long epochDay =
@@ -185,9 +198,8 @@
      * @param request a read request.
      * @return Cursor from table based on ids.
      */
-    private static List<LocalDate> readDates(ReadTableRequest request) {
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
-        try (Cursor cursor = transactionManager.read(request)) {
+    private List<LocalDate> readDates(ReadTableRequest request) {
+        try (Cursor cursor = mTransactionManager.read(request)) {
             List<LocalDate> dates = new ArrayList<>();
             while (cursor.moveToNext()) {
                 long epochDay = getCursorLong(cursor, EPOCH_DAYS_COLUMN_NAME);
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ActivityIntensityRecordHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ActivityIntensityRecordHelper.java
new file mode 100644
index 0000000..19d5412
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ActivityIntensityRecordHelper.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.datatypehelpers;
+
+import static com.android.server.healthconnect.storage.utils.StorageUtils.INTEGER;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorInt;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.health.connect.datatypes.AggregationType;
+import android.health.connect.datatypes.RecordTypeIdentifier;
+import android.health.connect.internal.datatypes.ActivityIntensityRecordInternal;
+import android.util.Pair;
+
+import com.android.server.healthconnect.storage.request.AggregateParams;
+
+import java.util.List;
+
+/**
+ * Helper class for {@link android.health.connect.datatypes.ActivityIntensityRecord}.
+ *
+ * @hide
+ */
+public class ActivityIntensityRecordHelper
+        extends IntervalRecordHelper<ActivityIntensityRecordInternal> {
+    private static final String TABLE_NAME = "activity_intensity_record_table";
+    public static final String TYPE_COLUMN_NAME = "type";
+
+    public ActivityIntensityRecordHelper() {
+        super(RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY);
+    }
+
+    @Override
+    void populateSpecificRecordValue(
+            Cursor cursor, ActivityIntensityRecordInternal recordInternal) {
+        recordInternal.setActivityIntensityType(getCursorInt(cursor, TYPE_COLUMN_NAME));
+    }
+
+    @Override
+    void populateSpecificContentValues(
+            ContentValues contentValues, ActivityIntensityRecordInternal recordInternal) {
+        contentValues.put(TYPE_COLUMN_NAME, recordInternal.getActivityIntensityType());
+    }
+
+    @Override
+    List<Pair<String, String>> getIntervalRecordColumnInfo() {
+        return List.of(Pair.create(TYPE_COLUMN_NAME, INTEGER));
+    }
+
+    @Override
+    public String getMainTableName() {
+        return TABLE_NAME;
+    }
+
+    @Override
+    AggregateParams getAggregateParams(AggregationType<?> aggregateRequest) {
+        return new AggregateParams(TABLE_NAME, List.of(TYPE_COLUMN_NAME));
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelper.java
index 3e9da04..43aeb56 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelper.java
@@ -34,7 +34,6 @@
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
 import android.content.ContentValues;
-import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.ApplicationInfoFlags;
@@ -49,12 +48,12 @@
 import android.health.connect.datatypes.AppInfo;
 import android.health.connect.internal.datatypes.AppInfoInternal;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.util.Log;
 import android.util.Pair;
 import android.util.Slog;
 
-import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
@@ -94,15 +93,12 @@
     private static final String RECORD_TYPES_USED_COLUMN_NAME = "record_types_used";
     private static final int COMPRESS_FACTOR = 100;
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private static volatile AppInfoHelper sAppInfoHelper;
-
     /**
      * Map to store appInfoId -> packageName mapping for populating record for read
      *
      * <p>TO HAVE THREAD SAFETY DON'T USE THESE VARIABLES DIRECTLY, INSTEAD USE ITS GETTER
      */
-    private volatile ConcurrentHashMap<Long, String> mIdPackageNameMap;
+    @Nullable private volatile ConcurrentHashMap<Long, String> mIdPackageNameMap;
 
     /**
      * Map to store application package-name -> AppInfo mapping (such as packageName -> appName,
@@ -110,24 +106,38 @@
      *
      * <p>TO HAVE THREAD SAFETY DON'T USE THESE VARIABLES DIRECTLY, INSTEAD USE ITS GETTER
      */
-    private volatile ConcurrentHashMap<String, AppInfoInternal> mAppInfoMap;
+    @Nullable private volatile ConcurrentHashMap<String, AppInfoInternal> mAppInfoMap;
 
+    private StorageContext mUserContext;
     private final TransactionManager mTransactionManager;
-    private final RecordMapper mRecordMapper;
+    private final HealthConnectMappings mHealthConnectMappings;
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private AppInfoHelper(TransactionManager transactionManager) {
+    public AppInfoHelper(
+            StorageContext userContext,
+            TransactionManager transactionManager,
+            HealthConnectMappings healthConnectMappings,
+            DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
+        mUserContext = userContext;
         mTransactionManager = transactionManager;
-        mRecordMapper = RecordMapper.getInstance();
+        mHealthConnectMappings = healthConnectMappings;
     }
 
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     @Override
     public synchronized void clearCache() {
         mAppInfoMap = null;
         mIdPackageNameMap = null;
     }
 
+    /** Setup AppInfoHelper for the given user. */
+    public synchronized void setupForUser(StorageContext userContext) {
+        mUserContext = userContext;
+        // While we already call clearCache() in HCManager.onUserSwitching(), calling this again
+        // here in case any of the methods below was called in between that initialized the cache
+        // with the wrong context.
+        clearCache();
+    }
+
     @Override
     protected String getMainTableName() {
         return TABLE_NAME;
@@ -142,17 +152,16 @@
     }
 
     /** Populates record with appInfoId */
-    public void populateAppInfoId(
-            RecordInternal<?> record, Context context, boolean requireAllFields) {
+    public void populateAppInfoId(RecordInternal<?> record, boolean requireAllFields) {
         final String packageName = requireNonNull(record.getPackageName());
         AppInfoInternal appInfo = getAppInfoMap().get(packageName);
 
         if (appInfo == null) {
             try {
-                appInfo = getAppInfo(packageName, context);
+                appInfo = getAppInfo(packageName);
             } catch (NameNotFoundException e) {
                 if (requireAllFields) {
-                    throw new IllegalArgumentException("Could not find package info", e);
+                    throw new IllegalStateException("Could not find package info", e);
                 }
 
                 appInfo =
@@ -176,20 +185,15 @@
      * onlyUpdate is false then only insert a new AppInfo entry; no replacement.
      */
     public void addOrUpdateAppInfoIfNotInstalled(
-            Context context,
             String packageName,
             @Nullable String name,
             @Nullable byte[] maybeIcon,
             boolean onlyUpdate) {
-        if (!isAppInstalled(context, packageName)) {
-            byte[] icon =
-                    maybeIcon == null ? getIconFromPackageName(context, packageName) : maybeIcon;
+        if (!isAppInstalled(packageName)) {
+            byte[] icon = maybeIcon == null ? getIconFromPackageName(packageName) : maybeIcon;
             // using pre-existing value of recordTypesUsed.
-            @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-            var recordTypesUsed =
-                    containsAppInfo(packageName)
-                            ? mAppInfoMap.get(packageName).getRecordTypesUsed()
-                            : null;
+            var appInfo = getAppInfoMap().get(packageName);
+            var recordTypesUsed = appInfo == null ? null : appInfo.getRecordTypesUsed();
             AppInfoInternal appInfoInternal =
                     new AppInfoInternal(
                             DEFAULT_LONG, packageName, name, decodeBitmap(icon), recordTypesUsed);
@@ -206,14 +210,11 @@
      * name} and {@code icon}, only if no AppInfo entry already exists.
      */
     public void addOrUpdateAppInfoIfNoAppInfoEntryExists(
-            Context context, String packageName, @Nullable String name) {
+            String packageName, @Nullable String name) {
         if (!containsAppInfo(packageName)) {
-            byte[] icon = getIconFromPackageName(context, packageName);
-            @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-            var recordTypesUsed =
-                    containsAppInfo(packageName)
-                            ? mAppInfoMap.get(packageName).getRecordTypesUsed()
-                            : null;
+            byte[] icon = getIconFromPackageName(packageName);
+            var appInfo = getAppInfoMap().get(packageName);
+            var recordTypesUsed = appInfo == null ? null : appInfo.getRecordTypesUsed();
             AppInfoInternal appInfoInternal =
                     new AppInfoInternal(
                             DEFAULT_LONG, packageName, name, decodeBitmap(icon), recordTypesUsed);
@@ -221,9 +222,11 @@
         }
     }
 
-    private boolean isAppInstalled(Context context, String packageName) {
+    private boolean isAppInstalled(String packageName) {
         try {
-            context.getPackageManager().getApplicationInfo(packageName, ApplicationInfoFlags.of(0));
+            mUserContext
+                    .getPackageManager()
+                    .getApplicationInfo(packageName, ApplicationInfoFlags.of(0));
             return true;
         } catch (NameNotFoundException e) {
             return false;
@@ -260,7 +263,7 @@
      */
     public List<Long> getAppInfoIds(List<String> packageNames) {
         if (DEBUG) {
-            Slog.d(TAG, "App info map: " + mAppInfoMap);
+            Slog.d(TAG, "App info map: " + getAppInfoMap());
         }
         if (packageNames == null || packageNames.isEmpty()) {
             return Collections.emptyList();
@@ -314,13 +317,13 @@
      * Returns AppInfo id for the provided {@code packageName}, creating it if needed using the
      * given {@link SQLiteDatabase}.
      */
-    public long getOrInsertAppInfoId(SQLiteDatabase db, String packageName, Context context) {
-        return getOrInsertAppInfoId(Optional.of(db), packageName, context);
+    public long getOrInsertAppInfoId(SQLiteDatabase db, String packageName) {
+        return getOrInsertAppInfoId(Optional.of(db), packageName);
     }
 
     /** Returns AppInfo id for the provided {@code packageName}, creating it if needed. */
-    public long getOrInsertAppInfoId(String packageName, Context context) {
-        return getOrInsertAppInfoId(Optional.empty(), packageName, context);
+    public long getOrInsertAppInfoId(String packageName) {
+        return getOrInsertAppInfoId(Optional.empty(), packageName);
     }
 
     /**
@@ -328,15 +331,14 @@
      * is null, the default will be {@link TransactionManager#getReadableDb()} for reads and {@link
      * TransactionManager#getWritableDb()} for writes.
      */
-    private long getOrInsertAppInfoId(
-            Optional<SQLiteDatabase> db, String packageName, Context context) {
+    private long getOrInsertAppInfoId(Optional<SQLiteDatabase> db, String packageName) {
         AppInfoInternal appInfoInternal = getAppInfoMap(db).get(packageName);
 
         if (appInfoInternal == null) {
             try {
-                appInfoInternal = getAppInfo(packageName, context);
+                appInfoInternal = getAppInfo(packageName);
             } catch (NameNotFoundException e) {
-                throw new IllegalArgumentException("Could not find package info for package", e);
+                throw new IllegalStateException("Could not find package info for package", e);
             }
 
             insertIfNotPresent(db, packageName, appInfoInternal);
@@ -461,7 +463,10 @@
         Set<Integer> recordTypesToBeUpdated =
                 Objects.requireNonNullElseGet(
                         recordTypesToBeSynced,
-                        () -> mRecordMapper.getRecordIdToExternalRecordClassMap().keySet());
+                        () ->
+                                mHealthConnectMappings
+                                        .getRecordIdToExternalRecordClassMap()
+                                        .keySet());
 
         Map<Integer, Set<Long>> recordTypeToContributingPackageIdsMap =
                 mTransactionManager.getDistinctPackageIdsForRecordsTable(recordTypesToBeUpdated);
@@ -491,7 +496,6 @@
      * This method updates recordTypesUsed for all packages and hence is a heavy operation. This
      * method is used during AutoDeleteService and is run once per day.
      */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     @SuppressLint("LongLogTag")
     private synchronized void syncAppInfoMapRecordTypesUsed(
             Map<Integer, Set<String>> recordTypeToContributingPackagesMap) {
@@ -544,7 +548,6 @@
      * Checks and deletes record types in app info table for which the package is no longer
      * contributing data. This is done after delete records operation has been performed.
      */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     @SuppressLint("LongLogTag")
     private synchronized void deleteRecordTypesForPackagesIfRequiredInternal(
             Set<Integer> recordTypesToBeDeleted,
@@ -571,7 +574,9 @@
             // get the distinct packages used by the record after the deletion process, check if
             // the recordType does not have the current package then remove record type from
             // the package's app info record.
-            if (!currentRecordTypePackageMap.get(recordType).contains(packageName)) {
+            if (!currentRecordTypePackageMap
+                    .getOrDefault(recordType, new HashSet<>())
+                    .contains(packageName)) {
                 updatedRecordTypesUsed.remove(recordType);
             }
         }
@@ -586,7 +591,7 @@
 
     @SuppressLint("LongLogTag")
     private synchronized void updateAppInfoRecordTypesUsedSync(
-            String packageName, AppInfoInternal appInfo, Set<Integer> recordTypesUsed) {
+            String packageName, AppInfoInternal appInfo, @Nullable Set<Integer> recordTypesUsed) {
         appInfo.setRecordTypesUsed(recordTypesUsed);
         // create upsert table request to modify app info table, keyed by packages name.
         WhereClauses whereClauseForAppInfoTableUpdate = new WhereClauses(AND);
@@ -649,7 +654,7 @@
             populateAppInfoMap(db);
         }
 
-        return mAppInfoMap;
+        return Objects.requireNonNull(mAppInfoMap);
     }
 
     /**
@@ -662,16 +667,15 @@
             populateAppInfoMap(db);
         }
 
-        return mIdPackageNameMap;
+        return Objects.requireNonNull(mIdPackageNameMap);
     }
 
     private Map<Long, String> getIdPackageNameMap() {
         return getIdPackageNameMap(Optional.empty());
     }
 
-    private AppInfoInternal getAppInfo(String packageName, Context context)
-            throws NameNotFoundException {
-        PackageManager packageManager = context.getPackageManager();
+    private AppInfoInternal getAppInfo(String packageName) throws NameNotFoundException {
+        PackageManager packageManager = mUserContext.getPackageManager();
         ApplicationInfo info =
                 packageManager.getApplicationInfo(
                         packageName, PackageManager.ApplicationInfoFlags.of(0));
@@ -682,8 +686,8 @@
     }
 
     @Nullable
-    private byte[] getIconFromPackageName(Context context, String packageName) {
-        PackageManager packageManager = context.getPackageManager();
+    private byte[] getIconFromPackageName(String packageName) {
+        PackageManager packageManager = mUserContext.getPackageManager();
         try {
             Drawable drawable = packageManager.getApplicationIcon(packageName);
             Bitmap bitmap = getBitmapFromDrawable(drawable);
@@ -778,19 +782,6 @@
         return columnInfo;
     }
 
-    public static AppInfoHelper getInstance() {
-        return getInstance(TransactionManager.getInitialisedInstance());
-    }
-
-    /** Returns an instance of AppInfoHelper by passing in the dependency. */
-    public static synchronized AppInfoHelper getInstance(TransactionManager transactionManager) {
-        if (sAppInfoHelper == null) {
-            sAppInfoHelper = new AppInfoHelper(transactionManager);
-        }
-
-        return sAppInfoHelper;
-    }
-
     @Nullable
     private static byte[] encodeBitmap(@Nullable Bitmap bitmap) {
         if (bitmap == null) {
@@ -832,11 +823,4 @@
         }
         return packageNames;
     }
-
-    /** Used in testing to clear the instance to clear and re-reference the mocks. */
-    @VisibleForTesting
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public static synchronized void resetInstanceForTest() {
-        sAppInfoHelper = null;
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/BackupChangeTokenHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/BackupChangeTokenHelper.java
new file mode 100644
index 0000000..3943928
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/BackupChangeTokenHelper.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.datatypehelpers;
+
+import static com.android.server.healthconnect.storage.HealthConnectDatabase.createTable;
+import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.PRIMARY_COLUMN_NAME;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.INTEGER;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.PRIMARY;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.TEXT_NULL;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorLong;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorString;
+import static com.android.server.healthconnect.storage.utils.WhereClauses.LogicalOperator.AND;
+
+import android.annotation.Nullable;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.util.Pair;
+
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.request.CreateTableRequest;
+import com.android.server.healthconnect.storage.request.ReadTableRequest;
+import com.android.server.healthconnect.storage.request.UpsertTableRequest;
+import com.android.server.healthconnect.storage.utils.WhereClauses;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A class to interact with the DB table that stores the information about the back up requests i.e.
+ * {@code TABLE_NAME}
+ *
+ * <p>This class returns the row_id of the backup_token_table as a token, that can later be used to
+ * recreate the backup token.
+ *
+ * @hide
+ */
+public class BackupChangeTokenHelper {
+    private static final String TABLE_NAME = "backup_change_token_table";
+    private static final String DATA_TABLE_NAME_COLUMN_NAME = "data_table_name";
+    private static final String DATA_TABLE_PAGE_TOKEN_COLUMN_NAME = "data_table_page_token";
+    private static final String CHANGE_LOGS_REQUEST_TOKEN_COLUMN_NAME = "change_logs_request_token";
+
+    /**
+     * @return the row Id for the backup_change_token_table.
+     */
+    public static String getBackupChangeTokenRowId(
+            TransactionManager transactionManager,
+            @Nullable String dataTableName,
+            long dataTablePageToken,
+            @Nullable String changeLogsRequestToken) {
+        ContentValues contentValues = new ContentValues();
+
+        contentValues.put(DATA_TABLE_NAME_COLUMN_NAME, dataTableName);
+        contentValues.put(DATA_TABLE_PAGE_TOKEN_COLUMN_NAME, dataTablePageToken);
+        contentValues.put(CHANGE_LOGS_REQUEST_TOKEN_COLUMN_NAME, changeLogsRequestToken);
+
+        return String.valueOf(
+                transactionManager.insert(new UpsertTableRequest(TABLE_NAME, contentValues)));
+    }
+
+    /** Reads the database and get backup change token. */
+    public static BackupChangeToken getBackupChangeToken(
+            TransactionManager transactionManager, String token) {
+        ReadTableRequest readTableRequest =
+                new ReadTableRequest(TABLE_NAME)
+                        .setWhereClause(
+                                new WhereClauses(AND)
+                                        .addWhereEqualsClause(PRIMARY_COLUMN_NAME, token));
+        try (Cursor cursor = transactionManager.read(readTableRequest)) {
+            if (!cursor.moveToFirst()) {
+                throw new IllegalArgumentException("Invalid backup change token");
+            }
+
+            return new BackupChangeToken(
+                    getCursorString(cursor, DATA_TABLE_NAME_COLUMN_NAME),
+                    getCursorLong(cursor, DATA_TABLE_PAGE_TOKEN_COLUMN_NAME),
+                    getCursorString(cursor, CHANGE_LOGS_REQUEST_TOKEN_COLUMN_NAME));
+        }
+    }
+
+    /** A class to represent the request corresponding to a backup change token. */
+    public static class BackupChangeToken {
+        private final @Nullable String mDataTableName;
+        private final long mDataTablePageToken;
+        private final @Nullable String mChangeLogsRequestToken;
+
+        /**
+         * @param dataTableName data table name to be backed up next
+         * @param dataTablePageToken page token for the data table to be backed up
+         * @param changeLogsRequestToken row id in change logs request table to get token for change
+         *     logs table
+         */
+        public BackupChangeToken(
+                @Nullable String dataTableName,
+                long dataTablePageToken,
+                @Nullable String changeLogsRequestToken) {
+            mDataTableName = dataTableName;
+            mDataTablePageToken = dataTablePageToken;
+            mChangeLogsRequestToken = changeLogsRequestToken;
+        }
+
+        /**
+         * Returns the data table name to be backed up next.
+         *
+         * <p>Set to null before a complete full backup or for an incremental backup.
+         */
+        public @Nullable String getDataTableName() {
+            return mDataTableName;
+        }
+
+        /**
+         * Returns the page token for the data table to be backed up if the data table name field
+         * presents.
+         *
+         * <p>If the data table name is null, returns -1.
+         */
+        public long getDataTablePageToken() {
+            return mDataTablePageToken;
+        }
+
+        /**
+         * Returns the row id in the change logs request table to for retrieving the token in the
+         * change log table.
+         */
+        public @Nullable String getChangeLogsRequestToken() {
+            return mChangeLogsRequestToken;
+        }
+    }
+
+    /** Creates the backup token table. */
+    public static void applyBackupTokenUpgrade(SQLiteDatabase db) {
+        createTable(db, getCreateTableRequest());
+    }
+
+    /**
+     * @return the table name.
+     */
+    public static String getTableName() {
+        return TABLE_NAME;
+    }
+
+    protected String getMainTableName() {
+        return TABLE_NAME;
+    }
+
+    private static CreateTableRequest getCreateTableRequest() {
+        return new CreateTableRequest(TABLE_NAME, getColumnInfo());
+    }
+
+    private static List<Pair<String, String>> getColumnInfo() {
+        List<Pair<String, String>> columnInfo = new ArrayList<>();
+        columnInfo.add(new Pair<>(PRIMARY_COLUMN_NAME, PRIMARY));
+        columnInfo.add(new Pair<>(DATA_TABLE_NAME_COLUMN_NAME, TEXT_NULL));
+        columnInfo.add(new Pair<>(DATA_TABLE_PAGE_TOKEN_COLUMN_NAME, INTEGER));
+        columnInfo.add(new Pair<>(CHANGE_LOGS_REQUEST_TOKEN_COLUMN_NAME, TEXT_NULL));
+        return columnInfo;
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/BasalMetabolicRateRecordHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/BasalMetabolicRateRecordHelper.java
index 361f06e..ac74f23 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/BasalMetabolicRateRecordHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/BasalMetabolicRateRecordHelper.java
@@ -29,6 +29,7 @@
 import android.health.connect.internal.datatypes.BasalMetabolicRateRecordInternal;
 import android.util.Pair;
 
+import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.AggregateParams;
 import com.android.server.healthconnect.storage.request.AggregateTableRequest;
 
@@ -92,10 +93,14 @@
     }
 
     @Override
-    public double[] deriveAggregate(Cursor cursor, AggregateTableRequest request) {
+    public double[] deriveAggregate(
+            Cursor cursor, AggregateTableRequest request, TransactionManager transactionManager) {
         DeriveBasalCaloriesBurnedHelper deriveBasalCaloriesBurnedHelper =
                 new DeriveBasalCaloriesBurnedHelper(
-                        cursor, BASAL_METABOLIC_RATE_COLUMN_NAME, request.getTimeColumnName());
+                        cursor,
+                        BASAL_METABOLIC_RATE_COLUMN_NAME,
+                        request.getTimeColumnName(),
+                        transactionManager);
         List<Pair<Long, Long>> groupIntervals = request.getGroupSplitIntervals();
         return deriveBasalCaloriesBurnedHelper.getBasalCaloriesBurned(groupIntervals);
     }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsHelper.java
index 4231a9a..ce15b8a 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsHelper.java
@@ -54,9 +54,11 @@
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
 
@@ -67,13 +69,21 @@
  */
 public final class ChangeLogsHelper extends DatabaseHelper {
     public static final String TABLE_NAME = "change_logs_table";
-    private static final String RECORD_TYPE_COLUMN_NAME = "record_type";
+    @VisibleForTesting public static final String RECORD_TYPE_COLUMN_NAME = "record_type";
     @VisibleForTesting public static final String APP_ID_COLUMN_NAME = "app_id";
     @VisibleForTesting public static final String UUIDS_COLUMN_NAME = "uuids";
     @VisibleForTesting public static final String OPERATION_TYPE_COLUMN_NAME = "operation_type";
-    private static final String TIME_COLUMN_NAME = "time";
+    @VisibleForTesting public static final String TIME_COLUMN_NAME = "time";
     private static final int NUM_COLS = 5;
 
+    private final TransactionManager mTransactionManager;
+
+    public ChangeLogsHelper(
+            TransactionManager transactionManager, DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
+        mTransactionManager = transactionManager;
+    }
+
     public static DeleteTableRequest getDeleteRequestForAutoDelete() {
         return new DeleteTableRequest(TABLE_NAME)
                 .setTimeFilter(
@@ -90,16 +100,43 @@
                 .createIndexOn(APP_ID_COLUMN_NAME);
     }
 
+    /** Returns datatypes being written/updates in past 30 days. */
+    public Set<Integer> getRecordTypesWrittenInPast30Days() {
+        Set<Integer> recordTypesWrittenInPast30Days = new HashSet<>();
+        WhereClauses whereClauses =
+                new WhereClauses(AND)
+                        .addWhereEqualsClause(
+                                OPERATION_TYPE_COLUMN_NAME,
+                                String.valueOf(OperationType.OPERATION_TYPE_UPSERT))
+                        .addWhereGreaterThanOrEqualClause(
+                                TIME_COLUMN_NAME,
+                                Instant.now().minus(30, ChronoUnit.DAYS).toEpochMilli());
+
+        final ReadTableRequest readTableRequest =
+                new ReadTableRequest(TABLE_NAME)
+                        .setColumnNames(List.of(RECORD_TYPE_COLUMN_NAME))
+                        .setWhereClause(whereClauses)
+                        .setDistinctClause(true);
+
+        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
+            while (cursor.moveToNext()) {
+                recordTypesWrittenInPast30Days.add(getCursorInt(cursor, RECORD_TYPE_COLUMN_NAME));
+            }
+        }
+        return recordTypesWrittenInPast30Days;
+    }
+
     @Override
     protected String getMainTableName() {
         return TABLE_NAME;
     }
 
     /** Returns change logs post the time when {@code changeLogTokenRequest} was generated */
-    public static ChangeLogsResponse getChangeLogs(
+    public ChangeLogsResponse getChangeLogs(
             AppInfoHelper appInfoHelper,
             ChangeLogsRequestHelper.TokenRequest changeLogTokenRequest,
-            ChangeLogsRequest changeLogsRequest) {
+            ChangeLogsRequest changeLogsRequest,
+            ChangeLogsRequestHelper changeLogsRequestHelper) {
         long token = changeLogTokenRequest.getRowIdChangeLogs();
         WhereClauses whereClause =
                 new WhereClauses(AND)
@@ -123,10 +160,9 @@
                 new ReadTableRequest(TABLE_NAME).setWhereClause(whereClause).setLimit(pageSize + 1);
 
         Map<Integer, ChangeLogs> operationToChangeLogMap = new ArrayMap<>();
-        TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
         long nextChangesToken = DEFAULT_LONG;
         boolean hasMoreRecords = false;
-        try (Cursor cursor = transactionManager.read(readTableRequest)) {
+        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
             int count = 0;
             while (cursor.moveToNext()) {
                 if (count >= pageSize) {
@@ -140,15 +176,15 @@
 
         String nextToken =
                 nextChangesToken != DEFAULT_LONG
-                        ? ChangeLogsRequestHelper.getNextPageToken(
+                        ? changeLogsRequestHelper.getNextPageToken(
                                 changeLogTokenRequest, nextChangesToken)
                         : changeLogsRequest.getToken();
 
         return new ChangeLogsResponse(operationToChangeLogMap, nextToken, hasMoreRecords);
     }
 
-    public static long getLatestRowId() {
-        return TransactionManager.getInitialisedInstance().getLastRowIdFor(TABLE_NAME);
+    public long getLatestRowId() {
+        return mTransactionManager.getLastRowIdFor(TABLE_NAME);
     }
 
     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
@@ -300,10 +336,6 @@
             return this;
         }
 
-        public void clear() {
-            mRecordTypeAndAppIdToUUIDMap.clear();
-        }
-
         /** A helper class to create a pair of recordType and appId */
         private static final class RecordTypeAndAppIdPair {
             private final int mRecordType;
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsRequestHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsRequestHelper.java
index 3a6ec15..1a48dd0 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsRequestHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsRequestHelper.java
@@ -56,14 +56,22 @@
  * @hide
  */
 public final class ChangeLogsRequestHelper extends DatabaseHelper {
+    public static final String TABLE_NAME = "change_log_request_table";
     static final int DEFAULT_CHANGE_LOG_TIME_PERIOD_IN_DAYS = 32;
-    private static final String TABLE_NAME = "change_log_request_table";
     private static final String PACKAGES_TO_FILTERS_COLUMN_NAME = "packages_to_filter";
     private static final String RECORD_TYPES_COLUMN_NAME = "record_types";
     private static final String PACKAGE_NAME_COLUMN_NAME = "package_name";
     private static final String ROW_ID_CHANGE_LOGS_TABLE_COLUMN_NAME = "row_id_change_logs_table";
     private static final String TIME_COLUMN_NAME = "time";
 
+    private final TransactionManager mTransactionManager;
+
+    public ChangeLogsRequestHelper(
+            TransactionManager transactionManager, DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
+        mTransactionManager = transactionManager;
+    }
+
     @Override
     protected String getMainTableName() {
         return TABLE_NAME;
@@ -73,7 +81,8 @@
         return new CreateTableRequest(TABLE_NAME, getColumnInfo());
     }
 
-    public static String getToken(String packageName, ChangeLogTokenRequest request) {
+    public String getToken(
+            long latestChangeLogRowId, String packageName, ChangeLogTokenRequest request) {
         ContentValues contentValues = new ContentValues();
 
         /**
@@ -88,12 +97,48 @@
                 RECORD_TYPES_COLUMN_NAME,
                 StorageUtils.flattenIntArray(request.getRecordTypesArray()));
         contentValues.put(PACKAGE_NAME_COLUMN_NAME, packageName);
-        contentValues.put(ROW_ID_CHANGE_LOGS_TABLE_COLUMN_NAME, ChangeLogsHelper.getLatestRowId());
+        contentValues.put(ROW_ID_CHANGE_LOGS_TABLE_COLUMN_NAME, latestChangeLogRowId);
         contentValues.put(TIME_COLUMN_NAME, Instant.now().toEpochMilli());
 
         return String.valueOf(
-                TransactionManager.getInitialisedInstance()
-                        .insert(new UpsertTableRequest(TABLE_NAME, contentValues)));
+                mTransactionManager.insert(new UpsertTableRequest(TABLE_NAME, contentValues)));
+    }
+
+    public TokenRequest getRequest(String packageName, String token) {
+        ReadTableRequest readTableRequest =
+                new ReadTableRequest(TABLE_NAME)
+                        .setWhereClause(
+                                new WhereClauses(AND)
+                                        .addWhereEqualsClause(PRIMARY_COLUMN_NAME, token)
+                                        .addWhereEqualsClause(
+                                                PACKAGE_NAME_COLUMN_NAME, packageName));
+        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
+            if (!cursor.moveToFirst()) {
+                throw new IllegalArgumentException("Invalid token");
+            }
+
+            return new TokenRequest(
+                    getCursorStringList(cursor, PACKAGES_TO_FILTERS_COLUMN_NAME, DELIMITER),
+                    getCursorIntegerList(cursor, RECORD_TYPES_COLUMN_NAME, DELIMITER),
+                    getCursorString(cursor, PACKAGE_NAME_COLUMN_NAME),
+                    getCursorInt(cursor, ROW_ID_CHANGE_LOGS_TABLE_COLUMN_NAME));
+        }
+    }
+
+    public String getNextPageToken(TokenRequest changeLogTokenRequest, long nextRowId) {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(
+                PACKAGES_TO_FILTERS_COLUMN_NAME,
+                String.join(DELIMITER, changeLogTokenRequest.getPackageNamesToFilter()));
+        contentValues.put(
+                RECORD_TYPES_COLUMN_NAME,
+                StorageUtils.flattenIntList(changeLogTokenRequest.getRecordTypes()));
+        contentValues.put(
+                PACKAGE_NAME_COLUMN_NAME, changeLogTokenRequest.getRequestingPackageName());
+        contentValues.put(ROW_ID_CHANGE_LOGS_TABLE_COLUMN_NAME, nextRowId);
+
+        return String.valueOf(
+                mTransactionManager.insert(new UpsertTableRequest(TABLE_NAME, contentValues)));
     }
 
     public static DeleteTableRequest getDeleteRequestForAutoDelete() {
@@ -118,45 +163,6 @@
         return columnInfo;
     }
 
-    public static TokenRequest getRequest(String packageName, String token) {
-        ReadTableRequest readTableRequest =
-                new ReadTableRequest(TABLE_NAME)
-                        .setWhereClause(
-                                new WhereClauses(AND)
-                                        .addWhereEqualsClause(PRIMARY_COLUMN_NAME, token)
-                                        .addWhereEqualsClause(
-                                                PACKAGE_NAME_COLUMN_NAME, packageName));
-        TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
-        try (Cursor cursor = transactionManager.read(readTableRequest)) {
-            if (!cursor.moveToFirst()) {
-                throw new IllegalArgumentException("Invalid token");
-            }
-
-            return new TokenRequest(
-                    getCursorStringList(cursor, PACKAGES_TO_FILTERS_COLUMN_NAME, DELIMITER),
-                    getCursorIntegerList(cursor, RECORD_TYPES_COLUMN_NAME, DELIMITER),
-                    getCursorString(cursor, PACKAGE_NAME_COLUMN_NAME),
-                    getCursorInt(cursor, ROW_ID_CHANGE_LOGS_TABLE_COLUMN_NAME));
-        }
-    }
-
-    public static String getNextPageToken(TokenRequest changeLogTokenRequest, long nextRowId) {
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(
-                PACKAGES_TO_FILTERS_COLUMN_NAME,
-                String.join(DELIMITER, changeLogTokenRequest.getPackageNamesToFilter()));
-        contentValues.put(
-                RECORD_TYPES_COLUMN_NAME,
-                StorageUtils.flattenIntList(changeLogTokenRequest.getRecordTypes()));
-        contentValues.put(
-                PACKAGE_NAME_COLUMN_NAME, changeLogTokenRequest.getRequestingPackageName());
-        contentValues.put(ROW_ID_CHANGE_LOGS_TABLE_COLUMN_NAME, nextRowId);
-
-        return String.valueOf(
-                TransactionManager.getInitialisedInstance()
-                        .insert(new UpsertTableRequest(TABLE_NAME, contentValues)));
-    }
-
     /** A class to represent the request corresponding to a token */
     public static final class TokenRequest {
         private final List<String> mPackageNamesToFilter;
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DatabaseHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DatabaseHelper.java
index eeabcda..09f36ae 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DatabaseHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DatabaseHelper.java
@@ -16,10 +16,10 @@
 
 package com.android.server.healthconnect.storage.datatypehelpers;
 
-import com.android.server.healthconnect.migration.PriorityMigrationHelper;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.DeleteTableRequest;
 
+import java.util.HashSet;
 import java.util.Set;
 
 /**
@@ -29,39 +29,12 @@
  */
 public abstract class DatabaseHelper {
 
-    private static Set<DatabaseHelper> getDatabaseHelpers() {
-        return Set.of(
-                DeviceInfoHelper.getInstance(),
-                AppInfoHelper.getInstance(),
-                new ActivityDateHelper(),
-                new ChangeLogsHelper(),
-                new ChangeLogsRequestHelper(),
-                HealthDataCategoryPriorityHelper.getInstance(),
-                PreferenceHelper.getInstance(),
-                AccessLogsHelper.getInstance(),
-                new MigrationEntityHelper(),
-                PriorityMigrationHelper.getInstance());
-    }
-
-    /**
-     * Deletes all entries from the database and clears the cache for all the helper class.
-     *
-     * <p>This function is only used for testing, do not use in production.
-     */
-    public static void clearAllData(TransactionManager transactionManager) {
-        for (DatabaseHelper databaseHelper : getDatabaseHelpers()) {
-            databaseHelper.clearData(transactionManager);
-        }
-    }
-
-    public static void clearAllCache() {
-        for (DatabaseHelper databaseHelper : getDatabaseHelpers()) {
-            databaseHelper.clearCache();
-        }
+    protected DatabaseHelper(DatabaseHelpers databaseHelpers) {
+        databaseHelpers.add(this);
     }
 
     /** Deletes all entries from the database and clears the cache for the helper class. */
-    public void clearData(TransactionManager transactionManager) {
+    public synchronized void clearData(TransactionManager transactionManager) {
         transactionManager.delete(new DeleteTableRequest(getMainTableName()));
         clearCache();
     }
@@ -69,4 +42,32 @@
     protected void clearCache() {}
 
     protected abstract String getMainTableName();
+
+    /** A collection of {@link DatabaseHelper}. */
+    public static final class DatabaseHelpers {
+
+        private final Set<DatabaseHelper> mDatabaseHelpers = new HashSet<>();
+
+        /**
+         * Deletes all entries from the database and clears the cache for all the helper class.
+         *
+         * <p>This function is only used for testing, do not use in production.
+         */
+        public void clearAllData(TransactionManager transactionManager) {
+            for (DatabaseHelper databaseHelper : mDatabaseHelpers) {
+                databaseHelper.clearData(transactionManager);
+            }
+        }
+
+        /** Clears cache in all the helpers. */
+        public void clearAllCache() {
+            for (DatabaseHelper databaseHelper : mDatabaseHelpers) {
+                databaseHelper.clearCache();
+            }
+        }
+
+        private void add(DatabaseHelper databaseHelper) {
+            mDatabaseHelpers.add(databaseHelper);
+        }
+    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DatabaseStatsCollector.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DatabaseStatsCollector.java
index 1fa0767..7161c9c 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DatabaseStatsCollector.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DatabaseStatsCollector.java
@@ -16,10 +16,14 @@
 
 package com.android.server.healthconnect.storage.datatypehelpers;
 
-import android.content.Context;
+import android.annotation.Nullable;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteException;
 
 import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+
+import java.util.Collection;
 
 /**
  * Helper class to collect Health Connect database stats for logging.
@@ -28,58 +32,104 @@
  */
 public class DatabaseStatsCollector {
 
+    private static final long NO_DATA = -1;
+
+    private final TransactionManager mTransactionManager;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings =
+            InternalHealthConnectMappings.getInstance();
+
+    public DatabaseStatsCollector(TransactionManager transactionManager) {
+        mTransactionManager = transactionManager;
+    }
+
     /** Get the size of Health Connect database. */
-    public static long getDatabaseSize(Context context) {
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
-        return transactionManager.getDatabaseSize(context);
+    public long getDatabaseSize() {
+        return mTransactionManager.getDatabaseSize();
     }
 
     /** Get the number of interval record entries in Health Connect database. */
-    public static long getNumberOfIntervalRecordRows() {
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
+    public long getNumberOfIntervalRecordRows() {
         long count = 0L;
-        for (RecordHelper<?> recordHelper : RecordHelperProvider.getRecordHelpers().values()) {
+        for (RecordHelper<?> recordHelper : mInternalHealthConnectMappings.getRecordHelpers()) {
             if (recordHelper instanceof IntervalRecordHelper
                     && !(recordHelper instanceof SeriesRecordHelper)) {
-                count +=
-                        transactionManager.getNumberOfEntriesInTheTable(
-                                recordHelper.getMainTableName());
+                count += queryNumEntries(recordHelper.getMainTableName());
             }
         }
         return count;
     }
 
     /** Get the number of series record entries in Health Connect database. */
-    public static long getNumberOfSeriesRecordRows() {
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
+    public long getNumberOfSeriesRecordRows() {
         long count = 0L;
-        for (RecordHelper<?> recordHelper : RecordHelperProvider.getRecordHelpers().values()) {
+        for (RecordHelper<?> recordHelper : mInternalHealthConnectMappings.getRecordHelpers()) {
             if (recordHelper instanceof SeriesRecordHelper) {
-                count +=
-                        transactionManager.getNumberOfEntriesInTheTable(
-                                recordHelper.getMainTableName());
+                count += queryNumEntries(recordHelper.getMainTableName());
             }
         }
         return count;
     }
 
     /** Get the number of instant record entries in Health Connect database. */
-    public static long getNumberOfInstantRecordRows() {
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
+    public long getNumberOfInstantRecordRows() {
         long count = 0L;
-        for (RecordHelper<?> recordHelper : RecordHelperProvider.getRecordHelpers().values()) {
+        for (RecordHelper<?> recordHelper : mInternalHealthConnectMappings.getRecordHelpers()) {
             if (recordHelper instanceof InstantRecordHelper) {
-                count +=
-                        transactionManager.getNumberOfEntriesInTheTable(
-                                recordHelper.getMainTableName());
+                count += queryNumEntries(recordHelper.getMainTableName());
             }
         }
         return count;
     }
 
     /** Get the number of change log entries in Health Connect database. */
-    public static long getNumberOfChangeLogs() {
-        return TransactionManager.getInitialisedInstance()
-                .getNumberOfEntriesInTheTable(ChangeLogsHelper.TABLE_NAME);
+    public long getNumberOfChangeLogs() {
+        return queryNumEntries(ChangeLogsHelper.TABLE_NAME);
+    }
+
+    /** Get the number of rows in the given table. */
+    private long queryNumEntries(String tableName) {
+        return mTransactionManager.queryNumEntries(tableName);
+    }
+
+    /**
+     * Reads the total number of bytes of disk used to store the given tables. See <a
+     * href="https://sqlite.org/dbstat.html">SQLite {@code dbstat} documentation</a>.
+     *
+     * @param tables a collection of table names to add together
+     * @return the total number of bytes used to store those tables, or null if this information
+     *     cannot be read
+     */
+    @Nullable
+    public Long getFileBytes(Collection<String> tables) {
+        if (tables.isEmpty()) {
+            return 0L;
+        }
+        StringBuilder sql = new StringBuilder("SELECT SUM(pgsize) FROM dbstat WHERE name IN (");
+        String[] args = new String[tables.size()];
+        int index = 0;
+        for (String table : tables) {
+            sql.append("?,");
+            args[index++] = table;
+        }
+        sql.setCharAt(sql.length() - 1, ')');
+        try {
+            long bytes =
+                    mTransactionManager.runAsTransaction(
+                            db -> {
+                                try (Cursor cursor = db.rawQuery(sql.toString(), args)) {
+                                    if (!cursor.moveToFirst()) {
+                                        return NO_DATA;
+                                    }
+                                    return cursor.getLong(0);
+                                }
+                            });
+            if (bytes == NO_DATA) {
+                return null;
+            }
+            return bytes;
+        } catch (SQLiteException e) {
+            // This can happen if the dbstat table does not exist. If so, carry on.
+            return null;
+        }
     }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeriveBasalCaloriesBurnedHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeriveBasalCaloriesBurnedHelper.java
index 1bb93b0..2b4f92e 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeriveBasalCaloriesBurnedHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeriveBasalCaloriesBurnedHelper.java
@@ -58,6 +58,7 @@
     private static final String TAG = "DeriveBasalCalories";
     private final Cursor mCursor;
     private final String mColumnName;
+    private final TransactionManager mTransactionManager;
     private double mRateOfEnergyBurntInWatts = 0;
     private String mTimeColumnName;
 
@@ -65,13 +66,17 @@
     private static final int DEFAULT_AGE = 30;
 
     public DeriveBasalCaloriesBurnedHelper(
-            Cursor cursor, String columnName, String timeColumnName) {
+            Cursor cursor,
+            String columnName,
+            String timeColumnName,
+            TransactionManager transactionManager) {
         Objects.requireNonNull(cursor);
         Objects.requireNonNull(columnName);
         Objects.requireNonNull(timeColumnName);
         mCursor = cursor;
         mColumnName = columnName;
         mTimeColumnName = timeColumnName;
+        mTransactionManager = transactionManager;
     }
 
     /**
@@ -141,9 +146,8 @@
                     mRateOfEnergyBurntInWatts, intervalStartTime, intervalEndTime);
         }
 
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
         try (Cursor cursor =
-                transactionManager.read(
+                mTransactionManager.read(
                         new ReadTableRequest(BASAL_METABOLIC_RATE_RECORD_TABLE_NAME)
                                 .setColumnNames(List.of(BASAL_METABOLIC_RATE_COLUMN_NAME))
                                 .setWhereClause(
@@ -313,8 +317,7 @@
 
     private Cursor getReadCursorForDerivingBMR(
             long intervalStartTime, long intervalEndTime, String tableName, String colName) {
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
-        return transactionManager.read(
+        return mTransactionManager.read(
                 new ReadTableRequest(tableName)
                         .setColumnNames(List.of(colName, mTimeColumnName))
                         .setWhereClause(
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeriveTotalCaloriesBurnedHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeriveTotalCaloriesBurnedHelper.java
index 8c01627..09462c7 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeriveTotalCaloriesBurnedHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeriveTotalCaloriesBurnedHelper.java
@@ -53,6 +53,7 @@
     private Cursor mBasalCaloriesBurnedCursor;
     private MergeDataHelper mMergeDataHelper;
     private DeriveBasalCaloriesBurnedHelper mBasalCaloriesBurnedHelper;
+    private final TransactionManager mTransactionManager;
 
     private String mInstantRecordTimeColumnName;
 
@@ -61,7 +62,11 @@
     private boolean mUseLocalTime;
 
     public DeriveTotalCaloriesBurnedHelper(
-            long startTime, long endTime, List<Long> priorityList, boolean useLocaleTime) {
+            long startTime,
+            long endTime,
+            List<Long> priorityList,
+            boolean useLocaleTime,
+            TransactionManager transactionManager) {
         Objects.requireNonNull(priorityList);
         mStartTime = startTime;
         mEndTime = endTime;
@@ -74,13 +79,13 @@
             mInstantRecordTimeColumnName = TIME_COLUMN_NAME;
             mIntervalStartTimeColumnName = START_TIME_COLUMN_NAME;
         }
+        mTransactionManager = transactionManager;
         inititalizeCursors();
     }
 
     private void inititalizeCursors() {
-        final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
         mActiveCaloriesBurnedCursor =
-                transactionManager.read(
+                mTransactionManager.read(
                         new ReadTableRequest(ACTIVE_CALORIES_BURNED_RECORD_TABLE_NAME)
                                 .setWhereClause(
                                         new WhereClauses(AND)
@@ -93,7 +98,7 @@
                                                 .addOrderByClause(
                                                         mIntervalStartTimeColumnName, true)));
         mBasalCaloriesBurnedCursor =
-                transactionManager.read(
+                mTransactionManager.read(
                         new ReadTableRequest(BASAL_METABOLIC_RATE_RECORD_TABLE_NAME)
                                 .setWhereClause(
                                         new WhereClauses(AND)
@@ -116,7 +121,8 @@
                 new DeriveBasalCaloriesBurnedHelper(
                         mBasalCaloriesBurnedCursor,
                         BASAL_METABOLIC_RATE_COLUMN_NAME,
-                        mInstantRecordTimeColumnName);
+                        mInstantRecordTimeColumnName,
+                        mTransactionManager);
     }
 
     /** Close the cursors created */
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeviceInfoHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeviceInfoHelper.java
index 0e14573..08afcfe 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeviceInfoHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeviceInfoHelper.java
@@ -31,7 +31,6 @@
 import android.health.connect.internal.datatypes.RecordInternal;
 import android.util.Pair;
 
-import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
@@ -56,9 +55,6 @@
     private static final String MODEL_COLUMN_NAME = "model";
     private static final String DEVICE_TYPE_COLUMN_NAME = "device_type";
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private static volatile DeviceInfoHelper sDeviceInfoHelper;
-
     /** Map to store deviceInfoId -> DeviceInfo mapping for populating record for read */
     @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
     private volatile ConcurrentHashMap<Long, DeviceInfo> mIdDeviceInfoMap;
@@ -69,7 +65,9 @@
 
     private final TransactionManager mTransactionManager;
 
-    private DeviceInfoHelper(TransactionManager transactionManager) {
+    public DeviceInfoHelper(
+            TransactionManager transactionManager, DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
         mTransactionManager = transactionManager;
     }
 
@@ -206,25 +204,6 @@
         return columnInfo;
     }
 
-    /** Clears instance for test. */
-    @VisibleForTesting
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public static synchronized void resetInstanceForTest() {
-        sDeviceInfoHelper = null;
-    }
-
-    public static DeviceInfoHelper getInstance() {
-        return getInstance(TransactionManager.getInitialisedInstance());
-    }
-
-    /** Returns an instance of DeviceInfoHelper initialised using the given dependencies. */
-    public static synchronized DeviceInfoHelper getInstance(TransactionManager transactionManager) {
-        if (sDeviceInfoHelper == null) {
-            sDeviceInfoHelper = new DeviceInfoHelper(transactionManager);
-        }
-        return sDeviceInfoHelper;
-    }
-
     private static final class DeviceInfo {
         private final String mManufacturer;
         private final String mModel;
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ExerciseSessionRecordHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ExerciseSessionRecordHelper.java
index fccff40..a932293 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ExerciseSessionRecordHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ExerciseSessionRecordHelper.java
@@ -64,7 +64,7 @@
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.request.UpsertTableRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.SqlJoin;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 import com.android.server.healthconnect.storage.utils.TableColumnPair;
@@ -465,7 +465,8 @@
                         }
                     };
             readRequest.setRecordHelper(
-                    RecordHelperProvider.getRecordHelper(RECORD_TYPE_PLANNED_EXERCISE_SESSION));
+                    InternalHealthConnectMappings.getInstance()
+                            .getRecordHelper(RECORD_TYPE_PLANNED_EXERCISE_SESSION));
             result.add(readRequest);
         }
         // There may have been a previous reference to this exercise, search for those references.
@@ -483,7 +484,8 @@
                 COMPLETED_SESSION_ID_COLUMN_NAME, StorageUtils.getHexString(upsertedRecordId));
         affectedTrainingPlanReadRequest.setWhereClause(whereStatement);
         affectedTrainingPlanReadRequest.setRecordHelper(
-                RecordHelperProvider.getRecordHelper(RECORD_TYPE_PLANNED_EXERCISE_SESSION));
+                InternalHealthConnectMappings.getInstance()
+                        .getRecordHelper(RECORD_TYPE_PLANNED_EXERCISE_SESSION));
         result.add(affectedTrainingPlanReadRequest);
         return result;
     }
@@ -503,7 +505,8 @@
                 COMPLETED_SESSION_ID_COLUMN_NAME, StorageUtils.getHexString(deletedRecordUuid));
         affectedTrainingPlanReadRequest.setWhereClause(whereStatement);
         affectedTrainingPlanReadRequest.setRecordHelper(
-                RecordHelperProvider.getRecordHelper(RECORD_TYPE_PLANNED_EXERCISE_SESSION));
+                InternalHealthConnectMappings.getInstance()
+                        .getRecordHelper(RECORD_TYPE_PLANNED_EXERCISE_SESSION));
         return Collections.singletonList(affectedTrainingPlanReadRequest);
     }
 
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelper.java
index 887c524..d63c17f 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelper.java
@@ -18,7 +18,6 @@
 
 import static android.health.connect.HealthPermissions.getDataCategoriesWithWritePermissionsForPackage;
 import static android.health.connect.HealthPermissions.getPackageHasWriteHealthPermissionsForCategory;
-import static android.health.connect.internal.datatypes.utils.RecordTypeRecordCategoryMapper.getRecordCategoryForRecordType;
 
 import static com.android.server.healthconnect.storage.request.UpsertTableRequest.TYPE_STRING;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.DELIMITER;
@@ -27,20 +26,21 @@
 import static com.android.server.healthconnect.storage.utils.StorageUtils.TEXT_NOT_NULL;
 
 import android.content.ContentValues;
-import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.health.connect.HealthDataCategory;
-import android.health.connect.HealthPermissions;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.os.UserHandle;
 import android.util.Pair;
 import android.util.Slog;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-import com.android.server.healthconnect.permission.HealthConnectPermissionHelper;
+import com.android.server.healthconnect.HealthConnectThreadScheduler;
 import com.android.server.healthconnect.permission.PackageInfoUtils;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
 import com.android.server.healthconnect.storage.request.DeleteTableRequest;
@@ -75,33 +75,35 @@
             "android:string/config_defaultHealthConnectApp";
     public static final String INACTIVE_APPS_ADDED = "inactive_apps_added";
 
+    private StorageContext mUserContext;
     private final AppInfoHelper mAppInfoHelper;
     private final PackageInfoUtils mPackageInfoUtils;
-    private final HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
     private final TransactionManager mTransactionManager;
     private final PreferenceHelper mPreferenceHelper;
-
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private static volatile HealthDataCategoryPriorityHelper sHealthDataCategoryPriorityHelper;
+    private final HealthConnectMappings mHealthConnectMappings;
 
     /**
      * map of {@link HealthDataCategory} to list of app ids from {@link AppInfoHelper}, in the order
      * of their priority
      */
+    @Nullable
     private volatile ConcurrentHashMap<Integer, List<Long>> mHealthDataCategoryToAppIdPriorityMap;
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private HealthDataCategoryPriorityHelper(
+    public HealthDataCategoryPriorityHelper(
+            StorageContext userContext,
             AppInfoHelper appInfoHelper,
             TransactionManager transactionManager,
-            HealthConnectDeviceConfigManager healthConnectDeviceConfigManager,
             PreferenceHelper preferenceHelper,
-            PackageInfoUtils packageInfoUtils) {
+            PackageInfoUtils packageInfoUtils,
+            HealthConnectMappings healthConnectMappings,
+            DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
+        mUserContext = userContext;
         mAppInfoHelper = appInfoHelper;
         mPackageInfoUtils = packageInfoUtils;
-        mHealthConnectDeviceConfigManager = healthConnectDeviceConfigManager;
         mTransactionManager = transactionManager;
         mPreferenceHelper = preferenceHelper;
+        mHealthConnectMappings = healthConnectMappings;
     }
 
     /**
@@ -112,6 +114,64 @@
         return new CreateTableRequest(PRIORITY_TABLE_NAME, getColumnInfo());
     }
 
+    @Override
+    public synchronized void clearCache() {
+        mHealthDataCategoryToAppIdPriorityMap = null;
+    }
+
+    /** Setup HealthDataCategoryPriorityHelper for the given user. */
+    public synchronized void setupForUser(StorageContext userContext) {
+        mUserContext = userContext;
+        // While we already call clearCache() in HCManager.onUserSwitching(), calling this again
+        // here in case any of the methods below was called in between that initialized the cache
+        // with the wrong context.
+        clearCache();
+        HealthConnectThreadScheduler.scheduleInternalTask(
+                () -> {
+                    reSyncHealthDataPriorityTable();
+                    addInactiveAppsWhenFirstMigratingToNewAggregationControl();
+                });
+    }
+
+    @Override
+    protected String getMainTableName() {
+        return PRIORITY_TABLE_NAME;
+    }
+
+    /** See appendToPriorityList below */
+    public synchronized void appendToPriorityList(
+            String packageName, @HealthDataCategory.Type int dataCategory, UserHandle user) {
+        if (!mUserContext.getUser().equals(user)) {
+            // We are currently limited to be able to update the priority list for the foreground
+            // user only. User will need to manually add the app to the priority list later.
+            return;
+        }
+        appendToPriorityList(packageName, dataCategory, /* isInactiveApp */ false);
+    }
+
+    /** See maybeRemoveAppFromPriorityList below */
+    public synchronized void maybeRemoveAppFromPriorityList(
+            String packageName, @HealthDataCategory.Type int dataCategory, UserHandle user) {
+        if (!mUserContext.getUser().equals(user)) {
+            // We are currently limited to be able to update the priority list for the foreground
+            // user only. Apps will be removed from the priority list when the device switches to
+            // this user  if they no longer have permissions.
+            return;
+        }
+        maybeRemoveAppFromPriorityList(packageName, dataCategory);
+    }
+
+    /** See maybeRemoveAppFromPriorityList below */
+    public synchronized void maybeRemoveAppFromPriorityList(String packageName, UserHandle user) {
+        if (!mUserContext.getUser().equals(user)) {
+            // We are currently limited to be able to update the priority list for the foreground
+            // user only. Apps will be removed from the priority list when the device switches to
+            // this user  if they no longer have permissions.
+            return;
+        }
+        maybeRemoveAppFromPriorityList(packageName);
+    }
+
     /**
      * Appends a packageName to the priority list for this category when an app gets write
      * permissions or during the one-time operation to add inactive apps.
@@ -119,22 +179,18 @@
      * <p>Inactive apps are added at the bottom of the priority list even if they are the default
      * app.
      */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     public synchronized void appendToPriorityList(
-            String packageName,
-            @HealthDataCategory.Type int dataCategory,
-            Context context,
-            boolean isInactiveApp) {
+            String packageName, @HealthDataCategory.Type int dataCategory, boolean isInactiveApp) {
         List<Long> newPriorityOrder;
         getHealthDataCategoryToAppIdPriorityMap().putIfAbsent(dataCategory, new ArrayList<>());
-        long appInfoId = mAppInfoHelper.getOrInsertAppInfoId(packageName, context);
+        long appInfoId = mAppInfoHelper.getOrInsertAppInfoId(packageName);
         if (getHealthDataCategoryToAppIdPriorityMap().get(dataCategory).contains(appInfoId)) {
             return;
         }
         newPriorityOrder =
                 new ArrayList<>(getHealthDataCategoryToAppIdPriorityMap().get(dataCategory));
 
-        if (isDefaultApp(packageName, context) && !isInactiveApp) {
+        if (isDefaultApp(packageName) && !isInactiveApp) {
             newPriorityOrder.add(0, appInfoId);
         } else {
             newPriorityOrder.add(appInfoId);
@@ -149,9 +205,10 @@
     }
 
     @VisibleForTesting
-    boolean isDefaultApp(String packageName, Context context) {
+    boolean isDefaultApp(String packageName) {
         String defaultApp =
-                context.getResources()
+                mUserContext
+                        .getResources()
                         .getString(
                                 Resources.getSystem()
                                         .getIdentifier(DEFAULT_APP_RESOURCE_NAME, null, null));
@@ -161,75 +218,51 @@
 
     /**
      * Removes a packageName from the priority list of a particular category if the package name
-     * does not have any granted write permissions. In the new aggregation source control, the
-     * package name is not removed if it has data in this category.
+     * does not have any granted write permissions and has no data.
      */
     public synchronized void maybeRemoveAppFromPriorityList(
-            String packageName,
-            @HealthDataCategory.Type int dataCategory,
-            HealthConnectPermissionHelper permissionHelper,
-            UserHandle userHandle) {
+            String packageName, @HealthDataCategory.Type int dataCategory) {
+        PackageInfo packageInfo =
+                mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(
+                        packageName, mUserContext.getUser(), mUserContext);
 
-        final List<String> grantedPermissions =
-                permissionHelper.getGrantedHealthPermissions(packageName, userHandle);
-        for (String permission : HealthPermissions.getWriteHealthPermissionsFor(dataCategory)) {
-            if (grantedPermissions.contains(permission)) {
-                return;
-            }
+        // If package is not found, assume no permissions are granted.
+        if (packageInfo == null
+                || !getPackageHasWriteHealthPermissionsForCategory(
+                        packageInfo, dataCategory, mUserContext)) {
+            removeAppFromPriorityListIfNoDataExists(dataCategory, packageName);
         }
-
-        maybeRemoveAppFromPriorityListInternal(dataCategory, packageName);
     }
 
     /**
-     * Removes apps from the priority list if they no longer hold write permissions to the category
-     * and have no data for that category.
-     *
-     * <p>If the new aggregation source control flag is off, apps that don't have write permissions
-     * are removed regardless of whether they hold data in that category.
+     * Removes a packageName from the priority list of all categories if the package name does not
+     * have any granted write permissions and has no data.
      */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public synchronized void updateHealthDataPriority(
-            String[] packageNames, UserHandle user, Context context) {
-        Objects.requireNonNull(packageNames);
-        Objects.requireNonNull(user);
-        Objects.requireNonNull(context);
-        for (String packageName : packageNames) {
-            PackageInfo packageInfo =
-                    mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(
-                            packageName, user, context);
-
-            Set<Integer> dataCategoriesWithWritePermission =
-                    getDataCategoriesWithWritePermissionsForPackage(packageInfo, context);
-
-            for (int category : getHealthDataCategoryToAppIdPriorityMap().keySet()) {
-                if (!dataCategoriesWithWritePermission.contains(category)) {
-                    maybeRemoveAppFromPriorityListInternal(category, packageInfo.packageName);
-                }
-            }
+    public synchronized void maybeRemoveAppFromPriorityList(String packageName) {
+        for (Integer dataCategory : getHealthDataCategoryToAppIdPriorityMap().keySet()) {
+            maybeRemoveAppFromPriorityList(packageName, dataCategory);
         }
     }
 
     /**
-     * Removes app from priorityList for all HealthData Categories if the package is uninstalled or
-     * if it has no health permissions. In the new aggregation source behaviour, the package name is
-     * not removed if it still has health data in a category.
+     * Removes a packageName from the priority list of a particular category if the package name has
+     * no data.
+     *
+     * <p>Assumes that the app has no write permission.
      */
     public synchronized void maybeRemoveAppWithoutWritePermissionsFromPriorityList(
             String packageName) {
-        Objects.requireNonNull(packageName);
         for (Integer dataCategory : getHealthDataCategoryToAppIdPriorityMap().keySet()) {
-            maybeRemoveAppFromPriorityListInternal(dataCategory, packageName);
+            removeAppFromPriorityListIfNoDataExists(dataCategory, packageName);
         }
     }
 
-    /** Returns list of package names based on priority for the input {@link HealthDataCategory} */
-    public List<String> getPriorityOrder(@HealthDataCategory.Type int type, Context context) {
-        boolean newAggregationSourceControl =
-                mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled();
-        if (newAggregationSourceControl) {
-            reSyncHealthDataPriorityTable(context);
-        }
+    /**
+     * Refreshes the priority list and returns the list of package names based on priority for the
+     * input {@link HealthDataCategory}
+     */
+    public List<String> syncAndGetPriorityOrder(@HealthDataCategory.Type int type) {
+        reSyncHealthDataPriorityTable();
         return mAppInfoHelper.getPackageNames(getAppIdPriorityOrder(type));
     }
 
@@ -251,15 +284,7 @@
      * needs to be sanitised before applying the operation.
      */
     public void setPriorityOrder(int dataCategory, List<String> packagePriorityOrder) {
-        boolean newAggregationSourceControl =
-                mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled();
-
         List<Long> newPriorityOrder = mAppInfoHelper.getAppInfoIds(packagePriorityOrder);
-
-        if (!newAggregationSourceControl) {
-            newPriorityOrder = sanitizePriorityOder(dataCategory, newPriorityOrder);
-        }
-
         safelyUpdateDBAndUpdateCache(
                 new UpsertTableRequest(
                         PRIORITY_TABLE_NAME,
@@ -269,46 +294,12 @@
                 newPriorityOrder);
     }
 
-    /**
-     * Sanitizes the new priority order by ensuring it contains the same elements as the old
-     * priority order, for the old behaviour of aggregation source control.
-     */
-    private List<Long> sanitizePriorityOder(int dataCategory, List<Long> newPriorityOrder) {
-
-        List<Long> currentPriorityOrder =
-                getHealthDataCategoryToAppIdPriorityMap()
-                        .getOrDefault(dataCategory, Collections.emptyList());
-
-        // Remove appId from the priority order if it is not part of the current priority order,
-        // this is because in the time app tried to update the order an app permission might
-        // have been removed, and we only store priority order of apps with permission.
-        newPriorityOrder.removeIf(priorityOrder -> !currentPriorityOrder.contains(priorityOrder));
-
-        // Make sure we don't remove any new entries. So append old priority in new priority and
-        // remove duplicates
-        newPriorityOrder.addAll(currentPriorityOrder);
-        newPriorityOrder = newPriorityOrder.stream().distinct().collect(Collectors.toList());
-
-        return newPriorityOrder;
-    }
-
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    @Override
-    public synchronized void clearCache() {
-        mHealthDataCategoryToAppIdPriorityMap = null;
-    }
-
-    @Override
-    protected String getMainTableName() {
-        return PRIORITY_TABLE_NAME;
-    }
-
     private Map<Integer, List<Long>> getHealthDataCategoryToAppIdPriorityMap() {
         if (mHealthDataCategoryToAppIdPriorityMap == null) {
             populateDataCategoryToAppIdPriorityMap();
         }
 
-        return mHealthDataCategoryToAppIdPriorityMap;
+        return Objects.requireNonNull(mHealthDataCategoryToAppIdPriorityMap);
     }
 
     /** Returns an immutable map of data categories along with their priority order. */
@@ -343,7 +334,7 @@
             @HealthDataCategory.Type int dataCategory,
             List<Long> newList) {
         try {
-            mTransactionManager.insertOrReplace(request);
+            mTransactionManager.insertOrReplaceOnConflict(request);
             getHealthDataCategoryToAppIdPriorityMap().put(dataCategory, newList);
         } catch (Exception e) {
             Slog.e(TAG, "Priority update failed", e);
@@ -389,52 +380,8 @@
         return columnInfo;
     }
 
-    public static HealthDataCategoryPriorityHelper getInstance() {
-        return getInstance(
-                AppInfoHelper.getInstance(),
-                TransactionManager.getInitialisedInstance(),
-                HealthConnectDeviceConfigManager.getInitialisedInstance(),
-                PreferenceHelper.getInstance(),
-                PackageInfoUtils.getInstance());
-    }
-
-    public static synchronized HealthDataCategoryPriorityHelper getInstance(
-            AppInfoHelper appInfoHelper,
-            TransactionManager transactionManager,
-            HealthConnectDeviceConfigManager healthConnectDeviceConfigManager,
-            PreferenceHelper preferenceHelper,
-            PackageInfoUtils packageInfoUtils) {
-        if (sHealthDataCategoryPriorityHelper == null) {
-            sHealthDataCategoryPriorityHelper =
-                    new HealthDataCategoryPriorityHelper(
-                            appInfoHelper,
-                            transactionManager,
-                            healthConnectDeviceConfigManager,
-                            preferenceHelper,
-                            packageInfoUtils);
-        }
-
-        return sHealthDataCategoryPriorityHelper;
-    }
-
-    /** Used in testing to clear the instance to clear and re-reference the mocks. */
-    @VisibleForTesting
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public static synchronized void clearInstanceForTest() {
-        sHealthDataCategoryPriorityHelper = null;
-    }
-
     /** Syncs priority table with the permissions and data. */
-    public synchronized void reSyncHealthDataPriorityTable(Context context) {
-        Objects.requireNonNull(context);
-        boolean newAggregationSourceControl =
-                mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled();
-        // Candidates to be added to the priority list
-        Map<Integer, List<Long>> dataCategoryToAppIdMapHavingPermission =
-                getHealthDataCategoryToAppIdPriorityMap().entrySet().stream()
-                        .collect(
-                                Collectors.toMap(
-                                        Map.Entry::getKey, e -> new ArrayList<>(e.getValue())));
+    public synchronized void reSyncHealthDataPriorityTable() {
         // Candidates to be removed from the priority list
         Map<Integer, Set<Long>> dataCategoryToAppIdMapWithoutPermission =
                 getHealthDataCategoryToAppIdPriorityMap().entrySet().stream()
@@ -442,22 +389,13 @@
                                 Collectors.toMap(
                                         Map.Entry::getKey, e -> new HashSet<>(e.getValue())));
 
-        List<PackageInfo> validHealthApps = getValidHealthApps(context);
+        List<PackageInfo> validHealthApps = getValidHealthApps();
         for (PackageInfo packageInfo : validHealthApps) {
             Set<Integer> dataCategoriesWithWritePermissionsForThisPackage =
-                    getDataCategoriesWithWritePermissionsForPackage(packageInfo, context);
-            long appInfoId = mAppInfoHelper.getOrInsertAppInfoId(packageInfo.packageName, context);
+                    getDataCategoriesWithWritePermissionsForPackage(packageInfo, mUserContext);
+            long appInfoId = mAppInfoHelper.getOrInsertAppInfoId(packageInfo.packageName);
 
             for (int dataCategory : dataCategoriesWithWritePermissionsForThisPackage) {
-                List<Long> appIdsHavingPermission =
-                        dataCategoryToAppIdMapHavingPermission.getOrDefault(
-                                dataCategory, new ArrayList<>());
-                if (!appIdsHavingPermission.contains(appInfoId)
-                        && appIdsHavingPermission.add(appInfoId)) {
-                    dataCategoryToAppIdMapHavingPermission.put(
-                            dataCategory, appIdsHavingPermission);
-                }
-
                 Set<Long> appIdsWithoutPermission =
                         dataCategoryToAppIdMapWithoutPermission.getOrDefault(
                                 dataCategory, new HashSet<>());
@@ -468,33 +406,31 @@
             }
         }
 
-        // The new behaviour does not automatically add to the priority list if there is
-        // a write permission for a package name
-        if (!newAggregationSourceControl) {
-            updateTableWithNewPriorityList(dataCategoryToAppIdMapHavingPermission);
+        // Remove any apps without any permission for the category, if they have no data present.
+        for (Map.Entry<Integer, Set<Long>> entry :
+                dataCategoryToAppIdMapWithoutPermission.entrySet()) {
+            for (Long appInfoId : entry.getValue()) {
+                removeAppFromPriorityListIfNoDataExists(
+                        entry.getKey(), mAppInfoHelper.getPackageName(appInfoId));
+            }
         }
-        maybeRemoveAppsFromPriorityList(dataCategoryToAppIdMapWithoutPermission);
-        maybeAddContributingAppsIfEmpty(context);
+        addContributingAppsIfCategoryListIsEmpty();
     }
 
     /** Returns a list of PackageInfos holding health permissions for this user. */
-    private List<PackageInfo> getValidHealthApps(Context context) {
-        UserHandle user = mTransactionManager.getCurrentUserHandle();
-        Context currentUserContext = context.createContextAsUser(user, /*flags*/ 0);
-        return mPackageInfoUtils.getPackagesHoldingHealthPermissions(user, currentUserContext);
+    private List<PackageInfo> getValidHealthApps() {
+        return mPackageInfoUtils.getPackagesHoldingHealthPermissions(
+                mUserContext.getUser(), mUserContext);
     }
 
     /**
-     * Removes a packageName from the priority list of a category. For the new aggregation source
-     * control, the package name is not removed if it has data in that category.
+     * Removes a packageName from the priority list of a category. The package name is not removed
+     * if it has data in that category.
      */
-    private synchronized void maybeRemoveAppFromPriorityListInternal(
+    private synchronized void removeAppFromPriorityListIfNoDataExists(
             @HealthDataCategory.Type int dataCategory, String packageName) {
-        boolean newAggregationSourceControl =
-                mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled();
         boolean dataExistsForPackageName = appHasDataInCategory(packageName, dataCategory);
-        if (newAggregationSourceControl && dataExistsForPackageName) {
-            // Do not remove if data exists for packageName in the new aggregation
+        if (dataExistsForPackageName) {
             return;
         }
 
@@ -525,36 +461,14 @@
     }
 
     /**
-     * Removes apps without permissions for these categories from the priority list. In the new
-     * aggregation source control, the packages are not removed if they still have data in these
-     * categories.
-     */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    private synchronized void maybeRemoveAppsFromPriorityList(
-            Map<Integer, Set<Long>> dataCategoryToAppIdsWithoutPermissions) {
-        for (int dataCategory : dataCategoryToAppIdsWithoutPermissions.keySet()) {
-            for (Long appInfoId : dataCategoryToAppIdsWithoutPermissions.get(dataCategory)) {
-                maybeRemoveAppFromPriorityListInternal(
-                        dataCategory, mAppInfoHelper.getPackageName(appInfoId));
-            }
-        }
-    }
-
-    /**
      * If the priority list is empty for a {@link HealthDataCategory}, add the contributing apps.
      *
      * <p>This is necessary because the priority list should never be empty if there are
      * contributing apps present.
      */
-    private synchronized void maybeAddContributingAppsIfEmpty(Context context) {
-        List.of(
-                        HealthDataCategory.ACTIVITY,
-                        HealthDataCategory.BODY_MEASUREMENTS,
-                        HealthDataCategory.CYCLE_TRACKING,
-                        HealthDataCategory.NUTRITION,
-                        HealthDataCategory.SLEEP,
-                        HealthDataCategory.VITALS,
-                        HealthDataCategory.WELLNESS)
+    private synchronized void addContributingAppsIfCategoryListIsEmpty() {
+        mHealthConnectMappings
+                .getAllHealthDataCategories()
                 .forEach(
                         (category) ->
                                 getHealthDataCategoryToAppIdPriorityMap()
@@ -572,87 +486,47 @@
                                         appendToPriorityList(
                                                 contributingApp,
                                                 dataCategory,
-                                                context,
-                                                isInactiveApp(
-                                                        dataCategory, contributingApp, context)));
-            }
-        }
-    }
-
-    private synchronized void updateTableWithNewPriorityList(
-            Map<Integer, List<Long>> healthDataCategoryToAppIdPriorityMap) {
-        for (int dataCategory : healthDataCategoryToAppIdPriorityMap.keySet()) {
-            List<Long> appInfoIdList =
-                    List.copyOf(healthDataCategoryToAppIdPriorityMap.get(dataCategory));
-            if (!appInfoIdList.equals(
-                    getHealthDataCategoryToAppIdPriorityMap().get(dataCategory))) {
-                safelyUpdateDBAndUpdateCache(
-                        new UpsertTableRequest(
-                                PRIORITY_TABLE_NAME,
-                                getContentValuesFor(dataCategory, appInfoIdList),
-                                UNIQUE_COLUMN_INFO),
-                        dataCategory,
-                        appInfoIdList);
+                                                isInactiveApp(dataCategory, contributingApp)));
             }
         }
     }
 
     /**
-     * A one-time operation which adds contributing apps to the priority list if the new aggregation
-     * source controls are available.
+     * A one-time operation which adds contributing inactive apps to the priority list.
      *
      * <p>The contributing apps are added in ascending order of their package names.
-     *
-     * <p>Originally only inactive apps were added, extending this to all contributing apps is a
-     * workaround for the case when the device to device transfer empties the priority list.
      */
-    public void maybeAddContributingAppsToPriorityList(Context context) {
-        if (!shouldAddContributingApps()) {
+    public void addInactiveAppsWhenFirstMigratingToNewAggregationControl() {
+        if (!shouldAddInactiveApps()) {
             return;
         }
 
-        Map<Integer, Set<String>> contributingApps = getAllContributorApps();
+        Map<Integer, Set<String>> inactiveApps = getAllInactiveApps();
 
-        for (Map.Entry<Integer, Set<String>> entry : contributingApps.entrySet()) {
+        for (Map.Entry<Integer, Set<String>> entry : inactiveApps.entrySet()) {
             int category = entry.getKey();
             entry.getValue().stream()
                     .sorted()
                     .forEach(
                             packageName ->
                                     appendToPriorityList(
-                                            packageName,
-                                            category,
-                                            context,
-                                            isInactiveApp(category, packageName, context)));
+                                            packageName, category, /* isInactiveApp= */ true));
         }
 
         mPreferenceHelper.insertOrReplacePreference(INACTIVE_APPS_ADDED, String.valueOf(true));
     }
 
-    private boolean isInactiveApp(
-            @HealthDataCategory.Type int dataCategory, String packageName, Context context) {
-        Map<Integer, Set<String>> inactiveApps = getAllInactiveApps(context);
+    private boolean isInactiveApp(@HealthDataCategory.Type int dataCategory, String packageName) {
+        Map<Integer, Set<String>> inactiveApps = getAllInactiveApps();
         return inactiveApps.getOrDefault(dataCategory, new HashSet<>()).contains(packageName);
     }
 
-    private boolean shouldAddContributingApps() {
-        boolean newAggregationSourceControl =
-                mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled();
-
-        if (!newAggregationSourceControl) {
-            return false;
-        }
-
+    private boolean shouldAddInactiveApps() {
         String haveInactiveAppsBeenAddedString =
                 mPreferenceHelper.getPreference(INACTIVE_APPS_ADDED);
 
-        // No-op if this operation has already been completed
-        if (haveInactiveAppsBeenAddedString != null
-                && Boolean.parseBoolean(haveInactiveAppsBeenAddedString)) {
-            return false;
-        }
-
-        return true;
+        return haveInactiveAppsBeenAddedString == null
+                || !Boolean.parseBoolean(haveInactiveAppsBeenAddedString);
     }
 
     @VisibleForTesting
@@ -669,7 +543,7 @@
         for (Map.Entry<Integer, Set<String>> entry : recordTypeToContributingPackages.entrySet()) {
             Integer recordType = entry.getKey();
             Set<String> contributingPackages = entry.getValue();
-            int recordCategory = getRecordCategoryForRecordType(recordType);
+            int recordCategory = mHealthConnectMappings.getRecordCategoryForRecordType(recordType);
             boolean isPackageNameContributor = contributingPackages.contains(packageName);
             if (isPackageNameContributor) {
                 dataCategoriesWithData.add(recordCategory);
@@ -690,7 +564,8 @@
         Map<Integer, Set<String>> allContributorApps = new HashMap<>();
 
         for (Map.Entry<Integer, Set<String>> entry : recordTypeToContributingPackages.entrySet()) {
-            int recordCategory = getRecordCategoryForRecordType(entry.getKey());
+            int recordCategory =
+                    mHealthConnectMappings.getRecordCategoryForRecordType(entry.getKey());
             Set<String> contributingPackages = entry.getValue();
 
             Set<String> currentPackages =
@@ -708,7 +583,7 @@
      * <p>An inactive app is one that has data for the dataCategory but no write permissions.
      */
     @VisibleForTesting
-    Map<Integer, Set<String>> getAllInactiveApps(Context context) {
+    Map<Integer, Set<String>> getAllInactiveApps() {
         Map<Integer, Set<String>> allContributorApps = getAllContributorApps();
         Map<Integer, Set<String>> inactiveApps = new HashMap<>();
 
@@ -716,11 +591,16 @@
             int category = entry.getKey();
             Set<String> contributorApps = entry.getValue();
 
-            for (String app : contributorApps) {
-                if (!appHasWriteHealthPermissionsForCategory(app, category, context)) {
+            for (String packageName : contributorApps) {
+                PackageInfo packageInfo =
+                        mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(
+                                packageName, mUserContext.getUser(), mUserContext);
+                if (packageInfo == null
+                        || !getPackageHasWriteHealthPermissionsForCategory(
+                                packageInfo, category, mUserContext)) {
                     Set<String> currentPackages =
                             inactiveApps.getOrDefault(category, new HashSet<>());
-                    if (currentPackages.add(app)) {
+                    if (currentPackages.add(packageName)) {
                         inactiveApps.put(category, currentPackages);
                     }
                 }
@@ -729,26 +609,4 @@
 
         return inactiveApps;
     }
-
-    /**
-     * Returns true if this packageName has at least one granted WRITE permission for this
-     * dataCategory.
-     */
-    @VisibleForTesting
-    boolean appHasWriteHealthPermissionsForCategory(
-            String packageName, @HealthDataCategory.Type int dataCategory, Context context) {
-
-        List<PackageInfo> validHealthApps = getValidHealthApps(context);
-
-        for (PackageInfo validHealthApp : validHealthApps) {
-            if (Objects.equals(validHealthApp.packageName, packageName)) {
-                if (getPackageHasWriteHealthPermissionsForCategory(
-                        validHealthApp, dataCategory, context)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/MedicalDataSourceHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/MedicalDataSourceHelper.java
index 35bbef1..74530de 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/MedicalDataSourceHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/MedicalDataSourceHelper.java
@@ -18,21 +18,20 @@
 
 import static android.health.connect.Constants.DEFAULT_LONG;
 import static android.health.connect.Constants.MAXIMUM_ALLOWED_CURSOR_COUNT;
+import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_DELETE;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_READ;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_UPSERT;
+import static android.health.connect.datatypes.FhirVersion.parseFhirVersion;
 
 import static com.android.server.healthconnect.storage.HealthConnectDatabase.createTable;
-import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getAppIdsWhereClause;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getIntersectionOfResourceTypesReadAndGrantedReadPermissions;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getJoinWithIndicesTableFilterOnMedicalResourceTypes;
-import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getJoinWithMedicalDataSourceFilterOnAppIds;
-import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getJoinWithMedicalDataSourceFilterOnDataSourceIds;
-import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getJoinWithMedicalDataSourceFilterOnDataSourceIdsAndAppId;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getReadRequestForDistinctResourceTypesBelongingToDataSourceIds;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper.getMedicalResourceTypeColumnName;
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.LAST_MODIFIED_TIME_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.PRIMARY_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.request.ReadTableRequest.UNION;
+import static com.android.server.healthconnect.storage.utils.SqlJoin.INNER_QUERY_ALIAS;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.BLOB_UNIQUE_NON_NULL;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.INTEGER_NOT_NULL;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.PRIMARY;
@@ -41,6 +40,7 @@
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorLong;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorString;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorUUID;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.isNullValue;
 import static com.android.server.healthconnect.storage.utils.WhereClauses.LogicalOperator.AND;
 
 import android.annotation.Nullable;
@@ -52,7 +52,9 @@
 import android.database.sqlite.SQLiteException;
 import android.health.connect.Constants;
 import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.datatypes.FhirVersion;
 import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
 import android.net.Uri;
 import android.util.Pair;
 
@@ -92,12 +94,16 @@
 
     @VisibleForTesting static final String DISPLAY_NAME_COLUMN_NAME = "display_name";
     @VisibleForTesting static final String FHIR_BASE_URI_COLUMN_NAME = "fhir_base_uri";
+    @VisibleForTesting static final String FHIR_VERSION_COLUMN_NAME = "fhir_version";
     @VisibleForTesting static final String DATA_SOURCE_UUID_COLUMN_NAME = "data_source_uuid";
     private static final String APP_INFO_ID_COLUMN_NAME = "app_info_id";
     private static final String MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME =
             "medical_data_source_row_id";
     private static final List<Pair<String, Integer>> UNIQUE_COLUMNS_INFO =
             List.of(new Pair<>(DATA_SOURCE_UUID_COLUMN_NAME, UpsertTableRequest.TYPE_BLOB));
+    private static final String LAST_RESOURCES_MODIFIED_TIME_ALIAS = "last_data_update_time";
+    private static final String LAST_DATA_SOURCE_MODIFIED_TIME_ALIAS =
+            "last_data_source_update_time";
 
     private final TransactionManager mTransactionManager;
     private final AppInfoHelper mAppInfoHelper;
@@ -131,12 +137,17 @@
         return APP_INFO_ID_COLUMN_NAME;
     }
 
+    public static String getFhirVersionColumnName() {
+        return FHIR_VERSION_COLUMN_NAME;
+    }
+
     private static List<Pair<String, String>> getColumnInfo() {
         return List.of(
                 Pair.create(MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME, PRIMARY),
                 Pair.create(APP_INFO_ID_COLUMN_NAME, INTEGER_NOT_NULL),
                 Pair.create(DISPLAY_NAME_COLUMN_NAME, TEXT_NOT_NULL),
                 Pair.create(FHIR_BASE_URI_COLUMN_NAME, TEXT_NOT_NULL),
+                Pair.create(FHIR_VERSION_COLUMN_NAME, TEXT_NOT_NULL),
                 Pair.create(DATA_SOURCE_UUID_COLUMN_NAME, BLOB_UNIQUE_NON_NULL),
                 Pair.create(LAST_MODIFIED_TIME_COLUMN_NAME, INTEGER_NOT_NULL));
     }
@@ -199,20 +210,6 @@
         return whereClauses;
     }
 
-    /** Creates {@link ReadTableRequest} that joins with {@link AppInfoHelper#TABLE_NAME}. */
-    private static ReadTableRequest getReadTableRequestJoinWithAppInfo() {
-        return new ReadTableRequest(getMainTableName())
-                .setJoinClause(getJoinClauseWithAppInfoTable());
-    }
-
-    /**
-     * Creates {@link ReadTableRequest} that joins with {@link AppInfoHelper#TABLE_NAME} and filters
-     * for the given list of {@code ids}.
-     */
-    public static ReadTableRequest getReadTableRequestJoinWithAppInfo(List<UUID> ids) {
-        return getReadTableRequest(ids).setJoinClause(getJoinClauseWithAppInfoTable());
-    }
-
     /** Creates {@link ReadTableRequest} for the given list of {@code ids}. */
     public static ReadTableRequest getReadTableRequest(List<UUID> ids) {
         return new ReadTableRequest(getMainTableName())
@@ -228,6 +225,24 @@
                 .setJoinType(SqlJoin.SQL_JOIN_INNER);
     }
 
+    private static SqlJoin getInnerJoinClauseWithMedicalResourcesTable() {
+        return new SqlJoin(
+                        MEDICAL_DATA_SOURCE_TABLE_NAME,
+                        MedicalResourceHelper.getMainTableName(),
+                        MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME,
+                        MedicalResourceHelper.getDataSourceIdColumnName())
+                .setJoinType(SqlJoin.SQL_JOIN_INNER);
+    }
+
+    private static SqlJoin getLeftJoinClauseWithMedicalResourcesTable() {
+        return new SqlJoin(
+                        MEDICAL_DATA_SOURCE_TABLE_NAME,
+                        MedicalResourceHelper.getMainTableName(),
+                        MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME,
+                        MedicalResourceHelper.getDataSourceIdColumnName())
+                .setJoinType(SqlJoin.SQL_JOIN_LEFT);
+    }
+
     /**
      * Returns a {@link WhereClauses} that limits to data sources with id in {@code ids}.
      *
@@ -244,7 +259,7 @@
      * {@link Constants#MAXIMUM_ALLOWED_CURSOR_COUNT} data sources, it throws {@link
      * IllegalArgumentException}.
      */
-    private static List<MedicalDataSource> getMedicalDataSources(Cursor cursor) {
+    public static List<MedicalDataSource> getMedicalDataSources(Cursor cursor) {
         if (cursor.getCount() > MAXIMUM_ALLOWED_CURSOR_COUNT) {
             throw new IllegalArgumentException(
                     "Too many data sources in the cursor. Max allowed: "
@@ -259,16 +274,49 @@
         return medicalDataSources;
     }
 
+    /**
+     * Returns List of pair of {@link MedicalDataSource}s and their associated {@link
+     * MedicalDataSourceHelper#LAST_DATA_SOURCE_MODIFIED_TIME_ALIAS} from the cursor. If the cursor
+     * contains more than {@link Constants#MAXIMUM_ALLOWED_CURSOR_COUNT} data sources, it throws
+     * {@link IllegalArgumentException}.
+     */
+    public static List<Pair<MedicalDataSource, Long>> getMedicalDataSourcesWithTimestamps(
+            Cursor cursor) {
+        if (cursor.getCount() > MAXIMUM_ALLOWED_CURSOR_COUNT) {
+            throw new IllegalStateException(
+                    "Too many data sources in the cursor. Max allowed: "
+                            + MAXIMUM_ALLOWED_CURSOR_COUNT);
+        }
+        List<Pair<MedicalDataSource, Long>> medicalDataSourceAndTimestamps = new ArrayList<>();
+        if (cursor.moveToFirst()) {
+            do {
+                long lastModifiedTimestamp =
+                        getCursorLong(cursor, LAST_DATA_SOURCE_MODIFIED_TIME_ALIAS);
+                MedicalDataSource medicalDataSource = getMedicalDataSource(cursor);
+                medicalDataSourceAndTimestamps.add(
+                        new Pair<>(medicalDataSource, lastModifiedTimestamp));
+            } while (cursor.moveToNext());
+        }
+        return medicalDataSourceAndTimestamps;
+    }
+
     private static MedicalDataSource getMedicalDataSource(Cursor cursor) {
+        Instant lastDataUpdateTime =
+                isNullValue(cursor, LAST_RESOURCES_MODIFIED_TIME_ALIAS)
+                        ? null
+                        : Instant.ofEpochMilli(
+                                getCursorLong(cursor, LAST_RESOURCES_MODIFIED_TIME_ALIAS));
+
         return new MedicalDataSource.Builder(
                         /* id= */ getCursorUUID(cursor, DATA_SOURCE_UUID_COLUMN_NAME).toString(),
                         /* packageName= */ getCursorString(
                                 cursor, AppInfoHelper.PACKAGE_COLUMN_NAME),
                         /* fhirBaseUri= */ Uri.parse(
                                 getCursorString(cursor, FHIR_BASE_URI_COLUMN_NAME)),
-                        /* displayName= */ getCursorString(cursor, DISPLAY_NAME_COLUMN_NAME))
-                // TODO(b/365756516) Populate this value from DB
-                .setLastDataUpdateTime(null)
+                        /* displayName= */ getCursorString(cursor, DISPLAY_NAME_COLUMN_NAME),
+                        /* fhirVersion= */ parseFhirVersion(
+                                getCursorString(cursor, FHIR_VERSION_COLUMN_NAME)))
+                .setLastDataUpdateTime(lastDataUpdateTime)
                 .build();
     }
 
@@ -284,6 +332,8 @@
     public MedicalDataSource createMedicalDataSource(
             Context context, CreateMedicalDataSourceRequest request, String packageName) {
         try {
+            // Get the appInfoId outside the transaction
+            long appInfoId = mAppInfoHelper.getOrInsertAppInfoId(packageName);
             return mTransactionManager.runAsTransaction(
                     (TransactionManager.TransactionRunnableWithReturn<
                                     MedicalDataSource, RuntimeException>)
@@ -292,6 +342,7 @@
                                             db,
                                             context,
                                             request,
+                                            appInfoId,
                                             packageName,
                                             mTimeSource.getInstantNow()));
         } catch (SQLiteConstraintException e) {
@@ -307,9 +358,9 @@
             SQLiteDatabase db,
             Context context,
             CreateMedicalDataSourceRequest request,
+            long appInfoId,
             String packageName,
             Instant instant) {
-        long appInfoId = mAppInfoHelper.getOrInsertAppInfoId(db, packageName, context);
 
         if (getMedicalDataSourcesCount(appInfoId) >= MAX_ALLOWED_MEDICAL_DATA_SOURCES) {
             throw new IllegalArgumentException(
@@ -332,18 +383,17 @@
     private int getMedicalDataSourcesCount(long appInfoId) {
         ReadTableRequest readTableRequest =
                 new ReadTableRequest(getMainTableName())
-                        .setColumnNames(List.of("COUNT(*)"))
                         .setJoinClause(getJoinClauseWithAppInfoTable());
         readTableRequest.setWhereClause(
                 new WhereClauses(AND)
                         .addWhereInLongsClause(APP_INFO_ID_COLUMN_NAME, List.of(appInfoId)));
-        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
-            if (cursor.moveToFirst()) {
-                return cursor.getInt(0);
-            } else {
-                throw new IllegalStateException("Could not get data sources count");
-            }
-        }
+        return mTransactionManager.count(readTableRequest);
+    }
+
+    /** Returns the total number of medical data sources in HC database. */
+    public int getMedicalDataSourcesCount() {
+        ReadTableRequest readTableRequest = new ReadTableRequest(getMainTableName());
+        return mTransactionManager.count(readTableRequest);
     }
 
     /**
@@ -355,8 +405,8 @@
      */
     public List<MedicalDataSource> getMedicalDataSourcesByIdsWithoutPermissionChecks(List<UUID> ids)
             throws SQLiteException {
-        ReadTableRequest readTableRequest = getReadTableRequestJoinWithAppInfo(ids);
-        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
+        String query = getReadQueryForDataSourcesFilterOnIds(ids);
+        try (Cursor cursor = mTransactionManager.rawQuery(query, /* selectionArgs= */ null)) {
             return getMedicalDataSources(cursor);
         }
     }
@@ -380,7 +430,6 @@
             boolean isCalledFromBgWithoutBgRead,
             AppInfoHelper appInfoHelper)
             throws SQLiteException {
-        // TODO(b/359892459): Add CTS tests once it is properly implemented.
         if (!hasWritePermission && grantedReadMedicalResourceTypes.isEmpty()) {
             throw new IllegalStateException("no read or write permission");
         }
@@ -398,53 +447,66 @@
                 (TransactionManager.TransactionRunnableWithReturn<
                                 List<MedicalDataSource>, RuntimeException>)
                         db -> {
-                            ReadTableRequest readTableRequest =
-                                    getReadRequestBasedOnPermissionFilters(
+                            String query =
+                                    getReadQueryBasedOnPermissionFilters(
                                             ids,
                                             grantedReadMedicalResourceTypes,
                                             appId,
                                             hasWritePermission,
                                             isCalledFromBgWithoutBgRead);
 
-                            List<MedicalDataSource> medicalDataSources;
-                            try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
-                                medicalDataSources = getMedicalDataSources(cursor);
-                            }
-
-                            // If the app is called from background but without background read
-                            // permission, the most the app can do, is to read their own data. Same
-                            // when the grantedReadMedicalResourceTypes is empty. And we don't need
-                            // to add access logs when an app intends to access their own data. If
-                            // medicalDataSources is empty, it means that the app hasn't read any
-                            // dataSources out, so no need to add access logs either.
-                            if (!isCalledFromBgWithoutBgRead
-                                    && !grantedReadMedicalResourceTypes.isEmpty()
-                                    && !medicalDataSources.isEmpty()) {
-                                // We need to figure out from the dataSources that were read, what
-                                // is the resource types relevant to those dataSources, we add
-                                // access logs only if there's any intersection between read
-                                // permissions and resource types's dataSources. If intersection is
-                                // empty, it means that the data read was accessed through self
-                                // read, hence no access log needed.
-                                Set<Integer> resourceTypes =
-                                        getIntersectionOfResourceTypesReadAndGrantedReadPermissions(
-                                                getMedicalResourceTypesBelongingToDataSourceIds(
-                                                        getUUIDsRead(medicalDataSources)),
-                                                grantedReadMedicalResourceTypes);
-                                if (!resourceTypes.isEmpty()) {
-                                    mAccessLogsHelper.addAccessLog(
-                                            db,
-                                            callingPackageName,
-                                            /* medicalResourceTypes= */ Set.of(),
-                                            OPERATION_TYPE_READ,
-                                            /* accessedMedicalDataSource= */ true);
-                                }
-                            }
-
-                            return medicalDataSources;
+                            return readMedicalDataSourcesAndAddAccessLog(
+                                    db,
+                                    query,
+                                    grantedReadMedicalResourceTypes,
+                                    callingPackageName,
+                                    isCalledFromBgWithoutBgRead);
                         });
     }
 
+    private List<MedicalDataSource> readMedicalDataSourcesAndAddAccessLog(
+            SQLiteDatabase db,
+            String readQuery,
+            Set<Integer> grantedReadMedicalResourceTypes,
+            String callingPackageName,
+            boolean isCalledFromBgWithoutBgRead) {
+        List<MedicalDataSource> medicalDataSources;
+        try (Cursor cursor = mTransactionManager.rawQuery(readQuery, /* selectionArgs= */ null)) {
+            medicalDataSources = getMedicalDataSources(cursor);
+        }
+
+        // If the app is called from background but without background read
+        // permission, the most the app can do, is to read their own data. Same
+        // when the grantedReadMedicalResourceTypes is empty. And we don't need
+        // to add access logs when an app intends to access their own data. If
+        // medicalDataSources is empty, it means that the app hasn't read any
+        // dataSources out, so no need to add access logs either.
+        if (!isCalledFromBgWithoutBgRead
+                && !grantedReadMedicalResourceTypes.isEmpty()
+                && !medicalDataSources.isEmpty()) {
+            // We need to figure out from the dataSources that were read, what
+            // is the resource types relevant to those dataSources, we add
+            // access logs only if there's any intersection between read
+            // permissions and resource types's dataSources. If intersection is
+            // empty, it means that the data read was accessed through self
+            // read, hence no access log needed.
+            Set<Integer> resourceTypes =
+                    getIntersectionOfResourceTypesReadAndGrantedReadPermissions(
+                            getMedicalResourceTypesBelongingToDataSourceIds(
+                                    getUUIDsRead(medicalDataSources)),
+                            grantedReadMedicalResourceTypes);
+            if (!resourceTypes.isEmpty()) {
+                mAccessLogsHelper.addAccessLog(
+                        db,
+                        callingPackageName,
+                        /* medicalResourceTypes= */ Set.of(),
+                        OPERATION_TYPE_READ,
+                        /* accessedMedicalDataSource= */ true);
+            }
+        }
+        return medicalDataSources;
+    }
+
     private Set<Integer> getMedicalResourceTypesBelongingToDataSourceIds(List<UUID> dataSourceIds) {
         Set<Integer> resourceTypes = new HashSet<>();
         ReadTableRequest readRequest =
@@ -466,15 +528,15 @@
                 .collect(Collectors.toList());
     }
 
-    private static ReadTableRequest getReadRequestBasedOnPermissionFilters(
+    private static String getReadQueryBasedOnPermissionFilters(
             List<UUID> ids,
             Set<Integer> grantedReadMedicalResourceTypes,
             long appId,
             boolean hasWritePermission,
             boolean isCalledFromBgWithoutBgRead) {
         // Reading all dataSource ids that are written by the calling package.
-        ReadTableRequest readAllIdsWrittenByCallingPackage =
-                getReadTableRequestForAllDataSourcesWrittenByCallingApp(ids, appId);
+        String readAllIdsWrittenByCallingPackage =
+                getReadQueryForDataSourcesFilterOnSourceIdsAndAppIds(ids, Set.of(appId));
 
         // App is calling the API from background without background read permission.
         if (isCalledFromBgWithoutBgRead) {
@@ -487,14 +549,14 @@
             // App has normal read permission for some medicalResourceTypes.
             // App can read the dataSources that belong to those medicalResourceTypes
             // and were written by the app itself.
-            return getReadTableRequestForDataSourceWrittenByAppIdFilterOnResourceTypes(
-                    ids, grantedReadMedicalResourceTypes, appId);
+            return getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+                    ids, Set.of(appId), grantedReadMedicalResourceTypes);
         }
 
         // The request to read out all dataSource ids belonging to the medicalResourceTypes of
         // the grantedReadMedicalResourceTypes.
-        ReadTableRequest readIdsOfTheGrantedMedicalResourceTypes =
-                getReadTableRequestForDataSourcesFilterOnResourceTypes(
+        String readIdsOfTheGrantedMedicalResourceTypes =
+                getReadQueryForDataSourcesFilterOnSourceIdsAndResourceTypes(
                         ids, grantedReadMedicalResourceTypes);
 
         // App is in background with backgroundReadPermission or in foreground.
@@ -511,8 +573,8 @@
             // UNION ALL allows for duplicate values, but we want the rows to be distinct.
             // Hence why we use normal UNION.
             return readAllIdsWrittenByCallingPackage
-                    .setUnionReadRequests(List.of(readIdsOfTheGrantedMedicalResourceTypes))
-                    .setUnionType(UNION);
+                    + UNION
+                    + readIdsOfTheGrantedMedicalResourceTypes;
         }
         // App is in background with background read permission or in foreground.
         // App has some read permissions for medicalResourceTypes.
@@ -522,87 +584,6 @@
         return readIdsOfTheGrantedMedicalResourceTypes;
     }
 
-    @VisibleForTesting
-    static ReadTableRequest getReadTableRequestForDataSourceWrittenByAppIdFilterOnResourceTypes(
-            List<UUID> ids, Set<Integer> medicalResourceTypes, long appId) {
-        SqlJoin joinWithDataSource =
-                getJoinWithMedicalDataSourceFilterOnDataSourceIdsAndAppId(
-                        ids, appId, getJoinClauseWithAppInfoTable());
-        SqlJoin joinWithIndices =
-                getJoinWithIndicesTableFilterOnMedicalResourceTypes(medicalResourceTypes);
-        return getReadTableRequestForDataSources(joinWithDataSource.attachJoin(joinWithIndices));
-    }
-
-    @VisibleForTesting
-    static ReadTableRequest getReadTableRequestForDataSourcesFilterOnResourceTypes(
-            List<UUID> ids, Set<Integer> medicalResourceTypes) {
-        SqlJoin joinWithDataSource =
-                getJoinWithMedicalDataSourceFilterOnDataSourceIds(
-                        ids, getJoinClauseWithAppInfoTable());
-        SqlJoin joinWithIndices =
-                getJoinWithIndicesTableFilterOnMedicalResourceTypes(medicalResourceTypes);
-        return getReadTableRequestForDataSources(joinWithDataSource.attachJoin(joinWithIndices));
-    }
-
-    /**
-     * Creates a {@link ReadTableRequest} filtering on the given {@code appIds} and {@code
-     * medicalResourceTypes}. If either sets are empty, they won't be taken into account when
-     * filtering.
-     */
-    private static ReadTableRequest getReadTableRequestFilterOnAppIdAndResourceTypes(
-            Set<Long> appIds, Set<Integer> medicalResourceTypes) {
-        SqlJoin joinWithDataSource =
-                getJoinWithMedicalDataSourceFilterOnAppIds(appIds, getJoinClauseWithAppInfoTable());
-        SqlJoin joinWithIndices =
-                getJoinWithIndicesTableFilterOnMedicalResourceTypes(medicalResourceTypes);
-        return getReadTableRequestForDataSources(joinWithDataSource.attachJoin(joinWithIndices));
-    }
-
-    private static ReadTableRequest getReadTableRequestForDataSources(SqlJoin joinClause) {
-        return new ReadTableRequest(MedicalResourceHelper.getMainTableName())
-                .setDistinctClause(true)
-                .setColumnNames(
-                        List.of(
-                                AppInfoHelper.PACKAGE_COLUMN_NAME,
-                                DATA_SOURCE_UUID_COLUMN_NAME,
-                                FHIR_BASE_URI_COLUMN_NAME,
-                                DISPLAY_NAME_COLUMN_NAME))
-                .setJoinClause(joinClause);
-    }
-
-    /**
-     * Creates {@link ReadTableRequest} that joins with {@link AppInfoHelper#TABLE_NAME} and filters
-     * for the given list of {@code ids} and {@code appId}.
-     */
-    private static ReadTableRequest getReadTableRequestForAllDataSourcesWrittenByCallingApp(
-            List<UUID> ids, long appId) {
-        return getReadTableRequest(ids, appId)
-                .setDistinctClause(true)
-                .setColumnNames(
-                        List.of(
-                                AppInfoHelper.PACKAGE_COLUMN_NAME,
-                                DATA_SOURCE_UUID_COLUMN_NAME,
-                                FHIR_BASE_URI_COLUMN_NAME,
-                                DISPLAY_NAME_COLUMN_NAME))
-                .setJoinClause(getJoinClauseWithAppInfoTable());
-    }
-
-    /**
-     * Creates {@link ReadTableRequest} that joins with {@link AppInfoHelper#TABLE_NAME} and filters
-     * for the given {@code appId}.
-     */
-    private static ReadTableRequest getReadRequestForDataSourcesWrittenByCallingApp(long appId) {
-        return new ReadTableRequest(getMainTableName())
-                .setWhereClause(getAppIdsWhereClause(Set.of(appId)))
-                .setColumnNames(
-                        List.of(
-                                AppInfoHelper.PACKAGE_COLUMN_NAME,
-                                DATA_SOURCE_UUID_COLUMN_NAME,
-                                FHIR_BASE_URI_COLUMN_NAME,
-                                DISPLAY_NAME_COLUMN_NAME))
-                .setJoinClause(getJoinClauseWithAppInfoTable());
-    }
-
     /**
      * Returns the {@link MedicalDataSource}s stored in the HealthConnect database, optionally
      * restricted by package name.
@@ -614,14 +595,14 @@
      */
     public List<MedicalDataSource> getMedicalDataSourcesByPackageWithoutPermissionChecks(
             Set<String> packageNames) throws SQLiteException {
-        ReadTableRequest readTableRequest = getReadTableRequestJoinWithAppInfo();
-        if (!packageNames.isEmpty()) {
+        String query;
+        if (packageNames.isEmpty()) {
+            query = getReadQueryForDataSources();
+        } else {
             List<Long> appInfoIds = mAppInfoHelper.getAppInfoIds(packageNames.stream().toList());
-            readTableRequest.setWhereClause(
-                    new WhereClauses(AND)
-                            .addWhereInLongsClause(APP_INFO_ID_COLUMN_NAME, appInfoIds));
+            query = getReadQueryForDataSourcesFilterOnAppIds(new HashSet<>(appInfoIds));
         }
-        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
+        try (Cursor cursor = mTransactionManager.rawQuery(query, /* selectionArgs= */ null)) {
             return getMedicalDataSources(cursor);
         }
     }
@@ -640,7 +621,6 @@
      *     self data and the app is filtering using {@code packageNames} but the app itself is not
      *     included in it.
      */
-    // TODO(b/359892459): Add CTS tests once it is properly implemented.
     public List<MedicalDataSource> getMedicalDataSourcesByPackageWithPermissionChecks(
             Set<String> packageNames,
             Set<Integer> grantedReadMedicalResourceTypes,
@@ -682,29 +662,36 @@
             throw new IllegalArgumentException(
                     "app doesn't have permission to read based on the given packages");
         }
+        return mTransactionManager.runAsTransaction(
+                (TransactionManager.TransactionRunnableWithReturn<
+                                List<MedicalDataSource>, RuntimeException>)
+                        db -> {
+                            String readQuery =
+                                    getReadQueryByPackagesWithPermissionChecks(
+                                            new HashSet<>(appIds),
+                                            grantedReadMedicalResourceTypes,
+                                            callingAppId,
+                                            hasWritePermission,
+                                            isCalledFromBgWithoutBgRead);
 
-        ReadTableRequest readTableRequest =
-                getReadRequestByPackagesWithPermissionChecks(
-                        new HashSet<>(appIds),
-                        grantedReadMedicalResourceTypes,
-                        callingAppId,
-                        hasWritePermission,
-                        isCalledFromBgWithoutBgRead);
-
-        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
-            return getMedicalDataSources(cursor);
-        }
+                            return readMedicalDataSourcesAndAddAccessLog(
+                                    db,
+                                    readQuery,
+                                    grantedReadMedicalResourceTypes,
+                                    callingPackageName,
+                                    isCalledFromBgWithoutBgRead);
+                        });
     }
 
-    private static ReadTableRequest getReadRequestByPackagesWithPermissionChecks(
+    private static String getReadQueryByPackagesWithPermissionChecks(
             Set<Long> appIds,
             Set<Integer> grantedReadMedicalResourceTypes,
             long callingAppId,
             boolean hasWritePermission,
             boolean isCalledFromBgWithoutBgRead) {
         // Reading all dataSources written by the calling app.
-        ReadTableRequest readAllDataSourcesWrittenByCallingPackage =
-                getReadRequestForDataSourcesWrittenByCallingApp(callingAppId);
+        String readAllDataSourcesWrittenByCallingPackage =
+                getReadQueryForDataSourcesFilterOnAppIds(Set.of(callingAppId));
 
         // App is calling the API from background without background read permission.
         if (isCalledFromBgWithoutBgRead) {
@@ -717,14 +704,14 @@
             // App has normal read permission for some medicalResourceTypes.
             // App can read the dataSources that belong to those medicalResourceTypes
             // and were written by the app itself.
-            return getReadTableRequestFilterOnAppIdAndResourceTypes(
+            return getReadQueryForDataSourcesFilterOnAppIdsAndResourceTypes(
                     Set.of(callingAppId), grantedReadMedicalResourceTypes);
         }
 
         // The request to read out all dataSources belonging to the medicalResourceTypes of
         // the grantedReadMedicalResourceTypes and written by the given packageNames.
-        ReadTableRequest readDataSourcesOfTheGrantedMedicalResourceTypes =
-                getReadTableRequestFilterOnAppIdAndResourceTypes(
+        String readDataSourcesOfTheGrantedMedicalResourceTypes =
+                getReadQueryForDataSourcesFilterOnAppIdsAndResourceTypes(
                         appIds, grantedReadMedicalResourceTypes);
 
         // App is in background with backgroundReadPermission or in foreground.
@@ -748,8 +735,8 @@
             // UNION ALL allows for duplicate values, but we want the rows to be distinct.
             // Hence why we use normal UNION.
             return readDataSourcesOfTheGrantedMedicalResourceTypes
-                    .setUnionReadRequests(List.of(readAllDataSourcesWrittenByCallingPackage))
-                    .setUnionType(UNION);
+                    + UNION
+                    + readAllDataSourcesWrittenByCallingPackage;
         }
         // App is in background with background read permission or in foreground.
         // App has some read permissions for medicalResourceTypes.
@@ -759,6 +746,174 @@
         return readDataSourcesOfTheGrantedMedicalResourceTypes;
     }
 
+    private static String getReadQueryForDataSourcesFilterOnIds(List<UUID> dataSourceIds) {
+        return getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+                dataSourceIds, null, null);
+    }
+
+    private static String getReadQueryForDataSourcesFilterOnAppIds(Set<Long> appInfoIds) {
+        return getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+                null, appInfoIds, null);
+    }
+
+    private static String getReadQueryForDataSourcesFilterOnSourceIdsAndAppIds(
+            List<UUID> dataSourceIds, Set<Long> appInfoIds) {
+        return getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+                dataSourceIds, appInfoIds, null);
+    }
+
+    private static String getReadQueryForDataSourcesFilterOnSourceIdsAndResourceTypes(
+            List<UUID> dataSourceIds, Set<Integer> resourceTypes) {
+        return getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+                dataSourceIds, null, resourceTypes);
+    }
+
+    private static String getReadQueryForDataSourcesFilterOnAppIdsAndResourceTypes(
+            Set<Long> appInfoIds, Set<Integer> resourceTypes) {
+        return getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+                null, appInfoIds, resourceTypes);
+    }
+
+    public static String getReadQueryForDataSources() {
+        return getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(null, null, null);
+    }
+
+    /**
+     * Create a {@link ReadTableRequest} to read a dataSource using the given {@code displayName}
+     * and {@code appId}.
+     */
+    public static ReadTableRequest getReadQueryForDataSourcesUsingUniqueIds(
+            String displayName, long appId) {
+        ReadTableRequest dataSourceReadUsingUniqueIds =
+                new ReadTableRequest(getMainTableName())
+                        .setWhereClause(getReadTableWhereClause(displayName, appId))
+                        .setColumnNames(List.of(MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME));
+        return dataSourceReadUsingUniqueIds;
+    }
+
+    private static WhereClauses getReadTableWhereClause(String displayName, long appId) {
+        return new WhereClauses(AND)
+                .addWhereInLongsClause(APP_INFO_ID_COLUMN_NAME, List.of(appId))
+                .addWhereInClause(DISPLAY_NAME_COLUMN_NAME, List.of(displayName));
+    }
+
+    /**
+     * Returns the rowId of the {@link MedicalDataSource} read in the given {@link Cursor}.
+     *
+     * <p>This is only used in the DatabaseMerger code, to read the result of a query which filters
+     * out {@link MedicalDataSource}s based on a given displayName and appId. Since these two are
+     * part of the unique ID of {@link MedicalDataSource}, it throws {@link IllegalStateException}
+     * if there isn't exactly one row in the {@link Cursor}.
+     */
+    public static long readDisplayNameAndAppIdFromCursor(Cursor cursor) {
+        if (cursor.getCount() != 1) {
+            throw new IllegalStateException(
+                    "There should only exist one dataSource row with the given displayName and"
+                            + " appId.");
+        }
+        if (cursor.moveToFirst()) {
+            return getCursorLong(cursor, MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME);
+        } else {
+            throw new IllegalStateException(
+                    "No dataSources with the displayName and appId exists.");
+        }
+    }
+
+    /**
+     * Creates a read query optionally restricted by dataSourceIds, appInfoIds and resourceTypes.
+     *
+     * <p>If {@code dataSourceIds}, {@code appInfoIds} or {@code resourceTypes} is null, no
+     * filtering occurs for that dimension. If {@code resourceTypes} are provided the returned query
+     * filters by data sources that have {@link MedicalResource} for at least one of those types.
+     *
+     * <p>If {@code resourceTypes} are provided, the query joins to the MedicalResource table to
+     * only return data source row ids, which have data for the provided {@code resourceTypes}.
+     *
+     * <p>The query joins to the AppInfoId table to get the packageName, and to the MedicalResources
+     * table to get the MAX lastDataUpdateTime for resources linked to a data source.
+     */
+    @VisibleForTesting
+    static String getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+            @Nullable List<UUID> dataSourceIds,
+            @Nullable Set<Long> appInfoIds,
+            @Nullable Set<Integer> resourceTypes) {
+        // We create a read request to read all filtered data source row ids first, which can then
+        // be used in the WHERE clause. This is needed so that if we filter data sources by resource
+        // types we can still do a join with the MedicalResource table to include all resources for
+        // calculating the last data update time.
+        WhereClauses filteredDataSourceRowIdsReadWhereClauses = new WhereClauses(AND);
+        if (dataSourceIds != null) {
+            filteredDataSourceRowIdsReadWhereClauses = getReadTableWhereClause(dataSourceIds);
+        }
+        if (appInfoIds != null) {
+            filteredDataSourceRowIdsReadWhereClauses.addWhereInLongsClause(
+                    APP_INFO_ID_COLUMN_NAME, appInfoIds);
+        }
+        ReadTableRequest filteredDataSourceRowIdsReadRequest =
+                new ReadTableRequest(getMainTableName())
+                        .setWhereClause(filteredDataSourceRowIdsReadWhereClauses)
+                        .setColumnNames(List.of(MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME));
+        if (resourceTypes != null) {
+            SqlJoin medicalResourcesAndIndicesJoinClauseFilterOnResourceType =
+                    getInnerJoinClauseWithMedicalResourcesTable()
+                            .attachJoin(
+                                    getJoinWithIndicesTableFilterOnMedicalResourceTypes(
+                                            resourceTypes));
+            filteredDataSourceRowIdsReadRequest.setJoinClause(
+                    medicalResourcesAndIndicesJoinClauseFilterOnResourceType);
+        }
+
+        List<String> groupByColumns =
+                List.of(
+                        MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME,
+                        DISPLAY_NAME_COLUMN_NAME,
+                        FHIR_BASE_URI_COLUMN_NAME,
+                        FHIR_VERSION_COLUMN_NAME,
+                        DATA_SOURCE_UUID_COLUMN_NAME,
+                        AppInfoHelper.PACKAGE_COLUMN_NAME);
+        String resourcesLastModifiedTimeColumnSelect =
+                String.format(
+                        "MAX(%1$s.%2$s) AS %3$s",
+                        MedicalResourceHelper.getMainTableName(),
+                        LAST_MODIFIED_TIME_COLUMN_NAME,
+                        LAST_RESOURCES_MODIFIED_TIME_ALIAS);
+        String dataSourceLastModifiedTime =
+                String.format(
+                        "%1$s.%2$s AS %3$s",
+                        INNER_QUERY_ALIAS,
+                        LAST_MODIFIED_TIME_COLUMN_NAME,
+                        LAST_DATA_SOURCE_MODIFIED_TIME_ALIAS);
+        List<String> allColumns = new ArrayList<>();
+        allColumns.add(resourcesLastModifiedTimeColumnSelect);
+        allColumns.add(dataSourceLastModifiedTime);
+        allColumns.addAll(groupByColumns);
+
+        WhereClauses dataSourceIdFilterWhereClause =
+                new WhereClauses(AND)
+                        .addWhereInSQLRequestClause(
+                                MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME,
+                                filteredDataSourceRowIdsReadRequest);
+        // LEFT JOIN to the MedicalResources table to not exclude data sources that don't have any
+        // linked resources yet.
+        SqlJoin appInfoAndMedicalResourcesJoinClause =
+                getJoinClauseWithAppInfoTable()
+                        .attachJoin(getLeftJoinClauseWithMedicalResourcesTable());
+
+        ReadTableRequest dataSourcesReadRequest =
+                new ReadTableRequest(getMainTableName())
+                        .setWhereClause(dataSourceIdFilterWhereClause)
+                        .setJoinClause(appInfoAndMedicalResourcesJoinClause)
+                        .setColumnNames(allColumns);
+
+        // "GROUP BY" is not supported in ReadTableRequest and should be achieved via
+        // AggregateTableRequest. But the AggregateTableRequest is too complicated for our use case
+        // here (requiring RecordHelper), so we just build and return raw SQL query which appends
+        // the "GROUP BY" clause directly.
+        return dataSourcesReadRequest.getReadCommand()
+                + " GROUP BY "
+                + String.join(",", groupByColumns);
+    }
+
     /**
      * Creates {@link UpsertTableRequest} for the given {@link CreateMedicalDataSourceRequest} and
      * {@code appInfoId}.
@@ -773,51 +928,92 @@
         return new UpsertTableRequest(getMainTableName(), contentValues, UNIQUE_COLUMNS_INFO);
     }
 
-    /**
-     * Deletes the {@link MedicalDataSource}s stored in the HealthConnect database using the given
-     * list of {@code ids}.
-     *
-     * <p>Note that this deletes without producing change logs, or access logs.
-     *
-     * @param id the id to delete.
-     * @param appInfoIdRestriction if non-null, restricts any deletions to data sources owned by the
-     *     given app. If null allows deletions of any data sources.
-     * @throws IllegalArgumentException if the id does not exist, or there is an
-     *     appInfoIdRestriction and the data source is owned by a different app
-     */
-    public void deleteMedicalDataSource(UUID id, @Nullable Long appInfoIdRestriction)
-            throws SQLiteException {
+    private static DeleteTableRequest getDeleteRequestForDataSourceUuid(
+            UUID id, @Nullable Long appInfoIdRestriction) {
         DeleteTableRequest request =
                 new DeleteTableRequest(MEDICAL_DATA_SOURCE_TABLE_NAME)
                         .setIds(
                                 DATA_SOURCE_UUID_COLUMN_NAME,
                                 StorageUtils.getListOfHexStrings(List.of(id)));
-        if (appInfoIdRestriction != null) {
-            request.setPackageFilter(APP_INFO_ID_COLUMN_NAME, List.of(appInfoIdRestriction));
+        if (appInfoIdRestriction == null) {
+            return request;
         }
-        ReadTableRequest readTableRequest = getReadTableRequest(List.of(id), appInfoIdRestriction);
-        boolean success =
-                mTransactionManager.runAsTransaction(
-                        db -> {
-                            try (Cursor cursor = mTransactionManager.read(db, readTableRequest)) {
-                                if (cursor.getCount() != 1) {
-                                    return false;
-                                }
-                            }
-                            // This also deletes the contained data, because they are
-                            // referenced by foreign key, and so are handled by ON DELETE
-                            // CASCADE in the db.
-                            mTransactionManager.delete(db, request);
-                            return true;
-                        });
-        if (!success) {
-            if (appInfoIdRestriction == null) {
-                throw new IllegalArgumentException("Id " + id + " does not exist");
-            } else {
-                throw new IllegalArgumentException(
-                        "Id " + id + " does not exist or is owned by another app");
-            }
+        return request.setPackageFilter(APP_INFO_ID_COLUMN_NAME, List.of(appInfoIdRestriction));
+    }
+
+    /**
+     * Deletes the {@link MedicalDataSource}s stored in the HealthConnect database using the given
+     * {@code id}.
+     *
+     * <p>Note that this deletes without producing change logs, or access logs.
+     *
+     * @param id the id to delete.
+     * @throws IllegalArgumentException if the id does not exist.
+     */
+    public void deleteMedicalDataSourceWithoutPermissionChecks(UUID id) throws SQLiteException {
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    try (Cursor cursor =
+                            mTransactionManager.read(
+                                    db,
+                                    getReadTableRequest(
+                                            List.of(id), /* appInfoRestriction= */ null))) {
+                        if (cursor.getCount() != 1) {
+                            throw new IllegalArgumentException("Id " + id + " does not exist");
+                        }
+                    }
+                    // This also deletes the contained data, because they are
+                    // referenced by foreign key, and so are handled by ON DELETE
+                    // CASCADE in the db.
+                    mTransactionManager.delete(
+                            db,
+                            getDeleteRequestForDataSourceUuid(
+                                    id, /* appInfoIdRestriction= */ null));
+                });
+    }
+
+    /**
+     * Deletes the {@link MedicalDataSource}s stored in the HealthConnect database using the given
+     * {@code id}.
+     *
+     * <p>Note that this deletes without producing change logs.
+     *
+     * @param id the id to delete.
+     * @param callingPackageName restricts any deletions to data sources owned by the given app.
+     * @throws IllegalArgumentException if the id does not exist, or dataSource exists but it is not
+     *     owned by the {@code callingPackageName}.
+     */
+    public void deleteMedicalDataSourceWithPermissionChecks(UUID id, String callingPackageName)
+            throws SQLiteException {
+        long appId = mAppInfoHelper.getAppInfoId(callingPackageName);
+        if (appId == Constants.DEFAULT_LONG) {
+            throw new IllegalArgumentException(
+                    "Deletion not permitted as app has inserted no data.");
         }
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    try (Cursor cursor =
+                            mTransactionManager.read(db, getReadTableRequest(List.of(id), appId))) {
+                        if (cursor.getCount() != 1) {
+                            throw new IllegalArgumentException(
+                                    "Id " + id + " does not exist or is owned by another app");
+                        }
+                    }
+
+                    // Medical resource types that belong to this dataSource and will be deleted.
+                    Set<Integer> medicalResourceTypes =
+                            getMedicalResourceTypesBelongingToDataSourceIds(List.of(id));
+                    // This also deletes the contained data, because they are
+                    // referenced by foreign key, and so are handled by ON DELETE
+                    // CASCADE in the db.
+                    mTransactionManager.delete(db, getDeleteRequestForDataSourceUuid(id, appId));
+                    mAccessLogsHelper.addAccessLog(
+                            db,
+                            callingPackageName,
+                            medicalResourceTypes,
+                            OPERATION_TYPE_DELETE,
+                            /* accessedMedicalDataSource= */ true);
+                });
     }
 
     /**
@@ -830,30 +1026,33 @@
                         uuid.toString(),
                         packageName,
                         request.getFhirBaseUri(),
-                        request.getDisplayName())
+                        request.getDisplayName(),
+                        request.getFhirVersion())
                 .build();
     }
 
     /**
-     * Creates a UUID string to row ID map for {@link MedicalDataSource}s stored in {@code
-     * MEDICAL_DATA_SOURCE_TABLE} that were created by the app matching the {@code
+     * Creates a UUID string to row ID and FHIR version map for {@link MedicalDataSource}s stored in
+     * {@code MEDICAL_DATA_SOURCE_TABLE} that were created by the app matching the {@code *
      * appInfoIdRestriction}.
      */
-    public Map<String, Long> getUuidToRowIdMap(
+    public Map<String, Pair<Long, FhirVersion>> getUuidToRowIdAndVersionMap(
             SQLiteDatabase db, long appInfoIdRestriction, List<UUID> dataSourceUuids) {
-        Map<String, Long> uuidToRowId = new HashMap<>();
+        Map<String, Pair<Long, FhirVersion>> uuidToRowIdAndVersion = new HashMap<>();
         try (Cursor cursor =
                 mTransactionManager.read(
                         db, getReadTableRequest(dataSourceUuids, appInfoIdRestriction))) {
             if (cursor.moveToFirst()) {
                 do {
-                    long rowId = getCursorLong(cursor, MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME);
                     UUID uuid = getCursorUUID(cursor, DATA_SOURCE_UUID_COLUMN_NAME);
-                    uuidToRowId.put(uuid.toString(), rowId);
+                    long rowId = getCursorLong(cursor, MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME);
+                    FhirVersion fhirVersion =
+                            parseFhirVersion(getCursorString(cursor, FHIR_VERSION_COLUMN_NAME));
+                    uuidToRowIdAndVersion.put(uuid.toString(), new Pair(rowId, fhirVersion));
                 } while (cursor.moveToNext());
             }
         }
-        return uuidToRowId;
+        return uuidToRowIdAndVersion;
     }
 
     /**
@@ -861,9 +1060,9 @@
      * in {@code MEDICAL_DATA_SOURCE_TABLE}.
      */
     public Map<Long, MedicalDataSource> getAllRowIdToDataSourceMap(SQLiteDatabase db) {
-        ReadTableRequest readTableRequest = getReadTableRequestJoinWithAppInfo();
+        String query = getReadQueryForDataSources();
         Map<Long, MedicalDataSource> rowIdToDataSourceMap = new HashMap<>();
-        try (Cursor cursor = mTransactionManager.read(db, readTableRequest)) {
+        try (Cursor cursor = mTransactionManager.rawQuery(query, /* selectionArgs= */ null)) {
             if (cursor.moveToFirst()) {
                 do {
                     long rowId = getCursorLong(cursor, MEDICAL_DATA_SOURCE_PRIMARY_COLUMN_NAME);
@@ -895,6 +1094,27 @@
         return appInfoIds;
     }
 
+    /**
+     * Create {@link ContentValues} for the given {@link MedicalDataSource}, {@code appInfoId} and
+     * {@code lastModifiedTimestamp}.
+     *
+     * <p>This is only used in DatabaseMerger code, where we want to provide a lastModifiedTimestamp
+     * from the source database rather than based on the current time.
+     */
+    public static ContentValues getContentValues(
+            MedicalDataSource medicalDataSource, long appInfoId, long lastModifiedTimestamp) {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(
+                DATA_SOURCE_UUID_COLUMN_NAME,
+                StorageUtils.convertUUIDToBytes(UUID.fromString(medicalDataSource.getId())));
+        contentValues.put(DISPLAY_NAME_COLUMN_NAME, medicalDataSource.getDisplayName());
+        contentValues.put(FHIR_BASE_URI_COLUMN_NAME, medicalDataSource.getFhirBaseUri().toString());
+        contentValues.put(FHIR_VERSION_COLUMN_NAME, medicalDataSource.getFhirVersion().toString());
+        contentValues.put(APP_INFO_ID_COLUMN_NAME, appInfoId);
+        contentValues.put(LAST_MODIFIED_TIME_COLUMN_NAME, lastModifiedTimestamp);
+        return contentValues;
+    }
+
     private static ContentValues getContentValues(
             UUID uuid,
             CreateMedicalDataSourceRequest createMedicalDataSourceRequest,
@@ -907,6 +1127,9 @@
         contentValues.put(
                 FHIR_BASE_URI_COLUMN_NAME,
                 createMedicalDataSourceRequest.getFhirBaseUri().toString());
+        contentValues.put(
+                FHIR_VERSION_COLUMN_NAME,
+                createMedicalDataSourceRequest.getFhirVersion().toString());
         contentValues.put(APP_INFO_ID_COLUMN_NAME, appInfoId);
         contentValues.put(LAST_MODIFIED_TIME_COLUMN_NAME, instant.toEpochMilli());
         return contentValues;
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceHelper.java
index 62e6cc0..94bd30c 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceHelper.java
@@ -25,11 +25,12 @@
 
 import static com.android.server.healthconnect.storage.HealthConnectDatabase.createTable;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.getDataSourceUuidColumnName;
+import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.getFhirVersionColumnName;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.getReadTableWhereClause;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper.getCreateMedicalResourceIndicesTableRequest;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper.getMedicalResourceTypeColumnName;
-import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper.getTableName;
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.LAST_MODIFIED_TIME_COLUMN_NAME;
+import static com.android.server.healthconnect.storage.utils.SqlJoin.INNER_QUERY_ALIAS;
 import static com.android.server.healthconnect.storage.utils.SqlJoin.SQL_JOIN_INNER;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.DELIMITER;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.INTEGER_NOT_NULL;
@@ -63,6 +64,7 @@
 import android.util.Pair;
 import android.util.Slog;
 
+import com.android.healthfitness.flags.Flags;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.healthconnect.phr.PhrPageTokenWrapper;
 import com.android.server.healthconnect.phr.ReadMedicalResourcesInternalResponse;
@@ -103,21 +105,35 @@
     private static final String MEDICAL_RESOURCE_PRIMARY_COLUMN_NAME = "medical_resource_row_id";
     @VisibleForTesting static final String FHIR_RESOURCE_TYPE_COLUMN_NAME = "fhir_resource_type";
     @VisibleForTesting static final String FHIR_DATA_COLUMN_NAME = "fhir_data";
-    @VisibleForTesting static final String FHIR_VERSION_COLUMN_NAME = "fhir_version";
+
     @VisibleForTesting static final String DATA_SOURCE_ID_COLUMN_NAME = "data_source_id";
     @VisibleForTesting static final String FHIR_RESOURCE_ID_COLUMN_NAME = "fhir_resource_id";
-    private static final String MEDICAL_RESOURCE_COLUMNS =
-            FHIR_RESOURCE_TYPE_COLUMN_NAME
-                    + ","
-                    + FHIR_RESOURCE_ID_COLUMN_NAME
-                    + ","
-                    + FHIR_DATA_COLUMN_NAME
-                    + ","
-                    + FHIR_VERSION_COLUMN_NAME
-                    + ","
-                    + MedicalResourceIndicesHelper.getMedicalResourceTypeColumnName()
-                    + ","
-                    + MedicalDataSourceHelper.getDataSourceUuidColumnName();
+    private static final String LAST_MODIFIED_TIMESTAMP_MEDICAL_RESOURCE_ALIAS =
+            "medical_resource_last_modified_time";
+
+    private static final String sLastModifiedTimeInInnerQuery =
+            String.format(
+                    "%1$s.%2$s AS %3$s",
+                    INNER_QUERY_ALIAS,
+                    LAST_MODIFIED_TIME_COLUMN_NAME,
+                    LAST_MODIFIED_TIMESTAMP_MEDICAL_RESOURCE_ALIAS);
+
+    private static final String sMedicalResourceLastModifiedTime =
+            String.format(
+                    "%1$s.%2$s AS %3$s",
+                    getMainTableName(),
+                    LAST_MODIFIED_TIME_COLUMN_NAME,
+                    LAST_MODIFIED_TIMESTAMP_MEDICAL_RESOURCE_ALIAS);
+
+    private static final List<String> sMedicalResourceColumns =
+            List.of(
+                    MEDICAL_RESOURCE_PRIMARY_COLUMN_NAME,
+                    FHIR_RESOURCE_TYPE_COLUMN_NAME,
+                    FHIR_RESOURCE_ID_COLUMN_NAME,
+                    FHIR_DATA_COLUMN_NAME,
+                    MedicalDataSourceHelper.getFhirVersionColumnName(),
+                    MedicalResourceIndicesHelper.getMedicalResourceTypeColumnName(),
+                    MedicalDataSourceHelper.getDataSourceUuidColumnName());
 
     /**
      * A block of SQL with a where clause to read based on the medical resource id composite key.
@@ -243,13 +259,22 @@
         return MEDICAL_RESOURCE_PRIMARY_COLUMN_NAME;
     }
 
+    public static String getDataSourceIdColumnName() {
+        return DATA_SOURCE_ID_COLUMN_NAME;
+    }
+
+    private static String getMedicalResourceColumns() {
+        List<String> medicalResourceColumns = new ArrayList<>(sMedicalResourceColumns);
+        medicalResourceColumns.add(sMedicalResourceLastModifiedTime);
+        return String.join(DELIMITER, medicalResourceColumns);
+    }
+
     private static List<Pair<String, String>> getColumnInfo() {
         return List.of(
                 Pair.create(MEDICAL_RESOURCE_PRIMARY_COLUMN_NAME, PRIMARY_AUTOINCREMENT),
                 Pair.create(FHIR_RESOURCE_TYPE_COLUMN_NAME, INTEGER_NOT_NULL),
                 Pair.create(FHIR_RESOURCE_ID_COLUMN_NAME, TEXT_NOT_NULL),
                 Pair.create(FHIR_DATA_COLUMN_NAME, TEXT_NOT_NULL),
-                Pair.create(FHIR_VERSION_COLUMN_NAME, TEXT_NOT_NULL),
                 Pair.create(DATA_SOURCE_ID_COLUMN_NAME, INTEGER_NOT_NULL),
                 Pair.create(LAST_MODIFIED_TIME_COLUMN_NAME, INTEGER_NOT_NULL));
     }
@@ -287,6 +312,12 @@
                         .getCommand());
     }
 
+    /** Returns the total number of medical resources in HC database. */
+    public int getMedicalResourcesCount() {
+        ReadTableRequest readTableRequest = new ReadTableRequest(getMainTableName());
+        return mTransactionManager.count(readTableRequest);
+    }
+
     /**
      * Reads the {@link MedicalResource}s stored in the HealthConnect database.
      *
@@ -304,7 +335,7 @@
                 makeParametersAndArgs(medicalResourceIds, /* appId= */ null);
         String sql =
                 "SELECT "
-                        + MEDICAL_RESOURCE_COLUMNS
+                        + getMedicalResourceColumns()
                         + " FROM "
                         + RESOURCES_JOIN_DATA_SOURCES_JOIN_INDICES
                         + " WHERE "
@@ -327,9 +358,6 @@
      * @throws IllegalArgumentException if any of the ids has a data source id which is not valid
      *     (not a String form of a UUID)
      */
-    // TODO(b/358105031): add CTS test coverage for read by ids with/without permission
-    // checks.
-
     public List<MedicalResource> readMedicalResourcesByIdsWithPermissionChecks(
             List<MedicalResourceId> medicalResourceIds,
             Set<Integer> grantedReadMedicalResourceTypes,
@@ -338,16 +366,16 @@
             boolean isCalledFromBgWithoutBgRead)
             throws SQLiteException {
 
+        Pair<String, String[]> sqlAndArgs =
+                getSqlAndArgsBasedOnPermissionFilters(
+                        medicalResourceIds,
+                        grantedReadMedicalResourceTypes,
+                        callingPackageName,
+                        hasWritePermission,
+                        isCalledFromBgWithoutBgRead);
         return mTransactionManager.runAsTransaction(
                 db -> {
                     List<MedicalResource> medicalResources;
-                    Pair<String, String[]> sqlAndArgs =
-                            getSqlAndArgsBasedOnPermissionFilters(
-                                    medicalResourceIds,
-                                    grantedReadMedicalResourceTypes,
-                                    callingPackageName,
-                                    hasWritePermission,
-                                    isCalledFromBgWithoutBgRead);
                     try (Cursor cursor = db.rawQuery(sqlAndArgs.first, sqlAndArgs.second)) {
                         medicalResources = getMedicalResources(cursor);
                     }
@@ -508,7 +536,7 @@
         Pair<String, String[]> paramsAndArgs = makeParametersAndArgs(medicalResourceIds, appId);
         return Pair.create(
                 "SELECT "
-                        + MEDICAL_RESOURCE_COLUMNS
+                        + getMedicalResourceColumns()
                         + " FROM "
                         + RESOURCES_JOIN_DATA_SOURCES_JOIN_INDICES
                         + " WHERE "
@@ -523,18 +551,16 @@
      * @param pageTokenWrapper a {@link PhrPageTokenWrapper}.
      * @return a {@link ReadMedicalResourcesInternalResponse}.
      */
-    // TODO(b/354872929): Add cts tests for read by request.
-
     public ReadMedicalResourcesInternalResponse
             readMedicalResourcesByRequestWithoutPermissionChecks(
                     PhrPageTokenWrapper pageTokenWrapper, int pageSize) {
-        ReadMedicalResourcesInternalResponse response;
-        ReadTableRequest readTableRequest =
+        ReadTableRequest request =
                 getReadTableRequestUsingRequestFilters(pageTokenWrapper, pageSize);
-        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
-            response = getMedicalResources(cursor, pageTokenWrapper, pageSize);
-        }
-        return response;
+
+        return mTransactionManager.runAsTransaction(
+                (db) -> {
+                    return getMedicalResources(db, request, pageTokenWrapper, pageSize);
+                });
     }
 
     /**
@@ -543,8 +569,6 @@
      *
      * @return a {@link ReadMedicalResourcesInternalResponse}.
      */
-    // TODO(b/360833189): Support request.getDataSourceIds().
-    // TODO(b/354872929): Add cts tests for read by request.
     // TODO(b/360352345): Add cts tests for access logs being created per API call.
 
     public ReadMedicalResourcesInternalResponse readMedicalResourcesByRequestWithPermissionChecks(
@@ -552,6 +576,10 @@
             int pageSize,
             String callingPackageName,
             boolean enforceSelfRead) {
+        ReadMedicalResourcesInitialRequest request = pageTokenWrapper.getRequest();
+        if (request == null) {
+            throw new IllegalStateException("The pageTokenWrapper's request can not be null.");
+        }
         return mTransactionManager.runAsTransaction(
                 db -> {
                     ReadMedicalResourcesInternalResponse response;
@@ -561,14 +589,13 @@
                                     pageSize,
                                     callingPackageName,
                                     enforceSelfRead);
-                    try (Cursor cursor = mTransactionManager.read(db, readTableRequest)) {
-                        response = getMedicalResources(cursor, pageTokenWrapper, pageSize);
-                    }
+                    response =
+                            getMedicalResources(db, readTableRequest, pageTokenWrapper, pageSize);
                     if (!enforceSelfRead) {
                         mAccessLogsHelper.addAccessLog(
                                 db,
                                 callingPackageName,
-                                Set.of(pageTokenWrapper.getRequest().getMedicalResourceType()),
+                                Set.of(request.getMedicalResourceType()),
                                 OPERATION_TYPE_READ,
                                 /* accessedMedicalDataSource= */ false);
                     }
@@ -592,15 +619,24 @@
     }
 
     /** Creates {@link ReadTableRequest} for the given {@link PhrPageTokenWrapper}. */
-    @VisibleForTesting
-    static ReadTableRequest getReadTableRequestUsingRequestFilters(
+    public static ReadTableRequest getReadTableRequestUsingRequestFilters(
             PhrPageTokenWrapper pageTokenWrapper, int pageSize) {
-        ReadMedicalResourcesInitialRequest request = pageTokenWrapper.getRequest();
+        // The INNER_QUERY_ALIAS refers to the medical_resource_table.
+        List<String> allColumns = new ArrayList<>(sMedicalResourceColumns);
+        allColumns.add(sLastModifiedTimeInInnerQuery);
         ReadTableRequest readTableRequest =
                 getReadTableRequestUsingPageSizeAndLastRowId(
-                        pageSize, pageTokenWrapper.getLastRowId());
+                                pageSize, pageTokenWrapper.getLastRowId())
+                        .setColumnNames(allColumns);
+        ReadMedicalResourcesInitialRequest request = pageTokenWrapper.getRequest();
         SqlJoin joinClause;
-        if (request.getDataSourceIds().isEmpty()) {
+        if (request == null) {
+            // If request is null, it means the request is to read out all the data without
+            // any filters applied. So we just join the tables without any filtering on them.
+            joinClause =
+                    joinWithMedicalResourceIndicesTable()
+                            .attachJoin(joinWithMedicalDataSourceTable());
+        } else if (request.getDataSourceIds().isEmpty()) {
             joinClause =
                     getJoinWithIndicesAndDataSourceTablesFilterOnMedicalResourceTypes(
                             Set.of(request.getMedicalResourceType()));
@@ -620,9 +656,15 @@
     private static ReadTableRequest getReadTableRequestUsingRequestFiltersAndAppId(
             PhrPageTokenWrapper pageTokenWrapper, int pageSize, long appId) {
         ReadMedicalResourcesInitialRequest request = pageTokenWrapper.getRequest();
+        if (request == null) {
+            throw new IllegalArgumentException("Request can't be null when doing a filtered read.");
+        }
+        List<String> allColumns = new ArrayList<>(sMedicalResourceColumns);
+        allColumns.add(sLastModifiedTimeInInnerQuery);
         ReadTableRequest readTableRequest =
                 getReadTableRequestUsingPageSizeAndLastRowId(
-                        pageSize, pageTokenWrapper.getLastRowId());
+                                pageSize, pageTokenWrapper.getLastRowId())
+                        .setColumnNames(allColumns);
         SqlJoin joinClause;
         if (request.getDataSourceIds().isEmpty()) {
             joinClause =
@@ -641,10 +683,17 @@
             int pageSize, long lastRowId) {
         // The limit is set to pageSize + 1, so that we know if there are more resources
         // than the pageSize for creating the pageToken.
-        return new ReadTableRequest(getMainTableName())
-                .setWhereClause(getReadByLastRowIdWhereClause(lastRowId))
-                .setOrderBy(getOrderByClause())
-                .setLimit(pageSize + 1);
+        ReadTableRequest request =
+                new ReadTableRequest(getMainTableName())
+                        .setWhereClause(getReadByLastRowIdWhereClause(lastRowId));
+
+        if (Flags.phrReadMedicalResourcesFixQueryLimit()) {
+            request.setFinalOrderBy(getOrderByClause()).setFinalLimit(pageSize + 1);
+        } else {
+            request.setOrderBy(getOrderByClause()).setLimit(pageSize + 1);
+        }
+
+        return request;
     }
 
     static ReadTableRequest getReadRequestForDistinctResourceTypesBelongingToDataSourceIds(
@@ -667,8 +716,10 @@
                         List.of(MedicalResourceIndicesHelper.getMedicalResourceTypeColumnName()))
                 .setJoinClause(
                         getJoinWithMedicalDataSourceFilterOnDataSourceIdsAndAppId(
-                                dataSourceIds, appId, joinWithMedicalResourceIndicesTable()))
-                .setWhereClause(getMedicalResourceTypeWhereClause(medicalResourceTypes));
+                                dataSourceIds,
+                                appId,
+                                getJoinWithIndicesTableFilterOnMedicalResourceTypes(
+                                        medicalResourceTypes)));
     }
 
     /**
@@ -764,11 +815,19 @@
      * Creates {@link SqlJoin} that is an inner join from medical_resource_table to
      * medical_resource_indices_table filtering on {@code medicalResourceTypes} followed by {@code
      * extraJoin} attached to it.
+     *
+     * <p>If the list of {@code medicalResourceTypes} is empty, then the {@link WhereClauses} will
+     * be empty.
      */
     static SqlJoin getJoinWithIndicesTableFilterOnMedicalResourceTypes(
             Set<Integer> medicalResourceTypes) {
+        WhereClauses medicalResourceTypeWhereClause =
+                new WhereClauses(AND)
+                        .addWhereInIntsClause(
+                                getMedicalResourceTypeColumnName(),
+                                new ArrayList<>(medicalResourceTypes));
         return joinWithMedicalResourceIndicesTable()
-                .setSecondTableWhereClause(getMedicalResourceTypeWhereClause(medicalResourceTypes));
+                .setSecondTableWhereClause(medicalResourceTypeWhereClause);
     }
 
     static SqlJoin getJoinWithMedicalDataSourceFilterOnDataSourceIdsAndAppId(
@@ -789,18 +848,12 @@
     static SqlJoin joinWithMedicalResourceIndicesTable() {
         return new SqlJoin(
                         MEDICAL_RESOURCE_TABLE_NAME,
-                        getTableName(),
+                        MedicalResourceIndicesHelper.getTableName(),
                         MEDICAL_RESOURCE_PRIMARY_COLUMN_NAME,
                         MedicalResourceIndicesHelper.getParentColumnReference())
                 .setJoinType(SQL_JOIN_INNER);
     }
 
-    static SqlJoin getJoinWithMedicalDataSourceFilterOnAppIds(Set<Long> appIds, SqlJoin extraJoin) {
-        return joinWithMedicalDataSourceTable()
-                .setSecondTableWhereClause(getAppIdsWhereClause(appIds))
-                .attachJoin(extraJoin);
-    }
-
     private static SqlJoin joinWithMedicalDataSourceTable() {
         return new SqlJoin(
                         MEDICAL_RESOURCE_TABLE_NAME,
@@ -877,17 +930,6 @@
     }
 
     /**
-     * Creates a {@link WhereClauses} filtering on {@code medicalResourceTypes}. If {@code
-     * medicalResourceTypes} is empty, then it returns an empty {@link WhereClauses}.
-     */
-    private static WhereClauses getMedicalResourceTypeWhereClause(
-            Set<Integer> medicalResourceTypes) {
-        return new WhereClauses(AND)
-                .addWhereInIntsClause(
-                        getMedicalResourceTypeColumnName(), new ArrayList<>(medicalResourceTypes));
-    }
-
-    /**
      * Upserts (insert/update) a list of {@link MedicalResource}s created based on the given list of
      * {@link UpsertMedicalResourceInternalRequest}s into the HealthConnect database.
      *
@@ -895,6 +937,8 @@
      *     UpsertMedicalResourceInternalRequest}.
      * @return List of {@link MedicalResource}s that were upserted into the database, in the same
      *     order as their associated {@link UpsertMedicalResourceInternalRequest}s.
+     * @throws IllegalArgumentException if the data source id does not exist, or if a resource's
+     *     FHIR version does not match the data source's FHIR version.
      */
     public List<MedicalResource> upsertMedicalResources(
             String callingPackageName,
@@ -909,8 +953,6 @@
                             + UpsertMedicalResourceInternalRequest.class.getSimpleName()
                             + "(s).");
         }
-
-        // TODO(b/350697473): Add cts tests covering upsert journey with data source creation.
         return mTransactionManager.runAsTransaction(
                 (TransactionRunnableWithReturn<List<MedicalResource>, RuntimeException>)
                         db ->
@@ -929,8 +971,8 @@
                         .map(UpsertMedicalResourceInternalRequest::getDataSourceId)
                         .toList();
         long appInfoIdRestriction = mAppInfoHelper.getAppInfoId(callingPackageName);
-        Map<String, Long> dataSourceUuidToRowId =
-                mMedicalDataSourceHelper.getUuidToRowIdMap(
+        Map<String, Pair<Long, FhirVersion>> dataSourceUuidToRowIdAndVersion =
+                mMedicalDataSourceHelper.getUuidToRowIdAndVersionMap(
                         db, appInfoIdRestriction, StorageUtils.toUuids(dataSourceUuids));
 
         // Standard Upsert code cannot be used as it uses a query with inline values to look for
@@ -942,11 +984,20 @@
         // https://developer.android.com/reference/android/database/sqlite/package-summary.html
         // So we use this.
         for (UpsertMedicalResourceInternalRequest upsertRequest : upsertRequests) {
-            Long dataSourceRowId = dataSourceUuidToRowId.get(upsertRequest.getDataSourceId());
-            if (dataSourceRowId == null) {
+            Pair<Long, FhirVersion> dataSourceRowIdAndVersion =
+                    dataSourceUuidToRowIdAndVersion.get(upsertRequest.getDataSourceId());
+            if (dataSourceRowIdAndVersion == null) {
                 throw new IllegalArgumentException(
                         "Invalid data source id: " + upsertRequest.getDataSourceId());
             }
+            Long dataSourceRowId = dataSourceRowIdAndVersion.first;
+            String dataSourceFhirVersion = dataSourceRowIdAndVersion.second.toString();
+            if (!upsertRequest.getFhirVersion().equals(dataSourceFhirVersion)) {
+                throw new IllegalArgumentException(
+                        "Invalid fhir version: "
+                                + upsertRequest.getFhirVersion()
+                                + ". It did not match the data source's fhir version");
+            }
             ContentValues contentValues =
                     getContentValues(dataSourceRowId, upsertRequest, mTimeSource.getInstantNow());
             long rowId =
@@ -993,8 +1044,6 @@
         resourceContentValues.put(
                 FHIR_DATA_COLUMN_NAME, upsertMedicalResourceInternalRequest.getData());
         resourceContentValues.put(
-                FHIR_VERSION_COLUMN_NAME, upsertMedicalResourceInternalRequest.getFhirVersion());
-        resourceContentValues.put(
                 FHIR_RESOURCE_TYPE_COLUMN_NAME,
                 upsertMedicalResourceInternalRequest.getFhirResourceType());
         resourceContentValues.put(
@@ -1005,6 +1054,25 @@
     }
 
     /**
+     * Create {@link ContentValues} for the given {@code dataSourceRowId}, {@code lastModifiedTime},
+     * {@code appInfoId} and {@link MedicalResource}.
+     *
+     * <p>This is only used in DatabaseMerger code, where we want to provide a lastModifiedTimestamp
+     * from the source database rather than based on the current time.
+     */
+    public static ContentValues getContentValues(
+            long dataSourceRowId, long lastModifiedTime, MedicalResource resource) {
+        FhirResource fhirResource = resource.getFhirResource();
+        ContentValues resourceContentValues = new ContentValues();
+        resourceContentValues.put(DATA_SOURCE_ID_COLUMN_NAME, dataSourceRowId);
+        resourceContentValues.put(FHIR_DATA_COLUMN_NAME, fhirResource.getData());
+        resourceContentValues.put(FHIR_RESOURCE_TYPE_COLUMN_NAME, fhirResource.getType());
+        resourceContentValues.put(FHIR_RESOURCE_ID_COLUMN_NAME, fhirResource.getId());
+        resourceContentValues.put(LAST_MODIFIED_TIME_COLUMN_NAME, lastModifiedTime);
+        return resourceContentValues;
+    }
+
+    /**
      * Creates a {@link MedicalResource} for the given {@code uuid} and {@link
      * UpsertMedicalResourceInternalRequest}.
      */
@@ -1025,11 +1093,53 @@
     }
 
     /**
-     * Returns a {@link ReadMedicalResourcesInternalResponse}. If the cursor contains more
-     * than @link MAXIMUM_ALLOWED_CURSOR_COUNT} records, it throws {@link IllegalArgumentException}.
+     * Returns a {@link ReadMedicalResourcesInternalResponse}.
+     *
+     * <p>This should be run within a transaction as it does multiple requests using the db passed
+     * for the transaction.
+     *
+     * @param request the specification for the rows to read
+     * @param pageSize the number of results to return in this page
+     * @param pageTokenWrapper the page token for the query
+     * @throws IllegalArgumentException if the cursor contains more than @link
+     *     MAXIMUM_ALLOWED_CURSOR_COUNT} records.
+     */
+    public static ReadMedicalResourcesInternalResponse getMedicalResources(
+            SQLiteDatabase db,
+            ReadTableRequest request,
+            PhrPageTokenWrapper pageTokenWrapper,
+            int pageSize) {
+        ReadMedicalResourcesInternalResponse response;
+        // Get the count from a requests with no limit,
+        int totalRowCount;
+        if (Flags.phrReadMedicalResourcesFixQueryLimit()) {
+            Integer originalLimit = request.getFinalLimit();
+            request.setFinalLimit(null);
+            totalRowCount = TransactionManager.count(request, db);
+            request.setFinalLimit(originalLimit);
+        } else {
+            Integer originalLimit = request.getLimit();
+            request.setLimit(null);
+            totalRowCount = TransactionManager.count(request, db);
+            request.setLimit(originalLimit);
+        }
+        try (Cursor cursor = db.rawQuery(request.getReadCommand(), null)) {
+            response = getMedicalResources(cursor, pageTokenWrapper, pageSize, totalRowCount);
+        }
+        return response;
+    }
+
+    /**
+     * Returns a {@link ReadMedicalResourcesInternalResponse}.
+     *
+     * @param pageSize the number of results to return in this page
+     * @param totalRowCount the number of rows that would have been returned if this query was
+     *     executed with no limit
+     * @throws IllegalArgumentException if the cursor contains more than @link
+     *     MAXIMUM_ALLOWED_CURSOR_COUNT} records.
      */
     private static ReadMedicalResourcesInternalResponse getMedicalResources(
-            Cursor cursor, PhrPageTokenWrapper pageTokenWrapper, int pageSize) {
+            Cursor cursor, PhrPageTokenWrapper pageTokenWrapper, int pageSize, int totalRowCount) {
         // TODO(b/356613483): remove these checks in the helpers and instead validate pageSize
         // in the service.
         if (cursor.getCount() > MAXIMUM_ALLOWED_CURSOR_COUNT) {
@@ -1050,7 +1160,10 @@
                 lastRowId = getCursorLong(cursor, MEDICAL_RESOURCE_PRIMARY_COLUMN_NAME);
             } while (cursor.moveToNext());
         }
-        return new ReadMedicalResourcesInternalResponse(medicalResources, nextPageToken);
+
+        int remainingCount = totalRowCount - medicalResources.size();
+        return new ReadMedicalResourcesInternalResponse(
+                medicalResources, nextPageToken, remainingCount);
     }
 
     /**
@@ -1273,9 +1386,8 @@
         SqlJoin dataSourceJoin = joinWithMedicalDataSourceTable();
         dataSourceJoin.setSecondTableWhereClause(dataSourceWhereClauses);
 
-        SqlJoin indexJoin = joinWithMedicalResourceIndicesTable();
-        indexJoin.setSecondTableWhereClause(
-                getMedicalResourceTypeWhereClause(medicalResourceTypes));
+        SqlJoin indexJoin =
+                getJoinWithIndicesTableFilterOnMedicalResourceTypes(medicalResourceTypes);
         indexJoin.attachJoin(dataSourceJoin);
 
         ReadTableRequest innerRead =
@@ -1298,13 +1410,15 @@
                                 getCursorString(cursor, FHIR_DATA_COLUMN_NAME))
                         .build();
         FhirVersion fhirVersion =
-                parseFhirVersion(getCursorString(cursor, FHIR_VERSION_COLUMN_NAME));
-        return new MedicalResource.Builder(
-                        getCursorInt(cursor, getMedicalResourceTypeColumnName()),
-                        getCursorUUID(cursor, getDataSourceUuidColumnName()).toString(),
-                        fhirVersion,
-                        fhirResource)
-                .build();
+                parseFhirVersion(getCursorString(cursor, getFhirVersionColumnName()));
+        long lastModifiedTimestamp =
+                getCursorLong(cursor, LAST_MODIFIED_TIMESTAMP_MEDICAL_RESOURCE_ALIAS);
+        return new MedicalResource(
+                getCursorInt(cursor, getMedicalResourceTypeColumnName()),
+                getCursorUUID(cursor, getDataSourceUuidColumnName()).toString(),
+                fhirVersion,
+                fhirResource,
+                lastModifiedTimestamp);
     }
 
     /**
@@ -1367,7 +1481,7 @@
         StringBuilder sql =
                 new StringBuilder(
                         "SELECT "
-                                + MEDICAL_RESOURCE_COLUMNS
+                                + getMedicalResourceColumns()
                                 + " FROM "
                                 + RESOURCES_JOIN_DATA_SOURCES_JOIN_INDICES
                                 + " WHERE "
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/MigrationEntityHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/MigrationEntityHelper.java
index 9ee4689..cd90704 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/MigrationEntityHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/MigrationEntityHelper.java
@@ -40,6 +40,10 @@
  */
 public final class MigrationEntityHelper extends DatabaseHelper {
 
+    public MigrationEntityHelper(DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
+    }
+
     @VisibleForTesting public static final String TABLE_NAME = "migration_entity_table";
     private static final String COLUMN_ENTITY_ID = "entity_id";
 
@@ -62,7 +66,7 @@
     }
 
     /** Returns a request to insert the provided {@code entityId}. */
-    public static UpsertTableRequest getInsertRequest(String entityId) {
+    public UpsertTableRequest getInsertRequest(String entityId) {
         final ContentValues values = new ContentValues();
         values.put(COLUMN_ENTITY_ID, entityId);
         return new UpsertTableRequest(
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/PlannedExerciseSessionRecordHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/PlannedExerciseSessionRecordHelper.java
index a74b098..ce52a8c 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/PlannedExerciseSessionRecordHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/PlannedExerciseSessionRecordHelper.java
@@ -75,7 +75,7 @@
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.request.UpsertTableRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.SqlJoin;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 import com.android.server.healthconnect.storage.utils.TableColumnPair;
@@ -601,7 +601,8 @@
                 StorageUtils.getHexString(deletedRecordUuid));
         affectedExerciseSessionsReadRequest.setWhereClause(whereStatement);
         affectedExerciseSessionsReadRequest.setRecordHelper(
-                RecordHelperProvider.getRecordHelper(RECORD_TYPE_EXERCISE_SESSION));
+                InternalHealthConnectMappings.getInstance()
+                        .getRecordHelper(RECORD_TYPE_EXERCISE_SESSION));
         return Collections.singletonList(affectedExerciseSessionsReadRequest);
     }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/PreferenceHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/PreferenceHelper.java
index e940162..fdcd9b3 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/PreferenceHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/PreferenceHelper.java
@@ -46,6 +46,7 @@
  */
 // TODO(b/303023796): Make this final.
 public class PreferenceHelper extends DatabaseHelper {
+    private static final String TAG = "PreferenceHelper";
     private static final String TABLE_NAME = "preference_table";
     private static final String KEY_COLUMN_NAME = "key";
     public static final List<Pair<String, Integer>> UNIQUE_COLUMN_INFO =
@@ -53,19 +54,24 @@
     private static final String VALUE_COLUMN_NAME = "value";
     private final TransactionManager mTransactionManager;
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    private static volatile PreferenceHelper sPreferenceHelper;
+    /**
+     * Key to store timestamp of the last time any PHR <b>read medical resources</b> API is called.
+     */
+    private static final String PREFS_KEY_PHR_LAST_READ_MEDICAL_RESOURCES_API =
+            "phr_last_read_medical_resources_api";
 
     protected volatile ConcurrentHashMap<String, String> mPreferences;
 
     @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
-    protected PreferenceHelper(TransactionManager transactionManager) {
+    public PreferenceHelper(
+            TransactionManager transactionManager, DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
         mTransactionManager = transactionManager;
     }
 
     /** Note: Overrides existing preference (if it exists) with the new value */
     public synchronized void insertOrReplacePreference(String key, String value) {
-        mTransactionManager.insertOrReplace(
+        mTransactionManager.insertOrReplaceOnConflict(
                 new UpsertTableRequest(
                         TABLE_NAME, getContentValues(key, value), UNIQUE_COLUMN_INFO));
         getPreferences().put(key, value);
@@ -88,7 +94,7 @@
                                         TABLE_NAME,
                                         getContentValues(key, value),
                                         UNIQUE_COLUMN_INFO)));
-        mTransactionManager.insertOrReplaceAll(requests);
+        mTransactionManager.insertOrReplaceOnConflict(requests);
         getPreferences().putAll(keyValues);
     }
 
@@ -153,23 +159,4 @@
 
         return columnInfo;
     }
-
-    /** Used in testing to clear the instance to clear and re-reference the mocks. */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public static synchronized void clearInstanceForTest() {
-        sPreferenceHelper = null;
-    }
-
-    public static PreferenceHelper getInstance() {
-        return getInstance(TransactionManager.getInitialisedInstance());
-    }
-
-    /** Method to get an instance of PreferenceHelper by passing in the dependency. */
-    public static synchronized PreferenceHelper getInstance(TransactionManager transactionManager) {
-        if (sPreferenceHelper == null) {
-            sPreferenceHelper = new PreferenceHelper(transactionManager);
-        }
-
-        return sPreferenceHelper;
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/ReadAccessLogsHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ReadAccessLogsHelper.java
new file mode 100644
index 0000000..32aaf8e
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/ReadAccessLogsHelper.java
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.healthconnect.storage.datatypehelpers;
+
+import static android.health.connect.Constants.DEFAULT_LONG;
+
+import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.PRIMARY_COLUMN_NAME;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.INTEGER_NOT_NULL;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.PRIMARY_AUTOINCREMENT;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.TEXT_NOT_NULL;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorInt;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorLong;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.health.connect.internal.datatypes.RecordInternal;
+import android.util.Pair;
+import android.util.Slog;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.healthfitness.flags.AconfigFlagHelper;
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.request.CreateTableRequest;
+import com.android.server.healthconnect.storage.request.ReadTableRequest;
+import com.android.server.healthconnect.storage.request.UpsertTableRequest;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Table to maintain detailed read access logs.
+ *
+ * @hide
+ */
+public class ReadAccessLogsHelper extends DatabaseHelper {
+
+    public static final String TABLE_NAME = "read_access_logs_table";
+    private static final int NUM_COLS = 6;
+    private static final int TIME_WINDOW_DAYS = 30;
+    private static final String RECORD_TYPE_COLUMN_NAME = "record_type";
+    private static final String READER_APP_ID_COLUMN_NAME = "reader_app_id";
+    private static final String WRITER_APP_ID_COLUMN_NAME = "writer_app_id";
+    private static final String READ_TIME = "read_time";
+    private static final String WAS_READ_RECORD_WRITTEN_IN_PAST_30_DAYS = "write_time";
+
+    private static final String TAG = "HCReadAccessLogsHelper";
+
+    private final AppInfoHelper mAppInfoHelper;
+    private final TransactionManager mTransactionManager;
+
+    public ReadAccessLogsHelper(
+            AppInfoHelper appInfoHelper,
+            TransactionManager transactionManager,
+            DatabaseHelpers databaseHelpers) {
+        super(databaseHelpers);
+        mAppInfoHelper = appInfoHelper;
+        mTransactionManager = transactionManager;
+    }
+
+    protected String getMainTableName() {
+        return TABLE_NAME;
+    }
+
+    @Override
+    public synchronized void clearData(TransactionManager transactionManager) {
+        if (!AconfigFlagHelper.isEcosystemMetricsEnabled()) {
+            return;
+        }
+        super.clearData(transactionManager);
+    }
+
+    public static CreateTableRequest getCreateTableRequest() {
+        return new CreateTableRequest(TABLE_NAME, getColumnInfo())
+                .addForeignKey(
+                        /* referencedTable= */ AppInfoHelper.TABLE_NAME,
+                        /* columnNames= */ List.of(READER_APP_ID_COLUMN_NAME),
+                        /* referencedColumnNames= */ List.of(PRIMARY_COLUMN_NAME))
+                .addForeignKey(
+                        /* referencedTable= */ AppInfoHelper.TABLE_NAME,
+                        /* columnNames= */ List.of(WRITER_APP_ID_COLUMN_NAME),
+                        /* referencedColumnNames= */ List.of(PRIMARY_COLUMN_NAME));
+    }
+
+    private static List<Pair<String, String>> getColumnInfo() {
+        List<Pair<String, String>> columnInfo = new ArrayList<>(NUM_COLS);
+        columnInfo.add(new Pair<>(PRIMARY_COLUMN_NAME, PRIMARY_AUTOINCREMENT));
+        columnInfo.add(new Pair<>(READER_APP_ID_COLUMN_NAME, INTEGER_NOT_NULL));
+        columnInfo.add(new Pair<>(WRITER_APP_ID_COLUMN_NAME, INTEGER_NOT_NULL));
+        columnInfo.add(new Pair<>(RECORD_TYPE_COLUMN_NAME, TEXT_NOT_NULL));
+        columnInfo.add(new Pair<>(READ_TIME, INTEGER_NOT_NULL));
+        columnInfo.add(new Pair<>(WAS_READ_RECORD_WRITTEN_IN_PAST_30_DAYS, INTEGER_NOT_NULL));
+        return columnInfo;
+    }
+
+    /**
+     * Returns a list of all {@link ReadAccessLog} DO NOT CALL WITHOUT FLAGGING UNDER {@link
+     * AconfigFlagHelper.isEcosystemMetricsEnabled}.
+     */
+    public List<ReadAccessLog> queryReadAccessLogs() {
+        final ReadTableRequest readTableRequest = new ReadTableRequest(TABLE_NAME);
+
+        List<ReadAccessLog> readAccessLogList = new ArrayList<>();
+        try (Cursor cursor = mTransactionManager.read(readTableRequest)) {
+            while (cursor.moveToNext()) {
+                String readerPackage =
+                        mAppInfoHelper.getPackageName(
+                                getCursorLong(cursor, READER_APP_ID_COLUMN_NAME));
+
+                String writerPackage =
+                        mAppInfoHelper.getPackageName(
+                                getCursorLong(cursor, WRITER_APP_ID_COLUMN_NAME));
+
+                if (writerPackage == null || readerPackage == null) {
+                    Slog.e(TAG, "encounter null package name while query access logs");
+                    continue;
+                }
+                long readTimeStamp = getCursorLong(cursor, READ_TIME);
+                boolean wasReadRecordWrittenInPast30Days =
+                        getCursorInt(cursor, WAS_READ_RECORD_WRITTEN_IN_PAST_30_DAYS) > 0;
+                int dataType = getCursorInt(cursor, RECORD_TYPE_COLUMN_NAME);
+
+                readAccessLogList.add(
+                        new ReadAccessLog(
+                                /* readerPackage= */ readerPackage,
+                                /* writerPackage= */ writerPackage,
+                                /* dataType= */ dataType,
+                                /* readTimeStamp= */ readTimeStamp,
+                                /* wasReadRecordWrittenInPast30Days= */
+                                wasReadRecordWrittenInPast30Days));
+            }
+        }
+
+        return Collections.unmodifiableList(readAccessLogList);
+    }
+
+    /**
+     * Stores read access logs for given package names. DO NOT INSERT ACCESS LOGS FOR SELF READ and
+     * DO NOT CALL WITHOUT FLAGGING UNDER {@link AconfigFlagHelper.isEcosystemMetricsEnabled}.
+     */
+    public void recordReadAccessLogForAggregationReads(
+            SQLiteDatabase db,
+            List<String> writingPackageNames,
+            String readerPackageName,
+            Set<Integer> recordTypeIds,
+            long endTimeStamp,
+            long readTimeStamp) {
+        long readerAppInfoId = mAppInfoHelper.getAppInfoId(readerPackageName);
+        if (readerAppInfoId == DEFAULT_LONG) {
+            return;
+        }
+        for (String writingPackageName : writingPackageNames) {
+            long writerAppInfoId = mAppInfoHelper.getAppInfoId(writingPackageName);
+            if (writerAppInfoId == DEFAULT_LONG || writerAppInfoId == readerAppInfoId) {
+                continue;
+            }
+            for (Integer recordTypeId : recordTypeIds) {
+                ContentValues contentValues =
+                        populateCommonColumns(
+                                /* readerAppInfoId= */ readerAppInfoId,
+                                /* dataType= */ recordTypeId,
+                                /* writerAppInfoId= */ writerAppInfoId,
+                                /* writeTimeStamp= */ endTimeStamp,
+                                /* readTimeStamp' */ readTimeStamp);
+                UpsertTableRequest upsertTableRequest =
+                        new UpsertTableRequest(TABLE_NAME, contentValues);
+                mTransactionManager.insert(db, upsertTableRequest);
+            }
+        }
+    }
+
+    /**
+     * Stores read access logs for given records. DO NOT INSERT ACCESS LOGS FOR SELF READ and DO NOT
+     * CALL WITHOUT FLAGGING UNDER {@link AconfigFlagHelper.isEcosystemMetricsEnabled}.
+     */
+    public void recordReadAccessLogForNonAggregationReads(
+            SQLiteDatabase db,
+            List<RecordInternal<?>> recordsRead,
+            String readerPackageName,
+            long readTimeStamp) {
+        long readerAppInfoId = mAppInfoHelper.getAppInfoId(readerPackageName);
+        if (readerAppInfoId == DEFAULT_LONG) {
+            Slog.e(
+                    TAG,
+                    "invalid package name " + readerPackageName + " used for read access " + "log");
+            return;
+        }
+        Map<Integer, Map<Long, Long>> datatypeToLatestWritePerPackageName =
+                processRecordsIntoLogs(recordsRead);
+
+        for (Map.Entry<Integer, Map<Long, Long>> datatypeToLatestWritePerPackageNameEntry :
+                datatypeToLatestWritePerPackageName.entrySet()) {
+            for (Map.Entry<Long, Long> packageNameToTimeStamp :
+                    datatypeToLatestWritePerPackageNameEntry.getValue().entrySet()) {
+                ContentValues contentValues =
+                        populateCommonColumns(
+                                /* readerAppInfoId= */ readerAppInfoId,
+                                /* dataType= */ datatypeToLatestWritePerPackageNameEntry.getKey(),
+                                /* writerAppInfoId= */ packageNameToTimeStamp.getKey(),
+                                /* writeTimeStamp= */ packageNameToTimeStamp.getValue(),
+                                /* readTimeStamp' */ readTimeStamp);
+                UpsertTableRequest upsertTableRequest =
+                        new UpsertTableRequest(TABLE_NAME, contentValues);
+                mTransactionManager.insert(db, upsertTableRequest);
+            }
+        }
+    }
+
+    private Map<Integer, Map<Long, Long>> processRecordsIntoLogs(
+            List<RecordInternal<?>> recordInternals) {
+        // We only need to store latest entry for each package name and datatype pairing
+        // datatype -> package name (app id) -> latest timestamp
+        Map<Integer, Map<Long, Long>> datatypeToLatestWritePerPackageName = new HashMap<>();
+
+        for (RecordInternal<?> recordInternal : recordInternals) {
+            int dataType = recordInternal.getRecordType();
+            long appInfoId = recordInternal.getAppInfoId();
+            long recordTimeStamp = recordInternal.getRecordTime();
+            if (appInfoId == DEFAULT_LONG || recordTimeStamp == DEFAULT_LONG) {
+                continue;
+            }
+            datatypeToLatestWritePerPackageName.putIfAbsent(dataType, new HashMap<>());
+            Map<Long, Long> packageNameToLatestTimeStamp =
+                    datatypeToLatestWritePerPackageName.get(dataType);
+            long latestTimeStamp =
+                    packageNameToLatestTimeStamp.getOrDefault(appInfoId, DEFAULT_LONG);
+            if (recordTimeStamp > latestTimeStamp) {
+                packageNameToLatestTimeStamp.put(appInfoId, recordTimeStamp);
+            }
+        }
+
+        return datatypeToLatestWritePerPackageName;
+    }
+
+    /** Populates values for insert into db. */
+    @VisibleForTesting
+    public static ContentValues populateCommonColumns(
+            long readerAppInfoId,
+            int dataType,
+            long writerAppInfoId,
+            long writeTimeStamp,
+            long readTimeStamp) {
+
+        boolean wasReadRecordWrittenInPast30Days =
+                writeTimeStamp
+                        >= Instant.ofEpochMilli(readTimeStamp)
+                                .minus(TIME_WINDOW_DAYS, ChronoUnit.DAYS)
+                                .toEpochMilli();
+
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(READER_APP_ID_COLUMN_NAME, readerAppInfoId);
+        contentValues.put(RECORD_TYPE_COLUMN_NAME, dataType);
+        contentValues.put(WRITER_APP_ID_COLUMN_NAME, writerAppInfoId);
+        contentValues.put(READ_TIME, readTimeStamp);
+        contentValues.put(
+                WAS_READ_RECORD_WRITTEN_IN_PAST_30_DAYS, wasReadRecordWrittenInPast30Days);
+        return contentValues;
+    }
+
+    public static class ReadAccessLog {
+        private final String mReaderPackage;
+        private final String mWriterPackage;
+        private final int mDataType;
+        private final long mReadTimeStamp;
+        private final boolean mWasReadRecordWrittenInPast30Days;
+
+        public ReadAccessLog(
+                String readerPackage,
+                String writerPackage,
+                int dataType,
+                long readTimeStamp,
+                boolean wasReadRecordWrittenInPast30Days) {
+            this.mReaderPackage = readerPackage;
+            this.mWriterPackage = writerPackage;
+            this.mDataType = dataType;
+            this.mReadTimeStamp = readTimeStamp;
+            this.mWasReadRecordWrittenInPast30Days = wasReadRecordWrittenInPast30Days;
+        }
+
+        public String getReaderPackage() {
+            return mReaderPackage;
+        }
+
+        public int getDataType() {
+            return mDataType;
+        }
+
+        public String getWriterPackage() {
+            return mWriterPackage;
+        }
+
+        public long getReadTimeStamp() {
+            return mReadTimeStamp;
+        }
+
+        public boolean getWasReadRecordWrittenInPast30Days() {
+            return mWasReadRecordWrittenInPast30Days;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (!(o instanceof ReadAccessLog that)) return false;
+            return mDataType == that.mDataType
+                    && mReadTimeStamp == that.mReadTimeStamp
+                    && mWasReadRecordWrittenInPast30Days == that.mWasReadRecordWrittenInPast30Days
+                    && Objects.equals(mReaderPackage, that.mReaderPackage)
+                    && Objects.equals(mWriterPackage, that.mWriterPackage);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(
+                    mReaderPackage,
+                    mWriterPackage,
+                    mDataType,
+                    mReadTimeStamp,
+                    mWasReadRecordWrittenInPast30Days);
+        }
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/RecordHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/RecordHelper.java
index 81ff03b..cdcc88a 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/RecordHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/RecordHelper.java
@@ -35,7 +35,6 @@
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorString;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorUUID;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getDedupeByteBuffer;
-import static com.android.server.healthconnect.storage.utils.StorageUtils.supportsPriority;
 import static com.android.server.healthconnect.storage.utils.WhereClauses.LogicalOperator.AND;
 import static com.android.server.healthconnect.storage.utils.WhereClauses.LogicalOperator.OR;
 
@@ -49,19 +48,21 @@
 import android.health.connect.datatypes.AggregationType;
 import android.health.connect.datatypes.RecordTypeIdentifier;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.util.ArrayMap;
 import android.util.Pair;
 import android.util.Slog;
 
 import androidx.annotation.Nullable;
 
+import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.AggregateParams;
 import com.android.server.healthconnect.storage.request.AggregateTableRequest;
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
 import com.android.server.healthconnect.storage.request.DeleteTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.request.UpsertTableRequest;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.OrderByClause;
 import com.android.server.healthconnect.storage.utils.SqlJoin;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
@@ -133,7 +134,9 @@
             String callingPackage,
             List<String> packageFilters,
             HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
+            InternalHealthConnectMappings internalHealthConnectMappings,
             AppInfoHelper appInfoHelper,
+            TransactionManager transactionManager,
             long startTime,
             long endTime,
             long startDateAccess,
@@ -148,7 +151,8 @@
         params.setExtraTimeColumn(endTimeColumnName);
         params.setOffsetColumnToFetch(getZoneOffsetColumnName());
 
-        if (supportsPriority(mRecordIdentifier, aggregationType.getAggregateOperationType())) {
+        if (internalHealthConnectMappings.supportsPriority(
+                mRecordIdentifier, aggregationType.getAggregateOperationType())) {
             List<String> columns =
                     Arrays.asList(
                             physicalTimeColumnName,
@@ -157,7 +161,7 @@
                             LAST_MODIFIED_TIME_COLUMN_NAME);
             params.appendAdditionalColumns(columns);
         }
-        if (StorageUtils.isDerivedType(mRecordIdentifier)) {
+        if (internalHealthConnectMappings.isDerivedType(mRecordIdentifier)) {
             params.appendAdditionalColumns(Collections.singletonList(physicalTimeColumnName));
         }
 
@@ -186,7 +190,9 @@
                         this,
                         whereClauses,
                         healthDataCategoryPriorityHelper,
+                        internalHealthConnectMappings,
                         appInfoHelper,
+                        transactionManager,
                         useLocalTime)
                 .setTimeFilter(startTime, endTime);
     }
@@ -219,7 +225,8 @@
      * Used to calculate and get aggregate results for data types that support derived aggregates
      */
     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
-    public double[] deriveAggregate(Cursor cursor, AggregateTableRequest request) {
+    public double[] deriveAggregate(
+            Cursor cursor, AggregateTableRequest request, TransactionManager transactionManager) {
         return null;
     }
 
@@ -575,7 +582,7 @@
             @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
             T record =
                     (T)
-                            RecordMapper.getInstance()
+                            HealthConnectMappings.getInstance()
                                     .getRecordIdToInternalRecordClassMap()
                                     .get(getRecordIdentifier())
                                     .getConstructor()
@@ -595,6 +602,7 @@
                             : appInfoHelper.getPackageName(appInfoId);
             record.setPackageName(packageName);
             populateRecordValue(cursor, record);
+            record.setAppInfoId(appInfoId);
 
             return record;
         } catch (InstantiationException
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/SleepSessionRecordHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/SleepSessionRecordHelper.java
index d4c80b9..422799f 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/SleepSessionRecordHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/SleepSessionRecordHelper.java
@@ -53,8 +53,6 @@
     private static final String NOTES_COLUMN_NAME = "notes";
     private static final String TITLE_COLUMN_NAME = "title";
 
-    private static final int NO_SLEEP_TABLE_DB_VERSION = 1;
-
     public SleepSessionRecordHelper() {
         super(RecordTypeIdentifier.RECORD_TYPE_SLEEP_SESSION);
     }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/TableSizeHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/TableSizeHelper.java
new file mode 100644
index 0000000..bedbe3c
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/TableSizeHelper.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.datatypehelpers;
+
+import android.annotation.Nullable;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteException;
+
+import com.android.server.healthconnect.storage.TransactionManager;
+
+import java.util.Collection;
+
+/**
+ * Helper class for getting statistics about database table size.
+ *
+ * @hide
+ */
+public class TableSizeHelper {
+
+    private static final long NO_DATA = -1;
+    private final TransactionManager mTransactionManager;
+
+    public TableSizeHelper(TransactionManager transactionManager) {
+        this.mTransactionManager = transactionManager;
+    }
+
+    /**
+     * Reads the total number of bytes of disk used to store the given tables. See <a
+     * href="https://sqlite.org/dbstat.html">SQLite {@code dbstat} documentation</a>.
+     *
+     * @param tables a collection of table names to add together
+     * @return the total number of bytes used to store those tables, or null if this information
+     *     cannot be read
+     */
+    @Nullable
+    public Long getFileBytes(Collection<String> tables) {
+        if (tables.isEmpty()) {
+            return 0L;
+        }
+        StringBuilder sql = new StringBuilder("SELECT SUM(pgsize) FROM dbstat WHERE name IN (");
+        String[] args = new String[tables.size()];
+        int index = 0;
+        for (String table : tables) {
+            sql.append("?,");
+            args[index++] = table;
+        }
+        sql.setCharAt(sql.length() - 1, ')');
+        try {
+            long bytes =
+                    mTransactionManager.runAsTransaction(
+                            db -> {
+                                try (Cursor cursor = db.rawQuery(sql.toString(), args)) {
+                                    if (!cursor.moveToFirst()) {
+                                        return NO_DATA;
+                                    }
+                                    return cursor.getLong(0);
+                                }
+                            });
+            if (bytes == NO_DATA) {
+                return null;
+            }
+            return bytes;
+        } catch (SQLiteException e) {
+            // This can happen if the dbstat table does not exist. If so, carry on.
+            return null;
+        }
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/TotalCaloriesBurnedRecordHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/TotalCaloriesBurnedRecordHelper.java
index 41922b6..7428054 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/TotalCaloriesBurnedRecordHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/TotalCaloriesBurnedRecordHelper.java
@@ -30,6 +30,7 @@
 import android.util.Pair;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.AggregateParams;
 import com.android.server.healthconnect.storage.request.AggregateTableRequest;
 
@@ -97,7 +98,8 @@
     }
 
     @Override
-    public double[] deriveAggregate(Cursor cursor, AggregateTableRequest request) {
+    public double[] deriveAggregate(
+            Cursor cursor, AggregateTableRequest request, TransactionManager transactionManager) {
         int index = 0;
         List<Pair<Long, Long>> groupIntervals = request.getGroupSplitIntervals();
 
@@ -114,7 +116,8 @@
                         groupIntervals.get(0).first,
                         groupIntervals.get(groupIntervals.size() - 1).second,
                         priorityList,
-                        request.getUseLocalTime());
+                        request.getUseLocalTime(),
+                        transactionManager);
         double[] totalCaloriesBurnedArray = new double[groupIntervals.size()];
         for (Pair<Long, Long> groupInterval : groupIntervals) {
             long groupStartTime = groupInterval.first;
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/aggregation/ActivityIntensityAggregationData.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/aggregation/ActivityIntensityAggregationData.java
new file mode 100644
index 0000000..e579938
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/aggregation/ActivityIntensityAggregationData.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.datatypehelpers.aggregation;
+
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
+import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVITY_INTENSITY_DURATION_TOTAL;
+import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVITY_INTENSITY_MINUTES_TOTAL;
+import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVITY_INTENSITY_MODERATE_DURATION_TOTAL;
+import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVITY_INTENSITY_VIGOROUS_DURATION_TOTAL;
+
+import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorInt;
+
+import android.database.Cursor;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.AggregationType;
+
+import com.android.server.healthconnect.storage.datatypehelpers.ActivityIntensityRecordHelper;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Helper class to aggregate {@link ActivityIntensityRecord} data.
+ *
+ * <p>Calculates the duration of the overlap between the underlying {@link ActivityIntensityRecord}
+ * and the requested window, and applies the multiplier depending on intensity type of the record.
+ *
+ * @hide
+ */
+final class ActivityIntensityAggregationData extends AggregationRecordData {
+
+    private static final long MILLIS_IN_A_MINUTE = TimeUnit.MINUTES.toMillis(1);
+
+    @AggregationType.AggregationTypeIdentifier private final int mAggregationType;
+    @ActivityIntensityRecord.ActivityIntensityType private int mActivityIntensityType;
+
+    ActivityIntensityAggregationData(
+            @AggregationType.AggregationTypeIdentifier int aggregationType) {
+        mAggregationType = aggregationType;
+    }
+
+    @Override
+    double getResultOnInterval(AggregationTimestamp windowStart, AggregationTimestamp windowEnd) {
+        double overlapDurationMillis =
+                calculateIntervalOverlapDuration(
+                        getStartTime(), windowStart.getTime(), getEndTime(), windowEnd.getTime());
+
+        // Zero multiplier is used for cases when the intensity type of the underlying record is
+        // different to the intensity type being aggregated, in which case the record duration must
+        // not be included in the aggregation.
+        int multiplier =
+                switch (mAggregationType) {
+                    case ACTIVITY_INTENSITY_MODERATE_DURATION_TOTAL ->
+                            mActivityIntensityType == ACTIVITY_INTENSITY_TYPE_MODERATE ? 1 : 0;
+                    case ACTIVITY_INTENSITY_VIGOROUS_DURATION_TOTAL ->
+                            mActivityIntensityType == ACTIVITY_INTENSITY_TYPE_VIGOROUS ? 1 : 0;
+                    case ACTIVITY_INTENSITY_DURATION_TOTAL -> 1;
+                    case ACTIVITY_INTENSITY_MINUTES_TOTAL ->
+                            mActivityIntensityType == ACTIVITY_INTENSITY_TYPE_MODERATE ? 1 : 2;
+                    default ->
+                            throw new IllegalStateException(
+                                    "Unsupported aggregation type: " + mAggregationType);
+                };
+
+        // TODO(b/373585917): round the resulting INTENSITY_MINUTES to the nearest minute instead
+        // of rounding down to avoid floating point inaccuracy.
+        return overlapDurationMillis
+                * multiplier
+                / (mAggregationType == ACTIVITY_INTENSITY_MINUTES_TOTAL ? MILLIS_IN_A_MINUTE : 1);
+    }
+
+    @Override
+    void populateSpecificAggregationData(Cursor cursor, boolean useLocalTime) {
+        mActivityIntensityType =
+                getCursorInt(cursor, ActivityIntensityRecordHelper.TYPE_COLUMN_NAME);
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/aggregation/PriorityRecordsAggregator.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/aggregation/PriorityRecordsAggregator.java
index 0f8dfb4..ed3443f 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/aggregation/PriorityRecordsAggregator.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/aggregation/PriorityRecordsAggregator.java
@@ -17,6 +17,10 @@
 package com.android.server.healthconnect.storage.datatypehelpers.aggregation;
 
 import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVE_CALORIES_BURNED_RECORD_ACTIVE_CALORIES_TOTAL;
+import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVITY_INTENSITY_DURATION_TOTAL;
+import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVITY_INTENSITY_MINUTES_TOTAL;
+import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVITY_INTENSITY_MODERATE_DURATION_TOTAL;
+import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ACTIVITY_INTENSITY_VIGOROUS_DURATION_TOTAL;
 import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.DISTANCE_RECORD_DISTANCE_TOTAL;
 import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.ELEVATION_RECORD_ELEVATION_GAINED_TOTAL;
 import static android.health.connect.datatypes.AggregationType.AggregationTypeIdentifier.EXERCISE_SESSION_DURATION_TOTAL;
@@ -236,6 +240,11 @@
                     new SessionDurationAggregationData(
                             mExtraParams.getExcludeIntervalStartColumnName(),
                             mExtraParams.getExcludeIntervalEndColumnName());
+            case ACTIVITY_INTENSITY_MODERATE_DURATION_TOTAL,
+                            ACTIVITY_INTENSITY_VIGOROUS_DURATION_TOTAL,
+                            ACTIVITY_INTENSITY_DURATION_TOTAL,
+                            ACTIVITY_INTENSITY_MINUTES_TOTAL ->
+                    new ActivityIntensityAggregationData(mAggregationType);
             default ->
                     throw new UnsupportedOperationException(
                             "Priority aggregation do not support type: " + mAggregationType);
diff --git a/service/java/com/android/server/healthconnect/storage/request/AggregateTableRequest.java b/service/java/com/android/server/healthconnect/storage/request/AggregateTableRequest.java
index 8c2c15c..919196c 100644
--- a/service/java/com/android/server/healthconnect/storage/request/AggregateTableRequest.java
+++ b/service/java/com/android/server/healthconnect/storage/request/AggregateTableRequest.java
@@ -31,7 +31,6 @@
 import android.health.connect.TimeRangeFilter;
 import android.health.connect.TimeRangeFilterHelper;
 import android.health.connect.datatypes.AggregationType;
-import android.health.connect.internal.datatypes.utils.RecordTypeRecordCategoryMapper;
 import android.util.ArrayMap;
 import android.util.Pair;
 import android.util.Slog;
@@ -41,6 +40,7 @@
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.aggregation.PriorityRecordsAggregator;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.OrderByClause;
 import com.android.server.healthconnect.storage.utils.SqlJoin;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
@@ -87,7 +87,9 @@
     private final AggregateParams.PriorityAggregationExtraParams mPriorityParams;
     private final boolean mUseLocalTime;
     private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
+    private final InternalHealthConnectMappings mInternalHealthConnectMappings;
     private final AppInfoHelper mAppInfoHelper;
+    private final TransactionManager mTransactionManager;
     private List<Long> mTimeSplits;
 
     @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
@@ -97,7 +99,9 @@
             RecordHelper<?> recordHelper,
             WhereClauses whereClauses,
             HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
+            InternalHealthConnectMappings internalHealthConnectMappings,
             AppInfoHelper appInfoHelper,
+            TransactionManager transactionManager,
             boolean useLocalTime) {
         mTableName = params.getTableName();
         mColumnNamesToAggregate = params.getColumnsToFetch();
@@ -116,7 +120,9 @@
         }
         mUseLocalTime = useLocalTime;
         mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
+        mInternalHealthConnectMappings = internalHealthConnectMappings;
         mAppInfoHelper = appInfoHelper;
+        mTransactionManager = transactionManager;
     }
 
     /**
@@ -169,10 +175,11 @@
         final StringBuilder builder = new StringBuilder("SELECT ");
         String aggCommand;
         boolean usingPriority =
-                StorageUtils.supportsPriority(
+                mInternalHealthConnectMappings.supportsPriority(
                                 mRecordHelper.getRecordIdentifier(),
                                 mAggregationType.getAggregateOperationType())
-                        || StorageUtils.isDerivedType(mRecordHelper.getRecordIdentifier());
+                        || mInternalHealthConnectMappings.isDerivedType(
+                                mRecordHelper.getRecordIdentifier());
         if (usingPriority) {
             for (String columnName : mColumnNamesToAggregate) {
                 builder.append(columnName).append(", ");
@@ -236,9 +243,9 @@
     }
 
     public void onResultsFetched(Cursor cursor, Cursor metaDataCursor) {
-        if (StorageUtils.isDerivedType(mRecordHelper.getRecordIdentifier())) {
+        if (mInternalHealthConnectMappings.isDerivedType(mRecordHelper.getRecordIdentifier())) {
             deriveAggregate(cursor);
-        } else if (StorageUtils.supportsPriority(
+        } else if (mInternalHealthConnectMappings.supportsPriority(
                 mRecordHelper.getRecordIdentifier(),
                 mAggregationType.getAggregateOperationType())) {
             processPriorityRequest(cursor);
@@ -252,7 +259,9 @@
     /** Returns list of app Ids of contributing apps for the record type in the priority order */
     public List<Long> getAppIdPriorityList(int recordType) {
         return mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
-                RecordTypeRecordCategoryMapper.getRecordCategoryForRecordType(recordType));
+                mInternalHealthConnectMappings
+                        .getExternalMappings()
+                        .getRecordCategoryForRecordType(recordType));
     }
 
     private void processPriorityRequest(Cursor cursor) {
@@ -271,7 +280,8 @@
                 continue;
             }
 
-            if (mAggregationType.getAggregateResultClass() == Long.class) {
+            if (mAggregationType.getAggregateResultClass() == Long.class
+                    || mAggregationType.getAggregateResultClass() == Duration.class) {
                 result =
                         new AggregateResult<>(
                                 aggregator.getResultForGroup(groupNumber).longValue());
@@ -428,7 +438,8 @@
     }
 
     private void deriveAggregate(Cursor cursor) {
-        double[] derivedAggregateArray = mRecordHelper.deriveAggregate(cursor, this);
+        double[] derivedAggregateArray =
+                mRecordHelper.deriveAggregate(cursor, this, mTransactionManager);
         int index = 0;
         cursor.moveToFirst();
         for (double aggregate : derivedAggregateArray) {
diff --git a/service/java/com/android/server/healthconnect/storage/request/AggregateTransactionRequest.java b/service/java/com/android/server/healthconnect/storage/request/AggregateTransactionRequest.java
index e8af7f8..fea1745 100644
--- a/service/java/com/android/server/healthconnect/storage/request/AggregateTransactionRequest.java
+++ b/service/java/com/android/server/healthconnect/storage/request/AggregateTransactionRequest.java
@@ -30,7 +30,7 @@
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 
 import java.time.Duration;
 import java.time.Period;
@@ -54,6 +54,7 @@
     private final Duration mDuration;
     private final TimeRangeFilter mTimeRangeFilter;
     private final AggregationTypeIdMapper mAggregationTypeIdMapper;
+    private final TransactionManager mTransactionManager;
     private final Set<Integer> mRecordTypeIds = new HashSet<>();
 
     public AggregateTransactionRequest(
@@ -61,6 +62,8 @@
             String packageName,
             AggregateDataRequestParcel request,
             HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper,
+            InternalHealthConnectMappings internalHealthConnectMappings,
+            TransactionManager transactionManager,
             long startDateAccess) {
         mPackageName = packageName;
         mAggregateTableRequests = new ArrayList<>(request.getAggregateIds().length);
@@ -68,19 +71,22 @@
         mDuration = request.getDuration();
         mTimeRangeFilter = request.getTimeRangeFilter();
         mAggregationTypeIdMapper = AggregationTypeIdMapper.getInstance();
-
+        mTransactionManager = transactionManager;
         for (int id : request.getAggregateIds()) {
             AggregationType<?> aggregationType = mAggregationTypeIdMapper.getAggregationTypeFor(id);
             int recordTypeId = aggregationType.getApplicableRecordTypeId();
             mRecordTypeIds.add(recordTypeId);
-            RecordHelper<?> recordHelper = RecordHelperProvider.getRecordHelper(recordTypeId);
+            RecordHelper<?> recordHelper =
+                    internalHealthConnectMappings.getRecordHelper(recordTypeId);
             AggregateTableRequest aggregateTableRequest =
                     recordHelper.getAggregateTableRequest(
                             aggregationType,
                             packageName,
                             request.getPackageFilters(),
                             healthDataCategoryPriorityHelper,
+                            internalHealthConnectMappings,
                             appInfoHelper,
+                            transactionManager,
                             request.getStartTime(),
                             request.getEndTime(),
                             startDateAccess,
@@ -105,13 +111,16 @@
      * @return Compute and return aggregations
      */
     public AggregateDataResponseParcel getAggregateDataResponseParcel(
-            AccessLogsHelper accessLogsHelper) {
+            AccessLogsHelper accessLogsHelper, boolean shouldRecordAccessLog) {
         Map<AggregationType<?>, List<AggregateResult<?>>> results = new ArrayMap<>();
         for (AggregateTableRequest aggregateTableRequest : mAggregateTableRequests) {
             // Compute aggregations and record read access log
-            TransactionManager.getInitialisedInstance()
-                    .populateWithAggregation(
-                            aggregateTableRequest, mPackageName, mRecordTypeIds, accessLogsHelper);
+            mTransactionManager.populateWithAggregation(
+                    aggregateTableRequest,
+                    mPackageName,
+                    mRecordTypeIds,
+                    accessLogsHelper,
+                    shouldRecordAccessLog);
             results.put(
                     aggregateTableRequest.getAggregationType(),
                     aggregateTableRequest.getAggregateResults());
diff --git a/service/java/com/android/server/healthconnect/storage/request/DeleteTransactionRequest.java b/service/java/com/android/server/healthconnect/storage/request/DeleteTransactionRequest.java
index 76f33cb..8a9f599 100644
--- a/service/java/com/android/server/healthconnect/storage/request/DeleteTransactionRequest.java
+++ b/service/java/com/android/server/healthconnect/storage/request/DeleteTransactionRequest.java
@@ -21,7 +21,7 @@
 import android.health.connect.Constants;
 import android.health.connect.RecordIdFilter;
 import android.health.connect.aidl.DeleteUsingFiltersRequestParcel;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Slog;
@@ -29,7 +29,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 
 import java.util.ArrayList;
@@ -58,6 +58,7 @@
             String packageName,
             DeleteUsingFiltersRequestParcel request,
             AppInfoHelper appInfoHelper) {
+        var internalHealthConnectMappings = InternalHealthConnectMappings.getInstance();
         Objects.requireNonNull(packageName);
         mPackageName = packageName;
         mDeleteTableRequests = new ArrayList<>(request.getRecordTypeFilters().size());
@@ -69,8 +70,9 @@
             Map<RecordHelper<?>, List<UUID>> recordTypeToUuids = new ArrayMap<>();
             for (RecordIdFilter recordId : recordIds) {
                 RecordHelper<?> recordHelper =
-                        RecordHelperProvider.getRecordHelper(
-                                RecordMapper.getInstance().getRecordType(recordId.getRecordType()));
+                        internalHealthConnectMappings.getRecordHelper(
+                                HealthConnectMappings.getInstance()
+                                        .getRecordType(recordId.getRecordType()));
                 UUID uuid = StorageUtils.getUUIDFor(recordId, packageName);
                 if (uuidSet.contains(uuid)) {
                     // id has been already been processed;
@@ -97,14 +99,15 @@
         if (recordTypeFilters == null || recordTypeFilters.isEmpty()) {
             recordTypeFilters =
                     new ArrayList<>(
-                            RecordMapper.getInstance()
+                            HealthConnectMappings.getInstance()
                                     .getRecordIdToExternalRecordClassMap()
                                     .keySet());
         }
 
         recordTypeFilters.forEach(
                 (recordType) -> {
-                    RecordHelper<?> recordHelper = RecordHelperProvider.getRecordHelper(recordType);
+                    RecordHelper<?> recordHelper =
+                            internalHealthConnectMappings.getRecordHelper(recordType);
                     Objects.requireNonNull(recordHelper);
 
                     mDeleteTableRequests.add(
diff --git a/service/java/com/android/server/healthconnect/storage/request/ReadTableRequest.java b/service/java/com/android/server/healthconnect/storage/request/ReadTableRequest.java
index 8999634..26ce61f 100644
--- a/service/java/com/android/server/healthconnect/storage/request/ReadTableRequest.java
+++ b/service/java/com/android/server/healthconnect/storage/request/ReadTableRequest.java
@@ -60,33 +60,43 @@
     public @interface UnionType {}
 
     private final String mTableName;
-    private RecordHelper<?> mRecordHelper;
-    private List<String> mColumnNames;
-    private SqlJoin mJoinClause;
+    @Nullable private RecordHelper<?> mRecordHelper;
+    @Nullable private List<String> mColumnNames;
+    @Nullable private SqlJoin mJoinClause;
     private WhereClauses mWhereClauses = new WhereClauses(AND);
     private boolean mDistinct = false;
     private OrderByClause mOrderByClause = new OrderByClause();
-    private String mLimitClause = "";
-    private List<ReadTableRequest> mExtraReadRequests;
-    private List<ReadTableRequest> mUnionReadRequests;
+    private OrderByClause mFinalOrderByClause = new OrderByClause();
+
+    // Null means no limit.
+    @Nullable private Integer mLimit = null;
+    @Nullable private Integer mFinalLimit = null;
+    @Nullable private List<ReadTableRequest> mExtraReadRequests;
+    @Nullable private List<ReadTableRequest> mUnionReadRequests;
     private String mUnionType = UNION_ALL;
 
-    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
     public ReadTableRequest(String tableName) {
         Objects.requireNonNull(tableName);
 
         mTableName = tableName;
     }
 
+    /** Returns the record helper associated with this request if it has been set, or null. */
+    @Nullable
     public RecordHelper<?> getRecordHelper() {
         return mRecordHelper;
     }
 
+    /**
+     * Sets the record helper associated with this request. This is not used for creating the SQL,
+     * but is a side channel for other classes processing this request.
+     */
     public ReadTableRequest setRecordHelper(RecordHelper<?> recordHelper) {
-        mRecordHelper = recordHelper;
+        mRecordHelper = Objects.requireNonNull(recordHelper);
         return this;
     }
 
+    /** Sets the column names to select. */
     public ReadTableRequest setColumnNames(List<String> columnNames) {
         Objects.requireNonNull(columnNames);
 
@@ -94,6 +104,7 @@
         return this;
     }
 
+    /** Sets the WHERE clause to use in this SELECT. */
     public ReadTableRequest setWhereClause(WhereClauses whereClauses) {
         mWhereClauses = whereClauses;
         return this;
@@ -126,45 +137,123 @@
         return this;
     }
 
-    /** Returns SQL statement to perform read operation. */
+    /**
+     * Returns SQL statement to perform read operation.
+     *
+     * @throws IllegalArgumentException if the {@link ReadTableRequest} does not have a join clause
+     *     and has both a {@link #setOrderBy} and {@link #setFinalOrderBy}, or if it does not have a
+     *     join clause but has both a {@link #setLimit} and {@link #setFinalLimit} as this would
+     *     lead to an invalid query.
+     */
     public String getReadCommand() {
-        String selectStatement = buildSelectStatement();
+        return getReadCommand(/* asCount= */ false);
+    }
 
-        String readQuery;
-        if (mJoinClause != null) {
-            String innerQuery = buildReadQuery(SELECT_ALL);
-            readQuery = mJoinClause.getJoinWithQueryCommand(selectStatement, innerQuery);
-        } else {
-            readQuery = buildReadQuery(selectStatement);
-        }
+    /**
+     * Returns an SQL statement that performs a count of the number of items that would be returned
+     * by the read operation.
+     *
+     * <p>The SQL result will have a single row, single column with the count of rows as the integer
+     * value in that first row, first column.
+     *
+     * @throws IllegalArgumentException if the {@link ReadTableRequest} does not have a join clause
+     *     and has both a {@link #setOrderBy} and {@link #setFinalOrderBy}, or if it does not have a
+     *     join clause but has both a {@link #setLimit} and {@link #setFinalLimit} as this would
+     *     lead to an invalid query.
+     */
+    public String getCountCommand() {
+        return getReadCommand(/* asCount= */ true);
+    }
 
-        if (Constants.DEBUG) {
-            Slog.d(TAG, "read query: " + readQuery);
-        }
-
+    /**
+     * Returns the SQL for this request.
+     *
+     * @param asCount if true, the SQL returns the count of the results, if false returns the
+     *     results
+     */
+    private String getReadCommand(boolean asCount) {
         if (mUnionReadRequests != null && !mUnionReadRequests.isEmpty()) {
             StringBuilder builder = new StringBuilder();
+            if (asCount) {
+                builder.append("SELECT COUNT(*) FROM (");
+            }
             for (ReadTableRequest unionReadRequest : mUnionReadRequests) {
                 builder.append("SELECT * FROM (");
                 builder.append(unionReadRequest.getReadCommand());
                 builder.append(")");
                 builder.append(mUnionType);
             }
-
-            builder.append(readQuery);
-
+            // For a union request we have to do the count outside the query.
+            builder.append(getReadQuery(/* asCount= */ false));
+            if (asCount) {
+                builder.append(")");
+            }
             return builder.toString();
+        } else {
+            return getReadQuery(asCount);
+        }
+    }
+
+    /**
+     * Returns the SQL for this request, ignoring union read requests.
+     *
+     * @param asCount if true, the SQL returns the count of the results, if false returns the
+     *     results
+     */
+    private String getReadQuery(boolean asCount) {
+        String selectStatement = buildSelectStatement(asCount);
+
+        String readQuery;
+        if (mJoinClause != null) {
+            String innerQuery = buildReadQuery(SELECT_ALL);
+            readQuery = mJoinClause.getJoinWithQueryCommand(selectStatement, innerQuery);
+        } else {
+            if (!mOrderByClause.getOrderBy().isEmpty()
+                    && !mFinalOrderByClause.getOrderBy().isEmpty()) {
+                throw new IllegalArgumentException(
+                        "Without a join clause only one of orderByClause or finalOrderByClause may "
+                                + "be set");
+            }
+            if (mLimit != null && mFinalLimit != null) {
+                throw new IllegalArgumentException(
+                        "Without a join clause only one of the limit or finalLimit may be set");
+            }
+            readQuery = buildReadQuery(selectStatement);
         }
 
+        readQuery = appendFinalOrderByAndLimit(readQuery);
+
+        if (Constants.DEBUG) {
+            Slog.d(TAG, "read query: " + readQuery);
+        }
         return readQuery;
     }
 
-    private String buildSelectStatement() {
+    private String buildSelectStatement(boolean asCount) {
         StringBuilder selectStatement = new StringBuilder(SELECT);
+        if (asCount) {
+            selectStatement.append("COUNT(");
+        }
         if (mDistinct) {
             selectStatement.append(DISTINCT);
         }
-        selectStatement.append(getColumnsToFetch());
+        // If we have distinct over multiple columns, or no count we need the column names.
+        // COUNT(*) differs from COUNT(column) in that it only counts non-null values. However,
+        // a select query will return null values. Therefore, we need COUNT(*) for the count
+        // to match the number of rows in the result.
+        if (!mDistinct && asCount) {
+            selectStatement.append("*");
+        } else {
+            String columns = "*";
+            if (mColumnNames != null && !mColumnNames.isEmpty()) {
+                columns = String.join(DELIMITER, mColumnNames);
+            }
+            selectStatement.append(columns);
+        }
+        if (asCount) {
+            selectStatement.append(")");
+        }
+
         selectStatement.append(FROM);
         return selectStatement.toString();
     }
@@ -174,7 +263,13 @@
                 + mTableName
                 + mWhereClauses.get(/* withWhereKeyword */ true)
                 + mOrderByClause.getOrderBy()
-                + mLimitClause;
+                + (mLimit == null ? "" : LIMIT_SIZE + mLimit);
+    }
+
+    private String appendFinalOrderByAndLimit(String query) {
+        return query
+                + mFinalOrderByClause.getOrderBy()
+                + (mFinalLimit == null ? "" : LIMIT_SIZE + mFinalLimit);
     }
 
     /** Get requests for populating extra data */
@@ -194,28 +289,68 @@
         return mTableName;
     }
 
-    /** Sets order by clause for the read query */
+    /**
+     * Sets order by clause for the read query
+     *
+     * <p>Note that if the query contains a join, the order by clause will be applied to the main
+     * table read sub query before joining. For setting the clause on the full query result use
+     * {@link #setFinalOrderBy}.
+     */
     public ReadTableRequest setOrderBy(OrderByClause orderBy) {
         mOrderByClause = orderBy;
         return this;
     }
 
-    /** Sets LIMIT size for the read query */
-    public ReadTableRequest setLimit(int limit) {
-        mLimitClause = LIMIT_SIZE + limit;
+    /**
+     * Sets order by clause for the read query, applied to the final query result
+     *
+     * <p>This means that if the query contains a join, the order by will be applied to the full
+     * query result instead of the main table read before joining, as is the case with {@link
+     * #setOrderBy}.
+     */
+    public ReadTableRequest setFinalOrderBy(OrderByClause orderBy) {
+        mFinalOrderByClause = orderBy;
         return this;
     }
 
-    private String getColumnsToFetch() {
-        if (mColumnNames == null || mColumnNames.isEmpty()) {
-            return "*";
-        }
+    /** Returns the current LIMIT size for the query, or null for no LIMIT. */
+    @Nullable
+    public Integer getLimit() {
+        return mLimit;
+    }
 
-        return String.join(DELIMITER, mColumnNames);
+    /**
+     * Sets LIMIT size for the read query, or null for no limit.
+     *
+     * <p>Note that if the query contains a join, the limit will be applied to the main table read
+     * before joining. For setting the limit on the full query result use {@link #setFinalLimit}.
+     *
+     * <p>If this ReadTableRequest has any unionReadRequests set, but no joinClause, the limit
+     * applies to the full query including the unionReadRequests.
+     */
+    public ReadTableRequest setLimit(@Nullable Integer limit) {
+        mLimit = limit;
+        return this;
+    }
+
+    /** Returns the current final LIMIT size for the query, or null for no LIMIT. */
+    @Nullable
+    public Integer getFinalLimit() {
+        return mFinalLimit;
+    }
+
+    /**
+     * Sets final LIMIT size, or null for the read query, which will be applied to the final query
+     *
+     * <p>This means that if the query contains a join, the limit will apply to the full query
+     * result instead of the main table read before joining, as is the case with {@link #setLimit}.
+     */
+    public ReadTableRequest setFinalLimit(@Nullable Integer limit) {
+        mFinalLimit = limit;
+        return this;
     }
 
     /** Sets union read requests. */
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
     public ReadTableRequest setUnionReadRequests(
             @Nullable List<ReadTableRequest> unionReadRequests) {
         mUnionReadRequests = unionReadRequests;
diff --git a/service/java/com/android/server/healthconnect/storage/request/ReadTransactionRequest.java b/service/java/com/android/server/healthconnect/storage/request/ReadTransactionRequest.java
index bd73aec..2ff22a8 100644
--- a/service/java/com/android/server/healthconnect/storage/request/ReadTransactionRequest.java
+++ b/service/java/com/android/server/healthconnect/storage/request/ReadTransactionRequest.java
@@ -26,7 +26,7 @@
 
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -65,7 +65,8 @@
         mPackageName = callingPackageName;
         int recordTypeId = request.getRecordType();
         mRecordTypeIds = Set.of(recordTypeId);
-        RecordHelper<?> recordHelper = RecordHelperProvider.getRecordHelper(recordTypeId);
+        RecordHelper<?> recordHelper =
+                InternalHealthConnectMappings.getInstance().getRecordHelper(recordTypeId);
         mReadTableRequests =
                 singletonList(
                         recordHelper.getReadTableRequest(
@@ -105,7 +106,8 @@
         recordTypeToUuids.forEach(
                 (recordType, uuids) ->
                         mReadTableRequests.add(
-                                RecordHelperProvider.getRecordHelper(recordType)
+                                InternalHealthConnectMappings.getInstance()
+                                        .getRecordHelper(recordType)
                                         .getReadTableRequest(
                                                 packageName,
                                                 uuids,
diff --git a/service/java/com/android/server/healthconnect/storage/request/UpsertMedicalResourceInternalRequest.java b/service/java/com/android/server/healthconnect/storage/request/UpsertMedicalResourceInternalRequest.java
index 2816b78..7159f6d 100644
--- a/service/java/com/android/server/healthconnect/storage/request/UpsertMedicalResourceInternalRequest.java
+++ b/service/java/com/android/server/healthconnect/storage/request/UpsertMedicalResourceInternalRequest.java
@@ -19,6 +19,7 @@
 import static java.util.Objects.hash;
 import static java.util.Objects.requireNonNull;
 
+import android.health.connect.MedicalResourceId;
 import android.health.connect.UpsertMedicalResourceRequest;
 import android.health.connect.datatypes.FhirResource.FhirResourceType;
 import android.health.connect.datatypes.FhirVersion;
@@ -114,6 +115,15 @@
         return this;
     }
 
+    /**
+     * Creates a {@link MedicalResourceId} from the provided values.
+     *
+     * @throws IllegalArgumentException if any values are invalid.
+     */
+    public MedicalResourceId getMedicalResourceId() {
+        return new MedicalResourceId(mDataSourceId, mFhirResourceType, mFhirResourceId);
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
diff --git a/service/java/com/android/server/healthconnect/storage/request/UpsertTransactionRequest.java b/service/java/com/android/server/healthconnect/storage/request/UpsertTransactionRequest.java
index 3dc524e..ccd027f 100644
--- a/service/java/com/android/server/healthconnect/storage/request/UpsertTransactionRequest.java
+++ b/service/java/com/android/server/healthconnect/storage/request/UpsertTransactionRequest.java
@@ -20,7 +20,6 @@
 import static com.android.server.healthconnect.storage.utils.WhereClauses.LogicalOperator.AND;
 
 import android.annotation.Nullable;
-import android.content.Context;
 import android.health.connect.Constants;
 import android.health.connect.datatypes.RecordTypeIdentifier;
 import android.health.connect.internal.datatypes.RecordInternal;
@@ -31,15 +30,13 @@
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 import com.android.server.healthconnect.storage.utils.WhereClauses;
 
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -56,100 +53,108 @@
  */
 public class UpsertTransactionRequest {
     private static final String TAG = "HealthConnectUTR";
+
+    @Nullable private final String mPackageName;
     private final List<UpsertTableRequest> mUpsertRequests = new ArrayList<>();
-    private final String mPackageName;
-
     @RecordTypeIdentifier.RecordType Set<Integer> mRecordTypes = new ArraySet<>();
-    @Nullable private ArrayMap<String, Boolean> mExtraWritePermissionsToState;
+    private final boolean mShouldGenerateAccessLogs;
+    private final boolean mShouldPreferNewRecord;
 
-    public UpsertTransactionRequest(
-            @Nullable String packageName,
+    /** Create an upsert request for insert API calls. */
+    public static UpsertTransactionRequest createForInsert(
+            String packageName,
             List<RecordInternal<?>> recordInternals,
             DeviceInfoHelper deviceInfoHelper,
-            Context context,
-            boolean isInsertRequest,
-            Map<String, Boolean> extraPermsStateMap,
-            AppInfoHelper appInfoHelper) {
-        this(
+            AppInfoHelper appInfoHelper,
+            ArrayMap<String, Boolean> extraPermsStateMap) {
+        for (RecordInternal<?> recordInternal : recordInternals) {
+            // Override each record package to the given package i.e. the API caller package.
+            StorageUtils.addPackageNameTo(recordInternal, packageName);
+            // For insert, we should generate a fresh UUID. Don't let the client choose it.
+            addNameBasedUUIDTo(recordInternal);
+        }
+        return new UpsertTransactionRequest(
                 packageName,
                 recordInternals,
                 deviceInfoHelper,
-                context,
-                isInsertRequest,
-                false /* useProvidedUuid */,
-                false /* skipPackageNameAndLogs */,
-                extraPermsStateMap,
-                appInfoHelper);
+                appInfoHelper,
+                true /* isInsertRequest */,
+                true /* shouldGenerateAccessLogs */,
+                true /* shouldPreferNewRecord */,
+                extraPermsStateMap);
     }
 
-    public UpsertTransactionRequest(
-            @Nullable String packageName,
+    /** Create an upsert request for update API calls. */
+    public static UpsertTransactionRequest createForUpdate(
+            String packageName,
             List<RecordInternal<?>> recordInternals,
             DeviceInfoHelper deviceInfoHelper,
-            Context context,
-            boolean isInsertRequest,
-            boolean useProvidedUuid,
-            boolean skipPackageName,
-            AppInfoHelper appInfoHelper) {
-        this(
+            AppInfoHelper appInfoHelper,
+            ArrayMap<String, Boolean> extraPermsStateMap) {
+        for (RecordInternal<?> recordInternal : recordInternals) {
+            // Override each record package to the given package i.e. the API caller package.
+            StorageUtils.addPackageNameTo(recordInternal, packageName);
+            // For update requests, generate uuid if the clientRecordID is present, else use the
+            // uuid passed as input.
+            StorageUtils.updateNameBasedUUIDIfRequired(recordInternal);
+        }
+        return new UpsertTransactionRequest(
                 packageName,
                 recordInternals,
                 deviceInfoHelper,
-                context,
-                isInsertRequest,
-                useProvidedUuid,
-                skipPackageName,
-                Collections.emptyMap(),
-                appInfoHelper);
+                appInfoHelper,
+                false /* isInsertRequest */,
+                true /* shouldGenerateAccessLogs */,
+                true /* shouldPreferNewRecord */,
+                extraPermsStateMap);
     }
 
-    @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
+    /** Create an upsert request for restore operation. */
+    public static UpsertTransactionRequest createForRestore(
+            List<RecordInternal<?>> recordInternals,
+            DeviceInfoHelper deviceInfoHelper,
+            AppInfoHelper appInfoHelper) {
+        // Ensure each record has a record id set.
+        for (RecordInternal<?> recordInternal : recordInternals) {
+            Objects.requireNonNull(recordInternal.getUuid());
+        }
+        return new UpsertTransactionRequest(
+                null,
+                recordInternals,
+                deviceInfoHelper,
+                appInfoHelper,
+                true /* isInsertRequest */,
+                false /* shouldGenerateAccessLogs */,
+                false /* shouldPreferNewRecord */,
+                null /* extraPermsStateMap */);
+    }
+
     private UpsertTransactionRequest(
             @Nullable String packageName,
             List<RecordInternal<?>> recordInternals,
             DeviceInfoHelper deviceInfoHelper,
-            Context context,
+            AppInfoHelper appInfoHelper,
             boolean isInsertRequest,
-            // TODO(b/329237732): Use builder pattern for this class.
-            boolean useProvidedUuid,
-            boolean skipPackageName,
-            Map<String, Boolean> extraPermsStateMap,
-            AppInfoHelper appInfoHelper) {
-        mPackageName = packageName;
-        if (extraPermsStateMap != null && !extraPermsStateMap.isEmpty()) {
-            mExtraWritePermissionsToState = new ArrayMap<>();
-            mExtraWritePermissionsToState.putAll(extraPermsStateMap);
+            boolean shouldGenerateAccessLogs,
+            boolean shouldPreferNewRecord,
+            @Nullable ArrayMap<String, Boolean> extraPermsStateMap) {
+        if (shouldGenerateAccessLogs) {
+            Objects.requireNonNull(packageName);
         }
-
+        mPackageName = packageName;
         for (RecordInternal<?> recordInternal : recordInternals) {
-            if (!skipPackageName) {
-                StorageUtils.addPackageNameTo(recordInternal, packageName);
-            }
-            appInfoHelper.populateAppInfoId(recordInternal, context, /* requireAllFields= */ true);
+            appInfoHelper.populateAppInfoId(recordInternal, /* requireAllFields= */ true);
             deviceInfoHelper.populateDeviceInfoId(recordInternal);
-
-            if (isInsertRequest) {
-                if (useProvidedUuid && recordInternal.getUuid() != null) {
-                    // Do nothing i.e. leave the UUID as provided. This is desired for backup and
-                    // restore to ensure references between records remain intact.
-                } else {
-                    // Otherwise, we should generate a fresh UUID. Don't let the client choose it.
-                    addNameBasedUUIDTo(recordInternal);
-                }
-            } else {
-                // For update requests, generate uuid if the clientRecordID is present, else use the
-                // uuid passed as input.
-                StorageUtils.updateNameBasedUUIDIfRequired(recordInternal);
-            }
             mRecordTypes.add(recordInternal.getRecordType());
             recordInternal.setLastModifiedTime(Instant.now().toEpochMilli());
-            addRequest(recordInternal, isInsertRequest);
+            addRequest(recordInternal, isInsertRequest, extraPermsStateMap);
         }
-
+        mShouldGenerateAccessLogs = shouldGenerateAccessLogs;
+        mShouldPreferNewRecord = shouldPreferNewRecord;
         if (!mRecordTypes.isEmpty() && Constants.DEBUG) {
             Slog.d(
                     TAG,
-                    "Upserting transaction for "
+                    "Upsert transaction for "
                             + packageName
                             + " with size "
                             + recordInternals.size());
@@ -176,13 +181,17 @@
         return whereClauseForUpdateRequest;
     }
 
-    private void addRequest(RecordInternal<?> recordInternal, boolean isInsertRequest) {
+    private void addRequest(
+            RecordInternal<?> recordInternal,
+            boolean isInsertRequest,
+            @Nullable ArrayMap<String, Boolean> extraPermsStateMap) {
         RecordHelper<?> recordHelper =
-                RecordHelperProvider.getRecordHelper(recordInternal.getRecordType());
+                InternalHealthConnectMappings.getInstance()
+                        .getRecordHelper(recordInternal.getRecordType());
         Objects.requireNonNull(recordHelper);
 
         UpsertTableRequest request =
-                recordHelper.getUpsertTableRequest(recordInternal, mExtraWritePermissionsToState);
+                recordHelper.getUpsertTableRequest(recordInternal, extraPermsStateMap);
         request.setRecordType(recordHelper.getRecordIdentifier());
         if (!isInsertRequest) {
             request.setUpdateWhereClauses(generateWhereClausesForUpdate(recordInternal));
@@ -191,11 +200,26 @@
         mUpsertRequests.add(request);
     }
 
-    public String getPackageName() {
+    // Package name can be null if we don't need to generate access log, like when we are restoring
+    // data.
+    public @Nullable String getPackageName() {
         return mPackageName;
     }
 
     public Set<Integer> getRecordTypeIds() {
         return mRecordTypes;
     }
+
+    /** Returns whether we should be generating access logs for this request. */
+    public boolean shouldGenerateAccessLogs() {
+        return mShouldGenerateAccessLogs;
+    }
+
+    /**
+     * Returns whether the new record being upserted should be preferred in case of existing
+     * duplicate records
+     */
+    public boolean shouldPreferNewRecord() {
+        return mShouldPreferNewRecord;
+    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/utils/InternalDataTypeDescriptor.java b/service/java/com/android/server/healthconnect/storage/utils/InternalDataTypeDescriptor.java
index c25cefc..b3a3065 100644
--- a/service/java/com/android/server/healthconnect/storage/utils/InternalDataTypeDescriptor.java
+++ b/service/java/com/android/server/healthconnect/storage/utils/InternalDataTypeDescriptor.java
@@ -30,11 +30,12 @@
 import java.util.Objects;
 
 /** @hide */
-public class InternalDataTypeDescriptor {
+public final class InternalDataTypeDescriptor {
     @RecordTypeIdentifier.RecordType private final int mRecordTypeIdentifier;
     private final RecordHelper<?> mRecordHelper;
     @RecordTypeIdForUuid.Type private final int mRecordTypeIdForUuid;
     private final int mLoggingEnum;
+    private final boolean mIsDerived;
 
     private InternalDataTypeDescriptor(Builder builder) {
         checkArgument(builder.mRecordTypeIdentifier != RECORD_TYPE_UNKNOWN);
@@ -46,6 +47,7 @@
         mRecordHelper = Objects.requireNonNull(builder.mRecordHelper);
         mRecordTypeIdForUuid = builder.mRecordTypeIdForUuid;
         mLoggingEnum = builder.mLoggingEnum;
+        mIsDerived = builder.mIsDerived;
     }
 
     @RecordTypeIdentifier.RecordType
@@ -66,6 +68,10 @@
         return mLoggingEnum;
     }
 
+    public boolean isDerived() {
+        return mIsDerived;
+    }
+
     interface RecordTypeIdentifierBuilderStep {
         RecordHelperBuilderStep setRecordTypeIdentifier(
                 @RecordTypeIdentifier.RecordType int recordTypeIdentifier);
@@ -85,6 +91,8 @@
     }
 
     interface BuildStep {
+        BuildStep setDerived();
+
         InternalDataTypeDescriptor build();
     }
 
@@ -106,6 +114,8 @@
 
         private int mLoggingEnum = HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__DATA_TYPE_UNKNOWN;
 
+        private boolean mIsDerived = false;
+
         private Builder() {}
 
         @Override
@@ -138,6 +148,12 @@
         }
 
         @Override
+        public Builder setDerived() {
+            mIsDerived = true;
+            return this;
+        }
+
+        @Override
         public InternalDataTypeDescriptor build() {
             return new InternalDataTypeDescriptor(this);
         }
diff --git a/service/java/com/android/server/healthconnect/storage/utils/InternalDataTypeDescriptors.java b/service/java/com/android/server/healthconnect/storage/utils/InternalDataTypeDescriptors.java
index 552f4d4..70d6cd9 100644
--- a/service/java/com/android/server/healthconnect/storage/utils/InternalDataTypeDescriptors.java
+++ b/service/java/com/android/server/healthconnect/storage/utils/InternalDataTypeDescriptors.java
@@ -17,6 +17,7 @@
 package com.android.server.healthconnect.storage.utils;
 
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__ACTIVE_CALORIES_BURNED;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__ACTIVITY_INTENSITY;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__BASAL_BODY_TEMPERATURE;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__BASAL_METABOLIC_RATE;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__BLOOD_GLUCOSE;
@@ -56,6 +57,7 @@
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__WEIGHT;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__WHEELCHAIR_PUSHES;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVE_CALORIES_BURNED;
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BASAL_BODY_TEMPERATURE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BASAL_METABOLIC_RATE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BLOOD_GLUCOSE;
@@ -99,6 +101,7 @@
 
 import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
 import static com.android.server.healthconnect.storage.utils.RecordTypeIdForUuid.RECORD_TYPE_ID_FOR_UUID_ACTIVE_CALORIES_BURNED;
+import static com.android.server.healthconnect.storage.utils.RecordTypeIdForUuid.RECORD_TYPE_ID_FOR_UUID_ACTIVITY_INTENSITY;
 import static com.android.server.healthconnect.storage.utils.RecordTypeIdForUuid.RECORD_TYPE_ID_FOR_UUID_BASAL_BODY_TEMPERATURE;
 import static com.android.server.healthconnect.storage.utils.RecordTypeIdForUuid.RECORD_TYPE_ID_FOR_UUID_BASAL_METABOLIC_RATE;
 import static com.android.server.healthconnect.storage.utils.RecordTypeIdForUuid.RECORD_TYPE_ID_FOR_UUID_BLOOD_GLUCOSE;
@@ -140,10 +143,14 @@
 import static com.android.server.healthconnect.storage.utils.RecordTypeIdForUuid.RECORD_TYPE_ID_FOR_UUID_WEIGHT;
 import static com.android.server.healthconnect.storage.utils.RecordTypeIdForUuid.RECORD_TYPE_ID_FOR_UUID_WHEELCHAIR_PUSHES;
 
+import android.annotation.Nullable;
 import android.health.HealthFitnessStatsLog;
 
+import com.android.healthfitness.flags.AconfigFlagHelper;
+import com.android.healthfitness.flags.Flags;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.healthconnect.storage.datatypehelpers.ActiveCaloriesBurnedRecordHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ActivityIntensityRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.BasalBodyTemperatureRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.BasalMetabolicRateRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.BloodGlucoseRecordHelper;
@@ -185,19 +192,28 @@
 import com.android.server.healthconnect.storage.datatypehelpers.WeightRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.WheelchairPushesRecordHelper;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 /** @hide */
 @VisibleForTesting(visibility = PACKAGE)
 public class InternalDataTypeDescriptors {
 
-    // Using an alias to satisfy the Java style line length limit below, otherwise doesn't fit.
+    // Using aliases to satisfy the Java style line length limit below, otherwise doesn't fit.
     private static final int LOGGING_ENUM_HEART_RATE_VARIABILITY_RMSSD =
             HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__HEART_RATE_VARIABILITY_RMSSD;
 
+    private static final int LOGGING_ENUM_ACTIVITY_INTENSITY =
+            HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__ACTIVITY_INTENSITY;
+
     @VisibleForTesting(visibility = PACKAGE)
     public static List<InternalDataTypeDescriptor> getAllInternalDataTypeDescriptors() {
-        return List.of(
+        if (!Flags.healthConnectMappings()) {
+            return List.of();
+        }
+
+        return listOfNonNull(
                 InternalDataTypeDescriptor.builder()
                         .setRecordTypeIdentifier(RECORD_TYPE_ACTIVE_CALORIES_BURNED)
                         .setRecordHelper(new ActiveCaloriesBurnedRecordHelper())
@@ -205,6 +221,14 @@
                         .setLoggingEnum(
                                 HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__ACTIVE_CALORIES_BURNED)
                         .build(),
+                AconfigFlagHelper.isActivityIntensityEnabled()
+                        ? InternalDataTypeDescriptor.builder()
+                                .setRecordTypeIdentifier(RECORD_TYPE_ACTIVITY_INTENSITY)
+                                .setRecordHelper(new ActivityIntensityRecordHelper())
+                                .setRecordTypeIdForUuid(RECORD_TYPE_ID_FOR_UUID_ACTIVITY_INTENSITY)
+                                .setLoggingEnum(LOGGING_ENUM_ACTIVITY_INTENSITY)
+                                .build()
+                        : null,
                 InternalDataTypeDescriptor.builder()
                         .setRecordTypeIdentifier(RECORD_TYPE_BASAL_BODY_TEMPERATURE)
                         .setRecordHelper(new BasalBodyTemperatureRecordHelper())
@@ -218,6 +242,7 @@
                         .setRecordTypeIdForUuid(RECORD_TYPE_ID_FOR_UUID_BASAL_METABOLIC_RATE)
                         .setLoggingEnum(
                                 HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__BASAL_METABOLIC_RATE)
+                        .setDerived()
                         .build(),
                 InternalDataTypeDescriptor.builder()
                         .setRecordTypeIdentifier(RECORD_TYPE_BLOOD_GLUCOSE)
@@ -442,6 +467,7 @@
                         .setRecordTypeIdForUuid(RECORD_TYPE_ID_FOR_UUID_TOTAL_CALORIES_BURNED)
                         .setLoggingEnum(
                                 HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__TOTAL_CALORIES_BURNED)
+                        .setDerived()
                         .build(),
                 InternalDataTypeDescriptor.builder()
                         .setRecordTypeIdentifier(RECORD_TYPE_VO2_MAX)
@@ -463,4 +489,9 @@
                                 HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__WHEELCHAIR_PUSHES)
                         .build());
     }
+
+    @SafeVarargs
+    private static <T> List<T> listOfNonNull(@Nullable T... values) {
+        return Arrays.stream(values).filter(Objects::nonNull).toList();
+    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/utils/InternalHealthConnectMappings.java b/service/java/com/android/server/healthconnect/storage/utils/InternalHealthConnectMappings.java
index d1d6a8f..59d3b2b 100644
--- a/service/java/com/android/server/healthconnect/storage/utils/InternalHealthConnectMappings.java
+++ b/service/java/com/android/server/healthconnect/storage/utils/InternalHealthConnectMappings.java
@@ -16,9 +16,16 @@
 
 package com.android.server.healthconnect.storage.utils;
 
+import static android.health.connect.HealthDataCategory.ACTIVITY;
+import static android.health.connect.HealthDataCategory.SLEEP;
+import static android.health.connect.HealthDataCategory.WELLNESS;
+import static android.health.connect.datatypes.AggregationType.SUM;
+
 import static java.util.Objects.requireNonNull;
 
+import android.health.connect.datatypes.AggregationType;
 import android.health.connect.datatypes.RecordTypeIdentifier;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.util.ArrayMap;
 
 import com.android.healthfitness.flags.Flags;
@@ -34,17 +41,45 @@
 /** @hide */
 public class InternalHealthConnectMappings {
 
+    private final HealthConnectMappings mExternalMappings;
     private final Map<Integer, InternalDataTypeDescriptor> mRecordTypeIdToDescriptor;
     private final List<RecordHelper<?>> mAllRecordHelpers;
 
-    public InternalHealthConnectMappings() {
-        this(InternalDataTypeDescriptors.getAllInternalDataTypeDescriptors());
+    @SuppressWarnings("NullAway.Init") // TODO(b/317029272): fix this suppression
+    private static volatile InternalHealthConnectMappings sInternalHealthConnectMappings;
+
+    /** Exists for compatibility with classes which don't support injections yet. */
+    // TODO(b/353283052): inject where possible instead of using the singleton.
+    public static InternalHealthConnectMappings getInstance() {
+        if (sInternalHealthConnectMappings == null) {
+            sInternalHealthConnectMappings =
+                    new InternalHealthConnectMappings(HealthConnectMappings.getInstance());
+        }
+        return sInternalHealthConnectMappings;
+    }
+
+    /**
+     * Use {@link #getInstance()} to avoid creating multiple instances until it gets migrated off.
+     */
+    @VisibleForTesting
+    public InternalHealthConnectMappings(HealthConnectMappings healthConnectMappings) {
+        this(
+                InternalDataTypeDescriptors.getAllInternalDataTypeDescriptors(),
+                healthConnectMappings);
     }
 
     @VisibleForTesting
-    InternalHealthConnectMappings(List<InternalDataTypeDescriptor> descriptors) {
+    InternalHealthConnectMappings(
+            List<InternalDataTypeDescriptor> descriptors,
+            HealthConnectMappings healthConnectMappings) {
+        mExternalMappings = healthConnectMappings;
         mRecordTypeIdToDescriptor = new ArrayMap<>(descriptors.size());
         mAllRecordHelpers = new ArrayList<>(descriptors.size());
+
+        if (!Flags.healthConnectMappings()) {
+            return;
+        }
+
         for (var descriptor : descriptors) {
             mRecordTypeIdToDescriptor.put(descriptor.getRecordTypeIdentifier(), descriptor);
             mAllRecordHelpers.add(descriptor.getRecordHelper());
@@ -67,7 +102,7 @@
     /** Returns a collection of all supported record helpers. */
     public Collection<RecordHelper<?>> getRecordHelpers() {
         if (!Flags.healthConnectMappings()) {
-            return RecordHelperProvider.getRecordHelpers().values();
+            return RecordHelperProvider.getRecordHelpers();
         }
         return mAllRecordHelpers;
     }
@@ -89,6 +124,37 @@
         return getDescriptorFor(recordTypeId).getLoggingEnum();
     }
 
+    public HealthConnectMappings getExternalMappings() {
+        return mExternalMappings;
+    }
+
+    /** Returns true if given record type/aggregation operation type pair support priority. */
+    public boolean supportsPriority(
+            @RecordTypeIdentifier.RecordType int recordType,
+            @AggregationType.AggregateOperationType int operationType) {
+        if (!Flags.healthConnectMappings()) {
+            return StorageUtils.supportsPriority(recordType, operationType);
+        }
+
+        if (operationType != SUM) {
+            return false;
+        }
+
+        return switch (mExternalMappings.getRecordCategoryForRecordType(recordType)) {
+            case ACTIVITY, SLEEP, WELLNESS -> true;
+            default -> false;
+        };
+    }
+
+    /** Returns true if given record type is derived. */
+    public boolean isDerivedType(@RecordTypeIdentifier.RecordType int recordType) {
+        if (!Flags.healthConnectMappings()) {
+            return StorageUtils.isDerivedType(recordType);
+        }
+
+        return getDescriptorFor(recordType).isDerived();
+    }
+
     private InternalDataTypeDescriptor getDescriptorFor(
             @RecordTypeIdentifier.RecordType int recordTypeId) {
         return requireNonNull(
diff --git a/service/java/com/android/server/healthconnect/storage/utils/PreferencesManager.java b/service/java/com/android/server/healthconnect/storage/utils/PreferencesManager.java
new file mode 100644
index 0000000..b883c65
--- /dev/null
+++ b/service/java/com/android/server/healthconnect/storage/utils/PreferencesManager.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.utils;
+
+import android.annotation.Nullable;
+import android.health.connect.Constants;
+import android.util.Log;
+
+import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+
+import java.time.Instant;
+
+/**
+ * Manages entries in {@link PreferenceHelper} which do not belong to a specific class.
+ *
+ * @hide
+ */
+public class PreferencesManager {
+    private static final String TAG = "HCPreferencesManager";
+
+    private static final String AUTO_DELETE_DURATION_RECORDS_KEY =
+            "auto_delete_duration_records_key";
+
+    /**
+     * Key to store timestamp of the last time any PHR <b>read medical resources</b> API is called.
+     */
+    private static final String PREFS_KEY_PHR_LAST_READ_MEDICAL_RESOURCES_API =
+            "phr_last_read_medical_resources_api";
+
+    private final PreferenceHelper mPreferenceHelper;
+
+    public PreferencesManager(PreferenceHelper preferenceHelper) {
+        mPreferenceHelper = preferenceHelper;
+    }
+
+    /** Gets auto delete period for automatically deleting record entries */
+    public int getRecordRetentionPeriodInDays() {
+        String result = mPreferenceHelper.getPreference(AUTO_DELETE_DURATION_RECORDS_KEY);
+
+        if (result == null) return 0;
+        return Integer.parseInt(result);
+    }
+
+    /** Sets auto delete period for automatically deleting record entries */
+    public void setRecordRetentionPeriodInDays(int days) {
+        mPreferenceHelper.insertOrReplacePreference(
+                AUTO_DELETE_DURATION_RECORDS_KEY, String.valueOf(days));
+    }
+
+    /** Sets timestamp of the last time any PHR <b>read medical resources</b> API is called. */
+    public void setLastPhrReadMedicalResourcesApiTimeStamp(Instant instant) {
+        mPreferenceHelper.insertOrReplacePreference(
+                PREFS_KEY_PHR_LAST_READ_MEDICAL_RESOURCES_API,
+                String.valueOf(instant.toEpochMilli()));
+    }
+
+    /**
+     * Returns timestamp of the last time any PHR <b>read medical resources</b> API is called,
+     * <code>null</code> if it's not stored or the stored value is unfetchable for some reason.
+     */
+    @Nullable
+    public Instant getPhrLastReadMedicalResourcesApiTimeStamp() {
+        String epochMilliString =
+                mPreferenceHelper.getPreference(PREFS_KEY_PHR_LAST_READ_MEDICAL_RESOURCES_API);
+        if (epochMilliString == null) {
+            return null;
+        }
+        try {
+            long epochMilli = Long.parseLong(epochMilliString);
+            return Instant.ofEpochMilli(epochMilli);
+        } catch (Exception exception) {
+            if (Constants.DEBUG) {
+                Log.e(
+                        TAG,
+                        "Stored epoch milli for \""
+                                + PREFS_KEY_PHR_LAST_READ_MEDICAL_RESOURCES_API
+                                + "\" is corrupted, it cannot be converted to an Instant. Its"
+                                + "string value is: "
+                                + epochMilliString,
+                        exception);
+            }
+            return null;
+        }
+    }
+}
diff --git a/service/java/com/android/server/healthconnect/storage/utils/RecordHelperProvider.java b/service/java/com/android/server/healthconnect/storage/utils/RecordHelperProvider.java
index 5a2a353..351560c 100644
--- a/service/java/com/android/server/healthconnect/storage/utils/RecordHelperProvider.java
+++ b/service/java/com/android/server/healthconnect/storage/utils/RecordHelperProvider.java
@@ -64,12 +64,14 @@
 import com.android.server.healthconnect.storage.datatypehelpers.WeightRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.WheelchairPushesRecordHelper;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 
 /**
  * Store for all the record helpers
  *
+ * @deprecated Use {@link InternalHealthConnectMappings}.
  * @hide
  */
 public final class RecordHelperProvider {
@@ -181,10 +183,20 @@
     // Private constructor to prevent initialisation.
     private RecordHelperProvider() {}
 
-    public static Map<Integer, RecordHelper<?>> getRecordHelpers() {
-        return RECORD_ID_TO_HELPER_MAP;
+    /**
+     * Returns an immutable collection of all the record helpers.
+     *
+     * @deprecated Use {@link InternalHealthConnectMappings#getRecordHelpers()}
+     */
+    @Deprecated
+    public static Collection<RecordHelper<?>> getRecordHelpers() {
+        return RECORD_ID_TO_HELPER_MAP.values();
     }
 
+    /**
+     * @deprecated {@link InternalHealthConnectMappings#getRecordHelper(int)}
+     */
+    @Deprecated
     public static RecordHelper<?> getRecordHelper(int recordType) {
         return requireNonNull(RECORD_ID_TO_HELPER_MAP.get(recordType));
     }
diff --git a/service/java/com/android/server/healthconnect/storage/utils/RecordTypeForUuidMappings.java b/service/java/com/android/server/healthconnect/storage/utils/RecordTypeForUuidMappings.java
index 84d7b3c..c6802b6 100644
--- a/service/java/com/android/server/healthconnect/storage/utils/RecordTypeForUuidMappings.java
+++ b/service/java/com/android/server/healthconnect/storage/utils/RecordTypeForUuidMappings.java
@@ -121,7 +121,12 @@
 
     private RecordTypeForUuidMappings() {}
 
-    /** Maps the internal record type to a special record type for UUIDs. */
+    /**
+     * Maps the internal record type to a special record type for UUIDs.
+     *
+     * @deprecated Use {@link InternalHealthConnectMappings#getRecordTypeIdForUuid(int)}
+     */
+    @Deprecated
     public static int getRecordTypeIdForUuid(@RecordType int recordTypeId) {
         return requireNonNull(
                 sInternalTypeToSpecialTypeMap.get(recordTypeId),
diff --git a/service/java/com/android/server/healthconnect/storage/utils/RecordTypeIdForUuid.java b/service/java/com/android/server/healthconnect/storage/utils/RecordTypeIdForUuid.java
index 4a58b36..7124c86 100644
--- a/service/java/com/android/server/healthconnect/storage/utils/RecordTypeIdForUuid.java
+++ b/service/java/com/android/server/healthconnect/storage/utils/RecordTypeIdForUuid.java
@@ -69,6 +69,7 @@
     public static final int RECORD_TYPE_ID_FOR_UUID_SKIN_TEMPERATURE = 71;
     public static final int RECORD_TYPE_ID_FOR_UUID_PLANNED_EXERCISE_SESSION = 72;
     public static final int RECORD_TYPE_ID_FOR_UUID_MINDFULNESS_SESSION = 73;
+    public static final int RECORD_TYPE_ID_FOR_UUID_ACTIVITY_INTENSITY = 74;
 
     /** @hide */
     @IntDef({
@@ -114,6 +115,7 @@
         RECORD_TYPE_ID_FOR_UUID_VO2_MAX,
         RECORD_TYPE_ID_FOR_UUID_WEIGHT,
         RECORD_TYPE_ID_FOR_UUID_WHEELCHAIR_PUSHES,
+        RECORD_TYPE_ID_FOR_UUID_ACTIVITY_INTENSITY
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Type {}
diff --git a/service/java/com/android/server/healthconnect/storage/utils/SqlJoin.java b/service/java/com/android/server/healthconnect/storage/utils/SqlJoin.java
index 894f7a3..993b9c2 100644
--- a/service/java/com/android/server/healthconnect/storage/utils/SqlJoin.java
+++ b/service/java/com/android/server/healthconnect/storage/utils/SqlJoin.java
@@ -35,7 +35,7 @@
     public static final String SQL_JOIN_INNER = "INNER";
     public static final String SQL_JOIN_LEFT = "LEFT";
 
-    private static final String INNER_QUERY_ALIAS = "inner_query_result";
+    public static final String INNER_QUERY_ALIAS = "inner_query_result";
 
     /** @hide */
     @StringDef(
diff --git a/service/java/com/android/server/healthconnect/storage/utils/StorageUtils.java b/service/java/com/android/server/healthconnect/storage/utils/StorageUtils.java
index 36502ca..593db2a 100644
--- a/service/java/com/android/server/healthconnect/storage/utils/StorageUtils.java
+++ b/service/java/com/android/server/healthconnect/storage/utils/StorageUtils.java
@@ -30,24 +30,23 @@
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.CLIENT_RECORD_ID_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.PRIMARY_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.UUID_COLUMN_NAME;
-import static com.android.server.healthconnect.storage.utils.RecordTypeForUuidMappings.getRecordTypeIdForUuid;
 
 import static java.util.Objects.requireNonNull;
 
 import android.annotation.Nullable;
 import android.content.ContentValues;
 import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
 import android.health.connect.HealthDataCategory;
 import android.health.connect.RecordIdFilter;
 import android.health.connect.internal.datatypes.InstantRecordInternal;
 import android.health.connect.internal.datatypes.IntervalRecordInternal;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.health.connect.internal.datatypes.utils.RecordMapper;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
 import android.health.connect.internal.datatypes.utils.RecordTypeRecordCategoryMapper;
 import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.healthconnect.storage.HealthConnectDatabase;
 
 import java.nio.ByteBuffer;
 import java.time.ZoneOffset;
@@ -71,7 +70,6 @@
     public static final String TEXT_NULL = "TEXT";
     public static final String INTEGER = "INTEGER";
     public static final String INTEGER_UNIQUE = "INTEGER UNIQUE";
-    public static final String INTEGER_NOT_NULL_UNIQUE = "INTEGER NOT NULL UNIQUE";
     public static final String INTEGER_NOT_NULL = "INTEGER NOT NULL";
     public static final String REAL = "REAL";
     public static final String REAL_NOT_NULL = "REAL NOT NULL";
@@ -184,7 +182,7 @@
         return getUUID(
                 packageName,
                 clientRecordId,
-                RecordMapper.getInstance().getRecordType(recordIdFilter.getRecordType()));
+                HealthConnectMappings.getInstance().getRecordType(recordIdFilter.getRecordType()));
     }
 
     public static void addPackageNameTo(RecordInternal<?> recordInternal, String packageName) {
@@ -352,7 +350,9 @@
                                         + Integer.BYTES
                                         + clientRecordIdBytes.length)
                         .put(packageNameBytes)
-                        .putInt(getRecordTypeIdForUuid(recordTypeId))
+                        .putInt(
+                                InternalHealthConnectMappings.getInstance()
+                                        .getRecordTypeIdForUuid(recordTypeId))
                         .put(clientRecordIdBytes)
                         .array();
         return UUID.nameUUIDFromBytes(bytes);
@@ -361,7 +361,10 @@
     /**
      * Returns if priority of apps needs to be considered to compute the aggregate request for the
      * record type.
+     *
+     * @deprecated use {@link InternalHealthConnectMappings#supportsPriority(int, int)}
      */
+    @Deprecated
     public static boolean supportsPriority(int recordType, int operationType) {
         if (operationType != SUM) {
             return false;
@@ -373,7 +376,12 @@
         return recordCategory == ACTIVITY || recordCategory == SLEEP || recordCategory == WELLNESS;
     }
 
-    /** Returns if derivation needs to be done to calculate aggregate */
+    /**
+     * Returns if derivation needs to be done to calculate aggregate.
+     *
+     * @deprecated use {@link InternalHealthConnectMappings#isDerivedType(int)}
+     */
+    @Deprecated
     public static boolean isDerivedType(int recordType) {
         return recordType == RECORD_TYPE_BASAL_METABOLIC_RATE
                 || recordType == RECORD_TYPE_TOTAL_CALORIES_BURNED;
@@ -535,12 +543,12 @@
         return id;
     }
 
-    public static boolean checkTableExists(HealthConnectDatabase database, String tableName) {
+    /** Checks whether {@code tableName} exists in the {@code database}. */
+    public static boolean checkTableExists(SQLiteDatabase database, String tableName) {
         try (Cursor cursor =
-                database.getReadableDatabase()
-                        .rawQuery(
-                                "SELECT name FROM sqlite_master WHERE type='table' AND name=?",
-                                new String[] {tableName})) {
+                database.rawQuery(
+                        "SELECT name FROM sqlite_master WHERE type='table' AND name=?",
+                        new String[] {tableName})) {
             if (cursor.getCount() == 0) {
                 Slog.d(TAG, "Table does not exist: " + tableName);
             }
diff --git a/service/proto/backuprestore/Android.bp b/service/proto/backuprestore/Android.bp
new file mode 100644
index 0000000..1c1b5ef
--- /dev/null
+++ b/service/proto/backuprestore/Android.bp
@@ -0,0 +1,43 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This file contains the proto libraries, python script and genrule required for FHIR structural
+// validation of PHR medical data.
+// The python script generate_fhir_spec.py reads in the FHIR spec json files published by FHIR
+// (located in the android external folder). The official spec is then used to generate a fhirspec
+// proto message that is written to "fhirspec-r4.binarypb". This file is then added to
+// java_resources of the HC service to be used for the validation of incoming FHIR resources,
+// specifically in the FhirSpecProvider class.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+    default_team: "trendy_team_android_health",
+}
+
+java_library {
+    name: "backup-data-proto",
+    sdk_version: "core_current",
+    proto: {
+        type: "lite",
+        include_dirs: [
+            "external/protobuf/src",
+            "external/protobuf/java",
+        ],
+    },
+    srcs: [
+        "backup_data.proto",
+    ],
+    static_libs: ["libprotobuf-java-lite"],
+    apex_available: ["com.android.healthfitness"],
+}
diff --git a/service/proto/backuprestore/backup_data.proto b/service/proto/backuprestore/backup_data.proto
new file mode 100644
index 0000000..b59c211
--- /dev/null
+++ b/service/proto/backuprestore/backup_data.proto
@@ -0,0 +1,502 @@
+syntax = "proto3";
+
+package com.android.server.healthconnect.proto.backuprestore;
+
+option java_multiple_files = true;
+
+message BackupData {
+  Record record = 1;
+}
+
+message Record {
+  string uuid = 1;
+  optional string package_name = 2;
+  optional string app_name = 3;
+  int64 last_modified_time = 4;
+  optional string client_record_id = 5;
+  int64 client_record_version = 6;
+  optional string manufacturer = 7;
+  optional string model = 8;
+  int32 device_type = 9;
+  int32 recording_method = 10;
+
+  oneof SubRecord {
+    IntervalRecord interval_record = 100;
+    InstantRecord instant_record = 101;
+  }
+}
+
+message IntervalRecord {
+  int64 start_time = 1;
+  int32 start_zone_offset = 2;
+  int64 end_time = 3;
+  int32 end_zone_offset = 4;
+
+  oneof Data {
+    ActiveCaloriesBurned active_calories_burned = 101;
+    ActivityIntensity activity_intensity = 102;
+    CyclingPedalingCadence cycling_pedaling_cadence = 103;
+    Distance distance = 104;
+    ElevationGained elevation_gained = 105;
+    ExerciseSession exercise_session = 106;
+    FloorsClimbed floors_climbed = 107;
+    HeartRate heart_rate = 108;
+    Hydration hydration = 109;
+    MenstruationPeriod menstruation_period = 110;
+    MindfulnessSession mindfulness_session = 111;
+    Nutrition nutrition = 112;
+    PlannedExerciseSession planned_exercise_session = 113;
+    Power power = 114;
+    SkinTemperature skin_temperature = 115;
+    SleepSession sleep_session = 116;
+    Speed speed = 117;
+    Steps steps = 100;
+    StepsCadence steps_cadence = 118;
+    TotalCaloriesBurned total_calories_burned = 119;
+    WheelchairPushes wheelchair_pushes = 120;
+  }
+}
+
+message InstantRecord {
+  int64 time = 1;
+  int32 zone_offset = 2;
+
+  oneof Data {
+    BasalBodyTemperature basal_body_temperature = 101;
+    BasalMetabolicRate basal_metabolic_rate = 102;
+    BloodGlucose blood_glucose = 103;
+    BloodPressure blood_pressure = 100;
+    BodyFat body_fat = 104;
+    BodyTemperature body_temperature = 105;
+    BodyWaterMass body_water_mass = 106;
+    BoneMass bone_mass = 107;
+    CervicalMucus cervical_mucus = 108;
+    HeartRateVariabilityRmssd heart_rate_variability_rmssd = 109;
+    Height height = 110;
+    IntermenstrualBleeding intermenstrual_bleeding = 111;
+    LeanBodyMass lean_body_mass = 112;
+    MenstruationFlow menstruation_flow = 113;
+    OvulationTest ovulation_test = 114;
+    OxygenSaturation oxygen_saturation = 115;
+    RespiratoryRate respiratory_rate = 116;
+    RestingHeartRate resting_heart_rate = 117;
+    SexualActivity sexual_activity = 118;
+    Vo2Max vo2_max = 119;
+    Weight weight = 120;
+  }
+}
+
+message ActiveCaloriesBurned {
+  double energy = 1;
+}
+
+message ActivityIntensity {
+  int32 activity_intensity_type = 1;
+}
+
+message BasalBodyTemperature {
+  int32 measurement_location = 1;
+  double temperature = 2;
+}
+
+message BasalMetabolicRate {
+  double basal_metabolic_rate = 1;
+}
+
+message BloodGlucose {
+  int32 specimen_source = 1;
+  double level = 2;
+  int32 relation_to_meal = 3;
+  int32 meal_type = 4;
+}
+
+message BloodPressure {
+  int32 measurement_location = 1;
+  double systolic = 2;
+  double diastolic = 3;
+  int32 body_position = 4;
+}
+
+message BodyFat {
+  double percentage = 1;
+}
+
+message BodyTemperature {
+  int32 measurement_location = 1;
+  double temperature = 2;
+}
+
+message BodyWaterMass {
+  double body_water_mass = 1;
+}
+
+message BoneMass {
+  double mass = 1;
+}
+
+message CervicalMucus {
+  int32 sensation = 1;
+  int32 appearance = 2;
+}
+
+message CyclingPedalingCadence {
+  repeated CyclingPedalingCadenceSample sample = 1;
+
+  message CyclingPedalingCadenceSample {
+    double revolutions_per_minute = 1;
+    int64 epoch_millis = 2;
+  }
+}
+
+message Distance {
+  double distance = 1;
+}
+
+message ElevationGained {
+  double elevation = 1;
+}
+
+message ExerciseSession {
+  optional string notes = 1;
+  int32 exercise_type = 2;
+  optional string title = 3;
+  bool has_route = 4;
+  optional ExerciseRoute route = 5;
+  repeated ExerciseLap lap = 6;
+  repeated ExerciseSegment segment = 7;
+  optional string planned_exercise_session_id = 8;
+
+  message ExerciseRoute {
+    repeated Location route_location = 1;
+
+    message Location {
+      int64 time = 1;
+      double latitude = 2;
+      double longitude = 3;
+      double horizontal_accuracy = 4;
+      double vertical_accuracy = 5;
+      double altitude = 6;
+    }
+  }
+
+  message ExerciseLap {
+    int64 start_time = 1;
+    int64 end_time = 2;
+    double length = 3;
+  }
+
+  message ExerciseSegment {
+    int64 start_time = 1;
+    int64 end_time = 2;
+    int32 segment_type = 3;
+    int32 repetitions_count = 4;
+  }
+}
+
+message FloorsClimbed {
+  double floors = 1;
+}
+
+message HeartRate {
+  repeated HeartRateSample sample = 1;
+
+  message HeartRateSample {
+    int32 beats_per_minute = 1;
+    int64 epoch_millis = 2;
+  }
+}
+
+message HeartRateVariabilityRmssd {
+  double heart_rate_variability_millis = 1;
+}
+
+message Height {
+  double height = 1;
+}
+
+message Hydration {
+  double volume = 1;
+}
+
+message IntermenstrualBleeding {
+  // This record type contains no data.
+}
+
+message LeanBodyMass {
+  double mass = 1;
+}
+
+message MenstruationFlow {
+  int32 flow = 1;
+}
+
+message MenstruationPeriod {
+  // This record type contains no data.
+}
+
+message MindfulnessSession {
+  int32 mindfulness_session_type = 1;
+  optional string title = 2;
+  optional string notes = 3;
+}
+
+message Nutrition {
+  double unsaturated_fat = 1;
+  double potassium = 2;
+  double thiamin = 3;
+  int32 meal_type = 4;
+  double trans_fat = 5;
+  double manganese = 6;
+  double energy_from_fat = 7;
+  double caffeine = 8;
+  double dietary_fiber = 9;
+  double selenium = 10;
+  double vitamin_b6 = 11;
+  double protein = 12;
+  double chloride = 13;
+  double cholesterol = 14;
+  double copper = 15;
+  double iodine = 16;
+  double vitamin_b12 = 17;
+  double zinc = 18;
+  double riboflavin = 19;
+  double energy = 20;
+  double molybdenum = 21;
+  double phosphorus = 22;
+  double chromium = 23;
+  double total_fat = 24;
+  double calcium = 25;
+  double vitamin_c = 26;
+  double vitamin_e = 27;
+  double biotin = 28;
+  double vitamin_d = 29;
+  double niacin = 30;
+  double magnesium = 31;
+  double total_carbohydrate = 32;
+  double vitamin_k = 33;
+  double polyunsaturated_fat = 34;
+  double saturated_fat = 35;
+  double sodium = 36;
+  double folate = 37;
+  double monounsaturated_fat = 38;
+  double pantothenic_acid = 39;
+  optional string meal_name = 40;
+  double iron = 41;
+  double vitamin_a = 42;
+  double folic_acid = 43;
+  double sugar = 44;
+}
+
+message OvulationTest {
+  int32 result = 1;
+}
+
+message OxygenSaturation {
+  double percentage = 1;
+}
+
+message PlannedExerciseSession {
+  optional string notes = 1;
+  int32 exercise_type = 2;
+  optional string title = 3;
+  bool has_explicit_time = 4;
+  repeated PlannedExerciseBlock exercise_block = 5;
+  optional string completed_exercise_session_id = 6;
+
+  message PlannedExerciseBlock {
+    int32 repetitions = 1;
+    optional string description = 2;
+    repeated PlannedExerciseStep step = 3;
+
+    message PlannedExerciseStep {
+      int32 exercise_type = 1;
+      int32 exercise_category = 2;
+      optional string description = 3;
+      ExerciseCompletionGoal completion_goal = 4;
+      repeated ExercisePerformanceGoal performance_goal = 5;
+
+      message ExerciseCompletionGoal {
+        oneof goal {
+          DistanceGoal distance_goal = 1;
+          StepsGoal steps_goal = 2;
+          DurationGoal duration_goal = 3;
+          RepetitionsGoal repetitions_goal = 4;
+          TotalCaloriesBurnedGoal total_calories_burned_goal = 5;
+          ActiveCaloriesBurnedGoal active_calories_burned_goal = 6;
+          DistanceWithVariableRestGoal distance_with_variable_rest_goal = 7;
+          UnspecifiedGoal unspecified_goal = 8;
+          UnknownGoal unknown_goal = 9;
+        }
+
+        message DistanceGoal {
+          double distance = 1;
+        }
+
+        message StepsGoal {
+          int32 steps = 1;
+        }
+
+        message DurationGoal {
+          int64 duration = 1;
+        }
+
+        message RepetitionsGoal {
+          int32 repetitions = 1;
+        }
+
+        message TotalCaloriesBurnedGoal {
+          double total_calories = 1;
+        }
+
+        message ActiveCaloriesBurnedGoal {
+          double active_calories = 1;
+        }
+
+        message DistanceWithVariableRestGoal {
+          double distance = 1;
+          int64 duration = 2;
+        }
+
+        message UnspecifiedGoal {
+          // No fields to write.
+        }
+
+        message UnknownGoal {
+          // No fields to write.
+        }
+      }
+
+      message ExercisePerformanceGoal {
+        oneof goal {
+          PowerGoal power_goal = 1;
+          SpeedGoal speed_goal = 2;
+          CadenceGoal cadence_goal = 3;
+          HeartRateGoal heart_rate_goal = 4;
+          WeightGoal weight_goal = 5;
+          RateOfPerceivedExertionGoal rate_of_perceived_exertion_goal = 6;
+          AmrapGoal amrap_goal = 7;
+          UnknownGoal unknown_goal = 8;
+        }
+
+        message PowerGoal {
+          double min_power = 1;
+          double max_power = 2;
+        }
+
+        message SpeedGoal {
+          double min_speed = 1;
+          double max_speed = 2;
+        }
+
+        message CadenceGoal {
+          double min_rpm = 1;
+          double max_rpm = 2;
+        }
+
+        message HeartRateGoal {
+          int32 min_bpm = 1;
+          int32 max_bpm = 2;
+        }
+
+        message WeightGoal {
+          double mass = 1;
+        }
+
+        message RateOfPerceivedExertionGoal {
+          int32 rpe = 1;
+        }
+
+        message AmrapGoal {
+          // No fields to write.
+        }
+        message UnknownGoal {
+          // No fields to write.
+        }
+      }
+    }
+  }
+}
+
+message Power {
+  repeated PowerSample sample = 1;
+
+  message PowerSample {
+    double power = 1;
+    int64 epoch_millis = 2;
+  }
+}
+
+message RespiratoryRate {
+  double rate = 1;
+}
+
+message RestingHeartRate {
+  int32 beats_per_minute = 1;
+}
+
+message SexualActivity {
+  int32 protection_used = 1;
+}
+
+message SkinTemperature {
+  int32 measurement_location = 1;
+  double baseline = 2;
+  repeated SkinTemperatureDeltaSample sample = 3;
+
+  message SkinTemperatureDeltaSample {
+    double temperature_delta_in_celsius = 1;
+    int64 epoch_millis = 2;
+  }
+}
+
+message SleepSession {
+  optional string notes = 1;
+  optional string title = 2;
+  repeated SleepStage stage = 3;
+
+  message SleepStage {
+    int64 start_time = 1;
+    int64 end_time = 2;
+    int32 stage_type = 3;
+
+  }
+}
+
+message Speed {
+  repeated SpeedSample sample = 1;
+
+  message SpeedSample {
+    double speed = 1;
+    int64 epoch_millis = 2;
+  }
+}
+
+message Steps {
+  int32 count = 1;
+}
+
+message StepsCadence {
+  repeated StepsCadenceSample sample = 1;
+
+  message StepsCadenceSample {
+    double rate = 1;
+    int64 epoch_millis = 2;
+  }
+}
+
+message TotalCaloriesBurned {
+  double energy = 1;
+}
+
+message Vo2Max {
+  int32 measurement_method = 1;
+  double vo2_milliliters_per_minute_kilogram = 2;
+}
+
+message Weight {
+  double weight = 1;
+}
+
+message WheelchairPushes {
+  int32 count = 1;
+}
diff --git a/service/proto/phr/Android.bp b/service/proto/phr/Android.bp
new file mode 100644
index 0000000..195a3f8
--- /dev/null
+++ b/service/proto/phr/Android.bp
@@ -0,0 +1,117 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This file contains the proto libraries, python script and genrule required for FHIR structural
+// validation of PHR medical data.
+// The python script generate_fhir_spec.py reads in the FHIR spec json files published by FHIR
+// (located in the android external folder). The official spec is then used to generate a fhirspec
+// proto message that is written to "fhirspec-r4.binarypb". This file is then added to
+// java_resources of the HC service to be used for the validation of incoming FHIR resources,
+// specifically in the FhirSpecProvider class.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+    default_team: "trendy_team_android_health",
+}
+
+filegroup {
+    name: "fhirspec-proto",
+    srcs: [
+        "*.proto",
+    ],
+}
+
+// Generate the java fhirspec proto library, used for capturing FHIR spec details for validation
+java_library {
+    name: "fhirspec-java-proto-lite",
+    sdk_version: "core_current",
+    proto: {
+        type: "lite",
+        include_dirs: [
+            "external/protobuf/src",
+            "external/protobuf/java",
+        ],
+    },
+    srcs: [
+        ":fhirspec-proto",
+        ":libprotobuf-internal-protos",
+    ],
+    static_libs: ["libprotobuf-java-lite"],
+    apex_available: ["com.android.healthfitness"],
+}
+
+// Generate the python fhirspec proto library, used for capturing FHIR spec details for validation
+python_library_host {
+    name: "fhirspec-py-proto",
+    srcs: [
+        "fhirspec.proto",
+    ],
+    proto: {
+        canonical_path_from_root: false,
+    },
+}
+
+python_library_host {
+    name: "fhir-spec-extractor",
+    srcs: [
+        "fhir_spec_extractor.py",
+    ],
+    libs: [
+        "fhirspec-py-proto",
+    ],
+}
+
+python_test_host {
+    name: "fhir-spec-extractor-test",
+    main: "fhir_spec_extractor_test.py",
+    srcs: [
+        "fhir_spec_extractor_test.py",
+    ],
+    libs: [
+        "fhirspec-py-proto",
+        "fhir-spec-extractor",
+    ],
+    test_options: {
+        unit_test: true,
+    },
+    version: {
+        py3: {
+            embedded_launcher: true,
+        },
+    },
+}
+
+// Python script for generating a FhirResourceSpec proto message based on fhir spec json files
+python_binary_host {
+    name: "generate-fhir-spec",
+    main: "generate_fhir_spec.py",
+    srcs: [
+        "generate_fhir_spec.py",
+    ],
+    libs: [
+        "fhirspec-py-proto",
+        "fhir-spec-extractor",
+    ],
+}
+
+// Genrule that runs generate_fhir_spec.py to generate a FhirResourceSpec proto binary file
+genrule {
+    name: "generate-fhir-spec-r4-binarypb",
+    srcs: [
+        "//external/fhir/spec/r4:resource-definitions",
+    ],
+    tools: ["generate-fhir-spec"],
+    cmd: "$(location generate-fhir-spec) $(out) $(in)",
+    out: ["fhirspec-r4.binarypb"],
+}
diff --git a/service/proto/phr/fhir_spec_extractor.py b/service/proto/phr/fhir_spec_extractor.py
new file mode 100644
index 0000000..503c8f1
--- /dev/null
+++ b/service/proto/phr/fhir_spec_extractor.py
@@ -0,0 +1,317 @@
+import fhirspec_pb2
+from typing import Collection, Mapping
+
+# LINT.IfChange(fhir_resource_type_mapping)
+RESOURCE_TYPE_STRING_TO_HC_INT_MAPPING = {
+    "Immunization": 1,
+    "AllergyIntolerance": 2,
+    "Observation": 3,
+    "Condition": 4,
+    "Procedure": 5,
+    "Medication": 6,
+    "MedicationRequest": 7,
+    "MedicationStatement": 8,
+    "Patient": 9,
+    "Practitioner": 10,
+    "PractitionerRole": 11,
+    "Encounter": 12,
+    "Location": 13,
+    "Organization": 14,
+}
+# LINT.ThenChange(/framework/java/android/health/connect/datatypes/FhirResource.java)
+
+HC_SUPPORTED_RESOURCE_SET = set(RESOURCE_TYPE_STRING_TO_HC_INT_MAPPING.keys())
+
+FHIR_VERSION_R4 = "4.0.1"
+
+
+class FhirSpecExtractor:
+    """Extractor for getting information for HC FHIR validation from official FHIR spec json files.
+
+    Typical usage example:
+        extractor = new FhirSpecExtractor(profile_resources_json, {"Immunization", "Observation"})
+        fhir_spec_message = extractor.generate_r4_fhir_spec_proto_message()
+    """
+
+    def __init__(self, profile_resources_json: Mapping, resource_names: set[str]):
+        """Extracts StructureDefinitions for the requested resources from the provided fhir spec.
+
+        Args:
+            profile_resources_json: The contents of the profile-resources.json fhir spec file, which
+            is in the structure of a https://hl7.org/fhir/Bundle.html, parsed to dict. The
+            Bundle.entry will contain the list of https://hl7.org/fhir/StructureDefinition.html that
+            we are interested in.
+            resource_names: The set of FHIR resources to extract FHIR spec information for.
+
+        Raises:
+            ValueError: If a requested resource is not present in the spec, if it's not supported by
+            Health Connect, or if any spec values are not as expected.
+        """
+        if not resource_names.issubset(HC_SUPPORTED_RESOURCE_SET):
+            raise ValueError("Provided resource set was not a subset of supported resources")
+
+        # A mapping from the resource name to the list of field definitions, which are in the
+        # structure of https://hl7.org/fhir/ElementDefinition.html
+        self._resource_to_element_definitions = (
+            self._extract_element_definitions_by_resource_from_spec(
+                profile_resources_json, resource_names))
+
+    def generate_r4_fhir_spec_proto_message(self) -> fhirspec_pb2.FhirResourceSpec:
+        """Generates a FhirResourceSpec message from the fhir json spec.
+
+        Returns:
+            The FhirResourceSpec message, with an entry for each requested resource.
+        """
+        # TODO: b/360091651 - Extract additional information such as field types, cardinality and
+        #  structure of each type. Note that the field "Observation.component.referenceRange" will
+        #  need special handling. It doesn't have a type, but a contentReference to
+        #  "Observation.referenceRange" and should use that type's structure.
+
+        r4_resource_spec = fhirspec_pb2.FhirResourceSpec()
+
+        for resource, element_definitions in self._resource_to_element_definitions.items():
+            resource_type_int = RESOURCE_TYPE_STRING_TO_HC_INT_MAPPING[resource]
+
+            resource_data_type_config = (
+                self._generate_fhir_data_type_config_from_element_definitions(element_definitions))
+
+            r4_resource_spec.resource_type_to_config[
+                resource_type_int].CopyFrom(resource_data_type_config)
+
+        return r4_resource_spec
+
+    def _extract_element_definitions_by_resource_from_spec(
+            self, profile_resources_json: Mapping, resource_names: set[str]) -> Mapping:
+        resource_to_element_definitions = {}
+        # For each StructureDefinition that matches a resource in resource_names, we extract
+        # the list of ElementDefinitions. Each ElementDefinition contains the spec for a path /
+        # field of the resource.
+        for entry in profile_resources_json["entry"]:
+            fullUrl = entry["fullUrl"]
+            if not (fullUrl.startswith("http://hl7.org/fhir/StructureDefinition/") and
+                    fullUrl.split("/")[-1] in resource_names):
+                continue
+
+            resource_name = fullUrl.split("/")[-1]
+            resource_structure_definition = entry["resource"]
+
+            # Do some assertions on expected values
+            if resource_structure_definition["fhirVersion"] != FHIR_VERSION_R4:
+                raise ValueError("Unexpected fhir version found")
+            if resource_structure_definition["kind"] != "resource":
+                raise ValueError("Unexpected kind field in structure definition")
+            if resource_structure_definition["type"] != resource_name:
+                raise ValueError("Unexpected resource type in structure definition")
+
+            # We select the list of elements in "snapshot" (as opposed to "differential"), as we
+            # want the full definition of fields, including fields from any base definitions.
+            resource_to_element_definitions[resource_name] = (
+                resource_structure_definition)["snapshot"]["element"]
+
+        if set(resource_to_element_definitions.keys()) != resource_names:
+            raise ValueError("Did not find resource definitions for all requested resources.")
+
+        return resource_to_element_definitions
+
+    def _generate_fhir_data_type_config_from_element_definitions(
+            self, element_definitions: Collection[Mapping]) -> fhirspec_pb2.FhirDataTypeConfig:
+        required_fields = set()
+
+        multi_type_configs = []
+
+        field_configs_by_name = {}
+        # Manually add resourceType field, as this is not present in the spec
+        field_configs_by_name["resourceType"] = fhirspec_pb2.FhirFieldConfig(
+            is_array=False,
+            r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_STRING,
+            kind=fhirspec_pb2.Kind.KIND_PRIMITIVE_TYPE
+        )
+
+        for element in element_definitions:
+            field_id = element["id"]
+            if field_id != element["path"]:
+                raise ValueError("Expected id and path field to be the same")
+            field_parts = field_id.split(".")
+            field_parts_length = len(field_parts)
+
+            if field_parts_length == 1:
+                # This is the path to the element itself. For example for the Observation resource,
+                # There will be an ElementDefinition with id "Observation"
+                continue
+
+            elif field_parts_length == 2:
+                # This is a "regular" nested field, e.g. Immunization.status, so we extract the
+                # field configs
+                field_name = field_parts[1]
+                field_configs_to_add, multi_type_config = (
+                    self._generate_field_configs_and_multi_type_config_from_field_element(
+                    element, field_name))
+                for name in field_configs_to_add:
+                    if name in field_configs_by_name: raise ValueError("Field name already exists")
+
+                field_configs_by_name.update(field_configs_to_add)
+                if self.field_name_is_multi_type_field(field_name):
+                    multi_type_configs.append(multi_type_config)
+                elif self._field_is_required(element):
+                    required_fields.add(field_name)
+
+            elif field_parts_length > 2:
+                # This means the field is part of a BackBoneElement. For an example see the
+                # https://hl7.org/fhir/Immunization.html "reaction" field.
+                # BackBoneElements need to be handled separately, as those fields don't have a type
+                # defined, but have the BackBoneElement definition instead.
+                # Note that the following field contains a double backbone element, which we need to
+                # consider: "MedicationRequest.dispenseRequest.initialFill",
+
+                # For now we are just recording the top level allowed field, which has its own
+                # element definition, so is covered by the "elif field_parts_length == 2" above
+                continue
+
+            else:
+                raise ValueError("This should not happen")
+
+        return fhirspec_pb2.FhirDataTypeConfig(
+            allowed_field_names_to_config=field_configs_by_name,
+            # Sort the list of required fields alphabetically, as the output of this script is part
+            # of the build, which needs to be deterministic. The required_fields come from a set,
+            # which does not have ordering guarantees.
+            required_fields=sorted(required_fields),
+            multi_type_fields=multi_type_configs
+        )
+
+    def _generate_field_configs_and_multi_type_config_from_field_element(
+            self, element_definition, field_name) -> (Mapping[str, fhirspec_pb2.FhirFieldConfig],
+                                                      list[fhirspec_pb2.MultiTypeFieldConfig]):
+        field_is_array = self._field_is_array(element_definition)
+
+        field_configs_by_name = {}
+
+        multi_type_config = None
+
+        # If the field is a multi type field, it means one of several types can be set. An example
+        # is the field Immunization.occurrence, which has types "string" and "dateTime" and
+        # therefore means the fields "occurrenceString" and "occurrenceDateTime" are allowed. We
+        # therefore expand the field name with each defined type.
+        if self.field_name_is_multi_type_field(field_name):
+            if field_is_array:
+                raise ValueError(
+                    "Unexpected cardinality for type choice field. Did not expect array.")
+
+            multi_type_fields = []
+            for data_type in element_definition["type"]:
+                field_with_type = self._get_multi_type_name_for_type(field_name, data_type["code"])
+                type_enum, kind_enum = self._get_type_and_kind_enum_from_type(data_type["code"])
+                field_configs_by_name[field_with_type] = fhirspec_pb2.FhirFieldConfig(
+                    is_array=False,
+                    r4_type=type_enum,
+                    kind=kind_enum
+                )
+                multi_type_fields.append(field_with_type)
+
+            multi_type_config = fhirspec_pb2.MultiTypeFieldConfig(
+                name=field_name,
+                typed_field_names=multi_type_fields,
+                is_required=self._field_is_required(element_definition)
+            )
+
+        else:
+            if len(element_definition["type"]) != 1:
+                raise ValueError("Expected exactly one type")
+            type_code = element_definition["type"][0]["code"]
+            type_enum, kind_enum = self._get_type_and_kind_enum_from_type(type_code)
+            field_configs_by_name[field_name] = fhirspec_pb2.FhirFieldConfig(
+                is_array=field_is_array,
+                r4_type=type_enum,
+                kind=kind_enum
+            )
+
+        return field_configs_by_name, multi_type_config
+
+    def field_name_is_multi_type_field(self, field_name) -> bool:
+        """Returns true if the field is a oneof / type choice field, which can be contains several
+        data types.
+
+        This is the case if the field name ends with "[x]" and means that one of several types can
+        be set.
+        """
+
+        return field_name.endswith("[x]")
+
+    def _get_multi_type_name_for_type(self, field_name, type_code) -> bool:
+        """Returns the one of field name for a specific type.
+
+        For example for the field name "occurrence[x]" and type "dateTime" this will return
+        "occurrenceDateTime".
+        """
+
+        return field_name[:-3] + type_code[0].upper() + type_code[1:]
+
+    def _field_is_required(self, element_definition) -> bool:
+        """Returns true if the field is required
+
+        FHIR fields can have the following cardinalities:
+        - 0..1, meaning the field is optional
+        - 1..1, meaning the field is required
+        - 0..*, meaning the field is an optional array
+        - 1..*, meaning the field is a required array
+        """
+
+        min = element_definition["min"]
+
+        if min not in [0, 1]:
+            raise ValueError("Unexpected min cardinality value: " + min)
+
+        return min
+
+    def _field_is_array(self, element_definition) -> bool:
+        """Returns true if the field should be an array
+
+        FHIR fields can have the following cardinalities:
+        - 0..1, meaning the field is optional
+        - 1..1, meaning the field is required
+        - 0..*, meaning the field is an optional array
+        - 1..*, meaning the field is a required array
+        """
+
+        max = element_definition["max"]
+
+        if max == "1":
+            return False
+        elif max == "*":
+            return True
+        else:
+            raise ValueError("Unexpected max cardinality value: " + max)
+
+    def _get_type_and_kind_enum_from_type(self, type_code: str):
+        # "id" fields usually have a type containing the following type code and extension
+        # https://hl7.org/fhir/extensions/StructureDefinition-structuredefinition-fhir-type.html
+        if type_code == "http://hl7.org/fhirpath/System.String":
+            return (fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_SYSTEM_STRING,
+                    fhirspec_pb2.Kind.KIND_PRIMITIVE_TYPE)
+
+        data_type = fhirspec_pb2.R4FhirType.Value(
+            self._convert_type_string_to_enum_string(type_code))
+        kind = fhirspec_pb2.Kind.KIND_PRIMITIVE_TYPE \
+            if self._is_primitive_type(type_code) else fhirspec_pb2.Kind.KIND_COMPLEX_TYPE
+
+        return data_type, kind
+
+    def _convert_type_string_to_enum_string(self, type_string: str) -> str:
+        if not type_string.isalpha():
+            raise ValueError("Unexpected characters found in type_string: " + type_string)
+
+        # TODO: b/361775175 - Extract all fhir types individually instead of combining non-primitive
+        #  types to COMPLEX enum value.
+        if not self._is_primitive_type(type_string):
+            return "R4_FHIR_TYPE_COMPLEX"
+
+        snake_case_type_string = type_string[0].upper() + "".join(
+            [c if c.islower() else "_" + c for c in type_string[1:]])
+
+        return "R4_FHIR_TYPE_" + snake_case_type_string.upper()
+
+    def _is_primitive_type(self, type_string: str) -> bool:
+        # See https://hl7.org/fhir/R4/datatypes.html for possible types.
+        # TODO: b/361775175 - Read this from the type definitions file instead of inferring from the
+        #  name
+        return type_string[0].islower() and type_string != "xhtml"
diff --git a/service/proto/phr/fhir_spec_extractor_test.py b/service/proto/phr/fhir_spec_extractor_test.py
new file mode 100644
index 0000000..6ec4ca8
--- /dev/null
+++ b/service/proto/phr/fhir_spec_extractor_test.py
@@ -0,0 +1,320 @@
+import unittest
+import json
+import fhirspec_pb2
+from fhir_spec_extractor import FhirSpecExtractor
+from google.protobuf import text_format
+
+
+class FhirSpecExtractorTest(unittest.TestCase):
+    BUNDLE_WITH_IMMUNIZATION_AND_PATIENT_STRUCTURE_DEFINITION = json.loads("""
+    {
+        "resourceType" : "Bundle",
+        "id" : "resources",
+        "meta" : {
+          "lastUpdated" : "2019-11-01T09:29:23.356+11:00"
+        },
+        "type" : "collection",
+        "entry" : [
+          {
+            "fullUrl" : "http://hl7.org/fhir/CompartmentDefinition/relatedPerson"
+          },
+          {
+            "fullUrl" : "http://hl7.org/fhir/StructureDefinition/Immunization",
+            "resource" : {
+              "resourceType" : "StructureDefinition",
+              "id" : "Immunization",
+              "meta" : {
+                "lastUpdated" : "2019-11-01T09:29:23.356+11:00"
+              },
+              "fhirVersion" : "4.0.1",
+              "kind" : "resource",
+              "type" : "Immunization",
+              "baseDefinition" : "http://hl7.org/fhir/StructureDefinition/DomainResource",
+              "snapshot" : {
+                "element" : [{
+                  "id" : "Immunization",
+                  "path" : "Immunization",
+                  "min" : 0,
+                  "max" : "*",
+                  "base" : {
+                    "path" : "Immunization",
+                    "min" : 0,
+                    "max" : "*"
+                  }
+                },
+                {
+                  "id" : "Immunization.id",
+                  "path" : "Immunization.id",
+                  "min" : 0,
+                  "max" : "1",
+                  "base" : {
+                    "path" : "Resource.id",
+                    "min" : 0,
+                    "max" : "1"
+                  },
+                  "type" : [{
+                    "extension" : [{
+                      "url" : "http://hl7.org/fhir/StructureDefinition/structuredefinition-fhir-type",
+                      "valueUrl" : "string"
+                    }],
+                    "code" : "http://hl7.org/fhirpath/System.String"
+                  }]
+                },
+                {
+                  "id" : "Immunization.status",
+                  "path" : "Immunization.status",
+                  "min" : 1,
+                  "max" : "1",
+                  "base" : {
+                    "path" : "Immunization.status",
+                    "min" : 1,
+                    "max" : "1"
+                  },
+                  "type" : [{
+                    "code" : "code"
+                  }]
+                },
+                {
+                  "id" : "Immunization.vaccineCode",
+                  "path" : "Immunization.vaccineCode",
+                  "min" : 1,
+                  "max" : "1",
+                  "base" : {
+                    "path" : "Immunization.vaccineCode",
+                    "min" : 1,
+                    "max" : "1"
+                  },
+                  "type" : [{
+                    "code" : "CodeableConcept"
+                  }]
+                },
+                {
+                  "id" : "Immunization.exampleFieldToTestOneToMany",
+                  "path" : "Immunization.exampleFieldToTestOneToMany",
+                  "min" : 1,
+                  "max" : "*",
+                  "base" : {
+                    "path" : "Immunization.exampleFieldToTestOneToMany",
+                    "min" : 1,
+                    "max" : "*"
+                  },
+                  "type" : [{
+                    "code" : "CodeableConcept"
+                  }]
+                },
+                {
+                  "id" : "Immunization.occurrence[x]",
+                  "path" : "Immunization.occurrence[x]",
+                  "min" : 1,
+                  "max" : "1",
+                  "base" : {
+                    "path" : "Immunization.occurrence[x]",
+                    "min" : 1,
+                    "max" : "1"
+                  },
+                  "type" : [{
+                    "code" : "dateTime"
+                  },
+                  {
+                    "code" : "string"
+                  }]
+                },
+                {
+                  "id" : "Immunization.performer",
+                  "path" : "Immunization.performer",
+                  "min" : 0,
+                  "max" : "*",
+                  "base" : {
+                    "path" : "Immunization.performer",
+                    "min" : 0,
+                    "max" : "*"
+                  },
+                  "type" : [{
+                    "code" : "BackboneElement"
+                  }]
+                },
+                {
+                  "id" : "Immunization.performer.id",
+                  "path" : "Immunization.performer.id",
+                  "min" : 0,
+                  "max" : "1",
+                  "base" : {
+                    "path" : "Element.id",
+                    "min" : 0,
+                    "max" : "1"
+                  },
+                  "type" : [{
+                    "extension" : [{
+                      "url" : "http://hl7.org/fhir/StructureDefinition/structuredefinition-fhir-type",
+                      "valueUrl" : "string"
+                    }],
+                    "code" : "http://hl7.org/fhirpath/System.String"
+                  }]
+                },
+                {
+                  "id" : "Immunization.performer.extension",
+                  "path" : "Immunization.performer.extension",
+                  "min" : 0,
+                  "max" : "*",
+                  "base" : {
+                    "path" : "Element.extension",
+                    "min" : 0,
+                    "max" : "*"
+                  },
+                  "type" : [{
+                    "code" : "Extension"
+                  }]
+                }
+              ]
+              }
+            }
+          },
+          {
+            "fullUrl" : "http://hl7.org/fhir/StructureDefinition/Patient",
+            "resource" : {
+              "resourceType" : "StructureDefinition",
+              "id" : "Patient",
+              "meta" : {
+                "lastUpdated" : "2019-11-01T09:29:23.356+11:00"
+              },
+              "url" : "http://hl7.org/fhir/StructureDefinition/Patient",
+              "fhirVersion" : "4.0.1",
+              "kind" : "resource",
+              "type" : "Patient",
+              "snapshot" : {
+                "element" : [{
+                  "id" : "Patient.id",
+                  "path" : "Patient.id",
+                  "min" : 0,
+                  "max" : "1",
+                  "base" : {
+                    "path" : "Resource.id",
+                    "min" : 0,
+                    "max" : "1"
+                  },
+                  "type" : [{
+                    "extension" : [{
+                      "url" : "http://hl7.org/fhir/StructureDefinition/structuredefinition-fhir-type",
+                      "valueUrl" : "string"
+                    }],
+                    "code" : "http://hl7.org/fhirpath/System.String"
+                  }]
+                }]
+              }
+            }
+          }
+        ]
+    }
+    """)
+
+    IMMUNIZATION_RESOURCE_TYPE_INT = 1
+
+    PATIENT_RESOURCE_TYPE_INT = 9
+
+    def test_fhir_spec_extractor_immunization_resource_produces_expected(self):
+        fhir_spec_extractor = FhirSpecExtractor(
+            self.BUNDLE_WITH_IMMUNIZATION_AND_PATIENT_STRUCTURE_DEFINITION,
+            {"Immunization"})
+        # we expect each top level field to be present, and one ofs that are represented in the spec
+        # as e.g. occurrence[x] should be expanded into the individual fields such as
+        # occurrenceDateTime and occurrenceString. Fields with a cardinality of 0..* or 1..* should
+        # have is_array = true set in their config.
+        expected_required_fields = {"status", "vaccineCode", "exampleFieldToTestOneToMany"}
+        expected_multi_type_config = fhirspec_pb2.MultiTypeFieldConfig(
+            name="occurrence[x]",
+            typed_field_names=["occurrenceDateTime", "occurrenceString"],
+            is_required=True
+        )
+        expected_field_names_to_config = {
+            "resourceType": fhirspec_pb2.FhirFieldConfig(
+                is_array=False,
+                r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_STRING,
+                kind=fhirspec_pb2.Kind.KIND_PRIMITIVE_TYPE
+            ),
+            "id": fhirspec_pb2.FhirFieldConfig(
+                is_array=False,
+                r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_SYSTEM_STRING,
+                kind=fhirspec_pb2.Kind.KIND_PRIMITIVE_TYPE
+            ),
+            "status": fhirspec_pb2.FhirFieldConfig(
+                is_array=False,
+                r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_CODE,
+                kind=fhirspec_pb2.Kind.KIND_PRIMITIVE_TYPE
+            ),
+            "vaccineCode": fhirspec_pb2.FhirFieldConfig(
+                is_array=False,
+                r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_COMPLEX,
+                kind=fhirspec_pb2.Kind.KIND_COMPLEX_TYPE
+            ),
+            "exampleFieldToTestOneToMany": fhirspec_pb2.FhirFieldConfig(
+                is_array=True,
+                r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_COMPLEX,
+                kind=fhirspec_pb2.Kind.KIND_COMPLEX_TYPE
+            ),
+            "occurrenceDateTime": fhirspec_pb2.FhirFieldConfig(
+                is_array=False,
+                r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_DATE_TIME,
+                kind=fhirspec_pb2.Kind.KIND_PRIMITIVE_TYPE
+            ),
+            "occurrenceString": fhirspec_pb2.FhirFieldConfig(
+                is_array=False,
+                r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_STRING,
+                kind=fhirspec_pb2.Kind.KIND_PRIMITIVE_TYPE
+            ),
+            "performer": fhirspec_pb2.FhirFieldConfig(
+                is_array=True,
+                r4_type=fhirspec_pb2.R4FhirType.R4_FHIR_TYPE_COMPLEX,
+                kind=fhirspec_pb2.Kind.KIND_COMPLEX_TYPE
+            ),
+        }
+
+        generated_spec = fhir_spec_extractor.generate_r4_fhir_spec_proto_message()
+
+        # Check that exactly one Immunization config is present
+        self.assertEqual(len(generated_spec.resource_type_to_config.keys()), 1)
+        immunization_config = (
+            generated_spec.resource_type_to_config[self.IMMUNIZATION_RESOURCE_TYPE_INT])
+        # Check that the list of required fields is as expected
+        self.assertEquals(set(immunization_config.required_fields), expected_required_fields)
+        # Check that the list of multi type configs is as expected
+        self.assertEquals(len(immunization_config.multi_type_fields), 1)
+        received_multi_type_config = immunization_config.multi_type_fields[0]
+        self.assertEqual(received_multi_type_config.name, expected_multi_type_config.name)
+        self.assertEqual(received_multi_type_config.typed_field_names,
+                         expected_multi_type_config.typed_field_names)
+        self.assertEqual(received_multi_type_config.is_required,
+                         expected_multi_type_config.is_required)
+        # Check that the field names to config map is as expected
+        self.assertEqual(set(expected_field_names_to_config.keys()),
+                         set(immunization_config.allowed_field_names_to_config.keys()))
+        for expected_field, expected_config in expected_field_names_to_config.items():
+            self.assertEqual(
+                immunization_config.allowed_field_names_to_config[expected_field],
+                expected_config,
+                "Mismatching config for field " + expected_field
+            )
+
+    def test_fhir_spec_extractor_immunization_and_patient_contains_two_entries(self):
+        fhir_spec_extractor = FhirSpecExtractor(
+            self.BUNDLE_WITH_IMMUNIZATION_AND_PATIENT_STRUCTURE_DEFINITION,
+            {"Immunization", "Patient"})
+
+        generated_spec = fhir_spec_extractor.generate_r4_fhir_spec_proto_message()
+
+        self.assertEqual(len(generated_spec.resource_type_to_config), 2)
+
+    def test_fhir_spec_extractor_unsupported_resource_raises_exception(self):
+        with self.assertRaises(ValueError):
+            FhirSpecExtractor(
+                self.BUNDLE_WITH_IMMUNIZATION_AND_PATIENT_STRUCTURE_DEFINITION,
+                {"UnsupportedResource"})
+
+    def test_fhir_spec_extractor_missing_resource_raises_exception(self):
+        with self.assertRaises(ValueError):
+            FhirSpecExtractor(
+                self.BUNDLE_WITH_IMMUNIZATION_AND_PATIENT_STRUCTURE_DEFINITION,
+                {"Observation"})
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/service/proto/phr/fhirspec.proto b/service/proto/phr/fhirspec.proto
new file mode 100644
index 0000000..127298b
--- /dev/null
+++ b/service/proto/phr/fhirspec.proto
@@ -0,0 +1,96 @@
+syntax = "proto3";
+
+package com.android.server.healthconnect.proto;
+
+option java_multiple_files=true;
+
+// FHIR spec details required for Health Connect PHR validation of medical data (FHIR resources
+// received as JSON strings).
+message FhirResourceSpec {
+    // A map of the FHIR resource type int to the FHIR spec config.
+    // The resource type int has to match one of the resource types in FhirResource.java
+    map<int32, FhirDataTypeConfig> resource_type_to_config = 1;
+}
+
+// The FHIR spec config of a resource or data type.
+message FhirDataTypeConfig {
+    // A map of all field names to field config for this data type. The keys of this map is the list
+    // of fields that are allowed to be populated.
+    map<string, FhirFieldConfig> allowed_field_names_to_config = 1;
+
+    // The list of fields that are required to be present for this data type.
+    // Note that this does not include required multi type fields. Whether or not these are required
+    // will be contained in the multi_type_fields configs (see next field).
+    repeated string required_fields = 2;
+
+    // The list of fields where one of several data type fields can be set.
+    // This is used to validate only one of each field is set and that exactly one is set if the
+    // field is required.
+    // Note that this config needs to be used to determine whether a multi type field is required
+    // or not, as these fields will not be included in the required_fields list above.
+    repeated MultiTypeFieldConfig multi_type_fields = 3;
+
+}
+
+// Represents the config of a FHIR field where a choice of data types can be set.
+// See https://build.fhir.org/formats.html#choice for more background.
+message MultiTypeFieldConfig {
+    // The name of the field without type suffix
+    optional string name = 1;
+
+    // The possible fields of a specific type that can be set in the json resource, e.g.
+    // "occurrenceDataTime", "occurrenceString". Only one of these fields is allowed to be present.
+    repeated string typed_field_names = 2;
+
+    // Whether or not the field is a required field.
+    // If true, exactly one of the fields in type_field_names is expected to be present.
+    optional bool is_required = 3;
+}
+
+// The FHIR spec config of a FHIR field.
+message FhirFieldConfig {
+    // Whether or not the field is an array.
+    optional bool is_array = 1;
+
+    // The data type of this field.
+    R4FhirType r4_type = 2;
+
+    // The kind of FHIR data type of this field.
+    // TODO: b/361775175 - this should be moved to the FhirDataTypeConfig instead, when we have
+    //  configs for types.
+    Kind kind = 3;
+}
+
+// Represents the kind of fhir data type, as found in the StructureDefinition.kind field
+// (https://hl7.org/fhir/R4/valueset-structure-definition-kind.html). See
+// https://hl7.org/fhir/R4/valueset-structure-definition-kind.html for a description of the
+// different values.
+enum Kind {
+    KIND_UNSPECIFIED = 0;
+    // The data type is a resource type.
+    KIND_RESOURCE = 1;
+    // The data type is a primitive type.
+    KIND_PRIMITIVE_TYPE = 2;
+    // The data type is a complex type. For our use case this applies to any type that is not a
+    // resource or a primitive type.
+    KIND_COMPLEX_TYPE = 3;
+}
+
+// The R4 Fhir type used to indicate the type of a field extracted from the fhir spec.
+// Note that all complex data types (non-primitive type) are combined under R4_FHIR_TYPE_COMPLEX
+// for now.
+enum R4FhirType {
+    R4_FHIR_TYPE_UNSPECIFIED = 0;
+    R4_FHIR_TYPE_COMPLEX = 1;
+    R4_FHIR_TYPE_BOOLEAN = 2;
+    R4_FHIR_TYPE_CODE = 3;
+    R4_FHIR_TYPE_DATE_TIME = 4;
+    R4_FHIR_TYPE_INSTANT = 5;
+    R4_FHIR_TYPE_INTEGER = 6;
+    R4_FHIR_TYPE_STRING = 7;
+    R4_FHIR_TYPE_SYSTEM_STRING = 8;
+    R4_FHIR_TYPE_URI = 9;
+    R4_FHIR_TYPE_DATE = 10;
+    R4_FHIR_TYPE_CANONICAL = 11;
+    R4_FHIR_TYPE_TIME = 12;
+}
\ No newline at end of file
diff --git a/service/proto/phr/generate_fhir_spec.py b/service/proto/phr/generate_fhir_spec.py
new file mode 100644
index 0000000..ca0969b
--- /dev/null
+++ b/service/proto/phr/generate_fhir_spec.py
@@ -0,0 +1,20 @@
+import fhirspec_pb2
+import sys
+import os
+import json
+from fhir_spec_extractor import FhirSpecExtractor, HC_SUPPORTED_RESOURCE_SET
+from typing import List, Mapping
+
+if __name__ == '__main__':
+    output_file_name = sys.argv[1]
+    resource_definitions_file_name = sys.argv[2]
+
+    with open(resource_definitions_file_name, 'r') as f:
+        profiles_resources_json = json.load(f)
+
+        fhirSpecExtractor = FhirSpecExtractor(profiles_resources_json, HC_SUPPORTED_RESOURCE_SET)
+
+        r4_resource_spec = fhirSpecExtractor.generate_r4_fhir_spec_proto_message()
+
+    with open(output_file_name, 'wb') as f:
+        f.write(r4_resource_spec.SerializeToString())
diff --git a/testapps/toolbox/AndroidManifest.xml b/testapps/toolbox/AndroidManifest.xml
index 9fd1dee..4ea5bf6 100644
--- a/testapps/toolbox/AndroidManifest.xml
+++ b/testapps/toolbox/AndroidManifest.xml
@@ -15,10 +15,10 @@
 -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
-          package="com.android.healthconnect.testapps.toolbox">
+    package="com.android.healthconnect.testapps.toolbox">
 
   <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED" />
+  <uses-permission android:name="android.permission.health.READ_ACTIVITY_INTENSITY" />
   <uses-permission android:name="android.permission.health.READ_BASAL_BODY_TEMPERATURE" />
   <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE" />
   <uses-permission android:name="android.permission.health.READ_BLOOD_GLUCOSE" />
@@ -59,6 +59,7 @@
   <uses-permission android:name="android.permission.health.READ_WHEELCHAIR_PUSHES" />
   <uses-permission android:name="android.permission.health.READ_INTERMENSTRUAL_BLEEDING" />
   <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED" />
+  <uses-permission android:name="android.permission.health.WRITE_ACTIVITY_INTENSITY" />
   <uses-permission android:name="android.permission.health.WRITE_BASAL_BODY_TEMPERATURE" />
   <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE" />
   <uses-permission android:name="android.permission.health.WRITE_BLOOD_GLUCOSE" />
@@ -101,12 +102,17 @@
 
   <!--  Medical permissions -->
   <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
-  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE"/>
-  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
   <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
   <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
-  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROBLEMS"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
   <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
   <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
 
   <!--  Additional permissions -->
diff --git a/testapps/toolbox/assets/immunization_1.json b/testapps/toolbox/assets/immunization_1.json
index 6426e8a..2a5dd28 100644
--- a/testapps/toolbox/assets/immunization_1.json
+++ b/testapps/toolbox/assets/immunization_1.json
@@ -1,6 +1,6 @@
 {
   "resourceType": "Immunization",
-  "id": "immunization_1",
+  "id": "immunization-1",
   "status": "completed",
   "vaccineCode": {
     "coding": [
diff --git a/testapps/toolbox/assets/observation_17.json b/testapps/toolbox/assets/observation_17.json
deleted file mode 100644
index 656f317..0000000
--- a/testapps/toolbox/assets/observation_17.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-  "resourceType": "Observation",
-  "id": "observation-17",
-  "status": "final",
-  "category": [
-    {
-      "coding": [
-        {
-          "system": "http://terminology.hl7.org/CodeSystem/observation-category",
-          "code": "vital-signs",
-          "display": "Vital Signs"
-        }
-      ],
-      "text": "Vital Signs"
-    }
-  ],
-  "code": {
-    "coding": [
-      {
-        "system": "http://loinc.org",
-        "code": "8302-2",
-        "display": "Body height"
-      },
-      {
-        "system": "http://snomed.info/sct",
-        "code": "1153637007",
-        "display": "Body height"
-      }
-    ],
-    "text": "Body height"
-  },
-  "subject": {
-    "reference": "Patient/patient-1",
-    "display": "Example, Anne"
-  },
-  "valueQuantity": {
-    "value": 162,
-    "unit": "cm",
-    "system": "http://unitsofmeasure.org",
-    "code": "cm"
-  },
-  "encounter": {
-    "reference": "Encounter/encounter-4",
-    "display": "GP appointment"
-  },
-  "effectiveDateTime": "2023-06-14T12:53:49Z",
-  "performer": [
-    {
-      "reference": "Practitioner/practitioner-1",
-      "display": "Dr Maria Hernandez"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/testapps/toolbox/assets/observation_18.json b/testapps/toolbox/assets/observation_18.json
deleted file mode 100644
index 1d6c9dd..0000000
--- a/testapps/toolbox/assets/observation_18.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-  "resourceType": "Observation",
-  "id": "observation-18",
-  "status": "final",
-  "category": [
-    {
-      "coding": [
-        {
-          "system": "http://terminology.hl7.org/CodeSystem/observation-category",
-          "code": "vital-signs",
-          "display": "Vital Signs"
-        }
-      ],
-      "text": "Vital Signs"
-    }
-  ],
-  "code": {
-    "coding": [
-      {
-        "system": "http://loinc.org",
-        "code": "29463-7",
-        "display": "Body weight"
-      },
-      {
-        "system": "http://snomed.info/sct",
-        "code": "27113001",
-        "display": "Body weight"
-      }
-    ],
-    "text": "Body weight"
-  },
-  "subject": {
-    "reference": "Patient/patient-1",
-    "display": "Example, Anne"
-  },
-  "valueQuantity": {
-    "value": 69,
-    "unit": "kg",
-    "system": "http://unitsofmeasure.org",
-    "code": "kg"
-  },
-  "encounter": {
-    "reference": "Encounter/encounter-4",
-    "display": "GP appointment"
-  },
-  "effectiveDateTime": "2023-06-14T12:53:49Z",
-  "performer": [
-    {
-      "reference": "Practitioner/practitioner-1",
-      "display": "Dr Maria Hernandez"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/testapps/toolbox/assets/observation_19.json b/testapps/toolbox/assets/observation_19.json
deleted file mode 100644
index fa0e4b5..0000000
--- a/testapps/toolbox/assets/observation_19.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "resourceType": "Observation",
-  "id": "observation-19",
-  "status": "final",
-  "category": [
-    {
-      "coding": [
-        {
-          "system": "http://terminology.hl7.org/CodeSystem/observation-category",
-          "code": "vital-signs",
-          "display": "Vital Signs"
-        }
-      ],
-      "text": "Vital Signs"
-    }
-  ],
-  "code": {
-    "coding": [
-      {
-        "system": "http://loinc.org",
-        "code": "2708-6",
-        "display": "Oxygen saturation in Arterial blood"
-      },
-      {
-        "system": "http://loinc.org",
-        "code": "59408-5",
-        "display": "Oxygen saturation in Arterial blood by Pulse oximetry"
-      },
-      {
-        "system": "http://snomed.info/sct",
-        "code": "103228002",
-        "display": "Hemoglobin saturation with oxygen"
-      }
-    ],
-    "text": "Oxygen saturation"
-  },
-  "subject": {
-    "reference": "Patient/patient-1",
-    "display": "Example, Anne"
-  },
-  "valueQuantity": {
-    "value": 98,
-    "unit": "%",
-    "system": "http://unitsofmeasure.org",
-    "code": "%"
-  },
-  "encounter": {
-    "reference": "Encounter/encounter-4",
-    "display": "GP appointment"
-  },
-  "effectiveDateTime": "2023-06-14T12:53:49Z",
-  "performer": [
-    {
-      "reference": "Practitioner/practitioner-1",
-      "display": "Dr Maria Hernandez"
-    }
-  ],
-  "note": [
-    {
-      "text": "98% on air"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/testapps/toolbox/res/layout/fragment_home.xml b/testapps/toolbox/res/layout/fragment_home.xml
index 088244f..1a8266b 100644
--- a/testapps/toolbox/res/layout/fragment_home.xml
+++ b/testapps/toolbox/res/layout/fragment_home.xml
@@ -80,6 +80,15 @@
             android:text="@string/seed_random_data" />
 
         <Button
+            android:id="@+id/seed_all_data_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8dp"
+            android:minWidth="250dp"
+            android:text="Seed All Data" />
+
+        <Button
             android:id="@+id/seed_performance_insert_data_button"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
@@ -152,6 +161,51 @@
             android:text="@string/request_history_read_permission" />
 
         <Button
+            android:id="@+id/request_medical_write_permission"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8dp"
+            android:minWidth="250dp"
+            android:text="@string/request_medical_write" />
+
+        <Button
+            android:id="@+id/request_medical_write_and_other_health_permissions"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8dp"
+            android:minWidth="250dp"
+            android:text="@string/request_medical_write_and_other_health_permissions" />
+
+        <Button
+            android:id="@+id/request_medical_read"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8dp"
+            android:minWidth="250dp"
+            android:text="@string/request_medical_read" />
+
+        <Button
+            android:id="@+id/request_fitness_read"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8dp"
+            android:minWidth="250dp"
+            android:text="@string/request_fitness_read" />
+
+        <Button
+            android:id="@+id/request_fitness_write"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8dp"
+            android:minWidth="250dp"
+            android:text="@string/request_fitness_write" />
+
+        <Button
             android:id="@+id/read_data_in_background_button"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
diff --git a/testapps/toolbox/res/layout/fragment_phr_options.xml b/testapps/toolbox/res/layout/fragment_phr_options.xml
index 03ccba7b..6ea5b9a 100644
--- a/testapps/toolbox/res/layout/fragment_phr_options.xml
+++ b/testapps/toolbox/res/layout/fragment_phr_options.xml
@@ -34,7 +34,6 @@
             android:minWidth="250dp"
             android:text="@string/phr_options_request_medical" />
 
-
         <TextView
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
@@ -44,8 +43,6 @@
             android:textStyle="bold"
             android:text="@string/phr_options_ingest_title" />
 
-
-
         <Button
             android:id="@+id/phr_create_data_source_button"
             android:layout_width="wrap_content"
@@ -61,8 +58,16 @@
             android:layout_marginTop="8dp"
             android:gravity="center"
             android:text="@string/phr_options_data_source_id_placeholder"
+            android:visibility="gone"
             android:textSize="12sp" />
 
+        <Spinner
+            android:id="@+id/phr_spinner"
+            android:layout_marginTop="18dp"
+            android:minWidth="250dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
         <Button
             android:id="@+id/phr_seed_fhir_jsons_button"
             android:layout_width="wrap_content"
@@ -91,7 +96,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:gravity="center"
-            android:text="@string/phr_options_title"
+            android:text="@string/phr_options_read_immunization"
             android:layout_marginTop="50dp"
             android:textSize="20sp"
             android:textStyle="bold" />
diff --git a/testapps/toolbox/res/values/donottranslate_strings.xml b/testapps/toolbox/res/values/donottranslate_strings.xml
index 352761d..12a27c6 100644
--- a/testapps/toolbox/res/values/donottranslate_strings.xml
+++ b/testapps/toolbox/res/values/donottranslate_strings.xml
@@ -44,6 +44,11 @@
   <string name="request_additional_permissions">Request Additional Permissions</string>
   <string name="request_bg_read_permission">Request Background Read</string>
   <string name="request_history_read_permission">Request History Read</string>
+  <string name="request_medical_write">Request Medical Write</string>
+  <string name="request_medical_write_and_other_health_permissions">Request Medical Write + Other Health</string>
+  <string name="request_medical_read">Request Medical Read</string>
+  <string name="request_fitness_read">Request Fitness Read</string>
+  <string name="request_fitness_write">Request Fitness Write</string>
   <string name="toast_permission_filter_enabled">Intent Filter Enabled</string>
   <string name="toast_permission_filter_disabled">Intent Filter Disabled</string>
   <string name="toast_seed_data_success">Data inserted successfully</string>
@@ -60,6 +65,7 @@
   <!-- region Data Types -->
   <!-- region Activity data types -->
   <string name="active_calories_burned_label" description="Label used to show the user's active calories burned data [CHAR_LIMIT=50]">Active calories burned</string>
+  <string name="activity_intensity_label" description="Label used to show the user's activity intensity data [CHAR_LIMIT=50]">Activity intensity</string>
   <string name="distance_label" description="Label used to show the user's distance data [CHAR_LIMIT=50]">Distance</string>
   <string name="elevation_gained_label" description="Label used to show the user's elevation gained data [CHAR_LIMIT=50]">Elevation gained</string>
   <string name="floors_climbed_label" description="Label used to show the user's floors climbed data [CHAR_LIMIT=50]">Floors climbed</string>
@@ -140,19 +146,18 @@
   <!--endregion-->
 
   <!-- region Phr Options screen -->
-  <string name="phr_options_title">PHR Options</string>
-  <string name="phr_options_ingest_title">Ingest PHR data</string>
+  <string name="phr_options_read_immunization">Read PHR data</string>
+  <string name="phr_options_ingest_title">Insert PHR data</string>
   <string name="phr_options_create_data_source">Create data source</string>
   <string name="phr_options_data_source_id_placeholder">Create data source to see the id</string>
-  <string name="phr_options_insert_immunization">Insert immunization</string>
-  <string name="phr_options_immunization_id_placeholder">Insert immunization to see the id</string>
-  <string name="phr_options_insert_allergy">Insert allergy</string>
-  <string name="phr_options_allergy_id_placeholder">Insert allergy to see the id</string>
-  <string name="phr_options_read_by_id">Read FHIR Resource For Id</string>
-  <string name="phr_options_seed_fhir_jsons">Seed FHIR JSONs</string>
+  <string name="phr_options_insert_immunization">Insert all vaccines</string>
+  <string name="phr_options_insert_allergy">Insert all allergies</string>
+  <string name="phr_options_read_by_id">Read all vaccines</string>
+  <string name="phr_options_seed_fhir_jsons">Seed all FHIR resources</string>
   <string name="phr_options_request_immunization">Request read immunization permission</string>
   <string name="phr_options_request_medical">Request all medical permissions</string>
   <string name="all_medical_permissions_success">All medical permissions were successfully granted</string>
   <string name="number_of_medical_permissions_not_granted">%1$d medical permissions still not granted</string>
+  <string name="spinner_default_message">SELECT FHIR RESOURCE TO INSERT</string>
   <!--endregion-->
 </resources>
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/Constants.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/Constants.kt
index 2d811b5..11dbe28 100644
--- a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/Constants.kt
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/Constants.kt
@@ -16,6 +16,7 @@
 package com.android.healthconnect.testapps.toolbox
 
 import android.health.connect.datatypes.ActiveCaloriesBurnedRecord
+import android.health.connect.datatypes.ActivityIntensityRecord
 import android.health.connect.datatypes.BasalBodyTemperatureRecord
 import android.health.connect.datatypes.BasalMetabolicRateRecord
 import android.health.connect.datatypes.BloodGlucoseRecord
@@ -74,9 +75,10 @@
     const val INPUT_TYPE_INT = InputType.TYPE_CLASS_NUMBER
     const val INPUT_TYPE_TEXT = InputType.TYPE_CLASS_TEXT
 
-    val DATA_TYPE_PERMISSIONS =
+    val FITNESS_READ_PERMISSIONS =
         arrayOf(
             "android.permission.health.READ_ACTIVE_CALORIES_BURNED",
+            "android.permission.health.READ_ACTIVITY_INTENSITY",
             "android.permission.health.READ_BASAL_BODY_TEMPERATURE",
             "android.permission.health.READ_BASAL_METABOLIC_RATE",
             "android.permission.health.READ_BLOOD_GLUCOSE",
@@ -115,7 +117,12 @@
             "android.permission.health.READ_WEIGHT",
             "android.permission.health.READ_INTERMENSTRUAL_BLEEDING",
             "android.permission.health.READ_WHEELCHAIR_PUSHES",
+        )
+
+    val FITNESS_WRITE_PERMISSIONS =
+        arrayOf(
             "android.permission.health.WRITE_ACTIVE_CALORIES_BURNED",
+            "android.permission.health.WRITE_ACTIVITY_INTENSITY",
             "android.permission.health.WRITE_BASAL_BODY_TEMPERATURE",
             "android.permission.health.WRITE_BASAL_METABOLIC_RATE",
             "android.permission.health.WRITE_BLOOD_GLUCOSE",
@@ -155,6 +162,7 @@
             "android.permission.health.WRITE_INTERMENSTRUAL_BLEEDING",
             "android.permission.health.WRITE_EXERCISE_ROUTE",
         )
+    val FITNESS_PERMISSIONS = FITNESS_READ_PERMISSIONS + FITNESS_WRITE_PERMISSIONS
 
     const val READ_HEALTH_DATA_IN_BACKGROUND =
         "android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"
@@ -162,19 +170,29 @@
 
     val ADDITIONAL_PERMISSIONS = arrayOf(READ_HEALTH_DATA_IN_BACKGROUND, READ_HEALTH_DATA_HISTORY)
 
-    const val READ_IMMUNIZATION = "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION"
+    const val READ_IMMUNIZATION = "android.permission.health.READ_MEDICAL_DATA_VACCINES"
     const val WRITE_ALL_MEDICAL_DATA = "android.permission.health.WRITE_MEDICAL_DATA"
-    val MEDICAL_PERMISSIONS = arrayOf(
-        "android.permission.health.WRITE_MEDICAL_DATA",
-        "android.permission.health.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE",
-        "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATION",
-        "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS",
-        "android.permission.health.READ_MEDICAL_DATA_PREGNANCY",
-        "android.permission.health.READ_MEDICAL_DATA_PROBLEMS",
-        "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY",
-        "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS")
+    val MEDICAL_READ_PERMISSIONS =
+        arrayOf(
+            "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES",
+            "android.permission.health.READ_MEDICAL_DATA_CONDITIONS",
+            "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS",
+            "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS",
+            "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS",
+            "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS",
+            "android.permission.health.READ_MEDICAL_DATA_PREGNANCY",
+            "android.permission.health.READ_MEDICAL_DATA_PROCEDURES",
+            "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY",
+            "android.permission.health.READ_MEDICAL_DATA_VACCINES",
+            "android.permission.health.READ_MEDICAL_DATA_VISITS",
+            "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS",
+        )
+    val MEDICAL_WRITE_PERMISSIONS = arrayOf("android.permission.health.WRITE_MEDICAL_DATA")
+    val MEDICAL_PERMISSIONS = MEDICAL_READ_PERMISSIONS + MEDICAL_WRITE_PERMISSIONS
 
-    val HEALTH_PERMISSIONS = DATA_TYPE_PERMISSIONS + ADDITIONAL_PERMISSIONS + MEDICAL_PERMISSIONS
+    val MEDICAL_WRITE_AND_OTHERS =
+        MEDICAL_WRITE_PERMISSIONS + FITNESS_PERMISSIONS + ADDITIONAL_PERMISSIONS
+    val HEALTH_PERMISSIONS = FITNESS_PERMISSIONS + ADDITIONAL_PERMISSIONS + MEDICAL_PERMISSIONS
 
     /** Represents Category group for HealthConnect data. */
     enum class HealthDataCategory(
@@ -225,6 +243,7 @@
             listOf(
                 HealthPermissionType.PLANNED_EXERCISE,
                 HealthPermissionType.ACTIVE_CALORIES_BURNED,
+                HealthPermissionType.ACTIVITY_INTENSITY,
                 HealthPermissionType.DISTANCE,
                 HealthPermissionType.ELEVATION_GAINED,
                 HealthPermissionType.FLOORS_CLIMBED,
@@ -291,6 +310,7 @@
             ActiveCaloriesBurnedRecord::class,
             R.string.active_calories_burned_label,
         ),
+        ACTIVITY_INTENSITY(ActivityIntensityRecord::class, R.string.activity_intensity_label),
         DISTANCE(DistanceRecord::class, R.string.distance_label),
         ELEVATION_GAINED(ElevationGainedRecord::class, R.string.elevation_gained_label),
         FLOORS_CLIMBED(FloorsClimbedRecord::class, R.string.floors_climbed_label),
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedActivityData.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedActivityData.kt
new file mode 100644
index 0000000..46b0963
--- /dev/null
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedActivityData.kt
@@ -0,0 +1,1019 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.testapps.toolbox.seed
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.ActiveCaloriesBurnedRecord
+import android.health.connect.datatypes.ActivityIntensityRecord
+import android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE
+import android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS
+import android.health.connect.datatypes.CyclingPedalingCadenceRecord
+import android.health.connect.datatypes.CyclingPedalingCadenceRecord.CyclingPedalingCadenceRecordSample
+import android.health.connect.datatypes.DistanceRecord
+import android.health.connect.datatypes.ElevationGainedRecord
+import android.health.connect.datatypes.ExerciseCompletionGoal
+import android.health.connect.datatypes.ExerciseLap
+import android.health.connect.datatypes.ExerciseSegment
+import android.health.connect.datatypes.ExerciseSegmentType
+import android.health.connect.datatypes.ExerciseSessionRecord
+import android.health.connect.datatypes.ExerciseSessionType
+import android.health.connect.datatypes.FloorsClimbedRecord
+import android.health.connect.datatypes.PlannedExerciseBlock
+import android.health.connect.datatypes.PlannedExerciseSessionRecord
+import android.health.connect.datatypes.PlannedExerciseStep
+import android.health.connect.datatypes.PlannedExerciseStep.EXERCISE_CATEGORY_ACTIVE
+import android.health.connect.datatypes.PowerRecord
+import android.health.connect.datatypes.PowerRecord.PowerRecordSample
+import android.health.connect.datatypes.SpeedRecord
+import android.health.connect.datatypes.SpeedRecord.SpeedRecordSample
+import android.health.connect.datatypes.StepsCadenceRecord
+import android.health.connect.datatypes.StepsCadenceRecord.StepsCadenceRecordSample
+import android.health.connect.datatypes.StepsRecord
+import android.health.connect.datatypes.TotalCaloriesBurnedRecord
+import android.health.connect.datatypes.Vo2MaxRecord
+import android.health.connect.datatypes.Vo2MaxRecord.Vo2MaxMeasurementMethod.MEASUREMENT_METHOD_COOPER_TEST
+import android.health.connect.datatypes.Vo2MaxRecord.Vo2MaxMeasurementMethod.MEASUREMENT_METHOD_HEART_RATE_RATIO
+import android.health.connect.datatypes.Vo2MaxRecord.Vo2MaxMeasurementMethod.MEASUREMENT_METHOD_METABOLIC_CART
+import android.health.connect.datatypes.Vo2MaxRecord.Vo2MaxMeasurementMethod.MEASUREMENT_METHOD_MULTISTAGE_FITNESS_TEST
+import android.health.connect.datatypes.Vo2MaxRecord.Vo2MaxMeasurementMethod.MEASUREMENT_METHOD_OTHER
+import android.health.connect.datatypes.Vo2MaxRecord.Vo2MaxMeasurementMethod.MEASUREMENT_METHOD_ROCKPORT_FITNESS_TEST
+import android.health.connect.datatypes.WheelchairPushesRecord
+import android.health.connect.datatypes.units.Energy
+import android.health.connect.datatypes.units.Length
+import android.health.connect.datatypes.units.Power
+import android.health.connect.datatypes.units.Velocity
+import com.android.healthconnect.testapps.toolbox.data.ExerciseRoutesTestData
+import com.android.healthconnect.testapps.toolbox.data.ExerciseRoutesTestData.Companion.generateExerciseRouteFromLocations
+import com.android.healthconnect.testapps.toolbox.data.ExerciseRoutesTestData.Companion.routeDataMap
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.getMetaData
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.insertRecords
+import java.time.Duration.ofDays
+import java.time.Duration.ofMinutes
+import java.time.Instant
+import java.time.temporal.ChronoUnit
+import kotlin.random.Random
+import kotlinx.coroutines.runBlocking
+
+class SeedActivityData(private val context: Context, private val manager: HealthConnectManager) {
+
+    companion object {
+        val VALID_VO2_MEASUREMENT_METHOD =
+            setOf(
+                MEASUREMENT_METHOD_OTHER,
+                MEASUREMENT_METHOD_METABOLIC_CART,
+                MEASUREMENT_METHOD_HEART_RATE_RATIO,
+                MEASUREMENT_METHOD_COOPER_TEST,
+                MEASUREMENT_METHOD_MULTISTAGE_FITNESS_TEST,
+                MEASUREMENT_METHOD_ROCKPORT_FITNESS_TEST,
+            )
+    }
+
+    private val start = Instant.now().truncatedTo(ChronoUnit.DAYS)
+    private val yesterday = start.minus(ofDays(1))
+    private val lastWeek = start.minus(ofDays(7))
+    private val lastMonth = start.minus(ofDays(31))
+
+    fun seedActivityData() {
+        runBlocking {
+            try {
+                seedActivityIntensityData()
+                seedStepsData()
+                seedDistanceData()
+                seedElevationGainedRecord()
+                seedActiveCaloriesBurnedData()
+                seedExerciseSessionData()
+                seedPlannedExerciseSessionRecord()
+                seedSpeedRecord()
+                seedPowerRecord()
+                seedCyclingPedalingCadenceRecord()
+                seedFloorsClimbedRecord()
+                seedTotalCaloriesBurnedRecord()
+                seedWheelchairPushesRecord()
+                seedVo2MaxRecord()
+                seedStepsCadenceRecord()
+            } catch (ex: Exception) {
+                throw ex
+            }
+        }
+    }
+
+    private suspend fun seedActivityIntensityData() {
+        val records =
+            listOf(start, yesterday, lastWeek, lastMonth).flatMap { baseTime ->
+                List(3) {
+                    val startTime = baseTime.plus(ofMinutes(5 * it.toLong()))
+
+                    ActivityIntensityRecord.Builder(
+                            getMetaData(context),
+                            startTime,
+                            startTime.plus(ofMinutes(3)),
+                            if (Random.nextBoolean()) ACTIVITY_INTENSITY_TYPE_MODERATE
+                            else ACTIVITY_INTENSITY_TYPE_VIGOROUS,
+                        )
+                        .build()
+                }
+            }
+
+        insertRecords(records, manager)
+    }
+
+    private suspend fun seedStepsData() {
+        val records = (1L..50).map { count -> getStepsRecord(count, start.plus(ofMinutes(count))) }
+        val yesterdayRecords =
+            (1L..3).map { count -> getStepsRecord(count, yesterday.plus(ofMinutes(count))) }
+        val lastWeekRecords =
+            (1L..3).map { count -> getStepsRecord(count, lastWeek.plus(ofMinutes(count))) }
+        val lastMonthRecords =
+            (1L..3).map { count -> getStepsRecord(count, lastMonth.plus(ofMinutes(count))) }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedDistanceData() {
+        val records =
+            (1L..50).map { timeOffSet ->
+                getDistanceData(getValidLengthData(500, 5000), start.plus(ofMinutes(timeOffSet)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                getDistanceData(
+                    getValidLengthData(500, 5000),
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                getDistanceData(getValidLengthData(500, 5000), lastWeek.plus(ofMinutes(timeOffSet)))
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                getDistanceData(
+                    getValidLengthData(500, 5000),
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedElevationGainedRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                getElevationGainedRecord(
+                    getValidLengthData(500, 5000),
+                    start.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                getElevationGainedRecord(
+                    getValidLengthData(500, 5000),
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                getElevationGainedRecord(
+                    getValidLengthData(500, 5000),
+                    lastWeek.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                getElevationGainedRecord(
+                    getValidLengthData(500, 5000),
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedActiveCaloriesBurnedData() {
+        val records =
+            (1L..15).map { timeOffSet ->
+                getActiveCaloriesBurnedRecord(getValidEnergy(), start.plus(ofMinutes(timeOffSet)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                getActiveCaloriesBurnedRecord(
+                    getValidEnergy(),
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                getActiveCaloriesBurnedRecord(
+                    getValidEnergy(),
+                    lastWeek.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                getActiveCaloriesBurnedRecord(
+                    getValidEnergy(),
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedExerciseSessionData() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                val exerciseSegments = ArrayList<ExerciseSegment>()
+                repeat(5) { i ->
+                    exerciseSegments.add(
+                        ExerciseSegment.Builder(
+                                start.plus(ofMinutes(timeOffSet + i)),
+                                start.plus(ofMinutes(timeOffSet + i + 1)),
+                                getValidSegmentType(),
+                            )
+                            .build()
+                    )
+                }
+                val exerciseLaps = ArrayList<ExerciseLap>()
+                repeat(5) { i ->
+                    exerciseLaps.add(
+                        ExerciseLap.Builder(
+                                start.plus(ofMinutes(timeOffSet + i)),
+                                start.plus(ofMinutes(timeOffSet + i + 1)),
+                            )
+                            .setLength(getValidLengthData(50, 1050))
+                            .build()
+                    )
+                }
+
+                getExerciseSessionRecord(
+                    exerciseSegments,
+                    exerciseLaps,
+                    start.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                val exerciseSegments = ArrayList<ExerciseSegment>()
+                repeat(5) { i ->
+                    exerciseSegments.add(
+                        ExerciseSegment.Builder(
+                                yesterday.plus(ofMinutes(timeOffSet + i)),
+                                yesterday.plus(ofMinutes(timeOffSet + i + 1)),
+                                getValidSegmentType(),
+                            )
+                            .build()
+                    )
+                }
+                val exerciseLaps = ArrayList<ExerciseLap>()
+                repeat(5) { i ->
+                    exerciseLaps.add(
+                        ExerciseLap.Builder(
+                                yesterday.plus(ofMinutes(timeOffSet + i)),
+                                yesterday.plus(ofMinutes(timeOffSet + i + 1)),
+                            )
+                            .setLength(getValidLengthData(50, 1050))
+                            .build()
+                    )
+                }
+                getExerciseSessionRecord(
+                    exerciseSegments,
+                    exerciseLaps,
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                val exerciseSegments = ArrayList<ExerciseSegment>()
+                repeat(5) { i ->
+                    exerciseSegments.add(
+                        ExerciseSegment.Builder(
+                                lastWeek.plus(ofMinutes(timeOffSet + i)),
+                                lastWeek.plus(ofMinutes(timeOffSet + i + 1)),
+                                getValidSegmentType(),
+                            )
+                            .build()
+                    )
+                }
+                val exerciseLaps = ArrayList<ExerciseLap>()
+                repeat(5) { i ->
+                    exerciseLaps.add(
+                        ExerciseLap.Builder(
+                                lastWeek.plus(ofMinutes(timeOffSet + i)),
+                                lastWeek.plus(ofMinutes(timeOffSet + i + 1)),
+                            )
+                            .setLength(getValidLengthData(50, 1050))
+                            .build()
+                    )
+                }
+                getExerciseSessionRecord(
+                    exerciseSegments,
+                    exerciseLaps,
+                    lastWeek.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                val exerciseSegments = ArrayList<ExerciseSegment>()
+                repeat(5) { i ->
+                    exerciseSegments.add(
+                        ExerciseSegment.Builder(
+                                lastMonth.plus(ofMinutes(timeOffSet + i)),
+                                lastMonth.plus(ofMinutes(timeOffSet + i + 1)),
+                                getValidSegmentType(),
+                            )
+                            .build()
+                    )
+                }
+                val exerciseLaps = ArrayList<ExerciseLap>()
+                repeat(5) { i ->
+                    exerciseLaps.add(
+                        ExerciseLap.Builder(
+                                lastMonth.plus(ofMinutes(timeOffSet + i)),
+                                lastMonth.plus(ofMinutes(timeOffSet + i + 1)),
+                            )
+                            .setLength(getValidLengthData(50, 1050))
+                            .build()
+                    )
+                }
+                getExerciseSessionRecord(
+                    exerciseSegments,
+                    exerciseLaps,
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedPlannedExerciseSessionRecord() {
+        val tomorrow = start.plus(ofDays(1))
+        val records =
+            (1L..3).map { timeOffSet ->
+                val plannedExerciseBlocks = ArrayList<PlannedExerciseBlock>()
+                repeat(10) { plannedExerciseBlocks.add(getValidPlannedExerciseBlockData()) }
+                getPlannedExerciseSessionRecord(
+                    plannedExerciseBlocks,
+                    start.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val tomorrowRecords =
+            (1L..3).map { timeOffSet ->
+                val plannedExerciseBlocks = ArrayList<PlannedExerciseBlock>()
+                repeat(10) { plannedExerciseBlocks.add(getValidPlannedExerciseBlockData()) }
+                getPlannedExerciseSessionRecord(
+                    plannedExerciseBlocks,
+                    tomorrow.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                val plannedExerciseBlocks = ArrayList<PlannedExerciseBlock>()
+                repeat(10) { plannedExerciseBlocks.add(getValidPlannedExerciseBlockData()) }
+                getPlannedExerciseSessionRecord(
+                    plannedExerciseBlocks,
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                val plannedExerciseBlocks = ArrayList<PlannedExerciseBlock>()
+                repeat(10) { plannedExerciseBlocks.add(getValidPlannedExerciseBlockData()) }
+                getPlannedExerciseSessionRecord(
+                    plannedExerciseBlocks,
+                    lastWeek.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                val plannedExerciseBlocks = ArrayList<PlannedExerciseBlock>()
+                repeat(10) { plannedExerciseBlocks.add(getValidPlannedExerciseBlockData()) }
+                getPlannedExerciseSessionRecord(
+                    plannedExerciseBlocks,
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(tomorrowRecords, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedSpeedRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                val speedRecordSample = ArrayList<SpeedRecordSample>()
+                repeat(10) { i ->
+                    speedRecordSample.add(
+                        SpeedRecordSample(
+                            getValidSpeedData(),
+                            start.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+                getSpeedRecord(speedRecordSample, start.plus(ofMinutes(timeOffSet)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                val speedRecordSample = ArrayList<SpeedRecordSample>()
+                repeat(10) { i ->
+                    speedRecordSample.add(
+                        SpeedRecordSample(
+                            getValidSpeedData(),
+                            yesterday.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+                getSpeedRecord(speedRecordSample, yesterday.plus(ofMinutes(timeOffSet)))
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                val speedRecordSample = ArrayList<SpeedRecordSample>()
+                repeat(10) { i ->
+                    speedRecordSample.add(
+                        SpeedRecordSample(
+                            getValidSpeedData(),
+                            lastWeek.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+                getSpeedRecord(speedRecordSample, lastWeek.plus(ofMinutes(timeOffSet)))
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                val speedRecordSample = ArrayList<SpeedRecordSample>()
+                repeat(10) { i ->
+                    speedRecordSample.add(
+                        SpeedRecordSample(
+                            getValidSpeedData(),
+                            lastMonth.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+                getSpeedRecord(speedRecordSample, lastMonth.plus(ofMinutes(timeOffSet)))
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedPowerRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                val powerRecordSample = ArrayList<PowerRecordSample>()
+                repeat(10) { i ->
+                    powerRecordSample.add(
+                        PowerRecordSample(
+                            getValidPowerData(),
+                            start.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+
+                getPowerRecord(powerRecordSample, start.plus(ofMinutes(timeOffSet)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                val powerRecordSample = ArrayList<PowerRecordSample>()
+                repeat(10) { i ->
+                    powerRecordSample.add(
+                        PowerRecordSample(
+                            getValidPowerData(),
+                            yesterday.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+
+                getPowerRecord(powerRecordSample, yesterday.plus(ofMinutes(timeOffSet)))
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                val powerRecordSample = ArrayList<PowerRecordSample>()
+                repeat(10) { i ->
+                    powerRecordSample.add(
+                        PowerRecordSample(
+                            getValidPowerData(),
+                            lastWeek.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+
+                getPowerRecord(powerRecordSample, lastWeek.plus(ofMinutes(timeOffSet)))
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                val powerRecordSample = ArrayList<PowerRecordSample>()
+                repeat(10) { i ->
+                    powerRecordSample.add(
+                        PowerRecordSample(
+                            getValidPowerData(),
+                            lastMonth.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+
+                getPowerRecord(powerRecordSample, lastMonth.plus(ofMinutes(timeOffSet)))
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedCyclingPedalingCadenceRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                val cyclingCadenceSample = ArrayList<CyclingPedalingCadenceRecordSample>()
+                repeat(10) { i ->
+                    cyclingCadenceSample.add(
+                        CyclingPedalingCadenceRecordSample(
+                            getValidDoubleData(60, 100),
+                            start.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+
+                getCyclingPedalingCadenceRecord(
+                    cyclingCadenceSample,
+                    start.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                val cyclingCadenceSample = ArrayList<CyclingPedalingCadenceRecordSample>()
+                repeat(10) { i ->
+                    cyclingCadenceSample.add(
+                        CyclingPedalingCadenceRecordSample(
+                            getValidDoubleData(60, 100),
+                            yesterday.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+
+                getCyclingPedalingCadenceRecord(
+                    cyclingCadenceSample,
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                val cyclingCadenceSample = ArrayList<CyclingPedalingCadenceRecordSample>()
+                repeat(10) { i ->
+                    cyclingCadenceSample.add(
+                        CyclingPedalingCadenceRecordSample(
+                            getValidDoubleData(60, 100),
+                            lastWeek.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+
+                getCyclingPedalingCadenceRecord(
+                    cyclingCadenceSample,
+                    lastWeek.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                val cyclingCadenceSample = ArrayList<CyclingPedalingCadenceRecordSample>()
+                repeat(10) { i ->
+                    cyclingCadenceSample.add(
+                        CyclingPedalingCadenceRecordSample(
+                            getValidDoubleData(60, 100),
+                            lastMonth.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+
+                getCyclingPedalingCadenceRecord(
+                    cyclingCadenceSample,
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedFloorsClimbedRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                getFloorsClimbedRecord(getValidDoubleData(1, 10), start.plus(ofMinutes(timeOffSet)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                getFloorsClimbedRecord(
+                    getValidDoubleData(1, 10),
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                getFloorsClimbedRecord(
+                    getValidDoubleData(1, 10),
+                    lastWeek.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                getFloorsClimbedRecord(
+                    getValidDoubleData(1, 10),
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedTotalCaloriesBurnedRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                getTotalCaloriesBurnedRecord(getValidEnergy(), start.plus(ofMinutes(timeOffSet)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                getTotalCaloriesBurnedRecord(
+                    getValidEnergy(),
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                getTotalCaloriesBurnedRecord(getValidEnergy(), lastWeek.plus(ofMinutes(timeOffSet)))
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                getTotalCaloriesBurnedRecord(
+                    getValidEnergy(),
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedWheelchairPushesRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                getWheelchairPushesRecord(timeOffSet, start.plus(ofMinutes(timeOffSet)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                getWheelchairPushesRecord(timeOffSet, yesterday.plus(ofMinutes(timeOffSet)))
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                getWheelchairPushesRecord(timeOffSet, lastWeek.plus(ofMinutes(timeOffSet)))
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                getWheelchairPushesRecord(timeOffSet, lastMonth.plus(ofMinutes(timeOffSet)))
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedVo2MaxRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                getVo2MaxRecord(
+                    getValidVo2MeasurementMethod(),
+                    getValidDoubleData(25, 40),
+                    start.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                getVo2MaxRecord(
+                    getValidVo2MeasurementMethod(),
+                    getValidDoubleData(25, 40),
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                getVo2MaxRecord(
+                    getValidVo2MeasurementMethod(),
+                    getValidDoubleData(25, 40),
+                    lastWeek.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                getVo2MaxRecord(
+                    getValidVo2MeasurementMethod(),
+                    getValidDoubleData(25, 40),
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedStepsCadenceRecord() {
+        val records =
+            (1L..3).map { timeOffSet ->
+                val stepsCadenceRecordSample = ArrayList<StepsCadenceRecordSample>()
+                repeat(10) { i ->
+                    stepsCadenceRecordSample.add(
+                        StepsCadenceRecordSample(
+                            getValidDoubleData(160, 180),
+                            start.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+                getStepsCadenceRecord(stepsCadenceRecordSample, start.plus(ofMinutes(timeOffSet)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffSet ->
+                val stepsCadenceRecordSample = ArrayList<StepsCadenceRecordSample>()
+                repeat(10) { i ->
+                    stepsCadenceRecordSample.add(
+                        StepsCadenceRecordSample(
+                            getValidDoubleData(160, 180),
+                            yesterday.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+                getStepsCadenceRecord(
+                    stepsCadenceRecordSample,
+                    yesterday.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffSet ->
+                val stepsCadenceRecordSample = ArrayList<StepsCadenceRecordSample>()
+                repeat(10) { i ->
+                    stepsCadenceRecordSample.add(
+                        StepsCadenceRecordSample(
+                            getValidDoubleData(160, 180),
+                            lastWeek.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+                getStepsCadenceRecord(
+                    stepsCadenceRecordSample,
+                    lastWeek.plus(ofMinutes(timeOffSet)),
+                )
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffSet ->
+                val stepsCadenceRecordSample = ArrayList<StepsCadenceRecordSample>()
+                repeat(10) { i ->
+                    stepsCadenceRecordSample.add(
+                        StepsCadenceRecordSample(
+                            getValidDoubleData(160, 180),
+                            lastMonth.plus(ofMinutes(timeOffSet + i)),
+                        )
+                    )
+                }
+                getStepsCadenceRecord(
+                    stepsCadenceRecordSample,
+                    lastMonth.plus(ofMinutes(timeOffSet)),
+                )
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private fun getStepsRecord(count: Long, time: Instant): StepsRecord {
+        return StepsRecord.Builder(getMetaData(context), time, time.plusSeconds(30), count).build()
+    }
+
+    private fun getDistanceData(length: Length, time: Instant): DistanceRecord {
+        return DistanceRecord.Builder(getMetaData(context), time, time.plusSeconds(30), length)
+            .build()
+    }
+
+    private fun getValidLengthData(min: Int, max: Int): Length {
+        return Length.fromMeters((Random.nextInt(min, max)).toDouble())
+    }
+
+    private fun getElevationGainedRecord(distance: Length, time: Instant): ElevationGainedRecord {
+        return ElevationGainedRecord.Builder(
+                getMetaData(context),
+                time,
+                time.plusSeconds(30),
+                distance,
+            )
+            .build()
+    }
+
+    private fun getActiveCaloriesBurnedRecord(
+        energy: Energy,
+        time: Instant,
+    ): ActiveCaloriesBurnedRecord {
+        return ActiveCaloriesBurnedRecord.Builder(
+                getMetaData(context),
+                time,
+                time.plusSeconds(30),
+                energy,
+            )
+            .build()
+    }
+
+    private fun getValidEnergy(): Energy {
+        return Energy.fromCalories((Random.nextInt(500, 5000)).toDouble())
+    }
+
+    private fun getExerciseSessionRecord(
+        exerciseSegments: List<ExerciseSegment>,
+        laps: List<ExerciseLap>,
+        time: Instant,
+    ): ExerciseSessionRecord {
+        return ExerciseSessionRecord.Builder(
+                getMetaData(context),
+                time,
+                time.plusSeconds(1000),
+                ExerciseSessionType.EXERCISE_SESSION_TYPE_EXERCISE_CLASS,
+            )
+            .setSegments(exerciseSegments)
+            .setLaps(laps)
+            .setRoute(
+                generateExerciseRouteFromLocations(
+                    getValidExerciseRouteLocation(),
+                    time.toEpochMilli(),
+                )
+            )
+            .build()
+    }
+
+    private fun getValidExerciseRouteLocation():
+        List<ExerciseRoutesTestData.ExerciseRouteLocationData> {
+        return routeDataMap.values.random()
+    }
+
+    private fun getValidSegmentType(): Int {
+        return ExerciseSegmentType.EXERCISE_SEGMENT_TYPE_STRETCHING
+    }
+
+    private fun getPlannedExerciseSessionRecord(
+        plannedExerciseBlocks: List<PlannedExerciseBlock>,
+        time: Instant,
+    ): PlannedExerciseSessionRecord {
+        return PlannedExerciseSessionRecord.Builder(
+                getMetaData(context),
+                ExerciseSessionType.EXERCISE_SESSION_TYPE_EXERCISE_CLASS,
+                time,
+                time.plusSeconds(30),
+            )
+            .setBlocks(plannedExerciseBlocks)
+            .build()
+    }
+
+    private fun getValidPlannedExerciseBlockData(): PlannedExerciseBlock {
+        return PlannedExerciseBlock.Builder(Random.nextInt(1, 5))
+            .addStep(getValidPlannedExerciseStepData())
+            .build()
+    }
+
+    private fun getValidPlannedExerciseStepData(): PlannedExerciseStep {
+        return PlannedExerciseStep.Builder(
+                ExerciseSessionType.EXERCISE_SESSION_TYPE_EXERCISE_CLASS,
+                EXERCISE_CATEGORY_ACTIVE,
+                getValidCompletionGoal(),
+            )
+            .build()
+    }
+
+    private fun getValidCompletionGoal(): ExerciseCompletionGoal {
+        return ExerciseCompletionGoal.StepsGoal(Random.nextInt(100, 500))
+    }
+
+    private fun getSpeedRecord(speed: List<SpeedRecordSample>, time: Instant): SpeedRecord {
+        return SpeedRecord.Builder(getMetaData(context), time, time.plusSeconds(1000), speed)
+            .build()
+    }
+
+    private fun getValidSpeedData(): Velocity {
+        return Velocity.fromMetersPerSecond(Random.nextInt(1, 10).toDouble())
+    }
+
+    private fun getPowerRecord(power: List<PowerRecordSample>, time: Instant): PowerRecord {
+        return PowerRecord.Builder(getMetaData(context), time, time.plusSeconds(1000), power)
+            .build()
+    }
+
+    private fun getValidPowerData(): Power {
+        return Power.fromWatts(Random.nextInt(150, 400).toDouble())
+    }
+
+    private fun getCyclingPedalingCadenceRecord(
+        cyclingCadenceSample: List<CyclingPedalingCadenceRecordSample>,
+        time: Instant,
+    ): CyclingPedalingCadenceRecord {
+        return CyclingPedalingCadenceRecord.Builder(
+                getMetaData(context),
+                time,
+                time.plusSeconds(1000),
+                cyclingCadenceSample,
+            )
+            .build()
+    }
+
+    private fun getFloorsClimbedRecord(floors: Double, time: Instant): FloorsClimbedRecord {
+        return FloorsClimbedRecord.Builder(getMetaData(context), time, time.plusSeconds(30), floors)
+            .build()
+    }
+
+    private fun getTotalCaloriesBurnedRecord(
+        energy: Energy,
+        time: Instant,
+    ): TotalCaloriesBurnedRecord {
+        return TotalCaloriesBurnedRecord.Builder(
+                getMetaData(context),
+                time,
+                time.plusSeconds(30),
+                energy,
+            )
+            .build()
+    }
+
+    private fun getWheelchairPushesRecord(count: Long, time: Instant): WheelchairPushesRecord {
+        return WheelchairPushesRecord.Builder(
+                getMetaData(context),
+                time,
+                time.plusSeconds(30),
+                count,
+            )
+            .build()
+    }
+
+    private fun getVo2MaxRecord(
+        measurementMethod: Int,
+        vo2Max: Double,
+        time: Instant,
+    ): Vo2MaxRecord {
+        return Vo2MaxRecord.Builder(getMetaData(context), time, measurementMethod, vo2Max).build()
+    }
+
+    private fun getValidVo2MeasurementMethod(): Int {
+        return VALID_VO2_MEASUREMENT_METHOD.random()
+    }
+
+    private fun getStepsCadenceRecord(
+        stepsCadenceRecordSample: List<StepsCadenceRecordSample>,
+        time: Instant,
+    ): StepsCadenceRecord {
+        return StepsCadenceRecord.Builder(
+                getMetaData(context),
+                time,
+                time.plusSeconds(1000),
+                stepsCadenceRecordSample,
+            )
+            .build()
+    }
+
+    private fun getValidDoubleData(min: Int, max: Int): Double {
+        return Random.nextInt(min, max).toDouble()
+    }
+}
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedBodyMeasurementsData.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedBodyMeasurementsData.kt
new file mode 100644
index 0000000..3ef16de
--- /dev/null
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedBodyMeasurementsData.kt
@@ -0,0 +1,252 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.testapps.toolbox.seed
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.BasalMetabolicRateRecord
+import android.health.connect.datatypes.BodyFatRecord
+import android.health.connect.datatypes.BodyWaterMassRecord
+import android.health.connect.datatypes.BoneMassRecord
+import android.health.connect.datatypes.DataOrigin
+import android.health.connect.datatypes.Device
+import android.health.connect.datatypes.HeightRecord
+import android.health.connect.datatypes.LeanBodyMassRecord
+import android.health.connect.datatypes.Metadata
+import android.health.connect.datatypes.WeightRecord
+import android.health.connect.datatypes.units.Length
+import android.health.connect.datatypes.units.Mass
+import android.health.connect.datatypes.units.Percentage
+import android.health.connect.datatypes.units.Power
+import android.os.Build.MANUFACTURER
+import android.os.Build.MODEL
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.getMetaData
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.insertRecords
+import kotlinx.coroutines.runBlocking
+import java.time.Duration.ofDays
+import java.time.Duration.ofMinutes
+import java.time.Instant
+import java.time.temporal.ChronoUnit
+import kotlin.random.Random
+
+class SeedBodyMeasurementsData(private val context: Context, private val manager: HealthConnectManager)  {
+
+    private val start = Instant.now().truncatedTo(ChronoUnit.DAYS)
+    private val yesterday = start.minus(ofDays(1))
+    private val lastWeek = start.minus(ofDays(7))
+    private val lastMonth = start.minus(ofDays(31))
+
+    fun seedBodyMeasurementsData(){
+        runBlocking {
+            try {
+                seedBodyFatRecord()
+                seedBodyWaterMassRecord()
+                seedHeightRecord()
+                seedBoneMassRecord()
+                seedLeanBodyMassRecord()
+                seedBasalMetabolicRate()
+                seedWeightRecord()
+
+            } catch (ex: Exception) {
+                throw ex
+            }
+        }
+    }
+
+    private suspend fun seedBodyFatRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getBodyFatRecord(getValidBodyFatPercentage(), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getBodyFatRecord(getValidBodyFatPercentage(), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getBodyFatRecord(getValidBodyFatPercentage(), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getBodyFatRecord(getValidBodyFatPercentage(), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedBodyWaterMassRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getBodyWaterMassRecord(getValidMassData(20000, 45000), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getBodyWaterMassRecord(getValidMassData(20000, 45000), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getBodyWaterMassRecord(getValidMassData(20000, 45000), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getBodyWaterMassRecord(getValidMassData(20000, 45000), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedBoneMassRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getBoneMassRecord(getValidMassData(5000, 11000), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getBoneMassRecord(getValidMassData(5000, 11000), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getBoneMassRecord(getValidMassData(5000, 11000), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getBoneMassRecord(getValidMassData(5000, 11000), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedHeightRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getHeightRecord(getValidHeightData(), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getHeightRecord(getValidHeightData(), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getHeightRecord(getValidHeightData(), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getHeightRecord(getValidHeightData(), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedBasalMetabolicRate(){
+        val records = (1L..3).map { timeOffSet ->
+            getBasalMetabolicRateRecord(getValidBasalMetabolicRateData(), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getBasalMetabolicRateRecord(getValidBasalMetabolicRateData(), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getBasalMetabolicRateRecord(getValidBasalMetabolicRateData(), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getBasalMetabolicRateRecord(getValidBasalMetabolicRateData(), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedLeanBodyMassRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getLeanBodyMassRecord(getValidMassData(45000, 90000), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getLeanBodyMassRecord(getValidMassData(45000, 90000), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getLeanBodyMassRecord(getValidMassData(45000, 90000), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getLeanBodyMassRecord(getValidMassData(45000, 90000), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedWeightRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getWeightRecord(getValidMassData(45000, 90000), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getWeightRecord(getValidMassData(45000, 90000), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getWeightRecord(getValidMassData(45000, 90000), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getWeightRecord(getValidMassData(45000, 90000), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private fun getBodyFatRecord(percentage: Percentage, time: Instant): BodyFatRecord {
+        return BodyFatRecord.Builder(getMetaData(context), time, percentage).build()
+    }
+
+    private fun getValidBodyFatPercentage(): Percentage {
+        return Percentage.fromValue(Random.nextInt(10, 25).toDouble())
+    }
+
+    private fun getBodyWaterMassRecord(bodyWaterMass: Mass, time: Instant): BodyWaterMassRecord {
+        return BodyWaterMassRecord.Builder(getMetaData(context), time, bodyWaterMass).build()
+    }
+
+    private fun getValidMassData(min: Int, max: Int): Mass {
+        return Mass.fromGrams(Random.nextInt(min, max).toDouble())
+    }
+
+    private fun getBoneMassRecord(mass: Mass, time: Instant): BoneMassRecord {
+        return BoneMassRecord.Builder(getMetaData(context), time, mass).build()
+    }
+
+    private fun getHeightRecord(height: Length, time: Instant): HeightRecord {
+        return HeightRecord.Builder(getMetaData(context), time, height).build()
+    }
+
+    private fun getValidHeightData(): Length {
+        return Length.fromMeters(Random.nextDouble(1.6, 1.8))
+    }
+
+    private fun getLeanBodyMassRecord(mass: Mass, time: Instant): LeanBodyMassRecord {
+        return LeanBodyMassRecord.Builder(getMetaData(context), time, mass).build()
+    }
+
+    private fun getWeightRecord(weight: Mass, time: Instant): WeightRecord {
+        return WeightRecord.Builder(getMetaData(context), time, weight).build()
+    }
+
+    private fun getBasalMetabolicRateRecord(basalMetabolicRate: Power, time: Instant): BasalMetabolicRateRecord {
+        return BasalMetabolicRateRecord.Builder(getMetaData(context), time, basalMetabolicRate).build()
+    }
+
+    private fun getValidBasalMetabolicRateData() : Power {
+        return Power.fromWatts(Random.nextInt(65, 80).toDouble())
+    }
+}
\ No newline at end of file
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedCycleTrackingData.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedCycleTrackingData.kt
new file mode 100644
index 0000000..a402f6b
--- /dev/null
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedCycleTrackingData.kt
@@ -0,0 +1,261 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.testapps.toolbox.seed
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.CervicalMucusRecord
+import android.health.connect.datatypes.CervicalMucusRecord.CervicalMucusAppearance
+import android.health.connect.datatypes.CervicalMucusRecord.CervicalMucusSensation
+import android.health.connect.datatypes.DataOrigin
+import android.health.connect.datatypes.Device
+import android.health.connect.datatypes.IntermenstrualBleedingRecord
+import android.health.connect.datatypes.MenstruationFlowRecord
+import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType
+import android.health.connect.datatypes.MenstruationPeriodRecord
+import android.health.connect.datatypes.Metadata
+import android.health.connect.datatypes.OvulationTestRecord
+import android.health.connect.datatypes.OvulationTestRecord.OvulationTestResult
+import android.health.connect.datatypes.SexualActivityRecord
+import android.health.connect.datatypes.SexualActivityRecord.SexualActivityProtectionUsed
+import android.os.Build.MANUFACTURER
+import android.os.Build.MODEL
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.getMetaData
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.insertRecords
+import kotlinx.coroutines.runBlocking
+import java.time.Duration.ofDays
+import java.time.Duration.ofMinutes
+import java.time.Instant
+import java.time.temporal.ChronoUnit
+
+class SeedCycleTrackingData(private val context: Context, private val manager: HealthConnectManager) {
+
+    companion object {
+        val VALID_CERVICAL_MUCUS_SENSATION =
+            setOf(
+                CervicalMucusSensation.SENSATION_LIGHT,
+                CervicalMucusSensation.SENSATION_MEDIUM,
+                CervicalMucusSensation.SENSATION_HEAVY,
+                CervicalMucusSensation.SENSATION_UNKNOWN
+            )
+        val VALID_CERVICAL_MUCUS_APPEARANCE =
+            setOf(
+                CervicalMucusAppearance.APPEARANCE_DRY,
+                CervicalMucusAppearance.APPEARANCE_CREAMY,
+                CervicalMucusAppearance.APPEARANCE_STICKY,
+                CervicalMucusAppearance.APPEARANCE_WATERY,
+                CervicalMucusAppearance.APPEARANCE_EGG_WHITE,
+                CervicalMucusAppearance.APPEARANCE_UNUSUAL,
+                CervicalMucusAppearance.APPEARANCE_UNKNOWN
+            )
+        val VALID_MENSTRUATION_FLOW_TYPE =
+            setOf(
+                MenstruationFlowType.FLOW_LIGHT,
+                MenstruationFlowType.FLOW_MEDIUM,
+                MenstruationFlowType.FLOW_HEAVY,
+                MenstruationFlowType.FLOW_UNKNOWN
+            )
+        val VALID_OVULATION_TEST_RESULT =
+            setOf(
+                OvulationTestResult.RESULT_NEGATIVE,
+                OvulationTestResult.RESULT_POSITIVE,
+                OvulationTestResult.RESULT_HIGH,
+                OvulationTestResult.RESULT_INCONCLUSIVE
+            )
+        val VALID_SEXUAL_ACTIVITY_PROTECTION_USED =
+            setOf(
+                SexualActivityProtectionUsed.PROTECTION_USED_UNKNOWN,
+                SexualActivityProtectionUsed.PROTECTION_USED_PROTECTED,
+                SexualActivityProtectionUsed.PROTECTION_USED_UNPROTECTED
+            )
+    }
+
+    private val start = Instant.now().truncatedTo(ChronoUnit.DAYS)
+    private val yesterday = start.minus(ofDays(1))
+    private val lastWeek = start.minus(ofDays(7))
+    private val lastMonth = start.minus(ofDays(31))
+
+    fun seedCycleTrackingData(){
+        runBlocking {
+            try {
+                seedAllMenstruationData()
+                seedCervicalMucusRecord()
+                seedOvulationTestRecord()
+                seedSexualActivityRecord()
+                seedIntermenstrualBleedingRecord()
+            } catch (ex: Exception) {
+                throw ex
+            }
+        }
+    }
+
+    private suspend fun seedAllMenstruationData(){
+        val todayPeriodRecord =
+            getMenstruationPeriodRecord(
+                start.minus(ofDays(5L)),
+                start)
+        val lastWeekPeriodRecord =
+            getMenstruationPeriodRecord(
+                lastWeek.minus(ofDays(1L)),
+                lastWeek.plus(ofDays(4)))
+        val lastMonthPeriodRecord =
+            getMenstruationPeriodRecord(
+                lastMonth.minus(ofDays(1L)),
+                lastMonth.plus(ofDays(10L)))
+
+        val todayFlowRecords =
+            (-5..0).map { days ->
+                getMenstruationFlowRecord(start.plus(ofDays(days.toLong())))
+            }
+        val lastWeekFlowRecords =
+            (-1..4).map { days ->
+                getMenstruationFlowRecord(lastWeek.plus(ofDays(days.toLong())))
+            }
+        val lastMonthFlowRecords =
+            (-1..10).map { days ->
+                getMenstruationFlowRecord(lastMonth.plus(ofDays(days.toLong())))
+            }
+
+        insertRecords(
+            buildList {
+                add(todayPeriodRecord)
+                addAll(todayFlowRecords)
+            },
+            manager)
+        insertRecords(
+            buildList {
+                add(lastWeekPeriodRecord)
+                addAll(lastWeekFlowRecords)
+            },
+            manager)
+        insertRecords(
+            buildList {
+                add(lastMonthPeriodRecord)
+                addAll(lastMonthFlowRecords)
+            },
+            manager
+        )
+    }
+
+    private suspend fun seedCervicalMucusRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getCervicalMucusRecord(start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getCervicalMucusRecord(yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getCervicalMucusRecord(lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getCervicalMucusRecord(lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedOvulationTestRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getOvulationTestRecord(start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getOvulationTestRecord(yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getOvulationTestRecord(lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getOvulationTestRecord(lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedSexualActivityRecord() {
+        val records = (1L..3).map { timeOffSet ->
+            getSexualActivityRecord(start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getSexualActivityRecord(yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getSexualActivityRecord(lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getSexualActivityRecord(lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedIntermenstrualBleedingRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getIntermenstrualBleedingRecord(start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getIntermenstrualBleedingRecord(yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getIntermenstrualBleedingRecord(lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getIntermenstrualBleedingRecord(lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private fun getMenstruationPeriodRecord(start: Instant, end:Instant): MenstruationPeriodRecord{
+        return MenstruationPeriodRecord.Builder(getMetaData(context), start, end).build()
+    }
+
+    private fun getMenstruationFlowRecord(time: Instant): MenstruationFlowRecord{
+        return MenstruationFlowRecord.Builder(getMetaData(context), time, VALID_MENSTRUATION_FLOW_TYPE.random()).build()
+    }
+
+    private fun getCervicalMucusRecord(time: Instant): CervicalMucusRecord {
+        return CervicalMucusRecord.Builder(
+            getMetaData(context),
+            time,
+            VALID_CERVICAL_MUCUS_SENSATION.random(),
+            VALID_CERVICAL_MUCUS_APPEARANCE.random()
+        ).build()
+    }
+
+    private fun getOvulationTestRecord(time: Instant): OvulationTestRecord {
+        return OvulationTestRecord.Builder(getMetaData(context), time, VALID_OVULATION_TEST_RESULT.random()).build()
+    }
+
+    private fun getSexualActivityRecord(time: Instant): SexualActivityRecord {
+        return SexualActivityRecord.Builder(getMetaData(context), time, VALID_SEXUAL_ACTIVITY_PROTECTION_USED.random()).build()
+    }
+
+    private fun getIntermenstrualBleedingRecord(time: Instant): IntermenstrualBleedingRecord {
+        return IntermenstrualBleedingRecord.Builder(getMetaData(context), time).build()
+    }
+}
\ No newline at end of file
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedData.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedData.kt
index 031e7c9..ca1801c 100644
--- a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedData.kt
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedData.kt
@@ -17,27 +17,24 @@
 
 import android.content.Context
 import android.health.connect.HealthConnectManager
-import android.health.connect.datatypes.DataOrigin
-import android.health.connect.datatypes.Device
 import android.health.connect.datatypes.HeartRateRecord
 import android.health.connect.datatypes.MenstruationFlowRecord
 import android.health.connect.datatypes.MenstruationFlowRecord.MenstruationFlowType
 import android.health.connect.datatypes.MenstruationPeriodRecord
-import android.health.connect.datatypes.Metadata
 import android.health.connect.datatypes.SkinTemperatureRecord
 import android.health.connect.datatypes.StepsRecord
 import android.health.connect.datatypes.units.Temperature
 import android.health.connect.datatypes.units.TemperatureDelta
-import android.os.Build.MANUFACTURER
-import android.os.Build.MODEL
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.getMetaData
 import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.insertRecords
+import kotlinx.coroutines.runBlocking
 import java.time.Duration.ofDays
 import java.time.Duration.ofMinutes
 import java.time.Instant
 import java.time.temporal.ChronoUnit
 import java.util.Random
 import kotlin.random.Random as ktRandom
-import kotlinx.coroutines.runBlocking
+
 
 class SeedData(private val context: Context, private val manager: HealthConnectManager) {
 
@@ -64,6 +61,20 @@
         }
     }
 
+    fun seedAllData(){
+        try {
+            SeedActivityData(context, manager).seedActivityData()
+            SeedBodyMeasurementsData(context, manager).seedBodyMeasurementsData()
+            SeedCycleTrackingData(context, manager).seedCycleTrackingData()
+            SeedNutritionData(context, manager).seedNutritionData()
+            SeedSleepData(context, manager).seedSleepCategoryData()
+            SeedVitalsData(context, manager).seedVitalsData()
+            SeedWellnessData(context, manager).seedWellnessData()
+        }catch (ex: Exception) {
+            throw ex
+        }
+    }
+
     private suspend fun seedStepsData() {
         val start = Instant.now().truncatedTo(ChronoUnit.DAYS)
         val records = (1L..50).map { count -> getStepsRecord(count, start.plus(ofMinutes(count))) }
@@ -74,11 +85,11 @@
     private suspend fun seedMenstruationData() {
         val today = Instant.now()
         val periodRecord =
-            MenstruationPeriodRecord.Builder(getMetaData(), today.minus(ofDays(5L)), today).build()
+            MenstruationPeriodRecord.Builder(getMetaData(context), today.minus(ofDays(5L)), today).build()
         val flowRecords =
             (-5..0).map { days ->
                 MenstruationFlowRecord.Builder(
-                        getMetaData(),
+                        getMetaData(context),
                         today.plus(ofDays(days.toLong())),
                         MenstruationFlowType.FLOW_MEDIUM)
                     .build()
@@ -132,7 +143,7 @@
         startTime: Instant,
         endTime: Instant
     ): SkinTemperatureRecord {
-        return SkinTemperatureRecord.Builder(getMetaData(), startTime, endTime)
+        return SkinTemperatureRecord.Builder(getMetaData(context), startTime, endTime)
             .setDeltas(deltasList)
             .setBaseline(Temperature.fromCelsius(25.0))
             .setMeasurementLocation(VALID_READING_LOCATIONS.random())
@@ -149,7 +160,7 @@
         end: Instant,
     ): HeartRateRecord {
         return HeartRateRecord.Builder(
-                getMetaData(),
+                getMetaData(context),
                 start,
                 end,
                 heartRateValues.map { HeartRateRecord.HeartRateSample(it.first, it.second) })
@@ -161,13 +172,8 @@
     }
 
     private fun getStepsRecord(count: Long, time: Instant): StepsRecord {
-        return StepsRecord.Builder(getMetaData(), time, time.plusSeconds(30), count).build()
-    }
-
-    private fun getMetaData(): Metadata {
-        val device: Device =
-            Device.Builder().setManufacturer(MANUFACTURER).setModel(MODEL).setType(1).build()
-        val dataOrigin = DataOrigin.Builder().setPackageName(context.packageName).build()
-        return Metadata.Builder().setDevice(device).setDataOrigin(dataOrigin).build()
+        return StepsRecord.Builder(getMetaData(context), time, time.plusSeconds(30), count).build()
     }
 }
+
+
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedNutritionData.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedNutritionData.kt
new file mode 100644
index 0000000..3bcdeef
--- /dev/null
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedNutritionData.kt
@@ -0,0 +1,106 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.testapps.toolbox.seed
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.DataOrigin
+import android.health.connect.datatypes.Device
+import android.health.connect.datatypes.HydrationRecord
+import android.health.connect.datatypes.Metadata
+import android.health.connect.datatypes.NutritionRecord
+import android.health.connect.datatypes.units.Volume
+import android.os.Build.MANUFACTURER
+import android.os.Build.MODEL
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.getMetaData
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.insertRecords
+import kotlinx.coroutines.runBlocking
+import java.time.Duration.ofDays
+import java.time.Duration.ofMinutes
+import java.time.Instant
+import java.time.temporal.ChronoUnit
+import kotlin.random.Random
+
+class SeedNutritionData(private val context: Context, private val manager: HealthConnectManager) {
+
+    private val start = Instant.now().truncatedTo(ChronoUnit.DAYS)
+    private val yesterday = start.minus(ofDays(1))
+    private val lastWeek = start.minus(ofDays(7))
+    private val lastMonth = start.minus(ofDays(31))
+
+    fun seedNutritionData(){
+        runBlocking {
+            try {
+                seedNutritionRecord()
+                seedHydrationRecord()
+            } catch (ex: Exception) {
+                throw ex
+            }
+        }
+    }
+
+    private suspend fun seedNutritionRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getNutritionRecord(start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getNutritionRecord(yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getNutritionRecord(lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getNutritionRecord(lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedHydrationRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getHydrationRecord(getValidVolumeData(), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getHydrationRecord(getValidVolumeData(), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getHydrationRecord(getValidVolumeData(), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getHydrationRecord(getValidVolumeData(), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private fun getNutritionRecord(time: Instant): NutritionRecord {
+        return NutritionRecord.Builder(getMetaData(context), time, time.plusSeconds(30)).build()
+    }
+
+    private fun getHydrationRecord(volume: Volume, time: Instant): HydrationRecord {
+        return HydrationRecord.Builder(getMetaData(context), time, time.plusSeconds(30), volume).build()
+    }
+
+    private fun getValidVolumeData(): Volume {
+        return Volume.fromLiters(Random.nextDouble(0.1, 4.0).toDouble())
+    }
+}
\ No newline at end of file
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedSleepData.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedSleepData.kt
new file mode 100644
index 0000000..0191c78
--- /dev/null
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedSleepData.kt
@@ -0,0 +1,74 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.testapps.toolbox.seed
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.DataOrigin
+import android.health.connect.datatypes.Device
+import android.health.connect.datatypes.Metadata
+import android.health.connect.datatypes.SleepSessionRecord
+import android.os.Build.MANUFACTURER
+import android.os.Build.MODEL
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.getMetaData
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.insertRecords
+import kotlinx.coroutines.runBlocking
+import java.time.Duration.ofDays
+import java.time.Duration.ofHours
+import java.time.Instant
+import java.time.temporal.ChronoUnit
+
+class SeedSleepData(private val context: Context, private val manager: HealthConnectManager) {
+
+    private val start = Instant.now().truncatedTo(ChronoUnit.DAYS)
+    private val yesterday = start.minus(ofDays(1))
+    private val lastWeek = start.minus(ofDays(7))
+    private val lastMonth = start.minus(ofDays(31))
+
+    fun seedSleepCategoryData(){
+        runBlocking {
+            try {
+                seedSleepData()
+            } catch (ex: Exception) {
+                throw ex
+            }
+        }
+    }
+
+    private suspend fun seedSleepData(){
+        val records = (1L..2).map { timeOffSet ->
+            getSleepSessionRecord(start.plus(ofHours(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..2).map { timeOffSet ->
+            getSleepSessionRecord(yesterday.plus(ofHours(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..2).map { timeOffSet ->
+            getSleepSessionRecord(lastWeek.plus(ofHours(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..2).map { timeOffSet ->
+            getSleepSessionRecord(lastMonth.plus(ofHours(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private fun getSleepSessionRecord(time: Instant): SleepSessionRecord {
+        return SleepSessionRecord.Builder(getMetaData(context), time, time.plusSeconds(1800)).build()
+    }
+}
\ No newline at end of file
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedVitalsData.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedVitalsData.kt
new file mode 100644
index 0000000..03ba766
--- /dev/null
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedVitalsData.kt
@@ -0,0 +1,571 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.testapps.toolbox.seed
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.BasalBodyTemperatureRecord
+import android.health.connect.datatypes.BloodGlucoseRecord
+import android.health.connect.datatypes.BloodGlucoseRecord.RelationToMealType
+import android.health.connect.datatypes.BloodGlucoseRecord.SpecimenSource
+import android.health.connect.datatypes.BloodPressureRecord
+import android.health.connect.datatypes.BloodPressureRecord.BloodPressureMeasurementLocation
+import android.health.connect.datatypes.BloodPressureRecord.BodyPosition
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_EAR
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_FINGER
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_FOREHEAD
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_MOUTH
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_RECTUM
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_TEMPORAL_ARTERY
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_TOE
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_UNKNOWN
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_VAGINA
+import android.health.connect.datatypes.BodyTemperatureMeasurementLocation.MEASUREMENT_LOCATION_WRIST
+import android.health.connect.datatypes.BodyTemperatureRecord
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.HeartRateVariabilityRmssdRecord
+import android.health.connect.datatypes.MealType
+import android.health.connect.datatypes.OxygenSaturationRecord
+import android.health.connect.datatypes.RespiratoryRateRecord
+import android.health.connect.datatypes.RestingHeartRateRecord
+import android.health.connect.datatypes.SkinTemperatureRecord
+import android.health.connect.datatypes.units.BloodGlucose
+import android.health.connect.datatypes.units.Percentage
+import android.health.connect.datatypes.units.Pressure
+import android.health.connect.datatypes.units.Temperature
+import android.health.connect.datatypes.units.TemperatureDelta
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.getMetaData
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.insertRecords
+import kotlinx.coroutines.runBlocking
+import java.time.Duration.ofDays
+import java.time.Duration.ofMinutes
+import java.time.Instant
+import java.time.temporal.ChronoUnit
+import java.util.Random
+import kotlin.random.Random as ktRandom
+
+class SeedVitalsData(private val context: Context, private val manager: HealthConnectManager) {
+
+    companion object {
+        val VALID_SKIN_TEMP_READING_LOCATIONS =
+            setOf(
+                SkinTemperatureRecord.MEASUREMENT_LOCATION_FINGER,
+                SkinTemperatureRecord.MEASUREMENT_LOCATION_TOE,
+                SkinTemperatureRecord.MEASUREMENT_LOCATION_WRIST,
+                SkinTemperatureRecord.MEASUREMENT_LOCATION_UNKNOWN)
+        val VALID_BODY_TEMPERATURE_MEASUREMENT_LOCATIONS =
+            setOf(
+                MEASUREMENT_LOCATION_EAR,
+                MEASUREMENT_LOCATION_FINGER,
+                MEASUREMENT_LOCATION_FOREHEAD,
+                MEASUREMENT_LOCATION_MOUTH,
+                MEASUREMENT_LOCATION_RECTUM,
+                MEASUREMENT_LOCATION_TEMPORAL_ARTERY,
+                MEASUREMENT_LOCATION_TOE,
+                MEASUREMENT_LOCATION_UNKNOWN,
+                MEASUREMENT_LOCATION_VAGINA,
+                MEASUREMENT_LOCATION_WRIST
+            )
+        val VALID_SPECIMEN_SOURCE =
+            setOf(
+                SpecimenSource.SPECIMEN_SOURCE_TEARS,
+                SpecimenSource.SPECIMEN_SOURCE_PLASMA,
+                SpecimenSource.SPECIMEN_SOURCE_UNKNOWN,
+                SpecimenSource.SPECIMEN_SOURCE_WHOLE_BLOOD,
+                SpecimenSource.SPECIMEN_SOURCE_SERUM,
+                SpecimenSource.SPECIMEN_SOURCE_INTERSTITIAL_FLUID,
+                SpecimenSource.SPECIMEN_SOURCE_CAPILLARY_BLOOD
+            )
+        val VALID_RELATION_TO_MEAL_TYPE =
+            setOf(
+                RelationToMealType.RELATION_TO_MEAL_AFTER_MEAL,
+                RelationToMealType.RELATION_TO_MEAL_BEFORE_MEAL,
+                RelationToMealType.RELATION_TO_MEAL_GENERAL,
+                RelationToMealType.RELATION_TO_MEAL_FASTING,
+                RelationToMealType.RELATION_TO_MEAL_UNKNOWN
+            )
+        val VALID_MEAL_TYPE =
+            setOf(
+                MealType.MEAL_TYPE_BREAKFAST,
+                MealType.MEAL_TYPE_LUNCH,
+                MealType.MEAL_TYPE_SNACK,
+                MealType.MEAL_TYPE_DINNER,
+                MealType.MEAL_TYPE_UNKNOWN
+            )
+        val VALID_BLOOD_PRESSURE_MEASUREMENT_LOCATION =
+            setOf(
+                BloodPressureMeasurementLocation.BLOOD_PRESSURE_MEASUREMENT_LOCATION_LEFT_WRIST,
+                BloodPressureMeasurementLocation.BLOOD_PRESSURE_MEASUREMENT_LOCATION_RIGHT_WRIST,
+                BloodPressureMeasurementLocation.BLOOD_PRESSURE_MEASUREMENT_LOCATION_LEFT_UPPER_ARM,
+                BloodPressureMeasurementLocation.BLOOD_PRESSURE_MEASUREMENT_LOCATION_RIGHT_UPPER_ARM,
+                BloodPressureMeasurementLocation.BLOOD_PRESSURE_MEASUREMENT_LOCATION_UNKNOWN
+            )
+        val VALID_BODY_POSITION =
+            setOf(
+                BodyPosition.BODY_POSITION_UNKNOWN,
+                BodyPosition.BODY_POSITION_STANDING_UP,
+                BodyPosition.BODY_POSITION_RECLINING,
+                BodyPosition.BODY_POSITION_LYING_DOWN,
+                BodyPosition.BODY_POSITION_SITTING_DOWN
+            )
+    }
+
+    private val start = Instant.now().truncatedTo(ChronoUnit.DAYS)
+    private val yesterday = start.minus(ofDays(1))
+    private val lastWeek = start.minus(ofDays(7))
+    private val lastMonth = start.minus(ofDays(31))
+
+    fun seedVitalsData(){
+        runBlocking {
+            try {
+                seedHeartRateData()
+                seedSkinTemperatureData()
+                seedBasalBodyTemperatureRecord()
+                seedBloodGlucoseRecord()
+                seedBloodPressureRecord()
+                seedBodyTemperatureRecord()
+                seedHeartRateVariabilityRmssdRecord()
+                seedOxygenSaturationRecord()
+                seedRespiratoryRecord()
+                seedRestingHeartRateRecord()
+            } catch (ex: Exception) {
+                throw ex
+            }
+        }
+    }
+
+    private suspend fun seedHeartRateData() {
+        val random = Random()
+        val records =
+            (1L..10).map { timeOffset ->
+                val hrSamples = ArrayList<Pair<Long, Instant>>()
+                repeat(10) { i ->
+                    hrSamples.add(
+                        Pair(getValidHeartRate(random), start.plus(ofMinutes(timeOffset + i))))
+                }
+                getHeartRateRecord(
+                    hrSamples,
+                    start.plus(ofMinutes(timeOffset)),
+                    start.plus(ofMinutes(timeOffset + 100)))
+            }
+
+        val yesterdayRecords =
+            (1L..3).map { timeOffset ->
+                val hrSamples = ArrayList<Pair<Long, Instant>>()
+                repeat(10) { i ->
+                    hrSamples.add(
+                        Pair(getValidHeartRate(random), yesterday.plus(ofMinutes(timeOffset + i))))
+                }
+                getHeartRateRecord(
+                    hrSamples,
+                    yesterday.plus(ofMinutes(timeOffset)),
+                    yesterday.plus(ofMinutes(timeOffset + 100)))
+            }
+
+        val lastWeekRecords =
+            (1L..3).map { timeOffset ->
+                val hrSamples = ArrayList<Pair<Long, Instant>>()
+                repeat(10) { i ->
+                    hrSamples.add(
+                        Pair(getValidHeartRate(random), lastWeek.plus(ofMinutes(timeOffset + i))))
+                }
+                getHeartRateRecord(
+                    hrSamples,
+                    lastWeek.plus(ofMinutes(timeOffset)),
+                    start.plus(ofMinutes(timeOffset + 100)))
+            }
+
+        val lastMonthRecords =
+            (1L..3).map { timeOffset ->
+                val hrSamples = ArrayList<Pair<Long, Instant>>()
+                repeat(10) { i ->
+                    hrSamples.add(
+                        Pair(getValidHeartRate(random), lastMonth.plus(ofMinutes(timeOffset + i))))
+                }
+                getHeartRateRecord(
+                    hrSamples,
+                    lastMonth.plus(ofMinutes(timeOffset)),
+                    lastMonth.plus(ofMinutes(timeOffset + 100)))
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedSkinTemperatureData() {
+        val records =
+            (1L..10).map { timeOffset ->
+                val skinTempSamples = ArrayList<SkinTemperatureRecord.Delta>()
+                repeat(10) { i ->
+                    skinTempSamples.add(
+                        SkinTemperatureRecord.Delta(
+                            getValidTemperatureDelta(), start.plus(ofMinutes(timeOffset + i))))
+                }
+                getSkinTemperatureRecord(
+                    skinTempSamples,
+                    start.plus(ofMinutes(timeOffset)),
+                    start.plus(ofMinutes(timeOffset + 100)))
+            }
+        val yesterdayRecords =
+            (1L..3).map { timeOffset ->
+                val skinTempSamples = ArrayList<SkinTemperatureRecord.Delta>()
+                repeat(10) { i ->
+                    skinTempSamples.add(
+                        SkinTemperatureRecord.Delta(
+                            getValidTemperatureDelta(), yesterday.plus(ofMinutes(timeOffset + i))))
+                }
+                getSkinTemperatureRecord(
+                    skinTempSamples,
+                    yesterday.plus(ofMinutes(timeOffset)),
+                    yesterday.plus(ofMinutes(timeOffset + 100)))
+            }
+        val lastWeekRecords =
+            (1L..3).map { timeOffset ->
+                val skinTempSamples = ArrayList<SkinTemperatureRecord.Delta>()
+                repeat(10) { i ->
+                    skinTempSamples.add(
+                        SkinTemperatureRecord.Delta(
+                            getValidTemperatureDelta(), lastWeek.plus(ofMinutes(timeOffset + i))))
+                }
+                getSkinTemperatureRecord(
+                    skinTempSamples,
+                    lastWeek.plus(ofMinutes(timeOffset)),
+                    lastWeek.plus(ofMinutes(timeOffset + 100)))
+            }
+        val lastMonthRecords =
+            (1L..3).map { timeOffset ->
+                val skinTempSamples = ArrayList<SkinTemperatureRecord.Delta>()
+                repeat(10) { i ->
+                    skinTempSamples.add(
+                        SkinTemperatureRecord.Delta(
+                            getValidTemperatureDelta(), lastMonth.plus(ofMinutes(timeOffset + i))))
+                }
+                getSkinTemperatureRecord(
+                    skinTempSamples,
+                    lastMonth.plus(ofMinutes(timeOffset)),
+                    lastMonth.plus(ofMinutes(timeOffset + 100)))
+            }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedBasalBodyTemperatureRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getBasalBodyTemperatureRecord(getValidBodyTemperature(), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getBasalBodyTemperatureRecord(getValidBodyTemperature(), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getBasalBodyTemperatureRecord(getValidBodyTemperature(), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getBasalBodyTemperatureRecord(getValidBodyTemperature(), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedBloodGlucoseRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getBloodGlucoseRecord(
+                getValidBloodGlucoseLevel(),
+                start.plus(ofMinutes(timeOffSet))
+            )
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getBloodGlucoseRecord(
+
+                getValidBloodGlucoseLevel(),
+
+
+                yesterday.plus(ofMinutes(timeOffSet))
+            )
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getBloodGlucoseRecord(
+                getValidBloodGlucoseLevel(),
+                lastWeek.plus(ofMinutes(timeOffSet))
+            )
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getBloodGlucoseRecord(
+                getValidBloodGlucoseLevel(),
+                lastMonth.plus(ofMinutes(timeOffSet))
+            )
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedBloodPressureRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getBloodPressureRecord(
+                getValidSystolicData(),
+                getValidDiastolicData(),
+                start.plus(ofMinutes(timeOffSet))
+            )
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getBloodPressureRecord(
+                getValidSystolicData(),
+                getValidDiastolicData(),
+                yesterday.plus(ofMinutes(timeOffSet))
+            )
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getBloodPressureRecord(
+                getValidSystolicData(),
+                getValidDiastolicData(),
+                lastWeek.plus(ofMinutes(timeOffSet))
+            )
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getBloodPressureRecord(
+                getValidSystolicData(),
+                getValidDiastolicData(),
+                lastMonth.plus(ofMinutes(timeOffSet))
+            )
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedBodyTemperatureRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getBodyTemperatureRecord(getValidBodyTemperature(), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getBodyTemperatureRecord(getValidBodyTemperature(), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getBodyTemperatureRecord(getValidBodyTemperature(), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getBodyTemperatureRecord(getValidBodyTemperature(), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedHeartRateVariabilityRmssdRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getHeartRateVariabilityRmssdRecord(getValidRateData(20, 80), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getHeartRateVariabilityRmssdRecord(getValidRateData(20, 80), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getHeartRateVariabilityRmssdRecord(getValidRateData(20, 80), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getHeartRateVariabilityRmssdRecord(getValidRateData(20, 80), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedOxygenSaturationRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getOxygenSaturationRecord(getValidPercentageData(), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getOxygenSaturationRecord(getValidPercentageData(), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getOxygenSaturationRecord(getValidPercentageData(), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getOxygenSaturationRecord(getValidPercentageData(), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedRespiratoryRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getRespiratoryRateRecord(getValidRateData(10, 30), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getRespiratoryRateRecord(getValidRateData(10, 30), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getRespiratoryRateRecord(getValidRateData(10, 30), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getRespiratoryRateRecord(getValidRateData(10, 30), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private suspend fun seedRestingHeartRateRecord(){
+        val random = Random()
+        val records = (1L..3).map { timeOffSet ->
+            getRestingHeartRateRecord(getValidHeartRate(random), start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getRestingHeartRateRecord(getValidHeartRate(random), yesterday.plus(ofMinutes(timeOffSet)))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getRestingHeartRateRecord(getValidHeartRate(random), lastWeek.plus(ofMinutes(timeOffSet)))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getRestingHeartRateRecord(getValidHeartRate(random), lastMonth.plus(ofMinutes(timeOffSet)))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private fun getSkinTemperatureRecord(
+        deltasList: List<SkinTemperatureRecord.Delta>,
+        startTime: Instant,
+        endTime: Instant
+    ): SkinTemperatureRecord {
+        return SkinTemperatureRecord.Builder(getMetaData(context), startTime, endTime)
+            .setDeltas(deltasList)
+            .setBaseline(Temperature.fromCelsius(25.0))
+            .setMeasurementLocation(VALID_SKIN_TEMP_READING_LOCATIONS.random())
+            .build()
+    }
+
+    private fun getValidTemperatureDelta(): TemperatureDelta {
+        return TemperatureDelta.fromCelsius((ktRandom.nextInt(-30, 30)).toDouble() / 10)
+    }
+
+    private fun getHeartRateRecord(
+        heartRateValues: List<Pair<Long, Instant>>,
+        start: Instant,
+        end: Instant,
+    ): HeartRateRecord {
+        return HeartRateRecord.Builder(
+            getMetaData(context),
+            start,
+            end,
+            heartRateValues.map { HeartRateRecord.HeartRateSample(it.first, it.second) })
+            .build()
+    }
+
+    private fun getValidHeartRate(random: Random): Long {
+        return (random.nextInt(20) + 80).toLong()
+    }
+
+    private fun getBasalBodyTemperatureRecord(bodyTemperature: Temperature, time: Instant): BasalBodyTemperatureRecord {
+        return BasalBodyTemperatureRecord.Builder(
+            getMetaData(context),
+            time,
+            VALID_BODY_TEMPERATURE_MEASUREMENT_LOCATIONS.random(),
+            bodyTemperature
+        ).build()
+    }
+
+    private fun getValidBodyTemperature(): Temperature {
+        return Temperature.fromCelsius(ktRandom.nextInt(30, 40).toDouble())
+    }
+
+    private fun getBloodGlucoseRecord(level: BloodGlucose, time: Instant): BloodGlucoseRecord {
+        return BloodGlucoseRecord.Builder(
+            getMetaData(context),
+            time,
+            VALID_SPECIMEN_SOURCE.random(),
+            level,
+            VALID_RELATION_TO_MEAL_TYPE.random(),
+            VALID_MEAL_TYPE.random()
+        ).build()
+    }
+
+    private fun getValidBloodGlucoseLevel(): BloodGlucose {
+        return BloodGlucose.fromMillimolesPerLiter(ktRandom.nextDouble(3.5, 7.5))
+    }
+
+    private fun getBloodPressureRecord(systolic: Pressure, diastolic: Pressure, time: Instant): BloodPressureRecord {
+        return BloodPressureRecord.Builder(
+            getMetaData(context),
+            time,
+            VALID_BLOOD_PRESSURE_MEASUREMENT_LOCATION.random(),
+            systolic,
+            diastolic,
+            VALID_BODY_POSITION.random()
+        ).build()
+    }
+
+    private fun getValidSystolicData(): Pressure {
+        return Pressure.fromMillimetersOfMercury(ktRandom.nextInt(100, 150).toDouble())
+    }
+
+    private fun getValidDiastolicData(): Pressure {
+        return Pressure.fromMillimetersOfMercury(ktRandom.nextInt(50, 80).toDouble())
+    }
+
+    private fun getBodyTemperatureRecord(bodyTemperature: Temperature, time: Instant): BodyTemperatureRecord {
+        return BodyTemperatureRecord.Builder(getMetaData(context), time, VALID_BODY_TEMPERATURE_MEASUREMENT_LOCATIONS.random(), bodyTemperature).build()
+    }
+
+    private fun getHeartRateVariabilityRmssdRecord(heartRateVariability: Double, time: Instant): HeartRateVariabilityRmssdRecord {
+        return HeartRateVariabilityRmssdRecord.Builder(getMetaData(context), time, heartRateVariability).build()
+    }
+
+
+    private fun getOxygenSaturationRecord(percentage: Percentage, time: Instant): OxygenSaturationRecord {
+        return OxygenSaturationRecord.Builder(getMetaData(context), time, percentage).build()
+    }
+
+    private fun getValidPercentageData(): Percentage {
+        return Percentage.fromValue(ktRandom.nextInt(90, 100).toDouble())
+    }
+
+    private fun getRespiratoryRateRecord(rate: Double, time: Instant): RespiratoryRateRecord {
+        return RespiratoryRateRecord.Builder(getMetaData(context), time, rate).build()
+    }
+
+    private fun getValidRateData(min: Int, max: Int): Double{
+        return ktRandom.nextInt(min, max).toDouble()
+    }
+
+    private fun getRestingHeartRateRecord(beatsPerMinute: Long, time: Instant): RestingHeartRateRecord {
+        return RestingHeartRateRecord.Builder(getMetaData(context), time, beatsPerMinute).build()
+    }
+}
\ No newline at end of file
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedWellnessData.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedWellnessData.kt
new file mode 100644
index 0000000..47d50a4
--- /dev/null
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/seed/SeedWellnessData.kt
@@ -0,0 +1,105 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.testapps.toolbox.seed
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.DataOrigin
+import android.health.connect.datatypes.Device
+import android.health.connect.datatypes.Metadata
+import android.health.connect.datatypes.MindfulnessSessionRecord
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_BREATHING
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_MEDITATION
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_MOVEMENT
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_MUSIC
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_OTHER
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_UNGUIDED
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_UNKNOWN
+import android.os.Build.MANUFACTURER
+import android.os.Build.MODEL
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.getMetaData
+import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.insertRecords
+import kotlinx.coroutines.runBlocking
+import java.time.Duration.ofDays
+import java.time.Duration.ofMinutes
+import java.time.Instant
+import java.time.temporal.ChronoUnit
+
+class SeedWellnessData(private val context: Context, private val manager: HealthConnectManager) {
+    companion object {
+        val VALID_MINDFULNESS_SESSION_TYPE =
+            setOf(
+                MINDFULNESS_SESSION_TYPE_OTHER,
+                MINDFULNESS_SESSION_TYPE_MEDITATION,
+                MINDFULNESS_SESSION_TYPE_BREATHING,
+                MINDFULNESS_SESSION_TYPE_MOVEMENT,
+                MINDFULNESS_SESSION_TYPE_MUSIC,
+                MINDFULNESS_SESSION_TYPE_UNGUIDED,
+                MINDFULNESS_SESSION_TYPE_UNKNOWN
+            )
+    }
+
+    private val start = Instant.now().truncatedTo(ChronoUnit.DAYS)
+    private val yesterday = start.minus(ofDays(1))
+    private val lastWeek = start.minus(ofDays(7))
+    private val lastMonth = start.minus(ofDays(31))
+
+    fun seedWellnessData(){
+        runBlocking {
+            try {
+                seedMindfulnessSessionRecord()
+            } catch (ex: Exception) {
+                throw ex
+            }
+        }
+    }
+
+    private suspend fun seedMindfulnessSessionRecord(){
+        val records = (1L..3).map { timeOffSet ->
+            getMindfulnessSessionRecord(start.plus(ofMinutes(timeOffSet)))
+        }
+        val yesterdayRecords = (1L..3).map { timeOffSet ->
+            getMindfulnessSessionRecord(yesterday.plus(
+                ofMinutes(timeOffSet)
+            ))
+        }
+        val lastWeekRecords = (1L..3).map { timeOffSet ->
+            getMindfulnessSessionRecord(lastWeek.plus(
+                ofMinutes(timeOffSet)
+            ))
+        }
+        val lastMonthRecords = (1L..3).map { timeOffSet ->
+            getMindfulnessSessionRecord(lastMonth.plus(
+                ofMinutes(timeOffSet)
+            ))
+        }
+
+        insertRecords(records, manager)
+        insertRecords(yesterdayRecords, manager)
+        insertRecords(lastWeekRecords, manager)
+        insertRecords(lastMonthRecords, manager)
+    }
+
+    private fun getMindfulnessSessionRecord(time: Instant): MindfulnessSessionRecord {
+        return MindfulnessSessionRecord.Builder(
+            getMetaData(context),
+            time,
+            time.plusSeconds(30),
+            VALID_MINDFULNESS_SESSION_TYPE.random()
+        ).build()
+    }
+
+}
\ No newline at end of file
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/HomeFragment.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/HomeFragment.kt
index 31eeae8..202d4b7 100644
--- a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/HomeFragment.kt
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/HomeFragment.kt
@@ -36,14 +36,20 @@
 import androidx.navigation.NavController
 import androidx.navigation.fragment.findNavController
 import com.android.healthconnect.testapps.toolbox.Constants.ADDITIONAL_PERMISSIONS
-import com.android.healthconnect.testapps.toolbox.Constants.DATA_TYPE_PERMISSIONS
+import com.android.healthconnect.testapps.toolbox.Constants.FITNESS_PERMISSIONS
+import com.android.healthconnect.testapps.toolbox.Constants.FITNESS_READ_PERMISSIONS
+import com.android.healthconnect.testapps.toolbox.Constants.FITNESS_WRITE_PERMISSIONS
 import com.android.healthconnect.testapps.toolbox.Constants.HEALTH_PERMISSIONS
 import com.android.healthconnect.testapps.toolbox.Constants.MEDICAL_PERMISSIONS
+import com.android.healthconnect.testapps.toolbox.Constants.MEDICAL_READ_PERMISSIONS
+import com.android.healthconnect.testapps.toolbox.Constants.MEDICAL_WRITE_AND_OTHERS
 import com.android.healthconnect.testapps.toolbox.Constants.READ_HEALTH_DATA_HISTORY
 import com.android.healthconnect.testapps.toolbox.Constants.READ_HEALTH_DATA_IN_BACKGROUND
+import com.android.healthconnect.testapps.toolbox.Constants.WRITE_ALL_MEDICAL_DATA
 import com.android.healthconnect.testapps.toolbox.PerformanceTestingFragment
 import com.android.healthconnect.testapps.toolbox.R
 import com.android.healthconnect.testapps.toolbox.seed.SeedData
+import com.android.healthconnect.testapps.toolbox.viewmodels.HomeFragmentViewModel
 import com.android.healthconnect.testapps.toolbox.viewmodels.PerformanceTestingViewModel
 import kotlin.system.exitProcess
 
@@ -61,6 +67,7 @@
     private lateinit var mRequestPermissionLauncher: ActivityResultLauncher<Array<String>>
     private lateinit var mNavigationController: NavController
     private val performanceTestingViewModel: PerformanceTestingViewModel by viewModels()
+    private val homeFragmentViewModel: HomeFragmentViewModel by viewModels()
 
     private val manager by lazy {
         requireContext().getSystemService(HealthConnectManager::class.java)
@@ -88,14 +95,20 @@
 
         if (numberOfPermissionsMissing == 0) {
             Toast.makeText(
-                    this.requireContext(), R.string.all_permissions_success, Toast.LENGTH_SHORT)
+                    this.requireContext(),
+                    R.string.all_permissions_success,
+                    Toast.LENGTH_SHORT,
+                )
                 .show()
         } else {
             Toast.makeText(
                     this.requireContext(),
                     getString(
-                        R.string.number_of_permissions_not_granted, numberOfPermissionsMissing),
-                    Toast.LENGTH_SHORT)
+                        R.string.number_of_permissions_not_granted,
+                        numberOfPermissionsMissing,
+                    ),
+                    Toast.LENGTH_SHORT,
+                )
                 .show()
         }
     }
@@ -122,6 +135,9 @@
         view.requireViewById<Button>(R.id.seed_random_data_button).setOnClickListener {
             seedDataButtonPressed()
         }
+        view.requireViewById<Button>(R.id.seed_all_data_button).setOnClickListener {
+            seedAllDataButtonPressed()
+        }
         view.requireViewById<Button>(R.id.seed_performance_read_data_button).setOnClickListener {
             performanceTestingViewModel.beginReadingData()
         }
@@ -158,10 +174,38 @@
             requestHistoryReadPermission()
         }
 
+        view.findViewById<Button>(R.id.request_medical_write_permission).setOnClickListener {
+            requestMedicalWritePermission()
+        }
+
+        view
+            .findViewById<Button>(R.id.request_medical_write_and_other_health_permissions)
+            .setOnClickListener { requestMedicalWriteAndOtherPermissions() }
+
+        view.findViewById<Button>(R.id.request_medical_read).setOnClickListener {
+            requestMedicalReadPermissions()
+        }
+
+        view.findViewById<Button>(R.id.request_fitness_read).setOnClickListener {
+            requestFitnessRead()
+        }
+
+        view.findViewById<Button>(R.id.request_fitness_write).setOnClickListener {
+            requestFitnessWrite()
+        }
+
         // view
         //     .findViewById<Button>(R.id.seed_performance_insert_data_button_in_parallel)
         //     .setOnClickListener { performanceTestingViewModel.beginInsertingData(true) }
         mNavigationController = findNavController()
+
+        homeFragmentViewModel.seedAllDataState.observe(viewLifecycleOwner) { state ->
+            if (state is HomeFragmentViewModel.SeedAllDataState.Error) {
+                Toast.makeText(context, state.errorMessage, Toast.LENGTH_SHORT).show()
+            } else {
+                Toast.makeText(context, R.string.toast_seed_data_success, Toast.LENGTH_SHORT).show()
+            }
+        }
     }
 
     private fun launchHealthConnect() {
@@ -174,13 +218,20 @@
         try {
             SeedData(requireContext(), manager).seedData()
             Toast.makeText(
-                    this.requireContext(), R.string.toast_seed_data_success, Toast.LENGTH_SHORT)
+                    this.requireContext(),
+                    R.string.toast_seed_data_success,
+                    Toast.LENGTH_SHORT,
+                )
                 .show()
         } catch (ex: Exception) {
             Toast.makeText(this.requireContext(), ex.localizedMessage, Toast.LENGTH_SHORT).show()
         }
     }
 
+    private fun seedAllDataButtonPressed() {
+        homeFragmentViewModel.seedAllDataViewModel(requireContext(), manager)
+    }
+
     private fun isPermissionGranted(permission: String): Boolean {
         return ContextCompat.checkSelfPermission(this.requireContext(), permission) ==
             PackageManager.PERMISSION_GRANTED
@@ -196,7 +247,7 @@
     }
 
     private fun isDataTypePermissionMissing(): Boolean {
-        for (permission in DATA_TYPE_PERMISSIONS) {
+        for (permission in FITNESS_PERMISSIONS) {
             if (!isPermissionGranted(permission)) {
                 return true
             }
@@ -219,8 +270,10 @@
         val compName = ComponentName(packageName, "$packageName.AliasMainActivity")
         val componentState = pm.getComponentEnabledSetting(compName)
         var desiredState = COMPONENT_ENABLED_STATE_ENABLED
-        if (componentState == COMPONENT_ENABLED_STATE_DEFAULT ||
-            componentState == COMPONENT_ENABLED_STATE_ENABLED) {
+        if (
+            componentState == COMPONENT_ENABLED_STATE_DEFAULT ||
+                componentState == COMPONENT_ENABLED_STATE_ENABLED
+        ) {
             desiredState = COMPONENT_ENABLED_STATE_DISABLED
         }
         pm.setComponentEnabledSetting(compName, desiredState, PackageManager.DONT_KILL_APP)
@@ -240,13 +293,14 @@
 
     private fun requestDataTypePermissions() {
         if (isDataTypePermissionMissing()) {
-            mRequestPermissionLauncher.launch(DATA_TYPE_PERMISSIONS)
+            mRequestPermissionLauncher.launch(FITNESS_PERMISSIONS)
             return
         }
         Toast.makeText(
                 this.requireContext(),
                 R.string.all_permissions_already_granted_toast,
-                Toast.LENGTH_LONG)
+                Toast.LENGTH_LONG,
+            )
             .show()
     }
 
@@ -258,7 +312,8 @@
         Toast.makeText(
                 this.requireContext(),
                 R.string.all_permissions_already_granted_toast,
-                Toast.LENGTH_LONG)
+                Toast.LENGTH_LONG,
+            )
             .show()
     }
 
@@ -270,7 +325,8 @@
         Toast.makeText(
                 this.requireContext(),
                 R.string.all_permissions_already_granted_toast,
-                Toast.LENGTH_LONG)
+                Toast.LENGTH_LONG,
+            )
             .show()
     }
 
@@ -282,10 +338,52 @@
         Toast.makeText(
                 this.requireContext(),
                 R.string.all_permissions_already_granted_toast,
-                Toast.LENGTH_LONG)
+                Toast.LENGTH_LONG,
+            )
             .show()
     }
 
+    private fun requestMedicalWritePermission() {
+        if (!isPermissionGranted(WRITE_ALL_MEDICAL_DATA)) {
+            mRequestPermissionLauncher.launch(arrayOf(WRITE_ALL_MEDICAL_DATA))
+        }
+
+        Toast.makeText(
+                this.requireContext(),
+                R.string.all_permissions_already_granted_toast,
+                Toast.LENGTH_LONG,
+            )
+            .show()
+    }
+
+    private fun requestMedicalWriteAndOtherPermissions() {
+        if (
+            !isPermissionGranted(WRITE_ALL_MEDICAL_DATA) &&
+                isDataTypePermissionMissing() &&
+                isAdditionalPermissionMissing()
+        ) {
+            mRequestPermissionLauncher.launch(MEDICAL_WRITE_AND_OTHERS)
+        }
+        Toast.makeText(
+                this.requireContext(),
+                R.string.all_permissions_already_granted_toast,
+                Toast.LENGTH_LONG,
+            )
+            .show()
+    }
+
+    private fun requestMedicalReadPermissions() {
+        mRequestPermissionLauncher.launch(MEDICAL_READ_PERMISSIONS)
+    }
+
+    private fun requestFitnessRead() {
+        mRequestPermissionLauncher.launch(FITNESS_READ_PERMISSIONS)
+    }
+
+    private fun requestFitnessWrite() {
+        mRequestPermissionLauncher.launch(FITNESS_WRITE_PERMISSIONS)
+    }
+
     private fun goToRequestRoute() {
         mNavigationController.navigate(R.id.action_homeFragment_to_routeRequest)
     }
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/InsertRecordFragment.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/InsertRecordFragment.kt
index 995068c..d365329 100644
--- a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/InsertRecordFragment.kt
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/InsertRecordFragment.kt
@@ -16,6 +16,7 @@
 package com.android.healthconnect.testapps.toolbox.ui
 
 import android.health.connect.HealthConnectManager
+import android.health.connect.datatypes.ActivityIntensityRecord
 import android.health.connect.datatypes.BasalBodyTemperatureRecord
 import android.health.connect.datatypes.BloodGlucoseRecord
 import android.health.connect.datatypes.BloodPressureRecord
@@ -103,6 +104,7 @@
                 is InsertOrUpdateRecordsViewModel.InsertedRecordsState.WithData -> {
                     showInsertSuccessDialog(state.entries)
                 }
+
                 is InsertOrUpdateRecordsViewModel.InsertedRecordsState.Error -> {
                     Toast.makeText(
                             context,
@@ -160,9 +162,11 @@
             IntervalRecord::class.java -> {
                 setupStartAndEndTimeFields()
             }
+
             InstantRecord::class.java -> {
                 setupTimeField("Time", "time")
             }
+
             else -> {
                 Toast.makeText(context, R.string.not_implemented, Toast.LENGTH_SHORT).show()
                 mNavigationController.popBackStack()
@@ -196,6 +200,7 @@
                     field =
                         EditableTextView(this.requireContext(), mRecordsField.name, INPUT_TYPE_LONG)
                 }
+
                 ExerciseRoute::class.java, // Edge case
                 Int::class.java, // Most of int fields are enums and are handled separately
                 List::class
@@ -203,6 +208,7 @@
                 -> {
                     continue
                 }
+
                 Double::class.java,
                 Pressure::class.java,
                 BloodGlucose::class.java,
@@ -220,6 +226,7 @@
                             INPUT_TYPE_DOUBLE,
                         )
                 }
+
                 TemperatureDelta::class.java -> {
                     field =
                         EditableTextView(
@@ -228,10 +235,12 @@
                             INPUT_TYPE_DOUBLE,
                         )
                 }
+
                 CharSequence::class.java -> {
                     field =
                         EditableTextView(this.requireContext(), mRecordsField.name, INPUT_TYPE_TEXT)
                 }
+
                 else -> {
                     continue
                 }
@@ -242,78 +251,65 @@
     }
 
     private fun setupEnumFields() {
-        val enumFieldNameToClass: HashMap<String, KClass<*>> = HashMap()
-        var field: InputFieldView
-        when (mRecordClass) {
-            MenstruationFlowRecord::class -> {
-                enumFieldNameToClass["mFlow"] =
-                    MenstruationFlowRecord.MenstruationFlowType::class as KClass<*>
+        val enumFieldNameToClass =
+            when (mRecordClass) {
+                MenstruationFlowRecord::class ->
+                    mapOf("mFlow" to MenstruationFlowRecord.MenstruationFlowType::class)
+                OvulationTestRecord::class ->
+                    mapOf("mResult" to OvulationTestRecord.OvulationTestResult::class)
+                SexualActivityRecord::class ->
+                    mapOf(
+                        "mProtectionUsed" to
+                            SexualActivityRecord.SexualActivityProtectionUsed::class
+                    )
+                CervicalMucusRecord::class ->
+                    mapOf(
+                        "mSensation" to CervicalMucusRecord.CervicalMucusSensation::class,
+                        "mAppearance" to CervicalMucusRecord.CervicalMucusAppearance::class,
+                    )
+
+                Vo2MaxRecord::class ->
+                    mapOf("mMeasurementMethod" to Vo2MaxRecord.Vo2MaxMeasurementMethod::class)
+                BasalBodyTemperatureRecord::class ->
+                    mapOf(
+                        "mBodyTemperatureMeasurementLocation" to
+                            BodyTemperatureMeasurementLocation::class
+                    )
+                BloodGlucoseRecord::class ->
+                    mapOf(
+                        "mSpecimenSource" to BloodGlucoseRecord.SpecimenSource::class,
+                        "mRelationToMeal" to BloodGlucoseRecord.RelationToMealType::class,
+                        "mMealType" to MealType::class,
+                    )
+
+                BloodPressureRecord::class ->
+                    mapOf(
+                        "mMeasurementLocation" to BodyTemperatureMeasurementLocation::class,
+                        "mBodyPosition" to BloodPressureRecord.BodyPosition::class,
+                    )
+
+                BodyTemperatureRecord::class ->
+                    mapOf("mMeasurementLocation" to BodyTemperatureMeasurementLocation::class)
+
+                SkinTemperatureRecord::class ->
+                    mapOf("mMeasurementLocation" to SkinTemperatureRecord::class)
+                ExerciseSessionRecord::class -> mapOf("mExerciseType" to ExerciseSessionType::class)
+
+                PlannedExerciseSessionRecord::class ->
+                    mapOf("mPlannedExerciseType" to ExerciseSessionType::class)
+
+                MindfulnessSessionRecord::class ->
+                    mapOf("mMindfulnessSessionType" to MindfulnessSessionRecord::class)
+                ActivityIntensityRecord::class ->
+                    mapOf("mActivityIntensityType" to ActivityIntensityRecord::class)
+                else -> mapOf()
             }
-            OvulationTestRecord::class -> {
-                enumFieldNameToClass["mResult"] =
-                    OvulationTestRecord.OvulationTestResult::class as KClass<*>
-            }
-            SexualActivityRecord::class -> {
-                enumFieldNameToClass["mProtectionUsed"] =
-                    SexualActivityRecord.SexualActivityProtectionUsed::class as KClass<*>
-            }
-            CervicalMucusRecord::class -> {
-                enumFieldNameToClass["mSensation"] =
-                    CervicalMucusRecord.CervicalMucusSensation::class as KClass<*>
-                enumFieldNameToClass["mAppearance"] =
-                    CervicalMucusRecord.CervicalMucusAppearance::class as KClass<*>
-            }
-            Vo2MaxRecord::class -> {
-                enumFieldNameToClass["mMeasurementMethod"] =
-                    Vo2MaxRecord.Vo2MaxMeasurementMethod::class as KClass<*>
-            }
-            BasalBodyTemperatureRecord::class -> {
-                enumFieldNameToClass["mBodyTemperatureMeasurementLocation"] =
-                    BodyTemperatureMeasurementLocation::class as KClass<*>
-            }
-            BloodGlucoseRecord::class -> {
-                enumFieldNameToClass["mSpecimenSource"] =
-                    BloodGlucoseRecord.SpecimenSource::class as KClass<*>
-                enumFieldNameToClass["mRelationToMeal"] =
-                    BloodGlucoseRecord.RelationToMealType::class as KClass<*>
-                enumFieldNameToClass["mMealType"] = MealType::class as KClass<*>
-            }
-            BloodPressureRecord::class -> {
-                enumFieldNameToClass["mMeasurementLocation"] =
-                    BodyTemperatureMeasurementLocation::class as KClass<*>
-                enumFieldNameToClass["mBodyPosition"] =
-                    BloodPressureRecord.BodyPosition::class as KClass<*>
-            }
-            BodyTemperatureRecord::class -> {
-                enumFieldNameToClass["mMeasurementLocation"] =
-                    BodyTemperatureMeasurementLocation::class as KClass<*>
-            }
-            SkinTemperatureRecord::class -> {
-                enumFieldNameToClass["mMeasurementLocation"] =
-                    SkinTemperatureRecord::class as KClass<*>
-            }
-            ExerciseSessionRecord::class -> {
-                enumFieldNameToClass["mExerciseType"] = ExerciseSessionType::class as KClass<*>
-            }
-            PlannedExerciseSessionRecord::class -> {
-                enumFieldNameToClass["mPlannedExerciseType"] =
-                    ExerciseSessionType::class as KClass<*>
-            }
-            MindfulnessSessionRecord::class -> {
-                enumFieldNameToClass["mMindfulnessSessionType"] =
-                    MindfulnessSessionRecord::class as KClass<*>
-            }
-        }
-        if (enumFieldNameToClass.size > 0) {
-            for (entry in enumFieldNameToClass.entries) {
-                val fieldName = entry.key
-                val enumClass = entry.value
-                val enumFieldsWithValues: EnumFieldsWithValues =
-                    GeneralUtils.getStaticFieldNamesAndValues(enumClass)
-                field = EnumDropDown(this.requireContext(), fieldName, enumFieldsWithValues)
-                mLinearLayout.addView(field)
-                mFieldNameToFieldInput[fieldName] = field
-            }
+        enumFieldNameToClass.forEach { fieldName, enumClass ->
+            val enumFieldsWithValues: EnumFieldsWithValues =
+                GeneralUtils.getStaticFieldNamesAndValues(enumClass)
+            val field = EnumDropDown(this.requireContext(), fieldName, enumFieldsWithValues)
+            mLinearLayout.addView(field)
+            mFieldNameToFieldInput[fieldName] = field
         }
     }
 
@@ -329,6 +325,7 @@
                             mRecordsField.genericType as ParameterizedType,
                         )
                 }
+
                 else -> {
                     continue
                 }
@@ -347,6 +344,7 @@
                 fieldName = "mFloors"
                 field = EditableTextView(this.requireContext(), fieldName, INPUT_TYPE_INT)
             }
+
             ExerciseSessionRecord::class -> {
                 fieldName = "mExerciseRoute"
                 field =
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/PhrOptionsFragment.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/PhrOptionsFragment.kt
index 4b336cd..d01f604 100644
--- a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/PhrOptionsFragment.kt
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/ui/PhrOptionsFragment.kt
@@ -26,23 +26,24 @@
 import android.health.connect.datatypes.FhirVersion
 import android.health.connect.datatypes.MedicalDataSource
 import android.health.connect.datatypes.MedicalResource
-import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES
 import android.net.Uri
 import android.os.Bundle
 import android.os.OutcomeReceiver
 import android.util.Log
 import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
 import android.widget.Button
 import android.widget.EditText
+import android.widget.Spinner
 import android.widget.Toast
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
-import androidx.appcompat.app.AlertDialog
 import androidx.core.os.asOutcomeReceiver
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.lifecycleScope
 import com.android.healthconnect.testapps.toolbox.Constants.MEDICAL_PERMISSIONS
-import com.android.healthconnect.testapps.toolbox.Constants.READ_IMMUNIZATION
 import com.android.healthconnect.testapps.toolbox.R
 import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.requireSystemService
 import com.android.healthconnect.testapps.toolbox.utils.GeneralUtils.Companion.showMessageDialog
@@ -106,12 +107,13 @@
                     view,
                     Uri.parse("example.fhir.com/R4/123"),
                     "My Hospital " + (0..1000).random(),
+                    FhirVersion.parseFhirVersion("4.0.1"),
                 )
             }
         }
 
         view.requireViewById<Button>(R.id.phr_read_by_id_button).setOnClickListener {
-            executeAndShowMessage { readreadImmunization(view) }
+            executeAndShowMessage { readImmunization(view) }
         }
 
         view.requireViewById<Button>(R.id.phr_seed_fhir_jsons_button).setOnClickListener {
@@ -129,6 +131,8 @@
         view
             .requireViewById<Button>(R.id.phr_request_read_and_write_medical_data_button)
             .setOnClickListener { requestMedicalPermissions() }
+
+        setUpFhirResourceFromSpinner(view)
     }
 
     private fun executeAndShowMessage(block: suspend () -> String) {
@@ -149,24 +153,7 @@
             loadJSONFromAsset(requireContext(), "immunization_1.json")
                 ?: return "No Immunization resource to insert"
         Log.d("INSERT_IMMUNIZATION", "Writing immunization $immunizationResource")
-        val insertedDataSourceId =
-            view.findViewById<EditText>(R.id.phr_data_source_id_text).getText().toString()
-        val insertedResources =
-            upsertMedicalResources(
-                listOf(
-                    UpsertMedicalResourceRequest.Builder(
-                            insertedDataSourceId,
-                            FhirVersion.parseFhirVersion("4.0.1"),
-                            immunizationResource,
-                        )
-                        .build()
-                )
-            )
-        val insertedResourceId = "$insertedDataSourceId,1,immunization_1"
-        return insertedResources.joinToString(
-            separator = "\n",
-            transform = MedicalResource::toString,
-        )
+        return insertResource(view, immunizationResource)
     }
 
     private suspend fun insertAllergy(view: View): String {
@@ -174,6 +161,45 @@
             loadJSONFromAsset(requireContext(), "allergyintolerance_1.json")
                 ?: return "No Allergy resource to insert"
         Log.d("INSERT_ALLERGY", "Writing allergy $allergyResource")
+        return insertResource(view, allergyResource)
+    }
+
+    private fun setUpFhirResourceFromSpinner(rootView: View) {
+        val jsonFiles = getJsonFilesFromAssets(requireContext())
+        val spinnerOptions = listOf(getString(R.string.spinner_default_message)) + jsonFiles
+        val spinnerAdapter =
+            ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, spinnerOptions)
+        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
+
+        val spinner = rootView.findViewById<Spinner>(R.id.phr_spinner)
+        spinner.adapter = spinnerAdapter
+
+        spinner.onItemSelectedListener =
+            object : AdapterView.OnItemSelectedListener {
+                override fun onItemSelected(
+                    parent: AdapterView<*>,
+                    view: View,
+                    position: Int,
+                    id: Long,
+                ) {
+                    if (position == 0) { // Ignore "Select resource" default message
+                        return
+                    }
+
+                    val selectedFile = spinnerOptions[position]
+                    val selectedResource =
+                        loadJSONFromAsset(requireContext(), selectedFile) ?: return
+                    Log.d("INSERT_RESOURCE_FROM_SPINNER", "Writing resource $selectedResource")
+                    executeAndShowMessage { insertResource(rootView, selectedResource) }
+                }
+
+                override fun onNothingSelected(parent: AdapterView<*>) {
+                    // No-op.
+                }
+            }
+    }
+
+    private suspend fun insertResource(view: View, resource: String): String {
         val insertedDataSourceId =
             view.findViewById<EditText>(R.id.phr_data_source_id_text).getText().toString()
         val insertedResources =
@@ -182,12 +208,11 @@
                     UpsertMedicalResourceRequest.Builder(
                             insertedDataSourceId,
                             FhirVersion.parseFhirVersion("4.0.1"),
-                            allergyResource,
+                            resource,
                         )
                         .build()
                 )
             )
-        val insertedResourceId = "$insertedDataSourceId,1,allergyintolerance_1"
         return insertedResources.joinToString(
             separator = "\n",
             transform = MedicalResource::toString,
@@ -214,6 +239,10 @@
             insertedResources.joinToString(separator = "\n", transform = MedicalResource::toString)
     }
 
+    private fun getJsonFilesFromAssets(context: Context): List<String> {
+        return context.assets.list("")?.filter { it.endsWith(".json") } ?: emptyList()
+    }
+
     private suspend fun upsertMedicalResources(
         requests: List<UpsertMedicalResourceRequest>
     ): List<MedicalResource> {
@@ -234,11 +263,13 @@
         view: View,
         fhirBaseUri: Uri,
         displayName: String,
+        fhirVersion: FhirVersion,
     ): String {
         val dataSource =
             suspendCancellableCoroutine<MedicalDataSource> { continuation ->
                 healthConnectManager.createMedicalDataSource(
-                    CreateMedicalDataSourceRequest.Builder(fhirBaseUri, displayName).build(),
+                    CreateMedicalDataSourceRequest.Builder(fhirBaseUri, displayName, fhirVersion)
+                        .build(),
                     Runnable::run,
                     continuation.asOutcomeReceiver(),
                 )
@@ -248,8 +279,7 @@
         return "Created data source: $displayName"
     }
 
-    //
-    private suspend fun readreadImmunization(view: View): String {
+    private suspend fun readImmunization(view: View): String {
         return readImmunization()
             .joinToString(separator = "\n", transform = MedicalResource::toString)
     }
@@ -258,14 +288,13 @@
 
         var receiver: OutcomeReceiver<ReadMedicalResourcesResponse, HealthConnectException>
         val request: ReadMedicalResourcesInitialRequest =
-            ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION).build()
+            ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES).build()
         val resources =
             suspendCancellableCoroutine<ReadMedicalResourcesResponse> { continuation ->
                     receiver = continuation.asOutcomeReceiver()
                     healthConnectManager.readMedicalResources(request, Runnable::run, receiver)
                 }
                 .medicalResources
-        // val resources = receiver.getResult().getMedicalResources()
         Log.d("READ_MEDICAL_RESOURCES", "Read ${resources.size} resources")
         return resources
     }
@@ -322,18 +351,6 @@
         }
     }
 
-    private fun showLoadJSONDataDialog() {
-        val builder: AlertDialog.Builder = AlertDialog.Builder(requireContext())
-        builder.setTitle("FHIR JSON files loaded.")
-        builder.setPositiveButton(android.R.string.ok) { _, _ -> }
-        val alertDialog: AlertDialog = builder.create()
-        alertDialog.show()
-    }
-
-    private fun requestReadImmunizationPermission() {
-        mRequestPermissionLauncher.launch(arrayOf(READ_IMMUNIZATION))
-    }
-
     private fun requestMedicalPermissions() {
         mRequestPermissionLauncher.launch(MEDICAL_PERMISSIONS)
     }
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/utils/GeneralUtils.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/utils/GeneralUtils.kt
index cadf0ff..66165d3 100644
--- a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/utils/GeneralUtils.kt
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/utils/GeneralUtils.kt
@@ -33,11 +33,10 @@
 import androidx.appcompat.app.AlertDialog
 import androidx.core.os.asOutcomeReceiver
 import com.android.healthconnect.testapps.toolbox.R
-import java.lang.reflect.Field
+import java.io.Serializable
 import java.lang.reflect.Modifier
 import kotlin.reflect.KClass
 import kotlinx.coroutines.suspendCancellableCoroutine
-import java.io.Serializable
 
 class GeneralUtils {
 
@@ -69,7 +68,10 @@
                 try {
                     suspendCancellableCoroutine<InsertRecordsResponse> { continuation ->
                             manager.insertRecords(
-                                records, Runnable::run, continuation.asOutcomeReceiver())
+                                records,
+                                Runnable::run,
+                                continuation.asOutcomeReceiver(),
+                            )
                         }
                         .records
                 } catch (ex: Exception) {
@@ -78,10 +80,7 @@
             return insertedRecords
         }
 
-        suspend fun <T : Record> updateRecords(
-            records: List<T>,
-            manager: HealthConnectManager,
-        ) {
+        suspend fun <T : Record> updateRecords(records: List<T>, manager: HealthConnectManager) {
             try {
                 suspendCancellableCoroutine<Void> { continuation ->
                     manager.updateRecords(records, Runnable::run, continuation.asOutcomeReceiver())
@@ -91,18 +90,13 @@
             }
         }
 
-        fun <T : Any> getStaticFieldNamesAndValues(
-            obj: KClass<T>,
-        ): EnumFieldsWithValues {
-            val fieldNameToValue: MutableMap<String, Any> = emptyMap<String, Any>().toMutableMap()
-            val fields: List<Field> =
-                obj.java.declaredFields.filter { field ->
+        fun <T : Any> getStaticFieldNamesAndValues(obj: KClass<T>): EnumFieldsWithValues {
+            return obj.java.declaredFields
+                .filter { field ->
                     Modifier.isStatic(field.modifiers) && field.type == Int::class.java
                 }
-            for (field in fields) {
-                fieldNameToValue[field.name] = field.get(obj)!!
-            }
-            return EnumFieldsWithValues(fieldNameToValue.toMap())
+                .associate { it.name to it.get(obj)!! }
+                .let { EnumFieldsWithValues(it) }
         }
 
         suspend fun readRecords(
@@ -132,7 +126,10 @@
             val records =
                 suspendCancellableCoroutine<ReadRecordsResponse<T>> { continuation ->
                         manager.readRecords(
-                            request, Runnable::run, continuation.asOutcomeReceiver())
+                            request,
+                            Runnable::run,
+                            continuation.asOutcomeReceiver(),
+                        )
                     }
                     .records
             Log.d("READ_RECORDS", "Read ${records.size} records")
@@ -142,8 +139,7 @@
         inline fun <reified T> Context.requireSystemService(): T =
             requireNotNull(getSystemService(T::class.java))
 
-        fun Intent.requireStringExtra(name: String): String =
-            requireNotNull(getStringExtra(name))
+        fun Intent.requireStringExtra(name: String): String = requireNotNull(getStringExtra(name))
 
         fun Intent.requireByteArrayExtra(name: String): ByteArray =
             requireNotNull(getByteArrayExtra(name))
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/utils/InsertOrUpdateRecords.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/utils/InsertOrUpdateRecords.kt
index 7f77e24..4ebcb61 100644
--- a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/utils/InsertOrUpdateRecords.kt
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/utils/InsertOrUpdateRecords.kt
@@ -17,6 +17,7 @@
 
 import android.content.Context
 import android.health.connect.datatypes.ActiveCaloriesBurnedRecord
+import android.health.connect.datatypes.ActivityIntensityRecord
 import android.health.connect.datatypes.BasalBodyTemperatureRecord
 import android.health.connect.datatypes.BasalMetabolicRateRecord
 import android.health.connect.datatypes.BloodGlucoseRecord
@@ -171,604 +172,561 @@
             mFieldNameToFieldInput: HashMap<String, InputFieldView>,
             metaData: Metadata,
         ): Record {
-            val record: Record
-            when (recordClass) {
-                StepsRecord::class -> {
-                    record =
-                        StepsRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                getLongValue(mFieldNameToFieldInput, "mCount"),
-                            )
-                            .build()
-                }
-                DistanceRecord::class -> {
-                    record =
-                        DistanceRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                Length.fromMeters(
-                                    getDoubleValue(mFieldNameToFieldInput, "mDistance")
-                                ),
-                            )
-                            .build()
-                }
-                ActiveCaloriesBurnedRecord::class -> {
-                    record =
-                        ActiveCaloriesBurnedRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                Energy.fromCalories(
-                                    getDoubleValue(mFieldNameToFieldInput, "mEnergy")
-                                ),
-                            )
-                            .build()
-                }
-                ElevationGainedRecord::class -> {
-                    record =
-                        ElevationGainedRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                Length.fromMeters(
-                                    getDoubleValue(mFieldNameToFieldInput, "mElevation")
-                                ),
-                            )
-                            .build()
-                }
-                BasalMetabolicRateRecord::class -> {
-                    record =
-                        BasalMetabolicRateRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                Power.fromWatts(
-                                    getDoubleValue(mFieldNameToFieldInput, "mBasalMetabolicRate")
-                                ),
-                            )
-                            .build()
-                }
-                SpeedRecord::class -> {
-                    record =
-                        SpeedRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                mFieldNameToFieldInput["mSpeedRecordSamples"]?.getFieldValue()
-                                    as List<SpeedRecordSample>,
-                            )
-                            .build()
-                }
-                HeartRateRecord::class -> {
-                    record =
-                        HeartRateRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                mFieldNameToFieldInput["mHeartRateSamples"]?.getFieldValue()
-                                    as List<HeartRateSample>,
-                            )
-                            .build()
-                }
-                PowerRecord::class -> {
-                    record =
-                        PowerRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                mFieldNameToFieldInput["mPowerRecordSamples"]?.getFieldValue()
-                                    as List<PowerRecordSample>,
-                            )
-                            .build()
-                }
-                CyclingPedalingCadenceRecord::class -> {
-                    record =
-                        CyclingPedalingCadenceRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                mFieldNameToFieldInput["mCyclingPedalingCadenceRecordSamples"]
-                                    ?.getFieldValue() as List<CyclingPedalingCadenceRecordSample>,
-                            )
-                            .build()
-                }
-                FloorsClimbedRecord::class -> {
-                    record =
-                        FloorsClimbedRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                getDoubleValue(mFieldNameToFieldInput, "mFloors"),
-                            )
-                            .build()
-                }
-                TotalCaloriesBurnedRecord::class -> {
-                    record =
-                        TotalCaloriesBurnedRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                Energy.fromCalories(
-                                    getDoubleValue(mFieldNameToFieldInput, "mEnergy")
-                                ),
-                            )
-                            .build()
-                }
-                WheelchairPushesRecord::class -> {
-                    record =
-                        WheelchairPushesRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                getLongValue(mFieldNameToFieldInput, "mCount"),
-                            )
-                            .build()
-                }
-                Vo2MaxRecord::class -> {
-                    record =
-                        Vo2MaxRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(mFieldNameToFieldInput, "mMeasurementMethod"),
-                                getDoubleValue(
-                                    mFieldNameToFieldInput,
-                                    "mVo2MillilitersPerMinuteKilogram",
-                                ),
-                            )
-                            .build()
-                }
-                BodyFatRecord::class -> {
-                    record =
-                        BodyFatRecord.Builder(
+            return when (recordClass) {
+                StepsRecord::class ->
+                    StepsRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        getLongValue(mFieldNameToFieldInput, "mCount"),
+                    )
+                        .build()
+
+                DistanceRecord::class ->
+                    DistanceRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        Length.fromMeters(getDoubleValue(mFieldNameToFieldInput, "mDistance")),
+                    )
+                        .build()
+
+                ActiveCaloriesBurnedRecord::class ->
+                    ActiveCaloriesBurnedRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        Energy.fromCalories(getDoubleValue(mFieldNameToFieldInput, "mEnergy")),
+                    )
+                        .build()
+
+                ElevationGainedRecord::class ->
+                    ElevationGainedRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        Length.fromMeters(getDoubleValue(mFieldNameToFieldInput, "mElevation")),
+                    )
+                        .build()
+
+                BasalMetabolicRateRecord::class ->
+                    BasalMetabolicRateRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        Power.fromWatts(
+                            getDoubleValue(mFieldNameToFieldInput, "mBasalMetabolicRate")
+                        ),
+                    )
+                        .build()
+
+                SpeedRecord::class ->
+                    SpeedRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        mFieldNameToFieldInput["mSpeedRecordSamples"]?.getFieldValue()
+                                as List<SpeedRecordSample>,
+                    )
+                        .build()
+
+                HeartRateRecord::class ->
+                    HeartRateRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        mFieldNameToFieldInput["mHeartRateSamples"]?.getFieldValue()
+                                as List<HeartRateSample>,
+                    )
+                        .build()
+
+                PowerRecord::class ->
+                    PowerRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        mFieldNameToFieldInput["mPowerRecordSamples"]?.getFieldValue()
+                                as List<PowerRecordSample>,
+                    )
+                        .build()
+
+                CyclingPedalingCadenceRecord::class ->
+                    CyclingPedalingCadenceRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        mFieldNameToFieldInput["mCyclingPedalingCadenceRecordSamples"]
+                            ?.getFieldValue() as List<CyclingPedalingCadenceRecordSample>,
+                    )
+                        .build()
+
+                FloorsClimbedRecord::class ->
+                    FloorsClimbedRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        getDoubleValue(mFieldNameToFieldInput, "mFloors"),
+                    )
+                        .build()
+
+                TotalCaloriesBurnedRecord::class ->
+                    TotalCaloriesBurnedRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        Energy.fromCalories(getDoubleValue(mFieldNameToFieldInput, "mEnergy")),
+                    )
+                        .build()
+
+                WheelchairPushesRecord::class ->
+                    WheelchairPushesRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        getLongValue(mFieldNameToFieldInput, "mCount"),
+                    )
+                        .build()
+
+                Vo2MaxRecord::class ->
+                    Vo2MaxRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(mFieldNameToFieldInput, "mMeasurementMethod"),
+                        getDoubleValue(
+                            mFieldNameToFieldInput,
+                            "mVo2MillilitersPerMinuteKilogram",
+                        ),
+                    )
+                        .build()
+
+                BodyFatRecord::class ->
+                    BodyFatRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        Percentage.fromValue(
+                            getDoubleValue(mFieldNameToFieldInput, "mPercentage")
+                        ),
+                    )
+                        .build()
+
+                BodyWaterMassRecord::class ->
+                    BodyWaterMassRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getMass(mFieldNameToFieldInput, "mBodyWaterMass"),
+                    )
+                        .build()
+
+                BoneMassRecord::class ->
+                    BoneMassRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getMass(mFieldNameToFieldInput, "mMass"),
+                    )
+                        .build()
+
+                HeightRecord::class ->
+                    HeightRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        Length.fromMeters(getDoubleValue(mFieldNameToFieldInput, "mHeight")),
+                    )
+                        .build()
+
+                LeanBodyMassRecord::class ->
+                    LeanBodyMassRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getMass(mFieldNameToFieldInput, "mMass"),
+                    )
+                        .build()
+
+                WeightRecord::class ->
+                    WeightRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getMass(mFieldNameToFieldInput, "mWeight"),
+                    )
+                        .build()
+
+                CervicalMucusRecord::class ->
+                    CervicalMucusRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(mFieldNameToFieldInput, "mSensation"),
+                        getIntegerValue(mFieldNameToFieldInput, "mAppearance"),
+                    )
+                        .build()
+
+                MenstruationFlowRecord::class ->
+                    MenstruationFlowRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(mFieldNameToFieldInput, "mFlow"),
+                    )
+                        .build()
+
+                OvulationTestRecord::class ->
+                    OvulationTestRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(mFieldNameToFieldInput, "mResult"),
+                    )
+                        .build()
+
+                SexualActivityRecord::class ->
+                    SexualActivityRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(mFieldNameToFieldInput, "mProtectionUsed"),
+                    )
+                        .build()
+
+                HydrationRecord::class ->
+                    HydrationRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        Volume.fromLiters(getDoubleValue(mFieldNameToFieldInput, "mVolume")),
+                    )
+                        .build()
+
+                IntermenstrualBleedingRecord::class ->
+                    IntermenstrualBleedingRecord.Builder(metaData, getTime(mFieldNameToFieldInput))
+                        .build()
+
+                BasalBodyTemperatureRecord::class ->
+                    BasalBodyTemperatureRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(
+                            mFieldNameToFieldInput,
+                            "mBodyTemperatureMeasurementLocation",
+                        ),
+                        Temperature.fromCelsius(
+                            getDoubleValue(mFieldNameToFieldInput, "mTemperature")
+                        ),
+                    )
+                        .build()
+
+                BloodGlucoseRecord::class ->
+                    BloodGlucoseRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(mFieldNameToFieldInput, "mSpecimenSource"),
+                        BloodGlucose.fromMillimolesPerLiter(
+                            getDoubleValue(mFieldNameToFieldInput, "mLevel")
+                        ),
+                        getIntegerValue(mFieldNameToFieldInput, "mRelationToMeal"),
+                        getIntegerValue(mFieldNameToFieldInput, "mMealType"),
+                    )
+                        .build()
+
+                BloodPressureRecord::class ->
+                    BloodPressureRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(mFieldNameToFieldInput, "mMeasurementLocation"),
+                        Pressure.fromMillimetersOfMercury(
+                            getDoubleValue(mFieldNameToFieldInput, "mSystolic")
+                        ),
+                        Pressure.fromMillimetersOfMercury(
+                            getDoubleValue(mFieldNameToFieldInput, "mDiastolic")
+                        ),
+                        getIntegerValue(mFieldNameToFieldInput, "mBodyPosition"),
+                    )
+                        .build()
+
+                BodyTemperatureRecord::class ->
+                    BodyTemperatureRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getIntegerValue(mFieldNameToFieldInput, "mMeasurementLocation"),
+                        Temperature.fromCelsius(
+                            getDoubleValue(mFieldNameToFieldInput, "mTemperature")
+                        ),
+                    )
+                        .build()
+
+                HeartRateVariabilityRmssdRecord::class ->
+                    HeartRateVariabilityRmssdRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getDoubleValue(mFieldNameToFieldInput, "mHeartRateVariabilityMillis"),
+                    )
+                        .build()
+
+                OxygenSaturationRecord::class ->
+                    OxygenSaturationRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        Percentage.fromValue(
+                            getDoubleValue(mFieldNameToFieldInput, "mPercentage")
+                        ),
+                    )
+                        .build()
+
+                RespiratoryRateRecord::class ->
+                    RespiratoryRateRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getDoubleValue(mFieldNameToFieldInput, "mRate"),
+                    )
+                        .build()
+
+                RestingHeartRateRecord::class ->
+                    RestingHeartRateRecord.Builder(
+                        metaData,
+                        getTime(mFieldNameToFieldInput),
+                        getLongValue(mFieldNameToFieldInput, "mBeatsPerMinute"),
+                    )
+                        .build()
+
+                SkinTemperatureRecord::class ->
+                    SkinTemperatureRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                    )
+                        .apply {
+                            OxygenSaturationRecord.Builder(
                                 metaData,
                                 getTime(mFieldNameToFieldInput),
                                 Percentage.fromValue(
                                     getDoubleValue(mFieldNameToFieldInput, "mPercentage")
                                 ),
                             )
-                            .build()
-                }
-                BodyWaterMassRecord::class -> {
-                    record =
-                        BodyWaterMassRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getMass(mFieldNameToFieldInput, "mBodyWaterMass"),
-                            )
-                            .build()
-                }
-                BoneMassRecord::class -> {
-                    record =
-                        BoneMassRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getMass(mFieldNameToFieldInput, "mMass"),
-                            )
-                            .build()
-                }
-                HeightRecord::class -> {
-                    record =
-                        HeightRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                Length.fromMeters(getDoubleValue(mFieldNameToFieldInput, "mHeight")),
-                            )
-                            .build()
-                }
-                LeanBodyMassRecord::class -> {
-                    record =
-                        LeanBodyMassRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getMass(mFieldNameToFieldInput, "mMass"),
-                            )
-                            .build()
-                }
-                WeightRecord::class -> {
-                    record =
-                        WeightRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getMass(mFieldNameToFieldInput, "mWeight"),
-                            )
-                            .build()
-                }
-                CervicalMucusRecord::class -> {
-                    record =
-                        CervicalMucusRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(mFieldNameToFieldInput, "mSensation"),
-                                getIntegerValue(mFieldNameToFieldInput, "mAppearance"),
-                            )
-                            .build()
-                }
-                MenstruationFlowRecord::class -> {
-                    record =
-                        MenstruationFlowRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(mFieldNameToFieldInput, "mFlow"),
-                            )
-                            .build()
-                }
-                OvulationTestRecord::class -> {
-                    record =
-                        OvulationTestRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(mFieldNameToFieldInput, "mResult"),
-                            )
-                            .build()
-                }
-                SexualActivityRecord::class -> {
-                    record =
-                        SexualActivityRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(mFieldNameToFieldInput, "mProtectionUsed"),
-                            )
-                            .build()
-                }
-                HydrationRecord::class -> {
-                    record =
-                        HydrationRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                Volume.fromLiters(getDoubleValue(mFieldNameToFieldInput, "mVolume")),
-                            )
-                            .build()
-                }
-                IntermenstrualBleedingRecord::class -> {
-                    record =
-                        IntermenstrualBleedingRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                            )
-                            .build()
-                }
-                BasalBodyTemperatureRecord::class -> {
-                    record =
-                        BasalBodyTemperatureRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(
-                                    mFieldNameToFieldInput,
-                                    "mBodyTemperatureMeasurementLocation",
-                                ),
-                                Temperature.fromCelsius(
-                                    getDoubleValue(mFieldNameToFieldInput, "mTemperature")
-                                ),
-                            )
-                            .build()
-                }
-                BloodGlucoseRecord::class -> {
-                    record =
-                        BloodGlucoseRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(mFieldNameToFieldInput, "mSpecimenSource"),
-                                BloodGlucose.fromMillimolesPerLiter(
-                                    getDoubleValue(mFieldNameToFieldInput, "mLevel")
-                                ),
-                                getIntegerValue(mFieldNameToFieldInput, "mRelationToMeal"),
-                                getIntegerValue(mFieldNameToFieldInput, "mMealType"),
-                            )
-                            .build()
-                }
-                BloodPressureRecord::class -> {
-                    record =
-                        BloodPressureRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(mFieldNameToFieldInput, "mMeasurementLocation"),
-                                Pressure.fromMillimetersOfMercury(
-                                    getDoubleValue(mFieldNameToFieldInput, "mSystolic")
-                                ),
-                                Pressure.fromMillimetersOfMercury(
-                                    getDoubleValue(mFieldNameToFieldInput, "mDiastolic")
-                                ),
-                                getIntegerValue(mFieldNameToFieldInput, "mBodyPosition"),
-                            )
-                            .build()
-                }
-                BodyTemperatureRecord::class -> {
-                    record =
-                        BodyTemperatureRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getIntegerValue(mFieldNameToFieldInput, "mMeasurementLocation"),
-                                Temperature.fromCelsius(
-                                    getDoubleValue(mFieldNameToFieldInput, "mTemperature")
-                                ),
-                            )
-                            .build()
-                }
-                HeartRateVariabilityRmssdRecord::class -> {
-                    record =
-                        HeartRateVariabilityRmssdRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getDoubleValue(
-                                    mFieldNameToFieldInput,
-                                    "mHeartRateVariabilityMillis",
-                                ),
-                            )
-                            .build()
-                }
-                OxygenSaturationRecord::class -> {
-                    record =
-                        OxygenSaturationRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                Percentage.fromValue(
-                                    getDoubleValue(mFieldNameToFieldInput, "mPercentage")
-                                ),
-                            )
-                            .build()
-                }
-                RespiratoryRateRecord::class -> {
-                    record =
-                        RespiratoryRateRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getDoubleValue(mFieldNameToFieldInput, "mRate"),
-                            )
-                            .build()
-                }
-                RestingHeartRateRecord::class -> {
-                    record =
-                        RestingHeartRateRecord.Builder(
-                                metaData,
-                                getTime(mFieldNameToFieldInput),
-                                getLongValue(mFieldNameToFieldInput, "mBeatsPerMinute"),
-                            )
-                            .build()
-                }
-                SkinTemperatureRecord::class -> {
-                    record =
-                        SkinTemperatureRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                            )
-                            .apply {
-                                if (!mFieldNameToFieldInput["mDeltas"]!!.isEmpty()) {
-                                    setDeltas(
-                                        mFieldNameToFieldInput["mDeltas"]?.getFieldValue()
+                                .build()
+                            if (!mFieldNameToFieldInput["mDeltas"]!!.isEmpty()) {
+                                setDeltas(
+                                    mFieldNameToFieldInput["mDeltas"]?.getFieldValue()
                                             as List<SkinTemperatureRecord.Delta>
-                                    )
-                                }
-                                if (!mFieldNameToFieldInput["mBaseline"]!!.isEmpty()) {
-                                    setBaseline(getTemperature(mFieldNameToFieldInput, "mBaseline"))
-                                }
-                                if (!mFieldNameToFieldInput["mMeasurementLocation"]!!.isEmpty()) {
-                                    setMeasurementLocation(
-                                        getIntegerValue(
-                                            mFieldNameToFieldInput,
-                                            "mMeasurementLocation",
-                                        )
-                                    )
-                                }
+                                )
                             }
-                            .build()
-                }
-                SleepSessionRecord::class -> {
-                    record =
-                        SleepSessionRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                            )
-                            .apply {
-                                if (!mFieldNameToFieldInput["mNotes"]!!.isEmpty()) {
-                                    setNotes(getStringValue(mFieldNameToFieldInput, "mNotes"))
-                                }
-                                if (!mFieldNameToFieldInput["mTitle"]!!.isEmpty()) {
-                                    setTitle(getStringValue(mFieldNameToFieldInput, "mTitle"))
-                                }
-                                if (!mFieldNameToFieldInput["mStages"]!!.isEmpty()) {
-                                    setStages(
-                                        mFieldNameToFieldInput["mStages"]?.getFieldValue()
+                            if (!mFieldNameToFieldInput["mBaseline"]!!.isEmpty()) {
+                                setBaseline(getTemperature(mFieldNameToFieldInput, "mBaseline"))
+                            }
+                            if (!mFieldNameToFieldInput["mMeasurementLocation"]!!.isEmpty()) {
+                                setMeasurementLocation(
+                                    getIntegerValue(mFieldNameToFieldInput, "mMeasurementLocation")
+                                )
+                            }
+                        }
+                        .build()
+
+                SleepSessionRecord::class ->
+                    SleepSessionRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                    )
+                        .apply {
+                            if (!mFieldNameToFieldInput["mNotes"]!!.isEmpty()) {
+                                setNotes(getStringValue(mFieldNameToFieldInput, "mNotes"))
+                            }
+                            if (!mFieldNameToFieldInput["mTitle"]!!.isEmpty()) {
+                                setTitle(getStringValue(mFieldNameToFieldInput, "mTitle"))
+                            }
+                            if (!mFieldNameToFieldInput["mStages"]!!.isEmpty()) {
+                                setStages(
+                                    mFieldNameToFieldInput["mStages"]?.getFieldValue()
                                             as List<SleepSessionRecord.Stage>
-                                    )
-                                }
+                                )
                             }
-                            .build()
-                }
-                StepsCadenceRecord::class -> {
-                    record =
-                        StepsCadenceRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                mFieldNameToFieldInput["mStepsCadenceRecordSamples"]
-                                    ?.getFieldValue() as List<StepsCadenceRecordSample>,
-                            )
-                            .build()
-                }
-                MenstruationPeriodRecord::class -> {
-                    record =
-                        MenstruationPeriodRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                            )
-                            .build()
-                }
+                        }
+                        .build()
+
+                StepsCadenceRecord::class ->
+                    StepsCadenceRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        mFieldNameToFieldInput["mStepsCadenceRecordSamples"]?.getFieldValue()
+                                as List<StepsCadenceRecordSample>,
+                    )
+                        .build()
+
+                MenstruationPeriodRecord::class ->
+                    MenstruationPeriodRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                    )
+                        .build()
+
                 ExerciseSessionRecord::class -> {
                     val startTime = mFieldNameToFieldInput["startTime"]?.getFieldValue() as Instant
 
-                    record =
-                        ExerciseSessionRecord.Builder(
-                                metaData,
-                                startTime,
-                                mFieldNameToFieldInput["endTime"]?.getFieldValue() as Instant,
-                                mFieldNameToFieldInput["mExerciseType"]
-                                    ?.getFieldValue()
-                                    .toString()
-                                    .toInt(),
-                            )
-                            .apply {
-                                if (!mFieldNameToFieldInput["mNotes"]!!.isEmpty()) {
-                                    setNotes(getStringValue(mFieldNameToFieldInput, "mNotes"))
-                                }
-                                if (!mFieldNameToFieldInput["mTitle"]!!.isEmpty()) {
-                                    setTitle(getStringValue(mFieldNameToFieldInput, "mTitle"))
-                                }
-                                if (!mFieldNameToFieldInput["mExerciseRoute"]!!.isEmpty()) {
-                                    val exerciseRoutes =
-                                        mFieldNameToFieldInput["mExerciseRoute"]?.getFieldValue()
-                                            as
-                                            List<ExerciseRoutesTestData.ExerciseRouteLocationData>
-                                    setRoute(
-                                        generateExerciseRouteFromLocations(
-                                            exerciseRoutes,
-                                            startTime.toEpochMilli(),
-                                        )
-                                    )
-                                }
-                                if (!mFieldNameToFieldInput["mSegments"]!!.isEmpty()) {
-                                    setSegments(
-                                        mFieldNameToFieldInput["mSegments"]?.getFieldValue()
-                                            as List<ExerciseSegment>
-                                    )
-                                }
-                                if (!mFieldNameToFieldInput["mLaps"]!!.isEmpty()) {
-                                    setLaps(
-                                        mFieldNameToFieldInput["mLaps"]?.getFieldValue()
-                                            as List<ExerciseLap>
-                                    )
-                                }
+                    ExerciseSessionRecord.Builder(
+                        metaData,
+                        startTime,
+                        mFieldNameToFieldInput["endTime"]?.getFieldValue() as Instant,
+                        mFieldNameToFieldInput["mExerciseType"]
+                            ?.getFieldValue()
+                            .toString()
+                            .toInt(),
+                    )
+                        .apply {
+                            if (!mFieldNameToFieldInput["mNotes"]!!.isEmpty()) {
+                                setNotes(getStringValue(mFieldNameToFieldInput, "mNotes"))
                             }
-                            .build()
+                            if (!mFieldNameToFieldInput["mTitle"]!!.isEmpty()) {
+                                setTitle(getStringValue(mFieldNameToFieldInput, "mTitle"))
+                            }
+                            if (!mFieldNameToFieldInput["mExerciseRoute"]!!.isEmpty()) {
+                                val exerciseRoutes =
+                                    mFieldNameToFieldInput["mExerciseRoute"]?.getFieldValue()
+                                            as List<ExerciseRoutesTestData.ExerciseRouteLocationData>
+                                setRoute(
+                                    generateExerciseRouteFromLocations(
+                                        exerciseRoutes,
+                                        startTime.toEpochMilli(),
+                                    )
+                                )
+                            }
+                            if (!mFieldNameToFieldInput["mSegments"]!!.isEmpty()) {
+                                setSegments(
+                                    mFieldNameToFieldInput["mSegments"]?.getFieldValue()
+                                            as List<ExerciseSegment>
+                                )
+                            }
+                            if (!mFieldNameToFieldInput["mLaps"]!!.isEmpty()) {
+                                setLaps(
+                                    mFieldNameToFieldInput["mLaps"]?.getFieldValue()
+                                            as List<ExerciseLap>
+                                )
+                            }
+                        }
+                        .build()
                 }
+
                 PlannedExerciseSessionRecord::class -> {
                     val startTime = mFieldNameToFieldInput["startTime"]?.getFieldValue() as Instant
-                    record =
-                        PlannedExerciseSessionRecord.Builder(
-                                metaData,
-                                mFieldNameToFieldInput["mPlannedExerciseType"]
-                                    ?.getFieldValue()
-                                    .toString()
-                                    .toInt(),
-                                startTime,
-                                mFieldNameToFieldInput["endTime"]?.getFieldValue() as Instant,
-                            )
-                            .apply {
-                                if (!mFieldNameToFieldInput["mNotes"]!!.isEmpty()) {
-                                    setNotes(getStringValue(mFieldNameToFieldInput, "mNotes"))
-                                }
-                                if (!mFieldNameToFieldInput["mTitle"]!!.isEmpty()) {
-                                    setTitle(getStringValue(mFieldNameToFieldInput, "mTitle"))
-                                }
-                                if (!mFieldNameToFieldInput["mBlocks"]!!.isEmpty()) {
-                                    setBlocks(
-                                        mFieldNameToFieldInput["mBlocks"]?.getFieldValue()
+                    PlannedExerciseSessionRecord.Builder(
+                        metaData,
+                        mFieldNameToFieldInput["mPlannedExerciseType"]
+                            ?.getFieldValue()
+                            .toString()
+                            .toInt(),
+                        startTime,
+                        mFieldNameToFieldInput["endTime"]?.getFieldValue() as Instant,
+                    )
+                        .apply {
+                            if (!mFieldNameToFieldInput["mNotes"]!!.isEmpty()) {
+                                setNotes(getStringValue(mFieldNameToFieldInput, "mNotes"))
+                            }
+                            if (!mFieldNameToFieldInput["mTitle"]!!.isEmpty()) {
+                                setTitle(getStringValue(mFieldNameToFieldInput, "mTitle"))
+                            }
+                            if (!mFieldNameToFieldInput["mBlocks"]!!.isEmpty()) {
+                                setBlocks(
+                                    mFieldNameToFieldInput["mBlocks"]?.getFieldValue()
                                             as List<PlannedExerciseBlock>
-                                    )
-                                }
+                                )
                             }
-                            .build()
+                        }
+                        .build()
                 }
-                NutritionRecord::class -> {
-                    record =
-                        NutritionRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                            )
-                            .apply {
-                                if (!mFieldNameToFieldInput["mBiotin"]!!.isEmpty()) {
-                                    setBiotin(getMass(mFieldNameToFieldInput, "mBiotin"))
-                                }
-                                if (!mFieldNameToFieldInput["mCaffeine"]!!.isEmpty()) {
-                                    setCaffeine(getMass(mFieldNameToFieldInput, "mCaffeine"))
-                                }
-                                if (!mFieldNameToFieldInput["mCalcium"]!!.isEmpty()) {
-                                    setCalcium(getMass(mFieldNameToFieldInput, "mCalcium"))
-                                }
-                                if (!mFieldNameToFieldInput["mChloride"]!!.isEmpty()) {
-                                    setChloride(getMass(mFieldNameToFieldInput, "mChloride"))
-                                }
-                                if (!mFieldNameToFieldInput["mCholesterol"]!!.isEmpty()) {
-                                    setCholesterol(getMass(mFieldNameToFieldInput, "mCholesterol"))
-                                }
-                                if (!mFieldNameToFieldInput["mChromium"]!!.isEmpty()) {
-                                    setChromium(getMass(mFieldNameToFieldInput, "mChromium"))
-                                }
-                                if (!mFieldNameToFieldInput["mDietaryFiber"]!!.isEmpty()) {
-                                    setDietaryFiber(
-                                        getMass(mFieldNameToFieldInput, "mDietaryFiber")
-                                    )
-                                }
-                                if (!mFieldNameToFieldInput["mCopper"]!!.isEmpty()) {
-                                    setCopper(getMass(mFieldNameToFieldInput, "mCopper"))
-                                }
-                                if (!mFieldNameToFieldInput["mEnergy"]!!.isEmpty()) {
-                                    setEnergy(
-                                        Energy.fromCalories(
-                                            getDoubleValue(mFieldNameToFieldInput, "mEnergy")
-                                        )
-                                    )
-                                }
-                                if (!mFieldNameToFieldInput["mFolate"]!!.isEmpty()) {
-                                    setFolate(getMass(mFieldNameToFieldInput, "mFolate"))
-                                }
-                                if (!mFieldNameToFieldInput["mEnergyFromFat"]!!.isEmpty()) {
-                                    setEnergyFromFat(
-                                        Energy.fromCalories(
-                                            getDoubleValue(mFieldNameToFieldInput, "mEnergyFromFat")
-                                        )
-                                    )
-                                }
-                                if (!mFieldNameToFieldInput["mFolicAcid"]!!.isEmpty()) {
-                                    setFolicAcid(getMass(mFieldNameToFieldInput, "mFolicAcid"))
-                                }
-                                if (!mFieldNameToFieldInput["mIodine"]!!.isEmpty()) {
-                                    setIodine(getMass(mFieldNameToFieldInput, "mIodine"))
-                                }
-                                if (!mFieldNameToFieldInput["mIron"]!!.isEmpty()) {
-                                    setIron(getMass(mFieldNameToFieldInput, "mIron"))
-                                }
-                                if (!mFieldNameToFieldInput["mMagnesium"]!!.isEmpty()) {
-                                    setMagnesium(getMass(mFieldNameToFieldInput, "mMagnesium"))
-                                }
-                                if (!mFieldNameToFieldInput["mManganese"]!!.isEmpty()) {
-                                    setManganese(getMass(mFieldNameToFieldInput, "mManganese"))
-                                }
+
+                NutritionRecord::class ->
+                    NutritionRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                    )
+                        .apply {
+                            if (!mFieldNameToFieldInput["mBiotin"]!!.isEmpty()) {
+                                setBiotin(getMass(mFieldNameToFieldInput, "mBiotin"))
                             }
-                            .build()
-                }
-                MindfulnessSessionRecord::class -> {
-                    record =
-                        MindfulnessSessionRecord.Builder(
-                                metaData,
-                                getStartTime(mFieldNameToFieldInput),
-                                getEndTime(mFieldNameToFieldInput),
-                                mFieldNameToFieldInput["mMindfulnessSessionType"]
-                                    ?.getFieldValue()
-                                    .toString()
-                                    .toInt(),
-                            )
-                            .apply {
-                                mFieldNameToFieldInput["mTitle"]
-                                    ?.takeIf { !it.isEmpty() }
-                                    ?.let { setTitle(it.getFieldValue().toString()) }
-                                mFieldNameToFieldInput["mNotes"]
-                                    ?.takeIf { !it.isEmpty() }
-                                    ?.let { setNotes(it.getFieldValue().toString()) }
+                            if (!mFieldNameToFieldInput["mCaffeine"]!!.isEmpty()) {
+                                setCaffeine(getMass(mFieldNameToFieldInput, "mCaffeine"))
                             }
-                            .build()
-                }
-                else -> {
-                    throw NotImplementedError("Record type not implemented")
-                }
+                            if (!mFieldNameToFieldInput["mCalcium"]!!.isEmpty()) {
+                                setCalcium(getMass(mFieldNameToFieldInput, "mCalcium"))
+                            }
+                            if (!mFieldNameToFieldInput["mChloride"]!!.isEmpty()) {
+                                setChloride(getMass(mFieldNameToFieldInput, "mChloride"))
+                            }
+                            if (!mFieldNameToFieldInput["mCholesterol"]!!.isEmpty()) {
+                                setCholesterol(getMass(mFieldNameToFieldInput, "mCholesterol"))
+                            }
+                            if (!mFieldNameToFieldInput["mChromium"]!!.isEmpty()) {
+                                setChromium(getMass(mFieldNameToFieldInput, "mChromium"))
+                            }
+                            if (!mFieldNameToFieldInput["mDietaryFiber"]!!.isEmpty()) {
+                                setDietaryFiber(getMass(mFieldNameToFieldInput, "mDietaryFiber"))
+                            }
+                            if (!mFieldNameToFieldInput["mCopper"]!!.isEmpty()) {
+                                setCopper(getMass(mFieldNameToFieldInput, "mCopper"))
+                            }
+                            if (!mFieldNameToFieldInput["mEnergy"]!!.isEmpty()) {
+                                setEnergy(
+                                    Energy.fromCalories(
+                                        getDoubleValue(mFieldNameToFieldInput, "mEnergy")
+                                    )
+                                )
+                            }
+                            if (!mFieldNameToFieldInput["mFolate"]!!.isEmpty()) {
+                                setFolate(getMass(mFieldNameToFieldInput, "mFolate"))
+                            }
+                            if (!mFieldNameToFieldInput["mEnergyFromFat"]!!.isEmpty()) {
+                                setEnergyFromFat(
+                                    Energy.fromCalories(
+                                        getDoubleValue(mFieldNameToFieldInput, "mEnergyFromFat")
+                                    )
+                                )
+                            }
+                            if (!mFieldNameToFieldInput["mFolicAcid"]!!.isEmpty()) {
+                                setFolicAcid(getMass(mFieldNameToFieldInput, "mFolicAcid"))
+                            }
+                            if (!mFieldNameToFieldInput["mIodine"]!!.isEmpty()) {
+                                setIodine(getMass(mFieldNameToFieldInput, "mIodine"))
+                            }
+                            if (!mFieldNameToFieldInput["mIron"]!!.isEmpty()) {
+                                setIron(getMass(mFieldNameToFieldInput, "mIron"))
+                            }
+                            if (!mFieldNameToFieldInput["mMagnesium"]!!.isEmpty()) {
+                                setMagnesium(getMass(mFieldNameToFieldInput, "mMagnesium"))
+                            }
+                            if (!mFieldNameToFieldInput["mManganese"]!!.isEmpty()) {
+                                setManganese(getMass(mFieldNameToFieldInput, "mManganese"))
+                            }
+                        }
+                        .build()
+
+                MindfulnessSessionRecord::class ->
+                    MindfulnessSessionRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        mFieldNameToFieldInput["mMindfulnessSessionType"]
+                            ?.getFieldValue()
+                            .toString()
+                            .toInt(),
+                    )
+                        .apply {
+                            mFieldNameToFieldInput["mTitle"]
+                                ?.takeIf { !it.isEmpty() }
+                                ?.let { setTitle(it.getFieldValue().toString()) }
+                            mFieldNameToFieldInput["mNotes"]
+                                ?.takeIf { !it.isEmpty() }
+                                ?.let { setNotes(it.getFieldValue().toString()) }
+                        }
+                        .build()
+
+                ActivityIntensityRecord::class ->
+                    ActivityIntensityRecord.Builder(
+                        metaData,
+                        getStartTime(mFieldNameToFieldInput),
+                        getEndTime(mFieldNameToFieldInput),
+                        mFieldNameToFieldInput["mActivityIntensityType"]
+                            ?.getFieldValue()
+                            .toString()
+                            .toInt(),
+                    )
+                        .build()
+
+                else -> throw NotImplementedError("Record type not implemented")
             }
-            return record
         }
     }
 }
diff --git a/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/viewmodels/HomeFragmentViewModel.kt b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/viewmodels/HomeFragmentViewModel.kt
new file mode 100644
index 0000000..f1b1552
--- /dev/null
+++ b/testapps/toolbox/src/com/android/healthconnect/testapps/toolbox/viewmodels/HomeFragmentViewModel.kt
@@ -0,0 +1,52 @@
+/**
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * ```
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * ```
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.healthconnect.testapps.toolbox.viewmodels
+
+import android.content.Context
+import android.health.connect.HealthConnectManager
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.android.healthconnect.testapps.toolbox.seed.SeedData
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+class HomeFragmentViewModel : ViewModel(){
+
+    private val _seedAllDataState = MutableLiveData<SeedAllDataState>()
+    val seedAllDataState: LiveData<SeedAllDataState>
+        get() = _seedAllDataState
+
+    fun seedAllDataViewModel(context: Context, manager: HealthConnectManager) {
+        viewModelScope.launch {
+            try {
+                withContext(Dispatchers.IO) {
+                    SeedData(context, manager).seedAllData()
+                }
+                _seedAllDataState.postValue(SeedAllDataState.Success)
+            } catch (ex: Exception) {
+                _seedAllDataState.postValue(SeedAllDataState.Error(ex.localizedMessage!!))
+            }
+        }
+    }
+
+    sealed class SeedAllDataState{
+        data class Error(val errorMessage: String) : SeedAllDataState()
+        object Success : SeedAllDataState()
+    }
+}
\ No newline at end of file
diff --git a/testapps/toolbox/tests/src/com/android/healthconnect/testapps/toolbox/PermissionIntegrationTest.kt b/testapps/toolbox/tests/src/com/android/healthconnect/testapps/toolbox/PermissionIntegrationTest.kt
index 2ae4b86..7972ee4 100644
--- a/testapps/toolbox/tests/src/com/android/healthconnect/testapps/toolbox/PermissionIntegrationTest.kt
+++ b/testapps/toolbox/tests/src/com/android/healthconnect/testapps/toolbox/PermissionIntegrationTest.kt
@@ -19,7 +19,7 @@
         val context = InstrumentationRegistry.getInstrumentation().context
         val allPermissions =
             Constants.MEDICAL_PERMISSIONS +
-                Constants.DATA_TYPE_PERMISSIONS +
+                Constants.FITNESS_PERMISSIONS +
                 Constants.ADDITIONAL_PERMISSIONS
         Truth.assertThat(allPermissions.sorted())
             .isEqualTo(HealthConnectManager.getHealthPermissions(context).sorted())
diff --git a/tests/cts/Android.bp b/tests/cts/Android.bp
index a128f45..1528be3 100644
--- a/tests/cts/Android.bp
+++ b/tests/cts/Android.bp
@@ -59,6 +59,7 @@
         "healthfitness-exported-aconfig-flags-lib",
         "cts-healthconnect-utils",
         "cts-healthconnect-lib",
+        "cts-healthconnect-phr-lib",
         "flag-junit",
     ],
     min_sdk_version: "34",
@@ -83,6 +84,7 @@
     ],
     srcs: [
         "src/android/healthconnect/cts/nopermission/HealthConnectManagerNoPermissionsGrantedTest.java",
+        "src/android/healthconnect/cts/nopermission/*NoPermissionsDeclaredTest.java",
     ],
     // Tag this module as a cts test artifact
     test_suites: [
@@ -221,6 +223,7 @@
         "cts-wm-util",
         "testng",
         "cts-healthconnect-lib",
+        "cts-healthconnect-phr-lib",
         "cts-install-lib",
         "cts-healthconnect-utils",
     ],
diff --git a/tests/cts/AndroidManifest.xml b/tests/cts/AndroidManifest.xml
index deeacdb..4982972 100644
--- a/tests/cts/AndroidManifest.xml
+++ b/tests/cts/AndroidManifest.xml
@@ -55,6 +55,7 @@
     </queries>
 
     <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.READ_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.READ_BASAL_BODY_TEMPERATURE"/>
     <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.READ_BLOOD_GLUCOSE"/>
@@ -93,6 +94,7 @@
     <uses-permission android:name="android.permission.health.READ_WEIGHT"/>
     <uses-permission android:name="android.permission.health.READ_WHEELCHAIR_PUSHES"/>
     <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.WRITE_BASAL_BODY_TEMPERATURE"/>
     <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_BLOOD_GLUCOSE"/>
diff --git a/tests/cts/AndroidManifestRateLimiter.xml b/tests/cts/AndroidManifestRateLimiter.xml
index 934f5b0..459f2dd 100644
--- a/tests/cts/AndroidManifestRateLimiter.xml
+++ b/tests/cts/AndroidManifestRateLimiter.xml
@@ -39,8 +39,10 @@
     </instrumentation>
 
     <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"/>
     <uses-permission android:name="android.permission.health.READ_STEPS"/>
     <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
     <uses-permission android:name="android.permission.health.WRITE_STEPS"/>
 
     <!--  self-instrumenting test package. -->
diff --git a/tests/cts/AndroidManifestUI.xml b/tests/cts/AndroidManifestUI.xml
index 4329f90..f65f525 100644
--- a/tests/cts/AndroidManifestUI.xml
+++ b/tests/cts/AndroidManifestUI.xml
@@ -21,7 +21,13 @@
 
     <application android:debuggable="true">
         <uses-library android:name="android.test.runner"/>
-        <activity android:name="android.healthconnect.cts.utils.ProxyActivity"/>
+        <activity android:name="android.healthconnect.cts.utils.ProxyActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
+                <category android:name="android.intent.category.HEALTH_PERMISSIONS"/>
+            </intent-filter>
+        </activity>
     </application>
 
     <!-- To get visibility of the app with health permissions definitions,
@@ -33,6 +39,7 @@
 
     <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
     <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.READ_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.READ_BASAL_BODY_TEMPERATURE"/>
     <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.READ_BLOOD_GLUCOSE"/>
@@ -73,6 +80,7 @@
     <uses-permission android:name="android.permission.health.READ_WEIGHT"/>
     <uses-permission android:name="android.permission.health.READ_WHEELCHAIR_PUSHES"/>
     <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.WRITE_BASAL_BODY_TEMPERATURE"/>
     <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_BLOOD_GLUCOSE"/>
diff --git a/tests/cts/TestApp2/AndroidManifest.xml b/tests/cts/TestApp2/AndroidManifest.xml
index 543b85a..a8410b5 100644
--- a/tests/cts/TestApp2/AndroidManifest.xml
+++ b/tests/cts/TestApp2/AndroidManifest.xml
@@ -20,6 +20,13 @@
   <uses-permission android:name="android.permission.health.READ_HEIGHT"/>
   <uses-permission android:name="android.permission.health.WRITE_HEIGHT"/>
 
+  <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_HISTORY"/>
+  <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"/>
+
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
+  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
+  <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
+
   <application android:label="Health Connect cts test app 2">
     <uses-library android:name="android.test.runner"/>
 
diff --git a/tests/cts/hostsidetests/healthconnect/Android.bp b/tests/cts/hostsidetests/healthconnect/Android.bp
index 7f4e0c5..74da284 100644
--- a/tests/cts/hostsidetests/healthconnect/Android.bp
+++ b/tests/cts/hostsidetests/healthconnect/Android.bp
@@ -24,6 +24,7 @@
     static_libs: [
         "ctstestrunner-axt",
         "cts-healthconnect-lib",
+        "cts-healthconnect-phr-lib",
     ],
     sdk_version: "test_current",
     min_sdk_version: "34",
@@ -46,6 +47,8 @@
     test_suites: [
         "cts",
         "general-tests",
+        "mts-healthfitness",
+        "mcts-healthfitness",
     ],
     libs: [
         "compatibility-host-util",
@@ -56,6 +59,8 @@
     static_libs: [
         "cts-statsd-atom-host-test-utils",
         "androidx.annotation_annotation",
+        "flag-junit-host",
+        "healthfitness-exported-aconfig-flags-lib-host",
     ],
     java_resource_dirs: ["host/res"],
     device_common_data: [
diff --git a/tests/cts/hostsidetests/healthconnect/AndroidTest.xml b/tests/cts/hostsidetests/healthconnect/AndroidTest.xml
index 63c39ca..0f8d06b 100644
--- a/tests/cts/hostsidetests/healthconnect/AndroidTest.xml
+++ b/tests/cts/hostsidetests/healthconnect/AndroidTest.xml
@@ -26,4 +26,8 @@
     <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
         <option name="jar" value="CtsHealthConnectHostTestCases.jar" />
     </test>
+    <object type="module_controller"
+            class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
+        <option name="mainline-module-package-name" value="com.google.android.healthfitness"/>
+    </object>
 </configuration>
diff --git a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/Android.bp b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/Android.bp
index 5d9e252..7d38a79 100644
--- a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/Android.bp
+++ b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/Android.bp
@@ -19,16 +19,17 @@
 java_library {
     name: "cts-healthconnect-test-helper",
     srcs: [
-          "src/**/*.java",
-          "src/**/*.kt"
+        "src/**/*.java",
+        "src/**/*.kt",
     ],
     static_libs: [
-                 "androidx.appcompat_appcompat",
-                 "androidx.test.rules",
-                  "cts-install-lib",
-                  "platform-test-annotations",
-                  "cts-healthconnect-utils",
-                  "cts-healthconnect-lib",
+        "androidx.appcompat_appcompat",
+        "androidx.test.rules",
+        "cts-install-lib",
+        "platform-test-annotations",
+        "cts-healthconnect-utils",
+        "cts-healthconnect-lib",
+        "cts-healthconnect-phr-lib",
     ],
-    sdk_version: "test_current"
+    sdk_version: "test_current",
 }
diff --git a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/CtsHealthConnectTestApp.xml b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/CtsHealthConnectTestApp.xml
index 21ae5ec..8cab362 100644
--- a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/CtsHealthConnectTestApp.xml
+++ b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/CtsHealthConnectTestApp.xml
@@ -32,6 +32,20 @@
     <uses-permission android:name="android.permission.health.READ_BLOOD_PRESSURE" />
     <uses-permission android:name="android.permission.health.READ_HEART_RATE" />
 
+    <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
+
     <application android:label="CtsHealthConnectTestApp">
         <uses-library android:name="android.test.runner"/>
 
@@ -48,6 +62,9 @@
             <intent-filter>
                 <action android:name="any.action"/>
             </intent-filter>
+            <intent-filter>
+                <action android:name="android.health.connect.action.SHOW_MIGRATION_INFO"/>
+            </intent-filter>
         </activity>
 
         <receiver android:name="android.healthconnect.cts.testhelper.TestAppReceiver"
diff --git a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/DailyLogsTests.java b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/DailyLogsTests.java
index e7fd2c7..0c529c0 100644
--- a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/DailyLogsTests.java
+++ b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/DailyLogsTests.java
@@ -16,6 +16,8 @@
 
 package android.healthconnect.cts.testhelper;
 
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
 import static android.healthconnect.cts.testhelper.TestHelperUtils.deleteAllRecordsAddedByTestApp;
 import static android.healthconnect.cts.testhelper.TestHelperUtils.getBloodPressureRecord;
 import static android.healthconnect.cts.testhelper.TestHelperUtils.getHeartRateRecord;
@@ -26,6 +28,10 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.utils.TestUtils;
 
 import androidx.test.InstrumentationRegistry;
 
@@ -48,6 +54,21 @@
 
     private final HealthConnectManager mHealthConnectManager =
             InstrumentationRegistry.getContext().getSystemService(HealthConnectManager.class);
+    private final PhrCtsTestUtils mPhrTestUtils = new PhrCtsTestUtils(mHealthConnectManager);
+
+    @Test
+    public void testUpsertMedicalResourcesThenReadSuccess() throws InterruptedException {
+        // clean up before the test to make the test more realistic
+        mPhrTestUtils.deleteAllMedicalData();
+
+        MedicalDataSource medicalDataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource medicalResource =
+                mPhrTestUtils.upsertMedicalData(medicalDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        // make a read to emulate monthly active user
+        mPhrTestUtils.readMedicalResourcesByIds(List.of(medicalResource.getId()));
+    }
 
     @Test
     public void testInsertRecordsSucceed() throws Exception {
@@ -89,13 +110,15 @@
     }
 
     /**
-     * Deletes the records added by the test app.
+     * Deletes the records added by the test app as well as the staged remote data.
      *
      * <p>Triggered in the teardown of HealthConnectDailyLogsStatsTests after database stats are
      * collected and verified.
      */
     @Test
-    public void deleteAllRecordsAddedForTest() throws InterruptedException {
+    public void deleteAllStagedRemoteData() throws InterruptedException {
+        TestUtils.deleteAllStagedRemoteData();
         deleteAllRecordsAddedByTestApp(mHealthConnectManager);
+        mPhrTestUtils.deleteAllMedicalData();
     }
 }
diff --git a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/HealthConnectServiceLogsTests.java b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/HealthConnectServiceLogsTests.java
index e06b596..5778cf1 100644
--- a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/HealthConnectServiceLogsTests.java
+++ b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/HealthConnectServiceLogsTests.java
@@ -17,7 +17,10 @@
 package android.healthconnect.cts.testhelper;
 
 import static android.health.connect.datatypes.HeartRateRecord.BPM_MAX;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
 import static android.health.connect.datatypes.NutritionRecord.BIOTIN_TOTAL;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
 import static android.healthconnect.cts.testhelper.TestHelperUtils.TIMEOUT_SECONDS;
 import static android.healthconnect.cts.testhelper.TestHelperUtils.deleteAllRecordsAddedByTestApp;
 import static android.healthconnect.cts.testhelper.TestHelperUtils.deleteRecords;
@@ -34,12 +37,17 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static java.time.Instant.EPOCH;
+import static java.util.Objects.requireNonNull;
 
+import android.content.Context;
 import android.health.connect.AggregateRecordsRequest;
 import android.health.connect.AggregateRecordsResponse;
+import android.health.connect.DeleteMedicalResourcesRequest;
 import android.health.connect.DeleteUsingFiltersRequest;
+import android.health.connect.GetMedicalDataSourcesRequest;
 import android.health.connect.HealthConnectException;
 import android.health.connect.HealthConnectManager;
+import android.health.connect.ReadMedicalResourcesInitialRequest;
 import android.health.connect.ReadRecordsRequestUsingFilters;
 import android.health.connect.ReadRecordsResponse;
 import android.health.connect.changelog.ChangeLogTokenRequest;
@@ -50,13 +58,17 @@
 import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.HeartRateRecord;
 import android.health.connect.datatypes.HeightRecord;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.Record;
 import android.health.connect.datatypes.StepsRecord;
 import android.health.connect.datatypes.units.Length;
 import android.health.connect.datatypes.units.Mass;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.utils.TestUtils;
 import android.os.OutcomeReceiver;
 
-import androidx.test.InstrumentationRegistry;
+import androidx.test.core.app.ApplicationProvider;
 
 import com.android.compatibility.common.util.NonApiTest;
 
@@ -81,24 +93,208 @@
         justification = "METRIC")
 public class HealthConnectServiceLogsTests {
 
+    private final Context mContext = ApplicationProvider.getApplicationContext();
     private final HealthConnectManager mHealthConnectManager =
-            InstrumentationRegistry.getContext().getSystemService(HealthConnectManager.class);
-    private static final String MY_PACKAGE_NAME =
-            InstrumentationRegistry.getContext().getPackageName();
+            requireNonNull(mContext.getSystemService(HealthConnectManager.class));
+    private final PhrCtsTestUtils mPhrTestUtils = new PhrCtsTestUtils(mHealthConnectManager);
 
     @Before
     public void before() throws InterruptedException {
+        TestUtils.deleteAllStagedRemoteData();
         // insert a record so the test app gets an app id in HC
         Record record =
                 new StepsRecord.Builder(getEmptyMetadata(), EPOCH, Instant.now(), 123).build();
         insertRecords(List.of(record), mHealthConnectManager);
 
         deleteAllRecordsAddedByTestApp(mHealthConnectManager);
+        mPhrTestUtils.deleteAllMedicalData();
     }
 
     @After
     public void after() throws InterruptedException {
         deleteAllRecordsAddedByTestApp(mHealthConnectManager);
+        mPhrTestUtils.deleteAllMedicalData();
+    }
+
+    @Test
+    public void testCreateMedicalDataSourceSuccess() throws InterruptedException {
+        mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+    }
+
+    @Test
+    public void testCreateMedicalDataSourceError() {
+        callApiWhileMigrationInProgress(
+                () -> mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1")));
+    }
+
+    @Test
+    public void testGetMedicalDataSourcesByIdsSuccess() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+
+        mPhrTestUtils.getMedicalDataSourcesByIds(List.of(dataSource.getId()));
+    }
+
+    @Test
+    public void testGetMedicalDataSourcesByIdsError() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+
+        callApiWhileMigrationInProgress(
+                () -> mPhrTestUtils.getMedicalDataSourcesByIds(List.of(dataSource.getId())));
+    }
+
+    @Test
+    public void testGetMedicalDataSourcesByRequestSuccess() throws InterruptedException {
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(mContext.getPackageName())
+                        .build();
+
+        mPhrTestUtils.getMedicalDataSourcesByRequest(request);
+    }
+
+    @Test
+    public void testGetMedicalDataSourcesByRequestError() {
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(mContext.getPackageName())
+                        .build();
+
+        callApiWhileMigrationInProgress(
+                () -> mPhrTestUtils.getMedicalDataSourcesByRequest(request));
+    }
+
+    @Test
+    public void testDeleteMedicalDataSourceWithDataSuccess() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+
+        mPhrTestUtils.deleteMedicalDataSourceWithData(dataSource.getId());
+    }
+
+    @Test
+    public void testDeleteMedicalDataSourceWithDataError() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        callApiWhileMigrationInProgress(
+                () -> mPhrTestUtils.deleteMedicalDataSourceWithData(dataSource.getId()));
+    }
+
+    @Test
+    public void testUpsertMedicalResourcesSuccess() throws InterruptedException {
+        MedicalDataSource medicalDataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        mPhrTestUtils.upsertMedicalData(medicalDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+    }
+
+    @Test
+    public void testUpsertMedicalResourcesError() throws InterruptedException {
+        MedicalDataSource medicalDataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+
+        callApiWhileMigrationInProgress(
+                () ->
+                        mPhrTestUtils.upsertMedicalData(
+                                medicalDataSource.getId(), FHIR_DATA_IMMUNIZATION));
+    }
+
+    @Test
+    public void testReadMedicalResourcesByIdsSuccess() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource resource =
+                mPhrTestUtils.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        mPhrTestUtils.readMedicalResourcesByIds(List.of(resource.getId()));
+    }
+
+    @Test
+    public void testReadMedicalResourcesByIdsError() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource resource =
+                mPhrTestUtils.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        callApiWhileMigrationInProgress(
+                () -> mPhrTestUtils.readMedicalResourcesByIds(List.of(resource.getId())));
+    }
+
+    @Test
+    public void testReadMedicalResourcesByRequestsSuccess() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        mPhrTestUtils.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        mPhrTestUtils.readMedicalResourcesByRequest(request);
+    }
+
+    @Test
+    public void testReadMedicalResourcesByRequestsError() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        mPhrTestUtils.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        callApiWhileMigrationInProgress(
+                () -> {
+                    ReadMedicalResourcesInitialRequest request =
+                            new ReadMedicalResourcesInitialRequest.Builder(
+                                            MEDICAL_RESOURCE_TYPE_VACCINES)
+                                    .build();
+                    mPhrTestUtils.readMedicalResourcesByRequest(request);
+                });
+    }
+
+    @Test
+    public void testDeleteMedicalResourcesByIdsSuccess() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource medicalResource =
+                mPhrTestUtils.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        mPhrTestUtils.deleteMedicalResourcesByIds(List.of(medicalResource.getId()));
+    }
+
+    @Test
+    public void testDeleteMedicalResourcesByIdsError() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource medicalResource =
+                mPhrTestUtils.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        callApiWhileMigrationInProgress(
+                () -> mPhrTestUtils.deleteMedicalResourcesByIds(List.of(medicalResource.getId())));
+    }
+
+    @Test
+    public void testDeleteMedicalResourcesByRequestSuccess() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource medicalResource =
+                mPhrTestUtils.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        mPhrTestUtils.deleteMedicalResourcesByRequest(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(medicalResource.getType())
+                        .build());
+    }
+
+    @Test
+    public void testDeleteMedicalResourcesByRequestError() throws InterruptedException {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource medicalResource =
+                mPhrTestUtils.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        callApiWhileMigrationInProgress(
+                () ->
+                        mPhrTestUtils.deleteMedicalResourcesByRequest(
+                                new DeleteMedicalResourcesRequest.Builder()
+                                        .addMedicalResourceType(medicalResource.getType())
+                                        .build()));
     }
 
     @Test
@@ -173,7 +369,9 @@
                 new ReadRecordsRequestUsingFilters.Builder<>(StepsRecord.class)
                         .setTimeRangeFilter(getDefaultTimeRangeFilter())
                         .addDataOrigins(
-                                new DataOrigin.Builder().setPackageName(MY_PACKAGE_NAME).build())
+                                new DataOrigin.Builder()
+                                        .setPackageName(mContext.getPackageName())
+                                        .build())
                         .setPageSize(1)
                         .build(),
                 Executors.newSingleThreadExecutor(),
@@ -413,4 +611,34 @@
 
         assertThat(latch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
     }
+
+    /**
+     * Executes {code apiCall} when migration is in progress.
+     *
+     * <p>This is mainly used to emulate API call failures.
+     */
+    private static void callApiWhileMigrationInProgress(Task apiCall) {
+        try {
+            logErrorIfAny(TestUtils::startMigrationWithShellPermissionIdentity);
+
+            apiCall.execute();
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        } finally {
+            logErrorIfAny(TestUtils::finishMigrationWithShellPermissionIdentity);
+        }
+    }
+
+    /** Executes a {@link Task} and logs error if any. */
+    private static void logErrorIfAny(Task task) {
+        try {
+            task.execute();
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+    }
+
+    private interface Task {
+        void execute() throws Exception;
+    }
 }
diff --git a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/HealthConnectUiTestHelper.kt b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/HealthConnectUiTestHelper.kt
index 88ecf03..f72d4a3 100644
--- a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/HealthConnectUiTestHelper.kt
+++ b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/HealthConnectUiTestHelper.kt
@@ -31,6 +31,7 @@
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+
 /**
  * These tests are run by statsdatom/healthconnect to log atoms by triggering Health Connect APIs.
  *
@@ -38,8 +39,7 @@
  */
 @NonApiTest(exemptionReasons = [], justification = "METRIC")
 class HealthConnectUiTestHelper {
-    @get:Rule
-    val disableAnimationRule = DisableAnimationRule()
+    @get:Rule val disableAnimationRule = DisableAnimationRule()
 
     private val context: Context = ApplicationProvider.getApplicationContext()
     private val mHealthConnectManager: HealthConnectManager? =
@@ -101,6 +101,7 @@
             UiTestUtils.waitDisplayed(By.text("App permissions"))
             UiTestUtils.scrollDownTo(By.text("Manage data"))
             UiTestUtils.clickOnText("Manage data")
+            UiTestUtils.waitDisplayed(By.text("Auto-delete"))
         }
     }
 }
diff --git a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/TestAppHelper.java b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/TestAppHelper.java
index 3211c88..5de00f3 100644
--- a/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/TestAppHelper.java
+++ b/tests/cts/hostsidetests/healthconnect/HealthConnectTestHelper/src/android/healthconnect/cts/testhelper/TestAppHelper.java
@@ -17,13 +17,20 @@
 package android.healthconnect.cts.testhelper;
 
 import static android.healthconnect.cts.lib.BundleHelper.CREATE_MEDICAL_DATA_SOURCE_QUERY;
+import static android.healthconnect.cts.lib.BundleHelper.DELETE_MEDICAL_DATA_SOURCE_WITH_DATA_QUERY;
+import static android.healthconnect.cts.lib.BundleHelper.DELETE_MEDICAL_RESOURCES_BY_IDS_QUERY;
+import static android.healthconnect.cts.lib.BundleHelper.DELETE_MEDICAL_RESOURCES_BY_REQUEST_QUERY;
 import static android.healthconnect.cts.lib.BundleHelper.DELETE_RECORDS_QUERY;
 import static android.healthconnect.cts.lib.BundleHelper.GET_CHANGE_LOG_TOKEN_QUERY;
+import static android.healthconnect.cts.lib.BundleHelper.GET_MEDICAL_DATA_SOURCES_USING_IDS_QUERY;
+import static android.healthconnect.cts.lib.BundleHelper.GET_MEDICAL_DATA_SOURCES_USING_REQUEST_QUERY;
 import static android.healthconnect.cts.lib.BundleHelper.INSERT_RECORDS_QUERY;
 import static android.healthconnect.cts.lib.BundleHelper.INTENT_EXCEPTION;
 import static android.healthconnect.cts.lib.BundleHelper.KILL_SELF_REQUEST;
 import static android.healthconnect.cts.lib.BundleHelper.QUERY_TYPE;
 import static android.healthconnect.cts.lib.BundleHelper.READ_CHANGE_LOGS_QUERY;
+import static android.healthconnect.cts.lib.BundleHelper.READ_MEDICAL_RESOURCES_BY_IDS_QUERY;
+import static android.healthconnect.cts.lib.BundleHelper.READ_MEDICAL_RESOURCES_BY_REQUEST_QUERY;
 import static android.healthconnect.cts.lib.BundleHelper.READ_RECORDS_QUERY;
 import static android.healthconnect.cts.lib.BundleHelper.READ_RECORDS_USING_IDS_QUERY;
 import static android.healthconnect.cts.lib.BundleHelper.SELF_REVOKE_PERMISSION_REQUEST;
@@ -33,6 +40,11 @@
 import android.content.Context;
 import android.content.Intent;
 import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.DeleteMedicalResourcesRequest;
+import android.health.connect.GetMedicalDataSourcesRequest;
+import android.health.connect.MedicalResourceId;
+import android.health.connect.ReadMedicalResourcesRequest;
+import android.health.connect.ReadMedicalResourcesResponse;
 import android.health.connect.ReadRecordsRequestUsingFilters;
 import android.health.connect.ReadRecordsRequestUsingIds;
 import android.health.connect.RecordIdFilter;
@@ -79,6 +91,20 @@
             case GET_CHANGE_LOG_TOKEN_QUERY -> handleGetChangeLogToken(context, bundle);
             case CREATE_MEDICAL_DATA_SOURCE_QUERY -> handleCreateMedicalDataSource(context, bundle);
             case UPSERT_MEDICAL_RESOURCES_QUERY -> handleUpsertMedicalResource(context, bundle);
+            case READ_MEDICAL_RESOURCES_BY_REQUEST_QUERY ->
+                    handleReadMedicalResourcesByRequest(context, bundle);
+            case READ_MEDICAL_RESOURCES_BY_IDS_QUERY ->
+                    handleReadMedicalResourcesByIds(context, bundle);
+            case GET_MEDICAL_DATA_SOURCES_USING_IDS_QUERY ->
+                    handleGetMedicalDataSourcesByIds(context, bundle);
+            case GET_MEDICAL_DATA_SOURCES_USING_REQUEST_QUERY ->
+                    handleGetMedicalDataSourcesByRequest(context, bundle);
+            case DELETE_MEDICAL_RESOURCES_BY_REQUEST_QUERY ->
+                    handleDeleteMedicalResourcesByRequest(context, bundle);
+            case DELETE_MEDICAL_RESOURCES_BY_IDS_QUERY ->
+                    handleDeleteMedicalResourcesByIds(context, bundle);
+            case DELETE_MEDICAL_DATA_SOURCE_WITH_DATA_QUERY ->
+                    handleDeleteMedicalDataSourceWithData(context, bundle);
             case SELF_REVOKE_PERMISSION_REQUEST -> handleSelfRevoke(context, bundle);
             case KILL_SELF_REQUEST -> handleKillSelf();
             default ->
@@ -140,6 +166,24 @@
         return BundleHelper.fromMedicalDataSource(receiver.getResponse());
     }
 
+    private static Bundle handleGetMedicalDataSourcesByIds(Context context, Bundle bundle)
+            throws Exception {
+        List<String> ids = BundleHelper.toMedicalDataSourceIds(bundle);
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        TestUtils.getHealthConnectManager(context)
+                .getMedicalDataSources(ids, Executors.newSingleThreadExecutor(), receiver);
+        return BundleHelper.fromMedicalDataSources(receiver.getResponse());
+    }
+
+    private static Bundle handleGetMedicalDataSourcesByRequest(Context context, Bundle bundle)
+            throws Exception {
+        GetMedicalDataSourcesRequest request = BundleHelper.toMedicalDataSourceRequest(bundle);
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        TestUtils.getHealthConnectManager(context)
+                .getMedicalDataSources(request, Executors.newSingleThreadExecutor(), receiver);
+        return BundleHelper.fromMedicalDataSources(receiver.getResponse());
+    }
+
     private static Bundle handleUpsertMedicalResource(Context context, Bundle bundle)
             throws Exception {
         List<UpsertMedicalResourceRequest> requests =
@@ -150,6 +194,56 @@
         return BundleHelper.fromMedicalResources(receiver.getResponse());
     }
 
+    private static Bundle handleReadMedicalResourcesByRequest(Context context, Bundle bundle)
+            throws Exception {
+        ReadMedicalResourcesRequest request = BundleHelper.toReadMedicalResourcesRequest(bundle);
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        TestUtils.getHealthConnectManager(context)
+                .readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+        return BundleHelper.fromReadMedicalResourcesResponse(receiver.getResponse());
+    }
+
+    private static Bundle handleReadMedicalResourcesByIds(Context context, Bundle bundle)
+            throws Exception {
+        List<MedicalResourceId> ids = BundleHelper.toMedicalResourceIds(bundle);
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        TestUtils.getHealthConnectManager(context)
+                .readMedicalResources(ids, Executors.newSingleThreadExecutor(), receiver);
+        return BundleHelper.fromMedicalResources(receiver.getResponse());
+    }
+
+    private static Bundle handleDeleteMedicalResourcesByIds(Context context, Bundle bundle)
+            throws Exception {
+        List<MedicalResourceId> ids = BundleHelper.toMedicalResourceIds(bundle);
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+        TestUtils.getHealthConnectManager(context)
+                .deleteMedicalResources(ids, Executors.newSingleThreadExecutor(), receiver);
+        receiver.verifyNoExceptionOrThrow();
+        return new Bundle();
+    }
+
+    private static Bundle handleDeleteMedicalResourcesByRequest(Context context, Bundle bundle)
+            throws Exception {
+        DeleteMedicalResourcesRequest request =
+                BundleHelper.toDeleteMedicalResourcesRequest(bundle);
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+        TestUtils.getHealthConnectManager(context)
+                .deleteMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+        receiver.verifyNoExceptionOrThrow();
+        return new Bundle();
+    }
+
+    private static Bundle handleDeleteMedicalDataSourceWithData(Context context, Bundle bundle)
+            throws Exception {
+        String id = BundleHelper.toMedicalDataSourceId(bundle);
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+        TestUtils.getHealthConnectManager(context)
+                .deleteMedicalDataSourceWithData(id, Executors.newSingleThreadExecutor(), receiver);
+        receiver.verifyNoExceptionOrThrow();
+        return new Bundle();
+    }
+
     private static Bundle handleSelfRevoke(Context context, Bundle bundle) throws Exception {
         String permissionToRevoke = BundleHelper.toPermissionToSelfRevoke(bundle);
         context.revokeSelfPermissionOnKill(permissionToRevoke);
diff --git a/tests/cts/hostsidetests/healthconnect/host/src/android/healthconnect/cts/logging/HealthConnectDailyLogsStatsTests.java b/tests/cts/hostsidetests/healthconnect/host/src/android/healthconnect/cts/logging/HealthConnectDailyLogsStatsTests.java
index cd398cb..5b0ce67 100644
--- a/tests/cts/hostsidetests/healthconnect/host/src/android/healthconnect/cts/logging/HealthConnectDailyLogsStatsTests.java
+++ b/tests/cts/hostsidetests/healthconnect/host/src/android/healthconnect/cts/logging/HealthConnectDailyLogsStatsTests.java
@@ -18,6 +18,10 @@
 
 import static android.healthconnect.cts.HostSideTestUtil.isHardwareSupported;
 
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.cts.statsdatom.lib.AtomTestUtils;
@@ -25,9 +29,13 @@
 import android.cts.statsdatom.lib.DeviceUtils;
 import android.cts.statsdatom.lib.ReportUtils;
 import android.healthconnect.cts.HostSideTestUtil;
+import android.platform.test.annotations.RequiresFlagsEnabled;
 
 import com.android.os.StatsLog;
 import com.android.os.healthfitness.api.ApiExtensionAtoms;
+import com.android.os.healthfitness.api.HealthConnectPermissionStats;
+import com.android.os.healthfitness.api.HealthConnectPhrStorageStats;
+import com.android.os.healthfitness.api.HealthConnectPhrUsageStats;
 import com.android.os.healthfitness.api.HealthConnectStorageStats;
 import com.android.os.healthfitness.api.HealthConnectUsageStats;
 import com.android.tradefed.build.IBuildInfo;
@@ -139,6 +147,62 @@
         assertThat(atom.getChangelogCount()).isGreaterThan(2);
     }
 
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY
+    })
+    public void testPhrUsageStats() throws Exception {
+        if (!isHardwareSupported(getDevice())) {
+            return;
+        }
+        ConfigUtils.uploadConfigForPushedAtoms(
+                getDevice(),
+                TEST_APP_PKG_NAME,
+                new int[] {ApiExtensionAtoms.HEALTH_CONNECT_PHR_USAGE_STATS_FIELD_NUMBER});
+
+        List<StatsLog.EventMetricData> data =
+                getEventMetricDataList(
+                        "testUpsertMedicalResourcesThenReadSuccess", NUMBER_OF_RETRIES);
+
+        assertThat(data.size()).isAtLeast(1);
+        HealthConnectPhrUsageStats atom =
+                data.get(data.size() - 1)
+                        .getAtom()
+                        .getExtension(ApiExtensionAtoms.healthConnectPhrUsageStats);
+
+        assertThat(atom.getMedicalResourceCount()).isEqualTo(1);
+        assertThat(atom.getConnectedMedicalDatasourceCount()).isEqualTo(1);
+        assertThat(atom.getIsMonthlyActivePhrUser()).isTrue();
+        assertThat(atom.getGrantedPhrAppsCount()).isEqualTo(1);
+    }
+
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY
+    })
+    public void testPhrStorageStats() throws Exception {
+        if (!isHardwareSupported(getDevice())) {
+            return;
+        }
+        ConfigUtils.uploadConfigForPushedAtoms(
+                getDevice(),
+                TEST_APP_PKG_NAME,
+                new int[] {ApiExtensionAtoms.HEALTH_CONNECT_PHR_STORAGE_STATS_FIELD_NUMBER});
+
+        List<StatsLog.EventMetricData> data =
+                getEventMetricDataList(
+                        "testUpsertMedicalResourcesThenReadSuccess", NUMBER_OF_RETRIES);
+
+        assertThat(data.size()).isAtLeast(1);
+        HealthConnectPhrStorageStats atom =
+                data.get(data.size() - 1)
+                        .getAtom()
+                        .getExtension(ApiExtensionAtoms.healthConnectPhrStorageStats);
+        assertThat(atom.getPhrDataSize()).isGreaterThan(0);
+    }
+
     public void testIsUserActive_insertRecord_userMonthlyActiveNextDay() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -307,6 +371,48 @@
         assertThat(atom.getIsMonthlyActiveUser()).isFalse();
     }
 
+    public void testPermissionStats() throws Exception {
+        if (!isHardwareSupported(getDevice())) {
+            return;
+        }
+
+        List<String> testAppPermissions =
+                List.of(
+                        "WRITE_BLOOD_PRESSURE",
+                        "WRITE_HEART_RATE",
+                        "WRITE_STEPS",
+                        "READ_BLOOD_PRESSURE",
+                        "READ_HEART_RATE",
+                        "WRITE_MEDICAL_DATA",
+                        "READ_MEDICAL_DATA_VACCINES",
+                        "READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES",
+                        "READ_MEDICAL_DATA_CONDITIONS",
+                        "READ_MEDICAL_DATA_LABORATORY_RESULTS",
+                        "READ_MEDICAL_DATA_MEDICATIONS",
+                        "READ_MEDICAL_DATA_PERSONAL_DETAILS",
+                        "READ_MEDICAL_DATA_PRACTITIONER_DETAILS",
+                        "READ_MEDICAL_DATA_PREGNANCY",
+                        "READ_MEDICAL_DATA_PROCEDURES",
+                        "READ_MEDICAL_DATA_SOCIAL_HISTORY",
+                        "READ_MEDICAL_DATA_VISITS",
+                        "READ_MEDICAL_DATA_VITAL_SIGNS");
+
+        ConfigUtils.uploadConfigForPushedAtoms(
+                getDevice(),
+                TEST_APP_PKG_NAME,
+                new int[] {ApiExtensionAtoms.HEALTH_CONNECT_PERMISSION_STATS_FIELD_NUMBER});
+        List<StatsLog.EventMetricData> data =
+                getEventMetricDataList(/* testName= */ null, NUMBER_OF_RETRIES);
+        assertThat(data.size()).isAtLeast(1);
+        HealthConnectPermissionStats atom =
+                data.get(data.size() - 1)
+                        .getAtom()
+                        .getExtension(ApiExtensionAtoms.healthConnectPermissionStats);
+
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
+        assertThat(atom.getPermissionNameList()).isEqualTo(testAppPermissions);
+    }
+
     private List<StatsLog.EventMetricData> getEventMetricDataList(String testName, int retryCount)
             throws Exception {
         if (retryCount == 0) {
@@ -326,7 +432,7 @@
     }
 
     private void clearData() throws Exception {
-        triggerTestInTestApp(DAILY_LOG_TESTS_ACTIVITY, "deleteAllRecordsAddedForTest");
+        triggerTestInTestApp(DAILY_LOG_TESTS_ACTIVITY, "deleteAllStagedRemoteData");
         // Next two lines will delete newly added Access Logs as all access logs over 7 days are
         // deleted by the AutoDeleteService which is run by the daily job.
         increaseDeviceTimeByDays(10);
diff --git a/tests/cts/hostsidetests/healthconnect/host/src/android/healthconnect/cts/logging/HealthConnectServiceStatsTests.java b/tests/cts/hostsidetests/healthconnect/host/src/android/healthconnect/cts/logging/HealthConnectServiceStatsTests.java
index 84e4589..dce3e8e 100644
--- a/tests/cts/hostsidetests/healthconnect/host/src/android/healthconnect/cts/logging/HealthConnectServiceStatsTests.java
+++ b/tests/cts/hostsidetests/healthconnect/host/src/android/healthconnect/cts/logging/HealthConnectServiceStatsTests.java
@@ -17,8 +17,24 @@
 package android.healthconnect.cts.logging;
 
 import static android.healthconnect.cts.HostSideTestUtil.isHardwareSupported;
+import static android.healthfitness.api.ApiMethod.CREATE_MEDICAL_DATA_SOURCE;
+import static android.healthfitness.api.ApiMethod.DELETE_MEDICAL_DATA_SOURCE_WITH_DATA;
+import static android.healthfitness.api.ApiMethod.DELETE_MEDICAL_RESOURCES_BY_IDS;
+import static android.healthfitness.api.ApiMethod.DELETE_MEDICAL_RESOURCES_BY_REQUESTS;
+import static android.healthfitness.api.ApiMethod.GET_MEDICAL_DATA_SOURCES_BY_IDS;
+import static android.healthfitness.api.ApiMethod.GET_MEDICAL_DATA_SOURCES_BY_REQUESTS;
+import static android.healthfitness.api.ApiMethod.READ_MEDICAL_RESOURCES_BY_IDS;
+import static android.healthfitness.api.ApiMethod.READ_MEDICAL_RESOURCES_BY_REQUESTS;
+import static android.healthfitness.api.ApiMethod.UPSERT_MEDICAL_RESOURCES;
+import static android.healthfitness.api.ApiStatus.ERROR;
+import static android.healthfitness.api.ApiStatus.SUCCESS;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import android.cts.statsdatom.lib.ConfigUtils;
 import android.cts.statsdatom.lib.DeviceUtils;
@@ -28,26 +44,39 @@
 import android.healthfitness.api.ApiStatus;
 import android.healthfitness.api.ForegroundState;
 import android.healthfitness.api.RateLimit;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.host.HostFlagsValueProvider;
 
 import com.android.os.StatsLog;
 import com.android.os.healthfitness.api.ApiExtensionAtoms;
 import com.android.os.healthfitness.api.HealthConnectApiCalled;
 import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import com.google.protobuf.ExtensionRegistry;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 import java.util.List;
 
-public class HealthConnectServiceStatsTests extends DeviceTestCase implements IBuildReceiver {
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class HealthConnectServiceStatsTests extends BaseHostJUnit4Test implements IBuildReceiver {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule =
+            HostFlagsValueProvider.createCheckFlagsRule(this::getDevice);
 
-    public static final String TEST_APP_PKG_NAME = "android.healthconnect.cts.testhelper";
+    private static final String TEST_APP_PKG_NAME = "android.healthconnect.cts.testhelper";
     private IBuildInfo mCtsBuild;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
         }
@@ -58,13 +87,12 @@
         ReportUtils.clearReports(getDevice());
     }
 
-    @Override
-    protected void tearDown() throws Exception {
+    @After
+    public void tearDown() throws Exception {
         // TODO(b/313055175): Do not disable rate limiting once b/300238889 is resolved.
         HostSideTestUtil.restoreRateLimitingFeatureFlag(getDevice());
         ConfigUtils.removeConfig(getDevice());
         ReportUtils.clearReports(getDevice());
-        super.tearDown();
     }
 
     @Override
@@ -72,6 +100,103 @@
         mCtsBuild = buildInfo;
     }
 
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY
+    })
+    public void testPhrApiAndStatusLogs() throws Exception {
+        if (!isHardwareSupported(getDevice())) {
+            return;
+        }
+
+        List<AssertApiCallParams> testCases =
+                List.of(
+                        createAssertApiCallParams(
+                                "testCreateMedicalDataSourceSuccess",
+                                CREATE_MEDICAL_DATA_SOURCE,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testCreateMedicalDataSourceError",
+                                CREATE_MEDICAL_DATA_SOURCE,
+                                ERROR),
+                        createAssertApiCallParams(
+                                "testGetMedicalDataSourcesByIdsSuccess",
+                                GET_MEDICAL_DATA_SOURCES_BY_IDS,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testGetMedicalDataSourcesByIdsError",
+                                GET_MEDICAL_DATA_SOURCES_BY_IDS,
+                                ERROR),
+                        createAssertApiCallParams(
+                                "testGetMedicalDataSourcesByRequestSuccess",
+                                GET_MEDICAL_DATA_SOURCES_BY_REQUESTS,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testGetMedicalDataSourcesByRequestError",
+                                GET_MEDICAL_DATA_SOURCES_BY_REQUESTS,
+                                ERROR),
+                        createAssertApiCallParams(
+                                "testDeleteMedicalDataSourceWithDataSuccess",
+                                DELETE_MEDICAL_DATA_SOURCE_WITH_DATA,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testDeleteMedicalDataSourceWithDataError",
+                                DELETE_MEDICAL_DATA_SOURCE_WITH_DATA,
+                                ERROR),
+                        createAssertApiCallParams(
+                                "testUpsertMedicalResourcesSuccess",
+                                UPSERT_MEDICAL_RESOURCES,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testUpsertMedicalResourcesError", UPSERT_MEDICAL_RESOURCES, ERROR),
+                        createAssertApiCallParams(
+                                "testReadMedicalResourcesByIdsSuccess",
+                                READ_MEDICAL_RESOURCES_BY_IDS,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testReadMedicalResourcesByIdsError",
+                                READ_MEDICAL_RESOURCES_BY_IDS,
+                                ERROR),
+                        createAssertApiCallParams(
+                                "testReadMedicalResourcesByRequestsSuccess",
+                                READ_MEDICAL_RESOURCES_BY_REQUESTS,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testReadMedicalResourcesByRequestsError",
+                                READ_MEDICAL_RESOURCES_BY_REQUESTS,
+                                ERROR),
+                        createAssertApiCallParams(
+                                "testDeleteMedicalResourcesByIdsSuccess",
+                                DELETE_MEDICAL_RESOURCES_BY_IDS,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testDeleteMedicalResourcesByIdsError",
+                                DELETE_MEDICAL_RESOURCES_BY_IDS,
+                                ERROR),
+                        createAssertApiCallParams(
+                                "testDeleteMedicalResourcesByRequestSuccess",
+                                DELETE_MEDICAL_RESOURCES_BY_REQUESTS,
+                                SUCCESS),
+                        createAssertApiCallParams(
+                                "testDeleteMedicalResourcesByRequestError",
+                                DELETE_MEDICAL_RESOURCES_BY_REQUESTS,
+                                ERROR));
+
+        for (AssertApiCallParams params : testCases) {
+            setUp();
+
+            List<StatsLog.EventMetricData> data =
+                    uploadAtomConfigAndTriggerTest(params.methodNameToTriggerApi);
+
+            assertApiStatus(data, params.apiMethod, params.apiStatus);
+
+            tearDown();
+        }
+    }
+
+    @Test
     public void testInsertRecords() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -83,13 +208,15 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
+        assertThat(atom.getApiStatus()).isEqualTo(SUCCESS);
         assertThat(atom.getErrorCode()).isEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(2);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testInsertRecordsError() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -101,13 +228,15 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
+        assertThat(atom.getApiStatus()).isEqualTo(ERROR);
         assertThat(atom.getErrorCode()).isNotEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(2);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testUpdateRecords() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -120,13 +249,15 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
+        assertThat(atom.getApiStatus()).isEqualTo(SUCCESS);
         assertThat(atom.getErrorCode()).isEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(3);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testUpdateRecordsError() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -139,13 +270,15 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
+        assertThat(atom.getApiStatus()).isEqualTo(ERROR);
         assertThat(atom.getErrorCode()).isNotEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(1);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testDeleteRecords() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -161,15 +294,17 @@
             if (atom.getApiMethod().equals(ApiMethod.DELETE_DATA)
                     && atom.getNumberOfRecords() == 1) {
                 deletedRecords++;
-                assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
+                assertThat(atom.getApiStatus()).isEqualTo(SUCCESS);
                 assertThat(atom.getErrorCode()).isEqualTo(0);
                 assertThat(atom.getDurationMillis()).isAtLeast(0);
                 assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
+                assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
             }
         }
         assertThat(deletedRecords).isAtLeast(2);
     }
 
+    @Test
     public void testDeleteRecordsError() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -177,17 +312,18 @@
         List<StatsLog.EventMetricData> data =
                 uploadAtomConfigAndTriggerTest("testHealthConnectDeleteRecordsError");
         assertThat(data.size()).isAtLeast(3);
-        StatsLog.EventMetricData event =
-                getEventForApiMethod(data, ApiMethod.DELETE_DATA, ApiStatus.ERROR);
+        StatsLog.EventMetricData event = getEventForApiMethod(data, ApiMethod.DELETE_DATA, ERROR);
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
+        assertThat(atom.getApiStatus()).isEqualTo(ERROR);
         assertThat(atom.getErrorCode()).isNotEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testReadRecords() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -199,14 +335,16 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
+        assertThat(atom.getApiStatus()).isEqualTo(SUCCESS);
         assertThat(atom.getErrorCode()).isEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(1);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
         assertThat(atom.getCallerForegroundState()).isEqualTo(ForegroundState.FOREGROUND);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testReadRecordsError() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -218,13 +356,15 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
+        assertThat(atom.getApiStatus()).isEqualTo(ERROR);
         assertThat(atom.getErrorCode()).isNotEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
         assertThat(atom.getCallerForegroundState()).isEqualTo(ForegroundState.FOREGROUND);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testChangeLogTokenRequest() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -236,13 +376,15 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
+        assertThat(atom.getApiStatus()).isEqualTo(SUCCESS);
         assertThat(atom.getErrorCode()).isEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(0);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testChangeLogTokenRequestError() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -254,13 +396,15 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
+        assertThat(atom.getApiStatus()).isEqualTo(ERROR);
         assertThat(atom.getErrorCode()).isNotEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(0);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testChangeLogsRequest() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -272,14 +416,16 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
+        assertThat(atom.getApiStatus()).isEqualTo(SUCCESS);
         assertThat(atom.getErrorCode()).isEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(2);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
         assertThat(atom.getCallerForegroundState()).isEqualTo(ForegroundState.FOREGROUND);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testChangeLogsRequestError() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -291,13 +437,15 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
+        assertThat(atom.getApiStatus()).isEqualTo(ERROR);
         assertThat(atom.getErrorCode()).isNotEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
         assertThat(atom.getCallerForegroundState()).isEqualTo(ForegroundState.FOREGROUND);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testAggregatedDataRequest() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -309,14 +457,16 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
+        assertThat(atom.getApiStatus()).isEqualTo(SUCCESS);
         assertThat(atom.getErrorCode()).isEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(1);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
         assertThat(atom.getCallerForegroundState()).isEqualTo(ForegroundState.FOREGROUND);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
+    @Test
     public void testAggregatedDataRequestError() throws Exception {
         if (!isHardwareSupported(getDevice())) {
             return;
@@ -328,12 +478,13 @@
         assertThat(event).isNotNull();
         HealthConnectApiCalled atom =
                 event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
-        assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
+        assertThat(atom.getApiStatus()).isEqualTo(ERROR);
         assertThat(atom.getErrorCode()).isNotEqualTo(0);
         assertThat(atom.getDurationMillis()).isAtLeast(0);
         assertThat(atom.getNumberOfRecords()).isEqualTo(1);
         assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
         assertThat(atom.getCallerForegroundState()).isEqualTo(ForegroundState.FOREGROUND);
+        assertThat(atom.getPackageName()).isEqualTo(TEST_APP_PKG_NAME);
     }
 
     private List<StatsLog.EventMetricData> uploadAtomConfigAndTriggerTest(String testName)
@@ -351,7 +502,7 @@
         return ReportUtils.getEventMetricDataList(getDevice(), registry);
     }
 
-    private StatsLog.EventMetricData getEventForApiMethod(
+    private static StatsLog.EventMetricData getEventForApiMethod(
             List<StatsLog.EventMetricData> data, ApiMethod apiMethod, ApiStatus status) {
         for (StatsLog.EventMetricData datum : data) {
             HealthConnectApiCalled atom =
@@ -364,7 +515,7 @@
         return null;
     }
 
-    private StatsLog.EventMetricData getEventForApiMethod(
+    private static StatsLog.EventMetricData getEventForApiMethod(
             List<StatsLog.EventMetricData> data, ApiMethod apiMethod) {
         boolean isFirstCall = true;
         for (StatsLog.EventMetricData datum : data) {
@@ -382,4 +533,38 @@
         }
         return null;
     }
+
+    private static void assertApiStatus(
+            List<StatsLog.EventMetricData> data, ApiMethod apiMethod, ApiStatus apiStatus) {
+        StatsLog.EventMetricData event = getEventForApiMethod(data, apiMethod);
+        assertWithMessage("Asserting API %s with status %s", apiMethod.name(), apiStatus.name())
+                .that(event)
+                .isNotNull();
+        assertThat(event).isNotNull();
+        HealthConnectApiCalled atom =
+                event.getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
+        assertWithMessage("Asserting API %s with status %s", apiMethod.name(), apiStatus.name())
+                .that(atom.getApiStatus())
+                .isEqualTo(apiStatus);
+        assertWithMessage("Asserting API %s with status %s", apiMethod.name(), apiStatus.name())
+                .that(atom.getPackageName())
+                .isEqualTo(TEST_APP_PKG_NAME);
+    }
+
+    private static AssertApiCallParams createAssertApiCallParams(
+            String methodToTriggerApi, ApiMethod apiMethod, ApiStatus apiStatus) {
+        return new AssertApiCallParams(methodToTriggerApi, apiMethod, apiStatus);
+    }
+
+    private static class AssertApiCallParams {
+        public final String methodNameToTriggerApi;
+        public final ApiMethod apiMethod;
+        public final ApiStatus apiStatus;
+
+        AssertApiCallParams(String methodToTriggerApi, ApiMethod apiMethod, ApiStatus apiStatus) {
+            this.methodNameToTriggerApi = methodToTriggerApi;
+            this.apiMethod = apiMethod;
+            this.apiStatus = apiStatus;
+        }
+    }
 }
diff --git a/tests/cts/hostsidetests/healthconnect/host/src/util/HostSideTestUtil.java b/tests/cts/hostsidetests/healthconnect/host/src/util/HostSideTestUtil.java
index 9a74363..ef2bedd 100644
--- a/tests/cts/hostsidetests/healthconnect/host/src/util/HostSideTestUtil.java
+++ b/tests/cts/hostsidetests/healthconnect/host/src/util/HostSideTestUtil.java
@@ -47,7 +47,7 @@
 
     /** Clears all data on the device, including access logs. */
     public static void clearData(ITestDevice device) throws Exception {
-        triggerTestInTestApp(device, DAILY_LOG_TESTS_ACTIVITY, "deleteAllRecordsAddedForTest");
+        triggerTestInTestApp(device, DAILY_LOG_TESTS_ACTIVITY, "deleteAllStagedRemoteData");
         // Next two lines will delete newly added Access Logs as all access logs over 7 days are
         // deleted by the AutoDeleteService which is run by the daily job.
         increaseDeviceTimeByDays(device, 10);
diff --git a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/Android.bp b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/Android.bp
index 110b37d..5075f60 100644
--- a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/Android.bp
+++ b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/Android.bp
@@ -19,15 +19,15 @@
 java_library {
     name: "cts-healthconnect-lib",
     srcs: [
-          "src/**/*.java",
-          "src/**/*.kt"
+        "src/**/*.java",
+        "src/**/*.kt",
     ],
     static_libs: [
-                 "androidx.appcompat_appcompat",
-                 "androidx.test.rules",
-                  "cts-install-lib",
-                  "platform-test-annotations",
-                  "cts-healthconnect-utils",
+        "androidx.appcompat_appcompat",
+        "androidx.test.rules",
+        "cts-install-lib",
+        "platform-test-annotations",
+        "cts-healthconnect-utils",
     ],
-    sdk_version: "test_current"
+    sdk_version: "test_current",
 }
diff --git a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/ActivityIntensityRecordFactory.java b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/ActivityIntensityRecordFactory.java
new file mode 100644
index 0000000..5785a5a
--- /dev/null
+++ b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/ActivityIntensityRecordFactory.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.lib;
+
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
+import static android.healthconnect.cts.lib.BundleHelper.PREFIX;
+
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.Metadata;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+
+import java.time.Instant;
+import java.time.ZoneOffset;
+
+public final class ActivityIntensityRecordFactory extends RecordFactory<ActivityIntensityRecord> {
+
+    private static final String KEY_TYPE = PREFIX + "TYPE";
+
+    @Override
+    public ActivityIntensityRecord newFullRecord(
+            Metadata metadata, Instant startTime, Instant endTime) {
+        return new ActivityIntensityRecord.Builder(
+                        metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_VIGOROUS)
+                .setStartZoneOffset(ZoneOffset.ofHours(3))
+                .setEndZoneOffset(ZoneOffset.ofHours(-2))
+                .build();
+    }
+
+    @Override
+    public ActivityIntensityRecord anotherFullRecord(
+            Metadata metadata, Instant startTime, Instant endTime) {
+        return new ActivityIntensityRecord.Builder(
+                        metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                .setStartZoneOffset(ZoneOffset.ofHours(-1))
+                .setEndZoneOffset(ZoneOffset.ofHours(2))
+                .build();
+    }
+
+    @Override
+    public ActivityIntensityRecord newEmptyRecord(
+            Metadata metadata, Instant startTime, Instant endTime) {
+        return new ActivityIntensityRecord.Builder(
+                        metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                .build();
+    }
+
+    @Override
+    protected ActivityIntensityRecord recordWithMetadata(
+            ActivityIntensityRecord record, Metadata metadata) {
+        return new ActivityIntensityRecord.Builder(
+                        metadata,
+                        record.getStartTime(),
+                        record.getEndTime(),
+                        record.getActivityIntensityType())
+                .setStartZoneOffset(record.getStartZoneOffset())
+                .setEndZoneOffset(record.getEndZoneOffset())
+                .build();
+    }
+
+    @Override
+    protected Bundle getValuesBundleForRecord(ActivityIntensityRecord record) {
+        Bundle values = new Bundle();
+        values.putInt(KEY_TYPE, record.getActivityIntensityType());
+        return values;
+    }
+
+    @Override
+    public ActivityIntensityRecord newRecordFromValuesBundle(
+            Metadata metadata,
+            Instant startTime,
+            Instant endTime,
+            ZoneOffset startZoneOffset,
+            ZoneOffset endZoneOffset,
+            Bundle bundle) {
+        int type = bundle.getInt(KEY_TYPE);
+        return new ActivityIntensityRecord.Builder(metadata, startTime, endTime, type)
+                .setStartZoneOffset(startZoneOffset)
+                .setEndZoneOffset(endZoneOffset)
+                .build();
+    }
+
+    /** Creates a new {@link ActivityIntensityRecord} with empty metadata. */
+    public ActivityIntensityRecord newRecord(Instant startTime, Instant endTime, int type) {
+        return newRecord(startTime, endTime, type, null, null);
+    }
+
+    /** Creates a new {@link ActivityIntensityRecord} with empty metadata. */
+    public ActivityIntensityRecord newRecord(
+            Instant startTime,
+            Instant endTime,
+            int type,
+            @Nullable ZoneOffset startZoneOffset,
+            @Nullable ZoneOffset endZoneOffset) {
+        var builder =
+                new ActivityIntensityRecord.Builder(newEmptyMetadata(), startTime, endTime, type);
+
+        if (startZoneOffset != null) {
+            builder.setStartZoneOffset(startZoneOffset);
+        }
+
+        if (endZoneOffset != null) {
+            builder.setEndZoneOffset(endZoneOffset);
+        }
+
+        return builder.build();
+    }
+}
diff --git a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/BundleHelper.java b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/BundleHelper.java
index fe9338d..60397e5 100644
--- a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/BundleHelper.java
+++ b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/BundleHelper.java
@@ -17,6 +17,13 @@
 package android.healthconnect.cts.lib;
 
 import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.DeleteMedicalResourcesRequest;
+import android.health.connect.GetMedicalDataSourcesRequest;
+import android.health.connect.MedicalResourceId;
+import android.health.connect.ReadMedicalResourcesInitialRequest;
+import android.health.connect.ReadMedicalResourcesPageRequest;
+import android.health.connect.ReadMedicalResourcesRequest;
+import android.health.connect.ReadMedicalResourcesResponse;
 import android.health.connect.ReadRecordsRequestUsingFilters;
 import android.health.connect.ReadRecordsRequestUsingIds;
 import android.health.connect.RecordIdFilter;
@@ -56,8 +63,10 @@
 import java.time.Instant;
 import java.time.ZoneOffset;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.IntStream;
@@ -77,16 +86,49 @@
     public static final String GET_CHANGE_LOG_TOKEN_QUERY = PREFIX + "GET_CHANGE_LOG_TOKEN_QUERY";
     public static final String CREATE_MEDICAL_DATA_SOURCE_QUERY =
             PREFIX + "CREATE_MEDICAL_DATA_SOURCE_QUERY";
+    public static final String GET_MEDICAL_DATA_SOURCES_USING_IDS_QUERY =
+            PREFIX + "GET_MEDICAL_DATA_SOURCES_USING_IDS_QUERY";
+    public static final String GET_MEDICAL_DATA_SOURCES_USING_REQUEST_QUERY =
+            PREFIX + "GET_MEDICAL_DATA_SOURCES_USING_REQUEST_QUERY";
     public static final String UPSERT_MEDICAL_RESOURCES_QUERY =
             PREFIX + "UPSERT_MEDICAL_RESOURCE_QUERY";
+    public static final String READ_MEDICAL_RESOURCES_BY_REQUEST_QUERY =
+            PREFIX + "READ_MEDICAL_RESOURCES_BY_REQUEST_QUERY";
+    public static final String READ_MEDICAL_RESOURCES_BY_IDS_QUERY =
+            PREFIX + "READ_MEDICAL_RESOURCES_BY_IDS_QUERY";
+    public static final String DELETE_MEDICAL_RESOURCES_BY_REQUEST_QUERY =
+            PREFIX + "DELETE_MEDICAL_RESOURCES_BY_REQUEST_QUERY";
+    public static final String DELETE_MEDICAL_RESOURCES_BY_IDS_QUERY =
+            PREFIX + "DELETE_MEDICAL_RESOURCES_BY_IDS_QUERY";
+    public static final String DELETE_MEDICAL_DATA_SOURCE_WITH_DATA_QUERY =
+            PREFIX + "DELETE_MEDICAL_DATA_SOURCE_WITH_DATA_QUERY";
 
     private static final String CREATE_MEDICAL_DATA_SOURCE_REQUEST =
             PREFIX + "CREATE_MEDICAL_DATA_SOURCE_REQUEST";
+    private static final String GET_MEDICAL_DATA_SOURCES_REQUEST =
+            PREFIX + "GET_MEDICAL_DATA_SOURCES_REQUEST";
     public static final String MEDICAL_DATA_SOURCE_RESPONSE =
             PREFIX + "MEDICAL_DATA_SOURCE_RESPONSE";
+    public static final String MEDICAL_DATA_SOURCES_RESPONSE =
+            PREFIX + "MEDICAL_DATA_SOURCE_RESPONSE";
     private static final String UPSERT_MEDICAL_RESOURCE_REQUESTS =
             PREFIX + "UPSERT_MEDICAL_RESOURCE_REQUEST";
+    private static final String READ_MEDICAL_RESOURCES_REQUEST_IS_PAGE_REQUEST =
+            PREFIX + "READ_MEDICAL_RESOURCES_REQUEST_IS_PAGE_REQUEST";
+    private static final String READ_MEDICAL_RESOURCES_REQUEST_MEDICAL_RESOURCE_TYPE =
+            PREFIX + "READ_MEDICAL_RESOURCES_REQUEST_MEDICAL_RESOURCE_TYPE";
+    private static final String READ_MEDICAL_RESOURCES_REQUEST_DATA_SOURCE_IDS =
+            PREFIX + "READ_MEDICAL_RESOURCES_REQUEST_DATA_SOURCE_IDS";
+    private static final String READ_MEDICAL_RESOURCES_REQUEST_PAGE_TOKEN =
+            PREFIX + "READ_MEDICAL_RESOURCES_REQUEST_PAGE_TOKEN";
+    private static final String READ_MEDICAL_RESOURCES_REQUEST_PAGE_SIZE =
+            PREFIX + "READ_MEDICAL_RESOURCES_REQUEST_PAGE_SIZE";
+    private static final String MEDICAL_RESOURCE_IDS = PREFIX + "MEDICAL_RESOURCE_IDS";
     public static final String MEDICAL_RESOURCES_RESPONSE = PREFIX + "MEDICAL_RESOURCE_RESPONSE";
+    public static final String READ_MEDICAL_RESOURCES_RESPONSE =
+            PREFIX + "READ_MEDICAL_RESOURCES_RESPONSE";
+    private static final String DELETE_MEDICAL_RESOURCES_REQUEST =
+            PREFIX + "DELETE_MEDICAL_RESOURCES_REQUEST";
 
     public static final String SELF_REVOKE_PERMISSION_REQUEST =
             PREFIX + "SELF_REVOKE_PERMISSION_REQUEST";
@@ -105,6 +147,7 @@
     private static final String PACKAGE_NAME = PREFIX + "PACKAGE_NAME";
     private static final String CLIENT_ID = PREFIX + "CLIENT_ID";
     private static final String RECORD_ID = PREFIX + "RECORD_ID";
+    private static final String MEDICAL_DATA_SOURCE_ID = PREFIX + "MEDICAL_DATA_SOURCE_ID";
     private static final String METADATA = PREFIX + "METADATA";
     private static final String DEVICE = PREFIX + "DEVICE";
     private static final String DEVICE_TYPE = PREFIX + "DEVICE_TYPE";
@@ -140,7 +183,7 @@
     private static final String END_ZONE_OFFSET = PREFIX + "END_ZONE_OFFSET";
 
     /** Converts an insert records request to a bundle. */
-    public static Bundle fromInsertRecordsRequest(List<Record> records) {
+    public static Bundle fromInsertRecordsRequest(List<? extends Record> records) {
         Bundle bundle = new Bundle();
         bundle.putString(QUERY_TYPE, INSERT_RECORDS_QUERY);
         bundle.putParcelableArrayList(RECORD_LIST, new ArrayList<>(fromRecordList(records)));
@@ -421,6 +464,60 @@
         return bundle;
     }
 
+    /** Converts one UUID string into a bundle. */
+    public static Bundle fromMedicalDataSourceId(String id) {
+        Bundle bundle = new Bundle();
+        bundle.putString(QUERY_TYPE, DELETE_MEDICAL_DATA_SOURCE_WITH_DATA_QUERY);
+        bundle.putString(MEDICAL_DATA_SOURCE_ID, id);
+        return bundle;
+    }
+
+    /** Converts one UUID strings back from a bundle. */
+    public static String toMedicalDataSourceId(Bundle bundle) {
+        return bundle.getString(MEDICAL_DATA_SOURCE_ID);
+    }
+
+    /** Converts a list of UUID strings into a bundle. */
+    public static Bundle fromMedicalDataSourceIds(List<String> ids) {
+        Bundle bundle = new Bundle();
+        bundle.putString(QUERY_TYPE, GET_MEDICAL_DATA_SOURCES_USING_IDS_QUERY);
+        bundle.putStringArrayList(MEDICAL_DATA_SOURCE_ID, new ArrayList<>(ids));
+        return bundle;
+    }
+
+    /** Converts a list of UUID strings back from a bundle. */
+    public static List<String> toMedicalDataSourceIds(Bundle bundle) {
+        return bundle.getStringArrayList(MEDICAL_DATA_SOURCE_ID);
+    }
+
+    /** Converts a {@link GetMedicalDataSourcesRequest} into a bundle. */
+    public static Bundle fromMedicalDataSourceRequest(GetMedicalDataSourcesRequest request) {
+        Bundle bundle = new Bundle();
+        bundle.putString(QUERY_TYPE, GET_MEDICAL_DATA_SOURCES_USING_REQUEST_QUERY);
+        bundle.putParcelable(GET_MEDICAL_DATA_SOURCES_REQUEST, request);
+        return bundle;
+    }
+
+    /** Converts a {@link GetMedicalDataSourcesRequest} into a bundle. */
+    public static GetMedicalDataSourcesRequest toMedicalDataSourceRequest(Bundle bundle) {
+        return bundle.getParcelable(
+                GET_MEDICAL_DATA_SOURCES_REQUEST, GetMedicalDataSourcesRequest.class);
+    }
+
+    /** Converts a list of {@link MedicalDataSource}s into a bundle. */
+    public static Bundle fromMedicalDataSources(List<MedicalDataSource> medicalDataSources) {
+        Bundle bundle = new Bundle();
+        bundle.putParcelableArrayList(
+                MEDICAL_DATA_SOURCES_RESPONSE, new ArrayList<>(medicalDataSources));
+        return bundle;
+    }
+
+    /** Converts a list of {@link MedicalDataSource}s back from a bundle. */
+    public static List<MedicalDataSource> toMedicalDataSources(Bundle bundle) {
+        return bundle.getParcelableArrayList(
+                MEDICAL_DATA_SOURCES_RESPONSE, MedicalDataSource.class);
+    }
+
     /**
      * Converts a {@link MedicalDataSource} to a bundle for sending to another app.
      *
@@ -457,6 +554,93 @@
         return bundle;
     }
 
+    /** Converts a {@link ReadMedicalResourcesRequest} into a bundle. */
+    public static Bundle fromReadMedicalResourcesRequest(ReadMedicalResourcesRequest request) {
+        Bundle bundle = new Bundle();
+        bundle.putString(QUERY_TYPE, READ_MEDICAL_RESOURCES_BY_REQUEST_QUERY);
+        bundle.putInt(READ_MEDICAL_RESOURCES_REQUEST_PAGE_SIZE, request.getPageSize());
+
+        if (request instanceof ReadMedicalResourcesPageRequest) {
+            bundle.putBoolean(READ_MEDICAL_RESOURCES_REQUEST_IS_PAGE_REQUEST, true);
+            bundle.putString(
+                    READ_MEDICAL_RESOURCES_REQUEST_PAGE_TOKEN,
+                    ((ReadMedicalResourcesPageRequest) request).getPageToken());
+        } else if (request instanceof ReadMedicalResourcesInitialRequest) {
+            ReadMedicalResourcesInitialRequest initialRequest =
+                    (ReadMedicalResourcesInitialRequest) request;
+            bundle.putBoolean(READ_MEDICAL_RESOURCES_REQUEST_IS_PAGE_REQUEST, false);
+            bundle.putInt(
+                    READ_MEDICAL_RESOURCES_REQUEST_MEDICAL_RESOURCE_TYPE,
+                    initialRequest.getMedicalResourceType());
+            bundle.putStringArrayList(
+                    READ_MEDICAL_RESOURCES_REQUEST_DATA_SOURCE_IDS,
+                    new ArrayList<>(initialRequest.getDataSourceIds()));
+        } else {
+            throw new IllegalArgumentException(
+                    "Request was not of type ReadMedicalResourcesInitialRequest or"
+                            + " ReadMedicalResourcesPageRequest");
+        }
+
+        // Check that no data was lost and that the request can be restored again. This could happen
+        // if new fields are added to the ReadMedicalResourcesRequest without including them here.
+        if (!toReadMedicalResourcesRequest(bundle).equals(request)) {
+            throw new IllegalStateException("Data may be lost when converting to/from Bundle");
+        }
+
+        return bundle;
+    }
+
+    /** Converts a {@link ReadMedicalResourcesRequest} from a bundle. */
+    public static ReadMedicalResourcesRequest toReadMedicalResourcesRequest(Bundle bundle) {
+        boolean isPageRequest = bundle.getBoolean(READ_MEDICAL_RESOURCES_REQUEST_IS_PAGE_REQUEST);
+        int pageSize = bundle.getInt(READ_MEDICAL_RESOURCES_REQUEST_PAGE_SIZE);
+
+        if (isPageRequest) {
+            String pageToken = bundle.getString(READ_MEDICAL_RESOURCES_REQUEST_PAGE_TOKEN);
+            return new ReadMedicalResourcesPageRequest.Builder(pageToken)
+                    .setPageSize(pageSize)
+                    .build();
+        } else {
+            int medicalResourceType =
+                    bundle.getInt(READ_MEDICAL_RESOURCES_REQUEST_MEDICAL_RESOURCE_TYPE);
+            Set<String> dataSourceIds =
+                    new HashSet<>(
+                            bundle.getStringArrayList(
+                                    READ_MEDICAL_RESOURCES_REQUEST_DATA_SOURCE_IDS));
+            return new ReadMedicalResourcesInitialRequest.Builder(medicalResourceType)
+                    .addDataSourceIds(dataSourceIds)
+                    .setPageSize(pageSize)
+                    .build();
+        }
+    }
+
+    /** Converts a list of {@link MedicalResourceId}s from a bundle. */
+    public static List<MedicalResourceId> toMedicalResourceIds(Bundle bundle) {
+        return bundle.getParcelableArrayList(MEDICAL_RESOURCE_IDS, MedicalResourceId.class);
+    }
+
+    /**
+     * Converts a list of {@link MedicalResourceId}s into a bundle with QUERY_TYPE set to
+     * READ_MEDICAL_RESOURCES_BY_IDS_QUERY
+     */
+    public static Bundle fromMedicalResourceIdsForRead(List<MedicalResourceId> ids) {
+        Bundle bundle = new Bundle();
+        bundle.putString(QUERY_TYPE, READ_MEDICAL_RESOURCES_BY_IDS_QUERY);
+        bundle.putParcelableArrayList(MEDICAL_RESOURCE_IDS, new ArrayList<>(ids));
+        return bundle;
+    }
+
+    /**
+     * Converts a list of {@link MedicalResourceId}s into a bundle with QUERY_TYPE set to
+     * DELETE_MEDICAL_RESOURCES_BY_IDS_QUERY
+     */
+    public static Bundle fromMedicalResourceIdsForDelete(List<MedicalResourceId> ids) {
+        Bundle bundle = new Bundle();
+        bundle.putString(QUERY_TYPE, DELETE_MEDICAL_RESOURCES_BY_IDS_QUERY);
+        bundle.putParcelableArrayList(MEDICAL_RESOURCE_IDS, new ArrayList<>(ids));
+        return bundle;
+    }
+
     /**
      * Converts a list of {@link MedicalResource}s to a bundle for sending to another app.
      *
@@ -478,6 +662,33 @@
         return bundle.getParcelableArrayList(MEDICAL_RESOURCES_RESPONSE, MedicalResource.class);
     }
 
+    /** Converts a {@link ReadMedicalResourcesResponse} from a bundle. */
+    public static ReadMedicalResourcesResponse toReadMedicalResourcesResponse(Bundle bundle) {
+        return bundle.getParcelable(
+                READ_MEDICAL_RESOURCES_RESPONSE, ReadMedicalResourcesResponse.class);
+    }
+
+    /** Converts a {@link ReadMedicalResourcesResponse} to a bundle for sending to another app. */
+    public static Bundle fromReadMedicalResourcesResponse(ReadMedicalResourcesResponse response) {
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(READ_MEDICAL_RESOURCES_RESPONSE, response);
+        return bundle;
+    }
+
+    /** Converts a {@link DeleteMedicalResourcesRequest} from a bundle. */
+    public static DeleteMedicalResourcesRequest toDeleteMedicalResourcesRequest(Bundle bundle) {
+        return bundle.getParcelable(
+                DELETE_MEDICAL_RESOURCES_REQUEST, DeleteMedicalResourcesRequest.class);
+    }
+
+    /** Converts a {@link DeleteMedicalResourcesRequest} into a bundle. */
+    public static Bundle fromDeleteMedicalResourcesRequest(DeleteMedicalResourcesRequest request) {
+        Bundle bundle = new Bundle();
+        bundle.putString(QUERY_TYPE, DELETE_MEDICAL_RESOURCES_BY_REQUEST_QUERY);
+        bundle.putParcelable(DELETE_MEDICAL_RESOURCES_REQUEST, request);
+        return bundle;
+    }
+
     private static List<Bundle> fromRecordList(List<? extends Record> records) {
         return records.stream().map(BundleHelper::fromRecord).toList();
     }
diff --git a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/RecordFactory.java b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/RecordFactory.java
index 38b382d..50bb145 100644
--- a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/RecordFactory.java
+++ b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/RecordFactory.java
@@ -21,6 +21,7 @@
 import static android.health.connect.datatypes.Metadata.RECORDING_METHOD_AUTOMATICALLY_RECORDED;
 import static android.health.connect.datatypes.Metadata.RECORDING_METHOD_MANUAL_ENTRY;
 
+import android.health.connect.datatypes.ActivityIntensityRecord;
 import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.Device;
 import android.health.connect.datatypes.Metadata;
@@ -31,10 +32,28 @@
 import androidx.annotation.Nullable;
 
 import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
 import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
 
 public abstract class RecordFactory<T extends Record> {
 
+    public static final ZonedDateTime YESTERDAY_11AM =
+            LocalDate.now(ZoneId.systemDefault())
+                    .minusDays(1)
+                    .atTime(11, 0)
+                    .atZone(ZoneId.systemDefault());
+
+    public static final ZonedDateTime MIDNIGHT_ONE_WEEK_AGO =
+            YESTERDAY_11AM.truncatedTo(ChronoUnit.DAYS).minusDays(7);
+
+    public static final LocalDateTime YESTERDAY_10AM_LOCAL =
+            LocalDate.now(ZoneId.systemDefault()).minusDays(1).atTime(LocalTime.parse("10:00"));
+
     /**
      * Returns a record with all possible fields of this data type set to non-default values.
      *
@@ -228,7 +247,9 @@
     /** Returns a record test helper for given data type. */
     @Nullable
     public static RecordFactory<? extends Record> forDataType(Class<? extends Record> recordClass) {
-        if (recordClass.equals(MindfulnessSessionRecord.class)) {
+        if (recordClass.equals(ActivityIntensityRecord.class)) {
+            return new ActivityIntensityRecordFactory();
+        } else if (recordClass.equals(MindfulnessSessionRecord.class)) {
             return new MindfulnessSessionRecordFactory();
         }
         return null;
diff --git a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/TestAppProxy.java b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/TestAppProxy.java
index 2a39bd2..967f0c5 100644
--- a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/TestAppProxy.java
+++ b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/TestAppProxy.java
@@ -16,6 +16,7 @@
 
 package android.healthconnect.cts.lib;
 
+import static android.health.connect.datatypes.FhirVersion.parseFhirVersion;
 import static android.healthconnect.cts.lib.BundleHelper.INTENT_EXCEPTION;
 import static android.healthconnect.cts.lib.BundleHelper.KILL_SELF_REQUEST;
 import static android.healthconnect.cts.lib.BundleHelper.QUERY_TYPE;
@@ -28,6 +29,11 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.DeleteMedicalResourcesRequest;
+import android.health.connect.GetMedicalDataSourcesRequest;
+import android.health.connect.MedicalResourceId;
+import android.health.connect.ReadMedicalResourcesRequest;
+import android.health.connect.ReadMedicalResourcesResponse;
 import android.health.connect.ReadRecordsRequestUsingFilters;
 import android.health.connect.ReadRecordsRequestUsingIds;
 import android.health.connect.RecordIdFilter;
@@ -38,7 +44,6 @@
 import android.health.connect.datatypes.MedicalDataSource;
 import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.Record;
-import android.healthconnect.cts.utils.PhrDataFactory;
 import android.healthconnect.cts.utils.ProxyActivity;
 import android.os.Bundle;
 
@@ -103,7 +108,7 @@
     }
 
     /** Inserts records to HC on behalf of the app. */
-    public List<String> insertRecords(List<Record> records) throws Exception {
+    public List<String> insertRecords(List<? extends Record> records) throws Exception {
         Bundle requestBundle = BundleHelper.fromInsertRecordsRequest(records);
         Bundle responseBundle = getFromTestApp(requestBundle);
         return BundleHelper.toInsertRecordsResponse(responseBundle);
@@ -173,6 +178,21 @@
         return BundleHelper.toMedicalDataSource(responseBundle);
     }
 
+    /** Gets a list of {@link MedicalDataSource}s given a list of ids on behalf of the app. */
+    public List<MedicalDataSource> getMedicalDataSources(List<String> ids) throws Exception {
+        Bundle requestBundle = BundleHelper.fromMedicalDataSourceIds(ids);
+        Bundle responseBundle = getFromTestApp(requestBundle);
+        return BundleHelper.toMedicalDataSources(responseBundle);
+    }
+
+    /** Gets a list of {@link MedicalDataSource}s given a {@link GetMedicalDataSourcesRequest}. */
+    public List<MedicalDataSource> getMedicalDataSources(GetMedicalDataSourcesRequest request)
+            throws Exception {
+        Bundle requestBundle = BundleHelper.fromMedicalDataSourceRequest(request);
+        Bundle responseBundle = getFromTestApp(requestBundle);
+        return BundleHelper.toMedicalDataSources(responseBundle);
+    }
+
     /**
      * Upserts a Medical Resource to HC on behalf of the app.
      *
@@ -180,15 +200,55 @@
      */
     public MedicalResource upsertMedicalResource(String datasourceId, String data)
             throws Exception {
+        String R4VersionString = "4.0.1";
         UpsertMedicalResourceRequest request =
                 new UpsertMedicalResourceRequest.Builder(
-                                datasourceId, PhrDataFactory.FHIR_VERSION_R4, data)
+                                datasourceId, parseFhirVersion(R4VersionString), data)
                         .build();
         Bundle requestBundle = BundleHelper.fromUpsertMedicalResourceRequests(List.of(request));
         Bundle responseBundle = getFromTestApp(requestBundle);
         return BundleHelper.toMedicalResources(responseBundle).get(0);
     }
 
+    /**
+     * Reads a list of {@link MedicalResource}s for the provided {@code request} on behalf of the
+     * app.
+     */
+    public ReadMedicalResourcesResponse readMedicalResources(ReadMedicalResourcesRequest request)
+            throws Exception {
+        Bundle requestBundle = BundleHelper.fromReadMedicalResourcesRequest(request);
+        Bundle responseBundle = getFromTestApp(requestBundle);
+        return BundleHelper.toReadMedicalResourcesResponse(responseBundle);
+    }
+
+    /**
+     * Reads a list of {@link MedicalResource}s for the provided {@code ids} on behalf of the app.
+     */
+    public List<MedicalResource> readMedicalResources(List<MedicalResourceId> ids)
+            throws Exception {
+        Bundle requestBundle = BundleHelper.fromMedicalResourceIdsForRead(ids);
+        Bundle responseBundle = getFromTestApp(requestBundle);
+        return BundleHelper.toMedicalResources(responseBundle);
+    }
+
+    /** Deletes Medical Resources from HC on behalf of the app for the given {@code ids}. */
+    public void deleteMedicalResources(List<MedicalResourceId> ids) throws Exception {
+        Bundle requestBundle = BundleHelper.fromMedicalResourceIdsForDelete(ids);
+        getFromTestApp(requestBundle);
+    }
+
+    /** Deletes Medical Resources from HC on behalf of the app for the given {@code request}. */
+    public void deleteMedicalResources(DeleteMedicalResourcesRequest request) throws Exception {
+        Bundle requestBundle = BundleHelper.fromDeleteMedicalResourcesRequest(request);
+        getFromTestApp(requestBundle);
+    }
+
+    /** Deletes Medical Data Source with data for the provided {@code id} on behalf of the app. */
+    public void deleteMedicalDataSourceWithData(String id) throws Exception {
+        Bundle requestBundle = BundleHelper.fromMedicalDataSourceId(id);
+        getFromTestApp(requestBundle);
+    }
+
     /** Instructs the app to self-revokes the specified permission. */
     public void selfRevokePermission(String permission) throws Exception {
         Bundle requestBundle = BundleHelper.forSelfRevokePermissionRequest(permission);
diff --git a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/UiTestUtils.kt b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/UiTestUtils.kt
index c25ac27..0a62f4d 100644
--- a/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/UiTestUtils.kt
+++ b/tests/cts/hostsidetests/healthconnect/libs/HealthConnectTestLib/src/android/healthconnect/cts/lib/UiTestUtils.kt
@@ -43,6 +43,7 @@
     private val WAIT_TIMEOUT = Duration.ofSeconds(5)
     private val NOT_DISPLAYED_TIMEOUT = Duration.ofMillis(500)
     private val FIND_OBJECT_TIMEOUT = Duration.ofMillis(500)
+    private val NEW_WINDOW_TIMEOUT_MILLIS = 3000L
 
     private val TAG = UiTestUtils::class.java.simpleName
 
@@ -53,7 +54,7 @@
 
     const val TEST_APP_PACKAGE_NAME = "android.healthconnect.cts.app"
 
-    private val TEST_APP_2_PACKAGE_NAME = "android.healthconnect.cts.app2"
+    const val TEST_APP_2_PACKAGE_NAME = "android.healthconnect.cts.app2"
 
     const val TEST_APP_NAME = "Health Connect cts test app"
 
@@ -113,6 +114,14 @@
         getUiDevice().waitForIdle()
     }
 
+    fun clickOnDescAndWaitForNewWindow(text: String) {
+        findDesc(text).clickAndWait(Until.newWindow(), NEW_WINDOW_TIMEOUT_MILLIS)
+    }
+
+    fun clickOnTextAndWaitForNewWindow(text: String) {
+        findText(text).clickAndWait(Until.newWindow(), NEW_WINDOW_TIMEOUT_MILLIS)
+    }
+
     /**
      * Returns an object with given text if it's visible on the screen or throws otherwise.
      *
@@ -123,6 +132,15 @@
     }
 
     /**
+     * Returns an object that contains given text if it's visible on the screen or throws otherwise.
+     *
+     * Use this if the text label is expected to be visible on the screen without scrolling.
+     */
+    fun findTextContains(text: String): UiObject2 {
+        return findObject(By.textContains(text))
+    }
+
+    /**
      * Clicks on a text label if it's visible on the screen or throws otherwise.
      *
      * Use this if the text label is expected to be visible on the screen without scrolling.
@@ -131,6 +149,28 @@
         findObjectAndClick(By.text(text))
     }
 
+    /**
+     * Returns an object with given content description if it's visible on the screen.
+     *
+     * Throws if the object is not visible.
+     *
+     * Use this if the text label is expected to be visible on the screen without scrolling.
+     */
+    fun findDesc(desc: String): UiObject2 {
+        return findObject(By.desc(desc))
+    }
+
+    /**
+     * Clicks on an object with give content description if it's visible on the screen.
+     *
+     * Throws if the object is not visible.
+     *
+     * Use this if the object is expected to be visible on the screen without scrolling.
+     */
+    fun findDescAndClick(desc: String) {
+        findObjectAndClick(By.desc(desc))
+    }
+
     /** Throws an exception if given object is visible on the screen. */
     fun verifyObjectNotFound(selector: BySelector) {
         if (findObjectOrNull(selector) != null) {
@@ -163,7 +203,10 @@
     }
 
     fun scrollDownTo(selector: BySelector) {
-        waitFindObject(By.scrollable(true)).scrollUntil(Direction.DOWN, Until.findObject(selector))
+        val scrollable = waitFindObjectOrNull(By.scrollable(true), FIND_OBJECT_TIMEOUT.toMillis())
+
+        scrollable?.scrollUntil(Direction.DOWN, Until.findObject(selector))
+        findObject(selector)
     }
 
     fun scrollUpTo(selector: BySelector) {
@@ -174,14 +217,33 @@
         try {
             waitDisplayed(selector) { it.click() }
         } catch (e: Exception) {
-            getUiDevice()
-                .findObject(By.scrollable(true))
-                .scrollUntil(Direction.DOWN, Until.findObject(selector))
-                .click()
+            val scrollable = getUiDevice().findObject(By.scrollable(true))
+
+            if (scrollable == null) {
+                throw objectNotFoundExceptionWithDump(
+                    "Scrollable not found while trying to find $selector"
+                )
+            }
+
+            val obj = scrollable.scrollUntil(Direction.DOWN, Until.findObject(selector))
+
+            findObject(selector)
+
+            obj.click()
         }
         getUiDevice().waitForIdle()
     }
 
+    fun scrollDownToAndFindText(text: String) {
+        scrollDownTo(By.text(text))
+        findText(text)
+    }
+
+    fun scrollDownToAndFindTextContains(text: String) {
+        scrollDownTo(By.textContains(text))
+        findTextContains(text)
+    }
+
     fun skipOnboardingIfAppears() {
         val uiObject = findObjectOrNull(By.text("Get started"))
         uiObject?.click()
diff --git a/tests/cts/multiapptests/Android.bp b/tests/cts/multiapptests/Android.bp
index c420778..e7be9a0 100644
--- a/tests/cts/multiapptests/Android.bp
+++ b/tests/cts/multiapptests/Android.bp
@@ -26,6 +26,9 @@
     sdk_version: "test_current",
     min_sdk_version: "34",
     target_sdk_version: "34",
+    flags_packages: [
+        "healthfitness-aconfig-flags",
+    ],
 }
 
 android_test_helper_app {
@@ -38,6 +41,9 @@
     sdk_version: "test_current",
     min_sdk_version: "34",
     target_sdk_version: "34",
+    flags_packages: [
+        "healthfitness-aconfig-flags",
+    ],
 }
 
 android_test_helper_app {
@@ -74,6 +80,9 @@
     sdk_version: "test_current",
     min_sdk_version: "34",
     target_sdk_version: "34",
+    flags_packages: [
+        "healthfitness-aconfig-flags",
+    ],
 }
 
 android_test {
diff --git a/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppAWithNormalReadWritePermission.xml b/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppAWithNormalReadWritePermission.xml
index cae9717..2fd1c8c 100644
--- a/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppAWithNormalReadWritePermission.xml
+++ b/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppAWithNormalReadWritePermission.xml
@@ -28,6 +28,7 @@
     <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.WRITE_HYDRATION"/>
     <uses-permission android:name="android.permission.health.WRITE_ELEVATION_GAINED"/>
     <uses-permission android:name="android.permission.health.WRITE_FLOORS_CLIMBED"/>
@@ -62,11 +63,13 @@
     <uses-permission android:name="android.permission.health.WRITE_NUTRITION"/>
     <uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED"/>
     <uses-permission android:name="android.permission.health.WRITE_MINDFULNESS"/>
+    <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
 
     <uses-permission android:name="android.permission.health.READ_STEPS"/>
     <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
     <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.READ_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.READ_HYDRATION"/>
     <uses-permission android:name="android.permission.health.READ_ELEVATION_GAINED"/>
     <uses-permission android:name="android.permission.health.READ_FLOORS_CLIMBED"/>
diff --git a/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppBWithNormalReadWritePermission.xml b/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppBWithNormalReadWritePermission.xml
index 61d682f..f2399ae 100644
--- a/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppBWithNormalReadWritePermission.xml
+++ b/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppBWithNormalReadWritePermission.xml
@@ -28,6 +28,7 @@
     <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.WRITE_HYDRATION"/>
     <uses-permission android:name="android.permission.health.WRITE_ELEVATION_GAINED"/>
     <uses-permission android:name="android.permission.health.WRITE_FLOORS_CLIMBED"/>
@@ -67,6 +68,7 @@
     <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
     <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.READ_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.READ_HYDRATION"/>
     <uses-permission android:name="android.permission.health.READ_ELEVATION_GAINED"/>
     <uses-permission android:name="android.permission.health.READ_FLOORS_CLIMBED"/>
diff --git a/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppWithWritePermissionsOnly.xml b/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppWithWritePermissionsOnly.xml
index aaf2220..a04f195 100644
--- a/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppWithWritePermissionsOnly.xml
+++ b/tests/cts/multiapptests/HealthConnectTestHelper/CtsHealthConnectTestAppWithWritePermissionsOnly.xml
@@ -25,6 +25,7 @@
     <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
     <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_ACTIVITY_INTENSITY"/>
     <uses-permission android:name="android.permission.health.WRITE_HYDRATION"/>
     <uses-permission android:name="android.permission.health.WRITE_ELEVATION_GAINED"/>
     <uses-permission android:name="android.permission.health.WRITE_FLOORS_CLIMBED"/>
@@ -58,6 +59,7 @@
     <uses-permission android:name="android.permission.health.WRITE_NUTRITION"/>
     <uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED"/>
     <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
+    <uses-permission android:name="android.permission.health.WRITE_MINDFULNESS"/>
 
     <application android:label="CtsHealthConnectTestAppWithWritePermissionsOnly">
         <activity android:name="android.healthconnect.cts.testhelper.TestAppActivity"
diff --git a/tests/cts/multiapptests/src/android/healthconnect/cts/device/HealthConnectChangeLogsDeviceTests.java b/tests/cts/multiapptests/src/android/healthconnect/cts/device/HealthConnectChangeLogsDeviceTests.java
index d5b4187..e7f1bd0 100644
--- a/tests/cts/multiapptests/src/android/healthconnect/cts/device/HealthConnectChangeLogsDeviceTests.java
+++ b/tests/cts/multiapptests/src/android/healthconnect/cts/device/HealthConnectChangeLogsDeviceTests.java
@@ -68,7 +68,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/multiapptests/src/android/healthconnect/cts/device/HealthConnectDeviceTest.java b/tests/cts/multiapptests/src/android/healthconnect/cts/device/HealthConnectDeviceTest.java
index 4b62f9f..45c7bca 100644
--- a/tests/cts/multiapptests/src/android/healthconnect/cts/device/HealthConnectDeviceTest.java
+++ b/tests/cts/multiapptests/src/android/healthconnect/cts/device/HealthConnectDeviceTest.java
@@ -52,6 +52,7 @@
 import static android.healthconnect.cts.utils.TestUtils.yesterdayAt;
 
 import static com.android.compatibility.common.util.SystemUtil.eventually;
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -60,7 +61,6 @@
 
 import static java.time.Duration.ofMinutes;
 
-import android.app.UiAutomation;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.health.connect.AggregateRecordsRequest;
@@ -97,7 +97,6 @@
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.After;
 import org.junit.Before;
@@ -114,15 +113,10 @@
 
 @RunWith(AndroidJUnit4.class)
 public class HealthConnectDeviceTest {
-    static final String TAG = "HealthConnectDeviceTest";
     public static final String MANAGE_HEALTH_DATA = HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION;
 
     public static final String APP_A_DECLARED_PERMISSION = HealthPermissions.READ_STEPS;
 
-    static final long VERSION_CODE = 1;
-    private static final int ASYNC_RETRIES = 3;
-    private static final int ASYNC_RETRY_DELAY_MILLIS = 500;
-
     private static final Instant NOW = Instant.now().truncatedTo(ChronoUnit.MILLIS);
 
     private static final List<Record> TEST_RECORDS =
@@ -171,7 +165,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() {
@@ -453,20 +448,22 @@
         List<DataOrigin> dataOriginPrioOrder =
                 List.of(new DataOrigin.Builder().setPackageName(mContext.getPackageName()).build());
 
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-        updateDataOriginPriorityOrder(
-                new UpdateDataOriginPriorityOrderRequest(
-                        dataOriginPrioOrder, HealthDataCategory.ACTIVITY));
         List<String> oldPriorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(dataOrigin -> dataOrigin.getPackageName())
-                        .collect(Collectors.toList());
+                runWithShellPermissionIdentity(
+                        () -> {
+                            updateDataOriginPriorityOrder(
+                                    new UpdateDataOriginPriorityOrderRequest(
+                                            dataOriginPrioOrder, HealthDataCategory.ACTIVITY));
+
+                            return fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                    .getDataOriginsPriorityOrder()
+                                    .stream()
+                                    .map(DataOrigin::getPackageName)
+                                    .collect(Collectors.toList());
+                        },
+                        MANAGE_HEALTH_DATA);
 
         assertThat(oldPriorityList).contains(mContext.getPackageName());
-        uiAutomation.dropShellPermissionIdentity();
 
         AggregateRecordsResponse<Long> response =
                 TestUtils.getAggregateResponse(
@@ -685,16 +682,16 @@
     }
 
     @Test
-    public void testGrantingCorrectPermsPutsTheAppInPriorityList() throws InterruptedException {
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+    public void testGrantingCorrectPermsPutsTheAppInPriorityList() {
         List<String> oldPriorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(DataOrigin::getPackageName)
-                        .toList();
+                runWithShellPermissionIdentity(
+                        () ->
+                                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                        .getDataOriginsPriorityOrder()
+                                        .stream()
+                                        .map(DataOrigin::getPackageName)
+                                        .toList(),
+                        MANAGE_HEALTH_DATA);
 
         List<String> healthPerms =
                 getGrantedHealthPermissions(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
@@ -705,23 +702,22 @@
             grantPermission(APP_A_WITH_READ_WRITE_PERMS.getPackageName(), perm);
         }
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         List<String> newPriorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(DataOrigin::getPackageName)
-                        .toList();
+                runWithShellPermissionIdentity(
+                        () ->
+                                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                        .getDataOriginsPriorityOrder()
+                                        .stream()
+                                        .map(DataOrigin::getPackageName)
+                                        .toList(),
+                        MANAGE_HEALTH_DATA);
 
         assertThat(newPriorityList).hasSize(oldPriorityList.size() + 1);
         assertThat(newPriorityList).contains(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
     }
 
     @Test
-    public void testRevokingOnlyOneCorrectPermissionDoesntRemoveAppFromPriorityList()
-            throws InterruptedException {
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
+    public void testRevokingOnlyOneCorrectPermissionDoesntRemoveAppFromPriorityList() {
         List<String> healthPerms =
                 getGrantedHealthPermissions(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
 
@@ -731,25 +727,29 @@
             grantPermission(APP_A_WITH_READ_WRITE_PERMS.getPackageName(), perm);
         }
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         List<String> oldPriorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(dataOrigin -> dataOrigin.getPackageName())
-                        .collect(Collectors.toList());
+                runWithShellPermissionIdentity(
+                        () ->
+                                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                        .getDataOriginsPriorityOrder()
+                                        .stream()
+                                        .map(DataOrigin::getPackageName)
+                                        .collect(Collectors.toList()),
+                        MANAGE_HEALTH_DATA);
 
         assertThat(oldPriorityList).contains(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
 
         revokePermission(APP_A_WITH_READ_WRITE_PERMS.getPackageName(), healthPerms.get(0));
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         List<String> newPriorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(dataOrigin -> dataOrigin.getPackageName())
-                        .collect(Collectors.toList());
+                runWithShellPermissionIdentity(
+                        () ->
+                                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                        .getDataOriginsPriorityOrder()
+                                        .stream()
+                                        .map(DataOrigin::getPackageName)
+                                        .collect(Collectors.toList()),
+                        MANAGE_HEALTH_DATA);
 
         assertThat(newPriorityList).contains(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
 
@@ -757,10 +757,7 @@
     }
 
     @Test
-    public void testRevokingAllCorrectPermissionsRemovesAppFromPriorityList()
-            throws InterruptedException {
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
+    public void testRevokingAllCorrectPermissionsRemovesAppFromPriorityList() {
         List<String> healthPerms =
                 getGrantedHealthPermissions(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
 
@@ -770,13 +767,15 @@
             grantPermission(APP_A_WITH_READ_WRITE_PERMS.getPackageName(), perm);
         }
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         List<String> oldPriorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(dataOrigin -> dataOrigin.getPackageName())
-                        .collect(Collectors.toList());
+                runWithShellPermissionIdentity(
+                        () ->
+                                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                        .getDataOriginsPriorityOrder()
+                                        .stream()
+                                        .map(DataOrigin::getPackageName)
+                                        .collect(Collectors.toList()),
+                        MANAGE_HEALTH_DATA);
 
         assertThat(oldPriorityList).contains(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
 
@@ -784,13 +783,15 @@
             revokePermission(APP_A_WITH_READ_WRITE_PERMS.getPackageName(), perm);
         }
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         List<String> newPriorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(dataOrigin -> dataOrigin.getPackageName())
-                        .collect(Collectors.toList());
+                runWithShellPermissionIdentity(
+                        () ->
+                                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                        .getDataOriginsPriorityOrder()
+                                        .stream()
+                                        .map(DataOrigin::getPackageName)
+                                        .collect(Collectors.toList()),
+                        MANAGE_HEALTH_DATA);
 
         assertThat(newPriorityList.contains(APP_A_WITH_READ_WRITE_PERMS.getPackageName()))
                 .isFalse();
@@ -820,21 +821,20 @@
     }
 
     @Test
-    public void testAppWithManageHealthDataPermissionCanUpdatePriority()
-            throws InterruptedException {
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
-        List<String> healthPerms =
+    public void testAppWithManageHealthDataPermissionCanUpdatePriority() {
+        List<String> healthPermsA =
                 getGrantedHealthPermissions(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
+        List<String> healthPermsB =
+                getGrantedHealthPermissions(APP_B_WITH_READ_WRITE_PERMS.getPackageName());
 
         revokeHealthPermissions(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
         revokeHealthPermissions(APP_B_WITH_READ_WRITE_PERMS.getPackageName());
 
-        for (String perm : healthPerms) {
+        for (String perm : healthPermsA) {
             grantPermission(APP_A_WITH_READ_WRITE_PERMS.getPackageName(), perm);
         }
 
-        for (String perm : healthPerms) {
+        for (String perm : healthPermsB) {
             grantPermission(APP_B_WITH_READ_WRITE_PERMS.getPackageName(), perm);
         }
 
@@ -847,38 +847,43 @@
                                 .setPackageName(APP_A_WITH_READ_WRITE_PERMS.getPackageName())
                                 .build());
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-        updateDataOriginPriorityOrder(
-                new UpdateDataOriginPriorityOrderRequest(
-                        dataOriginPrioOrder, HealthDataCategory.ACTIVITY));
-
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         List<String> newPriorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(dataOrigin -> dataOrigin.getPackageName())
-                        .collect(Collectors.toList());
+                runWithShellPermissionIdentity(
+                        () -> {
+                            updateDataOriginPriorityOrder(
+                                    new UpdateDataOriginPriorityOrderRequest(
+                                            dataOriginPrioOrder, HealthDataCategory.ACTIVITY));
 
-        assertThat(
-                        newPriorityList.equals(
-                                dataOriginPrioOrder.stream()
-                                        .map(dataOrigin -> dataOrigin.getPackageName())
-                                        .collect(Collectors.toList())))
-                .isTrue();
+                            return fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                    .getDataOriginsPriorityOrder()
+                                    .stream()
+                                    .map(DataOrigin::getPackageName)
+                                    .collect(Collectors.toList());
+                        },
+                        MANAGE_HEALTH_DATA);
+
+        assertThat(newPriorityList)
+                .containsExactlyElementsIn(
+                        dataOriginPrioOrder.stream()
+                                .map(DataOrigin::getPackageName)
+                                .collect(Collectors.toList()))
+                .inOrder();
     }
 
     @Test
     public void testAppWithManageHealthDataPermsCanReadAnotherAppEntry() throws Exception {
         StepsRecord record = getStepsRecord(getEmptyMetadata());
         APP_A_WITH_READ_WRITE_PERMS.insertRecords(record);
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
 
         List<StepsRecord> recordsRead =
-                readRecords(
-                        new ReadRecordsRequestUsingFilters.Builder<>(StepsRecord.class).build(),
-                        ApplicationProvider.getApplicationContext());
+                runWithShellPermissionIdentity(
+                        () ->
+                                readRecords(
+                                        new ReadRecordsRequestUsingFilters.Builder<>(
+                                                        StepsRecord.class)
+                                                .build(),
+                                        ApplicationProvider.getApplicationContext()),
+                        MANAGE_HEALTH_DATA);
 
         assertThat(recordsRead).hasSize(1);
     }
@@ -887,16 +892,15 @@
     public void testAppWithManageHealthDataPermsCanDeleteAnotherAppEntry() throws Exception {
         StepsRecord record = getStepsRecord(getEmptyMetadata());
         String recordId = APP_A_WITH_READ_WRITE_PERMS.insertRecords(record).get(0);
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-
-        verifyDeleteRecords(List.of(RecordIdFilter.fromId(StepsRecord.class, recordId)));
+        runWithShellPermissionIdentity(
+                () ->
+                        verifyDeleteRecords(
+                                List.of(RecordIdFilter.fromId(StepsRecord.class, recordId))),
+                MANAGE_HEALTH_DATA);
     }
 
     @Test
     public void testToVerifyGetContributorApplicationsInfo() throws Exception {
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
         APP_A_WITH_READ_WRITE_PERMS.insertRecords(TEST_RECORDS);
         APP_B_WITH_READ_WRITE_PERMS.insertRecords(TEST_RECORDS);
 
@@ -905,54 +909,41 @@
                         APP_A_WITH_READ_WRITE_PERMS.getPackageName(),
                         APP_B_WITH_READ_WRITE_PERMS.getPackageName());
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-
-        // Contributor information is updated asynchronously, so retry with delay until the update
-        // finishes (or we run out of retries).
-        for (int i = 1; i <= ASYNC_RETRIES; i++) {
-            List<String> appInfoList =
-                    getApplicationInfo().stream().map(AppInfo::getPackageName).toList();
-
-            try {
-                assertThat(appInfoList).containsAtLeastElementsIn(pkgNameList);
-            } catch (AssertionError e) {
-                if (i < ASYNC_RETRIES) {
-                    Thread.sleep(ASYNC_RETRY_DELAY_MILLIS);
-                    continue;
-                }
-
-                throw new AssertionError(e);
-            }
-        }
+        // Contributor information is updated asynchronously.
+        eventually(
+                () -> {
+                    List<String> appInfoList =
+                            runWithShellPermissionIdentity(
+                                    () ->
+                                            getApplicationInfo().stream()
+                                                    .map(AppInfo::getPackageName)
+                                                    .toList(),
+                                    MANAGE_HEALTH_DATA);
+                    assertThat(appInfoList).containsAtLeastElementsIn(pkgNameList);
+                });
     }
 
     @Test
     public void testAggregationOutputForTotalStepsCountWithDataFromTwoAppsHavingDifferentPriority()
             throws Exception {
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
         revokeAndThenGrantHealthPermissions(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
         revokeAndThenGrantHealthPermissions(APP_B_WITH_READ_WRITE_PERMS.getPackageName());
 
-        List<DataOrigin> dataOriginPrioOrder =
-                getDataOrigins(
-                        APP_A_WITH_READ_WRITE_PERMS.getPackageName(),
-                        APP_B_WITH_READ_WRITE_PERMS.getPackageName());
-
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         List<String> priorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(DataOrigin::getPackageName)
-                        .toList();
-
-        assertThat(
-                        priorityList.equals(
-                                dataOriginPrioOrder.stream()
+                runWithShellPermissionIdentity(
+                        () ->
+                                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                        .getDataOriginsPriorityOrder()
+                                        .stream()
                                         .map(DataOrigin::getPackageName)
-                                        .toList()))
-                .isTrue();
+                                        .toList(),
+                        MANAGE_HEALTH_DATA);
+
+        assertThat(priorityList)
+                .containsExactly(
+                        APP_A_WITH_READ_WRITE_PERMS.getPackageName(),
+                        APP_B_WITH_READ_WRITE_PERMS.getPackageName())
+                .inOrder();
 
         StepsRecord stepsRecordA =
                 new StepsRecord.Builder(
@@ -983,36 +974,42 @@
         assertThat(aggregateRecordsRequest.getTimeRangeFilter()).isNotNull();
         assertThat(aggregateRecordsRequest.getDataOriginsFilters()).isNotNull();
 
-        AggregateRecordsResponse<Long> oldResponse = getAggregateResponse(aggregateRecordsRequest);
+        AggregateRecordsResponse<Long> oldResponse =
+                runWithShellPermissionIdentity(
+                        () -> getAggregateResponse(aggregateRecordsRequest), MANAGE_HEALTH_DATA);
         assertThat(oldResponse.get(STEPS_COUNT_TOTAL)).isNotNull();
         assertThat(oldResponse.get(STEPS_COUNT_TOTAL)).isEqualTo(2000);
 
-        dataOriginPrioOrder =
+        List<DataOrigin> dataOriginPrioOrder =
                 getDataOrigins(
                         APP_B_WITH_READ_WRITE_PERMS.getPackageName(),
                         APP_A_WITH_READ_WRITE_PERMS.getPackageName());
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-        updateDataOriginPriorityOrder(
-                new UpdateDataOriginPriorityOrderRequest(
-                        dataOriginPrioOrder, HealthDataCategory.ACTIVITY));
-
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         priorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(dataOrigin -> dataOrigin.getPackageName())
-                        .collect(Collectors.toList());
+                runWithShellPermissionIdentity(
+                        () -> {
+                            updateDataOriginPriorityOrder(
+                                    new UpdateDataOriginPriorityOrderRequest(
+                                            dataOriginPrioOrder, HealthDataCategory.ACTIVITY));
 
-        assertThat(
-                        priorityList.equals(
-                                dataOriginPrioOrder.stream()
-                                        .map(dataOrigin -> dataOrigin.getPackageName())
-                                        .collect(Collectors.toList())))
-                .isTrue();
+                            return fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                    .getDataOriginsPriorityOrder()
+                                    .stream()
+                                    .map(DataOrigin::getPackageName)
+                                    .collect(Collectors.toList());
+                        },
+                        MANAGE_HEALTH_DATA);
 
-        AggregateRecordsResponse<Long> newResponse = getAggregateResponse(aggregateRecordsRequest);
+        assertThat(priorityList)
+                .containsExactlyElementsIn(
+                        dataOriginPrioOrder.stream()
+                                .map(DataOrigin::getPackageName)
+                                .collect(Collectors.toList()))
+                .inOrder();
+
+        AggregateRecordsResponse<Long> newResponse =
+                runWithShellPermissionIdentity(
+                        () -> getAggregateResponse(aggregateRecordsRequest), MANAGE_HEALTH_DATA);
         assertThat(newResponse.get(STEPS_COUNT_TOTAL)).isNotNull();
         assertThat(newResponse.get(STEPS_COUNT_TOTAL)).isEqualTo(2500);
     }
@@ -1020,30 +1017,24 @@
     @Test
     public void testAggregationOutputForExerciseSessionWithDataFromTwoAppsHavingDifferentPriority()
             throws Exception {
-        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
         revokeAndThenGrantHealthPermissions(APP_A_WITH_READ_WRITE_PERMS.getPackageName());
         revokeAndThenGrantHealthPermissions(APP_B_WITH_READ_WRITE_PERMS.getPackageName());
 
-        List<DataOrigin> dataOriginPrioOrder =
-                getDataOrigins(
-                        APP_A_WITH_READ_WRITE_PERMS.getPackageName(),
-                        APP_B_WITH_READ_WRITE_PERMS.getPackageName());
-
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         List<String> priorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(DataOrigin::getPackageName)
-                        .toList();
-
-        assertThat(
-                        priorityList.equals(
-                                dataOriginPrioOrder.stream()
+                runWithShellPermissionIdentity(
+                        () ->
+                                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                        .getDataOriginsPriorityOrder()
+                                        .stream()
                                         .map(DataOrigin::getPackageName)
-                                        .toList()))
-                .isTrue();
+                                        .toList(),
+                        MANAGE_HEALTH_DATA);
+
+        assertThat(priorityList)
+                .containsExactly(
+                        APP_A_WITH_READ_WRITE_PERMS.getPackageName(),
+                        APP_B_WITH_READ_WRITE_PERMS.getPackageName())
+                .inOrder();
 
         ExerciseSessionRecord sessionRecordA =
                 new ExerciseSessionRecord.Builder(
@@ -1090,30 +1081,30 @@
                                 .minus(Duration.between(yesterdayAt("14:00"), yesterdayAt("15:00")))
                                 .toMillis());
 
-        dataOriginPrioOrder =
+        List<DataOrigin> dataOriginPrioOrder =
                 getDataOrigins(
                         APP_B_WITH_READ_WRITE_PERMS.getPackageName(),
                         APP_A_WITH_READ_WRITE_PERMS.getPackageName());
 
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-        updateDataOriginPriorityOrder(
-                new UpdateDataOriginPriorityOrderRequest(
-                        dataOriginPrioOrder, HealthDataCategory.ACTIVITY));
-
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         priorityList =
-                fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
-                        .getDataOriginsPriorityOrder()
-                        .stream()
-                        .map(DataOrigin::getPackageName)
-                        .toList();
+                runWithShellPermissionIdentity(
+                        () -> {
+                            updateDataOriginPriorityOrder(
+                                    new UpdateDataOriginPriorityOrderRequest(
+                                            dataOriginPrioOrder, HealthDataCategory.ACTIVITY));
 
-        assertThat(
-                        priorityList.equals(
-                                dataOriginPrioOrder.stream()
-                                        .map(DataOrigin::getPackageName)
-                                        .toList()))
-                .isTrue();
+                            return fetchDataOriginsPriorityOrder(HealthDataCategory.ACTIVITY)
+                                    .getDataOriginsPriorityOrder()
+                                    .stream()
+                                    .map(DataOrigin::getPackageName)
+                                    .toList();
+                        },
+                        MANAGE_HEALTH_DATA);
+
+        assertThat(priorityList)
+                .containsExactlyElementsIn(
+                        dataOriginPrioOrder.stream().map(DataOrigin::getPackageName).toList())
+                .inOrder();
 
         AggregateRecordsResponse<Long> newResponse = getAggregateResponse(aggregateRecordsRequest);
         assertThat(newResponse.get(EXERCISE_DURATION_TOTAL)).isNotNull();
diff --git a/tests/cts/phr/Android.bp b/tests/cts/phr/Android.bp
new file mode 100644
index 0000000..41f8d85
--- /dev/null
+++ b/tests/cts/phr/Android.bp
@@ -0,0 +1,103 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+    default_team: "trendy_team_android_health",
+}
+
+android_test {
+    name: "CtsHealthFitnessPhrTestCases",
+    team: "trendy_team_android_health",
+    defaults: ["cts_defaults"],
+    libs: [
+        "android.test.runner.stubs.system",
+        "android.test.base.stubs.system",
+        "framework-healthfitness.stubs.module_lib",
+        "framework-configinfrastructure.stubs.module_lib",
+        "framework-sdkextensions.stubs.module_lib",
+    ],
+    srcs: [
+        "src/android/healthconnect/cts/phr/**/*.java",
+    ],
+    // Tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+        "mts-healthfitness",
+        "mcts-healthfitness",
+    ],
+    static_libs: [
+        "androidx.test.rules",
+        "androidx.test.ext.truth",
+        "compatibility-device-util-axt",
+        "ctstestrunner-axt",
+        "cts-wm-util",
+        "modules-utils-build",
+        "testng",
+        "flag-junit",
+        "healthfitness-exported-aconfig-flags-lib",
+        "cts-healthconnect-utils",
+        "cts-healthconnect-lib",
+        "cts-healthconnect-phr-lib",
+        "flag-junit",
+    ],
+    target_sdk_version: "34",
+    min_sdk_version: "34",
+    sdk_version: "module_current",
+    data: [
+        ":CtsPhrTestHelperApp1",
+        ":CtsPhrTestHelperApp2",
+    ],
+}
+
+java_library {
+    name: "cts-healthconnect-phr-lib",
+    srcs: [
+        "src/android/healthconnect/cts/phr/utils/*.java",
+    ],
+    static_libs: [
+        "androidx.appcompat_appcompat",
+        "androidx.test.rules",
+        "cts-install-lib",
+        "platform-test-annotations",
+        "cts-healthconnect-utils",
+        "cts-healthconnect-lib",
+    ],
+    sdk_version: "test_current",
+}
+
+android_test_helper_app {
+    name: "CtsPhrTestHelperApp1",
+    manifest: "CtsPhrTestHelperApp1Manifest.xml",
+    static_libs: [
+        "cts-healthconnect-lib",
+        "cts-healthconnect-test-helper",
+    ],
+    sdk_version: "test_current",
+    target_sdk_version: "34",
+    min_sdk_version: "34",
+}
+
+android_test_helper_app {
+    name: "CtsPhrTestHelperApp2",
+    manifest: "CtsPhrTestHelperApp2Manifest.xml",
+    static_libs: [
+        "cts-healthconnect-lib",
+        "cts-healthconnect-test-helper",
+    ],
+    sdk_version: "test_current",
+    target_sdk_version: "34",
+    min_sdk_version: "34",
+}
diff --git a/tests/cts/phr/AndroidManifest.xml b/tests/cts/phr/AndroidManifest.xml
new file mode 100644
index 0000000..096fdc3
--- /dev/null
+++ b/tests/cts/phr/AndroidManifest.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.healthconnect.cts.phr"
+          android:targetSandboxVersion="2">
+
+    <application
+      android:debuggable="true"
+      android:largeHeap="true">
+      <uses-library android:name="android.test.runner"/>
+      <activity android:name=".EmptyActivity"
+                android:label="EmptyActivity"
+                android:exported="true">
+          <intent-filter>
+              <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
+              <category android:name="android.intent.category.HEALTH_PERMISSIONS"/>
+          </intent-filter>
+          <intent-filter>
+              <action android:name="android.health.connect.action.SHOW_MIGRATION_INFO"/>
+          </intent-filter>
+      </activity>
+
+      <receiver android:name="android.healthconnect.cts.utils.TestReceiver"
+          android:exported="true"/>
+    </application>
+
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:label="CTS HealthConnect PHR tests"
+                     android:targetPackage="android.healthconnect.cts.phr">
+    </instrumentation>
+
+    <!-- To get visibility of the app with health permissions definitions,
+         required for testing defined permissions. -->
+    <queries>
+        <package android:name="android.healthconnect.cts.phr.testhelper.app1"/>
+        <package android:name="android.healthconnect.cts.phr.testhelper.app2"/>
+    </queries>
+
+    <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.READ_BASAL_BODY_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_BLOOD_GLUCOSE"/>
+    <uses-permission android:name="android.permission.health.READ_BLOOD_PRESSURE"/>
+    <uses-permission android:name="android.permission.health.READ_BODY_FAT"/>
+    <uses-permission android:name="android.permission.health.READ_BODY_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.READ_BODY_WATER_MASS"/>
+    <uses-permission android:name="android.permission.health.READ_BONE_MASS"/>
+    <uses-permission android:name="android.permission.health.READ_CERVICAL_MUCUS"/>
+    <uses-permission android:name="android.permission.health.READ_INTERMENSTRUAL_BLEEDING"/>
+    <uses-permission android:name="android.permission.health.READ_DISTANCE"/>
+    <uses-permission android:name="android.permission.health.READ_ELEVATION_GAINED"/>
+    <uses-permission android:name="android.permission.health.READ_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.READ_PLANNED_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.READ_FLOORS_CLIMBED"/>
+    <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_HEART_RATE_VARIABILITY"/>
+    <uses-permission android:name="android.permission.health.READ_HEIGHT"/>
+    <uses-permission android:name="android.permission.health.READ_HYDRATION"/>
+    <uses-permission android:name="android.permission.health.READ_LEAN_BODY_MASS"/>
+    <uses-permission android:name="android.permission.health.READ_MENSTRUATION"/>
+    <uses-permission android:name="android.permission.health.READ_MINDFULNESS"/>
+    <uses-permission android:name="android.permission.health.READ_NUTRITION"/>
+    <uses-permission android:name="android.permission.health.READ_OVULATION_TEST"/>
+    <uses-permission android:name="android.permission.health.READ_OXYGEN_SATURATION"/>
+    <uses-permission android:name="android.permission.health.READ_POWER"/>
+    <uses-permission android:name="android.permission.health.READ_RESPIRATORY_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_RESTING_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_SEXUAL_ACTIVITY"/>
+    <uses-permission android:name="android.permission.health.READ_SKIN_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.READ_SLEEP"/>
+    <uses-permission android:name="android.permission.health.READ_SPEED"/>
+    <uses-permission android:name="android.permission.health.READ_STEPS"/>
+    <uses-permission android:name="android.permission.health.READ_TOTAL_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.READ_VO2_MAX"/>
+    <uses-permission android:name="android.permission.health.READ_WEIGHT"/>
+    <uses-permission android:name="android.permission.health.READ_WHEELCHAIR_PUSHES"/>
+    <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_BASAL_BODY_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BLOOD_GLUCOSE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BLOOD_PRESSURE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BODY_FAT"/>
+    <uses-permission android:name="android.permission.health.WRITE_BODY_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BODY_WATER_MASS"/>
+    <uses-permission android:name="android.permission.health.WRITE_BONE_MASS"/>
+    <uses-permission android:name="android.permission.health.WRITE_CERVICAL_MUCUS"/>
+    <uses-permission android:name="android.permission.health.WRITE_INTERMENSTRUAL_BLEEDING"/>
+    <uses-permission android:name="android.permission.health.WRITE_DISTANCE"/>
+    <uses-permission android:name="android.permission.health.WRITE_ELEVATION_GAINED"/>
+    <uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.WRITE_PLANNED_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.WRITE_EXERCISE_ROUTE"/>
+    <uses-permission android:name="android.permission.health.WRITE_FLOORS_CLIMBED"/>
+    <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_HEART_RATE_VARIABILITY"/>
+    <uses-permission android:name="android.permission.health.WRITE_HEIGHT"/>
+    <uses-permission android:name="android.permission.health.WRITE_HYDRATION"/>
+    <uses-permission android:name="android.permission.health.WRITE_LEAN_BODY_MASS"/>
+    <uses-permission android:name="android.permission.health.WRITE_MENSTRUATION"/>
+    <uses-permission android:name="android.permission.health.WRITE_MINDFULNESS"/>
+    <uses-permission android:name="android.permission.health.WRITE_NUTRITION"/>
+    <uses-permission android:name="android.permission.health.WRITE_OVULATION_TEST"/>
+    <uses-permission android:name="android.permission.health.WRITE_OXYGEN_SATURATION"/>
+    <uses-permission android:name="android.permission.health.WRITE_POWER"/>
+    <uses-permission android:name="android.permission.health.WRITE_RESPIRATORY_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_RESTING_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_SEXUAL_ACTIVITY"/>
+    <uses-permission android:name="android.permission.health.WRITE_SKIN_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.WRITE_SLEEP"/>
+    <uses-permission android:name="android.permission.health.WRITE_SPEED"/>
+    <uses-permission android:name="android.permission.health.WRITE_STEPS"/>
+    <uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_VO2_MAX"/>
+    <uses-permission android:name="android.permission.health.WRITE_WEIGHT"/>
+    <uses-permission android:name="android.permission.health.WRITE_WHEELCHAIR_PUSHES"/>
+    <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
+
+    <!--  self-instrumenting test package. -->
+</manifest>
diff --git a/tests/cts/phr/AndroidTest.xml b/tests/cts/phr/AndroidTest.xml
new file mode 100644
index 0000000..f7a7c00
--- /dev/null
+++ b/tests/cts/phr/AndroidTest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<configuration description="Config for CTS HealthFitness PHR test cases">
+    <option name="test-suite-tag" value="cts"/>
+    <option name="config-descriptor:metadata" key="component" value="framework"/>
+    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app"/>
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi"/>
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user"/>
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true"/>
+        <option name="test-file-name" value="CtsHealthFitnessPhrTestCases.apk"/>
+        <option name="test-file-name" value="CtsPhrTestHelperApp1.apk"/>
+        <option name="test-file-name" value="CtsPhrTestHelperApp2.apk"/>
+    </target_preparer>
+
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+        <!-- Disable syncing to prevent overwriting flags during testing. -->
+        <option name="run-command" value="device_config set_sync_disabled_for_tests persistent" />
+        <option name="teardown-command" value="device_config set_sync_disabled_for_tests none" />
+    </target_preparer>
+
+    <option
+        name="config-descriptor:metadata"
+        key="mainline-param"
+        value="com.google.android.healthfitness.apex"/>
+
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+        <option name="package" value="android.healthconnect.cts.phr"/>
+        <option name="hidden-api-checks" value="false"/>
+    </test>
+
+    <object type="module_controller"
+            class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
+        <option name="mainline-module-package-name" value="com.google.android.healthfitness"/>
+    </object>
+
+</configuration>
diff --git a/tests/cts/phr/CtsPhrTestHelperApp1Manifest.xml b/tests/cts/phr/CtsPhrTestHelperApp1Manifest.xml
new file mode 100644
index 0000000..27244fe
--- /dev/null
+++ b/tests/cts/phr/CtsPhrTestHelperApp1Manifest.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.healthconnect.cts.phr.testhelper.app1"
+    android:versionCode="1"
+    android:versionName="1.0">
+
+    <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
+    <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
+
+    <application android:label="CtsPhrTestHelperApp1">
+        <activity android:name="android.healthconnect.cts.testhelper.TestAppActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+                <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
+                <category android:name="android.intent.category.HEALTH_PERMISSIONS"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.healthconnect.cts.utils.ProxyActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.healthconnect.cts.ACTION_START_ACTIVITY_FOR_RESULT"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+        </activity>
+
+        <receiver android:name="android.healthconnect.cts.testhelper.TestAppReceiver"
+            android:exported="true"/>
+    </application>
+</manifest>
diff --git a/tests/cts/phr/CtsPhrTestHelperApp2Manifest.xml b/tests/cts/phr/CtsPhrTestHelperApp2Manifest.xml
new file mode 100644
index 0000000..cb08e6c
--- /dev/null
+++ b/tests/cts/phr/CtsPhrTestHelperApp2Manifest.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.healthconnect.cts.phr.testhelper.app2"
+    android:versionCode="1"
+    android:versionName="1.0">
+
+    <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
+    <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VACCINES"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
+    <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
+
+    <application android:label="CtsPhrTestHelperApp2">
+        <activity android:name="android.healthconnect.cts.testhelper.TestAppActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+                <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
+                <category android:name="android.intent.category.HEALTH_PERMISSIONS"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.healthconnect.cts.utils.ProxyActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.healthconnect.cts.ACTION_START_ACTIVITY_FOR_RESULT"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+        </activity>
+
+        <receiver android:name="android.healthconnect.cts.testhelper.TestAppReceiver"
+            android:exported="true"/>
+    </application>
+</manifest>
diff --git a/tests/cts/src/android/healthconnect/cts/CreateMedicalDataSourceRequestTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/CreateMedicalDataSourceRequestTest.java
similarity index 61%
rename from tests/cts/src/android/healthconnect/cts/CreateMedicalDataSourceRequestTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/CreateMedicalDataSourceRequestTest.java
index c6f4886..845c56b 100644
--- a/tests/cts/src/android/healthconnect/cts/CreateMedicalDataSourceRequestTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/CreateMedicalDataSourceRequestTest.java
@@ -14,24 +14,28 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts;
+package android.healthconnect.cts.phr;
 
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME_MAX_CHARS;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI_MAX_CHARS;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_BASE_URI;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
-import static android.healthconnect.cts.utils.PhrDataFactory.getCreateMedicalDataSourceRequestBuilder;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME_MAX_CHARS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI_MAX_CHARS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_VERSION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_FHIR_VERSION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_UNSUPPORTED;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequestBuilder;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertThrows;
 
 import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.datatypes.FhirVersion;
 import android.net.Uri;
 import android.os.Parcel;
 import android.platform.test.annotations.RequiresFlagsEnabled;
@@ -56,23 +60,29 @@
     public void testCreateMedicalDataSourceRequestBuilder_constructor() {
         CreateMedicalDataSourceRequest request =
                 new CreateMedicalDataSourceRequest.Builder(
-                                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_FHIR_BASE_URI,
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
 
         assertThat(request.getFhirBaseUri()).isEqualTo(DATA_SOURCE_FHIR_BASE_URI);
         assertThat(request.getDisplayName()).isEqualTo(DATA_SOURCE_DISPLAY_NAME);
+        assertThat(request.getFhirVersion()).isEqualTo(DATA_SOURCE_FHIR_VERSION);
     }
 
     @Test
     public void testCreateMedicalDataSourceRequestBuilder_setAllFields() {
         CreateMedicalDataSourceRequest request =
-                new CreateMedicalDataSourceRequest.Builder(Uri.EMPTY, "")
+                new CreateMedicalDataSourceRequest.Builder(
+                                Uri.EMPTY, "", FhirVersion.parseFhirVersion("0.0.0"))
                         .setFhirBaseUri(DATA_SOURCE_FHIR_BASE_URI)
                         .setDisplayName(DATA_SOURCE_DISPLAY_NAME)
+                        .setFhirVersion(DATA_SOURCE_FHIR_VERSION)
                         .build();
 
         assertThat(request.getFhirBaseUri()).isEqualTo(DATA_SOURCE_FHIR_BASE_URI);
         assertThat(request.getDisplayName()).isEqualTo(DATA_SOURCE_DISPLAY_NAME);
+        assertThat(request.getFhirVersion()).isEqualTo(DATA_SOURCE_FHIR_VERSION);
     }
 
     @Test
@@ -100,7 +110,9 @@
     public void testCreateMedicalDataSourceRequestBuilder_maxDisplayNameCharsExceeded_throws() {
         CreateMedicalDataSourceRequest.Builder requestBuilder =
                 new CreateMedicalDataSourceRequest.Builder(
-                        DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS);
+                        DATA_SOURCE_FHIR_BASE_URI,
+                        DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS,
+                        DATA_SOURCE_FHIR_VERSION);
 
         var thrown = assertThrows(IllegalArgumentException.class, () -> requestBuilder.build());
         assertThat(thrown).hasMessageThat().contains("Display name cannot be longer than");
@@ -109,7 +121,8 @@
     @Test
     public void testCreateMedicalDataSourceRequestBuilder_emptyDisplayName_throws() {
         CreateMedicalDataSourceRequest.Builder requestBuilder =
-                new CreateMedicalDataSourceRequest.Builder(DATA_SOURCE_FHIR_BASE_URI, "");
+                new CreateMedicalDataSourceRequest.Builder(
+                        DATA_SOURCE_FHIR_BASE_URI, "", DATA_SOURCE_FHIR_VERSION);
 
         var thrown = assertThrows(IllegalArgumentException.class, () -> requestBuilder.build());
         assertThat(thrown).hasMessageThat().contains("Display name cannot be empty");
@@ -119,19 +132,34 @@
     public void testCreateMedicalDataSourceRequestBuilder_maxBaseUriCharsExceeded_throws() {
         CreateMedicalDataSourceRequest.Builder requestBuilder =
                 new CreateMedicalDataSourceRequest.Builder(
-                        DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS, DATA_SOURCE_DISPLAY_NAME);
+                        DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS,
+                        DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION);
 
         var thrown = assertThrows(IllegalArgumentException.class, () -> requestBuilder.build());
-        assertThat(thrown).hasMessageThat().contains("Fhir base uri cannot be longer than");
+        assertThat(thrown).hasMessageThat().contains("FHIR base URI cannot be longer than");
     }
 
     @Test
     public void testCreateMedicalDataSourceRequestBuilder_emptyBaseUri_throws() {
         CreateMedicalDataSourceRequest.Builder requestBuilder =
-                new CreateMedicalDataSourceRequest.Builder(Uri.EMPTY, DATA_SOURCE_DISPLAY_NAME);
+                new CreateMedicalDataSourceRequest.Builder(
+                        Uri.EMPTY, DATA_SOURCE_DISPLAY_NAME, DATA_SOURCE_FHIR_VERSION);
 
         var thrown = assertThrows(IllegalArgumentException.class, () -> requestBuilder.build());
-        assertThat(thrown).hasMessageThat().contains("Fhir base uri cannot be empty");
+        assertThat(thrown).hasMessageThat().contains("FHIR base URI cannot be empty");
+    }
+
+    @Test
+    public void testCreateMedicalDataSourceRequestBuilder_unsupportedFhirVersion_throws() {
+        CreateMedicalDataSourceRequest.Builder requestBuilder =
+                new CreateMedicalDataSourceRequest.Builder(
+                        DATA_SOURCE_FHIR_BASE_URI,
+                        DATA_SOURCE_DISPLAY_NAME,
+                        FHIR_VERSION_UNSUPPORTED);
+
+        var thrown = assertThrows(IllegalArgumentException.class, () -> requestBuilder.build());
+        assertThat(thrown).hasMessageThat().contains("Unsupported FHIR version");
     }
 
     @Test
@@ -139,7 +167,8 @@
         CreateMedicalDataSourceRequest request =
                 new CreateMedicalDataSourceRequest.Builder(
                                 DATA_SOURCE_FHIR_BASE_URI_MAX_CHARS,
-                                DATA_SOURCE_DISPLAY_NAME_MAX_CHARS)
+                                DATA_SOURCE_DISPLAY_NAME_MAX_CHARS,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
 
         assertThat(request.getFhirBaseUri()).isEqualTo(DATA_SOURCE_FHIR_BASE_URI_MAX_CHARS);
@@ -150,17 +179,17 @@
     public void testCreateMedicalDataSourceRequest_toString() {
         CreateMedicalDataSourceRequest request =
                 new CreateMedicalDataSourceRequest.Builder(
-                                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_FHIR_BASE_URI,
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
-        String expectedPropertiesString =
-                String.format(
-                        "fhirBaseUri=%s,displayName=%s",
-                        DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME);
+        String fhirBaseUriString = "fhirBaseUri=" + DATA_SOURCE_FHIR_BASE_URI;
+        String displayNameString = "displayName=" + DATA_SOURCE_DISPLAY_NAME;
+        String fhirVersionString = "fhirVersion=" + DATA_SOURCE_FHIR_VERSION;
 
-        assertThat(request.toString())
-                .isEqualTo(
-                        String.format(
-                                "CreateMedicalDataSourceRequest{%s}", expectedPropertiesString));
+        assertThat(request.toString()).contains(fhirBaseUriString);
+        assertThat(request.toString()).contains(displayNameString);
+        assertThat(request.toString()).contains(fhirVersionString);
     }
 
     @Test
@@ -183,11 +212,17 @@
                 new CreateMedicalDataSourceRequest.Builder(request)
                         .setDisplayName(DIFFERENT_DATA_SOURCE_DISPLAY_NAME)
                         .build();
+        CreateMedicalDataSourceRequest requestDifferentFhirVersion =
+                new CreateMedicalDataSourceRequest.Builder(request)
+                        .setFhirVersion(DIFFERENT_DATA_SOURCE_FHIR_VERSION)
+                        .build();
 
         assertThat(requestDifferentBaseUri.equals(request)).isFalse();
         assertThat(requestDifferentDisplayName.equals(request)).isFalse();
+        assertThat(requestDifferentFhirVersion.equals(request)).isFalse();
         assertThat(requestDifferentBaseUri.hashCode()).isNotEqualTo(request.hashCode());
         assertThat(requestDifferentDisplayName.hashCode()).isNotEqualTo(request.hashCode());
+        assertThat(requestDifferentFhirVersion.hashCode()).isNotEqualTo(request.hashCode());
     }
 
     @Test
@@ -209,6 +244,7 @@
         Parcel parcel = Parcel.obtain();
         parcel.writeParcelable(DATA_SOURCE_FHIR_BASE_URI, 0);
         parcel.writeString(DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS);
+        parcel.writeParcelable(DATA_SOURCE_FHIR_VERSION, 0);
         parcel.setDataPosition(0);
 
         var thrown =
@@ -223,12 +259,28 @@
         Parcel parcel = Parcel.obtain();
         parcel.writeParcelable(DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS, 0);
         parcel.writeString(DATA_SOURCE_DISPLAY_NAME);
+        parcel.writeParcelable(DATA_SOURCE_FHIR_VERSION, 0);
         parcel.setDataPosition(0);
 
         var thrown =
                 assertThrows(
                         IllegalArgumentException.class,
                         () -> CreateMedicalDataSourceRequest.CREATOR.createFromParcel(parcel));
-        assertThat(thrown).hasMessageThat().contains("Fhir base uri cannot be longer than");
+        assertThat(thrown).hasMessageThat().contains("FHIR base URI cannot be longer than");
+    }
+
+    @Test
+    public void testWriteToParcelThenRestore_unsupportedFhirVersion_throws() {
+        Parcel parcel = Parcel.obtain();
+        parcel.writeParcelable(DATA_SOURCE_FHIR_BASE_URI, 0);
+        parcel.writeString(DATA_SOURCE_DISPLAY_NAME);
+        parcel.writeParcelable(FHIR_VERSION_UNSUPPORTED, 0);
+        parcel.setDataPosition(0);
+
+        var thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () -> CreateMedicalDataSourceRequest.CREATOR.createFromParcel(parcel));
+        assertThat(thrown).hasMessageThat().contains("Unsupported FHIR version");
     }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/DeleteMedicalResourcesRequestTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/DeleteMedicalResourcesRequestTest.java
similarity index 61%
rename from tests/cts/src/android/healthconnect/cts/DeleteMedicalResourcesRequestTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/DeleteMedicalResourcesRequestTest.java
index 768c849..a6df97d 100644
--- a/tests/cts/src/android/healthconnect/cts/DeleteMedicalResourcesRequestTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/DeleteMedicalResourcesRequestTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,9 +14,12 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts;
+package android.healthconnect.cts.phr;
 
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
 import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -24,7 +27,6 @@
 import static org.junit.Assert.assertThrows;
 
 import android.health.connect.DeleteMedicalResourcesRequest;
-import android.health.connect.datatypes.MedicalResource;
 import android.os.Parcel;
 import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
@@ -49,7 +51,7 @@
     public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
 
     @Test
-    public void testRequestBuilder_noDatasources_throws() {
+    public void testRequestBuilder_noMedicalResourceTypesAndDataSources_throws() {
         DeleteMedicalResourcesRequest.Builder request = new DeleteMedicalResourcesRequest.Builder();
 
         assertThrows(IllegalArgumentException.class, request::build);
@@ -63,72 +65,80 @@
     }
 
     @Test
+    public void testRequestBuilder_invalidDataSourceId_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new DeleteMedicalResourcesRequest.Builder().addDataSourceId("1"));
+    }
+
+    @Test
     public void testRequestBuilder_oneDatasource_ok() {
         DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
 
-        assertThat(request.getDataSourceIds()).containsExactly("foo");
+        assertThat(request.getDataSourceIds()).containsExactly(DATA_SOURCE_ID);
     }
 
     @Test
     public void testRequestBuilder_multipleDatasource_ok() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addDataSourceId("bar")
-                        .addDataSourceId("baz")
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .build();
 
-        assertThat(request.getDataSourceIds()).containsExactly("foo", "bar", "baz");
+        assertThat(request.getDataSourceIds())
+                .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
     }
 
     @Test
-    public void testRequestBuilder_oneFhirTypeOk_ok() {
+    public void testRequestBuilder_oneResourceType_ok() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         assertThat(request.getMedicalResourceTypes())
-                .containsExactly(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                .containsExactly(MEDICAL_RESOURCE_TYPE_VACCINES);
     }
 
     @Test
     public void testRequestBuilder_multipleResourceTypes_ok() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .addMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build();
 
         assertThat(request.getMedicalResourceTypes())
                 .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN);
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
     }
 
     @Test
     public void testRequestBuilder_multipleResourceTypesAndDataSources_ok() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .addMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN)
-                        .addDataSourceId("foo")
-                        .addDataSourceId("bar")
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .build();
 
-        assertThat(request.getDataSourceIds()).containsExactly("foo", "bar");
+        assertThat(request.getDataSourceIds())
+                .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
 
         assertThat(request.getMedicalResourceTypes())
                 .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN);
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
     }
 
     @Test
     public void testRequestBuilder_fromExistingBuilder() {
         DeleteMedicalResourcesRequest.Builder original =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo");
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID);
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder(original).build();
 
@@ -138,21 +148,22 @@
     @Test
     public void testRequestBuilder_fromExistingBuilder_changeIndependently() {
         DeleteMedicalResourcesRequest.Builder original =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo");
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID);
         DeleteMedicalResourcesRequest.Builder copy =
                 new DeleteMedicalResourcesRequest.Builder(original);
-        original.addDataSourceId("bar");
+        original.addDataSourceId(DIFFERENT_DATA_SOURCE_ID);
 
-        assertThat(original.build().getDataSourceIds()).containsExactly("foo", "bar");
-        assertThat(copy.build().getDataSourceIds()).containsExactly("foo");
+        assertThat(original.build().getDataSourceIds())
+                .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
+        assertThat(copy.build().getDataSourceIds()).containsExactly(DATA_SOURCE_ID);
     }
 
     @Test
     public void testRequestBuilder_fromExistingBuilderResourceType() {
         DeleteMedicalResourcesRequest.Builder original =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES);
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder(original).build();
 
@@ -163,15 +174,16 @@
     public void testRequestBuilder_fromExistingBuilderClearDataSources() {
         DeleteMedicalResourcesRequest.Builder original =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES);
         DeleteMedicalResourcesRequest.Builder copy =
                 new DeleteMedicalResourcesRequest.Builder(original);
-        original.addDataSourceId("bar");
+        original.addDataSourceId(DIFFERENT_DATA_SOURCE_ID);
 
         copy.clearDataSourceIds();
 
-        assertThat(original.build().getDataSourceIds()).containsExactly("foo", "bar");
+        assertThat(original.build().getDataSourceIds())
+                .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
         assertThat(copy.build().getDataSourceIds()).isEmpty();
     }
 
@@ -179,27 +191,94 @@
     public void testRequestBuilder_fromExistingBuilderClearMedicalResourceTypes() {
         DeleteMedicalResourcesRequest.Builder original =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES);
         DeleteMedicalResourcesRequest.Builder copy =
                 new DeleteMedicalResourcesRequest.Builder(original);
-        original.addMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN);
+        original.addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
 
         copy.clearMedicalResourceTypes();
 
         assertThat(original.build().getMedicalResourceTypes())
                 .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN);
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
+        assertThat(copy.build().getMedicalResourceTypes()).isEmpty();
+    }
+
+    @Test
+    public void testRequestBuilder_fromExistingInstance() {
+        DeleteMedicalResourcesRequest original =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder(original).build();
+
+        assertThat(request).isEqualTo(original);
+    }
+
+    @Test
+    public void testRequestBuilder_fromExistingInstance_changeIndependently() {
+        DeleteMedicalResourcesRequest original =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+        DeleteMedicalResourcesRequest.Builder copy =
+                new DeleteMedicalResourcesRequest.Builder(original);
+        copy.addDataSourceId(DIFFERENT_DATA_SOURCE_ID);
+
+        assertThat(original.getDataSourceIds()).containsExactly(DATA_SOURCE_ID);
+        assertThat(copy.build().getDataSourceIds())
+                .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
+    }
+
+    @Test
+    public void testRequestBuilder_fromExistingInstanceResourceType() {
+        DeleteMedicalResourcesRequest original =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder(original).build();
+
+        assertThat(request).isEqualTo(original);
+    }
+
+    @Test
+    public void testRequestBuilder_fromExistingInstanceClearDataSources() {
+        DeleteMedicalResourcesRequest original =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        DeleteMedicalResourcesRequest.Builder copy =
+                new DeleteMedicalResourcesRequest.Builder(original);
+        copy.clearDataSourceIds();
+
+        assertThat(original.getDataSourceIds()).containsExactly(DATA_SOURCE_ID);
+        assertThat(copy.build().getDataSourceIds()).isEmpty();
+    }
+
+    @Test
+    public void testRequestBuilder_fromExistingInstanceClearMedicalResourceTypes() {
+        DeleteMedicalResourcesRequest original =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        DeleteMedicalResourcesRequest.Builder copy =
+                new DeleteMedicalResourcesRequest.Builder(original);
+        copy.clearMedicalResourceTypes();
+
+        assertThat(original.getMedicalResourceTypes())
+                .containsExactly(MEDICAL_RESOURCE_TYPE_VACCINES);
         assertThat(copy.build().getMedicalResourceTypes()).isEmpty();
     }
 
     @Test
     public void testRequest_equalsSameIdOnly() {
         DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
         DeleteMedicalResourcesRequest same =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
 
         assertThat(request.equals(same)).isTrue();
         assertThat(request.hashCode()).isEqualTo(same.hashCode());
@@ -209,11 +288,11 @@
     public void testRequest_equalsSameResourceOnly() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         DeleteMedicalResourcesRequest same =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         assertThat(request.equals(same)).isTrue();
@@ -224,13 +303,13 @@
     public void testRequest_equalsSameResourceAndId() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .addDataSourceId("foo")
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addDataSourceId(DATA_SOURCE_ID)
                         .build();
         DeleteMedicalResourcesRequest same =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .addDataSourceId("foo")
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addDataSourceId(DATA_SOURCE_ID)
                         .build();
 
         assertThat(request.equals(same)).isTrue();
@@ -241,13 +320,13 @@
     public void testRequest_equalsDifferentOrderSame() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("bar")
-                        .addDataSourceId("foo")
+                        .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
+                        .addDataSourceId(DATA_SOURCE_ID)
                         .build();
         DeleteMedicalResourcesRequest same =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addDataSourceId("bar")
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .build();
 
         assertThat(request.equals(same)).isTrue();
@@ -257,9 +336,11 @@
     @Test
     public void testRequest_equalsDifferent() {
         DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
         DeleteMedicalResourcesRequest different =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("bar").build();
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
+                        .build();
 
         assertThat(request.equals(different)).isFalse();
     }
@@ -267,11 +348,11 @@
     @Test
     public void testRequest_equalsDifferByResource() {
         DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
         DeleteMedicalResourcesRequest different =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         assertThat(request.equals(different)).isFalse();
@@ -281,12 +362,12 @@
     public void testRequest_equalsDifferById() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         DeleteMedicalResourcesRequest different =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         assertThat(request.equals(different)).isFalse();
@@ -295,34 +376,33 @@
     @Test
     public void testToString_idOnly() {
         DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
-        String expectedPropertiesString = "dataSourceIds=[foo],medicalResourceTypes=[]";
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+        String dataSourceIdsString = "dataSourceIds=[" + DATA_SOURCE_ID + "]";
+        String resourceTypesString = "medicalResourceTypes=[]";
 
-        assertThat(request.toString())
-                .isEqualTo(
-                        String.format(
-                                "DeleteMedicalResourcesRequest{%s}", expectedPropertiesString));
+        assertThat(request.toString()).contains(dataSourceIdsString);
+        assertThat(request.toString()).contains(resourceTypesString);
     }
 
     @Test
     public void testToString_resourceAndId() {
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
-        String expectedPropertiesString = "dataSourceIds=[foo],medicalResourceTypes=[1]";
 
-        assertThat(request.toString())
-                .isEqualTo(
-                        String.format(
-                                "DeleteMedicalResourcesRequest{%s}", expectedPropertiesString));
+        String dataSourceIdsString = "dataSourceIds=[" + DATA_SOURCE_ID + "]";
+        String resourceTypesString = "medicalResourceTypes=[1]";
+
+        assertThat(request.toString()).contains(dataSourceIdsString);
+        assertThat(request.toString()).contains(resourceTypesString);
     }
 
     @Test
     public void testWriteToParcelThenRestore_objectsAreIdentical() {
         DeleteMedicalResourcesRequest original =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
 
         Parcel parcel = Parcel.obtain();
         original.writeToParcel(parcel, 0);
@@ -338,11 +418,10 @@
     public void testWriteToParcelThenRestore_multiple_objectsAreIdentical() {
         DeleteMedicalResourcesRequest original =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addDataSourceId("bar")
-                        .addDataSourceId("baz")
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .addMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN)
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build();
 
         Parcel parcel = Parcel.obtain();
@@ -359,9 +438,8 @@
     public void testWriteToParcelThenRestore_justIds_objectsAreIdentical() {
         DeleteMedicalResourcesRequest original =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId("foo")
-                        .addDataSourceId("bar")
-                        .addDataSourceId("baz")
+                        .addDataSourceId(DATA_SOURCE_ID)
+                        .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .build();
 
         Parcel parcel = Parcel.obtain();
@@ -378,8 +456,8 @@
     public void testWriteToParcelThenRestore_justResources_objectsAreIdentical() {
         DeleteMedicalResourcesRequest original =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .addMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build();
 
         Parcel parcel = Parcel.obtain();
@@ -415,7 +493,7 @@
     @Test
     public void testDescribeContents_noFlags() {
         DeleteMedicalResourcesRequest original =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
         assertThat(original.describeContents()).isEqualTo(0);
     }
 
@@ -424,7 +502,7 @@
             throws NoSuchFieldException, IllegalAccessException {
         DeleteMedicalResourcesRequest original =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         setFieldValueUsingReflection(original, "mMedicalResourceTypes", Set.of(-1));
 
@@ -436,4 +514,21 @@
                 IllegalArgumentException.class,
                 () -> DeleteMedicalResourcesRequest.CREATOR.createFromParcel(parcel));
     }
+
+    @Test
+    public void testRestoreInvalidDataSourceIdsFromParcel_expectException()
+            throws NoSuchFieldException, IllegalAccessException {
+
+        DeleteMedicalResourcesRequest original =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+        setFieldValueUsingReflection(original, "mDataSourceIds", Set.of("1"));
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> DeleteMedicalResourcesRequest.CREATOR.createFromParcel(parcel));
+    }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/FhirResourceTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/FhirResourceTest.java
similarity index 65%
rename from tests/cts/src/android/healthconnect/cts/datatypes/FhirResourceTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/FhirResourceTest.java
index b8f0582..d8f2d08 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/FhirResourceTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/FhirResourceTest.java
@@ -14,22 +14,27 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts.datatypes;
+package android.healthconnect.cts.phr;
 
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_CONDITION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ENCOUNTER;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_LOCATION;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_REQUEST;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_OBSERVATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ORGANIZATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PATIENT;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PROCEDURE;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_ID_ALLERGY;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResourceBuilder;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getFhirResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getFhirResourceBuilder;
 import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -37,10 +42,13 @@
 import static org.junit.Assert.assertThrows;
 
 import android.health.connect.datatypes.FhirResource;
-import android.healthconnect.cts.utils.ConditionBuilder;
-import android.healthconnect.cts.utils.MedicationsBuilder;
-import android.healthconnect.cts.utils.ObservationBuilder;
-import android.healthconnect.cts.utils.ProcedureBuilder;
+import android.healthconnect.cts.phr.utils.ConditionBuilder;
+import android.healthconnect.cts.phr.utils.EncountersBuilder;
+import android.healthconnect.cts.phr.utils.MedicationsBuilder;
+import android.healthconnect.cts.phr.utils.ObservationBuilder;
+import android.healthconnect.cts.phr.utils.PatientBuilder;
+import android.healthconnect.cts.phr.utils.PractitionerBuilder;
+import android.healthconnect.cts.phr.utils.ProcedureBuilder;
 import android.os.Parcel;
 import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
@@ -171,6 +179,102 @@
     }
 
     @Test
+    public void testFhirResourceBuilder_setAllFieldsPatient() {
+        String id = "myId123";
+        String fhirData = new PatientBuilder().setId(id).toJson();
+        FhirResource resource =
+                getFhirResourceBuilder()
+                        .setType(FHIR_RESOURCE_TYPE_PATIENT)
+                        .setId(id)
+                        .setData(fhirData)
+                        .build();
+
+        assertThat(resource.getType()).isEqualTo(FHIR_RESOURCE_TYPE_PATIENT);
+        assertThat(resource.getId()).isEqualTo(id);
+        assertThat(resource.getData()).isEqualTo(fhirData);
+    }
+
+    @Test
+    public void testFhirResourceBuilder_setAllFieldsPractitioner() {
+        String id = "myId123";
+        String fhirData = new PractitionerBuilder().setId(id).toJson();
+        FhirResource resource =
+                getFhirResourceBuilder()
+                        .setType(FHIR_RESOURCE_TYPE_PRACTITIONER)
+                        .setId(id)
+                        .setData(fhirData)
+                        .build();
+
+        assertThat(resource.getType()).isEqualTo(FHIR_RESOURCE_TYPE_PRACTITIONER);
+        assertThat(resource.getId()).isEqualTo(id);
+        assertThat(resource.getData()).isEqualTo(fhirData);
+    }
+
+    @Test
+    public void testFhirResourceBuilder_setAllFieldsPractitionerRole() {
+        String id = "myId123";
+        String fhirData = PractitionerBuilder.role().setId(id).toJson();
+        FhirResource resource =
+                getFhirResourceBuilder()
+                        .setType(FHIR_RESOURCE_TYPE_PRACTITIONER)
+                        .setId(id)
+                        .setData(fhirData)
+                        .build();
+
+        assertThat(resource.getType()).isEqualTo(FHIR_RESOURCE_TYPE_PRACTITIONER);
+        assertThat(resource.getId()).isEqualTo(id);
+        assertThat(resource.getData()).isEqualTo(fhirData);
+    }
+
+    @Test
+    public void testFhirResourceBuilder_setAllFieldsEncounter() {
+        String id = "myId123";
+        String fhirData = EncountersBuilder.encounter().setId(id).toJson();
+        FhirResource resource =
+                getFhirResourceBuilder()
+                        .setType(FHIR_RESOURCE_TYPE_ENCOUNTER)
+                        .setId(id)
+                        .setData(fhirData)
+                        .build();
+
+        assertThat(resource.getType()).isEqualTo(FHIR_RESOURCE_TYPE_ENCOUNTER);
+        assertThat(resource.getId()).isEqualTo(id);
+        assertThat(resource.getData()).isEqualTo(fhirData);
+    }
+
+    @Test
+    public void testFhirResourceBuilder_setAllFieldsLocation() {
+        String id = "myId123";
+        String fhirData = EncountersBuilder.location().setId(id).toJson();
+        FhirResource resource =
+                getFhirResourceBuilder()
+                        .setType(FHIR_RESOURCE_TYPE_LOCATION)
+                        .setId(id)
+                        .setData(fhirData)
+                        .build();
+
+        assertThat(resource.getType()).isEqualTo(FHIR_RESOURCE_TYPE_LOCATION);
+        assertThat(resource.getId()).isEqualTo(id);
+        assertThat(resource.getData()).isEqualTo(fhirData);
+    }
+
+    @Test
+    public void testFhirResourceBuilder_setAllFieldsOrganization() {
+        String id = "myId123";
+        String fhirData = EncountersBuilder.organization().setId(id).toJson();
+        FhirResource resource =
+                getFhirResourceBuilder()
+                        .setType(FHIR_RESOURCE_TYPE_ORGANIZATION)
+                        .setId(id)
+                        .setData(fhirData)
+                        .build();
+
+        assertThat(resource.getType()).isEqualTo(FHIR_RESOURCE_TYPE_ORGANIZATION);
+        assertThat(resource.getId()).isEqualTo(id);
+        assertThat(resource.getData()).isEqualTo(fhirData);
+    }
+
+    @Test
     public void testFhirResourceBuilder_setAllFields_allergy() {
         FhirResource resource =
                 getFhirResourceBuilder()
@@ -208,15 +312,13 @@
                                 FHIR_RESOURCE_ID_IMMUNIZATION,
                                 FHIR_DATA_IMMUNIZATION)
                         .build();
-        String expectedPropertiesString =
-                String.format(
-                        "type=%d,id=%s,data=%s",
-                        FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                        FHIR_RESOURCE_ID_IMMUNIZATION,
-                        FHIR_DATA_IMMUNIZATION);
+        String typeString = "type=1";
+        String idString = "id=" + FHIR_RESOURCE_ID_IMMUNIZATION;
+        String dataString = "data=" + FHIR_DATA_IMMUNIZATION;
 
-        assertThat(resource.toString())
-                .isEqualTo(String.format("FhirResource{%s}", expectedPropertiesString));
+        assertThat(resource.toString()).contains(typeString);
+        assertThat(resource.toString()).contains(idString);
+        assertThat(resource.toString()).contains(dataString);
     }
 
     @Test
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/FhirVersionTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/FhirVersionTest.java
similarity index 71%
rename from tests/cts/src/android/healthconnect/cts/datatypes/FhirVersionTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/FhirVersionTest.java
index 5db245b..a5028e0 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/FhirVersionTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/FhirVersionTest.java
@@ -14,11 +14,13 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts.datatypes;
+package android.healthconnect.cts.phr;
 
 import static android.health.connect.datatypes.FhirVersion.parseFhirVersion;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
-import static android.healthconnect.cts.utils.PhrDataFactory.R4_VERSION_STRING;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.R4B_VERSION_STRING;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.R4_VERSION_STRING;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.UNSUPPORTED_VERSION_STRING;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -83,6 +85,11 @@
     }
 
     @Test
+    public void testFhirVersion_parseFhirVersion_invalidNegativeNumbers() {
+        assertThrows(IllegalArgumentException.class, () -> parseFhirVersion("-4.0.1"));
+    }
+
+    @Test
     public void testFhirVersion_toString() {
         FhirVersion fhirVersion = parseFhirVersion(R4_VERSION_STRING);
 
@@ -125,4 +132,42 @@
         assertThat(restored).isEqualTo(original);
         parcel.recycle();
     }
+
+    @Test
+    public void testWriteToParcel_negativeVersionNumbers_throws() {
+        Parcel parcel = Parcel.obtain();
+        parcel.writeInt(-1);
+        parcel.writeInt(0);
+        parcel.writeInt(0);
+        parcel.setDataPosition(0);
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () -> FhirVersion.CREATOR.createFromParcel(parcel));
+
+        assertThat(thrown).hasMessageThat().contains("Version numbers can not be negative");
+        parcel.recycle();
+    }
+
+    @Test
+    public void testFhirVersion_isSupportedFhirVersion_supportsR4() {
+        FhirVersion fhirVersion = parseFhirVersion(R4_VERSION_STRING);
+
+        assertThat(fhirVersion.isSupportedFhirVersion()).isTrue();
+    }
+
+    @Test
+    public void testFhirVersion_isSupportedFhirVersion_supportsR4B() {
+        FhirVersion fhirVersion = parseFhirVersion(R4B_VERSION_STRING);
+
+        assertThat(fhirVersion.isSupportedFhirVersion()).isTrue();
+    }
+
+    @Test
+    public void testFhirVersion_isSupportedFhirVersion_differentVersionNotSupported() {
+        FhirVersion fhirVersion = parseFhirVersion(UNSUPPORTED_VERSION_STRING);
+
+        assertThat(fhirVersion.isSupportedFhirVersion()).isFalse();
+    }
 }
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/GetMedicalDataSourcesRequestTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/GetMedicalDataSourcesRequestTest.java
new file mode 100644
index 0000000..928a9cd
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/GetMedicalDataSourcesRequestTest.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr;
+
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.GetMedicalDataSourcesRequest;
+import android.os.Parcel;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+
+import com.google.common.collect.Sets;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Set;
+
+@RequiresFlagsEnabled(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+@RunWith(AndroidJUnit4.class)
+public class GetMedicalDataSourcesRequestTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Test
+    public void testBuilder_constructor() {
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+
+        assertThat(request.getPackageNames()).isEmpty();
+    }
+
+    @Test
+    public void testBuilder_addValidPackageNames() {
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.foo")
+                        .addPackageName("com.bar")
+                        .build();
+
+        assertThat(request.getPackageNames()).containsExactly("com.foo", "com.bar");
+    }
+
+    @Test
+    public void testBuilder_fromExistingBuilder() {
+        GetMedicalDataSourcesRequest.Builder original =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.foo")
+                        .addPackageName("com.bar");
+        GetMedicalDataSourcesRequest copy =
+                new GetMedicalDataSourcesRequest.Builder(original).build();
+
+        assertThat(copy).isEqualTo(original.build());
+    }
+
+    @Test
+    public void testBuilder_fromExistingBuilder_changeIndependently() {
+        GetMedicalDataSourcesRequest.Builder original =
+                new GetMedicalDataSourcesRequest.Builder().addPackageName("com.foo");
+        GetMedicalDataSourcesRequest.Builder copy =
+                new GetMedicalDataSourcesRequest.Builder(original);
+        original.addPackageName("com.bar");
+
+        assertThat(original.build().getPackageNames()).containsExactly("com.foo", "com.bar");
+        assertThat(copy.build().getPackageNames()).containsExactly("com.foo");
+    }
+
+    @Test
+    public void testBuilder_fromExistingBuilderClearPackageNames() {
+        GetMedicalDataSourcesRequest.Builder original =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.foo")
+                        .addPackageName("com.bar");
+        GetMedicalDataSourcesRequest.Builder copy =
+                new GetMedicalDataSourcesRequest.Builder(original);
+        original.clearPackageNames();
+
+        assertThat(original.build().getPackageNames()).isEmpty();
+        assertThat(copy.build().getPackageNames()).containsExactly("com.foo", "com.bar");
+    }
+
+    @Test
+    public void testBuilder_fromExistingInstance() {
+        GetMedicalDataSourcesRequest original =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.foo")
+                        .addPackageName("com.bar")
+                        .build();
+        GetMedicalDataSourcesRequest copy =
+                new GetMedicalDataSourcesRequest.Builder(original).build();
+
+        assertThat(copy).isEqualTo(original);
+    }
+
+    @Test
+    public void testBuilder_fromExistingInstance_changeIndependently() {
+        GetMedicalDataSourcesRequest original =
+                new GetMedicalDataSourcesRequest.Builder().addPackageName("com.foo").build();
+        GetMedicalDataSourcesRequest.Builder copy =
+                new GetMedicalDataSourcesRequest.Builder(original);
+        copy.addPackageName("com.bar");
+
+        assertThat(original.getPackageNames()).containsExactly("com.foo");
+        assertThat(copy.build().getPackageNames()).containsExactly("com.foo", "com.bar");
+    }
+
+    @Test
+    public void testBuilder_fromExistingInstanceClearPackageNames() {
+        GetMedicalDataSourcesRequest original =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.foo")
+                        .addPackageName("com.bar")
+                        .build();
+        GetMedicalDataSourcesRequest.Builder copy =
+                new GetMedicalDataSourcesRequest.Builder(original);
+        copy.clearPackageNames();
+
+        assertThat(original.getPackageNames()).containsExactly("com.foo", "com.bar");
+        assertThat(copy.build().getPackageNames()).isEmpty();
+    }
+
+    @Test
+    public void testBuilder_addInvalidPackageNames_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new GetMedicalDataSourcesRequest.Builder().addPackageName("foo"));
+    }
+
+    @Test
+    public void testRequest_equalsAndHashcode() {
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.foo")
+                        .addPackageName("com.bar")
+                        .build();
+        GetMedicalDataSourcesRequest requestSame =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.bar")
+                        .addPackageName("com.foo")
+                        .build();
+        GetMedicalDataSourcesRequest requestDifferent =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.bar")
+                        .addPackageName("com.foo")
+                        .addPackageName("com.baz")
+                        .build();
+
+        assertThat(request).isEqualTo(requestSame);
+        assertThat(request.hashCode()).isEqualTo(requestSame.hashCode());
+        assertThat(request).isNotEqualTo(requestDifferent);
+    }
+
+    @Test
+    public void testWriteToParcelThenRestore_objectsAreIdentical() {
+        GetMedicalDataSourcesRequest original =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.foo")
+                        .addPackageName("com.bar")
+                        .build();
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        GetMedicalDataSourcesRequest restored =
+                GetMedicalDataSourcesRequest.CREATOR.createFromParcel(parcel);
+
+        assertThat(restored).isEqualTo(original);
+        parcel.recycle();
+    }
+
+    @Test
+    public void testRequest_toString() {
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName("com.foo")
+                        .addPackageName("com.bar")
+                        .build();
+        String expectedPropertiesStringOrder1 = "packageNames={com.foo, com.bar}";
+        String expectedPropertiesStringOrder2 = "packageNames={com.bar, com.foo}";
+
+        String formatString = "GetMedicalDataSourcesRequest{%s}";
+        assertThat(request.toString())
+                .isAnyOf(
+                        String.format(formatString, expectedPropertiesStringOrder1),
+                        String.format(formatString, expectedPropertiesStringOrder2));
+    }
+
+    @Test
+    public void testRestoreInvalidPackageNameFromParcel_expectException()
+            throws NoSuchFieldException, IllegalAccessException {
+        GetMedicalDataSourcesRequest original = new GetMedicalDataSourcesRequest.Builder().build();
+        Set<String> validPackageNames =
+                Set.of("com.foo", "com.FOO", "com.foo_bar", "com.foo_bar.baz1");
+        Set<String> invalidPackageNames =
+                Set.of(
+                        ".",
+                        ".foo",
+                        "foo.",
+                        "com",
+                        "_com.bar",
+                        "com.1bar",
+                        "1com.bar",
+                        "com..bar",
+                        "com.-bar",
+                        "delete * from table");
+        Set<String> packageNames = Sets.union(validPackageNames, invalidPackageNames);
+        setFieldValueUsingReflection(original, "mPackageNames", packageNames);
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+
+        Exception exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () -> GetMedicalDataSourcesRequest.CREATOR.createFromParcel(parcel));
+
+        for (String validPackageName : validPackageNames) {
+            assertThat(exception.getMessage()).doesNotContain(validPackageName);
+        }
+        for (String invalidPackageName : invalidPackageNames) {
+            assertThat(exception.getMessage()).contains(invalidPackageName);
+        }
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/MedicalDataSourceTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/MedicalDataSourceTest.java
similarity index 67%
rename from tests/cts/src/android/healthconnect/cts/datatypes/MedicalDataSourceTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/MedicalDataSourceTest.java
index 75ce244..962367d 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/MedicalDataSourceTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/MedicalDataSourceTest.java
@@ -14,21 +14,23 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts.datatypes;
+package android.healthconnect.cts.phr;
 
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_LAST_DATA_UPDATE_TIME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_BASE_URI;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_LAST_DATA_UPDATE_TIME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_PACKAGE_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalDataSourceBuilderWithLastDataUpdateTime;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalDataSourceRequiredFieldsOnly;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalDataSourceWithLastDataUpdateTime;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_VERSION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_LAST_DATA_UPDATE_TIME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_FHIR_VERSION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_LAST_DATA_UPDATE_TIME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalDataSourceBuilderWithOptionalFields;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalDataSourceRequiredFieldsOnly;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalDataSourceWithOptionalFields;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -60,24 +62,27 @@
                                 DATA_SOURCE_ID,
                                 DATA_SOURCE_PACKAGE_NAME,
                                 DATA_SOURCE_FHIR_BASE_URI,
-                                DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
 
         assertThat(dataSource.getId()).isEqualTo(DATA_SOURCE_ID);
         assertThat(dataSource.getPackageName()).isEqualTo(DATA_SOURCE_PACKAGE_NAME);
         assertThat(dataSource.getFhirBaseUri()).isEqualTo(DATA_SOURCE_FHIR_BASE_URI);
         assertThat(dataSource.getDisplayName()).isEqualTo(DATA_SOURCE_DISPLAY_NAME);
+        assertThat(dataSource.getFhirVersion()).isEqualTo(DATA_SOURCE_FHIR_VERSION);
         assertThat(dataSource.getLastDataUpdateTime()).isNull();
     }
 
     @Test
     public void testMedicalDataSourceBuilder_setAllFields() {
         MedicalDataSource dataSource =
-                new MedicalDataSource.Builder("", "", Uri.EMPTY, "")
+                new MedicalDataSource.Builder("", "", Uri.EMPTY, "", DATA_SOURCE_FHIR_VERSION)
                         .setId(DATA_SOURCE_ID)
                         .setPackageName(DATA_SOURCE_PACKAGE_NAME)
                         .setFhirBaseUri(DATA_SOURCE_FHIR_BASE_URI)
                         .setDisplayName(DATA_SOURCE_DISPLAY_NAME)
+                        .setFhirVersion(DIFFERENT_DATA_SOURCE_FHIR_VERSION)
                         .setLastDataUpdateTime(DATA_SOURCE_LAST_DATA_UPDATE_TIME)
                         .build();
 
@@ -85,12 +90,13 @@
         assertThat(dataSource.getPackageName()).isEqualTo(DATA_SOURCE_PACKAGE_NAME);
         assertThat(dataSource.getFhirBaseUri()).isEqualTo(DATA_SOURCE_FHIR_BASE_URI);
         assertThat(dataSource.getDisplayName()).isEqualTo(DATA_SOURCE_DISPLAY_NAME);
+        assertThat(dataSource.getFhirVersion()).isEqualTo(DIFFERENT_DATA_SOURCE_FHIR_VERSION);
         assertThat(dataSource.getLastDataUpdateTime()).isEqualTo(DATA_SOURCE_LAST_DATA_UPDATE_TIME);
     }
 
     @Test
     public void testMedicalDataSourceBuilder_fromExistingBuilder() {
-        MedicalDataSource.Builder original = getMedicalDataSourceBuilderWithLastDataUpdateTime();
+        MedicalDataSource.Builder original = getMedicalDataSourceBuilderWithOptionalFields();
 
         MedicalDataSource dataSource = new MedicalDataSource.Builder(original).build();
 
@@ -99,7 +105,7 @@
 
     @Test
     public void testMedicalDataSourceBuilder_fromExistingInstance() {
-        MedicalDataSource original = getMedicalDataSourceWithLastDataUpdateTime();
+        MedicalDataSource original = getMedicalDataSourceWithOptionalFields();
 
         MedicalDataSource dataSource = new MedicalDataSource.Builder(original).build();
 
@@ -113,39 +119,45 @@
                                 DATA_SOURCE_ID,
                                 DATA_SOURCE_PACKAGE_NAME,
                                 DATA_SOURCE_FHIR_BASE_URI,
-                                DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .setLastDataUpdateTime(DATA_SOURCE_LAST_DATA_UPDATE_TIME)
                         .build();
-        String expectedPropertiesString =
-                String.format(
-                        "id=%s,packageName=%s,fhirBaseUri=%s,displayName=%s,lastDataUpdateTime=%s",
-                        DATA_SOURCE_ID,
-                        DATA_SOURCE_PACKAGE_NAME,
-                        DATA_SOURCE_FHIR_BASE_URI,
-                        DATA_SOURCE_DISPLAY_NAME,
-                        DATA_SOURCE_LAST_DATA_UPDATE_TIME);
+        String idString = "id=" + DATA_SOURCE_ID;
+        String packageNameString = "packageName=" + DATA_SOURCE_PACKAGE_NAME;
+        String fhirBaseUriString = "fhirBaseUri=" + DATA_SOURCE_FHIR_BASE_URI;
+        String displayNameString = "displayName=" + DATA_SOURCE_DISPLAY_NAME;
+        String fhirVersionString = "fhirVersion=" + DATA_SOURCE_FHIR_VERSION;
+        String lastDataUpdateTimeString = "lastDataUpdateTime=" + DATA_SOURCE_LAST_DATA_UPDATE_TIME;
 
-        assertThat(dataSource.toString())
-                .isEqualTo(String.format("MedicalDataSource{%s}", expectedPropertiesString));
+        assertThat(dataSource.toString()).contains(idString);
+        assertThat(dataSource.toString()).contains(packageNameString);
+        assertThat(dataSource.toString()).contains(fhirBaseUriString);
+        assertThat(dataSource.toString()).contains(displayNameString);
+        assertThat(dataSource.toString()).contains(fhirVersionString);
+        assertThat(dataSource.toString()).contains(lastDataUpdateTimeString);
     }
 
     @Test
-    public void testMedicalDataSource_toStringWithLastDataUpdateTimeNull() {
+    public void testMedicalDataSource_toStringWithOptionalParamsNull() {
         MedicalDataSource dataSource =
                 new MedicalDataSource.Builder(
                                 DATA_SOURCE_ID,
                                 DATA_SOURCE_PACKAGE_NAME,
                                 DATA_SOURCE_FHIR_BASE_URI,
-                                DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .setLastDataUpdateTime(null)
                         .build();
         String expectedPropertiesString =
                 String.format(
-                        "id=%s,packageName=%s,fhirBaseUri=%s,displayName=%s,lastDataUpdateTime=%s",
+                        "id=%s,packageName=%s,fhirBaseUri=%s,displayName=%s,fhirVersion=%s,"
+                                + "lastDataUpdateTime=%s",
                         DATA_SOURCE_ID,
                         DATA_SOURCE_PACKAGE_NAME,
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         null);
 
         assertThat(dataSource.toString())
@@ -162,9 +174,9 @@
     }
 
     @Test
-    public void testMedicalDataSource_withLastDataUpdateTime_equals() {
-        MedicalDataSource dataSource1 = getMedicalDataSourceWithLastDataUpdateTime();
-        MedicalDataSource dataSource2 = getMedicalDataSourceWithLastDataUpdateTime();
+    public void testMedicalDataSource_withOptionalParams_equals() {
+        MedicalDataSource dataSource1 = getMedicalDataSourceWithOptionalFields();
+        MedicalDataSource dataSource2 = getMedicalDataSourceWithOptionalFields();
 
         assertThat(dataSource1.equals(dataSource2)).isTrue();
         assertThat(dataSource1.hashCode()).isEqualTo(dataSource2.hashCode());
@@ -172,7 +184,7 @@
 
     @Test
     public void testMedicalDataSource_equals_comparesAllValues() {
-        MedicalDataSource dataSource = getMedicalDataSourceWithLastDataUpdateTime();
+        MedicalDataSource dataSource = getMedicalDataSourceWithOptionalFields();
         MedicalDataSource dataSourceDifferentBaseUri =
                 new MedicalDataSource.Builder(dataSource)
                         .setFhirBaseUri(DIFFERENT_DATA_SOURCE_BASE_URI)
@@ -181,6 +193,10 @@
                 new MedicalDataSource.Builder(dataSource)
                         .setDisplayName(DIFFERENT_DATA_SOURCE_DISPLAY_NAME)
                         .build();
+        MedicalDataSource dataSourceDifferentFhirVersion =
+                new MedicalDataSource.Builder(dataSource)
+                        .setFhirVersion(DIFFERENT_DATA_SOURCE_FHIR_VERSION)
+                        .build();
         MedicalDataSource dataSourceDifferentId =
                 new MedicalDataSource.Builder(dataSource).setId(DIFFERENT_DATA_SOURCE_ID).build();
         MedicalDataSource dataSourceDifferentPackageName =
@@ -194,11 +210,13 @@
 
         assertThat(dataSourceDifferentBaseUri.equals(dataSource)).isFalse();
         assertThat(dataSourceDifferentDisplayName.equals(dataSource)).isFalse();
+        assertThat(dataSourceDifferentFhirVersion.equals(dataSource)).isFalse();
         assertThat(dataSourceDifferentId.equals(dataSource)).isFalse();
         assertThat(dataSourceDifferentPackageName.equals(dataSource)).isFalse();
         assertThat(dataSourceDifferentLastDataUpdateTime.equals(dataSource)).isFalse();
         assertThat(dataSourceDifferentBaseUri.hashCode()).isNotEqualTo(dataSource.hashCode());
         assertThat(dataSourceDifferentDisplayName.hashCode()).isNotEqualTo(dataSource.hashCode());
+        assertThat(dataSourceDifferentFhirVersion.hashCode()).isNotEqualTo(dataSource.hashCode());
         assertThat(dataSourceDifferentId.hashCode()).isNotEqualTo(dataSource.hashCode());
         assertThat(dataSourceDifferentPackageName.hashCode()).isNotEqualTo(dataSource.hashCode());
         assertThat(dataSourceDifferentLastDataUpdateTime.hashCode())
@@ -220,7 +238,7 @@
 
     @Test
     public void testWriteToParcelThenRestore_withOptionalValues_objectsAreIdentical() {
-        MedicalDataSource original = getMedicalDataSourceWithLastDataUpdateTime();
+        MedicalDataSource original = getMedicalDataSourceWithOptionalFields();
 
         Parcel parcel = Parcel.obtain();
         original.writeToParcel(parcel, 0);
diff --git a/tests/cts/src/android/healthconnect/cts/MedicalResourceIdTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceIdTest.java
similarity index 69%
rename from tests/cts/src/android/healthconnect/cts/MedicalResourceIdTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceIdTest.java
index 35710e9..a92d1de 100644
--- a/tests/cts/src/android/healthconnect/cts/MedicalResourceIdTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceIdTest.java
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts;
+package android.healthconnect.cts.phr;
 
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_UNKNOWN;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_ID_ALLERGY;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResourceId;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResourceId;
 import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -44,7 +44,10 @@
 import org.junit.runner.RunWith;
 
 @RunWith(AndroidJUnit4.class)
-@RequiresFlagsEnabled(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+@RequiresFlagsEnabled({
+    Flags.FLAG_PERSONAL_HEALTH_RECORD,
+    Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE
+})
 public class MedicalResourceIdTest {
     @Rule
     public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@@ -64,6 +67,24 @@
     }
 
     @Test
+    public void testMedicalResourceId_constructWithInvalidDataSourceId_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        new MedicalResourceId(
+                                "1",
+                                FHIR_RESOURCE_TYPE_IMMUNIZATION,
+                                FHIR_RESOURCE_ID_IMMUNIZATION));
+    }
+
+    @Test
+    public void testMedicalResourceId_constructWithInvalidFhirResourceType_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new MedicalResourceId(DATA_SOURCE_ID, -1, FHIR_RESOURCE_ID_IMMUNIZATION));
+    }
+
+    @Test
     public void testMedicalResourceId_fromFhirReference_validReference() {
         MedicalResourceId medicalResourceId =
                 MedicalResourceId.fromFhirReference(DATA_SOURCE_ID, "Immunization/034-AB16.0");
@@ -75,24 +96,28 @@
     }
 
     @Test
-    public void testMedicalResourceId_fromFhirReference_unknownFhirResourceType() {
-        MedicalResourceId medicalResourceId =
-                MedicalResourceId.fromFhirReference(DATA_SOURCE_ID, "Patient/034-AB16.0");
-
-        assertThat(medicalResourceId.getDataSourceId()).isEqualTo(DATA_SOURCE_ID);
-        assertThat(medicalResourceId.getFhirResourceType()).isEqualTo(FHIR_RESOURCE_TYPE_UNKNOWN);
-        assertThat(medicalResourceId.getFhirResourceId()).isEqualTo("034-AB16.0");
+    public void testMedicalResourceId_fromFhirReference_invalidDataSourceId_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> MedicalResourceId.fromFhirReference("1", "Immunization/034-AB16.0"));
     }
 
     @Test
-    public void testMedicalResourceId_fromFhirReference_invalidFhirResourceType() {
+    public void testMedicalResourceId_fromFhirReference_unknownFhirResourceType_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> MedicalResourceId.fromFhirReference(DATA_SOURCE_ID, "TestReport/034-AB16.0"));
+    }
+
+    @Test
+    public void testMedicalResourceId_fromFhirReference_invalidFhirResourceType_throws() {
         assertThrows(
                 IllegalArgumentException.class,
                 () -> MedicalResourceId.fromFhirReference(DATA_SOURCE_ID, "Patient0/034-AB16.0"));
     }
 
     @Test
-    public void testMedicalResourceId_fromFhirReference_invalidFhirResourceId() {
+    public void testMedicalResourceId_fromFhirReference_invalidFhirResourceId_throws() {
         assertThrows(
                 IllegalArgumentException.class,
                 () -> MedicalResourceId.fromFhirReference(DATA_SOURCE_ID, "Patient/034*AB16#0"));
@@ -105,15 +130,13 @@
                         DATA_SOURCE_ID,
                         FHIR_RESOURCE_TYPE_IMMUNIZATION,
                         FHIR_RESOURCE_ID_IMMUNIZATION);
-        String expectedPropertiesString =
-                String.format(
-                        "dataSourceId=%s,fhirResourceType=%s,fhirResourceId=%s",
-                        DATA_SOURCE_ID,
-                        FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                        FHIR_RESOURCE_ID_IMMUNIZATION);
+        String dataSourceIdString = "dataSourceId=" + DATA_SOURCE_ID;
+        String fhirResourceTypeString = "fhirResourceType=1";
+        String fhirResourceIdString = "fhirResourceId=" + FHIR_RESOURCE_ID_IMMUNIZATION;
 
-        assertThat(medicalResourceId.toString())
-                .isEqualTo(String.format("MedicalResourceId{%s}", expectedPropertiesString));
+        assertThat(medicalResourceId.toString()).contains(dataSourceIdString);
+        assertThat(medicalResourceId.toString()).contains(fhirResourceTypeString);
+        assertThat(medicalResourceId.toString()).contains(fhirResourceIdString);
     }
 
     @Test
@@ -139,7 +162,9 @@
                         FHIR_RESOURCE_ID_IMMUNIZATION);
         MedicalResourceId idWithDifferentFhirResourceType =
                 new MedicalResourceId(
-                        DATA_SOURCE_ID, FHIR_RESOURCE_TYPE_UNKNOWN, FHIR_RESOURCE_ID_IMMUNIZATION);
+                        DATA_SOURCE_ID,
+                        FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
+                        FHIR_RESOURCE_ID_IMMUNIZATION);
         MedicalResourceId idWithDifferentFhirResourceId =
                 new MedicalResourceId(
                         DATA_SOURCE_ID, FHIR_RESOURCE_TYPE_IMMUNIZATION, FHIR_RESOURCE_ID_ALLERGY);
@@ -182,4 +207,19 @@
                 IllegalArgumentException.class,
                 () -> MedicalResourceId.CREATOR.createFromParcel(parcel));
     }
+
+    @Test
+    public void testRestoreInvalidDataSourceIdFromParcel_expectException()
+            throws NoSuchFieldException, IllegalAccessException {
+        MedicalResourceId original = getMedicalResourceId();
+        setFieldValueUsingReflection(original, "mDataSourceId", "1");
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> MedicalResourceId.CREATOR.createFromParcel(parcel));
+    }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/MedicalResourceTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceTest.java
similarity index 64%
rename from tests/cts/src/android/healthconnect/cts/datatypes/MedicalResourceTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceTest.java
index 94b4dfe..b5be258 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/MedicalResourceTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceTest.java
@@ -14,18 +14,18 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts.datatypes;
+package android.healthconnect.cts.phr;
 
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4B;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResourceAllergy;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResourceBuilder;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4B;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getFhirResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getFhirResourceAllergy;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResourceBuilder;
 import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -60,13 +60,13 @@
         FhirResource fhirResource = getFhirResource();
         MedicalResource resource =
                 new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                                MEDICAL_RESOURCE_TYPE_VACCINES,
                                 DATA_SOURCE_ID,
                                 FHIR_VERSION_R4,
                                 fhirResource)
                         .build();
 
-        assertThat(resource.getType()).isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+        assertThat(resource.getType()).isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
         assertThat(resource.getDataSourceId()).isEqualTo(DATA_SOURCE_ID);
         assertThat(resource.getFhirVersion()).isEqualTo(FHIR_VERSION_R4);
         assertThat(resource.getFhirResource()).isEqualTo(fhirResource);
@@ -82,13 +82,13 @@
         FhirResource differentFhirResource = getFhirResourceAllergy();
         MedicalResource resource =
                 getMedicalResourceBuilder()
-                        .setType(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE)
+                        .setType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .setDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .setFhirVersion(differentFhirVersion)
                         .setFhirResource(differentFhirResource)
                         .build();
 
-        assertThat(resource.getType()).isEqualTo(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+        assertThat(resource.getType()).isEqualTo(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
         assertThat(resource.getDataSourceId()).isEqualTo(DIFFERENT_DATA_SOURCE_ID);
         assertThat(resource.getFhirVersion()).isEqualTo(differentFhirVersion);
         assertThat(resource.getFhirResource()).isEqualTo(differentFhirResource);
@@ -117,25 +117,71 @@
     }
 
     @Test
+    public void testMedicalResourceBuilder_constructWithInvalidMedicalResourceType_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        new MedicalResource.Builder(
+                                -1, DATA_SOURCE_ID, FHIR_VERSION_R4, getFhirResource()));
+    }
+
+    @Test
+    public void testMedicalResourceBuilder_setInvalidMedicalResourceType_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        new MedicalResource.Builder(
+                                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                                        DATA_SOURCE_ID,
+                                        FHIR_VERSION_R4,
+                                        getFhirResource())
+                                .setType(-1));
+    }
+
+    @Test
+    public void testMedicalResourceBuilder_constructWithInvalidDataSourceId_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        new MedicalResource.Builder(
+                                MEDICAL_RESOURCE_TYPE_VACCINES,
+                                "1",
+                                FHIR_VERSION_R4,
+                                getFhirResource()));
+    }
+
+    @Test
+    public void testMedicalResourceBuilder_setInvalidDataSourceId_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        new MedicalResource.Builder(
+                                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                                        DATA_SOURCE_ID,
+                                        FHIR_VERSION_R4,
+                                        getFhirResource())
+                                .setDataSourceId("1"));
+    }
+
+    @Test
     public void testMedicalResource_toString() {
         FhirResource fhirResource = getFhirResource();
         MedicalResource resource =
                 new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                                MEDICAL_RESOURCE_TYPE_VACCINES,
                                 DATA_SOURCE_ID,
                                 FHIR_VERSION_R4,
                                 fhirResource)
                         .build();
-        String expectedPropertiesString =
-                String.format(
-                        "type=%d,dataSourceId=%s,fhirVersion=%s,fhirResource=%s",
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        DATA_SOURCE_ID,
-                        FHIR_VERSION_R4,
-                        fhirResource);
+        String typeString = "type=1";
+        String dataSourceIdString = "dataSourceId=" + DATA_SOURCE_ID;
+        String fhirVersionString = "fhirVersion=" + FHIR_VERSION_R4;
+        String fhirResourceString = "fhirResource=" + fhirResource;
 
-        assertThat(resource.toString())
-                .isEqualTo(String.format("MedicalResource{%s}", expectedPropertiesString));
+        assertThat(resource.toString()).contains(typeString);
+        assertThat(resource.toString()).contains(dataSourceIdString);
+        assertThat(resource.toString()).contains(fhirVersionString);
+        assertThat(resource.toString()).contains(fhirResourceString);
     }
 
     @Test
@@ -152,7 +198,7 @@
         MedicalResource resource = getMedicalResource();
         MedicalResource resourceDifferentType =
                 new MedicalResource.Builder(resource)
-                        .setType(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE)
+                        .setType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build();
         MedicalResource resourceDifferentDataSourceId =
                 new MedicalResource.Builder(resource)
@@ -202,4 +248,19 @@
                 IllegalArgumentException.class,
                 () -> MedicalResource.CREATOR.createFromParcel(parcel));
     }
+
+    @Test
+    public void testRestoreInvalidDataSourceIdFromParcel_expectException()
+            throws NoSuchFieldException, IllegalAccessException {
+        MedicalResource original = getMedicalResource();
+        setFieldValueUsingReflection(original, "mDataSourceId", "1");
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> MedicalResource.CREATOR.createFromParcel(parcel));
+    }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/MedicalResourceTypeInfoTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceTypeInfoTest.java
similarity index 89%
rename from tests/cts/src/android/healthconnect/cts/MedicalResourceTypeInfoTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceTypeInfoTest.java
index 5045b60..0e6cd6a 100644
--- a/tests/cts/src/android/healthconnect/cts/MedicalResourceTypeInfoTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/MedicalResourceTypeInfoTest.java
@@ -13,11 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.healthconnect.cts;
+package android.healthconnect.cts.phr;
 
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalDataSourceRequiredFieldsOnly;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalDataSourceRequiredFieldsOnly;
 import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -50,9 +50,9 @@
     @Test
     public void testConstructor_EmptyContributingDataSources() {
         MedicalResourceTypeInfo info =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, Set.of());
+                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, Set.of());
 
-        assertThat(info.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+        assertThat(info.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
         assertThat(info.getContributingDataSources()).isEmpty();
     }
 
@@ -60,9 +60,9 @@
     public void testConstructor_withContributingDataSources() {
         Set<MedicalDataSource> dataSources = Set.of(getMedicalDataSourceRequiredFieldsOnly());
         MedicalResourceTypeInfo info =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, dataSources);
+                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, dataSources);
 
-        assertThat(info.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+        assertThat(info.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
         assertThat(info.getContributingDataSources()).isEqualTo(dataSources);
     }
 
@@ -76,9 +76,9 @@
     public void testEquals() {
         Set<MedicalDataSource> dataSources = Set.of(getMedicalDataSourceRequiredFieldsOnly());
         MedicalResourceTypeInfo info1 =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, dataSources);
+                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, dataSources);
         MedicalResourceTypeInfo info2 =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, dataSources);
+                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, dataSources);
 
         assertThat(info1.equals(info2)).isTrue();
         assertThat(info1.hashCode()).isEqualTo(info2.hashCode());
@@ -88,11 +88,12 @@
     public void testEquals_comparesAllValues() {
         Set<MedicalDataSource> dataSources = Set.of(getMedicalDataSourceRequiredFieldsOnly());
         MedicalResourceTypeInfo info =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, dataSources);
+                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, dataSources);
         MedicalResourceTypeInfo infoDifferentMedicalResourceType =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_UNKNOWN, dataSources);
+                new MedicalResourceTypeInfo(
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES, dataSources);
         MedicalResourceTypeInfo infoDifferentDataSources =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, Set.of());
+                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, Set.of());
 
         assertThat(infoDifferentMedicalResourceType.equals(info)).isFalse();
         assertThat(infoDifferentDataSources.equals(info)).isFalse();
@@ -104,7 +105,7 @@
     public void testWriteToParcelThenRestore_objectsAreIdentical() {
         Set<MedicalDataSource> dataSources = Set.of(getMedicalDataSourceRequiredFieldsOnly());
         MedicalResourceTypeInfo original =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, dataSources);
+                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, dataSources);
 
         Parcel parcel = Parcel.obtain();
         original.writeToParcel(parcel, 0);
@@ -120,7 +121,7 @@
             throws NoSuchFieldException, IllegalAccessException {
         Set<MedicalDataSource> dataSources = Set.of(getMedicalDataSourceRequiredFieldsOnly());
         MedicalResourceTypeInfo original =
-                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, dataSources);
+                new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VACCINES, dataSources);
         setFieldValueUsingReflection(original, "mMedicalResourceType", -1);
 
         Parcel parcel = Parcel.obtain();
diff --git a/tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesInitialRequestTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesInitialRequestTest.java
similarity index 84%
rename from tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesInitialRequestTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesInitialRequestTest.java
index 82ad682..1deaf17 100644
--- a/tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesInitialRequestTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesInitialRequestTest.java
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts;
+package android.healthconnect.cts.phr;
 
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
 import static android.healthconnect.cts.utils.DataFactory.DEFAULT_PAGE_SIZE;
 import static android.healthconnect.cts.utils.DataFactory.MAXIMUM_PAGE_SIZE;
 import static android.healthconnect.cts.utils.DataFactory.MINIMUM_PAGE_SIZE;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -51,10 +51,10 @@
     @Test
     public void testRequestBuilder_requiredFieldsOnly() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
-        assertThat(request.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+        assertThat(request.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
         assertThat(request.getDataSourceIds()).isEmpty();
         assertThat(request.getPageSize()).isEqualTo(DEFAULT_PAGE_SIZE);
     }
@@ -62,14 +62,15 @@
     @Test
     public void testRequestBuilder_setAllFields() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_UNKNOWN)
-                        .setMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .setMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .setPageSize(100)
                         .build();
 
-        assertThat(request.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+        assertThat(request.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
         assertThat(request.getDataSourceIds())
                 .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
         assertThat(request.getPageSize()).isEqualTo(100);
@@ -78,7 +79,7 @@
     @Test
     public void testRequestBuilder_clearDataSourceIds() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .clearDataSourceIds()
@@ -100,7 +101,7 @@
                 IllegalArgumentException.class,
                 () ->
                         new ReadMedicalResourcesInitialRequest.Builder(
-                                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                                        MEDICAL_RESOURCE_TYPE_VACCINES)
                                 .addDataSourceId("foo"));
     }
 
@@ -110,7 +111,7 @@
                 IllegalArgumentException.class,
                 () ->
                         new ReadMedicalResourcesInitialRequest.Builder(
-                                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                                        MEDICAL_RESOURCE_TYPE_VACCINES)
                                 .setPageSize(MAXIMUM_PAGE_SIZE + 1));
     }
 
@@ -120,14 +121,14 @@
                 IllegalArgumentException.class,
                 () ->
                         new ReadMedicalResourcesInitialRequest.Builder(
-                                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                                        MEDICAL_RESOURCE_TYPE_VACCINES)
                                 .setPageSize(MINIMUM_PAGE_SIZE - 1));
     }
 
     @Test
     public void testRequestBuilder_fromExistingBuilder() {
         ReadMedicalResourcesInitialRequest.Builder original =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .setPageSize(100);
         ReadMedicalResourcesInitialRequest request =
@@ -139,7 +140,7 @@
     @Test
     public void testRequestBuilder_fromExistingInstance() {
         ReadMedicalResourcesInitialRequest original =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .setPageSize(100)
                         .build();
@@ -152,31 +153,28 @@
     @Test
     public void testToString() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .setPageSize(100)
                         .build();
-        String expectedPropertiesString =
-                String.format(
-                        "medicalResourceType=%d,dataSourceIds={%s},pageSize=%d",
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION, DATA_SOURCE_ID, 100);
+        String medicalResourceTypeString = "medicalResourceType=1";
+        String dataSourceIdsString = "dataSourceIds={" + DATA_SOURCE_ID + "}";
+        String pageSizeString = "pageSize=100";
 
-        assertThat(request.toString())
-                .isEqualTo(
-                        String.format(
-                                "ReadMedicalResourcesInitialRequest{%s}",
-                                expectedPropertiesString));
+        assertThat(request.toString()).contains(medicalResourceTypeString);
+        assertThat(request.toString()).contains(dataSourceIdsString);
+        assertThat(request.toString()).contains(pageSizeString);
     }
 
     @Test
     public void testEquals_sameRequests() {
         ReadMedicalResourcesInitialRequest request1 =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .setPageSize(100)
                         .build();
         ReadMedicalResourcesInitialRequest request2 =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .setPageSize(100)
                         .build();
@@ -188,12 +186,12 @@
     @Test
     public void testEquals_comparesAllValues() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .build();
         ReadMedicalResourcesInitialRequest requestDifferentType =
                 new ReadMedicalResourcesInitialRequest.Builder(request)
-                        .setMedicalResourceType(MEDICAL_RESOURCE_TYPE_UNKNOWN)
+                        .setMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build();
         ReadMedicalResourcesInitialRequest requestDifferentDataSource =
                 new ReadMedicalResourcesInitialRequest.Builder(request)
diff --git a/tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesPageRequestTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesPageRequestTest.java
similarity index 92%
rename from tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesPageRequestTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesPageRequestTest.java
index ec3714e..2a9b5cf 100644
--- a/tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesPageRequestTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesPageRequestTest.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts;
+package android.healthconnect.cts.phr;
 
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.PAGE_TOKEN;
 import static android.healthconnect.cts.utils.DataFactory.DEFAULT_PAGE_SIZE;
 import static android.healthconnect.cts.utils.DataFactory.MAXIMUM_PAGE_SIZE;
 import static android.healthconnect.cts.utils.DataFactory.MINIMUM_PAGE_SIZE;
-import static android.healthconnect.cts.utils.PhrDataFactory.PAGE_TOKEN;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -108,13 +108,11 @@
     public void testToString() {
         ReadMedicalResourcesPageRequest request =
                 new ReadMedicalResourcesPageRequest.Builder(PAGE_TOKEN).setPageSize(100).build();
-        String expectedPropertiesString =
-                String.format("pageToken=%s,pageSize=%d", PAGE_TOKEN, 100);
+        String pageTokenString = "pageToken=" + PAGE_TOKEN;
+        String pageSizeString = "pageSize=100";
 
-        assertThat(request.toString())
-                .isEqualTo(
-                        String.format(
-                                "ReadMedicalResourcesPageRequest{%s}", expectedPropertiesString));
+        assertThat(request.toString()).contains(pageTokenString);
+        assertThat(request.toString()).contains(pageSizeString);
     }
 
     @Test
diff --git a/tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesResponseTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesResponseTest.java
similarity index 66%
rename from tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesResponseTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesResponseTest.java
index 2a823e3..c704ffb 100644
--- a/tests/cts/src/android/healthconnect/cts/ReadMedicalResourcesResponseTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/ReadMedicalResourcesResponseTest.java
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts;
+package android.healthconnect.cts.phr;
 
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.PAGE_TOKEN;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResourceAllergy;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResourceBuilder;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.PAGE_TOKEN;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getFhirResourceAllergy;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResourceBuilder;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -50,20 +50,23 @@
 
     @Test
     public void testReadMedicalResourcesResponse_constructor_emptyList() {
-        ReadMedicalResourcesResponse response = new ReadMedicalResourcesResponse(List.of(), null);
+        ReadMedicalResourcesResponse response =
+                new ReadMedicalResourcesResponse(List.of(), null, 0);
 
         assertThat(response.getMedicalResources()).isEqualTo(List.of());
         assertThat(response.getNextPageToken()).isNull();
+        assertThat(response.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
     public void testReadMedicalResourcesResponse_constructor_singleton() {
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
         ReadMedicalResourcesResponse response =
-                new ReadMedicalResourcesResponse(medicalResources, null);
+                new ReadMedicalResourcesResponse(medicalResources, null, 0);
 
         assertThat(response.getMedicalResources()).isEqualTo(medicalResources);
         assertThat(response.getNextPageToken()).isNull();
+        assertThat(response.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
@@ -72,60 +75,92 @@
                 List.of(
                         getMedicalResource(),
                         getMedicalResourceBuilder()
-                                .setType(MEDICAL_RESOURCE_TYPE_UNKNOWN)
+                                .setType(MEDICAL_RESOURCE_TYPE_VACCINES)
                                 .setDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                                 .setFhirResource(getFhirResourceAllergy())
                                 .build());
         ReadMedicalResourcesResponse response =
-                new ReadMedicalResourcesResponse(medicalResources, null);
+                new ReadMedicalResourcesResponse(medicalResources, null, 0);
 
         assertThat(response.getMedicalResources()).isEqualTo(medicalResources);
         assertThat(response.getNextPageToken()).isNull();
+        assertThat(response.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
     public void testReadMedicalResourcesResponse_constructor_withPageToken() {
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
         ReadMedicalResourcesResponse response =
-                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN);
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN, 11);
 
         assertThat(response.getMedicalResources()).isEqualTo(medicalResources);
         assertThat(response.getNextPageToken()).isEqualTo(PAGE_TOKEN);
+        assertThat(response.getRemainingCount()).isEqualTo(11);
     }
 
     @Test
     public void testReadMedicalResourcesResponse_equals() {
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
         ReadMedicalResourcesResponse response1 =
-                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN);
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN, 10);
         ReadMedicalResourcesResponse response2 =
-                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN);
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN, 10);
 
         assertThat(response1.equals(response2)).isTrue();
         assertThat(response1.hashCode()).isEqualTo(response2.hashCode());
     }
 
     @Test
-    public void testReadMedicalResourcesResponse_equals_comparesAllValues() {
+    public void testReadMedicalResourcesResponseEquals_comparesTotalSize() {
+        List<MedicalResource> medicalResources = List.of(getMedicalResource());
+        ReadMedicalResourcesResponse response1 =
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN, 10);
+        ReadMedicalResourcesResponse response2 =
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN, 11);
+
+        assertThat(response1).isNotEqualTo(response2);
+    }
+
+    @Test
+    public void testReadMedicalResourcesResponseEquals_comparesPageToken() {
+        List<MedicalResource> medicalResources = List.of(getMedicalResource());
+        ReadMedicalResourcesResponse response1 =
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN, 10);
+        ReadMedicalResourcesResponse response2 =
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN + "1", 10);
+
+        assertThat(response1).isNotEqualTo(response2);
+    }
+
+    @Test
+    public void testReadMedicalResourcesResponseEquals_comparesResources() {
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
         ReadMedicalResourcesResponse response =
-                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN);
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN, 11);
         ReadMedicalResourcesResponse responseDifferentList =
                 new ReadMedicalResourcesResponse(
                         List.of(
                                 getMedicalResourceBuilder()
-                                        .setType(MEDICAL_RESOURCE_TYPE_UNKNOWN)
+                                        .setType(MEDICAL_RESOURCE_TYPE_VACCINES)
                                         .setDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                                         .setFhirResource(getFhirResourceAllergy())
                                         .build()),
-                        PAGE_TOKEN);
-        ReadMedicalResourcesResponse responseDifferentPageToken =
-                new ReadMedicalResourcesResponse(medicalResources, null);
+                        PAGE_TOKEN,
+                        11);
 
         assertThat(responseDifferentList.equals(response)).isFalse();
-        assertThat(responseDifferentPageToken.equals(response)).isFalse();
-        assertThat(responseDifferentList.hashCode()).isNotEqualTo(response.hashCode());
-        assertThat(responseDifferentPageToken.hashCode()).isNotEqualTo(response.hashCode());
+    }
+
+    @Test
+    public void testToString() {
+        MedicalResource medicalResource = getMedicalResource();
+        ReadMedicalResourcesResponse response =
+                new ReadMedicalResourcesResponse(List.of(medicalResource), PAGE_TOKEN, 1);
+        String medicalResourceTypeString = "medicalResources=[" + medicalResource + "]";
+        String nextPageTokenString = "nextPageToken=" + PAGE_TOKEN;
+
+        assertThat(response.toString()).contains(medicalResourceTypeString);
+        assertThat(response.toString()).contains(nextPageTokenString);
     }
 
     @Test
@@ -134,12 +169,12 @@
                 List.of(
                         getMedicalResource(),
                         getMedicalResourceBuilder()
-                                .setType(MEDICAL_RESOURCE_TYPE_UNKNOWN)
+                                .setType(MEDICAL_RESOURCE_TYPE_VACCINES)
                                 .setDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                                 .setFhirResource(getFhirResourceAllergy())
                                 .build());
         ReadMedicalResourcesResponse original =
-                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN);
+                new ReadMedicalResourcesResponse(medicalResources, PAGE_TOKEN, 11);
 
         Parcel parcel = Parcel.obtain();
         original.writeToParcel(parcel, 0);
diff --git a/tests/cts/src/android/healthconnect/cts/UpsertMedicalResourceRequestTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/UpsertMedicalResourceRequestTest.java
similarity index 64%
rename from tests/cts/src/android/healthconnect/cts/UpsertMedicalResourceRequestTest.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/UpsertMedicalResourceRequestTest.java
index 763ad89..1492282 100644
--- a/tests/cts/src/android/healthconnect/cts/UpsertMedicalResourceRequestTest.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/UpsertMedicalResourceRequestTest.java
@@ -13,14 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.healthconnect.cts;
+package android.healthconnect.cts.phr;
 
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4B;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4B;
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -55,6 +56,31 @@
     }
 
     @Test
+    public void testUpsertMedicalResourceRequest_setAllFields() {
+        UpsertMedicalResourceRequest upsertMedicalResourceRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_ALLERGY)
+                        .setDataSourceId(DIFFERENT_DATA_SOURCE_ID)
+                        .setFhirVersion(FHIR_VERSION_R4B)
+                        .setData(FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        assertThat(upsertMedicalResourceRequest.getDataSourceId())
+                .isEqualTo(DIFFERENT_DATA_SOURCE_ID);
+        assertThat(upsertMedicalResourceRequest.getFhirVersion()).isEqualTo(FHIR_VERSION_R4B);
+        assertThat(upsertMedicalResourceRequest.getData()).isEqualTo(FHIR_DATA_IMMUNIZATION);
+    }
+
+    @Test
+    public void testUpsertMedicalResourceRequest_constructWithInvalidDataSourceId_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        new UpsertMedicalResourceRequest.Builder(
+                                "1", FHIR_VERSION_R4, FHIR_DATA_ALLERGY));
+    }
+
+    @Test
     public void testUpsertMedicalResourceRequest_fromExistingBuilder() {
         UpsertMedicalResourceRequest.Builder builder =
                 new UpsertMedicalResourceRequest.Builder(
@@ -143,4 +169,38 @@
                 NullPointerException.class,
                 () -> new UpsertMedicalResourceRequest.Builder(null, null, null));
     }
+
+    @Test
+    public void testToString() {
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_ALLERGY)
+                        .build();
+        String dataSourceIdString = "dataSourceId=" + DATA_SOURCE_ID;
+        String fhirVersionString = "fhirVersion=" + FHIR_VERSION_R4;
+        String dataString = "data=" + FHIR_DATA_ALLERGY;
+
+        assertThat(request.toString()).contains(dataSourceIdString);
+        assertThat(request.toString()).contains(fhirVersionString);
+        assertThat(request.toString()).contains(dataString);
+    }
+
+    @Test
+    public void testRestoreInvalidDataSourceIdFromParcel_expectException()
+            throws NoSuchFieldException, IllegalAccessException {
+
+        UpsertMedicalResourceRequest original =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_ALLERGY)
+                        .build();
+        setFieldValueUsingReflection(original, "mDataSourceId", "1");
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> UpsertMedicalResourceRequest.CREATOR.createFromParcel(parcel));
+    }
 }
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/CreateMedicalDataSourceCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/CreateMedicalDataSourceCtsTest.java
new file mode 100644
index 0000000..5fb0b09
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/CreateMedicalDataSourceCtsTest.java
@@ -0,0 +1,397 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_WRITE_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4B;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_UNSUPPORTED;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.MAX_ALLOWED_MEDICAL_DATA_SOURCES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.GetMedicalDataSourcesRequest;
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.net.Uri;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@RunWith(AndroidJUnit4.class)
+public class CreateMedicalDataSourceCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    private static final String APP_PACKAGE_NAME = "android.healthconnect.cts.phr";
+
+    @Before
+    public void setUp() throws Exception {
+        revokeAllPermissions(PHR_BACKGROUND_APP.getPackageName(), "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP.getPackageName(), "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(mManager);
+        mUtil.deleteAllMedicalData();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_migrationInProgress_apiBlocked()
+            throws InterruptedException {
+        startMigrationWithShellPermissionIdentity();
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
+
+        mManager.createMedicalDataSource(getCreateMedicalDataSourceRequest(), executor, receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_hasDataManagementPermission_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.createMedicalDataSource(
+                            getCreateMedicalDataSourceRequest(),
+                            Executors.newSingleThreadExecutor(),
+                            receiver);
+                    assertThat(receiver.assertAndGetException().getErrorCode())
+                            .isEqualTo(HealthConnectException.ERROR_SECURITY);
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_writeLimitExceeded_throws() throws Exception {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("test-id"));
+        // Make the maximum number of delete medical resources calls just to use up the WRITE quota,
+        // because data sources one app can create has a lower limit than this rate limit. Minus 1
+        // because of the above call.
+        int maximumCalls = MAX_FOREGROUND_WRITE_CALL_15M / mUtil.mLimitsAdjustmentForTesting - 1;
+        float remainingQuota = mUtil.tryAcquireCallQuotaNTimesForWrite(dataSource, maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<MedicalDataSource> callback = new HealthConnectReceiver<>();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.createMedicalDataSource(
+                    getCreateMedicalDataSourceRequest(String.valueOf(i)),
+                    Executors.newSingleThreadExecutor(),
+                    callback);
+        }
+
+        HealthConnectException exception = callback.assertAndGetException();
+        assertThat(callback.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_invalidEmptyDisplayName_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        CreateMedicalDataSourceRequest request = getCreateMedicalDataSourceRequest();
+
+        setFieldValueUsingReflection(request, "mDisplayName", "");
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.createMedicalDataSource(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_displayNameExceedsLimit_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        CreateMedicalDataSourceRequest request = getCreateMedicalDataSourceRequest();
+
+        setFieldValueUsingReflection(
+                request, "mDisplayName", DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.createMedicalDataSource(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_invalidEmptyFhirBaseUri_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        CreateMedicalDataSourceRequest request = getCreateMedicalDataSourceRequest();
+
+        setFieldValueUsingReflection(request, "mFhirBaseUri", Uri.EMPTY);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.createMedicalDataSource(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_fhirBaseUriExceedsLimit_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        CreateMedicalDataSourceRequest request = getCreateMedicalDataSourceRequest();
+
+        setFieldValueUsingReflection(
+                request, "mFhirBaseUri", DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.createMedicalDataSource(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_invalidFhirVersion_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        CreateMedicalDataSourceRequest request = getCreateMedicalDataSourceRequest();
+
+        setFieldValueUsingReflection(request, "mFhirVersion", FHIR_VERSION_UNSUPPORTED);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.createMedicalDataSource(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_succeeds() throws InterruptedException {
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
+        CreateMedicalDataSourceRequest request = getCreateMedicalDataSourceRequest();
+
+        mManager.createMedicalDataSource(request, executor, receiver);
+
+        MedicalDataSource responseDataSource = receiver.getResponse();
+        assertThat(responseDataSource).isInstanceOf(MedicalDataSource.class);
+        assertThat(responseDataSource.getId()).isNotEmpty();
+        assertThat(responseDataSource.getFhirBaseUri()).isEqualTo(request.getFhirBaseUri());
+        assertThat(responseDataSource.getDisplayName()).isEqualTo(request.getDisplayName());
+        assertThat(responseDataSource.getFhirVersion()).isEqualTo(request.getFhirVersion());
+        assertThat(responseDataSource.getPackageName()).isEqualTo(APP_PACKAGE_NAME);
+        // Assert that it exists in the db
+        HealthConnectReceiver<List<MedicalDataSource>> readReceiver = new HealthConnectReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            List.of(responseDataSource.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).hasSize(1);
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_maxNumberOfSources_succeeds()
+            throws InterruptedException {
+        for (int i = 0; i < MAX_ALLOWED_MEDICAL_DATA_SOURCES - 1; i++) {
+            String suffix = String.valueOf(i);
+            mUtil.createDataSource(getCreateMedicalDataSourceRequest(suffix));
+        }
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
+        mManager.createMedicalDataSource(getCreateMedicalDataSourceRequest(), executor, receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_moreThanAllowedMax_throws()
+            throws InterruptedException {
+        for (int i = 0; i < MAX_ALLOWED_MEDICAL_DATA_SOURCES; i++) {
+            String suffix = String.valueOf(i);
+            mUtil.createDataSource(getCreateMedicalDataSourceRequest(suffix));
+        }
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
+        mManager.createMedicalDataSource(getCreateMedicalDataSourceRequest(), executor, receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_duplicateDisplayName_throws()
+            throws InterruptedException {
+        mUtil.createDataSource(getCreateMedicalDataSourceRequest("ds1"));
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
+        mManager.createMedicalDataSource(
+                getCreateMedicalDataSourceRequest("ds1"), executor, receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_duplicateDisplayNameFromSeparatePackages_succeeds()
+            throws Exception {
+        CreateMedicalDataSourceRequest request1 =
+                new CreateMedicalDataSourceRequest.Builder(
+                                DATA_SOURCE_FHIR_BASE_URI,
+                                DATA_SOURCE_DISPLAY_NAME,
+                                FHIR_VERSION_R4)
+                        .build();
+        CreateMedicalDataSourceRequest request2 =
+                new CreateMedicalDataSourceRequest.Builder(
+                                DIFFERENT_DATA_SOURCE_BASE_URI,
+                                DATA_SOURCE_DISPLAY_NAME,
+                                FHIR_VERSION_R4B)
+                        .build();
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        PHR_BACKGROUND_APP.createMedicalDataSource(request1);
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
+        mManager.createMedicalDataSource(request2, executor, receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+        // Assert both data sources exist
+        HealthConnectReceiver<List<MedicalDataSource>> readReceiver = new HealthConnectReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            new GetMedicalDataSourcesRequest.Builder().build(),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).hasSize(2);
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_inForegroundNoWritePerms_throws() {
+        // No write permission has been granted.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_FOREGROUND_APP.createMedicalDataSource(
+                                        getCreateMedicalDataSourceRequest()));
+
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testCreateMedicalDataSource_inBackgroundNoWritePerms_throws() {
+        // No write permission has been granted.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_BACKGROUND_APP.createMedicalDataSource(
+                                        getCreateMedicalDataSourceRequest()));
+
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalDataSourceWithDataCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalDataSourceWithDataCtsTest.java
new file mode 100644
index 0000000..9daed66
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalDataSourceWithDataCtsTest.java
@@ -0,0 +1,426 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_WRITE_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.MEDICAL_DATA_SOURCE_EQUIVALENCE;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.GetMedicalDataSourcesRequest;
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.ReadMedicalResourcesInitialRequest;
+import android.health.connect.ReadMedicalResourcesResponse;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+import java.util.concurrent.Executors;
+
+@RunWith(AndroidJUnit4.class)
+public class DeleteMedicalDataSourceWithDataCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    @Before
+    public void setUp() throws Exception {
+        revokeAllPermissions(PHR_BACKGROUND_APP.getPackageName(), "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP.getPackageName(), "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(mManager);
+        mUtil.deleteAllMedicalData();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_migrationInProgress_apiBlocked()
+            throws InterruptedException {
+        startMigrationWithShellPermissionIdentity();
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalDataSourceWithData(
+                DATA_SOURCE_ID, Executors.newSingleThreadExecutor(), callback);
+
+        assertThat(callback.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_writeLimitExceeded_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        // Make the maximum number of delete medical resources calls just to use up the WRITE quota,
+        // because we cannot delete the created data source multiple times. Minus 1 because of the
+        // above call.
+        int maximumCalls = MAX_FOREGROUND_WRITE_CALL_15M / mUtil.mLimitsAdjustmentForTesting - 1;
+        float remainingQuota = mUtil.tryAcquireCallQuotaNTimesForWrite(dataSource, maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.deleteMedicalDataSourceWithData(
+                    DATA_SOURCE_ID, Executors.newSingleThreadExecutor(), callback);
+        }
+
+        HealthConnectException exception = callback.assertAndGetException();
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_existsWithoutData_succeedsAndDeletes()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalDataSourceWithData(
+                dataSource.getId(), Executors.newSingleThreadExecutor(), callback);
+
+        callback.verifyNoExceptionOrThrow();
+        // Verifies that data source is deleted.
+        HealthConnectReceiver<List<MedicalDataSource>> readReceiver = new HealthConnectReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            new GetMedicalDataSourcesRequest.Builder().build(),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).isEmpty();
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_existsWithData_succeedsAndDeletes() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalDataSourceWithData(
+                dataSource.getId(), Executors.newSingleThreadExecutor(), callback);
+
+        callback.verifyNoExceptionOrThrow();
+        HealthConnectReceiver<List<MedicalDataSource>> dataSourceReadReceiver =
+                new HealthConnectReceiver<>();
+        HealthConnectReceiver<ReadMedicalResourcesResponse> resourceReadReceiver =
+                new HealthConnectReceiver<>();
+        // Verifies that both data source and resource are deleted.
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            new GetMedicalDataSourcesRequest.Builder().build(),
+                            Executors.newSingleThreadExecutor(),
+                            dataSourceReadReceiver);
+                    assertThat(dataSourceReadReceiver.getResponse()).isEmpty();
+                    mManager.readMedicalResources(
+                            new ReadMedicalResourcesInitialRequest.Builder(
+                                            MEDICAL_RESOURCE_TYPE_VACCINES)
+                                    .build(),
+                            Executors.newSingleThreadExecutor(),
+                            resourceReadReceiver);
+                    assertThat(resourceReadReceiver.getResponse().getMedicalResources()).isEmpty();
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_doesntExist_throws() throws Exception {
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalDataSourceWithData(
+                DATA_SOURCE_ID, Executors.newSingleThreadExecutor(), callback);
+
+        assertThat(callback.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_withManagePerm_existsWithoutData_succeedsAndDeletes()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalDataSourceWithData(
+                            dataSource.getId(), Executors.newSingleThreadExecutor(), callback);
+                    callback.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        // Verifies that data source is deleted.
+        HealthConnectReceiver<List<MedicalDataSource>> readReceiver = new HealthConnectReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            new GetMedicalDataSourcesRequest.Builder().build(),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).isEmpty();
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_withManagePerm_existsWithData_succeedsAndDeletes()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalDataSourceWithData(
+                            dataSource.getId(), Executors.newSingleThreadExecutor(), callback);
+                    callback.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        HealthConnectReceiver<List<MedicalDataSource>> dataSourceReadReceiver =
+                new HealthConnectReceiver<>();
+        HealthConnectReceiver<ReadMedicalResourcesResponse> resourceReadReceiver =
+                new HealthConnectReceiver<>();
+        // Verifies that both data source and resource are deleted.
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            new GetMedicalDataSourcesRequest.Builder().build(),
+                            Executors.newSingleThreadExecutor(),
+                            dataSourceReadReceiver);
+                    assertThat(dataSourceReadReceiver.getResponse()).isEmpty();
+                    mManager.readMedicalResources(
+                            new ReadMedicalResourcesInitialRequest.Builder(
+                                            MEDICAL_RESOURCE_TYPE_VACCINES)
+                                    .build(),
+                            Executors.newSingleThreadExecutor(),
+                            resourceReadReceiver);
+                    assertThat(resourceReadReceiver.getResponse().getMedicalResources()).isEmpty();
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_withManagePerm_doesntExist_throws() throws Exception {
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalDataSourceWithData(
+                            DATA_SOURCE_ID, Executors.newSingleThreadExecutor(), callback);
+                    assertThat(callback.assertAndGetException().getErrorCode())
+                            .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_emptyId_throws() throws Exception {
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalDataSourceWithData(
+                " ", Executors.newSingleThreadExecutor(), callback);
+
+        assertThat(callback.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_invalidId_throws() throws Exception {
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalDataSourceWithData(
+                "illegal id", Executors.newSingleThreadExecutor(), callback);
+
+        assertThat(callback.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_differentPackage_throws() throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalDataSourceWithData(
+                dataSource.getId(), Executors.newSingleThreadExecutor(), callback);
+
+        assertThat(callback.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+        HealthConnectReceiver<List<MedicalDataSource>> dataSourceReadReceiver =
+                new HealthConnectReceiver<>();
+        HealthConnectReceiver<List<MedicalResource>> resourceReadReceiver =
+                new HealthConnectReceiver<>();
+        // Verifies that both data source and resource are NOT deleted.
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            List.of(dataSource.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            dataSourceReadReceiver);
+                    assertThat(dataSourceReadReceiver.getResponse())
+                            .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                            .containsExactly(dataSource);
+                    mManager.readMedicalResources(
+                            List.of(resource.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            resourceReadReceiver);
+                    assertThat(resourceReadReceiver.getResponse()).containsExactly(resource);
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_inForegroundNoPermission_throws() {
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.deleteMedicalDataSourceWithData(DATA_SOURCE_ID));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_inForegroundOnlyReadPerm_throws() {
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), READ_MEDICAL_DATA_VACCINES);
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.deleteMedicalDataSourceWithData(DATA_SOURCE_ID));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_inBackgroundNoPermission_throws() {
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.deleteMedicalDataSourceWithData(DATA_SOURCE_ID));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalDataSource_withManagePerm_differentPackage_succeedsAndDeletes()
+            throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalDataSourceWithData(
+                            dataSource.getId(), Executors.newSingleThreadExecutor(), callback);
+                    callback.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        HealthConnectReceiver<List<MedicalDataSource>> dataSourceReadReceiver =
+                new HealthConnectReceiver<>();
+        HealthConnectReceiver<List<MedicalResource>> resourceReadReceiver =
+                new HealthConnectReceiver<>();
+        // Verifies that both data source and resource are deleted.
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            List.of(dataSource.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            dataSourceReadReceiver);
+                    assertThat(dataSourceReadReceiver.getResponse()).isEmpty();
+                    mManager.readMedicalResources(
+                            List.of(resource.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            resourceReadReceiver);
+                    assertThat(resourceReadReceiver.getResponse()).isEmpty();
+                });
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalResourcesByIdsCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalResourcesByIdsCtsTest.java
new file mode 100644
index 0000000..1665793
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalResourcesByIdsCtsTest.java
@@ -0,0 +1,502 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_WRITE_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResourceId;
+import static android.healthconnect.cts.utils.DataFactory.MAXIMUM_PAGE_SIZE;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.MedicalResourceId;
+import android.health.connect.ReadMedicalResourcesInitialRequest;
+import android.health.connect.ReadMedicalResourcesResponse;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@RunWith(AndroidJUnit4.class)
+public class DeleteMedicalResourcesByIdsCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    @Before
+    public void setUp() throws Exception {
+        revokeAllPermissions(PHR_BACKGROUND_APP.getPackageName(), "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP.getPackageName(), "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(mManager);
+        mUtil.deleteAllMedicalData();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_migrationInProgress_apiBlocked()
+            throws InterruptedException {
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+
+        startMigrationWithShellPermissionIdentity();
+        mManager.deleteMedicalResources(List.of(getMedicalResourceId()), executor, receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_writeLimitExceeded_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        // Make the maximum number of calls allowed by quota
+        int maximumCalls = MAX_FOREGROUND_WRITE_CALL_15M / mUtil.mLimitsAdjustmentForTesting - 1;
+        float remainingQuota = mUtil.tryAcquireCallQuotaNTimesForWrite(dataSource, maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.deleteMedicalResources(
+                    List.of(getMedicalResourceId()), Executors.newSingleThreadExecutor(), callback);
+        }
+
+        HealthConnectException exception = callback.assertAndGetException();
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_invalidResourceTypeInIdByReflection_throws()
+            throws NoSuchFieldException, IllegalAccessException, InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        MedicalResourceId id =
+                new MedicalResourceId(
+                        DATA_SOURCE_ID,
+                        FHIR_RESOURCE_TYPE_IMMUNIZATION,
+                        FHIR_RESOURCE_ID_IMMUNIZATION);
+
+        setFieldValueUsingReflection(id, "mFhirResourceType", 100);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.deleteMedicalResources(
+                                List.of(id),
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+        // Test resource is still present.
+        mManager.readMedicalResources(
+                List.of(resource.getId()), Executors.newSingleThreadExecutor(), readReceiver);
+        assertThat(readReceiver.getResponse()).containsExactly(resource);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByIds_invalidDataSourceIdInIdByReflection_throwsNoDelete()
+            throws NoSuchFieldException, IllegalAccessException, InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        MedicalResourceId id =
+                new MedicalResourceId(
+                        DATA_SOURCE_ID,
+                        FHIR_RESOURCE_TYPE_IMMUNIZATION,
+                        FHIR_RESOURCE_ID_IMMUNIZATION);
+
+        setFieldValueUsingReflection(id, "mDataSourceId", "invalid id");
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.deleteMedicalResources(
+                                List.of(id),
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+        // Test resource is still present.
+        mManager.readMedicalResources(
+                List.of(resource.getId()), Executors.newSingleThreadExecutor(), readReceiver);
+        assertThat(readReceiver.getResponse()).containsExactly(resource);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_idsNonExistent_succeeds()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        List<MedicalResourceId> ids = new ArrayList<>(MAXIMUM_PAGE_SIZE + 1);
+        for (int i = 0; i < MAXIMUM_PAGE_SIZE + 1; i++) {
+            ids.add(
+                    new MedicalResourceId(
+                            dataSource.getId(),
+                            FHIR_RESOURCE_TYPE_IMMUNIZATION,
+                            FHIR_RESOURCE_ID_IMMUNIZATION + "." + i));
+        }
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalResources(ids, Executors.newSingleThreadExecutor(), receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_anIdMissing_succeeds() throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+        MedicalResourceId id =
+                new MedicalResourceId(
+                        dataSource.getId(),
+                        FHIR_RESOURCE_TYPE_IMMUNIZATION,
+                        FHIR_RESOURCE_ID_IMMUNIZATION);
+
+        mManager.deleteMedicalResources(List.of(id), Executors.newSingleThreadExecutor(), receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testDeleteMedicalResourcesByIds_emptyIds_succeedsAndNoDelete()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalResources(List.of(), Executors.newSingleThreadExecutor(), receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+        // Assert that resource still exists.
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(resource.getId()), Executors.newSingleThreadExecutor(), readReceiver);
+        assertThat(readReceiver.getResponse()).hasSize(1);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_Create3Delete2_succeeds()
+            throws InterruptedException {
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("ds1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("ds2"));
+        // Insert some data
+        MedicalResource resource1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource resource2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource resource3 =
+                mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        mManager.deleteMedicalResources(
+                List.of(resource1.getId(), resource2.getId()),
+                Executors.newSingleThreadExecutor(),
+                callback);
+
+        callback.verifyNoExceptionOrThrow();
+        // Test resource3 is still present
+        HealthConnectReceiver<ReadMedicalResourcesResponse> readReceiver =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                Executors.newSingleThreadExecutor(),
+                readReceiver);
+        assertThat(readReceiver.getResponse().getMedicalResources()).containsExactly(resource3);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_managementPermissionAMissingId_succeeds()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+        MedicalResourceId id =
+                new MedicalResourceId(
+                        dataSource.getId(),
+                        FHIR_RESOURCE_TYPE_IMMUNIZATION,
+                        FHIR_RESOURCE_ID_IMMUNIZATION);
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalResources(
+                            List.of(id), Executors.newSingleThreadExecutor(), receiver);
+                    receiver.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_managementPermissionNoData_succeeds()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        List<MedicalResourceId> ids = new ArrayList<>(MAXIMUM_PAGE_SIZE + 1);
+        for (int i = 0; i < MAXIMUM_PAGE_SIZE + 1; i++) {
+            ids.add(
+                    new MedicalResourceId(
+                            dataSource.getId(),
+                            FHIR_RESOURCE_TYPE_IMMUNIZATION,
+                            FHIR_RESOURCE_ID_IMMUNIZATION + "." + i));
+        }
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalResources(
+                            ids, Executors.newSingleThreadExecutor(), receiver);
+                    receiver.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testDeleteMedicalResourcesByIds_managementPermissionEmptyIds_succeeds()
+            throws InterruptedException {
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalResources(
+                            List.of(), Executors.newSingleThreadExecutor(), receiver);
+                    receiver.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        // Assert that resource still exists.
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(resource.getId()), Executors.newSingleThreadExecutor(), readReceiver);
+        assertThat(readReceiver.getResponse()).hasSize(1);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_managementPermissionCreate2Delete1_succeeds()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        // Insert some data
+        MedicalResource resource1 =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource resource2 =
+                mUtil.upsertMedicalData(dataSource.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalResources(
+                            List.of(resource1.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            callback);
+                    callback.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        // Test resource2 is still present
+        HealthConnectReceiver<ReadMedicalResourcesResponse> readReceiver =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                Executors.newSingleThreadExecutor(),
+                readReceiver);
+        assertThat(readReceiver.getResponse().getMedicalResources()).containsExactly(resource2);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_managementPerm_canDeleteDataOwnedByAllApps()
+            throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalResources(
+                            List.of(foregroundAppVaccine.getId(), backgroundAppVaccine.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            callback);
+                    callback.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        // Test that the resources are not present anymore
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.readMedicalResources(
+                            List.of(backgroundAppVaccine.getId(), foregroundAppVaccine.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).isEmpty();
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_inForegroundOnlyReadPermissions_expectError() {
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), READ_MEDICAL_DATA_VACCINES);
+        MedicalResourceId id =
+                new MedicalResourceId(DATA_SOURCE_ID, FHIR_RESOURCE_TYPE_IMMUNIZATION, "1");
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.deleteMedicalResources(List.of(id)));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_inForegroundNoPermission_expectError() {
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_FOREGROUND_APP.deleteMedicalResources(
+                                        List.of(getMedicalResourceId())));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_inBackgroundNoPermission_expectError() {
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_BACKGROUND_APP.deleteMedicalResources(
+                                        List.of(getMedicalResourceId())));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_resourceOwnedByDiffApp_noDelete() throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        PHR_FOREGROUND_APP.deleteMedicalResources(List.of(backgroundAppVaccine.getId()));
+
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        // Test that the vaccine is still present
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.readMedicalResources(
+                            List.of(backgroundAppVaccine.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).containsExactly(backgroundAppVaccine);
+                });
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalResourcesByRequestCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalResourcesByRequestCtsTest.java
new file mode 100644
index 0000000..6612d2d
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/DeleteMedicalResourcesByRequestCtsTest.java
@@ -0,0 +1,677 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_WRITE_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.app.UiAutomation;
+import android.health.connect.DeleteMedicalResourcesRequest;
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@RunWith(AndroidJUnit4.class)
+public class DeleteMedicalResourcesByRequestCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    @Before
+    public void setUp() throws Exception {
+        revokeAllPermissions(PHR_BACKGROUND_APP.getPackageName(), "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP.getPackageName(), "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(mManager);
+        mUtil.deleteAllMedicalData();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_migrationInProgress_apiBlocked()
+            throws InterruptedException {
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+
+        startMigrationWithShellPermissionIdentity();
+        mManager.deleteMedicalResources(request, executor, receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_writeLimitExceeded_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        DeleteMedicalResourcesRequest deleteRequest =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+        // Make the maximum number of calls allowed by quota
+        int maximumCalls = MAX_FOREGROUND_WRITE_CALL_15M / mUtil.mLimitsAdjustmentForTesting - 1;
+        float remainingQuota = mUtil.tryAcquireCallQuotaNTimesForWrite(dataSource, maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.deleteMedicalResources(
+                    deleteRequest, Executors.newSingleThreadExecutor(), callback);
+        }
+
+        HealthConnectException exception = callback.assertAndGetException();
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_badDataSourceIdUsingReflection_doesntDeleteAll()
+            throws InterruptedException, NoSuchFieldException, IllegalAccessException {
+        // Create the datasource
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        // Insert some data
+        MedicalResource resource1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest deleteRequest =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+        // Change the delete request to use an illegal id for this test.
+        setFieldValueUsingReflection(deleteRequest, "mDataSourceIds", Set.of("illegal id"));
+        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+
+        try {
+            assertThrows(
+                    IllegalArgumentException.class,
+                    () ->
+                            mManager.deleteMedicalResources(
+                                    deleteRequest,
+                                    Executors.newSingleThreadExecutor(),
+                                    new HealthConnectReceiver<>()));
+            // Test resource is still present.
+            mManager.readMedicalResources(
+                    List.of(resource1.getId()), Executors.newSingleThreadExecutor(), readReceiver);
+            assertThat(readReceiver.getResponse()).containsExactly(resource1);
+        } finally {
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_badResourceType_throwsAndDoesntDeleteAll()
+            throws InterruptedException, NoSuchFieldException, IllegalAccessException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest deleteRequest =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        // Change the delete request to use an illegal type for this test.
+        setFieldValueUsingReflection(deleteRequest, "mMedicalResourceTypes", Set.of(100));
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.deleteMedicalResources(
+                                deleteRequest,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+        // Test resource is still present.
+        mManager.readMedicalResources(
+                List.of(resource.getId()), Executors.newSingleThreadExecutor(), readReceiver);
+        assertThat(readReceiver.getResponse()).containsExactly(resource);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_emptyRequestNoFilters_throwsAndDoesntDeleteAll()
+            throws InterruptedException, NoSuchFieldException, IllegalAccessException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest deleteRequest =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+        // Change the delete request to have empty filters for this test.
+        setFieldValueUsingReflection(deleteRequest, "mMedicalResourceTypes", Set.of());
+        setFieldValueUsingReflection(deleteRequest, "mDataSourceIds", Set.of());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.deleteMedicalResources(
+                                deleteRequest,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+        // Test resource is still present.
+        mManager.readMedicalResources(
+                List.of(resource.getId()), Executors.newSingleThreadExecutor(), readReceiver);
+        assertThat(readReceiver.getResponse()).containsExactly(resource);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_nothingPresent_succeeds() throws Exception {
+        // Insert a data source to ensure we have an appInfoId.
+        mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(UUID.randomUUID().toString())
+                        .build();
+
+        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_resourceTypesMismatch_noDelete()
+            throws InterruptedException {
+        // Create the datasource
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        // Insert some data
+        MedicalResource imm1 = mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource imm2 = mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES + 1)
+                        .build();
+        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), callback);
+
+        callback.verifyNoExceptionOrThrow();
+        // Test resource2 is still present
+        HealthConnectReceiver<List<MedicalResource>> readReceiver2 = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(imm1.getId(), imm2.getId()),
+                Executors.newSingleThreadExecutor(),
+                readReceiver2);
+        assertThat(readReceiver2.getResponse()).containsExactly(imm1, imm2);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_deleteByType_succeeds()
+            throws InterruptedException {
+        // Create the datasource
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        // Insert some data
+        MedicalResource vaccine1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource allergy1 = mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), callback);
+
+        callback.verifyNoExceptionOrThrow();
+        // Test only the allergy is present
+        HealthConnectReceiver<List<MedicalResource>> readReceiver2 = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(vaccine1.getId(), vaccine2.getId(), allergy1.getId()),
+                Executors.newSingleThreadExecutor(),
+                readReceiver2);
+        assertThat(readReceiver2.getResponse()).containsExactly(allergy1);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_deleteByTypes_succeeds()
+            throws InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource vaccine =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource allergy = mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_ALLERGY);
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .build();
+        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), callback);
+
+        callback.verifyNoExceptionOrThrow();
+        // Test resources were deleted
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(vaccine.getId(), allergy.getId()),
+                Executors.newSingleThreadExecutor(),
+                readReceiver);
+        assertThat(readReceiver.getResponse()).isEmpty();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_deleteByDataSource_succeeds()
+            throws InterruptedException {
+        // Create the datasource
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        // Insert some data
+        MedicalResource vaccine1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .build();
+        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), callback);
+
+        callback.verifyNoExceptionOrThrow();
+        // Test only vaccine2 is present
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(vaccine1.getId(), vaccine2.getId()),
+                Executors.newSingleThreadExecutor(),
+                readReceiver);
+        assertThat(readReceiver.getResponse()).containsExactly(vaccine2);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_deleteDataSources_succeeds()
+            throws InterruptedException {
+        // Create the datasource
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        MedicalDataSource dataSource3 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("3"));
+        // Insert some data
+        MedicalResource vaccine1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine3 =
+                mUtil.upsertMedicalData(dataSource3.getId(), FHIR_DATA_IMMUNIZATION);
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .addDataSourceId(dataSource2.getId())
+                        .build();
+        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), callback);
+
+        callback.verifyNoExceptionOrThrow();
+        // Test only vaccine3 is present
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(vaccine1.getId(), vaccine2.getId(), vaccine3.getId()),
+                Executors.newSingleThreadExecutor(),
+                readReceiver);
+        assertThat(readReceiver.getResponse()).containsExactly(vaccine3);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_deleteByDataSourceAndResourceType_succeeds()
+            throws InterruptedException {
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        MedicalDataSource dataSource3 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("3"));
+        MedicalResource vaccineDS1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource allergyDS1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
+        MedicalResource vaccineDS2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource allergyDS2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_ALLERGY);
+        MedicalResource allergyDS3 =
+                mUtil.upsertMedicalData(dataSource3.getId(), FHIR_DATA_ALLERGY);
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest deleteRequestDS1andDS3Vaccines =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .addDataSourceId(dataSource3.getId())
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        mManager.deleteMedicalResources(
+                deleteRequestDS1andDS3Vaccines, Executors.newSingleThreadExecutor(), callback);
+
+        callback.verifyNoExceptionOrThrow();
+        // Test only one was deleted
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(
+                        vaccineDS1.getId(),
+                        allergyDS1.getId(),
+                        vaccineDS2.getId(),
+                        allergyDS2.getId(),
+                        allergyDS3.getId()),
+                Executors.newSingleThreadExecutor(),
+                readReceiver);
+        assertThat(readReceiver.getResponse())
+                .containsExactly(allergyDS1, vaccineDS2, allergyDS2, allergyDS3);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_managementPermissionCreate2Delete1_succeeds()
+            throws InterruptedException {
+        // Create the datasource
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        // Insert some data
+        MedicalResource resource1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource resource2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .build();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalResources(
+                            request, Executors.newSingleThreadExecutor(), callback);
+                    callback.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        // Test resource2 is still present
+        HealthConnectReceiver<List<MedicalResource>> readReceiver2 = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(resource1.getId(), resource2.getId()),
+                Executors.newSingleThreadExecutor(),
+                readReceiver2);
+        assertThat(readReceiver2.getResponse()).containsExactly(resource2);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_managementPermTypeMismatch_noDelete()
+            throws InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource vaccine =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES + 1)
+                        .build();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalResources(
+                            request, Executors.newSingleThreadExecutor(), callback);
+                    callback.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        // Test resource is still present
+        HealthConnectReceiver<List<MedicalResource>> readReceiver2 = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(vaccine.getId()), Executors.newSingleThreadExecutor(), readReceiver2);
+        assertThat(readReceiver2.getResponse()).containsExactly(vaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_managementPerm_canDeleteDataOwnedByAllApps()
+            throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        DeleteMedicalResourcesRequest deleteResourcesForBothAppsRequest =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(backgroundAppDataSource.getId())
+                        .addDataSourceId(foregroundAppDataSource.getId())
+                        .build();
+
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.deleteMedicalResources(
+                            deleteResourcesForBothAppsRequest,
+                            Executors.newSingleThreadExecutor(),
+                            callback);
+                    callback.verifyNoExceptionOrThrow();
+                },
+                MANAGE_HEALTH_DATA);
+
+        // Test that the resources are not present anymore
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.readMedicalResources(
+                            List.of(backgroundAppVaccine.getId(), foregroundAppVaccine.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).isEmpty();
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_inForegroundNoPermission_expectError() {
+        // App has not been granted any permissions.
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.deleteMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_inForegroundOnlyReadPerm_expectError() {
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), READ_MEDICAL_DATA_VACCINES);
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.deleteMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByIds_inBackgroundNoPermission_expectError() {
+        // App has not been granted any permissions.
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.deleteMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_byDataSourceOwnedByDiffApp_noDelete()
+            throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        DeleteMedicalResourcesRequest deleteBackgroundAppResourcesRequest =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(backgroundAppDataSource.getId())
+                        .build();
+
+        PHR_FOREGROUND_APP.deleteMedicalResources(deleteBackgroundAppResourcesRequest);
+
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        // Test that the vaccine is still present
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.readMedicalResources(
+                            List.of(backgroundAppVaccine.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).containsExactly(backgroundAppVaccine);
+                });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testDeleteMedicalResourcesByRequest_byResourceTypeByDiffApp_noDelete()
+            throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        DeleteMedicalResourcesRequest deleteVaccinesRequest =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+
+        PHR_FOREGROUND_APP.deleteMedicalResources(deleteVaccinesRequest);
+
+        HealthConnectReceiver<List<MedicalResource>> readReceiver = new HealthConnectReceiver<>();
+        // Test that the vaccine is still present
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.readMedicalResources(
+                            List.of(backgroundAppVaccine.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            readReceiver);
+                    assertThat(readReceiver.getResponse()).containsExactly(backgroundAppVaccine);
+                });
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/GetMedicalDataSourcesByIdsCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/GetMedicalDataSourcesByIdsCtsTest.java
new file mode 100644
index 0000000..1bed47b
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/GetMedicalDataSourcesByIdsCtsTest.java
@@ -0,0 +1,685 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_READ_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP_PKG;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP_PKG;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.MEDICAL_DATA_SOURCE_EQUIVALENCE;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.addCompletedStatus;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.utils.DataFactory.MAXIMUM_PAGE_SIZE;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokePermission;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.compatibility.common.util.SystemUtil;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.Executors;
+
+@AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
+@RunWith(AndroidJUnit4.class)
+public class GetMedicalDataSourcesByIdsCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    @Before
+    public void before() throws InterruptedException {
+        // To make sure we don't leave any state behind after running each test.
+        revokeAllPermissions(PHR_BACKGROUND_APP_PKG, "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP_PKG, "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(TestUtils.getHealthConnectManager());
+        mUtil.deleteAllMedicalData();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            // 10 comes from the setLowerRateLimitsForTesting method in RateLimiter.
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_migrationInProgress_apiBlocked() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+
+        startMigrationWithShellPermissionIdentity();
+        mManager.getMedicalDataSources(
+                List.of(dataSource.getId()), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_readLimitExceeded_throws()
+            throws InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(PhrDataFactory.getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        // Make the maximum number of calls allowed by quota
+        int maximumCalls = MAX_FOREGROUND_READ_CALL_15M / mUtil.mLimitsAdjustmentForTesting;
+        float remainingQuota =
+                mUtil.tryAcquireCallQuotaNTimesForRead(dataSource, List.of(resource), maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.getMedicalDataSources(
+                    List.of(dataSource.getId()), Executors.newSingleThreadExecutor(), receiver);
+        }
+
+        HealthConnectException exception = receiver.assertAndGetException();
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testGetMedicalDataSourcesById_emptyIds_returnsEmptyList()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+
+        mManager.getMedicalDataSources(List.of(), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).isEmpty();
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testGetMedicalDataSourcesById_exceedsMaxPageSize_throws()
+            throws InterruptedException {
+        List<String> dataSourceIds = new ArrayList<>(MAXIMUM_PAGE_SIZE + 1);
+        for (int i = 0; i < MAXIMUM_PAGE_SIZE + 1; i++) {
+            dataSourceIds.add(UUID.randomUUID().toString());
+        }
+
+        Exception exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                mManager.getMedicalDataSources(
+                                        dataSourceIds,
+                                        Executors.newSingleThreadExecutor(),
+                                        new HealthConnectReceiver<>()));
+        assertThat(exception.getMessage()).contains("The number of requested IDs must be <= 5000");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_invalidId_throws() throws Exception {
+        HealthConnectReceiver<List<MedicalDataSource>> callback = new HealthConnectReceiver<>();
+
+        mManager.getMedicalDataSources(
+                List.of("illegal id"), Executors.newSingleThreadExecutor(), callback);
+
+        assertThat(callback.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_someValidAndInvalidIds_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+
+        // A mix of valid and invalid ids are given.
+        mManager.getMedicalDataSources(
+                List.of(dataSource.getId(), "foo"), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_withManagePerm_notPresent_returnsEmptyList()
+            throws Exception {
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        List<String> ids = List.of(DATA_SOURCE_ID);
+
+        SystemUtil.runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            ids, Executors.newSingleThreadExecutor(), receiver);
+                    assertThat(receiver.getResponse()).isEmpty();
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_withoutManagePerm_notPresent_returnsEmptyList()
+            throws Exception {
+        mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+
+        // Testing the case where there exists dataSources in HC, but the user is requesting
+        // a valid dataSource ID that does not exist in HC.
+        mManager.getMedicalDataSources(
+                List.of(DATA_SOURCE_ID), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).isEmpty();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_withManageHealthDataPerm_getsAll() throws Exception {
+        // Data written by a different app.
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource1 =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        // Data written by the reading app itself.
+        MedicalDataSource dataSource2 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+
+        // If app has MANAGE_HEALTH_DATA permission, it should be able to read all dataSources.
+        SystemUtil.runWithShellPermissionIdentity(
+                () -> {
+                    mManager.getMedicalDataSources(
+                            List.of(dataSource1.getId(), dataSource2.getId()),
+                            Executors.newSingleThreadExecutor(),
+                            receiver);
+                    assertThat(receiver.getResponse()).containsExactly(dataSource1, dataSource2);
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_onePresentWithoutData_returnsItAndNullUpdateTime()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+
+        mManager.getMedicalDataSources(
+                List.of(dataSource.getId()), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).containsExactly(dataSource);
+        assertThat(dataSource.getLastDataUpdateTime()).isNull();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_onePresentWithData_returnsCorrectLastDataUpdateTime()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        Instant insertTime = Instant.now();
+        mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+
+        mManager.getMedicalDataSources(
+                List.of(dataSource.getId()), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).hasSize(1);
+        Instant lastDataUpdateTime = receiver.getResponse().get(0).getLastDataUpdateTime();
+        assertThat(lastDataUpdateTime).isAtLeast(insertTime);
+        assertThat(lastDataUpdateTime).isAtMost(Instant.now());
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_dataUpdated_returnsCorrectLastDataUpdateTime()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        Instant updateTime = Instant.now();
+        mUtil.upsertMedicalData(dataSource.getId(), addCompletedStatus(FHIR_DATA_IMMUNIZATION));
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+
+        mManager.getMedicalDataSources(
+                List.of(dataSource.getId()), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).hasSize(1);
+        Instant lastDataUpdateTime = receiver.getResponse().get(0).getLastDataUpdateTime();
+        assertThat(lastDataUpdateTime).isAtLeast(updateTime);
+        assertThat(lastDataUpdateTime).isAtMost(Instant.now());
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalResourcesByIds_deletedResource_notCountedInLastDataUpdateTime()
+            throws InterruptedException {
+        Instant beforeUpsertTime = Instant.now();
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("ds1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("ds2"));
+        MedicalResource dataSource1resource1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource dataSource2resource1 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        Instant beforeDeleteTime = Instant.now();
+        mManager.deleteMedicalResources(
+                List.of(dataSource1resource1.getId(), dataSource2resource1.getId()),
+                Executors.newSingleThreadExecutor(),
+                callback);
+        callback.verifyNoExceptionOrThrow();
+        HealthConnectReceiver<List<MedicalDataSource>> readReceiver1 =
+                new HealthConnectReceiver<>();
+        HealthConnectReceiver<List<MedicalDataSource>> readReceiver2 =
+                new HealthConnectReceiver<>();
+
+        mManager.getMedicalDataSources(
+                List.of(dataSource1.getId()), Executors.newSingleThreadExecutor(), readReceiver1);
+        mManager.getMedicalDataSources(
+                List.of(dataSource2.getId()), Executors.newSingleThreadExecutor(), readReceiver2);
+
+        // The last data update time of dataSource1 is expected to be null because we have deleted
+        // all data.
+        assertThat(readReceiver1.getResponse().get(0).getLastDataUpdateTime()).isNull();
+        // The last data update time of dataSource2 is expected to be before the delete time, as the
+        // delete is not taken into account.
+        assertThat(readReceiver2.getResponse().get(0).getLastDataUpdateTime())
+                .isAtLeast(beforeUpsertTime);
+        assertThat(readReceiver2.getResponse().get(0).getLastDataUpdateTime())
+                .isAtMost(beforeDeleteTime);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inForegroundWithNoPerms_throws() {
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.getMedicalDataSources(List.of(DATA_SOURCE_ID)));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inForegroundWithReadPermNoWritePerm()
+            throws Exception {
+        // To write data from two different apps.
+        grantPermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        grantPermissions(
+                PHR_FOREGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in foreground, no write permission but has
+        // vaccine read permission. App can read all dataSources belonging to vaccines.
+        revokePermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        List<MedicalDataSource> result =
+                PHR_FOREGROUND_APP.getMedicalDataSources(
+                        List.of(
+                                dataSource1Foreground.getId(),
+                                dataSource1Background.getId(),
+                                dataSource2Background.getId()));
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Foreground, dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inForegroundHasWritePermNoReadPerms()
+            throws Exception {
+        // To write data from two different apps.
+        grantPermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in foreground, has write permission but
+        // no read permission for any resource types.
+        // App can only read dataSources they wrote themselves.
+        List<MedicalDataSource> result =
+                PHR_FOREGROUND_APP.getMedicalDataSources(
+                        List.of(
+                                dataSource1Foreground.getId(),
+                                dataSource1Background.getId(),
+                                dataSource2Background.getId()));
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Foreground);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inForegroundHasWriteAndReadPerms() throws Exception {
+        // To write data from two different apps.
+        grantPermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        grantPermissions(
+                PHR_FOREGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in foreground, has write permission and has vaccine read permissions.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types.
+        List<MedicalDataSource> result =
+                PHR_FOREGROUND_APP.getMedicalDataSources(
+                        List.of(
+                                dataSource1Foreground.getId(),
+                                dataSource2Foreground.getId(),
+                                dataSource1Background.getId(),
+                                dataSource2Background.getId()));
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(
+                        dataSource1Foreground, dataSource2Foreground, dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inBgWithoutBgPermHasWritePermNoReadPerms()
+            throws Exception {
+        // The app under test.
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        // Another app to write some more data.
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+
+        // Calling app is running in the background without background read permission.
+        // The app has write permission and read vaccine permission.
+        // The app can read data sources created by itself only.
+        List<MedicalDataSource> result =
+                PHR_BACKGROUND_APP.getMedicalDataSources(
+                        List.of(dataSource1Foreground.getId(), dataSource2Background.getId()));
+
+        assertThat(result).containsExactly(dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inBgWithNoPerms_throws() throws Exception {
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.getMedicalDataSources(List.of(DATA_SOURCE_ID)));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inBgWithoutBgPermNoWritePermOnlyReadPerm()
+            throws Exception {
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background without background read perm, no write permission but has
+        // vaccine read permission. App can read dataSources belonging to vaccines that
+        // the app wrote itself.
+        revokePermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        List<MedicalDataSource> result =
+                PHR_BACKGROUND_APP.getMedicalDataSources(
+                        List.of(
+                                dataSource1Foreground.getId(),
+                                dataSource1Background.getId(),
+                                dataSource2Background.getId()));
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inBgWithBgReadPermNoWritePermHasReadPerm()
+            throws Exception {
+        // To write data from two different apps.
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background with background read permission, no write permission but has
+        // vaccine read permission. App can read all dataSources belonging to vaccines.
+        revokePermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        List<MedicalDataSource> result =
+                PHR_BACKGROUND_APP.getMedicalDataSources(
+                        List.of(
+                                dataSource1Foreground.getId(),
+                                dataSource1Background.getId(),
+                                dataSource2Background.getId()));
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Foreground, dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inBgWithBgReadPermHasWritePermNoReadPerms()
+            throws Exception {
+        // To write data from two different apps.
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_HEALTH_DATA_IN_BACKGROUND));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+
+        // App is in background with background read permission, has write permission but
+        // no read permission for any resource types.
+        // App can only read dataSources they wrote themselves.
+        List<MedicalDataSource> result =
+                PHR_BACKGROUND_APP.getMedicalDataSources(
+                        List.of(
+                                dataSource1Foreground.getId(),
+                                dataSource1Background.getId(),
+                                dataSource2Background.getId()));
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesById_inBgWithBgPermHasWriteAndReadPerm() throws Exception {
+        // To write data from two different apps.
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background, has background read permission,
+        // has write permission and vaccine read permissions.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types.
+        List<MedicalDataSource> result =
+                PHR_BACKGROUND_APP.getMedicalDataSources(
+                        List.of(
+                                dataSource1Foreground.getId(),
+                                dataSource2Foreground.getId(),
+                                dataSource1Background.getId(),
+                                dataSource2Background.getId()));
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(
+                        dataSource1Background, dataSource2Background, dataSource1Foreground);
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/GetMedicalDataSourcesByRequestCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/GetMedicalDataSourcesByRequestCtsTest.java
new file mode 100644
index 0000000..5fc9097
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/GetMedicalDataSourcesByRequestCtsTest.java
@@ -0,0 +1,1152 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_READ_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP_PKG;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP_PKG;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.MEDICAL_DATA_SOURCE_EQUIVALENCE;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokePermission;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.app.UiAutomation;
+import android.health.connect.GetMedicalDataSourcesRequest;
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.DataFactory;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executors;
+
+@RunWith(AndroidJUnit4.class)
+public class GetMedicalDataSourcesByRequestCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    @Before
+    public void before() throws InterruptedException {
+        // To make sure we don't leave any state behind after running each test.
+        revokeAllPermissions(PHR_BACKGROUND_APP_PKG, "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP_PKG, "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(mManager);
+        mUtil.deleteAllMedicalData();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByRequest_invalidPackageNameByReflection_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .build();
+        setFieldValueUsingReflection(request, "mPackageNames", Set.of("InvalidPackageName"));
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.getMedicalDataSources(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByRequest_migrationInProgress_apiBlocked()
+            throws Exception {
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+
+        startMigrationWithShellPermissionIdentity();
+        mManager.getMedicalDataSources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByRequest_readLimitExceeded_throws()
+            throws InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(PhrDataFactory.getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        // Make the maximum number of calls allowed by quota
+        int maximumCalls = MAX_FOREGROUND_READ_CALL_15M / mUtil.mLimitsAdjustmentForTesting;
+        float remainingQuota =
+                mUtil.tryAcquireCallQuotaNTimesForRead(dataSource, List.of(resource), maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.getMedicalDataSources(request, Executors.newSingleThreadExecutor(), receiver);
+        }
+
+        HealthConnectException exception = receiver.assertAndGetException();
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByRequest_withManageHealthPerm_nothingPresent_returnEmpty()
+            throws Exception {
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+        try {
+            mManager.getMedicalDataSources(request, Executors.newSingleThreadExecutor(), receiver);
+
+            assertThat(receiver.getResponse()).isEmpty();
+        } finally {
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByRequest_withManageHealthPerm_canReadAll()
+            throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource1 =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        MedicalDataSource dataSource2 =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+        try {
+            mManager.getMedicalDataSources(
+                    new GetMedicalDataSourcesRequest.Builder().build(),
+                    Executors.newSingleThreadExecutor(),
+                    receiver);
+
+            assertThat(receiver.getResponse())
+                    .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                    .containsExactly(dataSource1, dataSource2);
+        } finally {
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByRequest_onePresentNoData_returnsItAndNullUpdateTime()
+            throws Exception {
+        HealthConnectReceiver<MedicalDataSource> createReceiver = new HealthConnectReceiver<>();
+        mManager.createMedicalDataSource(
+                getCreateMedicalDataSourceRequest("ds/1"),
+                Executors.newSingleThreadExecutor(),
+                createReceiver);
+        MedicalDataSource dataSource = createReceiver.getResponse();
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+
+        mManager.getMedicalDataSources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).containsExactly(dataSource);
+        assertThat(dataSource.getLastDataUpdateTime()).isNull();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void
+            testGetMedicalDataSourcesByRequest_onePresentWithData_returnsCorrectLastDataUpdateTime()
+                    throws Exception {
+        HealthConnectReceiver<MedicalDataSource> createReceiver = new HealthConnectReceiver<>();
+        mManager.createMedicalDataSource(
+                getCreateMedicalDataSourceRequest(),
+                Executors.newSingleThreadExecutor(),
+                createReceiver);
+        MedicalDataSource dataSource = createReceiver.getResponse();
+        Instant insertTime = DataFactory.NOW;
+        mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+
+        mManager.getMedicalDataSources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).hasSize(1);
+        Instant lastDataUpdateTime = receiver.getResponse().get(0).getLastDataUpdateTime();
+        assertThat(lastDataUpdateTime).isAtLeast(insertTime);
+        assertThat(lastDataUpdateTime).isAtMost(Instant.now());
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalResourcesByRequest_deletedResource_notCountedInLastDataUpdateTime()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        mManager.deleteMedicalResources(
+                List.of(resource.getId()), Executors.newSingleThreadExecutor(), callback);
+        callback.verifyNoExceptionOrThrow();
+        HealthConnectReceiver<List<MedicalDataSource>> readReceiver = new HealthConnectReceiver<>();
+
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        mManager.getMedicalDataSources(request, Executors.newSingleThreadExecutor(), readReceiver);
+
+        // The last data update time of dataSource is expected to be null because we have deleted
+        // all data.
+        assertThat(readReceiver.getResponse().get(0).getLastDataUpdateTime()).isNull();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByRequest_InBackgroundNoPermission_throws() {
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.getMedicalDataSources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByRequest_InForegroundNoPermission_throws() {
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.getMedicalDataSources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetByPackage_packageFilterEmpty_inBgWithBgPermHasWriteAndReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background with background read perm, has write permission and
+        // has vaccine read permissions.
+        // The packageName set in the request is empty so no filtering based on packageNames.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types.
+        List<MedicalDataSource> result =
+                PHR_BACKGROUND_APP.getMedicalDataSources(
+                        new GetMedicalDataSourcesRequest.Builder().build());
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(
+                        dataSource1Background, dataSource2Background, dataSource1Foreground);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetByPackage_packageFilterEmpty_inForegroundHasWriteAndReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_FOREGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in foreground, has write permission and vaccine read permissions.
+        // The packageName set in the request is empty so no filtering based on packageNames.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types.
+        List<MedicalDataSource> result =
+                PHR_FOREGROUND_APP.getMedicalDataSources(
+                        new GetMedicalDataSourcesRequest.Builder().build());
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(
+                        dataSource1Foreground, dataSource2Foreground, dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetByPackage_withPackageFilterSelfIncluded_inFgHasWriteAndReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_FOREGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .build();
+
+        // App is in foreground, has write permission and has vaccine read permissions.
+        // The app's package name is included in the list of packages.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types written by any of the given packages.
+        List<MedicalDataSource> result = PHR_FOREGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(
+                        dataSource1Foreground, dataSource2Foreground, dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetByPackage_withPackageFilterSelfIncluded_inBgWithPermHasWriteAndReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .build();
+
+        // App is in background with background read, has write permission and has vaccine
+        // read permissions.
+        // The app's package name is included in the list of packages.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types written by any of the given packages.
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(
+                        dataSource1Background, dataSource2Background, dataSource1Foreground);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetByPackage_withPackageFilterSelfNotIncluded_inBgWithPermHasWriteAndReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .build();
+
+        // App is in background with background read perm, has write permission and
+        // has vaccine read permissions.
+        // The app's package name is not included in the list of packages.
+        // App can read dataSources belonging to vaccine resource types written by any of
+        // the given packages.
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Foreground);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetByPackage_withPackageFilterSelfNotIncluded_inForegroundWriteAndReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_FOREGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in foreground, has write permission and has vaccine read permissions.
+        // The app's package name is not included in the list of packages.
+        // App can read dataSources belonging to vaccine resource types written by any of
+        // the given packages.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .build();
+        List<MedicalDataSource> result = PHR_FOREGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetByPackage_emptyPackageFilter_inBgWithoutBgPermHasWritePermNoReadPerms()
+            throws Exception {
+        grantPermissions(PHR_FOREGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA));
+        grantPermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background without background read perm, has write permission and
+        // no read permissions.
+        // The packageNames filter is empty so no filter is applied.
+        // App can read dataSources they wrote themself.
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_withPackageFilterSelfIncluded_inBgWithoutBgPermHasWritePermButNoRead()
+            throws Exception {
+        grantPermissions(PHR_FOREGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA));
+        grantPermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background without background read perm, has write permission and
+        // no read permissions.
+        // The app's package name is included in the list of packages.
+        // App can read dataSources they wrote themself.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_withPackageFilterSelfNotIncluded_inBgWithoutBgPermHasWritePermNoRead()
+            throws Exception {
+        grantPermissions(PHR_FOREGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA));
+        grantPermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        // App is in background without background read perm, has write permission and
+        // no read permissions.
+        // The app's package name is not included in the list of packages.
+        // App can read no dataSources.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .build();
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.getMedicalDataSources(request));
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_emptyPackageFilter_inBgWithoutBgPermHasWritePermAndReadPerms()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background without background read perm, has write permission and
+        // has read vaccine permission.
+        // The packageNames is empty so no filtering is applied.
+        // App can read dataSources they wrote themselves.
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_withPackageFilterSelfIncluded_inBgWithoutBgPermHasWriteAndReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background without background read perm, has write permission and
+        // has read vaccine permission.
+        // The app's package name is included in the list of packages.
+        // App can read dataSources they wrote themselves.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_noPackageFilter_inBgWithoutBgPermHasReadPermNoWritePerm()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+        // Revoke the write permission that was granted before.
+        revokePermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        // App is in background without background read perm, has no write permission and
+        // has read vaccine permission.
+        // The packageNames is empty so no filtering based on packageNames.
+        // App can read dataSources belonging to vaccines the app wrote itself.
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_withPackageFilterSelfIncluded_inBgWithoutBgPermHasReadPermNoWrite()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+        // Revoke the write permission that was granted before.
+        revokePermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        // App is in background without background read perm, has no write permission and
+        // has read vaccine permission.
+        // The app's package name is included in the list of packages.
+        // App can read dataSources belonging to vaccines the app wrote itself.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_emptyPackageFilter_inBgWithoutBgPermHasMultipleReadPermsNoWritePerm()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP_PKG,
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_MEDICAL_DATA_VACCINES,
+                        READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES));
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+        // Revoke the write permission that was granted before.
+        revokePermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        // App is in background without background read perm, no write permission but has
+        // vaccine and allergy read permission.
+        // PackageNames is empty so no filtering based on packageNames is applied.
+        // App can read dataSources belonging to
+        // vaccines and allergy resource types that the app wrote itself.
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_filterOnPackageWithSelf_inBgWithoutBgPermHasMultipleReadPermsNoWrite()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP_PKG,
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_MEDICAL_DATA_VACCINES,
+                        READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES));
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+        // Revoke the write permission that was granted before.
+        revokePermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        // App is in background without background read perm, no write permission but has
+        // vaccine and allergy read permission. App can read dataSources belonging to
+        // vaccines and allergy resource types that the app wrote itself.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_noPackageFilter_inForegroundHasWritePermNoReadPerm()
+            throws Exception {
+        grantPermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in foreground or background with background read perm, has write permission but
+        // no read permission for any resource types.
+        // The packageNames is empty so no filtering is applied based on packageNames.
+        // App can read only read dataSources they wrote themselves.
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        List<MedicalDataSource> result = PHR_FOREGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Foreground, dataSource2Foreground);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_noPackageFilter_inBgWithBgPermHasWritePermNoReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP_PKG,
+                List.of(WRITE_MEDICAL_DATA, READ_HEALTH_DATA_IN_BACKGROUND));
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background with background read perm, has write permission but
+        // no read permission for any resource types.
+        // The packageNames is empty so no filtering is applied based on packageNames.
+        // App can read only read dataSources they wrote themselves.
+        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_packageFilterWithSelf_inFgHasWritePermNoReadPerm() throws Exception {
+        grantPermission(PHR_BACKGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in foreground or background with background read perm, has write permission but
+        // no read permission for any resource types.
+        // The packageNames is empty so no filtering is applied based on packageNames.
+        // App can read only read dataSources they wrote themselves.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .build();
+        List<MedicalDataSource> result = PHR_FOREGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Foreground, dataSource2Foreground);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_packageFilterWithSelf_inBgWithBgPermHasWritePermNoReadPerm()
+            throws Exception {
+        grantPermissions(
+                PHR_BACKGROUND_APP_PKG,
+                List.of(WRITE_MEDICAL_DATA, READ_HEALTH_DATA_IN_BACKGROUND));
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+
+        MedicalDataSource dataSource1Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                dataSource1Foreground.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Foreground =
+                PHR_FOREGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_FOREGROUND_APP.upsertMedicalResource(dataSource2Foreground.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource dataSource1Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/1"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                dataSource1Background.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource dataSource2Background =
+                PHR_BACKGROUND_APP.createMedicalDataSource(
+                        getCreateMedicalDataSourceRequest("ds/2"));
+        PHR_BACKGROUND_APP.upsertMedicalResource(dataSource2Background.getId(), FHIR_DATA_ALLERGY);
+
+        // App is in background with background read perm, has write permission but
+        // no read permission for any resource types.
+        // The packageNames is empty so no filtering is applied based on packageNames.
+        // App can read only read dataSources they wrote themselves.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .build();
+        List<MedicalDataSource> result = PHR_BACKGROUND_APP.getMedicalDataSources(request);
+
+        assertThat(result)
+                .comparingElementsUsing(MEDICAL_DATA_SOURCE_EQUIVALENCE)
+                .containsExactly(dataSource1Background, dataSource2Background);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void
+            getByPackages_withPackageFilterSelfNotIncluded_inForegroundHasWritePermNoReadPerms() {
+        grantPermissions(PHR_FOREGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA));
+
+        // App is in foreground, has write permission but no read permission for any resource types.
+        // App package name is not included in the set of given packageNames.
+        // App can not read any dataSources.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_BACKGROUND_APP_PKG)
+                        .build();
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.getMedicalDataSources(request));
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void getByPackages_withPackageFilterSelfNotIncluded_inBgWithBgReadHasWritePermNoRead() {
+        grantPermissions(PHR_BACKGROUND_APP_PKG, List.of(WRITE_MEDICAL_DATA));
+
+        // App is in background with background read permission, has write permission but no read
+        // permission for any resource types.
+        // App package name is not included in the set of given packageNames.
+        // App can not read any dataSources.
+        GetMedicalDataSourcesRequest request =
+                new GetMedicalDataSourcesRequest.Builder()
+                        .addPackageName(PHR_FOREGROUND_APP_PKG)
+                        .build();
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.getMedicalDataSources(request));
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/MedicalResourceTypesCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/MedicalResourceTypesCtsTest.java
new file mode 100644
index 0000000..6a01855
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/MedicalResourceTypesCtsTest.java
@@ -0,0 +1,373 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.ObservationCategory.LABORATORY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.health.connect.HealthConnectManager;
+import android.health.connect.ReadMedicalResourcesInitialRequest;
+import android.health.connect.ReadMedicalResourcesResponse;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.ConditionBuilder;
+import android.healthconnect.cts.phr.utils.EncountersBuilder;
+import android.healthconnect.cts.phr.utils.MedicationsBuilder;
+import android.healthconnect.cts.phr.utils.ObservationBuilder;
+import android.healthconnect.cts.phr.utils.PatientBuilder;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.phr.utils.PractitionerBuilder;
+import android.healthconnect.cts.phr.utils.ProcedureBuilder;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Executors;
+
+@RunWith(AndroidJUnit4.class)
+public class MedicalResourceTypesCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    @Before
+    public void before() throws InterruptedException {
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(TestUtils.getHealthConnectManager());
+        mUtil.deleteAllMedicalData();
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testPatientInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource patient =
+                mUtil.upsertMedicalData(dataSource1.getId(), new PatientBuilder().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS)
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(patient);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testLabResultsInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource labResult =
+                mUtil.upsertMedicalData(
+                        dataSource1.getId(),
+                        new ObservationBuilder()
+                                .setBloodGlucose()
+                                .setCategory(LABORATORY)
+                                .toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allLabResultsRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS)
+                        .build();
+
+        mManager.readMedicalResources(
+                allLabResultsRequest, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(labResult);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testPregnancyInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource pregnancyStatus =
+                mUtil.upsertMedicalData(
+                        dataSource1.getId(),
+                        new ObservationBuilder()
+                                .setPregnancyStatus(ObservationBuilder.PregnancyStatus.PREGNANT)
+                                .toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allPregnancyRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_PREGNANCY)
+                        .build();
+
+        mManager.readMedicalResources(
+                allPregnancyRequest, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(pregnancyStatus);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testSocialHistoryInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource smoking =
+                mUtil.upsertMedicalData(
+                        dataSource1.getId(),
+                        new ObservationBuilder()
+                                .setTobaccoUse(ObservationBuilder.CurrentSmokingStatus.SMOKER)
+                                .toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allSocialHistoryRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY)
+                        .build();
+
+        mManager.readMedicalResources(
+                allSocialHistoryRequest, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(smoking);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testVitalSignsInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource heartRate =
+                mUtil.upsertMedicalData(
+                        dataSource1.getId(), new ObservationBuilder().setHeartRate(100).toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allVitalSignsRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VITAL_SIGNS)
+                        .build();
+
+        mManager.readMedicalResources(
+                allVitalSignsRequest, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(heartRate);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testConditionInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource condition =
+                mUtil.upsertMedicalData(dataSource1.getId(), new ConditionBuilder().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allConditions =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_CONDITIONS)
+                        .build();
+
+        mManager.readMedicalResources(allConditions, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(condition);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testPractitionerInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource practitioner =
+                mUtil.upsertMedicalData(dataSource1.getId(), new PractitionerBuilder().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS)
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(practitioner);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testPractitionerRoleInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource practitioner =
+                mUtil.upsertMedicalData(dataSource1.getId(), PractitionerBuilder.role().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS)
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(practitioner);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testProcedureInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource procedure =
+                mUtil.upsertMedicalData(dataSource1.getId(), new ProcedureBuilder().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_PROCEDURES)
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(procedure);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testMedicationInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource medication =
+                mUtil.upsertMedicalData(
+                        dataSource1.getId(), MedicationsBuilder.medication().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(medication);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testMedicationStatementInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource statement =
+                mUtil.upsertMedicalData(
+                        dataSource1.getId(), MedicationsBuilder.statementR4().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(statement);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testMedicationRequestInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource medicationRequest =
+                mUtil.upsertMedicalData(dataSource1.getId(), MedicationsBuilder.request().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(medicationRequest);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testEncounterInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource encounter =
+                mUtil.upsertMedicalData(
+                        dataSource1.getId(), EncountersBuilder.encounter().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allVisits =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VISITS)
+                        .build();
+
+        mManager.readMedicalResources(allVisits, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(encounter);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testLocationInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource location =
+                mUtil.upsertMedicalData(dataSource1.getId(), EncountersBuilder.location().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allVisits =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VISITS)
+                        .build();
+
+        mManager.readMedicalResources(allVisits, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(location);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testOrganizationInsertAndRead() throws Exception {
+        MedicalDataSource dataSource1 = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource organization =
+                mUtil.upsertMedicalData(
+                        dataSource1.getId(), EncountersBuilder.organization().toJson());
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allVisits =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VISITS)
+                        .build();
+
+        mManager.readMedicalResources(allVisits, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(organization);
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/QueryAllMedicalResourceTypeInfosCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/QueryAllMedicalResourceTypeInfosCtsTest.java
new file mode 100644
index 0000000..bdba112
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/QueryAllMedicalResourceTypeInfosCtsTest.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.MedicalResourceTypeInfo;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+
+@RunWith(AndroidJUnit4.class)
+public class QueryAllMedicalResourceTypeInfosCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    @Before
+    public void setUp() throws Exception {
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(mManager);
+        mUtil.deleteAllMedicalData();
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testQueryAllMedicalResourceTypeInfos_migrationInProgress_apiBlocked()
+            throws Exception {
+        startMigrationWithShellPermissionIdentity();
+        HealthConnectReceiver<List<MedicalResourceTypeInfo>> receiver =
+                new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.queryAllMedicalResourceTypeInfos(
+                            Executors.newSingleThreadExecutor(), receiver);
+                    assertThat(receiver.assertAndGetException().getErrorCode())
+                            .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+                },
+                MANAGE_HEALTH_DATA);
+
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testQueryAllMedicalResourceTypeInfos_withManagePerm_hasData_succeeds()
+            throws Exception {
+        // Create some data sources with data: ds1 contains [vaccine, differentVaccine,
+        // allergy], ds2 contains [vaccine], and ds3 contains [allergy].
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        MedicalDataSource dataSource3 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("3"));
+        Instant upsertTime = Instant.now();
+        mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
+        mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource3.getId(), FHIR_DATA_ALLERGY);
+        HealthConnectReceiver<List<MedicalResourceTypeInfo>> receiver =
+                new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.queryAllMedicalResourceTypeInfos(
+                            Executors.newSingleThreadExecutor(), receiver);
+                    receiver.verifyNoExceptionOrThrow();
+
+                    List<MedicalResourceTypeInfo> response = receiver.getResponse();
+                    for (MedicalResourceTypeInfo info : response) {
+                        info.getContributingDataSources()
+                                .forEach(
+                                        source -> {
+                                            assertThat(source.getLastDataUpdateTime())
+                                                    .isAtLeast(upsertTime);
+                                            assertThat(source.getLastDataUpdateTime())
+                                                    .isAtMost(Instant.now());
+                                        });
+                    }
+                    List<MedicalResourceTypeInfo> responseWithoutLastUpdateTime = new ArrayList<>();
+                    for (MedicalResourceTypeInfo info : response) {
+                        MedicalResourceTypeInfo infoWithoutLastDataUpdateTime =
+                                new MedicalResourceTypeInfo(
+                                        info.getMedicalResourceType(),
+                                        info.getContributingDataSources().stream()
+                                                .map(
+                                                        source ->
+                                                                new MedicalDataSource.Builder(
+                                                                                source)
+                                                                        .setLastDataUpdateTime(null)
+                                                                        .build())
+                                                .collect(Collectors.toSet()));
+                        responseWithoutLastUpdateTime.add(infoWithoutLastDataUpdateTime);
+                    }
+                    assertThat(responseWithoutLastUpdateTime)
+                            .containsExactly(
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                            Set.of(dataSource1, dataSource3)),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_CONDITIONS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VACCINES,
+                                            Set.of(dataSource1, dataSource2)),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_MEDICATIONS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PREGNANCY, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PROCEDURES, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VISITS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VITAL_SIGNS, Set.of()));
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testQueryAllMedicalResourceTypeInfos_withManagePerm_noDataSources_succeeds() {
+        HealthConnectReceiver<List<MedicalResourceTypeInfo>> receiver =
+                new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.queryAllMedicalResourceTypeInfos(
+                            Executors.newSingleThreadExecutor(), receiver);
+                    receiver.verifyNoExceptionOrThrow();
+
+                    assertThat(receiver.getResponse())
+                            .containsExactly(
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_CONDITIONS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VACCINES, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_MEDICATIONS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PREGNANCY, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PROCEDURES, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VISITS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VITAL_SIGNS, Set.of()));
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testQueryAllMedicalResourceTypeInfos_withManagePerm_noMedicalResources_succeeds()
+            throws Exception {
+        mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResourceTypeInfo>> receiver =
+                new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.queryAllMedicalResourceTypeInfos(
+                            Executors.newSingleThreadExecutor(), receiver);
+
+                    assertThat(receiver.getResponse())
+                            .containsExactly(
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_CONDITIONS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VACCINES, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_MEDICATIONS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PREGNANCY, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_PROCEDURES, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VISITS, Set.of()),
+                                    new MedicalResourceTypeInfo(
+                                            MEDICAL_RESOURCE_TYPE_VITAL_SIGNS, Set.of()));
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testQueryAllMedicalResourceTypeInfos_withoutManagePerm_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResourceTypeInfo>> receiver =
+                new HealthConnectReceiver<>();
+
+        mManager.queryAllMedicalResourceTypeInfos(Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/ReadMedicalResourcesByIdsCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/ReadMedicalResourcesByIdsCtsTest.java
new file mode 100644
index 0000000..811b5eb
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/ReadMedicalResourcesByIdsCtsTest.java
@@ -0,0 +1,738 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_CONDITIONS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PREGNANCY;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PROCEDURES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VISITS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_READ_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResourceId;
+import static android.healthconnect.cts.utils.DataFactory.MAXIMUM_PAGE_SIZE;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokePermission;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.MedicalResourceId;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
+@RunWith(AndroidJUnit4.class)
+public class ReadMedicalResourcesByIdsCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private PhrCtsTestUtils mUtil;
+
+    private HealthConnectManager mManager;
+
+    @Before
+    public void setUp() throws InterruptedException {
+        // To make sure we don't leave any state behind after running each test.
+        revokeAllPermissions(PHR_BACKGROUND_APP.getPackageName(), "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP.getPackageName(), "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mUtil = new PhrCtsTestUtils(TestUtils.getHealthConnectManager());
+        mUtil.deleteAllMedicalData();
+        mManager = TestUtils.getHealthConnectManager();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByIds_migrationInProgress_apiBlocked()
+            throws InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource vaccine =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+
+        startMigrationWithShellPermissionIdentity();
+        mManager.readMedicalResources(List.of(vaccine.getId()), executor, receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByIds_readLimitExceeded_throws()
+            throws InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(PhrDataFactory.getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        // Make the maximum number of calls allowed by quota
+        int maximumCalls = MAX_FOREGROUND_READ_CALL_15M / mUtil.mLimitsAdjustmentForTesting;
+        float remainingQuota =
+                mUtil.tryAcquireCallQuotaNTimesForRead(dataSource, List.of(resource), maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.readMedicalResources(
+                    List.of(resource.getId()), Executors.newSingleThreadExecutor(), receiver);
+        }
+
+        HealthConnectException exception = receiver.assertAndGetException();
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testReadMedicalResourcesByIds_emptyIds_returnsEmptyList()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+
+        mManager.readMedicalResources(List.of(), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).isEmpty();
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testReadMedicalResourcesByIds_exceedsMaxPageSize_throws() {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        List<MedicalResourceId> ids = new ArrayList<>(MAXIMUM_PAGE_SIZE + 1);
+        for (int i = 0; i < MAXIMUM_PAGE_SIZE + 1; i++) {
+            ids.add(
+                    new MedicalResourceId(
+                            UUID.randomUUID().toString(),
+                            FHIR_RESOURCE_TYPE_IMMUNIZATION,
+                            FHIR_RESOURCE_ID_IMMUNIZATION));
+        }
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.readMedicalResources(
+                                ids, Executors.newSingleThreadExecutor(), receiver));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByIds_invalidResourceTypeByReflection_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        MedicalResourceId id = getMedicalResourceId();
+
+        setFieldValueUsingReflection(id, "mFhirResourceType", 100);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.readMedicalResources(
+                                List.of(id),
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByIds_invalidDataSourceIdByReflection_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        MedicalResourceId id = getMedicalResourceId();
+
+        setFieldValueUsingReflection(id, "mDataSourceId", "invalid id");
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.readMedicalResources(
+                                List.of(id),
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByIds_noData_returnsEmptyList()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        List<MedicalResourceId> ids = List.of(getMedicalResourceId());
+
+        mManager.readMedicalResources(ids, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).isEmpty();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByIds_happyPath_succeeds() throws InterruptedException {
+        // Create two data sources.
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        // Insert 3 vaccines and 1 allergy.
+        MedicalResource vaccine1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        // Vaccine 3 will not be checked for, but inserted to check that everything isn't read.
+        mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource allergy = mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+
+        mManager.readMedicalResources(
+                List.of(
+                        vaccine1.getId(),
+                        vaccine2.getId(),
+                        // leave out 3
+                        allergy.getId()),
+                Executors.newSingleThreadExecutor(),
+                receiver);
+
+        assertThat(receiver.getResponse()).containsExactly(vaccine1, vaccine2, allergy);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByIds_happyPathWithManageHealthDataPermission_succeeds()
+            throws InterruptedException {
+        // Create two data sources.
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        // Insert 3 vaccines and 1 allergy.
+        MedicalResource vaccine1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        // Vaccine 3 will not be checked for, but inserted to check that everything isn't read.
+        mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource allergy = mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+
+        runWithShellPermissionIdentity(
+                () ->
+                        mManager.readMedicalResources(
+                                List.of(
+                                        vaccine1.getId(),
+                                        vaccine2.getId(),
+                                        // leave out 3
+                                        allergy.getId()),
+                                Executors.newSingleThreadExecutor(),
+                                receiver),
+                MANAGE_HEALTH_DATA);
+
+        assertThat(receiver.getResponse()).containsExactly(vaccine1, vaccine2, allergy);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundWithNoPerms_throws() {
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_FOREGROUND_APP.readMedicalResources(
+                                        List.of(getMedicalResourceId())));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains("Caller doesn't have permission to read or write medical data");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundWithReadPermNoWritePerm_onlyReturnsResourcesWithReadPerms()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine and one allergy
+        // each and the calling app only has READ_MEDICAL_DATA_VACCINES permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermissions(
+                PHR_FOREGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource foregroundAppAllergy =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource backgroundAppAllergy =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+
+        revokePermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        // When the app tries to read all resources by id from the foreground
+        List<MedicalResource> responseResources =
+                PHR_FOREGROUND_APP.readMedicalResources(
+                        List.of(
+                                foregroundAppVaccine.getId(), foregroundAppAllergy.getId(),
+                                backgroundAppVaccine.getId(), backgroundAppAllergy.getId()));
+
+        // Then it receives all vaccine resources
+        assertThat(responseResources).containsExactly(foregroundAppVaccine, backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundHasWritePermNoReadPerms_onlyReturnsDataFromOwnDataSources()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // calling app only has WRITE_MEDICAL_DATA permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        // When the app reads all vaccine resources from the foreground
+        List<MedicalResource> resourcesResponse =
+                PHR_FOREGROUND_APP.readMedicalResources(
+                        List.of(foregroundAppVaccine.getId(), backgroundAppVaccine.getId()));
+
+        // Then it only receives the vaccine resources written by itself
+        assertThat(resourcesResponse).containsExactly(foregroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundHasWriteAndReadPerms_returnsSelfDataAndOtherDataWithReadPerms()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine and one allergy
+        // each and the calling app only has WRITE_MEDICAL_DATA and READ_MEDICAL_DATA_VACCINES
+        // permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermissions(
+                PHR_FOREGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource foregroundAppAllergy =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource backgroundAppAllergy =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+
+        // When the app tries to read all resources from the foreground
+        List<MedicalResource> resourcesResponse =
+                PHR_FOREGROUND_APP.readMedicalResources(
+                        List.of(
+                                foregroundAppVaccine.getId(), foregroundAppAllergy.getId(),
+                                backgroundAppVaccine.getId(), backgroundAppAllergy.getId()));
+
+        // Then it receives all vaccine resources, but only the allergy resources written by
+        // itself
+        assertThat(resourcesResponse)
+                .containsExactly(foregroundAppVaccine, backgroundAppVaccine, foregroundAppAllergy);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithBgReadNoOtherPerms_throws() {
+        // App has background read permissions, but no other permissions.
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), READ_HEALTH_DATA_IN_BACKGROUND);
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_BACKGROUND_APP.readMedicalResources(
+                                        List.of(getMedicalResourceId())));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains("Caller doesn't have permission to read or write medical data");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithBgReadHasReadPermNoWritePerm_onlyReturnsResourcesWithReadPerms()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine and one allergy
+        // each and the calling app has READ_HEALTH_DATA_IN_BACKGROUND and
+        // READ_MEDICAL_DATA_VACCINES permissions
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource foregroundAppAllergy =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource backgroundAppAllergy =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+
+        revokePermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        // When the app tries to read all resources from the background
+        List<MedicalResource> resourcesResponse =
+                PHR_BACKGROUND_APP.readMedicalResources(
+                        List.of(
+                                foregroundAppVaccine.getId(), foregroundAppAllergy.getId(),
+                                backgroundAppVaccine.getId(), backgroundAppAllergy.getId()));
+
+        // Then it receives only vaccine resources
+        assertThat(resourcesResponse).containsExactly(foregroundAppVaccine, backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithBgReadHasWritePermNoReadPerms_onlyReturnsDataFromOwnDataSources()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // calling app only has READ_HEALTH_DATA_IN_BACKGROUND and WRITE_MEDICAL_DATA permissions
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_HEALTH_DATA_IN_BACKGROUND));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource foregroundAppAllergy =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource backgroundAppAllergy =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+
+        // When the app tries to read all resources from the background
+        List<MedicalResource> resourcesResponse =
+                PHR_BACKGROUND_APP.readMedicalResources(
+                        List.of(
+                                foregroundAppVaccine.getId(), foregroundAppAllergy.getId(),
+                                backgroundAppVaccine.getId(), backgroundAppAllergy.getId()));
+
+        // Then it only receives the resources written by itself
+        assertThat(resourcesResponse).containsExactly(backgroundAppVaccine, backgroundAppAllergy);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void
+            testRead_inBgWithBgReadHasWriteAndReadPerms_canReadSelfDataAndOtherDataWithReadPerms()
+                    throws Exception {
+        // Given that we have two data sources from two apps with one vaccine and one allergy
+        // each and the calling app has READ_HEALTH_DATA_IN_BACKGROUND, WRITE_MEDICAL_DATA and
+        // READ_MEDICAL_DATA_VACCINES permissions
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource foregroundAppAllergy =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource backgroundAppAllergy =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+
+        // When the app tries to read all resources from the background
+        List<MedicalResource> responseResources =
+                PHR_BACKGROUND_APP.readMedicalResources(
+                        List.of(
+                                foregroundAppVaccine.getId(), foregroundAppAllergy.getId(),
+                                backgroundAppVaccine.getId(), backgroundAppAllergy.getId()));
+
+        // Then it receives all vaccine resources, but only the allergy resources written by
+        // itself
+        assertThat(responseResources)
+                .containsExactly(foregroundAppVaccine, backgroundAppVaccine, backgroundAppAllergy);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBackgoundWithNoPerms_throws() {
+        // App has not been granted any permissions.
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_BACKGROUND_APP.readMedicalResources(
+                                        List.of(getMedicalResourceId())));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains("Caller doesn't have permission to read or write medical data");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithoutBgReadOnlyWritePerm_onlyReturnsDataFromOwnDataSources()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // calling app only has WRITE_MEDICAL_DATA permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        // When the app tries to read all resources from the background
+        List<MedicalResource> responseResources =
+                PHR_BACKGROUND_APP.readMedicalResources(
+                        List.of(foregroundAppVaccine.getId(), backgroundAppVaccine.getId()));
+
+        // Then it only receives its own resources
+        assertThat(responseResources).containsExactly(backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithoutBgReadOnlyReadPerm_onlyReturnsDataWithReadPerms()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine and one allergy
+        // each and the
+        // and the calling app only has READ_MEDICAL_DATA_VACCINES permissions
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource foregroundAppAllergy =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource backgroundAppAllergy =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+
+        revokePermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        // When the app tries to read all resources from the background
+        List<MedicalResource> responseResources =
+                PHR_BACKGROUND_APP.readMedicalResources(
+                        List.of(
+                                foregroundAppVaccine.getId(), foregroundAppAllergy.getId(),
+                                backgroundAppVaccine.getId(), backgroundAppAllergy.getId()));
+
+        // Then it only receives its own vaccine resources
+        assertThat(responseResources).containsExactly(backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadPermissionMapping_eachPermissionOnlyGivesAccessToSpecificData()
+            throws Exception {
+        List<MedicalResourceId> allInsertedIds =
+                mUtil.insertSourceAndOneResourcePerPermissionCategory(PHR_BACKGROUND_APP);
+        Map<String, Integer> permissionToExpectedMedicalResourceTypeMap =
+                Map.ofEntries(
+                        Map.entry(READ_MEDICAL_DATA_VACCINES, MEDICAL_RESOURCE_TYPE_VACCINES),
+                        Map.entry(
+                                READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
+                        Map.entry(READ_MEDICAL_DATA_CONDITIONS, MEDICAL_RESOURCE_TYPE_CONDITIONS),
+                        Map.entry(READ_MEDICAL_DATA_MEDICATIONS, MEDICAL_RESOURCE_TYPE_MEDICATIONS),
+                        Map.entry(
+                                READ_MEDICAL_DATA_PERSONAL_DETAILS,
+                                MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS),
+                        Map.entry(
+                                READ_MEDICAL_DATA_PRACTITIONER_DETAILS,
+                                MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS),
+                        Map.entry(READ_MEDICAL_DATA_VISITS, MEDICAL_RESOURCE_TYPE_VISITS),
+                        Map.entry(READ_MEDICAL_DATA_PROCEDURES, MEDICAL_RESOURCE_TYPE_PROCEDURES),
+                        Map.entry(READ_MEDICAL_DATA_PREGNANCY, MEDICAL_RESOURCE_TYPE_PREGNANCY),
+                        Map.entry(
+                                READ_MEDICAL_DATA_SOCIAL_HISTORY,
+                                MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY),
+                        Map.entry(READ_MEDICAL_DATA_VITAL_SIGNS, MEDICAL_RESOURCE_TYPE_VITAL_SIGNS),
+                        Map.entry(
+                                READ_MEDICAL_DATA_LABORATORY_RESULTS,
+                                MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS));
+
+        // When permissions are granted for one category at a time, then only that category will be
+        // returned
+        for (String permission : permissionToExpectedMedicalResourceTypeMap.keySet()) {
+            int expectedResourceType = permissionToExpectedMedicalResourceTypeMap.get(permission);
+            grantPermission(PHR_FOREGROUND_APP.getPackageName(), permission);
+
+            List<MedicalResource> returnedResources =
+                    PHR_FOREGROUND_APP.readMedicalResources(allInsertedIds);
+
+            assertWithMessage("Reading data with permission: " + permission)
+                    .that(returnedResources)
+                    .hasSize(1);
+            assertThat(returnedResources.get(0).getType()).isEqualTo(expectedResourceType);
+
+            revokePermission(PHR_FOREGROUND_APP.getPackageName(), permission);
+        }
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/ReadMedicalResourcesByRequestCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/ReadMedicalResourcesByRequestCtsTest.java
new file mode 100644
index 0000000..4128521
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/ReadMedicalResourcesByRequestCtsTest.java
@@ -0,0 +1,1191 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_CONDITIONS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_READ_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MEDICAL_RESOURCE_TYPES_LIST;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.utils.DataFactory.MAXIMUM_PAGE_SIZE;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokePermission;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_READ_MEDICAL_RESOURCES_FIX_QUERY_LIMIT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.ReadMedicalResourcesInitialRequest;
+import android.health.connect.ReadMedicalResourcesPageRequest;
+import android.health.connect.ReadMedicalResourcesResponse;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Base64;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
+@RunWith(AndroidJUnit4.class)
+public class ReadMedicalResourcesByRequestCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private PhrCtsTestUtils mUtil;
+
+    private HealthConnectManager mManager;
+
+    @Before
+    public void setUp() throws InterruptedException {
+        // To make sure we don't leave any state behind after running each test.
+        revokeAllPermissions(PHR_BACKGROUND_APP.getPackageName(), "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP.getPackageName(), "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mUtil = new PhrCtsTestUtils(TestUtils.getHealthConnectManager());
+        mUtil.deleteAllMedicalData();
+        mManager = TestUtils.getHealthConnectManager();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_migrationInProgress_apiBlocked()
+            throws InterruptedException {
+        startMigrationWithShellPermissionIdentity();
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+
+        mManager.readMedicalResources(request, executor, receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_readLimitExceeded_throws()
+            throws InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(PhrDataFactory.getCreateMedicalDataSourceRequest());
+        MedicalResource resource =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        // Make the maximum number of calls allowed by quota
+        int maximumCalls = MAX_FOREGROUND_READ_CALL_15M / mUtil.mLimitsAdjustmentForTesting;
+        float remainingQuota =
+                mUtil.tryAcquireCallQuotaNTimesForRead(dataSource, List.of(resource), maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+        }
+
+        HealthConnectException exception = receiver.assertAndGetException();
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_unknownTypeInPageRequest_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        // Encode a page token according to PhrPageTokenWrapper#encode(), with medicalResourceType
+        // being unknown type 0.
+        String pageTokenStringWithUnknownType = "2,0,";
+        Base64.Encoder encoder = Base64.getEncoder();
+        String pageToken = encoder.encodeToString(pageTokenStringWithUnknownType.getBytes());
+        ReadMedicalResourcesPageRequest request =
+                new ReadMedicalResourcesPageRequest.Builder(pageToken).build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_emptyPageTokenInPageRequest_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesPageRequest request =
+                new ReadMedicalResourcesPageRequest.Builder("").build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_invalidDataSourceIdsByReflection_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+
+        setFieldValueUsingReflection(request, "mDataSourceIds", Set.of("invalid id"));
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.readMedicalResources(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_invalidResourceTypeByReflection_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+
+        setFieldValueUsingReflection(request, "mMedicalResourceType", 100);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.readMedicalResources(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_invalidPageSizeByReflection_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        ReadMedicalResourcesPageRequest request =
+                new ReadMedicalResourcesPageRequest.Builder("").build();
+
+        setFieldValueUsingReflection(request, "mPageSize", MAXIMUM_PAGE_SIZE + 1);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.readMedicalResources(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_nullPageTokenInPageRequestByReflection_throws()
+            throws NoSuchFieldException, IllegalAccessException {
+        ReadMedicalResourcesPageRequest request =
+                new ReadMedicalResourcesPageRequest.Builder("").build();
+
+        setFieldValueUsingReflection(request, "mPageToken", null);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.readMedicalResources(
+                                request,
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_noData_returnsEmptyList()
+            throws InterruptedException {
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        ReadMedicalResourcesResponse response = receiver.getResponse();
+        assertThat(response.getMedicalResources()).isEmpty();
+        assertThat(response.getNextPageToken()).isNull();
+        assertThat(response.getRemainingCount()).isEqualTo(0);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_noDataForResourceTypeAndDataSource_ReturnsEmpty()
+            throws InterruptedException {
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addDataSourceId(UUID.randomUUID().toString())
+                        .build();
+
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
+
+        ReadMedicalResourcesResponse response = receiver.getResponse();
+        assertThat(response.getMedicalResources()).isEmpty();
+        assertThat(response.getNextPageToken()).isNull();
+        assertThat(response.getRemainingCount()).isEqualTo(0);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_filtersByMedicalResourceType()
+            throws InterruptedException {
+        // Given we have three vaccines and one Allergy in two data sources
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        MedicalResource vaccine1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine3 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
+
+        // When we read vaccines with a page size of 2 and use the nextPageToken to read
+        // remaining vaccines
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest allVaccinesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setPageSize(2)
+                        .build();
+        mManager.readMedicalResources(
+                allVaccinesRequest, Executors.newSingleThreadExecutor(), receiver1);
+
+        String nextPageToken = receiver1.getResponse().getNextPageToken();
+        assertThat(nextPageToken).isNotEmpty();
+
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build(),
+                Executors.newSingleThreadExecutor(),
+                receiver2);
+
+        // Then the response gives two pages containing vaccines only, with page token 1
+        // linking to page 2
+        assertThat(receiver1.getResponse().getMedicalResources())
+                .containsExactly(vaccine1, vaccine2);
+        assertThat(receiver1.getResponse().getRemainingCount()).isEqualTo(1);
+
+        assertThat(receiver2.getResponse().getMedicalResources()).containsExactly(vaccine3);
+        assertThat(receiver2.getResponse().getNextPageToken()).isNull();
+        assertThat(receiver2.getResponse().getRemainingCount()).isEqualTo(0);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_filtersByMedicalResourceTypeAndOneDataSource()
+            throws InterruptedException {
+        // Given we have three vaccines in two data sources
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        MedicalResource vaccine1FromDataSource1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine2FromDataSource1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+
+        // When we read vaccines only from data source 1 in 2 pages.
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest vaccinesFromDataSource1Request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addDataSourceId(dataSource1.getId())
+                        .setPageSize(1)
+                        .build();
+        mManager.readMedicalResources(
+                vaccinesFromDataSource1Request, Executors.newSingleThreadExecutor(), receiver1);
+
+        String nextPageToken = receiver1.getResponse().getNextPageToken();
+        assertThat(nextPageToken).isNotEmpty();
+
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build(),
+                Executors.newSingleThreadExecutor(),
+                receiver2);
+
+        // Then the response gives two pages with results filtered by vaccine and data source 1
+        assertThat(receiver1.getResponse().getMedicalResources())
+                .containsExactly(vaccine1FromDataSource1);
+        assertThat(receiver1.getResponse().getRemainingCount()).isEqualTo(1);
+
+        assertThat(receiver2.getResponse().getMedicalResources())
+                .containsExactly(vaccine2FromDataSource1);
+        assertThat(receiver2.getResponse().getNextPageToken()).isNull();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_filtersByMedicalResourceTypeAndBothDataSources()
+            throws InterruptedException {
+        // Given we have two vaccines and one Allergy in two data sources
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        MedicalResource vaccineFromDataSource1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccineFromDataSource2 =
+                mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
+
+        // When we read vaccines only from both data sources in 2 pages
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest vaccinesFromBothDataSourcesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addDataSourceId(dataSource1.getId())
+                        .addDataSourceId(dataSource2.getId())
+                        .setPageSize(1)
+                        .build();
+        mManager.readMedicalResources(
+                vaccinesFromBothDataSourcesRequest, Executors.newSingleThreadExecutor(), receiver1);
+
+        String nextPageToken = receiver1.getResponse().getNextPageToken();
+        assertThat(nextPageToken).isNotEmpty();
+
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build(),
+                Executors.newSingleThreadExecutor(),
+                receiver2);
+
+        // Then we receive 2 pages containing vaccines from both data sources with page token
+        // 1 linking to page 2
+        assertThat(receiver1.getResponse().getMedicalResources())
+                .containsExactly(vaccineFromDataSource1);
+        assertThat(receiver1.getResponse().getRemainingCount()).isEqualTo(1);
+
+        assertThat(receiver2.getResponse().getMedicalResources())
+                .containsExactly(vaccineFromDataSource2);
+        assertThat(receiver2.getResponse().getNextPageToken()).isNull();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_hasManagementPermission_succeeds()
+            throws InterruptedException {
+        // Given we have two vaccines in one data source
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalResource vaccine1 =
+                mUtil.upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource vaccine2 =
+                mUtil.upsertMedicalData(dataSource.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+
+        // When we read vaccines with MANAGE_HEALTH_DATA permission in 2 pages
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest vaccinesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setPageSize(1)
+                        .build();
+        runWithShellPermissionIdentity(
+                () ->
+                        mManager.readMedicalResources(
+                                vaccinesRequest, Executors.newSingleThreadExecutor(), receiver1),
+                MANAGE_HEALTH_DATA);
+
+        String nextPageToken = receiver1.getResponse().getNextPageToken();
+        assertThat(nextPageToken).isNotEmpty();
+
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
+                new HealthConnectReceiver<>();
+        runWithShellPermissionIdentity(
+                () ->
+                        mManager.readMedicalResources(
+                                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build(),
+                                Executors.newSingleThreadExecutor(),
+                                receiver2),
+                MANAGE_HEALTH_DATA);
+
+        // The we receive two pages containing all vaccines, with page token 1 linking to page
+        // 2
+        assertThat(receiver2.getResponse().getMedicalResources()).containsExactly(vaccine2);
+        assertThat(receiver2.getResponse().getNextPageToken()).isNull();
+
+        assertThat(receiver1.getResponse().getMedicalResources()).containsExactly(vaccine1);
+        assertThat(receiver1.getResponse().getRemainingCount()).isEqualTo(1);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_setPageSizeOnPageRequest_succeeds()
+            throws InterruptedException {
+        // Given we have six vaccines in three data source
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        MedicalDataSource dataSource3 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("3"));
+        mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource3.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource3.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+
+        // When we read all vaccines in two pages and specify a page size on the page request
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest vaccinesRequestWithPageSize1 =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setPageSize(1)
+                        .build();
+        mManager.readMedicalResources(
+                vaccinesRequestWithPageSize1, Executors.newSingleThreadExecutor(), receiver1);
+
+        String nextPageToken = receiver1.getResponse().getNextPageToken();
+        assertThat(nextPageToken).isNotEmpty();
+
+        ReadMedicalResourcesPageRequest pageRequestWithPageSize2 =
+                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).setPageSize(2).build();
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                pageRequestWithPageSize2, Executors.newSingleThreadExecutor(), receiver2);
+
+        // Then we receive two pages, with the correct page size
+        assertThat(receiver1.getResponse().getMedicalResources()).hasSize(1);
+        assertThat(receiver1.getResponse().getRemainingCount()).isEqualTo(5);
+
+        assertThat(receiver2.getResponse().getMedicalResources()).hasSize(2);
+        assertThat(receiver2.getResponse().getNextPageToken()).isNotEmpty();
+        assertThat(receiver2.getResponse().getRemainingCount()).isEqualTo(3);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_READ_MEDICAL_RESOURCES_FIX_QUERY_LIMIT
+    })
+    public void
+            testReadMedicalResourcesByRequest_moreTotalResourcesThanPageSize_returnsAllRequested()
+                    throws InterruptedException {
+        // Given we insert 2 Allergies followed by 2 Vaccines
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
+        mUtil.upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_ALLERGY);
+        mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+
+        // When we read all vaccines with page size 2
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest vaccinesRequestWithPageSize2 =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setPageSize(2)
+                        .build();
+        mManager.readMedicalResources(
+                vaccinesRequestWithPageSize2, Executors.newSingleThreadExecutor(), receiver);
+
+        // Then we receive all vaccines in one page
+        assertThat(receiver.getResponse().getMedicalResources()).hasSize(2);
+        assertThat(receiver.getResponse().getNextPageToken()).isNull();
+        assertThat(receiver.getResponse().getRemainingCount()).isEqualTo(0);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_dataDeletedAfterInitialRequest_correctRemaining()
+            throws InterruptedException {
+        // Given we have three vaccines in two data source
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        MedicalResource resource1 =
+                mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource resource2 =
+                mUtil.upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+        MedicalResource resource3 =
+                mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+
+        // When we read the first vaccine and then delete all vaccines
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest vaccinesRequestWithPageSize1 =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setPageSize(1)
+                        .build();
+        mManager.readMedicalResources(
+                vaccinesRequestWithPageSize1, Executors.newSingleThreadExecutor(), receiver1);
+
+        String nextPageToken = receiver1.getResponse().getNextPageToken();
+        assertThat(nextPageToken).isNotEmpty();
+
+        mUtil.deleteResources(List.of(resource1.getId(), resource2.getId(), resource3.getId()));
+
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build(),
+                Executors.newSingleThreadExecutor(),
+                receiver2);
+
+        // Then the second page read will return no vaccines with 0 remaining
+        assertThat(receiver1.getResponse().getMedicalResources()).hasSize(1);
+        assertThat(receiver1.getResponse().getRemainingCount()).isEqualTo(2);
+
+        assertThat(receiver2.getResponse().getMedicalResources()).hasSize(0);
+        assertThat(receiver2.getResponse().getNextPageToken()).isNull();
+        assertThat(receiver2.getResponse().getRemainingCount()).isEqualTo(0);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadMedicalResourcesByRequest_dataAddedAfterInitialRequest_correctRemaining()
+            throws InterruptedException {
+        // Given we have two vaccines in two data source
+        MedicalDataSource dataSource1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1"));
+        MedicalDataSource dataSource2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2"));
+        mUtil.upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+
+        // When we read the first vaccine and then insert two more vaccines.
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
+                new HealthConnectReceiver<>();
+        ReadMedicalResourcesInitialRequest vaccinesRequestWithPageSize1 =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setPageSize(1)
+                        .build();
+        mManager.readMedicalResources(
+                vaccinesRequestWithPageSize1, Executors.newSingleThreadExecutor(), receiver1);
+
+        String nextPageToken = receiver1.getResponse().getNextPageToken();
+        assertThat(nextPageToken).isNotEmpty();
+
+        mUtil.upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
+        mUtil.upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
+
+        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).setPageSize(1).build(),
+                Executors.newSingleThreadExecutor(),
+                receiver2);
+
+        // Then the second page read will reflect the updated number of vaccines
+        assertThat(receiver1.getResponse().getMedicalResources()).hasSize(1);
+        assertThat(receiver1.getResponse().getRemainingCount()).isEqualTo(1);
+
+        assertThat(receiver2.getResponse().getMedicalResources()).hasSize(1);
+        assertThat(receiver2.getResponse().getNextPageToken()).isNotNull();
+        assertThat(receiver2.getResponse().getRemainingCount()).isEqualTo(2);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundWithNoPerms_throws() {
+        // App has not been granted any permissions.
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.readMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(
+                        "Caller doesn't have"
+                                + " android.permission.health.READ_MEDICAL_DATA_VACCINES to read"
+                                + " MedicalResource");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundWithReadPermNoWritePerm_canReadResourcesWithReadPerms()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // calling app only has READ_MEDICAL_DATA_VACCINES permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermissions(
+                PHR_FOREGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        revokePermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        // When the app reads all vaccine resources from the foreground
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        ReadMedicalResourcesResponse response = PHR_FOREGROUND_APP.readMedicalResources(request);
+
+        // Then it receives all vaccine resources
+        assertThat(response.getMedicalResources())
+                .containsExactly(foregroundAppVaccine, backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundWithReadPermNoWritePerm_throwsForResourcesWithoutReadPerms() {
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), READ_MEDICAL_DATA_VACCINES);
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.readMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(
+                        "Caller doesn't have"
+                            + " android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"
+                            + " to read MedicalResource");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundHasWritePermNoReadPerms_canReadDataFromOwnDataSources()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // calling app only has WRITE_MEDICAL_DATA permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        // When the app reads all vaccine resources from the foreground
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        ReadMedicalResourcesResponse response = PHR_FOREGROUND_APP.readMedicalResources(request);
+
+        // Then it only receives the vaccine resources written by itself
+        assertThat(response.getMedicalResources()).containsExactly(foregroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inForegroundHasWriteAndReadPerms_canReadSelfDataAndOtherDataWithReadPerms()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine and one allergy
+        // each and the calling app only has WRITE_MEDICAL_DATA and READ_MEDICAL_DATA_VACCINES
+        // permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermissions(
+                PHR_FOREGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource foregroundAppAllergy =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                backgroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+
+        // When the app reads vaccine resources and allergy resources from the foreground
+        ReadMedicalResourcesInitialRequest readVaccinesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        ReadMedicalResourcesInitialRequest readAllergiesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .build();
+        ReadMedicalResourcesResponse readVaccinesResponse =
+                PHR_FOREGROUND_APP.readMedicalResources(readVaccinesRequest);
+        ReadMedicalResourcesResponse readAllergiesResponse =
+                PHR_FOREGROUND_APP.readMedicalResources(readAllergiesRequest);
+
+        // Then it receives all vaccine resources, but only the allergy resources written by
+        // itself
+        assertThat(readVaccinesResponse.getMedicalResources())
+                .containsExactly(foregroundAppVaccine, backgroundAppVaccine);
+        assertThat(readAllergiesResponse.getMedicalResources())
+                .containsExactly(foregroundAppAllergy);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithBgReadNoOtherPerms_throws() {
+        // App has background read permissions, but no other permissions.
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), READ_HEALTH_DATA_IN_BACKGROUND);
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.readMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(
+                        "Caller doesn't have"
+                                + " android.permission.health.READ_MEDICAL_DATA_VACCINES to read"
+                                + " MedicalResource");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithBgReadHasReadPermNoWritePerm_canReadResourcesWithReadPerms()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // calling app has READ_HEALTH_DATA_IN_BACKGROUND and READ_MEDICAL_DATA_VACCINES
+        // permissions
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        revokePermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        // When the app reads all vaccine resources from the background
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        ReadMedicalResourcesResponse response = PHR_BACKGROUND_APP.readMedicalResources(request);
+
+        // Then it receives all vaccine resources
+        assertThat(response.getMedicalResources())
+                .containsExactly(foregroundAppVaccine, backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithBgReadHasReadPermNoWritePerm_throwsForResourceWithoutReadPerms() {
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(READ_HEALTH_DATA_IN_BACKGROUND, READ_MEDICAL_DATA_VACCINES));
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.readMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(
+                        "Caller doesn't have"
+                            + " android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"
+                            + " to read MedicalResource");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithBgReadHasWritePermNoReadPerms_canReadDataFromOwnDataSources()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // calling app only has READ_HEALTH_DATA_IN_BACKGROUND and WRITE_MEDICAL_DATA permissions
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_HEALTH_DATA_IN_BACKGROUND));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        // When the app reads all vaccine resources from the background
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        ReadMedicalResourcesResponse response = PHR_BACKGROUND_APP.readMedicalResources(request);
+
+        // Then it only receives the vaccine resources written by itself
+        assertThat(response.getMedicalResources()).containsExactly(backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void
+            testRead_inBgWithBgReadHasWriteAndReadPerms_canReadSelfDataAndOtherDataWithReadPerms()
+                    throws Exception {
+        // Given that we have two data sources from two apps with one vaccine and one allergy
+        // each and the calling app has READ_HEALTH_DATA_IN_BACKGROUND, WRITE_MEDICAL_DATA and
+        // READ_MEDICAL_DATA_VACCINES permissions
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(
+                        WRITE_MEDICAL_DATA,
+                        READ_HEALTH_DATA_IN_BACKGROUND,
+                        READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource foregroundAppVaccine =
+                PHR_FOREGROUND_APP.upsertMedicalResource(
+                        foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                foregroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalResource backgroundAppAllergy =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_ALLERGY);
+
+        // When the app reads vaccine resources and allergy resources from the background
+        ReadMedicalResourcesInitialRequest readVaccinesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        ReadMedicalResourcesInitialRequest readAllergiesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .build();
+        ReadMedicalResourcesResponse readVaccinesResponse =
+                PHR_BACKGROUND_APP.readMedicalResources(readVaccinesRequest);
+        ReadMedicalResourcesResponse readAllergiesResponse =
+                PHR_BACKGROUND_APP.readMedicalResources(readAllergiesRequest);
+
+        // Then it receives all vaccine resources, but only the allergy resources written by
+        // itself
+        assertThat(readVaccinesResponse.getMedicalResources())
+                .containsExactly(foregroundAppVaccine, backgroundAppVaccine);
+        assertThat(readAllergiesResponse.getMedicalResources())
+                .containsExactly(backgroundAppAllergy);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBackgoundWithNoPerms_throws() {
+        // App has not been granted any permissions.
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.readMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(
+                        "Caller doesn't have"
+                                + " android.permission.health.READ_MEDICAL_DATA_VACCINES to read"
+                                + " MedicalResource");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithoutBgReadOnlyWritePerm_canReadDataFromOwnDataSources()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // calling app only has WRITE_MEDICAL_DATA permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        // When the app reads all vaccine resources from the background
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        ReadMedicalResourcesResponse response = PHR_BACKGROUND_APP.readMedicalResources(request);
+
+        // Then it only receives the vaccine resources written by itself
+        assertThat(response.getMedicalResources()).containsExactly(backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithoutBgReadOnlyReadPerm_canReadOwnDataWithReadPerms()
+            throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // and the calling app only has READ_MEDICAL_DATA_VACCINES permissions
+        grantPermissions(
+                PHR_BACKGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource backgroundAppVaccine =
+                PHR_BACKGROUND_APP.upsertMedicalResource(
+                        backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        revokePermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        // When the app reads vaccine resources from the background
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build();
+        ReadMedicalResourcesResponse response = PHR_BACKGROUND_APP.readMedicalResources(request);
+
+        // Then it receives only receives its own vaccine resources
+        assertThat(response.getMedicalResources()).containsExactly(backgroundAppVaccine);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_inBgWithoutBgReadOnlyReadPerm_throwsForResourcesWithoutReadPerms() {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), READ_MEDICAL_DATA_VACCINES);
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .build();
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_BACKGROUND_APP.readMedicalResources(request));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(
+                        "Caller doesn't have"
+                            + " android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"
+                            + " to read MedicalResource");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testRead_readPermRemovedBeforePageRequest_throws() throws Exception {
+        // Given that we have two data sources from two apps with one vaccine each and the
+        // and the calling app has READ_MEDICAL_DATA_VACCINES permissions
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        grantPermissions(
+                PHR_FOREGROUND_APP.getPackageName(),
+                List.of(WRITE_MEDICAL_DATA, READ_MEDICAL_DATA_VACCINES));
+
+        MedicalDataSource foregroundAppDataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        PHR_FOREGROUND_APP.upsertMedicalResource(
+                foregroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+        MedicalDataSource backgroundAppDataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        PHR_BACKGROUND_APP.upsertMedicalResource(
+                backgroundAppDataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        revokePermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        // When the app reads the first vaccine, but loses read permissions before the second
+        // page read
+        ReadMedicalResourcesInitialRequest initialRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setPageSize(1)
+                        .build();
+        ReadMedicalResourcesResponse initialResponse =
+                PHR_FOREGROUND_APP.readMedicalResources(initialRequest);
+        revokePermission(PHR_FOREGROUND_APP.getPackageName(), READ_MEDICAL_DATA_VACCINES);
+        String nextPageToken = initialResponse.getNextPageToken();
+        assertThat(nextPageToken).isNotNull();
+        ReadMedicalResourcesPageRequest pageRequest =
+                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build();
+
+        // Then an exception is thrown on the second page read
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () -> PHR_FOREGROUND_APP.readMedicalResources(pageRequest));
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(
+                        "Caller doesn't have"
+                                + " android.permission.health.READ_MEDICAL_DATA_VACCINES"
+                                + " to read MedicalResource");
+    }
+
+    // We are only testing permission mapping for one type here, because testing all permissions
+    // in one test leads to presubmit test timeout. The full list of read permission mappings is
+    // tested in the ReadMedicalResourcesByIdsCtsTest.
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testReadPermissionMapping_permission_onlyGivesAccessToSpecificData()
+            throws Exception {
+        mUtil.insertSourceAndOneResourcePerPermissionCategory(PHR_BACKGROUND_APP);
+
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), READ_MEDICAL_DATA_CONDITIONS);
+        Set<Integer> notPermittedTypes = new HashSet<>(MEDICAL_RESOURCE_TYPES_LIST);
+        notPermittedTypes.remove(Integer.valueOf(MEDICAL_RESOURCE_TYPE_CONDITIONS));
+
+        assertThat(
+                        PHR_FOREGROUND_APP
+                                .readMedicalResources(
+                                        new ReadMedicalResourcesInitialRequest.Builder(
+                                                        MEDICAL_RESOURCE_TYPE_CONDITIONS)
+                                                .build())
+                                .getMedicalResources()
+                                .get(0)
+                                .getType())
+                .isEqualTo(MEDICAL_RESOURCE_TYPE_CONDITIONS);
+        for (int medicalResourceType : notPermittedTypes) {
+            ReadMedicalResourcesInitialRequest request =
+                    new ReadMedicalResourcesInitialRequest.Builder(medicalResourceType).build();
+            assertThrows(
+                    "Reading medicalResourceType: " + medicalResourceType,
+                    HealthConnectException.class,
+                    () -> PHR_FOREGROUND_APP.readMedicalResources(request));
+        }
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/apis/UpsertMedicalResourcesCtsTest.java b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/UpsertMedicalResourcesCtsTest.java
new file mode 100644
index 0000000..5067951
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/apis/UpsertMedicalResourcesCtsTest.java
@@ -0,0 +1,1324 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.phr.apis;
+
+import static android.health.connect.HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.CHUNK_SIZE_LIMIT_IN_BYTES;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.MAX_FOREGROUND_WRITE_CALL_15M;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_BACKGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.PHR_FOREGROUND_APP_PKG;
+import static android.healthconnect.cts.phr.utils.PhrCtsTestUtils.RECORD_SIZE_LIMIT_IN_BYTES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_ID_EMPTY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_UNSUPPORTED_RESOURCE_TYPE;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4B;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_UNSUPPORTED;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createUpdatedVaccineMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createVaccineMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getUpsertMedicalResourceRequest;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
+import static android.healthconnect.cts.utils.PermissionHelper.revokePermission;
+import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
+import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
+import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_FHIR_STRUCTURAL_VALIDATION;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_UPSERT_FIX_PARCEL_SIZE_CALCULATION;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_UPSERT_FIX_USE_SHARED_MEMORY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+
+import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.UpsertMedicalResourceRequest;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.AllergyBuilder;
+import android.healthconnect.cts.phr.utils.ImmunizationBuilder;
+import android.healthconnect.cts.phr.utils.MedicationsBuilder;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.healthconnect.cts.utils.TestUtils;
+import android.os.Parcel;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.compatibility.common.util.SystemUtil;
+
+import com.google.common.base.Strings;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Executors;
+
+@RunWith(AndroidJUnit4.class)
+public class UpsertMedicalResourcesCtsTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mUtil;
+
+    @Before
+    public void before() throws InterruptedException {
+        // To make sure we don't leave any state behind after running each test.
+        revokeAllPermissions(PHR_BACKGROUND_APP.getPackageName(), "to test specific permissions");
+        revokeAllPermissions(PHR_FOREGROUND_APP.getPackageName(), "to test specific permissions");
+        TestUtils.deleteAllStagedRemoteData();
+        mManager = TestUtils.getHealthConnectManager();
+        mUtil = new PhrCtsTestUtils(mManager);
+        mUtil.deleteAllMedicalData();
+        if (TestUtils.setLowerRateLimitsForTesting(true)) {
+            // 10 comes from the setLowerRateLimitsForTesting method in RateLimiter.
+            mUtil.mLimitsAdjustmentForTesting = 10;
+        }
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        mUtil.deleteAllMedicalData();
+        TestUtils.setLowerRateLimitsForTesting(false);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_migrationInProgress_apiBlocked()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        List<UpsertMedicalResourceRequest> requests = List.of(getUpsertMedicalResourceRequest());
+        startMigrationWithShellPermissionIdentity();
+
+        mManager.upsertMedicalResources(requests, newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(ERROR_DATA_SYNC_IN_PROGRESS);
+
+        finishMigrationWithShellPermissionIdentity();
+    }
+
+    // TODO(b/370731291): Investigate and add tests against rolling memory limit
+    // QUOTA_BUCKET_DATA_PUSH_LIMIT_PER_APP_15M and QUOTA_BUCKET_DATA_PUSH_LIMIT_ACROSS_APPS_15M.
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_writeLimitExceeded_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        // Make the maximum number of calls allowed by quota. Minus 1 because of the above call.
+        int maximumCalls = MAX_FOREGROUND_WRITE_CALL_15M / mUtil.mLimitsAdjustmentForTesting - 1;
+        float remainingQuota = mUtil.tryAcquireCallQuotaNTimesForWrite(dataSource, maximumCalls);
+
+        // Exceed the quota by using up any remaining quota that accumulated during the previous
+        // calls and make one additional call.
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+        int additionalCalls = (int) Math.ceil(remainingQuota) + 1;
+        for (int i = 0; i < additionalCalls; i++) {
+            mManager.upsertMedicalResources(
+                    List.of(request), Executors.newSingleThreadExecutor(), receiver);
+        }
+
+        HealthConnectException exception = receiver.assertAndGetException();
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage()).contains("API call quota exceeded");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_singleRequestSizeLimitExceeded_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        // Divided by 2 because string size is 2 bytes per char.
+        int nCharacters = RECORD_SIZE_LIMIT_IN_BYTES / mUtil.mLimitsAdjustmentForTesting / 2;
+        String data = Strings.repeat("0", nCharacters + 1);
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(DATA_SOURCE_ID, FHIR_VERSION_R4, data)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        HealthConnectException exception = receiver.assertAndGetException();
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage())
+                .contains("Record size exceeded the single record size limit");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_UPSERT_FIX_PARCEL_SIZE_CALCULATION
+    })
+    public void testUpsertMedicalResources_underMemoryChunkSizeLimit_succeeds()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String dataSourceId = mUtil.createDataSource(getCreateMedicalDataSourceRequest()).getId();
+        int maxChunkSize = CHUNK_SIZE_LIMIT_IN_BYTES / mUtil.mLimitsAdjustmentForTesting;
+        // Calculate the number of requests needed to almost reach the maxChunkSize by looking at
+        // the dataSize of a request.
+        UpsertMedicalResourceRequest request =
+                makeImmunizationUpsertRequest(dataSourceId, "resource_id");
+        Parcel parcel = Parcel.obtain();
+        request.writeToParcel(parcel, 0);
+        int requestSize = parcel.dataSize();
+        // We take the quotient and ignore the remainder of the division to get the number of
+        // resources to stay under the memory limit.
+        int nResources = maxChunkSize / requestSize;
+
+        List<UpsertMedicalResourceRequest> requests = new ArrayList<>();
+        for (int i = 0; i < nResources; i++) {
+            requests.add(makeImmunizationUpsertRequest(dataSourceId, String.valueOf(i)));
+        }
+        mManager.upsertMedicalResources(requests, Executors.newSingleThreadExecutor(), receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_UPSERT_FIX_PARCEL_SIZE_CALCULATION
+    })
+    public void testUpsertMedicalResources_memoryChunkSizeLimitExceeded_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, new ImmunizationBuilder().toJson())
+                        .build();
+        int maxChunkSize = CHUNK_SIZE_LIMIT_IN_BYTES / mUtil.mLimitsAdjustmentForTesting;
+        // Calculate the number of requests needed to reach the maxChunkSize by looking at the
+        // dataSize of the request.
+        Parcel parcel = Parcel.obtain();
+        request.writeToParcel(parcel, 0);
+        int requestSize = parcel.dataSize();
+        // Taking the quotient and ignoring the remainder of the division gets us the number of
+        // resources to stay within the memory limit. Then we add one more to exceed the limit.
+        int nCopies = maxChunkSize / requestSize + 1;
+
+        mManager.upsertMedicalResources(
+                Collections.nCopies(nCopies, request),
+                Executors.newSingleThreadExecutor(),
+                receiver);
+
+        HealthConnectException exception = receiver.assertAndGetException();
+        assertThat(exception.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_RATE_LIMIT_EXCEEDED);
+        assertThat(exception.getMessage())
+                .contains("Records chunk size exceeded the max chunk limit");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_UPSERT_FIX_PARCEL_SIZE_CALCULATION
+    })
+    public void testUpsertMedicalResources_insert500kbOfData_succeeds()
+            throws InterruptedException {
+        TestUtils.setLowerRateLimitsForTesting(false);
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String dataSourceId = mUtil.createDataSource(getCreateMedicalDataSourceRequest()).getId();
+        // Without writing the upsert requests to shared memory, we are able to insert around
+        // 500kb before getting an exception "android.os.TransactionTooLargeException: data parcel
+        // size". The test below tests writing 2mb of data with shared memory enabled.
+        int sizeToInsert = 500000;
+        int totalRequestSize = 0;
+        int requestCounter = 0;
+        List<UpsertMedicalResourceRequest> requests = new ArrayList<>();
+        while (totalRequestSize < sizeToInsert) {
+            requestCounter++;
+            UpsertMedicalResourceRequest request =
+                    makeImmunizationUpsertRequest(dataSourceId, String.valueOf(requestCounter));
+            requests.add(request);
+            // Get the parcel size of the request and add it to the totalRequestSize
+            Parcel parcel = Parcel.obtain();
+            request.writeToParcel(parcel, 0);
+            totalRequestSize += parcel.dataSize();
+        }
+
+        mManager.upsertMedicalResources(requests, Executors.newSingleThreadExecutor(), receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_UPSERT_FIX_PARCEL_SIZE_CALCULATION,
+        FLAG_PHR_UPSERT_FIX_USE_SHARED_MEMORY
+    })
+    public void testUpsertMedicalResources_insert2mbOfDataTestingSharedMemory_succeeds()
+            throws InterruptedException {
+        TestUtils.setLowerRateLimitsForTesting(false);
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String dataSourceId = mUtil.createDataSource(getCreateMedicalDataSourceRequest()).getId();
+        int sizeToInsert = 2000000;
+        int totalRequestSize = 0;
+        int requestCounter = 0;
+        List<UpsertMedicalResourceRequest> requests = new ArrayList<>();
+        while (totalRequestSize < sizeToInsert) {
+            requestCounter++;
+            UpsertMedicalResourceRequest request =
+                    makeImmunizationUpsertRequest(dataSourceId, String.valueOf(requestCounter));
+            requests.add(request);
+            // Get the parcel size of the request and add it to the totalRequestSize
+            Parcel parcel = Parcel.obtain();
+            request.writeToParcel(parcel, 0);
+            totalRequestSize += parcel.dataSize();
+        }
+
+        mManager.upsertMedicalResources(requests, Executors.newSingleThreadExecutor(), receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+        assertThat(receiver.getResponse().size()).isAtLeast(500);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_forOwnDataSource_succeedsAndInserts()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        MedicalResource expectedResource = createVaccineMedicalResource(dataSource.getId());
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(),
+                                FHIR_VERSION_R4,
+                                expectedResource.getFhirResource().getData())
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+        assertThat(receiver.getResponse()).hasSize(1);
+        assertThat(receiver.getResponse()).containsExactly(expectedResource);
+        // Verifies the inserted resource exists.
+        HealthConnectReceiver<List<MedicalResource>> resourceReadReceiver =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(receiver.getResponse().get(0).getId()),
+                Executors.newSingleThreadExecutor(),
+                resourceReadReceiver);
+        assertThat(resourceReadReceiver.getResponse()).containsExactly(expectedResource);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_forOwnDataSourceAndExistingData_succeedsAndUpdates()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        MedicalResource resourceBeforeUpdate = createVaccineMedicalResource(dataSource.getId());
+        MedicalResource expectedUpdatedResource =
+                createUpdatedVaccineMedicalResource(dataSource.getId());
+        UpsertMedicalResourceRequest insertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(),
+                                FHIR_VERSION_R4,
+                                resourceBeforeUpdate.getFhirResource().getData())
+                        .build();
+        UpsertMedicalResourceRequest updateRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(),
+                                FHIR_VERSION_R4,
+                                expectedUpdatedResource.getFhirResource().getData())
+                        .build();
+
+        HealthConnectReceiver<List<MedicalResource>> receiver1 = new HealthConnectReceiver<>();
+        mManager.upsertMedicalResources(
+                List.of(insertRequest), Executors.newSingleThreadExecutor(), receiver1);
+        receiver1.verifyNoExceptionOrThrow();
+        HealthConnectReceiver<List<MedicalResource>> receiver2 = new HealthConnectReceiver<>();
+        mManager.upsertMedicalResources(
+                List.of(updateRequest), Executors.newSingleThreadExecutor(), receiver2);
+        receiver2.verifyNoExceptionOrThrow();
+
+        assertThat(receiver2.getResponse()).hasSize(1);
+        assertThat(receiver2.getResponse()).containsExactly(expectedUpdatedResource);
+        // Verifies the updated resource exists.
+        assertThat(receiver1.getResponse()).hasSize(1);
+        HealthConnectReceiver<List<MedicalResource>> resourceReadReceiver =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(
+                List.of(receiver1.getResponse().get(0).getId()),
+                Executors.newSingleThreadExecutor(),
+                resourceReadReceiver);
+        assertThat(resourceReadReceiver.getResponse()).containsExactly(expectedUpdatedResource);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    public void testUpsertMedicalResources_validationEnabledUnknownField_throws() throws Exception {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder().set("unknown_field", "value").toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    public void testUpsertMedicalResources_nonPrimitiveFieldWithUnderscore_throws()
+            throws Exception {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        // The "identifier" field is of type "Identifier", which is a complex type and not a
+        // primitive type. Since only primitive types can have primitive type extensions (fields
+        // starting with "_") this is not a valid field.
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .set("_identifier", new JSONObject("{\"value\": \"test\"}"))
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    public void testUpsertMedicalResources_missingRequiredField_throws() throws Exception {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource = new ImmunizationBuilder().removeField("vaccineCode").toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    public void testUpsertMedicalResources_missingRequiredMultiTypeField_throws() throws Exception {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .removeField("occurrenceDateTime")
+                        .removeField("occurrenceString")
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    public void testUpsertMedicalResources_multipleMultiTypeFieldsSet_throws() throws Exception {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .set("occurrenceDateTime", "2023")
+                        .set("occurrenceString", "last year")
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION
+    })
+    public void testUpsertMedicalResources_onlyPrimitiveTypeExtensionPresentForRequired_succeeds()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .removeField("status")
+                        .set("_status", new JSONObject("{\"id\": \"1234\"}"))
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).hasSize(1);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_resourceWithPrimitiveTypeExtension_succeeds()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .set("_status", new JSONObject("{\"id\": \"1234\"}"))
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).hasSize(1);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_primitiveTypeExtensionIsNull_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder().set("_status", JSONObject.NULL).toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_primitiveTypeIsNull_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder().set("status", JSONObject.NULL).toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_complexTypeIsNull_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder().set("statusReason", JSONObject.NULL).toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_primitiveTypeIsJsonObjectNotPrimitive_throws()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .set("status", new JSONObject("{\"id\": \"123\"}"))
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_primitiveTypeExtensionNotJsonObject_throws()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .set("_status", "simple_string_instead_of_expected_json_object")
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_complexTypeNotJsonObject_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .set("statusReason", "simple_string_instead_of_expected_json_object")
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_arrayFieldIsNotArray_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationResource =
+                new ImmunizationBuilder()
+                        .set("identifier", new JSONObject("{\"value\": \"123\"}"))
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_arrayOfPrimitiveTypeExtensions_succeeds()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String allergyResource =
+                new AllergyBuilder()
+                        .set("_category", new JSONArray("[{\"id\": \"123\"}, {\"id\": \"456\"}]"))
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, allergyResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).hasSize(1);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_arrayOfPrimitiveTypeExtensionsWithNulls_succeeds()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String allergyResource =
+                new AllergyBuilder()
+                        .set("_category", new JSONArray("[{\"id\": \"123\"}, null]"))
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, allergyResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).hasSize(1);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_arrayOfPrimitiveTypeArrayWithNulls_throws()
+            throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String allergyResource =
+                new AllergyBuilder().set("category", new JSONArray("[\"food\", null]")).toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, allergyResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION
+    })
+    public void testUpsertMedicalResources_arrayOfComplexTypeNotObject_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String allergyResource =
+                new AllergyBuilder()
+                        .set("identifier", new JSONArray("[\"simple_string\"]"))
+                        .toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, allergyResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_dataSourceOwnedByOtherApp_throws() throws Exception {
+        // Create data source with different package name
+        grantPermission(PHR_FOREGROUND_APP_PKG, WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_dataSourceDoesNotExist_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest = getUpsertMedicalResourceRequest();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testUpsertMedicalResources_emptyList_returnsEmptyList()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+
+        mManager.upsertMedicalResources(List.of(), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse()).isEmpty();
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_invalidDataSourceIdByReflection_throws()
+            throws Exception {
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        setFieldValueUsingReflection(request, "mDataSourceId", "invalid id");
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mManager.upsertMedicalResources(
+                                List.of(request),
+                                Executors.newSingleThreadExecutor(),
+                                new HealthConnectReceiver<>()));
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testUpsertMedicalResources_invalidJson_throws() throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID,
+                                FHIR_VERSION_R4,
+                                FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_missingResourceId_throws() throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID,
+                                FHIR_VERSION_R4,
+                                FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_nullResourceId_throws() throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationJson = new ImmunizationBuilder().set("id", JSONObject.NULL).toJson();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationJson)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_nullStringResourceId_succeeds()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationJson = new ImmunizationBuilder().set("id", "null").toJson();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationJson)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.getResponse().size()).isEqualTo(1);
+        assertThat(receiver.getResponse().get(0).getId().getFhirResourceId()).isEqualTo("null");
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_nonStringResourceId_throws()
+            throws InterruptedException {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String immunizationJson = new ImmunizationBuilder().set("id", 123).toJson();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationJson)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testUpsertMedicalResources_emptyResourceId_throws() throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION_ID_EMPTY)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testUpsertMedicalResources_missingResourceType_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID,
+                                FHIR_VERSION_R4,
+                                FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_multipleIdenticalUpsertRequests_throws()
+            throws InterruptedException {
+        String dataSourceId = mUtil.createDataSource(getCreateMedicalDataSourceRequest()).getId();
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSourceId, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest, upsertRequest),
+                Executors.newSingleThreadExecutor(),
+                receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_identicalUpsertRequestsButDifferentFhirVersion_throws()
+            throws InterruptedException {
+        String dataSourceId = mUtil.createDataSource(getCreateMedicalDataSourceRequest()).getId();
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest1 =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSourceId, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+        UpsertMedicalResourceRequest upsertRequest2 =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSourceId, FHIR_VERSION_R4B, FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest1, upsertRequest2),
+                Executors.newSingleThreadExecutor(),
+                receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void
+            testUpsertMedicalResources_identicalUpsertRequestsButDifferentResourceType_succeeds()
+                    throws InterruptedException {
+        String dataSourceId = mUtil.createDataSource(getCreateMedicalDataSourceRequest()).getId();
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        String id = "id-1";
+        UpsertMedicalResourceRequest upsertRequest1 =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSourceId,
+                                FHIR_VERSION_R4,
+                                new ImmunizationBuilder().setId(id).toJson())
+                        .build();
+        UpsertMedicalResourceRequest upsertRequest2 =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSourceId,
+                                FHIR_VERSION_R4,
+                                new AllergyBuilder().setId(id).toJson())
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest1, upsertRequest2),
+                Executors.newSingleThreadExecutor(),
+                receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+        assertThat(receiver.getResponse()).hasSize(2);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_identicalUpsertRequestsButDifferentDataSource_succeeds()
+            throws InterruptedException {
+        String dataSourceId1 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("1")).getId();
+        String dataSourceId2 =
+                mUtil.createDataSource(getCreateMedicalDataSourceRequest("2")).getId();
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest1 =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSourceId1, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+        UpsertMedicalResourceRequest upsertRequest2 =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSourceId2, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest1, upsertRequest2),
+                Executors.newSingleThreadExecutor(),
+                receiver);
+
+        receiver.verifyNoExceptionOrThrow();
+        assertThat(receiver.getResponse()).hasSize(2);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testUpsertMedicalResources_unsupportedResourceType_throws()
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID,
+                                FHIR_VERSION_R4,
+                                FHIR_DATA_IMMUNIZATION_UNSUPPORTED_RESOURCE_TYPE)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    public void testUpsertMedicalResources_resourceIncludesContainedResource_throws()
+            throws InterruptedException {
+        String medicationStatementWithContainedResource =
+                new MedicationsBuilder.MedicationStatementR4Builder()
+                        .setContainedMedication(new MedicationsBuilder.MedicationBuilder())
+                        .toJson();
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID,
+                                FHIR_VERSION_R4,
+                                medicationStatementWithContainedResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    public void testUpsertMedicalResources_containedFieldIsNotArray_throws()
+            throws InterruptedException, JSONException {
+        String medicationStatementWithContainedResource =
+                new MedicationsBuilder.MedicationStatementR4Builder()
+                        .set("contained", new JSONObject("{}"))
+                        .toJson();
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID,
+                                FHIR_VERSION_R4,
+                                medicationStatementWithContainedResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION,
+        FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION,
+    })
+    public void testUpsertMedicalResources_primitiveValidationFails_throws() throws Exception {
+        MedicalDataSource dataSource = mUtil.createDataSource(getCreateMedicalDataSourceRequest());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        // The "primarySource" field is of primitive type "boolean" and cannot be a string.
+        String immunizationResource =
+                new ImmunizationBuilder().set("primarySource", "true").toJson();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4, immunizationResource)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testUpsertMedicalResources_unsupportedVersion_throws() throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_UNSUPPORTED, FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_hasDataManagementPermission_throws() {
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+
+        SystemUtil.runWithShellPermissionIdentity(
+                () -> {
+                    mManager.upsertMedicalResources(
+                            List.of(getUpsertMedicalResourceRequest()),
+                            Executors.newSingleThreadExecutor(),
+                            receiver);
+                    assertThat(receiver.assertAndGetException().getErrorCode())
+                            .isEqualTo(HealthConnectException.ERROR_SECURITY);
+                },
+                MANAGE_HEALTH_DATA);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_fhirVersionNotMatchingDataSource_throws()
+            throws InterruptedException {
+        MedicalDataSource dataSource =
+                mUtil.createDataSource(
+                        new CreateMedicalDataSourceRequest.Builder(
+                                        DATA_SOURCE_FHIR_BASE_URI,
+                                        DATA_SOURCE_DISPLAY_NAME,
+                                        FHIR_VERSION_R4)
+                                .build());
+        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                dataSource.getId(), FHIR_VERSION_R4B, FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        mManager.upsertMedicalResources(
+                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
+
+        assertThat(receiver.assertAndGetException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_inForegroundNoWritePerms_throws() throws Exception {
+        grantPermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource =
+                PHR_FOREGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        revokePermission(PHR_FOREGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_FOREGROUND_APP.upsertMedicalResource(
+                                        dataSource.getId(), FHIR_DATA_IMMUNIZATION));
+
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResources_inBackgroundNoWritePerms_throws() throws Exception {
+        grantPermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+        MedicalDataSource dataSource =
+                PHR_BACKGROUND_APP.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        revokePermission(PHR_BACKGROUND_APP.getPackageName(), WRITE_MEDICAL_DATA);
+
+        HealthConnectException exception =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                PHR_BACKGROUND_APP.upsertMedicalResource(
+                                        dataSource.getId(), FHIR_DATA_IMMUNIZATION));
+
+        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    private static UpsertMedicalResourceRequest makeImmunizationUpsertRequest(
+            String dataSourceId, String resourceId) {
+        return new UpsertMedicalResourceRequest.Builder(
+                        dataSourceId,
+                        FHIR_VERSION_R4,
+                        new ImmunizationBuilder().setId(resourceId).toJson())
+                .build();
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/AllergyBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/AllergyBuilder.java
new file mode 100644
index 0000000..acf5290
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/AllergyBuilder.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+/**
+ * A helper class that supports making FHIR AllergyIntolerance data for tests.
+ *
+ * <p>The Default result will be a valid FHIR AllergyIntolerance, but that is all that should be
+ * relied upon. Anything else that is relied upon by a test should be set by one of the methods.
+ */
+public final class AllergyBuilder extends FhirResourceBuilder<AllergyBuilder> {
+    private static final String DEFAULT_JSON =
+            "{"
+                    + "  \"resourceType\": \"AllergyIntolerance\","
+                    + "  \"id\": \"allergyintolerance-1\","
+                    + "  \"type\": \"allergy\","
+                    + "  \"category\": ["
+                    + "    \"medication\""
+                    + "  ],"
+                    + "  \"criticality\": \"high\","
+                    + "  \"code\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\": \"http://snomed.info/sct\","
+                    + "        \"code\": \"91936005\","
+                    + "        \"display\": \"Penicillin allergy\""
+                    + "      }"
+                    + "    ],"
+                    + "    \"text\": \"Penicillin allergy\""
+                    + "  },"
+                    + "  \"onsetDateTime\": \"1982\","
+                    + "  \"recordedDate\": \"2015-10-09T14:58:00+00:00\","
+                    + "  \"recorder\": {"
+                    + "    \"display\": \"Dr Jose Rodriguez\""
+                    + "  },"
+                    + "  \"asserter\": {"
+                    + "    \"reference\": \"Patient/patient-1\""
+                    + "  },"
+                    + "  \"lastOccurrence\": \"2015-10-09\","
+                    + "  \"note\": ["
+                    + "    {"
+                    + "      \"text\": \"The criticality is high because of previous reaction\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"reaction\": ["
+                    + "    {"
+                    + "      \"substance\": {"
+                    + "        \"coding\": ["
+                    + "          {"
+                    + "            \"system\": \"http://snomed.info/sct\","
+                    + "            \"code\": \"39359008\","
+                    + "            \"display\": \"Penicillin V-containing product\""
+                    + "          }"
+                    + "        ]"
+                    + "      },"
+                    + "      \"manifestation\": ["
+                    + "        {"
+                    + "          \"coding\": ["
+                    + "            {"
+                    + "              \"system\": \"http://snomed.info/sct\","
+                    + "              \"code\": \"39579001\","
+                    + "              \"display\": \"Anaphylactic reaction\""
+                    + "            }"
+                    + "          ]"
+                    + "        }"
+                    + "      ],"
+                    + "      \"severity\": \"severe\","
+                    + "      \"exposureRoute\": {"
+                    + "        \"coding\": ["
+                    + "          {"
+                    + "            \"system\": \"http://snomed.info/sct\","
+                    + "            \"code\": \"26643006\","
+                    + "            \"display\": \"Oral use\""
+                    + "          }"
+                    + "        ]"
+                    + "      }"
+                    + "    }"
+                    + "  ],"
+                    + "  \"patient\": {"
+                    + "    \"reference\": \"Patient/patient-1\","
+                    + "    \"display\": \"Example, Anne\""
+                    + "  }"
+                    + "}";
+
+    /**
+     * Creates a default valid FHIR AllergyIntolerance.
+     *
+     * <p>All that should be relied on is that the AllergyIntolerance is valid. To rely on anything
+     * else set it with the other methods.
+     */
+    public AllergyBuilder() {
+        super(DEFAULT_JSON);
+    }
+
+    @Override
+    protected AllergyBuilder returnThis() {
+        return this;
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ConditionBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ConditionBuilder.java
new file mode 100644
index 0000000..633e01c
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ConditionBuilder.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+/**
+ * A helper class that supports making FHIR Condition data for tests.
+ *
+ * <p>The Default result will be a valid FHIR Condition, but that is all that should be relied upon.
+ * Anything else that is relied upon by a test should be set by one of the methods.
+ */
+public final class ConditionBuilder extends FhirResourceBuilder<ConditionBuilder> {
+    private static final String DEFAULT_JSON =
+            "{"
+                    + "  \"resourceType\": \"Condition\","
+                    + "  \"id\": \"f201\","
+                    + "  \"identifier\": ["
+                    + "    {"
+                    + "      \"value\": \"12345\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"clinicalStatus\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\":"
+                    + "\"http://terminology.hl7.org/CodeSystem/condition-clinical\","
+                    + "        \"code\": \"resolved\""
+                    + "      }"
+                    + "    ]"
+                    + "  },"
+                    + "  \"verificationStatus\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\":"
+                    + "\"http://terminology.hl7.org/CodeSystem/condition-ver-status\","
+                    + "        \"code\": \"confirmed\""
+                    + "      }"
+                    + "    ]"
+                    + "  },"
+                    + "  \"category\": ["
+                    + "    {"
+                    + "      \"coding\": ["
+                    + "        {"
+                    + "          \"system\": \"http://snomed.info/sct\","
+                    + "          \"code\": \"55607006\","
+                    + "          \"display\": \"Problem\""
+                    + "        },"
+                    + "        {"
+                    + "          \"system\":"
+                    + "\"http://terminology.hl7.org/CodeSystem/condition-category\","
+                    + "          \"code\": \"problem-list-item\""
+                    + "        }"
+                    + "      ]"
+                    + "    }"
+                    + "  ],"
+                    + "  \"severity\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\": \"http://snomed.info/sct\","
+                    + "        \"code\": \"255604002\","
+                    + "        \"display\": \"Mild\""
+                    + "      }"
+                    + "    ]"
+                    + "  },"
+                    + "  \"code\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\": \"http://snomed.info/sct\","
+                    + "        \"code\": \"386661006\","
+                    + "        \"display\": \"Fever\""
+                    + "      }"
+                    + "    ]"
+                    + "  },"
+                    + "  \"bodySite\": ["
+                    + "    {"
+                    + "      \"coding\": ["
+                    + "        {"
+                    + "          \"system\": \"http://snomed.info/sct\","
+                    + "          \"code\": \"38266002\","
+                    + "          \"display\": \"Entire body as a whole\""
+                    + "        }"
+                    + "      ]"
+                    + "    }"
+                    + "  ],"
+                    + "  \"subject\": {"
+                    + "    \"reference\": \"Patient/f201\","
+                    + "    \"display\": \"Roel\""
+                    + "  },"
+                    + "  \"encounter\": {"
+                    + "    \"reference\": \"Encounter/f201\""
+                    + "  },"
+                    + "  \"onsetDateTime\": \"2013-04-02\","
+                    + "  \"abatementString\": \"around April 9, 2013\","
+                    + "  \"recordedDate\": \"2013-04-04\","
+                    + "  \"recorder\": {"
+                    + "    \"reference\": \"Practitioner/f201\""
+                    + "  },"
+                    + "  \"asserter\": {"
+                    + "    \"reference\": \"Practitioner/f201\""
+                    + "  },"
+                    + "  \"evidence\": ["
+                    + "    {"
+                    + "      \"code\": ["
+                    + "        {"
+                    + "          \"coding\": ["
+                    + "            {"
+                    + "              \"system\": \"http://snomed.info/sct\","
+                    + "              \"code\": \"258710007\","
+                    + "              \"display\": \"degrees C\""
+                    + "            }"
+                    + "          ]"
+                    + "        }"
+                    + "      ],"
+                    + "      \"detail\": ["
+                    + "        {"
+                    + "          \"reference\": \"Observation/f202\","
+                    + "          \"display\": \"Temperature\""
+                    + "        }"
+                    + "      ]"
+                    + "    }"
+                    + "  ]"
+                    + "}";
+
+    /**
+     * Creates a default valid FHIR Condition.
+     *
+     * <p>All that should be relied on is that the Observation is valid. To rely on anything else
+     * set it with the other methods.
+     */
+    public ConditionBuilder() {
+        super(DEFAULT_JSON);
+    }
+
+    @Override
+    protected ConditionBuilder returnThis() {
+        return this;
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/EncountersBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/EncountersBuilder.java
new file mode 100644
index 0000000..f013fb0
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/EncountersBuilder.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+/**
+ * Helper class for building FHIR data related to encounters, including <a
+ * href="https://www.hl7.org/fhir/encounter.html">Encounter</a> (see {@link #encounter}), <a
+ * href="https://www.hl7.org/fhir/location.html">Location</a> (see {@link #location}), and <a
+ * href="https://www.hl7.org/fhir/organization.html">Organization</a> (see {@link #organization})
+ */
+public class EncountersBuilder {
+
+    private static final String DEFAULT_ENCOUNTER_JSON =
+            "{"
+                    + "  \"resourceType\": \"Encounter\","
+                    + "  \"id\": \"example\","
+                    + "  \"status\": \"in-progress\","
+                    + "  \"class\": {"
+                    + "    \"system\": \"http://terminology.hl7.org/CodeSystem/v3-ActCode\","
+                    + "    \"code\": \"IMP\","
+                    + "    \"display\": \"inpatient encounter\""
+                    + "  },"
+                    + "  \"subject\": {"
+                    + "    \"reference\": \"Patient/example\""
+                    + "  }"
+                    + "}";
+
+    private static final String DEFAULT_LOCATION_JSON =
+            "{"
+                    + "  \"resourceType\": \"Location\","
+                    + "  \"id\": \"1\","
+                    + "  \"identifier\": ["
+                    + "    {"
+                    + "      \"value\": \"B1-S.F2\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"status\": \"active\","
+                    + "  \"name\": \"South Wing, second floor\","
+                    + "  \"alias\": ["
+                    + "    \"BU MC, SW, F2\","
+                    + "    \"Burgers University Medical Center, South Wing, second floor\""
+                    + "  ],"
+                    + "  \"description\": \"Second floor of the Old South Wing\","
+                    + "  \"mode\": \"instance\","
+                    + "  \"telecom\": ["
+                    + "    {"
+                    + "      \"system\": \"phone\","
+                    + "      \"value\": \"2328\","
+                    + "      \"use\": \"work\""
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"fax\","
+                    + "      \"value\": \"2329\","
+                    + "      \"use\": \"work\""
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"email\","
+                    + "      \"value\": \"second wing admissions\""
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"url\","
+                    + "      \"value\": \"http://sampleorg.com/southwing\","
+                    + "      \"use\": \"work\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"address\": {"
+                    + "    \"use\": \"work\","
+                    + "    \"line\": ["
+                    + "      \"Galapagosweg 91, Building A\""
+                    + "    ],"
+                    + "    \"city\": \"Den Burg\","
+                    + "    \"postalCode\": \"9105 PZ\","
+                    + "    \"country\": \"NLD\""
+                    + "  },"
+                    + "  \"physicalType\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\":"
+                    + "\"http://terminology.hl7.org/CodeSystem/location-physical-type\","
+                    + "        \"code\": \"wi\","
+                    + "        \"display\": \"Wing\""
+                    + "      }"
+                    + "    ]"
+                    + "  },"
+                    + "  \"position\": {"
+                    + "    \"longitude\": -83.6945691,"
+                    + "    \"latitude\": 42.25475478,"
+                    + "    \"altitude\": 0"
+                    + "  },"
+                    + "  \"managingOrganization\": {"
+                    + "    \"reference\": \"Organization/f001\""
+                    + "  },"
+                    + "  \"endpoint\": ["
+                    + "    {"
+                    + "      \"reference\": \"Endpoint/example\""
+                    + "    }"
+                    + "  ]"
+                    + "}";
+
+    private static final String DEFAULT_ORGANIZATION_JSON =
+            "{"
+                    + "  \"resourceType\": \"Organization\","
+                    + "  \"id\": \"2.16.840.1.113883.19.5\","
+                    + "  \"identifier\": ["
+                    + "    {"
+                    + "      \"system\": \"urn:ietf:rfc:3986\","
+                    + "      \"value\": \"urn:oid:2.16.840.1.113883.19.5\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"name\": \"Good Health Clinic\""
+                    + "}";
+
+    public static class EncounterBuilder extends FhirResourceBuilder<EncounterBuilder> {
+        private EncounterBuilder() {
+            super(DEFAULT_ENCOUNTER_JSON);
+        }
+
+        @Override
+        protected EncounterBuilder returnThis() {
+            return this;
+        }
+    }
+
+    public static class LocationBuilder extends FhirResourceBuilder<LocationBuilder> {
+        private LocationBuilder() {
+            super(DEFAULT_LOCATION_JSON);
+        }
+
+        @Override
+        protected LocationBuilder returnThis() {
+            return this;
+        }
+    }
+
+    public static class OrganizationBuilder extends FhirResourceBuilder<OrganizationBuilder> {
+        private OrganizationBuilder() {
+            super(DEFAULT_ORGANIZATION_JSON);
+        }
+
+        @Override
+        protected OrganizationBuilder returnThis() {
+            return this;
+        }
+    }
+
+    /**
+     * Returns a helper class useful for making FHIR <a
+     * href="https://www.hl7.org/fhir/encounter.html">Encounter</a> data for use in tests.
+     */
+    public static EncounterBuilder encounter() {
+        return new EncounterBuilder();
+    }
+
+    /**
+     * Returns a helper class useful for making FHIR <a
+     * href="https://www.hl7.org/fhir/location.html">Location</a> data for use in tests.
+     */
+    public static LocationBuilder location() {
+        return new LocationBuilder();
+    }
+
+    /**
+     * Returns a helper class useful for making FHIR <a
+     * href="https://www.hl7.org/fhir/organization.html">Organization</a> data for use in tests.
+     */
+    public static OrganizationBuilder organization() {
+        return new OrganizationBuilder();
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/FhirResourceBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/FhirResourceBuilder.java
new file mode 100644
index 0000000..6707c09
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/FhirResourceBuilder.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Abstract super class for helper classes for building FHIR resources for testing.
+ *
+ * <p>Subclasses should implement {@link #returnThis()} as:
+ *
+ * <pre>{@code
+ * @Override
+ * protected XxxBuilder returnThis() {
+ *   return this;
+ * }
+ * }</pre>
+ *
+ * This enables the type information to work correctly.
+ *
+ * @param <T> the class of the subclass which is the concrete class.
+ */
+abstract class FhirResourceBuilder<T extends FhirResourceBuilder<T>> {
+    private final JSONObject mFhir;
+
+    FhirResourceBuilder(String json) {
+        try {
+            this.mFhir = new JSONObject(json);
+        } catch (JSONException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+
+    /**
+     * Help the subclasses return the correct type.
+     *
+     * @return the current object, correctly typed.
+     */
+    protected abstract T returnThis();
+
+    /**
+     * Set the FHIR id for the resource.
+     *
+     * @return this Builder.
+     */
+    public T setId(String id) {
+        return set("id", id);
+    }
+
+    /**
+     * Sets an arbitrary String or JSON Object element in the FHIR resource.
+     *
+     * @param field the element to set.
+     * @param value the value to set
+     * @return this builder
+     */
+    public T set(String field, Object value) {
+        try {
+            mFhir.put(field, value);
+        } catch (JSONException e) {
+            throw new IllegalArgumentException(e);
+        }
+        return returnThis();
+    }
+
+    /**
+     * Removes json element from the FHIR resource.
+     *
+     * @param field the element to remove.
+     * @return this builder
+     */
+    public T removeField(String field) {
+        mFhir.remove(field);
+        return returnThis();
+    }
+
+    /** Returns the current state of this builder as a JSON FHIR string. */
+    public String toJson() {
+        try {
+            return mFhir.toString(/* indentSpaces= */ 2);
+        } catch (JSONException e) {
+            // Should never happen, but JSONException is declared, and is a checked exception.
+            throw new IllegalStateException(e);
+        }
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ImmunizationBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ImmunizationBuilder.java
new file mode 100644
index 0000000..4110f42
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ImmunizationBuilder.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+/**
+ * A helper class that supports making FHIR Immunization data for tests.
+ *
+ * <p>The Default result will be a valid FHIR Immunization, but that is all that should be relied
+ * upon. Anything else that is relied upon by a test should be set by one of the methods.
+ */
+public final class ImmunizationBuilder extends FhirResourceBuilder<ImmunizationBuilder> {
+    private static final String DEFAULT_JSON =
+            "{"
+                    + "  \"resourceType\": \"Immunization\","
+                    + "  \"id\": \"immunization-1\","
+                    + "  \"status\": \"completed\","
+                    + "  \"vaccineCode\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\": \"http://hl7.org/fhir/sid/cvx\","
+                    + "        \"code\": \"115\""
+                    + "      },"
+                    + "      {"
+                    + "        \"system\": \"http://hl7.org/fhir/sid/ndc\","
+                    + "        \"code\": \"58160-842-11\""
+                    + "      }"
+                    + "    ],"
+                    + "    \"text\": \"Tdap\""
+                    + "  },"
+                    + "  \"patient\": {"
+                    + "    \"reference\": \"Patient/patient_1\","
+                    + "    \"display\": \"Example, Anne\""
+                    + "  },"
+                    + "  \"encounter\": {"
+                    + "    \"reference\": \"Encounter/encounter_unk\","
+                    + "    \"display\": \"GP Visit\""
+                    + "  },"
+                    + "  \"occurrenceDateTime\": \"2018-05-21\","
+                    + "  \"primarySource\": true,"
+                    + "  \"manufacturer\": {"
+                    + "    \"display\": \"Sanofi Pasteur\""
+                    + "  },"
+                    + "  \"lotNumber\": \"1\","
+                    + "  \"site\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\": \"http://terminology.hl7.org/CodeSystem/v3-ActSite\","
+                    + "        \"code\": \"LA\","
+                    + "        \"display\": \"Left Arm\""
+                    + "      }"
+                    + "    ],"
+                    + "    \"text\": \"Left Arm\""
+                    + "  },"
+                    + "  \"route\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\":"
+                    + "\"http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration\","
+                    + "        \"code\": \"IM\","
+                    + "        \"display\": \"Injection, intramuscular\""
+                    + "      }"
+                    + "    ],"
+                    + "    \"text\": \"Injection, intramuscular\""
+                    + "  },"
+                    + "  \"doseQuantity\": {"
+                    + "    \"value\": 0.5,"
+                    + "    \"unit\": \"mL\""
+                    + "  },"
+                    + "  \"performer\": ["
+                    + "    {"
+                    + "      \"function\": {"
+                    + "        \"coding\": ["
+                    + "          {"
+                    + "            \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0443\","
+                    + "            \"code\": \"AP\","
+                    + "            \"display\": \"Administering Provider\""
+                    + "          }"
+                    + "        ],"
+                    + "        \"text\": \"Administering Provider\""
+                    + "      },"
+                    + "      \"actor\": {"
+                    + "        \"reference\": \"Practitioner/practitioner_1\","
+                    + "        \"type\": \"Practitioner\","
+                    + "        \"display\": \"Dr Maria Hernandez\""
+                    + "      }"
+                    + "    }"
+                    + "  ]"
+                    + "}";
+
+    /**
+     * Creates a default valid FHIR Immunization.
+     *
+     * <p>All that should be relied on is that the Immunization is valid. To rely on anything else
+     * set it with the other methods.
+     */
+    public ImmunizationBuilder() {
+        super(DEFAULT_JSON);
+    }
+
+    @Override
+    protected ImmunizationBuilder returnThis() {
+        return this;
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/MedicationsBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/MedicationsBuilder.java
new file mode 100644
index 0000000..9c10dd4
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/MedicationsBuilder.java
@@ -0,0 +1,485 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Test helper class for making medication related FHIR data, including <a
+ * href="https://www.hl7.org/fhir/medication.html">Medication</a>, <a
+ * href="https://www.hl7.org/fhir/medicationrequest.html">MedicationRequest</a> and <a
+ * href="https://www.hl7.org/fhir/medicationstatement.html">MedicationStatement</a>.
+ */
+public final class MedicationsBuilder {
+
+    /**
+     * Builder class for creating FHIR <a
+     * href="https://www.hl7.org/fhir/medication.html">Medications</a>
+     */
+    public static class MedicationBuilder extends FhirResourceBuilder<MedicationBuilder> {
+
+        private static final String DEFAULT_MEDICATION_JSON =
+                "{"
+                        + "  \"resourceType\": \"Medication\","
+                        + "  \"id\": \"med0311\","
+                        + "  \"code\": {"
+                        + "    \"coding\": ["
+                        + "      {"
+                        + "        \"system\": \"http://snomed.info/sct\","
+                        + "        \"code\": \"373994007\","
+                        + "        \"display\": \"Prednisone 5mg tablet (Product)\""
+                        + "      }"
+                        + "    ]"
+                        + "  },"
+                        + "  \"form\": {"
+                        + "    \"coding\": ["
+                        + "      {"
+                        + "        \"system\": \"http://snomed.info/sct\","
+                        + "        \"code\": \"385055001\","
+                        + "        \"display\": \"Tablet dose form (qualifier value)\""
+                        + "      }"
+                        + "    ]"
+                        + "  },"
+                        + "  \"ingredient\": ["
+                        + "    {"
+                        + "      \"itemReference\": {"
+                        + "        \"reference\": \"#sub03\""
+                        + "      },"
+                        + "      \"strength\": {"
+                        + "        \"numerator\": {"
+                        + "          \"value\": 5,"
+                        + "          \"system\": \"http://unitsofmeasure.org\","
+                        + "          \"code\": \"mg\""
+                        + "        },"
+                        + "        \"denominator\": {"
+                        + "          \"value\": 1,"
+                        + "          \"system\":"
+                        + "\"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
+                        + "          \"code\": \"TAB\""
+                        + "        }"
+                        + "      }"
+                        + "    }"
+                        + "  ]"
+                        + "}";
+
+        private static final String TYLENOL =
+                "{"
+                        + "  \"resourceType\": \"Medication\","
+                        + "  \"id\": \"med0309\","
+                        + "  \"code\": {"
+                        + "    \"coding\": ["
+                        + "      {"
+                        + "        \"system\": \"http://hl7.org/fhir/sid/ndc\","
+                        + "        \"code\": \"50580-506-02\","
+                        + "        \"display\": \"Tylenol PM\""
+                        + "      }"
+                        + "    ]"
+                        + "  },"
+                        + "  \"manufacturer\": {"
+                        + "    \"reference\": \"#org2\""
+                        + "  },"
+                        + "  \"form\": {"
+                        + "    \"coding\": ["
+                        + "      {"
+                        + "        \"system\": \"http://snomed.info/sct\","
+                        + "        \"code\": \"385057009\","
+                        + "        \"display\": \"Film-coated tablet (qualifier value)\""
+                        + "      }"
+                        + "    ]"
+                        + "  },"
+                        + "  \"ingredient\": ["
+                        + "    {"
+                        + "      \"itemCodeableConcept\": {"
+                        + "        \"coding\": ["
+                        + "          {"
+                        + "            \"system\": \"http://www.nlm.nih.gov/research/umls/rxnorm\","
+                        + "            \"code\": \"315266\","
+                        + "            \"display\": \"Acetaminophen 500 MG\""
+                        + "          }"
+                        + "        ]"
+                        + "      },"
+                        + "      \"strength\": {"
+                        + "        \"numerator\": {"
+                        + "          \"value\": 500,"
+                        + "          \"system\": \"http://unitsofmeasure.org\","
+                        + "          \"code\": \"mg\""
+                        + "        },"
+                        + "        \"denominator\": {"
+                        + "          \"value\": 1,"
+                        + "          \"system\":"
+                        + "\"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
+                        + "          \"code\": \"Tab\""
+                        + "        }"
+                        + "      }"
+                        + "    },"
+                        + "    {"
+                        + "      \"itemCodeableConcept\": {"
+                        + "        \"coding\": ["
+                        + "          {"
+                        + "            \"system\": \"http://www.nlm.nih.gov/research/umls/rxnorm\","
+                        + "            \"code\": \"901813\","
+                        + "            \"display\": \"Diphenhydramine Hydrochloride 25 mg\""
+                        + "          }"
+                        + "        ]"
+                        + "      },"
+                        + "      \"strength\": {"
+                        + "        \"numerator\": {"
+                        + "          \"value\": 25,"
+                        + "          \"system\": \"http://unitsofmeasure.org\","
+                        + "          \"code\": \"mg\""
+                        + "        },"
+                        + "        \"denominator\": {"
+                        + "          \"value\": 1,"
+                        + "          \"system\":"
+                        + "\"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
+                        + "          \"code\": \"Tab\""
+                        + "        }"
+                        + "      }"
+                        + "    }"
+                        + "  ],"
+                        + "  \"batch\": {"
+                        + "    \"lotNumber\": \"9494788\","
+                        + "    \"expirationDate\": \"2017-05-22\""
+                        + "  }"
+                        + "}";
+
+        public MedicationBuilder() {
+            super(DEFAULT_MEDICATION_JSON);
+        }
+
+        /**
+         * Set this medication to be Tylenol.
+         *
+         * @return this builder
+         */
+        public MedicationBuilder setTylenol() {
+            try {
+                JSONObject tylenol = new JSONObject(TYLENOL);
+                Iterator<String> keys = tylenol.keys();
+                while (keys.hasNext()) {
+                    String key = keys.next();
+                    set(key, tylenol.get(key));
+                }
+            } catch (JSONException e) {
+                throw new IllegalStateException(e);
+            }
+            return this;
+        }
+
+        @Override
+        protected MedicationBuilder returnThis() {
+            return this;
+        }
+    }
+
+    /**
+     * Builder class for creating FHIR <a
+     * href="https://www.hl7.org/fhir/medicationstatement.html">MedicationStatements</a>
+     */
+    public static class MedicationStatementR4Builder
+            extends FhirResourceBuilder<MedicationStatementR4Builder> {
+        private static final String DEFAULT_MEDICATION_STATEMENT_JSON =
+                "{"
+                        + "  \"resourceType\": \"MedicationStatement\","
+                        + "  \"id\": \"example001\","
+                        + "  \"identifier\": ["
+                        + "    {"
+                        + "      \"use\": \"official\","
+                        + "      \"system\": \"http://www.bmc.nl/portal/medstatements\","
+                        + "      \"value\": \"12345689\""
+                        + "    }"
+                        + "  ],"
+                        + "  \"status\": \"active\","
+                        + "  \"category\": {"
+                        + "    \"coding\": ["
+                        + "      {"
+                        + "        \"system\": "
+                        + "\"http://terminology.hl7.org/CodeSystem/medication-statement-category\","
+                        + "        \"code\": \"inpatient\","
+                        + "        \"display\": \"Inpatient\""
+                        + "      }"
+                        + "    ]"
+                        + "  },"
+                        + "  \"medicationReference\": {"
+                        + "    \"reference\": \"#med0309\""
+                        + "  },"
+                        + "  \"subject\": {"
+                        + "    \"reference\": \"Patient/pat1\","
+                        + "    \"display\": \"Donald Duck\""
+                        + "  },"
+                        + "  \"effectiveDateTime\": \"2015-01-23\","
+                        + "  \"dateAsserted\": \"2015-02-22\","
+                        + "  \"informationSource\": {"
+                        + "    \"reference\": \"Patient/pat1\","
+                        + "    \"display\": \"Donald Duck\""
+                        + "  },"
+                        + "  \"derivedFrom\": ["
+                        + "    {"
+                        + "      \"reference\": \"MedicationRequest/medrx002\""
+                        + "    }"
+                        + "  ],"
+                        + "  \"reasonCode\": ["
+                        + "    {"
+                        + "      \"coding\": ["
+                        + "        {"
+                        + "          \"system\": \"http://snomed.info/sct\","
+                        + "          \"code\": \"32914008\","
+                        + "          \"display\": \"Restless Legs\""
+                        + "        }"
+                        + "      ]"
+                        + "    }"
+                        + "  ],"
+                        + "  \"note\": ["
+                        + "    {"
+                        + "      \"text\": \"Patient indicates they miss the occasional dose\""
+                        + "    }"
+                        + "  ],"
+                        + "  \"dosage\": ["
+                        + "    {"
+                        + "      \"sequence\": 1,"
+                        + "      \"text\": \"1-2 tablets once daily at bedtime as needed\","
+                        + "      \"additionalInstruction\": ["
+                        + "        {"
+                        + "          \"text\": \"Taking at bedtime\""
+                        + "        }"
+                        + "      ],"
+                        + "      \"timing\": {"
+                        + "        \"repeat\": {"
+                        + "          \"frequency\": 1,"
+                        + "          \"period\": 1,"
+                        + "          \"periodUnit\": \"d\""
+                        + "        }"
+                        + "      },"
+                        + "      \"asNeededCodeableConcept\": {"
+                        + "        \"coding\": ["
+                        + "          {"
+                        + "            \"system\": \"http://snomed.info/sct\","
+                        + "            \"code\": \"32914008\","
+                        + "            \"display\": \"Restless Legs\""
+                        + "          }"
+                        + "        ]"
+                        + "      },"
+                        + "      \"route\": {"
+                        + "        \"coding\": ["
+                        + "          {"
+                        + "            \"system\": \"http://snomed.info/sct\","
+                        + "            \"code\": \"26643006\","
+                        + "            \"display\": \"Oral Route\""
+                        + "          }"
+                        + "        ]"
+                        + "      },"
+                        + "      \"doseAndRate\": ["
+                        + "        {"
+                        + "          \"type\": {"
+                        + "            \"coding\": ["
+                        + "              {"
+                        + "                \"system\": "
+                        + "\"http://terminology.hl7.org/CodeSystem/dose-rate-type\","
+                        + "                \"code\": \"ordered\","
+                        + "                \"display\": \"Ordered\""
+                        + "              }"
+                        + "            ]"
+                        + "          },"
+                        + "          \"doseRange\": {"
+                        + "            \"low\": {"
+                        + "              \"value\": 1,"
+                        + "              \"unit\": \"TAB\","
+                        + "              \"system\": "
+                        + "\"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
+                        + "              \"code\": \"TAB\""
+                        + "            },"
+                        + "            \"high\": {"
+                        + "              \"value\": 2,"
+                        + "              \"unit\": \"TAB\","
+                        + "              \"system\": "
+                        + "\"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
+                        + "              \"code\": \"TAB\""
+                        + "            }"
+                        + "          }"
+                        + "        }"
+                        + "      ]"
+                        + "    }"
+                        + "  ]"
+                        + "}";
+
+        public MedicationStatementR4Builder() {
+            super(DEFAULT_MEDICATION_STATEMENT_JSON);
+        }
+
+        /**
+         * Set this medication statement to contain the given medication.
+         *
+         * @param medication the medication to be contained (may be modified).
+         * @return this builder
+         */
+        public MedicationStatementR4Builder setContainedMedication(MedicationBuilder medication) {
+            String containedId = "med123";
+            try {
+                set(
+                        "contained",
+                        new JSONArray(
+                                List.of(new JSONObject(medication.setId(containedId).toJson()))));
+                set("medicationReference", new JSONObject(Map.of("reference", "#" + containedId)));
+            } catch (JSONException e) {
+                throw new IllegalArgumentException(e);
+            }
+            return this;
+        }
+
+        @Override
+        protected MedicationStatementR4Builder returnThis() {
+            return this;
+        }
+    }
+
+    public static class MedicationRequestBuilder
+            extends FhirResourceBuilder<MedicationRequestBuilder> {
+
+        private static final String DEFAULT_REQUEST_JSON =
+                "{"
+                        + "  \"resourceType\": \"MedicationRequest\","
+                        + "  \"id\": \"medrx0331\","
+                        + "  \"identifier\": ["
+                        + "    {"
+                        + "      \"use\": \"official\","
+                        + "      \"system\": \"http://www.bmc.nl/portal/prescriptions\","
+                        + "      \"value\": \"12345689\""
+                        + "    }"
+                        + "  ],"
+                        + "  \"status\": \"active\","
+                        + "  \"intent\": \"order\","
+                        + "  \"medicationReference\": {"
+                        + "    \"reference\": \"#med0350\""
+                        + "  },"
+                        + "  \"subject\": {"
+                        + "    \"reference\": \"Patient/pat1\","
+                        + "    \"display\": \"Donald Duck\""
+                        + "  },"
+                        + "  \"authoredOn\": \"2015-01-15\","
+                        + "  \"requester\": {"
+                        + "    \"reference\": \"Practitioner/f007\","
+                        + "    \"display\": \"Patrick Pump\""
+                        + "  },"
+                        + "  \"dosageInstruction\": ["
+                        + "    {"
+                        + "      \"sequence\": 1,"
+                        + "      \"text\": \"7mg once daily\","
+                        + "      \"timing\": {"
+                        + "        \"repeat\": {"
+                        + "          \"frequency\": 1,"
+                        + "          \"period\": 1,"
+                        + "          \"periodUnit\": \"d\""
+                        + "        }"
+                        + "      },"
+                        + "      \"doseAndRate\": ["
+                        + "        {"
+                        + "          \"type\": {"
+                        + "            \"coding\": ["
+                        + "              {"
+                        + "                \"system\":"
+                        + "\"http://terminology.hl7.org/CodeSystem/dose-rate-type\","
+                        + "                \"code\": \"ordered\","
+                        + "                \"display\": \"Ordered\""
+                        + "              }"
+                        + "            ]"
+                        + "          },"
+                        + "          \"doseQuantity\": {"
+                        + "            \"value\": 7,"
+                        + "            \"unit\": \"mg\","
+                        + "            \"system\": \"http://unitsofmeasure.org\","
+                        + "            \"code\": \"mg\""
+                        + "          }"
+                        + "        }"
+                        + "      ]"
+                        + "    }"
+                        + "  ],"
+                        + "  \"dispenseRequest\": {"
+                        + "    \"validityPeriod\": {"
+                        + "      \"start\": \"2015-01-15\","
+                        + "      \"end\": \"2016-01-15\""
+                        + "    },"
+                        + "    \"numberOfRepeatsAllowed\": 3,"
+                        + "    \"quantity\": {"
+                        + "      \"value\": 30,"
+                        + "      \"unit\": \"TAB\","
+                        + "      \"system\":"
+                        + "\"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
+                        + "      \"code\": \"TAB\""
+                        + "    },"
+                        + "    \"expectedSupplyDuration\": {"
+                        + "      \"value\": 30,"
+                        + "      \"unit\": \"days\","
+                        + "      \"system\": \"http://unitsofmeasure.org\","
+                        + "      \"code\": \"d\""
+                        + "    }"
+                        + "  },"
+                        + "  \"substitution\": {"
+                        + "    \"allowedBoolean\": true,"
+                        + "    \"reason\": {"
+                        + "      \"coding\": ["
+                        + "        {"
+                        + "          \"system\":"
+                        + "\"http://terminology.hl7.org/CodeSystem/v3-ActReason\","
+                        + "          \"code\": \"FP\","
+                        + "          \"display\": \"formulary policy\""
+                        + "        }"
+                        + "      ]"
+                        + "    }"
+                        + "  }"
+                        + "}";
+
+        public MedicationRequestBuilder() {
+            super(DEFAULT_REQUEST_JSON);
+        }
+
+        @Override
+        protected MedicationRequestBuilder returnThis() {
+            return this;
+        }
+    }
+
+    /**
+     * Returns a builder class that will help build <a
+     * href="https://www.hl7.org/fhir/medication.html">Medication</a> FHIR JSON.
+     */
+    public static MedicationBuilder medication() {
+        return new MedicationBuilder();
+    }
+
+    /**
+     * Returns a builder class that will help build <a
+     * href="https://www.hl7.org/fhir/medication.html">Medication</a> FHIR JSON, in FHIR version R4
+     * format.
+     */
+    public static MedicationStatementR4Builder statementR4() {
+        return new MedicationStatementR4Builder();
+    }
+
+    /**
+     * Returns a builder class that will help build <a
+     * href="https://www.hl7.org/fhir/medicationrequest.html">MedicationRequest</a> FHIR JSON.
+     */
+    public static MedicationRequestBuilder request() {
+        return new MedicationRequestBuilder();
+    }
+}
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ObservationBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ObservationBuilder.java
similarity index 86%
rename from tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ObservationBuilder.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/utils/ObservationBuilder.java
index a709c9c..b7193df 100644
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ObservationBuilder.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ObservationBuilder.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts.utils;
+package android.healthconnect.cts.phr.utils;
 
 import android.net.Uri;
 
@@ -35,7 +35,7 @@
  * <p>The Default result will be a valid FHIR Observation, but that is all that should be relied
  * upon. Anything else that is relied upon by a test should be set by one of the methods.
  */
-public class ObservationBuilder {
+public final class ObservationBuilder extends FhirResourceBuilder<ObservationBuilder> {
 
     /** URI representing the LOINC coding system. */
     public static final Uri LOINC = Uri.parse("http://loinc.org");
@@ -212,7 +212,6 @@
                     + "    }"
                     + "  ]"
                     + "}";
-    private final JSONObject mFhir;
 
     /**
      * Creates a default valid FHIR Observation.
@@ -221,25 +220,11 @@
      * set it with the other methods.
      */
     public ObservationBuilder() {
-        try {
-            this.mFhir = new JSONObject(DEFAULT_JSON);
-        } catch (JSONException e) {
-            // Should never happen, but JSONException is declared, and is a checked exception.
-            throw new IllegalStateException(e);
-        }
+        super(DEFAULT_JSON);
         setBloodGlucose(6.3);
     }
 
     /**
-     * Set the FHIR id for the Observation.
-     *
-     * @return this Builder.
-     */
-    public ObservationBuilder setId(String id) {
-        return set("id", id);
-    }
-
-    /**
      * Sets the category for this observation.
      *
      * @return this builder.
@@ -288,14 +273,14 @@
         }
         try {
             setCode(LOINC, "15074-8");
-            mFhir.put("valueQuantity", QuantityUnits.MMOL_PER_L.makeFhirQuantity(mmolPerLitre));
+            set("valueQuantity", QuantityUnits.MMOL_PER_L.makeFhirQuantity(mmolPerLitre));
             JSONObject interpretation =
                     makeCodeableConcept(
                             Uri.parse(
                                     "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation"),
                             code,
                             display);
-            mFhir.put("interpretation", new JSONArray(List.of(interpretation)));
+            set("interpretation", new JSONArray(List.of(interpretation)));
             JSONObject range =
                     new JSONObject(
                             Map.of(
@@ -303,7 +288,7 @@
                                     QuantityUnits.MMOL_PER_L.makeFhirQuantity(lowBoundary),
                                     "high",
                                     QuantityUnits.MMOL_PER_L.makeFhirQuantity(highBoundary)));
-            mFhir.put("referenceRange", new JSONArray(List.of(range)));
+            set("referenceRange", new JSONArray(List.of(range)));
 
         } catch (JSONException e) {
             throw new IllegalArgumentException(e);
@@ -383,7 +368,10 @@
      * @return this builder
      */
     public ObservationBuilder setValueCodeableConcept(@NonNull Uri system, @NonNull String code) {
-        return set("valueCodeableConcept", makeCodeableConcept(system, code, /* display= */ null));
+        return removeAllValueMultiTypeFields()
+                .set(
+                        "valueCodeableConcept",
+                        makeCodeableConcept(system, code, /* display= */ null));
     }
 
     /**
@@ -394,38 +382,48 @@
      */
     public ObservationBuilder setValueQuantity(Number quantity, QuantityUnits units) {
         try {
-            mFhir.put("valueQuantity", units.makeFhirQuantity(quantity));
+            return removeAllValueMultiTypeFields()
+                    .set("valueQuantity", units.makeFhirQuantity(quantity));
         } catch (JSONException e) {
-            // Should never happen, but JSONException is declared, and is a checked exception.
             throw new IllegalArgumentException(e);
         }
-        return this;
     }
 
     /**
-     * Sets an arbitrary String or JSON Object element in the observation FHIR.
+     * Removes all fields that are part of the effective[x] multi type field, such as
+     * effectiveDateTime and effectivePeriod.
      *
-     * @param field the element to set.
-     * @param value the value to set
+     * <p>This should be used before setting one of these fields, as only one is allowed to be set.
+     *
      * @return this builder
      */
-    public ObservationBuilder set(String field, Object value) {
-        try {
-            mFhir.put(field, value);
-        } catch (JSONException e) {
-            throw new IllegalArgumentException(e);
-        }
-        return this;
+    public ObservationBuilder removeAllEffectiveMultiTypeFields() {
+        return removeField("effectiveDateTime")
+                .removeField("effectivePeriod")
+                .removeField("effectiveTiming")
+                .removeField("effectiveInstant");
     }
 
-    /** Returns the current state of this builder as a JSON FHIR string. */
-    public String toJson() {
-        try {
-            return mFhir.toString(/* indentSpaces= */ 2);
-        } catch (JSONException e) {
-            // Should never happen, but JSONException is declared, and is a checked exception.
-            throw new IllegalStateException(e);
-        }
+    /**
+     * Removes all fields that are part of the value[x] multi type field, such as valueQuantity and
+     * valueCodeableConcept.
+     *
+     * <p>This should be used before setting one of these fields, as only one is allowed to be set.
+     *
+     * @return this builder
+     */
+    public ObservationBuilder removeAllValueMultiTypeFields() {
+        return removeField("valueQuantity")
+                .removeField("valueCodeableConcept")
+                .removeField("valueString")
+                .removeField("valueBoolean")
+                .removeField("valueInteger")
+                .removeField("valueRange")
+                .removeField("valueRatio")
+                .removeField("valueSampledData")
+                .removeField("valueTime")
+                .removeField("valueDateTime")
+                .removeField("valuePeriod");
     }
 
     /**
@@ -447,4 +445,9 @@
         }
         return new JSONObject(Map.of("coding", new JSONArray(List.of(new JSONObject(content)))));
     }
+
+    @Override
+    protected ObservationBuilder returnThis() {
+        return this;
+    }
 }
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PatientBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PatientBuilder.java
new file mode 100644
index 0000000..a589b60
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PatientBuilder.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+/**
+ * A helper class that supports making <a href="https://www.hl7.org/fhir/patient.html">FHIR
+ * Patient</a> data for tests.
+ *
+ * <p>The Default result will be a valid FHIR Patient, but that is all that should be relied upon.
+ * Anything else that is relied upon by a test should be set by one of the methods.
+ */
+public final class PatientBuilder extends FhirResourceBuilder<PatientBuilder> {
+    private static final String DEFAULT_JSON =
+            "{"
+                    + "  \"resourceType\": \"Patient\","
+                    + "  \"id\": \"example\","
+                    + "  \"identifier\": ["
+                    + "    {"
+                    + "      \"use\": \"usual\","
+                    + "      \"type\": {"
+                    + "        \"coding\": ["
+                    + "          {"
+                    + "            \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0203\","
+                    + "            \"code\": \"MR\""
+                    + "          }"
+                    + "        ]"
+                    + "      },"
+                    + "      \"system\": \"urn:oid:1.2.36.146.595.217.0.1\","
+                    + "      \"value\": \"12345\","
+                    + "      \"period\": {"
+                    + "        \"start\": \"2001-05-06\""
+                    + "      },"
+                    + "      \"assigner\": {"
+                    + "        \"display\": \"Acme Healthcare\""
+                    + "      }"
+                    + "    }"
+                    + "  ],"
+                    + "  \"active\": true,"
+                    + "  \"name\": ["
+                    + "    {"
+                    + "      \"use\": \"official\","
+                    + "      \"family\": \"Chalmers\","
+                    + "      \"given\": ["
+                    + "        \"Peter\","
+                    + "        \"James\""
+                    + "      ]"
+                    + "    },"
+                    + "    {"
+                    + "      \"use\": \"usual\","
+                    + "      \"given\": ["
+                    + "        \"Jim\""
+                    + "      ]"
+                    + "    },"
+                    + "    {"
+                    + "      \"use\": \"maiden\","
+                    + "      \"family\": \"Windsor\","
+                    + "      \"given\": ["
+                    + "        \"Peter\","
+                    + "        \"James\""
+                    + "      ],"
+                    + "      \"period\": {"
+                    + "        \"end\": \"2002\""
+                    + "      }"
+                    + "    }"
+                    + "  ],"
+                    + "  \"telecom\": ["
+                    + "    {"
+                    + "      \"use\": \"home\""
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"phone\","
+                    + "      \"value\": \"(03) 5555 6473\","
+                    + "      \"use\": \"work\","
+                    + "      \"rank\": 1"
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"phone\","
+                    + "      \"value\": \"(03) 3410 5613\","
+                    + "      \"use\": \"mobile\","
+                    + "      \"rank\": 2"
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"phone\","
+                    + "      \"value\": \"(03) 5555 8834\","
+                    + "      \"use\": \"old\","
+                    + "      \"period\": {"
+                    + "        \"end\": \"2014\""
+                    + "      }"
+                    + "    }"
+                    + "  ],"
+                    + "  \"gender\": \"male\","
+                    + "  \"birthDate\": \"1974-12-25\","
+                    + "  \"_birthDate\": {"
+                    + "    \"extension\": ["
+                    + "      {"
+                    + "        \"url\":"
+                    + "\"http://hl7.org/fhir/StructureDefinition/patient-birthTime\","
+                    + "        \"valueDateTime\": \"1974-12-25T14:35:45-05:00\""
+                    + "      }"
+                    + "    ]"
+                    + "  },"
+                    + "  \"deceasedBoolean\": false,"
+                    + "  \"address\": ["
+                    + "    {"
+                    + "      \"use\": \"home\","
+                    + "      \"type\": \"both\","
+                    + "      \"text\": \"534 Erewhon St PeasantVille, Rainbow, Vic  3999\","
+                    + "      \"line\": ["
+                    + "        \"534 Erewhon St\""
+                    + "      ],"
+                    + "      \"city\": \"PleasantVille\","
+                    + "      \"district\": \"Rainbow\","
+                    + "      \"state\": \"Vic\","
+                    + "      \"postalCode\": \"3999\","
+                    + "      \"period\": {"
+                    + "        \"start\": \"1974-12-25\""
+                    + "      }"
+                    + "    }"
+                    + "  ],"
+                    + "  \"contact\": ["
+                    + "    {"
+                    + "      \"relationship\": ["
+                    + "        {"
+                    + "          \"coding\": ["
+                    + "            {"
+                    + "              \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0131\","
+                    + "              \"code\": \"N\""
+                    + "            }"
+                    + "          ]"
+                    + "        }"
+                    + "      ],"
+                    + "      \"name\": {"
+                    + "        \"family\": \"du Marché\","
+                    + "        \"_family\": {"
+                    + "          \"extension\": ["
+                    + "            {"
+                    + "              \"url\":"
+                    + "\"http://hl7.org/fhir/StructureDefinition/humanname-own-prefix\","
+                    + "              \"valueString\": \"VV\""
+                    + "            }"
+                    + "          ]"
+                    + "        },"
+                    + "        \"given\": ["
+                    + "          \"Bénédicte\""
+                    + "        ]"
+                    + "      },"
+                    + "      \"telecom\": ["
+                    + "        {"
+                    + "          \"system\": \"phone\","
+                    + "          \"value\": \"+33 (237) 998327\""
+                    + "        }"
+                    + "      ],"
+                    + "      \"address\": {"
+                    + "        \"use\": \"home\","
+                    + "        \"type\": \"both\","
+                    + "        \"line\": ["
+                    + "          \"534 Erewhon St\""
+                    + "        ],"
+                    + "        \"city\": \"PleasantVille\","
+                    + "        \"district\": \"Rainbow\","
+                    + "        \"state\": \"Vic\","
+                    + "        \"postalCode\": \"3999\","
+                    + "        \"period\": {"
+                    + "          \"start\": \"1974-12-25\""
+                    + "        }"
+                    + "      },"
+                    + "      \"gender\": \"female\","
+                    + "      \"period\": {"
+                    + "        \"start\": \"2012\""
+                    + "      }"
+                    + "    }"
+                    + "  ],"
+                    + "  \"managingOrganization\": {"
+                    + "    \"reference\": \"Organization/1\""
+                    + "  }"
+                    + "}";
+
+    /**
+     * Creates a default valid FHIR Patient.
+     *
+     * <p>All that should be relied on is that the Patient is valid. To rely on anything else set it
+     * with the other methods.
+     */
+    public PatientBuilder() {
+        super(DEFAULT_JSON);
+    }
+
+    @Override
+    protected PatientBuilder returnThis() {
+        return this;
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PhrCtsTestUtils.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PhrCtsTestUtils.java
new file mode 100644
index 0000000..f210642
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PhrCtsTestUtils.java
@@ -0,0 +1,462 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_CONDITION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ENCOUNTER;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_MEDICATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_OBSERVATION_LABS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_OBSERVATION_PREGNANCY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_OBSERVATION_SOCIAL_HISTORY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_OBSERVATION_VITAL_SIGNS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_PRACTITIONER;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_PROCEDURE;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_Patient;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createVaccineMedicalResources;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.revokePermission;
+
+import static com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import static java.util.stream.Collectors.toSet;
+
+import android.app.UiAutomation;
+import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.DeleteMedicalResourcesRequest;
+import android.health.connect.GetMedicalDataSourcesRequest;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.MedicalResourceId;
+import android.health.connect.ReadMedicalResourcesRequest;
+import android.health.connect.ReadMedicalResourcesResponse;
+import android.health.connect.UpsertMedicalResourceRequest;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.lib.TestAppProxy;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
+import android.os.OutcomeReceiver;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.google.common.collect.Iterables;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class PhrCtsTestUtils {
+
+    public static final int MAX_FOREGROUND_READ_CALL_15M = 2000;
+    public static final int MAX_FOREGROUND_WRITE_CALL_15M = 1000;
+    public static final int RECORD_SIZE_LIMIT_IN_BYTES = 1000000;
+    public static final int CHUNK_SIZE_LIMIT_IN_BYTES = 5000000;
+    private static final int MAX_NUMBER_OF_MEDICAL_RESOURCES_PER_INSERT_REQUEST = 20;
+    private static final int MAXIMUM_PAGE_SIZE = 5000;
+    public static final String PHR_BACKGROUND_APP_PKG =
+            "android.healthconnect.cts.phr.testhelper.app1";
+    public static final String PHR_FOREGROUND_APP_PKG =
+            "android.healthconnect.cts.phr.testhelper.app2";
+    public static final TestAppProxy PHR_BACKGROUND_APP =
+            TestAppProxy.forPackageNameInBackground(PHR_BACKGROUND_APP_PKG);
+    public static final TestAppProxy PHR_FOREGROUND_APP =
+            TestAppProxy.forPackageName(PHR_FOREGROUND_APP_PKG);
+
+    public static final Set<Integer> MEDICAL_RESOURCE_TYPES_LIST =
+            Set.of(
+                    MEDICAL_RESOURCE_TYPE_VACCINES,
+                    MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                    MEDICAL_RESOURCE_TYPE_CONDITIONS,
+                    MEDICAL_RESOURCE_TYPE_MEDICATIONS,
+                    MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS,
+                    MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS,
+                    MEDICAL_RESOURCE_TYPE_VISITS,
+                    MEDICAL_RESOURCE_TYPE_PROCEDURES,
+                    MEDICAL_RESOURCE_TYPE_PREGNANCY,
+                    MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY,
+                    MEDICAL_RESOURCE_TYPE_VITAL_SIGNS,
+                    MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS);
+
+    public int mLimitsAdjustmentForTesting = 1;
+    private final HealthConnectManager mManager;
+
+    public PhrCtsTestUtils(HealthConnectManager manager) {
+        mManager = manager;
+    }
+
+    /**
+     * Makes a call to {@link HealthConnectManager#createMedicalDataSource} and returns the created
+     * data source.
+     */
+    public MedicalDataSource createDataSource(CreateMedicalDataSourceRequest createRequest)
+            throws InterruptedException {
+        HealthConnectReceiver<MedicalDataSource> createReceiver = new HealthConnectReceiver<>();
+        mManager.createMedicalDataSource(
+                createRequest, Executors.newSingleThreadExecutor(), createReceiver);
+        return createReceiver.getResponse();
+    }
+
+    /**
+     * Makes a call to {@link HealthConnectManager#getMedicalDataSources(List, Executor,
+     * OutcomeReceiver)}.
+     */
+    public List<MedicalDataSource> getMedicalDataSourcesByIds(List<String> ids)
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalDataSource>> createReceiver =
+                new HealthConnectReceiver<>();
+        mManager.getMedicalDataSources(ids, Executors.newSingleThreadExecutor(), createReceiver);
+        return createReceiver.getResponse();
+    }
+
+    /**
+     * Makes a call to {@link
+     * HealthConnectManager#getMedicalDataSources(GetMedicalDataSourcesRequest, Executor,
+     * OutcomeReceiver)}.
+     */
+    public List<MedicalDataSource> getMedicalDataSourcesByRequest(
+            GetMedicalDataSourcesRequest request) throws InterruptedException {
+        HealthConnectReceiver<List<MedicalDataSource>> createReceiver =
+                new HealthConnectReceiver<>();
+        mManager.getMedicalDataSources(
+                request, Executors.newSingleThreadExecutor(), createReceiver);
+        return createReceiver.getResponse();
+    }
+
+    /**
+     * Given a {@code dataSourceId} and {@code numOfResources}, it inserts as many vaccine medical
+     * resources as specified.
+     */
+    public List<MedicalResource> upsertVaccineMedicalResources(
+            String dataSourceId, int numOfResources) throws InterruptedException {
+        List<MedicalResource> medicalResources =
+                createVaccineMedicalResources(numOfResources, dataSourceId);
+        return upsertMedicalData(medicalResources);
+    }
+
+    private List<MedicalResource> upsertMedicalData(List<MedicalResource> medicalResources)
+            throws InterruptedException {
+        int numOfResources = medicalResources.size();
+        // To avoid hitting transaction limit:
+        List<MedicalResource> result = new ArrayList<>();
+        for (int chunk = 0;
+                chunk <= numOfResources / MAX_NUMBER_OF_MEDICAL_RESOURCES_PER_INSERT_REQUEST;
+                chunk++) {
+            List<UpsertMedicalResourceRequest> requests = new ArrayList<>();
+            HealthConnectReceiver<List<MedicalResource>> dataReceiver =
+                    new HealthConnectReceiver<>();
+            for (int indexWithinChunk = 0;
+                    indexWithinChunk < MAX_NUMBER_OF_MEDICAL_RESOURCES_PER_INSERT_REQUEST;
+                    indexWithinChunk++) {
+                int index =
+                        chunk * MAX_NUMBER_OF_MEDICAL_RESOURCES_PER_INSERT_REQUEST
+                                + indexWithinChunk;
+                if (index >= numOfResources) {
+                    break;
+                }
+                MedicalResource medicalResource = medicalResources.get(index);
+                UpsertMedicalResourceRequest request =
+                        new UpsertMedicalResourceRequest.Builder(
+                                        medicalResource.getDataSourceId(),
+                                        medicalResource.getFhirVersion(),
+                                        medicalResource.getFhirResource().getData())
+                                .build();
+                requests.add(request);
+            }
+            mManager.upsertMedicalResources(
+                    requests, Executors.newSingleThreadExecutor(), dataReceiver);
+            result.addAll(dataReceiver.getResponse());
+        }
+        return result;
+    }
+
+    /**
+     * Makes a call to {@link HealthConnectManager#upsertMedicalResources} and returns the upserted
+     * medical resource.
+     */
+    public MedicalResource upsertMedicalData(String dataSourceId, String data)
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> dataReceiver = new HealthConnectReceiver<>();
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(dataSourceId, FHIR_VERSION_R4, data)
+                        .build();
+        mManager.upsertMedicalResources(
+                List.of(request), Executors.newSingleThreadExecutor(), dataReceiver);
+        // Make sure something got inserted.
+        return Iterables.getOnlyElement(dataReceiver.getResponse());
+    }
+
+    /** Makes a call to {@link HealthConnectManager#deleteMedicalResources}. */
+    public void deleteResources(List<MedicalResourceId> resourceIds) throws InterruptedException {
+        HealthConnectReceiver<Void> deleteReceiver = new HealthConnectReceiver<>();
+        mManager.deleteMedicalResources(
+                resourceIds, Executors.newSingleThreadExecutor(), deleteReceiver);
+        deleteReceiver.verifyNoExceptionOrThrow();
+    }
+
+    /**
+     * A utility method to call {@link HealthConnectManager#readMedicalResources(List, Executor,
+     * OutcomeReceiver)}.
+     */
+    public List<MedicalResource> readMedicalResourcesByIds(List<MedicalResourceId> ids)
+            throws InterruptedException {
+        HealthConnectReceiver<List<MedicalResource>> dataReceiver = new HealthConnectReceiver<>();
+        mManager.readMedicalResources(ids, Executors.newSingleThreadExecutor(), dataReceiver);
+        return dataReceiver.getResponse();
+    }
+
+    /**
+     * A utility method to call {@link
+     * HealthConnectManager#readMedicalResources(ReadMedicalResourcesRequest, Executor,
+     * OutcomeReceiver)}.
+     */
+    public ReadMedicalResourcesResponse readMedicalResourcesByRequest(
+            ReadMedicalResourcesRequest request) throws InterruptedException {
+        HealthConnectReceiver<ReadMedicalResourcesResponse> dataReceiver =
+                new HealthConnectReceiver<>();
+        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), dataReceiver);
+        return dataReceiver.getResponse();
+    }
+
+    /**
+     * A utility method to call {@link HealthConnectManager#deleteMedicalResources(List, Executor,
+     * OutcomeReceiver)}.
+     */
+    public void deleteMedicalResourcesByIds(List<MedicalResourceId> ids)
+            throws InterruptedException {
+        HealthConnectReceiver<Void> dataReceiver = new HealthConnectReceiver<>();
+        mManager.deleteMedicalResources(ids, Executors.newSingleThreadExecutor(), dataReceiver);
+        dataReceiver.getResponse();
+    }
+
+    /**
+     * A utility method to call {@link
+     * HealthConnectManager#deleteMedicalResources(DeleteMedicalResourcesRequest, Executor,
+     * OutcomeReceiver)}.
+     */
+    public void deleteMedicalResourcesByRequest(DeleteMedicalResourcesRequest request)
+            throws InterruptedException {
+        HealthConnectReceiver<Void> dataReceiver = new HealthConnectReceiver<>();
+        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), dataReceiver);
+        dataReceiver.getResponse();
+    }
+
+    /**
+     * A utility method to call {@link
+     * HealthConnectManager#deleteMedicalResources(DeleteMedicalResourcesRequest, Executor,
+     * OutcomeReceiver)}.
+     */
+    public void readMedicalResourcesByRequest(DeleteMedicalResourcesRequest request)
+            throws InterruptedException {
+        HealthConnectReceiver<Void> dataReceiver = new HealthConnectReceiver<>();
+        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), dataReceiver);
+        dataReceiver.getResponse();
+    }
+
+    /**
+     * Delete all health records (data sources, resources etc) stored in the Health Connect
+     * database.
+     */
+    public void deleteAllMedicalData() throws InterruptedException {
+        if (!isPersonalHealthRecordEnabled()) {
+            return;
+        }
+        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+        try {
+            HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
+            ExecutorService executor = Executors.newSingleThreadExecutor();
+            mManager.getMedicalDataSources(
+                    new GetMedicalDataSourcesRequest.Builder().build(), executor, receiver);
+            List<MedicalDataSource> dataSources = receiver.getResponse();
+            for (MedicalDataSource dataSource : dataSources) {
+                HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+                mManager.deleteMedicalDataSourceWithData(dataSource.getId(), executor, callback);
+                callback.verifyNoExceptionOrThrow();
+            }
+        } finally {
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
+    /**
+     * Given a list of {@link MedicalResource}s, reads out the resources using the {@link
+     * MedicalResourceId}s. It splits the resources to fit the maximum page size limit.
+     */
+    public List<MedicalResource> readMedicalResources(List<MedicalResource> medicalResources)
+            throws InterruptedException {
+        List<MedicalResourceId> ids =
+                medicalResources.stream()
+                        .map(
+                                medicalResource ->
+                                        new MedicalResourceId(
+                                                medicalResource.getDataSourceId(),
+                                                medicalResource.getFhirResource().getType(),
+                                                medicalResource.getFhirResource().getId()))
+                        .toList();
+
+        List<MedicalResource> result = new ArrayList<>();
+        for (int chunk = 0; chunk <= ids.size() / MAXIMUM_PAGE_SIZE; chunk++) {
+            List<MedicalResourceId> resourceIds = new ArrayList<>();
+            HealthConnectReceiver<List<MedicalResource>> dataReceiver =
+                    new HealthConnectReceiver<>();
+            for (int indexWithinChunk = 0;
+                    indexWithinChunk < MAXIMUM_PAGE_SIZE;
+                    indexWithinChunk++) {
+                int index = chunk * MAXIMUM_PAGE_SIZE + indexWithinChunk;
+                if (index >= ids.size()) {
+                    break;
+                }
+
+                resourceIds.add(ids.get(index));
+            }
+            mManager.readMedicalResources(
+                    resourceIds, Executors.newSingleThreadExecutor(), dataReceiver);
+            result.addAll(dataReceiver.getResponse());
+        }
+        return result;
+    }
+
+    /**
+     * Given a {@code dataSourceId} deletes the {@link MedicalDataSource} and all its associated
+     * {@link MedicalResource}s.
+     */
+    public void deleteMedicalDataSourceWithData(String dataSourceId) throws InterruptedException {
+        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
+        mManager.deleteMedicalDataSourceWithData(
+                dataSourceId, Executors.newSingleThreadExecutor(), callback);
+        callback.verifyNoExceptionOrThrow();
+    }
+
+    /**
+     * Inserts a data source with one resource for each permission category and returns the ids of
+     * inserted resources.
+     */
+    public List<MedicalResourceId> insertSourceAndOneResourcePerPermissionCategory(
+            TestAppProxy appProxy) throws Exception {
+        grantPermission(appProxy.getPackageName(), WRITE_MEDICAL_DATA);
+        String dataSourceId =
+                appProxy.createMedicalDataSource(getCreateMedicalDataSourceRequest()).getId();
+        List<MedicalResource> insertedMedicalResources =
+                List.of(
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_IMMUNIZATION),
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_ALLERGY),
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_CONDITION),
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_MEDICATION),
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_Patient),
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_PRACTITIONER),
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_ENCOUNTER),
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_PROCEDURE),
+                        appProxy.upsertMedicalResource(
+                                dataSourceId, FHIR_DATA_OBSERVATION_PREGNANCY),
+                        appProxy.upsertMedicalResource(
+                                dataSourceId, FHIR_DATA_OBSERVATION_SOCIAL_HISTORY),
+                        appProxy.upsertMedicalResource(
+                                dataSourceId, FHIR_DATA_OBSERVATION_VITAL_SIGNS),
+                        appProxy.upsertMedicalResource(dataSourceId, FHIR_DATA_OBSERVATION_LABS));
+        revokePermission(appProxy.getPackageName(), WRITE_MEDICAL_DATA);
+
+        checkState(
+                insertedMedicalResources.stream()
+                        .map(MedicalResource::getType)
+                        .collect(toSet())
+                        .equals(MEDICAL_RESOURCE_TYPES_LIST));
+
+        return insertedMedicalResources.stream().map(MedicalResource::getId).toList();
+    }
+
+    /**
+     * This method tries to use the specified quota by calling readMedicalResources and
+     * getMedicalResources APIs.
+     *
+     * @return the available quota that may have accumulated during the read.
+     */
+    public float tryAcquireCallQuotaNTimesForRead(
+            MedicalDataSource insertedMedicalDataSource,
+            List<MedicalResource> insertedMedicalResources,
+            int nTimes)
+            throws InterruptedException {
+        int readMedicalDataSourceCalls = nTimes / 2;
+        int readMedicalResourceCalls = nTimes - readMedicalDataSourceCalls;
+        List<MedicalResourceId> medicalResourceIds =
+                insertedMedicalResources.stream().map(MedicalResource::getId).toList();
+
+        Instant readStartTime = Instant.now();
+        for (int i = 0; i < readMedicalDataSourceCalls; i++) {
+            getMedicalDataSourcesByIds(List.of(insertedMedicalDataSource.getId()));
+        }
+        for (int i = 0; i < readMedicalResourceCalls; i++) {
+            readMedicalResourcesByIds(medicalResourceIds);
+        }
+        Instant readEndTime = Instant.now();
+
+        return getAvailableQuotaAccumulated(
+                readStartTime, readEndTime, Duration.ofMinutes(15), MAX_FOREGROUND_READ_CALL_15M);
+    }
+
+    /**
+     * This method tries to use the specified quota by calling the upsertMedicalResources API.
+     *
+     * @return the available quota that may have accumulated during the write.
+     */
+    public float tryAcquireCallQuotaNTimesForWrite(
+            MedicalDataSource insertedMedicalDataSource, int nTimes) throws InterruptedException {
+        String dataSourceId = insertedMedicalDataSource.getId();
+
+        Instant readStartTime = Instant.now();
+        for (int i = 0; i < nTimes; i++) {
+            upsertMedicalData(dataSourceId, FHIR_DATA_IMMUNIZATION);
+        }
+        Instant readEndTime = Instant.now();
+
+        return getAvailableQuotaAccumulated(
+                readStartTime, readEndTime, Duration.ofMinutes(15), MAX_FOREGROUND_WRITE_CALL_15M);
+    }
+
+    /**
+     * Returns the quota that would have accumulated between start and end time for the specified
+     * window and max quota. The calculation matches the calculation in
+     * RateLimiter#getAvailableQuota.
+     */
+    private float getAvailableQuotaAccumulated(
+            Instant startTime, Instant endTime, Duration window, int maxQuota) {
+        Duration timeSpent = Duration.between(startTime, endTime);
+        return timeSpent.toMillis() * ((float) maxQuota / (float) window.toMillis());
+    }
+}
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/PhrDataFactory.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PhrDataFactory.java
similarity index 65%
rename from tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/PhrDataFactory.java
rename to tests/cts/phr/src/android/healthconnect/cts/phr/utils/PhrDataFactory.java
index 0b3f6e0..dda2114 100644
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/PhrDataFactory.java
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PhrDataFactory.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package android.healthconnect.cts.utils;
+package android.healthconnect.cts.phr.utils;
 
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
 import static android.health.connect.datatypes.FhirVersion.parseFhirVersion;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
 
 import android.health.connect.CreateMedicalDataSourceRequest;
 import android.health.connect.GetMedicalDataSourcesRequest;
@@ -32,12 +32,15 @@
 import android.health.connect.datatypes.MedicalResource;
 import android.net.Uri;
 
+import com.google.common.truth.Correspondence;
+
 import org.json.JSONException;
 import org.json.JSONObject;
 
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
 
@@ -46,54 +49,6 @@
     private static final int MEDICAL_DATA_SOURCE_DISPLAY_NAME_CHARACTER_LIMIT = 90;
 
     public static final int MAX_ALLOWED_MEDICAL_DATA_SOURCES = 20;
-    public static final UUID DATA_SOURCE_UUID = UUID.randomUUID();
-    public static final String DATA_SOURCE_ID = DATA_SOURCE_UUID.toString();
-    public static final String DATA_SOURCE_PACKAGE_NAME = "com.example.app";
-    public static final Uri DATA_SOURCE_FHIR_BASE_URI =
-            Uri.parse("https://fhir.com/oauth/api/FHIR/R4/");
-    public static final Uri DATA_SOURCE_FHIR_BASE_URI_MAX_CHARS =
-            Uri.parse("d".repeat(FHIR_BASE_URI_CHARACTER_LIMIT));
-    public static final Uri DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS =
-            Uri.parse("d".repeat(FHIR_BASE_URI_CHARACTER_LIMIT + 1));
-    public static final String DATA_SOURCE_DISPLAY_NAME = "Hospital X";
-    public static final String DATA_SOURCE_DISPLAY_NAME_MAX_CHARS =
-            "d".repeat(MEDICAL_DATA_SOURCE_DISPLAY_NAME_CHARACTER_LIMIT);
-    public static final String DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS =
-            "d".repeat(MEDICAL_DATA_SOURCE_DISPLAY_NAME_CHARACTER_LIMIT + 1);
-    public static final Instant DATA_SOURCE_LAST_DATA_UPDATE_TIME =
-            Instant.parse("2024-09-10T00:02:00Z");
-    public static final UUID DIFFERENT_DATA_SOURCE_UUID = UUID.randomUUID();
-    public static final String DIFFERENT_DATA_SOURCE_ID = DIFFERENT_DATA_SOURCE_UUID.toString();
-    public static final String DIFFERENT_DATA_SOURCE_PACKAGE_NAME = "com.other.app";
-    public static final Uri DIFFERENT_DATA_SOURCE_BASE_URI =
-            Uri.parse("https://fhir.com/oauth/api/FHIR/R5/");
-    public static final String DIFFERENT_DATA_SOURCE_DISPLAY_NAME = "Doctor Y";
-    public static final Instant DIFFERENT_DATA_SOURCE_LAST_DATA_UPDATE_TIME =
-            Instant.parse("2023-01-01T00:02:00Z");
-
-    public static final String FHIR_DATA_IMMUNIZATION =
-            "{\"resourceType\" : \"Immunization\", \"id\" : \"Immunization1\"}";
-    public static final String DIFFERENT_FHIR_DATA_IMMUNIZATION =
-            "{\"resourceType\" : \"Immunization\", \"id\" : \"Immunization2\"}";
-    public static final String DIFFERENT_FHIR_RESOURCE_ID_IMMUNIZATION = "Immunization2";
-
-    public static final String FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS =
-            "{\"resourceType\" : \"Immunization\"}";
-    public static final String FHIR_DATA_IMMUNIZATION_ID_EMPTY =
-            "{\"resourceType\" : \"StructureDefinition\", \"id\" : \"\"}";
-    public static final String FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS =
-            "{\"id\" : \"Immunization1\"}";
-    public static final String FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID = "{\"id\" : }";
-    public static final String FHIR_RESOURCE_TYPE_UNSUPPORTED = "StructureDefinition";
-    public static final String FHIR_DATA_IMMUNIZATION_UNSUPPORTED_RESOURCE_TYPE =
-            "{\"resourceType\" : \"StructureDefinition\", \"id\" : \"Immunization1\"}";
-    public static final String FHIR_RESOURCE_ID_IMMUNIZATION = "Immunization1";
-
-    public static final String FHIR_DATA_ALLERGY =
-            "{\"resourceType\" : \"AllergyIntolerance\", \"id\" : \"Allergy1\"}";
-    public static final String FHIR_RESOURCE_ID_ALLERGY = "Allergy1";
-
-    public static final String RESOURCE_ID_FIELD_NAME = "id";
 
     /**
      * String version code for FHIR version <a href="https://hl7.org/fhir/r4/versions.html">R4</a>.
@@ -115,24 +70,110 @@
     public static final FhirVersion FHIR_VERSION_UNSUPPORTED =
             parseFhirVersion(UNSUPPORTED_VERSION_STRING);
 
+    public static final String RESOURCE_ID_FIELD_NAME = "id";
+
+    public static final UUID DATA_SOURCE_UUID = UUID.randomUUID();
+    public static final String DATA_SOURCE_ID = DATA_SOURCE_UUID.toString();
+    public static final String DATA_SOURCE_PACKAGE_NAME = "com.example.app";
+    public static final Uri DATA_SOURCE_FHIR_BASE_URI =
+            Uri.parse("https://fhir.com/oauth/api/FHIR/R4/");
+    public static final Uri DATA_SOURCE_FHIR_BASE_URI_MAX_CHARS =
+            Uri.parse("d".repeat(FHIR_BASE_URI_CHARACTER_LIMIT));
+    public static final Uri DATA_SOURCE_FHIR_BASE_URI_EXCEEDED_CHARS =
+            Uri.parse("d".repeat(FHIR_BASE_URI_CHARACTER_LIMIT + 1));
+    public static final String DATA_SOURCE_DISPLAY_NAME = "Hospital X";
+    public static final String DATA_SOURCE_DISPLAY_NAME_MAX_CHARS =
+            "d".repeat(MEDICAL_DATA_SOURCE_DISPLAY_NAME_CHARACTER_LIMIT);
+    public static final String DATA_SOURCE_DISPLAY_NAME_EXCEEDED_CHARS =
+            "d".repeat(MEDICAL_DATA_SOURCE_DISPLAY_NAME_CHARACTER_LIMIT + 1);
+    public static final Instant DATA_SOURCE_LAST_DATA_UPDATE_TIME =
+            Instant.parse("2024-09-10T00:02:00Z");
+    public static final FhirVersion DATA_SOURCE_FHIR_VERSION = FHIR_VERSION_R4;
+    public static final UUID DIFFERENT_DATA_SOURCE_UUID = UUID.randomUUID();
+    public static final String DIFFERENT_DATA_SOURCE_ID = DIFFERENT_DATA_SOURCE_UUID.toString();
+    public static final String DIFFERENT_DATA_SOURCE_PACKAGE_NAME = "com.other.app";
+    public static final Uri DIFFERENT_DATA_SOURCE_BASE_URI =
+            Uri.parse("https://fhir.com/oauth/api/FHIR/R5/");
+    public static final String DIFFERENT_DATA_SOURCE_DISPLAY_NAME = "Doctor Y";
+    public static final Instant DIFFERENT_DATA_SOURCE_LAST_DATA_UPDATE_TIME =
+            Instant.parse("2023-01-01T00:02:00Z");
+    public static final FhirVersion DIFFERENT_DATA_SOURCE_FHIR_VERSION = FHIR_VERSION_R4B;
+
+    public static final String FHIR_RESOURCE_ID_IMMUNIZATION = "Immunization1";
+    public static final String FHIR_DATA_IMMUNIZATION =
+            new ImmunizationBuilder().setId(FHIR_RESOURCE_ID_IMMUNIZATION).toJson();
+    public static final String DIFFERENT_FHIR_RESOURCE_ID_IMMUNIZATION = "Immunization2";
+    public static final String DIFFERENT_FHIR_DATA_IMMUNIZATION =
+            new ImmunizationBuilder().setId(DIFFERENT_FHIR_RESOURCE_ID_IMMUNIZATION).toJson();
+
+    public static final String FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS =
+            new ImmunizationBuilder().removeField(RESOURCE_ID_FIELD_NAME).toJson();
+    public static final String FHIR_DATA_IMMUNIZATION_ID_EMPTY =
+            new ImmunizationBuilder().setId("").toJson();
+    public static final String FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS =
+            new ImmunizationBuilder()
+                    .setId(FHIR_RESOURCE_ID_IMMUNIZATION)
+                    .removeField("resourceType")
+                    .toJson();
+    public static final String FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID = "{\"id\" : }";
+    public static final String FHIR_RESOURCE_TYPE_UNSUPPORTED = "StructureDefinition";
+    public static final String FHIR_DATA_IMMUNIZATION_UNSUPPORTED_RESOURCE_TYPE =
+            "{\"resourceType\" : \"StructureDefinition\", \"id\" : \"Immunization1\"}";
+
+    public static final String FHIR_RESOURCE_ID_ALLERGY = "Allergy1";
+    public static final String FHIR_DATA_ALLERGY =
+            new AllergyBuilder().setId(FHIR_RESOURCE_ID_ALLERGY).toJson();
+    public static final String DIFFERENT_FHIR_RESOURCE_ID_ALLERGY = "Allergy2";
+    public static final String DIFFERENT_FHIR_DATA_ALLERGY =
+            new AllergyBuilder().setId(DIFFERENT_FHIR_RESOURCE_ID_ALLERGY).toJson();
+    public static final String FHIR_DATA_CONDITION = new ConditionBuilder().toJson();
+    public static final String FHIR_DATA_MEDICATION =
+            new MedicationsBuilder.MedicationBuilder().toJson();
+    public static final String FHIR_DATA_Patient = new PatientBuilder().toJson();
+    public static final String FHIR_DATA_PRACTITIONER = new PractitionerBuilder().toJson();
+    public static final String FHIR_DATA_ENCOUNTER = EncountersBuilder.encounter().toJson();
+    public static final String FHIR_DATA_PROCEDURE = new ProcedureBuilder().toJson();
+    public static final String FHIR_DATA_OBSERVATION_PREGNANCY =
+            new ObservationBuilder()
+                    .setId("1")
+                    .setPregnancyStatus(ObservationBuilder.PregnancyStatus.NOT_PREGNANT)
+                    .toJson();
+    public static final String FHIR_DATA_OBSERVATION_SOCIAL_HISTORY =
+            new ObservationBuilder()
+                    .setId("2")
+                    .setCategory(ObservationBuilder.ObservationCategory.SOCIAL_HISTORY)
+                    .toJson();
+    public static final String FHIR_DATA_OBSERVATION_VITAL_SIGNS =
+            new ObservationBuilder()
+                    .setId("3")
+                    .setCategory(ObservationBuilder.ObservationCategory.VITAL_SIGNS)
+                    .toJson();
+    public static final String FHIR_DATA_OBSERVATION_LABS =
+            new ObservationBuilder()
+                    .setId("4")
+                    .setCategory(ObservationBuilder.ObservationCategory.LABORATORY)
+                    .toJson();
+
     public static final String PAGE_TOKEN = "111";
 
+    public static final Correspondence<MedicalDataSource, MedicalDataSource>
+            MEDICAL_DATA_SOURCE_EQUIVALENCE =
+                    Correspondence.from(
+                            PhrDataFactory::isMedicalDataSourceEqual, "isMedicalDataSourceEqual");
+
     /** Creates and returns a {@link MedicalDataSource.Builder} with default arguments. */
     public static MedicalDataSource.Builder getMedicalDataSourceBuilderRequiredFieldsOnly() {
         return new MedicalDataSource.Builder(
                 DATA_SOURCE_ID,
                 DATA_SOURCE_PACKAGE_NAME,
                 DATA_SOURCE_FHIR_BASE_URI,
-                DATA_SOURCE_DISPLAY_NAME);
+                DATA_SOURCE_DISPLAY_NAME,
+                DATA_SOURCE_FHIR_VERSION);
     }
 
     /** Creates and returns a {@link MedicalDataSource.Builder} with default arguments. */
-    public static MedicalDataSource.Builder getMedicalDataSourceBuilderWithLastDataUpdateTime() {
-        return new MedicalDataSource.Builder(
-                        DATA_SOURCE_ID,
-                        DATA_SOURCE_PACKAGE_NAME,
-                        DATA_SOURCE_FHIR_BASE_URI,
-                        DATA_SOURCE_DISPLAY_NAME)
+    public static MedicalDataSource.Builder getMedicalDataSourceBuilderWithOptionalFields() {
+        return getMedicalDataSourceBuilderRequiredFieldsOnly()
                 .setLastDataUpdateTime(DATA_SOURCE_LAST_DATA_UPDATE_TIME);
     }
 
@@ -144,8 +185,8 @@
     }
 
     /** Creates and returns a {@link MedicalDataSource} with default arguments. */
-    public static MedicalDataSource getMedicalDataSourceWithLastDataUpdateTime() {
-        return getMedicalDataSourceBuilderWithLastDataUpdateTime().build();
+    public static MedicalDataSource getMedicalDataSourceWithOptionalFields() {
+        return getMedicalDataSourceBuilderWithOptionalFields().build();
     }
 
     /**
@@ -167,7 +208,7 @@
     public static CreateMedicalDataSourceRequest.Builder
             getCreateMedicalDataSourceRequestBuilder() {
         return new CreateMedicalDataSourceRequest.Builder(
-                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME);
+                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME, DATA_SOURCE_FHIR_VERSION);
     }
 
     /**
@@ -179,7 +220,7 @@
             String suffix) {
         Uri fhirBaseUri = Uri.withAppendedPath(DATA_SOURCE_FHIR_BASE_URI, "/" + suffix);
         return new CreateMedicalDataSourceRequest.Builder(
-                fhirBaseUri, DATA_SOURCE_DISPLAY_NAME + " " + suffix);
+                fhirBaseUri, DATA_SOURCE_DISPLAY_NAME + " " + suffix, DATA_SOURCE_FHIR_VERSION);
     }
 
     /** Creates and returns a {@link CreateMedicalDataSourceRequest} with default arguments. */
@@ -253,7 +294,10 @@
                 .build();
     }
 
-    /** Creates and returns a {@link FhirResource} with Allergy data. */
+    /**
+     * Creates and returns a {@link FhirResource} with {@link PhrDataFactory#FHIR_DATA_ALLERGY}
+     * data.
+     */
     public static FhirResource getFhirResourceAllergy() {
         return new FhirResource.Builder(
                         FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
@@ -263,16 +307,25 @@
     }
 
     /**
+     * Creates and returns a {@link FhirResource} with {@link
+     * PhrDataFactory#DIFFERENT_FHIR_DATA_ALLERGY} data.
+     */
+    public static FhirResource getFhirResourceDifferentAllergy() {
+        return new FhirResource.Builder(
+                        FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
+                        DIFFERENT_FHIR_RESOURCE_ID_ALLERGY,
+                        DIFFERENT_FHIR_DATA_ALLERGY)
+                .build();
+    }
+
+    /**
      * Creates and returns a {@link MedicalResource.Builder} with default arguments.
      *
      * <p>By default, it contains the {@link PhrDataFactory#FHIR_DATA_IMMUNIZATION}.
      */
     public static MedicalResource.Builder getMedicalResourceBuilder() {
         return new MedicalResource.Builder(
-                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                DATA_SOURCE_ID,
-                FHIR_VERSION_R4,
-                getFhirResource());
+                MEDICAL_RESOURCE_TYPE_VACCINES, DATA_SOURCE_ID, FHIR_VERSION_R4, getFhirResource());
     }
 
     /**
@@ -286,12 +339,13 @@
 
     /**
      * Creates and returns a {@link MedicalResource} of type {@link
-     * MedicalResource#MEDICAL_RESOURCE_TYPE_IMMUNIZATION} with the given {@code dataSource}.
+     * MedicalResource#MEDICAL_RESOURCE_TYPE_VACCINES} which contains {@link
+     * PhrDataFactory#getFhirResource} data, with the given {@code dataSourceId}.
      */
-    public static MedicalResource createImmunizationMedicalResource(String dataSource) {
+    public static MedicalResource createVaccineMedicalResource(String dataSourceId) {
         return new MedicalResource.Builder(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        dataSource,
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        dataSourceId,
                         FHIR_VERSION_R4,
                         getFhirResource())
                 .build();
@@ -299,13 +353,17 @@
 
     /**
      * Creates and returns a {@link MedicalResource} of type {@link
-     * MedicalResource#MEDICAL_RESOURCE_TYPE_IMMUNIZATION} and {@link
-     * PhrDataFactory#DIFFERENT_FHIR_DATA_IMMUNIZATION} data, with the given {@code dataSource}.
+     * MedicalResource#MEDICAL_RESOURCE_TYPE_VACCINES} which contains {@link
+     * PhrDataFactory#getFhirResourceDifferentImmunization} data, with the given {@code
+     * dataSourceId}.
+     *
+     * <p>The contained FHIR data has a different resource ID than the above {@link
+     * PhrDataFactory#createVaccineMedicalResource}.
      */
-    public static MedicalResource createDifferentImmunizationMedicalResource(String dataSource) {
+    public static MedicalResource createDifferentVaccineMedicalResource(String dataSourceId) {
         return new MedicalResource.Builder(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        dataSource,
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        dataSourceId,
                         FHIR_VERSION_R4,
                         getFhirResourceDifferentImmunization())
                 .build();
@@ -313,14 +371,18 @@
 
     /**
      * Creates and returns a {@link MedicalResource} of type {@link
-     * MedicalResource#MEDICAL_RESOURCE_TYPE_IMMUNIZATION} with the given {@code dataSource} with
-     * the default {@link PhrDataFactory#FHIR_DATA_IMMUNIZATION}'s status field added.
+     * MedicalResource#MEDICAL_RESOURCE_TYPE_VACCINES} which contains {@link
+     * PhrDataFactory#getUpdatedImmunizationFhirResource} data, with the given {@code dataSourceId}.
+     *
+     * <p>The contained FHIR data has the same resource ID as the above {@link
+     * PhrDataFactory#createVaccineMedicalResource}, but data is updated with a "status" field
+     * added.
      */
-    public static MedicalResource createUpdatedImmunizationMedicalResource(String dataSource)
+    public static MedicalResource createUpdatedVaccineMedicalResource(String dataSourceId)
             throws JSONException {
         return new MedicalResource.Builder(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        dataSource,
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        dataSourceId,
                         FHIR_VERSION_R4,
                         getUpdatedImmunizationFhirResource())
                 .build();
@@ -328,18 +390,55 @@
 
     /**
      * Creates and returns a {@link MedicalResource} of type {@link
-     * MedicalResource#MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE} with the given {@code dataSource}.
+     * MedicalResource#MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES} which contains {@link
+     * PhrDataFactory#getFhirResourceAllergy} data, with the given {@code dataSourceId}.
      */
-    public static MedicalResource createAllergyMedicalResource(String dataSource) {
+    public static MedicalResource createAllergyMedicalResource(String dataSourceId) {
         return new MedicalResource.Builder(
-                        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                        dataSource,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                        dataSourceId,
                         FHIR_VERSION_R4,
                         getFhirResourceAllergy())
                 .build();
     }
 
     /**
+     * Creates and returns a {@link MedicalResource} of type {@link
+     * MedicalResource#MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES} which contains {@link
+     * PhrDataFactory#getFhirResourceDifferentAllergy} data, with the given {@code dataSourceId}.
+     *
+     * <p>The contained FHIR data has a different resource ID than the above {@link
+     * PhrDataFactory#createAllergyMedicalResource}.
+     */
+    public static MedicalResource createDifferentAllergyMedicalResource(String dataSourceId) {
+        return new MedicalResource.Builder(
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                        dataSourceId,
+                        FHIR_VERSION_R4,
+                        getFhirResourceDifferentAllergy())
+                .build();
+    }
+
+    /**
+     * Creates and returns a {@link MedicalResource} of type {@link
+     * MedicalResource#MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES} which contains {@link
+     * PhrDataFactory#getUpdatedAllergyFhirResource} data, with the given {@code dataSourceId}.
+     *
+     * <p>The contained FHIR data has the same resource ID as the above {@link
+     * PhrDataFactory#createAllergyMedicalResource}, but data is updated with a "status" field
+     * added.
+     */
+    public static MedicalResource createUpdatedAllergyMedicalResource(String dataSourceId)
+            throws JSONException {
+        return new MedicalResource.Builder(
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                        dataSourceId,
+                        FHIR_VERSION_R4,
+                        getUpdatedAllergyFhirResource())
+                .build();
+    }
+
+    /**
      * Creates and returns a {@link UpsertMedicalResourceRequest.Builder} with default arguments.
      */
     public static UpsertMedicalResourceRequest.Builder getUpsertMedicalResourceRequestBuilder() {
@@ -376,23 +475,24 @@
     }
 
     /**
-     * Creates a number of immunization resources based on the given {@code numOfResources} and
-     * {@code dataSourceId}.
+     * Creates a number of vaccine resources based on the given {@code numOfResources} and {@code
+     * dataSourceId}.
      */
-    public static List<MedicalResource> createImmunizationMedicalResources(
+    public static List<MedicalResource> createVaccineMedicalResources(
             int numOfResources, String dataSourceId) {
         FhirVersion fhirVersion = parseFhirVersion(R4_VERSION_STRING);
         List<MedicalResource> medicalResources = new ArrayList<>();
         for (int i = 0; i < numOfResources; i++) {
+            String fhirResourceId = "id/" + i;
             FhirResource fhirResource =
                     new FhirResource.Builder(
                                     FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                                    "id/" + i,
-                                    FHIR_DATA_IMMUNIZATION)
+                                    fhirResourceId,
+                                    new ImmunizationBuilder().setId(fhirResourceId).toJson())
                             .build();
             MedicalResource medicalResource =
                     new MedicalResource.Builder(
-                                    MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                                    MEDICAL_RESOURCE_TYPE_VACCINES,
                                     dataSourceId,
                                     fhirVersion,
                                     fhirResource)
@@ -419,7 +519,7 @@
                             .build();
             MedicalResource medicalResource =
                     new MedicalResource.Builder(
-                                    MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
+                                    MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
                                     dataSourceId,
                                     fhirVersion,
                                     fhirResource)
@@ -428,4 +528,17 @@
         }
         return medicalResources;
     }
+
+    /**
+     * Given two {@link MedicalDataSource}s, compare whether they are equal or not. This ignores the
+     * {@link MedicalDataSource#getLastDataUpdateTime()}.
+     */
+    public static boolean isMedicalDataSourceEqual(
+            MedicalDataSource actual, MedicalDataSource expected) {
+        return Objects.equals(actual.getId(), expected.getId())
+                && Objects.equals(actual.getFhirVersion(), expected.getFhirVersion())
+                && Objects.equals(actual.getFhirBaseUri(), expected.getFhirBaseUri())
+                && Objects.equals(actual.getPackageName(), expected.getPackageName())
+                && Objects.equals(actual.getDisplayName(), expected.getDisplayName());
+    }
 }
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PractitionerBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PractitionerBuilder.java
new file mode 100644
index 0000000..de1b477
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/PractitionerBuilder.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+/**
+ * Test helper class for making practitioner related FHIR data, including <a
+ * href="https://www.hl7.org/fhir/practitioner.html">Practitioner</a> and <a
+ * href="https://www.hl7.org/fhir/practitionerrole.html">PractitionerRole</a> - see {@link #role()}.
+ */
+public final class PractitionerBuilder extends FhirResourceBuilder<PractitionerBuilder> {
+
+    private static final String DEFAULT_PRACTITIONER_JSON =
+            "{"
+                    + "  \"resourceType\": \"Practitioner\","
+                    + "  \"id\": \"f001\","
+                    + "  \"identifier\": ["
+                    + "    {"
+                    + "      \"use\": \"official\","
+                    + "      \"system\": \"urn:oid:2.16.528.1.1007.3.1\","
+                    + "      \"value\": \"938273695\""
+                    + "    },"
+                    + "    {"
+                    + "      \"use\": \"usual\","
+                    + "      \"system\": \"urn:oid:2.16.840.1.113883.2.4.6.3\","
+                    + "      \"value\": \"129IDH4OP733\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"name\": ["
+                    + "    {"
+                    + "      \"use\": \"official\","
+                    + "      \"family\": \"van den broek\","
+                    + "      \"given\": ["
+                    + "        \"Eric\""
+                    + "      ],"
+                    + "      \"suffix\": ["
+                    + "        \"MD\""
+                    + "      ]"
+                    + "    }"
+                    + "  ],"
+                    + "  \"telecom\": ["
+                    + "    {"
+                    + "      \"system\": \"phone\","
+                    + "      \"value\": \"0205568263\","
+                    + "      \"use\": \"work\""
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"email\","
+                    + "      \"value\": \"[email protected]\","
+                    + "      \"use\": \"work\""
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"fax\","
+                    + "      \"value\": \"0205664440\","
+                    + "      \"use\": \"work\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"address\": ["
+                    + "    {"
+                    + "      \"use\": \"work\","
+                    + "      \"line\": ["
+                    + "        \"Galapagosweg 91\""
+                    + "      ],"
+                    + "      \"city\": \"Den Burg\","
+                    + "      \"postalCode\": \"9105 PZ\","
+                    + "      \"country\": \"NLD\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"gender\": \"male\","
+                    + "  \"birthDate\": \"1975-12-07\""
+                    + "}";
+
+    private static final String DEFAULT_PRACTITIONER_ROLE_JSON =
+            "{"
+                    + "  \"resourceType\": \"PractitionerRole\","
+                    + "  \"id\": \"example\","
+                    + "  \"identifier\": ["
+                    + "    {"
+                    + "      \"system\": \"http://www.acme.org/practitioners\","
+                    + "      \"value\": \"23\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"active\": true,"
+                    + "  \"period\": {"
+                    + "    \"start\": \"2012-01-01\","
+                    + "    \"end\": \"2012-03-31\""
+                    + "  },"
+                    + "  \"practitioner\": {"
+                    + "    \"reference\": \"Practitioner/example\","
+                    + "    \"display\": \"Dr Adam Careful\""
+                    + "  },"
+                    + "  \"organization\": {"
+                    + "    \"reference\": \"Organization/f001\""
+                    + "  },"
+                    + "  \"code\": ["
+                    + "    {"
+                    + "      \"coding\": ["
+                    + "        {"
+                    + "          \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0286\","
+                    + "          \"code\": \"RP\""
+                    + "        }"
+                    + "      ]"
+                    + "    }"
+                    + "  ],"
+                    + "  \"specialty\": ["
+                    + "    {"
+                    + "      \"coding\": ["
+                    + "        {"
+                    + "          \"system\": \"http://snomed.info/sct\","
+                    + "          \"code\": \"408443003\","
+                    + "          \"display\": \"General medical practice\""
+                    + "        }"
+                    + "      ]"
+                    + "    }"
+                    + "  ],"
+                    + "  \"location\": ["
+                    + "    {"
+                    + "      \"reference\": \"Location/1\","
+                    + "      \"display\": \"South Wing, second floor\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"healthcareService\": ["
+                    + "    {"
+                    + "      \"reference\": \"HealthcareService/example\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"telecom\": ["
+                    + "    {"
+                    + "      \"system\": \"phone\","
+                    + "      \"value\": \"(03) 5555 6473\","
+                    + "      \"use\": \"work\""
+                    + "    },"
+                    + "    {"
+                    + "      \"system\": \"email\","
+                    + "      \"value\": \"[email protected]\","
+                    + "      \"use\": \"work\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"availableTime\": ["
+                    + "    {"
+                    + "      \"daysOfWeek\": ["
+                    + "        \"mon\","
+                    + "        \"tue\","
+                    + "        \"wed\""
+                    + "      ],"
+                    + "      \"availableStartTime\": \"09:00:00\","
+                    + "      \"availableEndTime\": \"16:30:00\""
+                    + "    },"
+                    + "    {"
+                    + "      \"daysOfWeek\": ["
+                    + "        \"thu\","
+                    + "        \"fri\""
+                    + "      ],"
+                    + "      \"availableStartTime\": \"09:00:00\","
+                    + "      \"availableEndTime\": \"12:00:00\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"notAvailable\": ["
+                    + "    {"
+                    + "      \"description\": \"Adam will be on extended leave during May 2017\","
+                    + "      \"during\": {"
+                    + "        \"start\": \"2017-05-01\","
+                    + "        \"end\": \"2017-05-20\""
+                    + "      }"
+                    + "    }"
+                    + "  ],"
+                    + "  \"availabilityExceptions\":"
+                    + "\"Adam is generally unavailable on public holidays\","
+                    + "  \"endpoint\": ["
+                    + "    {"
+                    + "      \"reference\": \"Endpoint/example\""
+                    + "    }"
+                    + "  ]"
+                    + "}";
+
+    public static class PractitionerRoleBuilder
+            extends FhirResourceBuilder<PractitionerRoleBuilder> {
+
+        private PractitionerRoleBuilder() {
+            super(DEFAULT_PRACTITIONER_ROLE_JSON);
+        }
+
+        @Override
+        protected PractitionerRoleBuilder returnThis() {
+            return this;
+        }
+    }
+
+    /**
+     * Returns a helper class that can build FHIR test data for <a
+     * href="https://www.hl7.org/fhir/practitionerrole.html">PractitionerRole</a> resources.
+     */
+    public static PractitionerRoleBuilder role() {
+        return new PractitionerRoleBuilder();
+    }
+
+    public PractitionerBuilder() {
+        super(DEFAULT_PRACTITIONER_JSON);
+    }
+
+    @Override
+    protected PractitionerBuilder returnThis() {
+        return this;
+    }
+}
diff --git a/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ProcedureBuilder.java b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ProcedureBuilder.java
new file mode 100644
index 0000000..c5327b7
--- /dev/null
+++ b/tests/cts/phr/src/android/healthconnect/cts/phr/utils/ProcedureBuilder.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.phr.utils;
+
+public final class ProcedureBuilder extends FhirResourceBuilder<ProcedureBuilder> {
+
+    private static final String DEFAULT_JSON =
+            "{"
+                    + "  \"resourceType\": \"Procedure\","
+                    + "  \"id\": \"f001\","
+                    + "  \"status\": \"completed\","
+                    + "  \"code\": {"
+                    + "    \"coding\": ["
+                    + "      {"
+                    + "        \"system\": \"http://snomed.info/sct\","
+                    + "        \"code\": \"34068001\","
+                    + "        \"display\": \"Heart valve replacement\""
+                    + "      }"
+                    + "    ]"
+                    + "  },"
+                    + "  \"subject\": {"
+                    + "    \"reference\": \"Patient/f001\","
+                    + "    \"display\": \"P. van de Heuvel\""
+                    + "  },"
+                    + "  \"encounter\": {"
+                    + "    \"reference\": \"Encounter/f001\""
+                    + "  },"
+                    + "  \"performedPeriod\": {"
+                    + "    \"start\": \"2011-06-26\","
+                    + "    \"end\": \"2011-06-27\""
+                    + "  },"
+                    + "  \"performer\": ["
+                    + "    {"
+                    + "      \"function\": {"
+                    + "        \"coding\": ["
+                    + "          {"
+                    + "            \"system\": \"urn:oid:2.16.840.1.113883.2.4.15.111\","
+                    + "            \"code\": \"01.000\","
+                    + "            \"display\": \"Arts\""
+                    + "          }"
+                    + "        ],"
+                    + "        \"text\": \"Care role\""
+                    + "      },"
+                    + "      \"actor\": {"
+                    + "        \"reference\": \"Practitioner/f002\","
+                    + "        \"display\": \"P. Voigt\""
+                    + "      }"
+                    + "    }"
+                    + "  ],"
+                    + "  \"reasonCode\": ["
+                    + "    {"
+                    + "      \"text\": \"Heart valve disorder\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"bodySite\": ["
+                    + "    {"
+                    + "      \"coding\": ["
+                    + "        {"
+                    + "          \"system\": \"http://snomed.info/sct\","
+                    + "          \"code\": \"17401000\","
+                    + "          \"display\": \"Heart valve structure\""
+                    + "        }"
+                    + "      ]"
+                    + "    }"
+                    + "  ],"
+                    + "  \"outcome\": {"
+                    + "    \"text\": \"improved blood circulation\""
+                    + "  },"
+                    + "  \"report\": ["
+                    + "    {"
+                    + "      \"reference\": \"DiagnosticReport/f001\","
+                    + "      \"display\": \"Lab results blood test\""
+                    + "    }"
+                    + "  ],"
+                    + "  \"followUp\": ["
+                    + "    {"
+                    + "      \"text\": \"described in care plan\""
+                    + "    }"
+                    + "  ]"
+                    + "}";
+
+    /**
+     * Creates a default valid FHIR Procedure.
+     *
+     * <p>All that should be relied on is that the Procedure is valid. To rely on anything else set
+     * it with the other methods.
+     */
+    public ProcedureBuilder() {
+        super(DEFAULT_JSON);
+    }
+
+    @Override
+    protected ProcedureBuilder returnThis() {
+        return this;
+    }
+}
diff --git a/tests/cts/route/Android.bp b/tests/cts/route/Android.bp
index 8595612..14ac0e6 100644
--- a/tests/cts/route/Android.bp
+++ b/tests/cts/route/Android.bp
@@ -40,9 +40,12 @@
     test_suites: [
         "cts",
         "general-tests",
+        "mts-healthfitness",
+        "mcts-healthfitness",
     ],
-    sdk_version: "test_current",
     min_sdk_version: "34",
+    target_sdk_version: "34",
+    sdk_version: "module_current",
     libs: [
         "android.test.base.stubs.test",
         "android.test.mock.stubs.test",
@@ -62,8 +65,9 @@
         "cts-healthconnect-lib",
         "cts-healthconnect-test-helper",
     ],
-    sdk_version: "test_current",
     min_sdk_version: "34",
+    target_sdk_version: "34",
+    sdk_version: "module_current",
 }
 
 android_test_helper_app {
@@ -73,6 +77,7 @@
         "cts-healthconnect-lib",
         "cts-healthconnect-test-helper",
     ],
-    sdk_version: "test_current",
     min_sdk_version: "34",
+    target_sdk_version: "34",
+    sdk_version: "module_current",
 }
diff --git a/tests/cts/route/RouteReaderWriterAppManifest.xml b/tests/cts/route/RouteReaderWriterAppManifest.xml
index 3aeea26..149d9a8 100644
--- a/tests/cts/route/RouteReaderWriterAppManifest.xml
+++ b/tests/cts/route/RouteReaderWriterAppManifest.xml
@@ -27,6 +27,9 @@
     <uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
     <uses-permission android:name="android.permission.health.WRITE_EXERCISE_ROUTE"/>
 
+    <!-- Used to check if App Ops considers the app to be in the background -->
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+
     <application android:label="CtsExerciseRouteTestAllRoutesReaderApp">
         <activity android:name="android.healthconnect.cts.testhelper.TestAppActivity"
             android:exported="true">
diff --git a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteBackgroundReadTest.java b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteBackgroundReadTest.java
index 88f393e..9b998f2 100644
--- a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteBackgroundReadTest.java
+++ b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteBackgroundReadTest.java
@@ -24,8 +24,15 @@
 import static android.healthconnect.cts.utils.TestUtils.connectAppsWithGrantedPermissions;
 import static android.healthconnect.cts.utils.TestUtils.deleteAllStagedRemoteData;
 
+import static com.android.compatibility.common.util.SystemUtil.eventually;
+
 import static com.google.common.truth.Truth.assertThat;
 
+import static java.util.Objects.requireNonNull;
+
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
 import android.health.connect.ReadRecordsRequestUsingFilters;
 import android.health.connect.ReadRecordsRequestUsingIds;
 import android.health.connect.changelog.ChangeLogTokenRequest;
@@ -34,9 +41,10 @@
 import android.health.connect.datatypes.ExerciseSessionRecord;
 import android.healthconnect.cts.lib.TestAppProxy;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
-import android.healthconnect.cts.utils.DeviceConfigRule;
 import android.healthconnect.cts.utils.TestUtils;
 
+import androidx.test.core.app.ApplicationProvider;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -51,21 +59,34 @@
     private static final TestAppProxy ROUTES_READER_WRITER_BACKGROUND_APP =
             TestAppProxy.forPackageNameInBackground(ROUTES_READER_WRITER_APP.getPackageName());
 
-    private static final String BACKGROUND_READ_FEATURE_FLAG = "background_read_enable";
-
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
-
-    @Rule
-    public DeviceConfigRule mDeviceConfigRule =
-            new DeviceConfigRule(BACKGROUND_READ_FEATURE_FLAG, "true");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
+        // Ensure that App Ops considers the test app to be in the background. This may take a few
+        // seconds if another test has recently launched it in the foreground.
+        Context context = ApplicationProvider.getApplicationContext();
+        PackageManager packageManager = context.getPackageManager();
+        AppOpsManager appOpsManager = requireNonNull(context.getSystemService(AppOpsManager.class));
+        String packageName = ROUTES_READER_WRITER_BACKGROUND_APP.getPackageName();
+        int uid = packageManager.getPackageUid(packageName, /* flags= */ 0);
+        eventually(
+                () ->
+                        assertThat(
+                                        appOpsManager.unsafeCheckOp(
+                                                AppOpsManager.OPSTR_FINE_LOCATION,
+                                                uid,
+                                                packageName))
+                                .isEqualTo(AppOpsManager.MODE_IGNORED));
+
         assertCorrectHealthPermissions();
         connectAppsWithGrantedPermissions();
+
+        deleteAllStagedRemoteData();
     }
 
     @After
diff --git a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteManageHealthDataTest.java b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteManageHealthDataTest.java
index 880e4b9..44dd357 100644
--- a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteManageHealthDataTest.java
+++ b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteManageHealthDataTest.java
@@ -51,7 +51,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteNoReadWritePermissionTest.java b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteNoReadWritePermissionTest.java
index 85a9dee..2a58e5d 100644
--- a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteNoReadWritePermissionTest.java
+++ b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteNoReadWritePermissionTest.java
@@ -58,7 +58,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteReadTest.java b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteReadTest.java
index 3c21277..dee169f 100644
--- a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteReadTest.java
+++ b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteReadTest.java
@@ -53,7 +53,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteWriteTest.java b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteWriteTest.java
index 0c805f7..2536a9c 100644
--- a/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteWriteTest.java
+++ b/tests/cts/route/src/android/healthconnect/cts/route/ExerciseRouteWriteTest.java
@@ -54,7 +54,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/cts/route/src/android/healthconnect/cts/route/ReadExerciseRoutePermissionTest.java b/tests/cts/route/src/android/healthconnect/cts/route/ReadExerciseRoutePermissionTest.java
index b75024d..a37a165 100644
--- a/tests/cts/route/src/android/healthconnect/cts/route/ReadExerciseRoutePermissionTest.java
+++ b/tests/cts/route/src/android/healthconnect/cts/route/ReadExerciseRoutePermissionTest.java
@@ -51,7 +51,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/cts/route/src/android/healthconnect/cts/route/ReadExerciseRoutesPermissionTest.java b/tests/cts/route/src/android/healthconnect/cts/route/ReadExerciseRoutesPermissionTest.java
index 39db3fe..344a52c 100644
--- a/tests/cts/route/src/android/healthconnect/cts/route/ReadExerciseRoutesPermissionTest.java
+++ b/tests/cts/route/src/android/healthconnect/cts/route/ReadExerciseRoutesPermissionTest.java
@@ -50,7 +50,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/cts/src/android/healthconnect/cts/GetActivityDatesTest.java b/tests/cts/src/android/healthconnect/cts/GetActivityDatesTest.java
index 77a06f0..9c8de55 100644
--- a/tests/cts/src/android/healthconnect/cts/GetActivityDatesTest.java
+++ b/tests/cts/src/android/healthconnect/cts/GetActivityDatesTest.java
@@ -54,7 +54,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() {
diff --git a/tests/cts/src/android/healthconnect/cts/GetApplicationInfoTest.java b/tests/cts/src/android/healthconnect/cts/GetApplicationInfoTest.java
index aa88e47..e55d343 100644
--- a/tests/cts/src/android/healthconnect/cts/GetApplicationInfoTest.java
+++ b/tests/cts/src/android/healthconnect/cts/GetApplicationInfoTest.java
@@ -16,128 +16,196 @@
 
 package android.healthconnect.cts;
 
+import static android.healthconnect.cts.lib.TestAppProxy.APP_WRITE_PERMS_ONLY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
 import static android.healthconnect.cts.utils.DataFactory.getTestRecords;
+import static android.healthconnect.cts.utils.HealthConnectReceiver.callAndGetResponseWithShellPermissionIdentity;
 import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
+import static android.healthconnect.cts.utils.TestOutcomeReceiver.outcomeExecutor;
+import static android.healthconnect.cts.utils.TestUtils.deleteAllStagedRemoteData;
+import static android.healthconnect.cts.utils.TestUtils.insertRecords;
+import static android.healthconnect.cts.utils.TestUtils.verifyDeleteRecords;
+
+import static com.android.compatibility.common.util.SystemUtil.getEventually;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.app.UiAutomation;
+import static java.util.Objects.requireNonNull;
+
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
 import android.health.connect.ApplicationInfoResponse;
+import android.health.connect.DeleteUsingFiltersRequest;
 import android.health.connect.HealthConnectException;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.datatypes.AppInfo;
+import android.health.connect.datatypes.DataOrigin;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
 import android.healthconnect.cts.utils.TestUtils;
-import android.os.OutcomeReceiver;
 import android.platform.test.annotations.AppModeFull;
-import android.util.Log;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 
-import androidx.test.InstrumentationRegistry;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
-import org.junit.Assert;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 @AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
 @RunWith(AndroidJUnit4.class)
 public class GetApplicationInfoTest {
-    private static final String TAG = "GetApplicationInfoTest";
-    private static final UiAutomation sUiAutomation =
-            InstrumentationRegistry.getInstrumentation().getUiAutomation();
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
 
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
-    /** TODO(b/257796081): Cleanup the database after each test. */
+    private Context mContext;
+    private HealthConnectManager mManager;
+    private PhrCtsTestUtils mPhrTestUtils;
+
+    @Before
+    public void setUp() throws InterruptedException {
+        deleteAllStagedRemoteData();
+        mContext = ApplicationProvider.getApplicationContext();
+        deleteAllRecords(mContext.getApplicationInfo().packageName);
+        mManager = requireNonNull(mContext.getSystemService(HealthConnectManager.class));
+        mPhrTestUtils = new PhrCtsTestUtils(mManager);
+        mPhrTestUtils.deleteAllMedicalData();
+    }
+
+    @After
+    public void after() throws InterruptedException {
+        deleteAllStagedRemoteData();
+        mPhrTestUtils.deleteAllMedicalData();
+    }
+
+    private void deleteAllRecords(String packageName) throws InterruptedException {
+        verifyDeleteRecords(
+                new DeleteUsingFiltersRequest.Builder()
+                        .addDataOrigin(new DataOrigin.Builder().setPackageName(packageName).build())
+                        .build());
+    }
+
     @Test
     public void testEmptyApplicationInfo() throws InterruptedException {
-        sUiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+        ApplicationInfoResponse response =
+                callAndGetResponseWithShellPermissionIdentity(
+                        mManager::getContributorApplicationsInfo, MANAGE_HEALTH_DATA);
 
-        try {
-            Context context = ApplicationProvider.getApplicationContext();
-            HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-            CountDownLatch latch = new CountDownLatch(1);
-            assertThat(service).isNotNull();
-            AtomicReference<List<AppInfo>> response = new AtomicReference<>();
-            service.getContributorApplicationsInfo(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(ApplicationInfoResponse result) {
-                            response.set(result.getApplicationInfoList());
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(HealthConnectException exception) {
-                            Log.e(TAG, exception.getMessage());
-                        }
-                    });
-            assertThat(latch.await(3, TimeUnit.SECONDS)).isEqualTo(true);
-        } finally {
-            sUiAutomation.dropShellPermissionIdentity();
-        }
-
-        /** TODO(b/257796081): Test the response size after database clean up is implemented */
-        // assertThat(response.get()).hasSize(0);
+        assertThat(response.getApplicationInfoList()).hasSize(0);
     }
 
     @Test
     public void testEmptyApplicationInfo_no_perm() throws InterruptedException {
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        CountDownLatch latch = new CountDownLatch(1);
-        assertThat(service).isNotNull();
-        AtomicReference<List<AppInfo>> response = new AtomicReference<>();
-        AtomicReference<HealthConnectException> healthConnectExceptionAtomicReference =
-                new AtomicReference<>();
-        try {
-            TestUtils.getApplicationInfo();
-            Assert.fail("Reading app info must not be allowed without right HC permission");
-        } catch (HealthConnectException healthConnectException) {
-            assertThat(healthConnectException.getErrorCode())
-                    .isEqualTo(HealthConnectException.ERROR_SECURITY);
-        }
+        HealthConnectReceiver<ApplicationInfoResponse> receiver = new HealthConnectReceiver<>();
+        mManager.getContributorApplicationsInfo(outcomeExecutor(), receiver);
+        HealthConnectException healthConnectException = receiver.assertAndGetException();
+        assertThat(healthConnectException.getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_SECURITY);
     }
 
     @Test
-    public void testGetApplicationInfo() throws InterruptedException {
-        Context context = ApplicationProvider.getApplicationContext();
-        CountDownLatch latch = new CountDownLatch(1);
-        TestUtils.insertRecords(getTestRecords());
-        sUiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+    public void testGetApplicationInfo() throws Exception {
+        insertRecords(getTestRecords());
+        // App info table will be updated in the background, so might take some additional time.
+        ApplicationInfoResponse eventualResponse =
+                getEventually(
+                        () -> {
+                            ApplicationInfoResponse response =
+                                    callAndGetResponseWithShellPermissionIdentity(
+                                            mManager::getContributorApplicationsInfo,
+                                            MANAGE_HEALTH_DATA);
+                            assertThat(response.getApplicationInfoList()).hasSize(1);
+                            return response;
+                        });
 
-        try {
-            // Wait for some time, as app info table will be  updated in the background so might
-            // take some additional time.
-            latch.await(1, TimeUnit.SECONDS);
+        AppInfo appInfo = eventualResponse.getApplicationInfoList().get(0);
+        ApplicationInfo applicationInfo = mContext.getApplicationInfo();
+        assertThat(appInfo.getPackageName()).isEqualTo(applicationInfo.packageName);
+        assertThat(appInfo.getName())
+                .isEqualTo(
+                        mContext.getPackageManager()
+                                .getApplicationLabel(applicationInfo)
+                                .toString());
+        assertThat(appInfo.getIcon()).isNotNull();
+    }
 
-            List<AppInfo> result = TestUtils.getApplicationInfo();
-            assertThat(result).hasSize(1);
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetApplicationInfo_appCreatesMedicalDataSourceOnly_isInContributingApps()
+            throws Exception {
+        // Create health fitness data.
+        insertRecords(getTestRecords());
+        // Create medical data with a different package.
+        APP_WRITE_PERMS_ONLY.createMedicalDataSource(getCreateMedicalDataSourceRequest());
 
-            AppInfo appInfo = result.get(0);
+        // App info table will be updated in the background, so might take some additional time.
+        ApplicationInfoResponse eventualResponse =
+                getEventually(
+                        () -> {
+                            ApplicationInfoResponse response =
+                                    callAndGetResponseWithShellPermissionIdentity(
+                                            mManager::getContributorApplicationsInfo,
+                                            MANAGE_HEALTH_DATA);
+                            assertThat(response.getApplicationInfoList()).hasSize(2);
+                            return response;
+                        });
 
-            assertThat(appInfo.getPackageName())
-                    .isEqualTo(context.getApplicationInfo().packageName);
-            assertThat(appInfo.getName())
-                    .isEqualTo(
-                            context.getPackageManager()
-                                    .getApplicationLabel(context.getApplicationInfo()));
-            assertThat(appInfo.getIcon()).isNotNull();
-        } finally {
-            sUiAutomation.dropShellPermissionIdentity();
-        }
+        assertThat(
+                        eventualResponse.getApplicationInfoList().stream()
+                                .map(AppInfo::getPackageName)
+                                .collect(Collectors.toSet()))
+                .containsExactly(
+                        mContext.getApplicationInfo().packageName,
+                        APP_WRITE_PERMS_ONLY.getPackageName());
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetApplicationInfo_appCreatesMedicalDataSourceWithData_isInContributingApps()
+            throws Exception {
+        // Create health fitness data.
+        insertRecords(getTestRecords());
+        // Create a dataSource and a medicalResource with a different package.
+        MedicalDataSource dataSource =
+                APP_WRITE_PERMS_ONLY.createMedicalDataSource(getCreateMedicalDataSourceRequest());
+        APP_WRITE_PERMS_ONLY.upsertMedicalResource(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
+
+        // App info table will be updated in the background, so might take some additional time.
+        ApplicationInfoResponse eventualResponse =
+                getEventually(
+                        () -> {
+                            ApplicationInfoResponse response =
+                                    callAndGetResponseWithShellPermissionIdentity(
+                                            mManager::getContributorApplicationsInfo,
+                                            MANAGE_HEALTH_DATA);
+                            assertThat(response.getApplicationInfoList()).hasSize(2);
+                            return response;
+                        });
+
+        assertThat(
+                        eventualResponse.getApplicationInfoList().stream()
+                                .map(AppInfo::getPackageName)
+                                .collect(Collectors.toSet()))
+                .containsExactly(
+                        mContext.getApplicationInfo().packageName,
+                        APP_WRITE_PERMS_ONLY.getPackageName());
     }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/GetMedicalDataSourcesRequestTest.java b/tests/cts/src/android/healthconnect/cts/GetMedicalDataSourcesRequestTest.java
deleted file mode 100644
index be153fb..0000000
--- a/tests/cts/src/android/healthconnect/cts/GetMedicalDataSourcesRequestTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.healthconnect.cts;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.health.connect.GetMedicalDataSourcesRequest;
-import android.os.Parcel;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.healthfitness.flags.Flags;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RequiresFlagsEnabled(Flags.FLAG_PERSONAL_HEALTH_RECORD)
-@RunWith(AndroidJUnit4.class)
-public class GetMedicalDataSourcesRequestTest {
-    @Rule
-    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
-
-    @Test
-    public void testBuilder_constructor() {
-        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
-
-        assertThat(request.getPackageNames()).isEmpty();
-    }
-
-    @Test
-    public void testBuilder_addPackageNames() {
-        GetMedicalDataSourcesRequest request =
-                new GetMedicalDataSourcesRequest.Builder()
-                        .addPackageName("com.foo")
-                        .addPackageName("com.bar")
-                        .build();
-
-        assertThat(request.getPackageNames()).containsExactly("com.foo", "com.bar");
-    }
-
-    @Test
-    public void testRequest_equalsAndHashcode() {
-        GetMedicalDataSourcesRequest request =
-                new GetMedicalDataSourcesRequest.Builder()
-                        .addPackageName("com.foo")
-                        .addPackageName("com.bar")
-                        .build();
-        GetMedicalDataSourcesRequest requestSame =
-                new GetMedicalDataSourcesRequest.Builder()
-                        .addPackageName("com.bar")
-                        .addPackageName("com.foo")
-                        .build();
-        GetMedicalDataSourcesRequest requestDifferent =
-                new GetMedicalDataSourcesRequest.Builder()
-                        .addPackageName("com.bar")
-                        .addPackageName("com.foo")
-                        .addPackageName("com.baz")
-                        .build();
-
-        assertThat(request).isEqualTo(requestSame);
-        assertThat(request.hashCode()).isEqualTo(requestSame.hashCode());
-        assertThat(request).isNotEqualTo(requestDifferent);
-    }
-
-    @Test
-    public void testWriteToParcelThenRestore_objectsAreIdentical() {
-        GetMedicalDataSourcesRequest original =
-                new GetMedicalDataSourcesRequest.Builder()
-                        .addPackageName("com.foo")
-                        .addPackageName("com.bar")
-                        .build();
-
-        Parcel parcel = Parcel.obtain();
-        original.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);
-        GetMedicalDataSourcesRequest restored =
-                GetMedicalDataSourcesRequest.CREATOR.createFromParcel(parcel);
-
-        assertThat(restored).isEqualTo(original);
-        parcel.recycle();
-    }
-
-    @Test
-    public void testRequest_toString() {
-        GetMedicalDataSourcesRequest request =
-                new GetMedicalDataSourcesRequest.Builder()
-                        .addPackageName("com.foo")
-                        .addPackageName("com.bar")
-                        .build();
-        String expectedPropertiesStringOrder1 = "packageNames={com.foo, com.bar}";
-        String expectedPropertiesStringOrder2 = "packageNames={com.bar, com.foo}";
-
-        String formatString = "GetMedicalDataSourcesRequest{%s}";
-        assertThat(request.toString())
-                .isAnyOf(
-                        String.format(formatString, expectedPropertiesStringOrder1),
-                        String.format(formatString, expectedPropertiesStringOrder2));
-    }
-}
diff --git a/tests/cts/src/android/healthconnect/cts/HealthConnectAccessLogsTest.java b/tests/cts/src/android/healthconnect/cts/HealthConnectAccessLogsTest.java
index 0ae0a7a..01d6613 100644
--- a/tests/cts/src/android/healthconnect/cts/HealthConnectAccessLogsTest.java
+++ b/tests/cts/src/android/healthconnect/cts/HealthConnectAccessLogsTest.java
@@ -19,6 +19,8 @@
 import static android.health.connect.HealthPermissions.READ_STEPS;
 import static android.health.connect.HealthPermissions.WRITE_DISTANCE;
 import static android.health.connect.HealthPermissions.WRITE_HEART_RATE;
+import static android.health.connect.HealthPermissions.WRITE_SKIN_TEMPERATURE;
+import static android.health.connect.HealthPermissions.WRITE_STEPS;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_DELETE;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_READ;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_UPSERT;
@@ -31,14 +33,17 @@
 import static android.healthconnect.cts.utils.DataFactory.getTestRecords;
 import static android.healthconnect.cts.utils.DataFactory.getUpdatedStepsRecord;
 import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
+import static android.healthconnect.cts.utils.PermissionHelper.grantPermissions;
 import static android.healthconnect.cts.utils.TestUtils.deleteRecordsByIdFilter;
 import static android.healthconnect.cts.utils.TestUtils.getAggregateResponse;
+import static android.healthconnect.cts.utils.TestUtils.getAggregateResponseWithManagePermission;
 import static android.healthconnect.cts.utils.TestUtils.getChangeLogToken;
 import static android.healthconnect.cts.utils.TestUtils.getChangeLogs;
 import static android.healthconnect.cts.utils.TestUtils.insertRecord;
 import static android.healthconnect.cts.utils.TestUtils.insertRecords;
 import static android.healthconnect.cts.utils.TestUtils.queryAccessLogs;
 import static android.healthconnect.cts.utils.TestUtils.readRecords;
+import static android.healthconnect.cts.utils.TestUtils.readRecordsWithManagePermission;
 import static android.healthconnect.cts.utils.TestUtils.verifyDeleteRecords;
 
 import static com.android.healthfitness.flags.Flags.FLAG_ADD_MISSING_ACCESS_LOGS;
@@ -66,6 +71,7 @@
 import android.health.connect.datatypes.ExerciseSessionRecord;
 import android.health.connect.datatypes.HeartRateRecord;
 import android.health.connect.datatypes.Record;
+import android.health.connect.datatypes.SkinTemperatureRecord;
 import android.health.connect.datatypes.StepsRecord;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
 import android.healthconnect.cts.utils.TestUtils;
@@ -88,6 +94,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
 import java.util.function.Supplier;
 
 /** CTS test for {@link HealthConnectManager#queryAccessLogs} API. */
@@ -102,7 +109,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setup() {
@@ -271,6 +279,20 @@
     }
 
     @Test
+    public void testAccessLogs_readWithManageHealthDataPermission_noAccessLog() throws Exception {
+        insertRecords(getDistanceRecord());
+        List<AccessLog> insertAccessLogs = queryAccessLogs();
+        assertThat(insertAccessLogs).hasSize((1));
+        assertThat(insertAccessLogs.get(0).getOperationType()).isEqualTo(OPERATION_TYPE_UPSERT);
+
+        readRecordsWithManagePermission(
+                new ReadRecordsRequestUsingFilters.Builder<>(DistanceRecord.class).build());
+
+        List<AccessLog> accessLogs = queryAccessLogs();
+        assertThat(accessLogs).hasSize((1));
+    }
+
+    @Test
     @RequiresFlagsEnabled({FLAG_ADD_MISSING_ACCESS_LOGS})
     public void testAccessLogs_aggregate_expectReadLogs() throws Exception {
         insertRecords(getStepsRecord());
@@ -301,6 +323,30 @@
 
     @Test
     @RequiresFlagsEnabled({FLAG_ADD_MISSING_ACCESS_LOGS})
+    public void testAccessLogs_aggregateWithManageHealthDataPermission_noAccessLog()
+            throws Exception {
+        insertRecords(getStepsRecord());
+        List<AccessLog> insertAccessLogs = queryAccessLogs();
+        assertThat(insertAccessLogs).hasSize((1));
+        assertThat(insertAccessLogs.get(0).getOperationType()).isEqualTo(OPERATION_TYPE_UPSERT);
+
+        AggregateRecordsRequest<Long> request =
+                new AggregateRecordsRequest.Builder<Long>(
+                                new TimeInstantRangeFilter.Builder()
+                                        .setStartTime(EPOCH)
+                                        .setEndTime(Instant.now())
+                                        .build())
+                        .addAggregationType(STEPS_COUNT_TOTAL)
+                        .build();
+
+        getAggregateResponseWithManagePermission(request);
+
+        List<AccessLog> accessLogs = queryAccessLogs();
+        assertThat(accessLogs).hasSize((1));
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_ADD_MISSING_ACCESS_LOGS})
     public void testAccessLogs_getChangeLogs_expectReadLogs() throws Exception {
         ChangeLogTokenResponse changesToken =
                 getChangeLogToken(
@@ -342,49 +388,85 @@
 
     @Test
     @RequiresFlagsEnabled({FLAG_ADD_MISSING_ACCESS_LOGS})
-    public void testAccessLogs_delete_expectDeleteLogs() throws Exception {
-        List<Record> records =
-                insertRecords(
-                        getHeartRateRecord(), getDistanceRecord(), getBasalMetabolicRateRecord());
+    public void testAccessLogs_deleteById_expectDeleteLogs() throws Exception {
+        List<Record> records = insertRecords(getHeartRateRecord(), getBasalMetabolicRateRecord());
         List<AccessLog> insertLog = queryAccessLogs();
         assertThat(insertLog).hasSize((1));
         assertThat(insertLog.get(0).getOperationType()).isEqualTo(OPERATION_TYPE_UPSERT);
 
-        List<RecordIdFilter> recordIdFilters =
+        deleteRecordsByIdFilter(
                 List.of(
                         RecordIdFilter.fromId(
                                 HeartRateRecord.class, records.get(0).getMetadata().getId()),
                         RecordIdFilter.fromId(
                                 BasalMetabolicRateRecord.class,
-                                records.get(2).getMetadata().getId()));
-        TimeInstantRangeFilter timeFilter =
-                new TimeInstantRangeFilter.Builder()
-                        .setStartTime(EPOCH)
-                        .setEndTime(Instant.now())
-                        .build();
-        // delete by id
-        deleteRecordsByIdFilter(recordIdFilters);
-        // delete by filter, generating access log even if no step data is deleted
-        verifyDeleteRecords(StepsRecord.class, timeFilter);
-
-        DeleteUsingFiltersRequest deleteRequest =
-                new DeleteUsingFiltersRequest.Builder().addRecordType(DistanceRecord.class).build();
-        // delete by system, not generating access log
-        verifyDeleteRecords(deleteRequest);
+                                records.get(1).getMetadata().getId())));
 
         List<AccessLog> insertAndDeleteLogs = queryAccessLogs();
-        assertThat(insertAndDeleteLogs).hasSize((3));
+        assertThat(insertAndDeleteLogs).hasSize((2));
 
         AccessLog deleteByIdLog = insertAndDeleteLogs.get(1);
         assertThat(deleteByIdLog.getOperationType()).isEqualTo(OPERATION_TYPE_DELETE);
         assertThat(deleteByIdLog.getRecordTypes())
                 .containsExactly(HeartRateRecord.class, BasalMetabolicRateRecord.class);
         assertThat(deleteByIdLog.getPackageName()).isEqualTo(SELF_PACKAGE_NAME);
+    }
 
-        AccessLog deleteByFilterLog = insertAndDeleteLogs.get(2);
-        assertThat(deleteByFilterLog.getOperationType()).isEqualTo(OPERATION_TYPE_DELETE);
-        assertThat(deleteByFilterLog.getRecordTypes()).containsExactly(StepsRecord.class);
-        assertThat(deleteByFilterLog.getPackageName()).isEqualTo(SELF_PACKAGE_NAME);
+    @Test
+    @RequiresFlagsEnabled({FLAG_ADD_MISSING_ACCESS_LOGS})
+    public void testAccessLogs_deleteByInvalidId_expectDeleteLogs() throws Exception {
+        grantPermissions(SELF_PACKAGE_NAME, List.of(WRITE_HEART_RATE, WRITE_SKIN_TEMPERATURE));
+        deleteRecordsByIdFilter(
+                List.of(
+                        RecordIdFilter.fromId(HeartRateRecord.class, UUID.randomUUID().toString()),
+                        RecordIdFilter.fromId(
+                                SkinTemperatureRecord.class, UUID.randomUUID().toString())));
+
+        List<AccessLog> insertAndDeleteLogs = queryAccessLogs();
+        assertThat(insertAndDeleteLogs).hasSize((1));
+
+        AccessLog log = insertAndDeleteLogs.get(0);
+        assertThat(log.getOperationType()).isEqualTo(OPERATION_TYPE_DELETE);
+        assertThat(log.getRecordTypes())
+                .containsExactly(HeartRateRecord.class, SkinTemperatureRecord.class);
+        assertThat(log.getPackageName()).isEqualTo(SELF_PACKAGE_NAME);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_ADD_MISSING_ACCESS_LOGS})
+    public void testAccessLogs_deleteByFilter_expectDeleteLogs() throws Exception {
+        grantPermission(SELF_PACKAGE_NAME, WRITE_STEPS);
+        TimeInstantRangeFilter timeFilter =
+                new TimeInstantRangeFilter.Builder()
+                        .setStartTime(EPOCH)
+                        .setEndTime(Instant.now())
+                        .build();
+        // delete by filter, generating access log even if no step data is deleted
+        verifyDeleteRecords(StepsRecord.class, timeFilter);
+
+        List<AccessLog> accessLogs = queryAccessLogs();
+        assertThat(accessLogs).hasSize(1);
+        AccessLog log = accessLogs.get(0);
+        assertThat(log.getOperationType()).isEqualTo(OPERATION_TYPE_DELETE);
+        assertThat(log.getRecordTypes()).containsExactly(StepsRecord.class);
+        assertThat(log.getPackageName()).isEqualTo(SELF_PACKAGE_NAME);
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_ADD_MISSING_ACCESS_LOGS})
+    public void testAccessLogs_deleteWithManageHealthDataPermission_noLog() throws Exception {
+        insertRecord(getDistanceRecord());
+        List<AccessLog> insertLog = queryAccessLogs();
+        assertThat(insertLog).hasSize((1));
+        assertThat(insertLog.get(0).getOperationType()).isEqualTo(OPERATION_TYPE_UPSERT);
+
+        DeleteUsingFiltersRequest deleteRequest =
+                new DeleteUsingFiltersRequest.Builder().addRecordType(DistanceRecord.class).build();
+        // delete by system, not generating access log
+        verifyDeleteRecords(deleteRequest);
+
+        List<AccessLog> accessLogs = queryAccessLogs();
+        assertThat(accessLogs).hasSize(1);
     }
 
     @Test
diff --git a/tests/cts/src/android/healthconnect/cts/HealthConnectManagerTest.java b/tests/cts/src/android/healthconnect/cts/HealthConnectManagerTest.java
index 405e179..c6ae8b4 100644
--- a/tests/cts/src/android/healthconnect/cts/HealthConnectManagerTest.java
+++ b/tests/cts/src/android/healthconnect/cts/HealthConnectManagerTest.java
@@ -17,6 +17,7 @@
 
 import static android.Manifest.permission.CAMERA;
 import static android.Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA;
+import static android.Manifest.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA;
 import static android.health.connect.HealthConnectDataState.MIGRATION_STATE_IDLE;
 import static android.health.connect.HealthConnectDataState.RESTORE_ERROR_FETCHING_DATA;
 import static android.health.connect.HealthConnectDataState.RESTORE_ERROR_NONE;
@@ -26,49 +27,20 @@
 import static android.health.connect.HealthConnectManager.DATA_DOWNLOAD_FAILED;
 import static android.health.connect.HealthConnectManager.DATA_DOWNLOAD_STARTED;
 import static android.health.connect.HealthConnectManager.isHealthPermission;
-import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROBLEMS;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BASAL_METABOLIC_RATE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_HEART_RATE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_STEPS;
 import static android.health.connect.datatypes.StepsRecord.STEPS_COUNT_TOTAL;
-import static android.healthconnect.cts.lib.TestAppProxy.APP_WRITE_PERMS_ONLY;
-import static android.healthconnect.cts.utils.DataFactory.MAXIMUM_PAGE_SIZE;
 import static android.healthconnect.cts.utils.DataFactory.getRecordsAndIdentifiers;
-import static android.healthconnect.cts.utils.ObservationBuilder.ObservationCategory.LABORATORY;
+import static android.healthconnect.cts.utils.HealthConnectReceiver.callAndGetResponseWithShellPermissionIdentity;
 import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_FHIR_DATA_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_ID_EMPTY;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_UNSUPPORTED_RESOURCE_TYPE;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_UNSUPPORTED;
-import static android.healthconnect.cts.utils.PhrDataFactory.MAX_ALLOWED_MEDICAL_DATA_SOURCES;
-import static android.healthconnect.cts.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResourceId;
-import static android.healthconnect.cts.utils.PhrDataFactory.getUpsertMedicalResourceRequest;
+import static android.healthconnect.cts.utils.TestOutcomeReceiver.outcomeExecutor;
 import static android.healthconnect.cts.utils.TestUtils.finishMigrationWithShellPermissionIdentity;
 import static android.healthconnect.cts.utils.TestUtils.getRecordById;
 import static android.healthconnect.cts.utils.TestUtils.insertRecords;
 import static android.healthconnect.cts.utils.TestUtils.startMigrationWithShellPermissionIdentity;
 
-import static com.android.healthfitness.flags.Flags.FLAG_DEVELOPMENT_DATABASE;
-import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
-import static com.android.healthfitness.flags.Flags.personalHealthRecord;
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
 import static com.google.common.truth.Correspondence.transforming;
 import static com.google.common.truth.Truth.assertThat;
@@ -79,43 +51,31 @@
 import static java.time.temporal.ChronoUnit.DAYS;
 import static java.time.temporal.ChronoUnit.HOURS;
 import static java.time.temporal.ChronoUnit.MINUTES;
+import static java.util.Objects.requireNonNull;
 
 import android.app.UiAutomation;
 import android.content.Context;
 import android.health.connect.AggregateRecordsGroupedByDurationResponse;
 import android.health.connect.AggregateRecordsRequest;
 import android.health.connect.AggregateRecordsResponse;
-import android.health.connect.ApplicationInfoResponse;
-import android.health.connect.CreateMedicalDataSourceRequest;
-import android.health.connect.DeleteMedicalResourcesRequest;
 import android.health.connect.DeleteUsingFiltersRequest;
-import android.health.connect.GetMedicalDataSourcesRequest;
 import android.health.connect.HealthConnectDataState;
 import android.health.connect.HealthConnectException;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.HealthDataCategory;
 import android.health.connect.HealthPermissions;
 import android.health.connect.LocalTimeRangeFilter;
-import android.health.connect.MedicalResourceId;
-import android.health.connect.MedicalResourceTypeInfo;
-import android.health.connect.ReadMedicalResourcesInitialRequest;
-import android.health.connect.ReadMedicalResourcesPageRequest;
-import android.health.connect.ReadMedicalResourcesResponse;
 import android.health.connect.ReadRecordsRequestUsingIds;
 import android.health.connect.RecordTypeInfoResponse;
 import android.health.connect.TimeInstantRangeFilter;
-import android.health.connect.UpsertMedicalResourceRequest;
 import android.health.connect.changelog.ChangeLogTokenRequest;
 import android.health.connect.changelog.ChangeLogsRequest;
-import android.health.connect.datatypes.AppInfo;
 import android.health.connect.datatypes.BasalMetabolicRateRecord;
 import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.Device;
 import android.health.connect.datatypes.ExerciseSessionRecord;
 import android.health.connect.datatypes.HeartRateRecord;
 import android.health.connect.datatypes.HydrationRecord;
-import android.health.connect.datatypes.MedicalDataSource;
-import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.Metadata;
 import android.health.connect.datatypes.NutritionRecord;
 import android.health.connect.datatypes.Record;
@@ -125,17 +85,13 @@
 import android.health.connect.datatypes.units.Volume;
 import android.health.connect.restore.StageRemoteDataException;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
-import android.healthconnect.cts.utils.ConditionBuilder;
 import android.healthconnect.cts.utils.DataFactory;
 import android.healthconnect.cts.utils.HealthConnectReceiver;
-import android.healthconnect.cts.utils.MedicationsBuilder;
-import android.healthconnect.cts.utils.ObservationBuilder;
-import android.healthconnect.cts.utils.ProcedureBuilder;
+import android.healthconnect.cts.utils.TestOutcomeReceiver;
 import android.healthconnect.cts.utils.TestUtils;
 import android.os.OutcomeReceiver;
 import android.os.ParcelFileDescriptor;
 import android.platform.test.annotations.AppModeFull;
-import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.util.ArrayMap;
@@ -147,10 +103,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
-import com.android.compatibility.common.util.SystemUtil;
-
-import com.google.common.collect.Iterables;
-
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -161,7 +113,6 @@
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.LocalDateTime;
@@ -171,17 +122,13 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
 
 /** CTS test for API provided by HealthConnectManager. */
 @AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
@@ -196,22 +143,23 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
+    private Context mContext;
     private HealthConnectManager mManager;
 
     @Before
     public void before() throws InterruptedException {
         deleteAllRecords();
         TestUtils.deleteAllStagedRemoteData();
-        TestUtils.deleteAllMedicalData();
-        mManager = TestUtils.getHealthConnectManager();
+        mContext = ApplicationProvider.getApplicationContext();
+        mManager = requireNonNull(mContext.getSystemService(HealthConnectManager.class));
     }
 
     @After
     public void after() throws InterruptedException {
-        deleteAllRecords();
-        TestUtils.deleteAllMedicalData();
+        TestUtils.deleteAllStagedRemoteData();
     }
 
     private void deleteAllRecords() throws InterruptedException {
@@ -222,23 +170,10 @@
                         .build());
     }
 
-    @After
-    public void tearDown() {
-        TestUtils.deleteAllStagedRemoteData();
-    }
-
-    @Test
-    public void testHCManagerIsAccessible_viaHCManager() {
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
-    }
-
     @Test
     public void testHCManagerIsAccessible_viaContextConstant() {
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        assertThat(mContext.getSystemService(Context.HEALTHCONNECT_SERVICE))
+                .isInstanceOf(HealthConnectManager.class);
     }
 
     @Test
@@ -251,19 +186,17 @@
 
     @Test
     public void testIsHealthPermission_forHealthPermission_returnsTrue() {
-        Context context = ApplicationProvider.getApplicationContext();
-        assertThat(isHealthPermission(context, HealthPermissions.READ_ACTIVE_CALORIES_BURNED))
+        assertThat(isHealthPermission(mContext, HealthPermissions.READ_ACTIVE_CALORIES_BURNED))
                 .isTrue();
-        assertThat(isHealthPermission(context, HealthPermissions.READ_ACTIVE_CALORIES_BURNED))
+        assertThat(isHealthPermission(mContext, HealthPermissions.READ_ACTIVE_CALORIES_BURNED))
                 .isTrue();
     }
 
     @Test
     public void testIsHealthPermission_forNonHealthGroupPermission_returnsFalse() {
-        Context context = ApplicationProvider.getApplicationContext();
-        assertThat(isHealthPermission(context, HealthPermissions.MANAGE_HEALTH_PERMISSIONS))
+        assertThat(isHealthPermission(mContext, HealthPermissions.MANAGE_HEALTH_PERMISSIONS))
                 .isFalse();
-        assertThat(isHealthPermission(context, CAMERA)).isFalse();
+        assertThat(isHealthPermission(mContext, CAMERA)).isFalse();
     }
 
     @Test
@@ -284,11 +217,7 @@
      */
     @Test
     public void testUpdateRecords_validInput_dataBaseUpdatedSuccessfully() throws Exception {
-
-        Context context = ApplicationProvider.getApplicationContext();
         CountDownLatch latch = new CountDownLatch(1);
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
         AtomicReference<HealthConnectException> responseException = new AtomicReference<>();
 
         // Insert a sample record of each data type.
@@ -308,7 +237,7 @@
                             updateRecords.get(itr), insertRecords.get(itr).getMetadata().getId()));
         }
 
-        service.updateRecords(
+        mManager.updateRecords(
                 updateRecords,
                 Executors.newSingleThreadExecutor(),
                 new OutcomeReceiver<>() {
@@ -349,11 +278,7 @@
      */
     @Test
     public void testUpdateRecords_invalidInputRecords_noChangeInDataBase() throws Exception {
-
-        Context context = ApplicationProvider.getApplicationContext();
         CountDownLatch latch = new CountDownLatch(1);
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
         AtomicReference<HealthConnectException> responseException = new AtomicReference<>();
 
         // Insert a sample record of each data type.
@@ -378,7 +303,7 @@
         }
 
         // perform the update operation.
-        service.updateRecords(
+        mManager.updateRecords(
                 updateRecords,
                 Executors.newSingleThreadExecutor(),
                 new OutcomeReceiver<>() {
@@ -420,11 +345,7 @@
     @Test
     public void testUpdateRecords_recordWithInvalidPackageName_noChangeInDataBase()
             throws Exception {
-
-        Context context = ApplicationProvider.getApplicationContext();
         CountDownLatch latch = new CountDownLatch(1);
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
         AtomicReference<Exception> responseException = new AtomicReference<>();
 
         // Insert a sample record of each data type.
@@ -449,7 +370,7 @@
 
         try {
             // perform the update operation.
-            service.updateRecords(
+            mManager.updateRecords(
                     updateRecords,
                     Executors.newSingleThreadExecutor(),
                     new OutcomeReceiver<>() {
@@ -792,13 +713,10 @@
     public void testAutoDeleteApis() throws InterruptedException {
         UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
 
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
         TestUtils.setAutoDeletePeriod(30);
         uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         try {
-            assertThat(service.getRecordRetentionPeriodInDays()).isEqualTo(30);
+            assertThat(mManager.getRecordRetentionPeriodInDays()).isEqualTo(30);
         } finally {
             uiAutomation.dropShellPermissionIdentity();
         }
@@ -806,7 +724,7 @@
         TestUtils.setAutoDeletePeriod(0);
         uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         try {
-            assertThat(service.getRecordRetentionPeriodInDays()).isEqualTo(0);
+            assertThat(mManager.getRecordRetentionPeriodInDays()).isEqualTo(0);
         } finally {
             uiAutomation.dropShellPermissionIdentity();
         }
@@ -814,781 +732,336 @@
 
     @Test
     public void testStageRemoteData_withValidInput_noExceptionsReturned() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        File dataDir = mContext.getDataDir();
+        File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
+        File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
 
-        try {
-            File dataDir = context.getDataDir();
-            File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
-            File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
+        assertThat(testRestoreFile1.exists()).isTrue();
+        assertThat(testRestoreFile2.exists()).isTrue();
 
-            assertThat(testRestoreFile1.exists()).isTrue();
-            assertThat(testRestoreFile2.exists()).isTrue();
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                testRestoreFile1.getName(),
+                ParcelFileDescriptor.open(testRestoreFile1, ParcelFileDescriptor.MODE_READ_ONLY));
+        pfdsByFileName.put(
+                testRestoreFile2.getName(),
+                ParcelFileDescriptor.open(testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
 
-            Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
-            pfdsByFileName.put(
-                    testRestoreFile1.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile1, ParcelFileDescriptor.MODE_READ_ONLY));
-            pfdsByFileName.put(
-                    testRestoreFile2.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
-
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA");
-            service.stageAllHealthConnectRemoteData(
-                    pfdsByFileName,
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(Void result) {
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull StageRemoteDataException error) {}
-                    });
-        } catch (IOException e) {
-            Log.e(TAG, "Error creating / writing to test files.", e);
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-
-        deleteAllStagedRemoteData();
+        Void unused =
+                callAndGetResponseWithShellPermissionIdentity(
+                        StageRemoteDataException.class,
+                        (executor, receiver) ->
+                                mManager.stageAllHealthConnectRemoteData(
+                                        pfdsByFileName, executor, receiver),
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA);
     }
 
     @Test
     public void testStageRemoteData_whenNotReadMode_errorIoReturned() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<Map<String, HealthConnectException>> observedExceptionsByFileName =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        File dataDir = mContext.getDataDir();
+        File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
+        File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
 
-        try {
-            File dataDir = context.getDataDir();
-            File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
-            File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
+        assertThat(testRestoreFile1.exists()).isTrue();
+        assertThat(testRestoreFile2.exists()).isTrue();
 
-            assertThat(testRestoreFile1.exists()).isTrue();
-            assertThat(testRestoreFile2.exists()).isTrue();
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                testRestoreFile1.getName(),
+                ParcelFileDescriptor.open(testRestoreFile1, ParcelFileDescriptor.MODE_WRITE_ONLY));
+        pfdsByFileName.put(
+                testRestoreFile2.getName(),
+                ParcelFileDescriptor.open(testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
 
-            Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
-            pfdsByFileName.put(
-                    testRestoreFile1.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile1, ParcelFileDescriptor.MODE_WRITE_ONLY));
-            pfdsByFileName.put(
-                    testRestoreFile2.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
+        TestOutcomeReceiver<Void, StageRemoteDataException> receiver = new TestOutcomeReceiver<>();
+        StageRemoteDataException stageRemoteDataException =
+                runWithShellPermissionIdentity(
+                        () -> {
+                            mManager.stageAllHealthConnectRemoteData(
+                                    pfdsByFileName, outcomeExecutor(), receiver);
+                            return receiver.assertAndGetException();
+                        },
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA);
 
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA");
-            service.stageAllHealthConnectRemoteData(
-                    pfdsByFileName,
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(Void unused) {}
-
-                        @Override
-                        public void onError(@NonNull StageRemoteDataException error) {
-                            observedExceptionsByFileName.set(error.getExceptionsByFileNames());
-                            latch.countDown();
-                        }
-                    });
-        } catch (IOException e) {
-            Log.e(TAG, "Error creating / writing to test files.", e);
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(observedExceptionsByFileName.get())
+        assertThat(stageRemoteDataException.getExceptionsByFileNames())
                 .comparingValuesUsing(
                         transforming(HealthConnectException::getErrorCode, "has error code"))
                 .containsExactly("testRestoreFile1", HealthConnectException.ERROR_IO);
-
-        deleteAllStagedRemoteData();
     }
 
     @Test
     public void testStageRemoteData_whenStagingStagedData_noExceptionsReturned() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        CountDownLatch retryLatch = new CountDownLatch(1);
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        File dataDir = mContext.getDataDir();
+        File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
+        File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
 
-        try {
-            File dataDir = context.getDataDir();
-            File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
-            File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
+        assertThat(testRestoreFile1.exists()).isTrue();
+        assertThat(testRestoreFile2.exists()).isTrue();
 
-            assertThat(testRestoreFile1.exists()).isTrue();
-            assertThat(testRestoreFile2.exists()).isTrue();
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                testRestoreFile1.getName(),
+                ParcelFileDescriptor.open(testRestoreFile1, ParcelFileDescriptor.MODE_READ_ONLY));
+        pfdsByFileName.put(
+                testRestoreFile2.getName(),
+                ParcelFileDescriptor.open(testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
 
-            Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
-            pfdsByFileName.put(
-                    testRestoreFile1.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile1, ParcelFileDescriptor.MODE_READ_ONLY));
-            pfdsByFileName.put(
-                    testRestoreFile2.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
+        Void unused =
+                callAndGetResponseWithShellPermissionIdentity(
+                        StageRemoteDataException.class,
+                        (executor, receiver) ->
+                                mManager.stageAllHealthConnectRemoteData(
+                                        pfdsByFileName, executor, receiver),
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA);
 
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA");
-            service.stageAllHealthConnectRemoteData(
-                    pfdsByFileName,
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(Void result) {
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull StageRemoteDataException error) {}
-                    });
-            assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-
-            // send the files again
-            service.stageAllHealthConnectRemoteData(
-                    pfdsByFileName,
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(Void result) {
-                            retryLatch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull StageRemoteDataException error) {}
-                    });
-        } catch (IOException e) {
-            Log.e(TAG, "Error creating / writing to test files.", e);
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        assertThat(retryLatch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-
-        deleteAllStagedRemoteData();
+        // send the files again
+        unused =
+                callAndGetResponseWithShellPermissionIdentity(
+                        StageRemoteDataException.class,
+                        (executor, receiver) ->
+                                mManager.stageAllHealthConnectRemoteData(
+                                        pfdsByFileName, executor, receiver),
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA);
     }
 
     @Test
     public void testStageRemoteData_withoutPermission_errorSecurityReturned() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<Map<String, HealthConnectException>> observedExceptionsByFileName =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        File dataDir = mContext.getDataDir();
+        File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
+        File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
 
-        try {
-            File dataDir = context.getDataDir();
-            File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
-            File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
+        assertThat(testRestoreFile1.exists()).isTrue();
+        assertThat(testRestoreFile2.exists()).isTrue();
 
-            assertThat(testRestoreFile1.exists()).isTrue();
-            assertThat(testRestoreFile2.exists()).isTrue();
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                testRestoreFile1.getName(),
+                ParcelFileDescriptor.open(testRestoreFile1, ParcelFileDescriptor.MODE_WRITE_ONLY));
+        pfdsByFileName.put(
+                testRestoreFile2.getName(),
+                ParcelFileDescriptor.open(testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
 
-            Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
-            pfdsByFileName.put(
-                    testRestoreFile1.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile1, ParcelFileDescriptor.MODE_WRITE_ONLY));
-            pfdsByFileName.put(
-                    testRestoreFile2.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
+        TestOutcomeReceiver<Void, StageRemoteDataException> receiver = new TestOutcomeReceiver<>();
+        mManager.stageAllHealthConnectRemoteData(pfdsByFileName, outcomeExecutor(), receiver);
 
-            service.stageAllHealthConnectRemoteData(
-                    pfdsByFileName,
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(Void unused) {}
-
-                        @Override
-                        public void onError(@NonNull StageRemoteDataException error) {
-                            observedExceptionsByFileName.set(error.getExceptionsByFileNames());
-                            latch.countDown();
-                        }
-                    });
-        } catch (IOException e) {
-            Log.e(TAG, "Error creating / writing to test files.", e);
-        }
-
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(observedExceptionsByFileName.get())
+        StageRemoteDataException stageRemoteDataException = receiver.assertAndGetException();
+        assertThat(stageRemoteDataException.getExceptionsByFileNames())
                 .comparingValuesUsing(
                         transforming(HealthConnectException::getErrorCode, "has error code"))
                 .containsExactly("", HealthConnectException.ERROR_SECURITY);
-
-        deleteAllStagedRemoteData();
     }
 
     @Test
     public void testUpdateDataDownloadState_withoutPermission_throwsSecurityException() {
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
-
-        try {
-            service.updateDataDownloadState(DATA_DOWNLOAD_STARTED);
-        } catch (SecurityException e) {
-            /* pass */
-        }
+        assertThrows(
+                SecurityException.class,
+                () -> mManager.updateDataDownloadState(DATA_DOWNLOAD_STARTED));
     }
 
     @Test
     public void testGetHealthConnectDataState_beforeDownload_returnsIdleState() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        mManager::getHealthConnectDataState, MANAGE_HEALTH_DATA);
 
-        try {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreState())
-                .isEqualTo(RESTORE_STATE_IDLE);
-        deleteAllStagedRemoteData();
+        assertThat(healthConnectDataState.getDataRestoreState()).isEqualTo(RESTORE_STATE_IDLE);
     }
 
     @Test
     public void
             testGetHealthConnectDataState_beforeDownload_withMigrationPermission_returnsIdleState()
                     throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        mManager::getHealthConnectDataState, MIGRATE_HEALTH_CONNECT_DATA);
 
-        try {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(MIGRATE_HEALTH_CONNECT_DATA);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreState())
-                .isEqualTo(RESTORE_STATE_IDLE);
-        deleteAllStagedRemoteData();
+        assertThat(healthConnectDataState.getDataRestoreState()).isEqualTo(RESTORE_STATE_IDLE);
     }
 
     @Test
     public void testGetHealthConnectDataState_duringDownload_returnsRestorePendingState()
             throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        (executor, receiver) -> {
+                            mManager.updateDataDownloadState(DATA_DOWNLOAD_STARTED);
+                            mManager.getHealthConnectDataState(executor, receiver);
+                        },
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA,
+                        MANAGE_HEALTH_DATA);
 
-        try {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA",
-                            MANAGE_HEALTH_DATA);
-            service.updateDataDownloadState(DATA_DOWNLOAD_STARTED);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreState())
-                .isEqualTo(RESTORE_STATE_PENDING);
-        deleteAllStagedRemoteData();
+        assertThat(healthConnectDataState.getDataRestoreState()).isEqualTo(RESTORE_STATE_PENDING);
     }
 
     @Test
     public void testGetHealthConnectDataState_whenDownloadDone_returnsRestorePendingState()
             throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        (executor, receiver) -> {
+                            mManager.updateDataDownloadState(DATA_DOWNLOAD_COMPLETE);
+                            mManager.getHealthConnectDataState(executor, receiver);
+                        },
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA,
+                        MANAGE_HEALTH_DATA);
 
-        try {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA",
-                            MANAGE_HEALTH_DATA);
-            service.updateDataDownloadState(DATA_DOWNLOAD_COMPLETE);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreState())
-                .isEqualTo(RESTORE_STATE_PENDING);
-        deleteAllStagedRemoteData();
+        assertThat(healthConnectDataState.getDataRestoreState()).isEqualTo(RESTORE_STATE_PENDING);
     }
 
     @Test
     public void testGetHealthConnectDataState_whenDownloadFailed_returnsIdleState()
             throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        (executor, receiver) -> {
+                            mManager.updateDataDownloadState(DATA_DOWNLOAD_FAILED);
+                            mManager.getHealthConnectDataState(executor, receiver);
+                        },
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA,
+                        MANAGE_HEALTH_DATA);
 
-        try {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA",
-                            MANAGE_HEALTH_DATA);
-            service.updateDataDownloadState(DATA_DOWNLOAD_FAILED);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreState())
-                .isEqualTo(RESTORE_STATE_IDLE);
-
-        deleteAllStagedRemoteData();
+        assertThat(healthConnectDataState.getDataRestoreState()).isEqualTo(RESTORE_STATE_IDLE);
     }
 
     @Test
     public void testGetHealthConnectDataState_afterStagingAndMerge_returnsStateIdle()
             throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        CountDownLatch stateLatch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        File dataDir = mContext.getDataDir();
+        File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
+        File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
 
-        try {
-            File dataDir = context.getDataDir();
-            File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
-            File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
+        assertThat(testRestoreFile1.exists()).isTrue();
+        assertThat(testRestoreFile2.exists()).isTrue();
 
-            assertThat(testRestoreFile1.exists()).isTrue();
-            assertThat(testRestoreFile2.exists()).isTrue();
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                testRestoreFile1.getName(),
+                ParcelFileDescriptor.open(testRestoreFile1, ParcelFileDescriptor.MODE_READ_ONLY));
+        pfdsByFileName.put(
+                testRestoreFile2.getName(),
+                ParcelFileDescriptor.open(testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
 
-            Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
-            pfdsByFileName.put(
-                    testRestoreFile1.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile1, ParcelFileDescriptor.MODE_READ_ONLY));
-            pfdsByFileName.put(
-                    testRestoreFile2.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
+        Void unused =
+                callAndGetResponseWithShellPermissionIdentity(
+                        StageRemoteDataException.class,
+                        (executor, receiver) ->
+                                mManager.stageAllHealthConnectRemoteData(
+                                        pfdsByFileName, executor, receiver),
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA);
 
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA",
-                            MANAGE_HEALTH_DATA);
-            service.stageAllHealthConnectRemoteData(
-                    pfdsByFileName,
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(Void result) {
-                            latch.countDown();
-                        }
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        mManager::getHealthConnectDataState, MANAGE_HEALTH_DATA);
 
-                        @Override
-                        public void onError(@NonNull StageRemoteDataException error) {}
-                    });
-            assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            stateLatch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } catch (IOException e) {
-            Log.e(TAG, "Error creating / writing to test files.", e);
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-        assertThat(stateLatch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreState())
-                .isEqualTo(RESTORE_STATE_IDLE);
-
-        deleteAllStagedRemoteData();
+        assertThat(healthConnectDataState.getDataRestoreState()).isEqualTo(RESTORE_STATE_IDLE);
     }
 
     @Test
     public void testGetDataRestoreError_onErrorDuringStaging_returnsErrorFetching()
             throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        CountDownLatch stateLatch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        File dataDir = mContext.getDataDir();
+        File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
+        File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
 
-        try {
-            File dataDir = context.getDataDir();
-            File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
-            File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
+        assertThat(testRestoreFile1.exists()).isTrue();
+        assertThat(testRestoreFile2.exists()).isTrue();
 
-            assertThat(testRestoreFile1.exists()).isTrue();
-            assertThat(testRestoreFile2.exists()).isTrue();
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                testRestoreFile1.getName(),
+                ParcelFileDescriptor.open(testRestoreFile1, ParcelFileDescriptor.MODE_WRITE_ONLY));
+        pfdsByFileName.put(
+                testRestoreFile2.getName(),
+                ParcelFileDescriptor.open(testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
 
-            Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
-            pfdsByFileName.put(
-                    testRestoreFile1.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile1, ParcelFileDescriptor.MODE_WRITE_ONLY));
-            pfdsByFileName.put(
-                    testRestoreFile2.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
+        TestOutcomeReceiver<Void, StageRemoteDataException> stageReceiver =
+                new TestOutcomeReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.stageAllHealthConnectRemoteData(
+                            pfdsByFileName, outcomeExecutor(), stageReceiver);
+                    stageReceiver.assertAndGetException();
+                },
+                STAGE_HEALTH_CONNECT_REMOTE_DATA);
 
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA",
-                            MANAGE_HEALTH_DATA);
-            service.stageAllHealthConnectRemoteData(
-                    pfdsByFileName,
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(Void result) {}
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        mManager::getHealthConnectDataState, MANAGE_HEALTH_DATA);
 
-                        @Override
-                        public void onError(@NonNull StageRemoteDataException error) {
-                            latch.countDown();
-                        }
-                    });
-            assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            stateLatch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } catch (IOException e) {
-            Log.e(TAG, "Error creating / writing to test files.", e);
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        assertThat(stateLatch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreError())
+        assertThat(healthConnectDataState.getDataRestoreError())
                 .isEqualTo(RESTORE_ERROR_FETCHING_DATA);
-        deleteAllStagedRemoteData();
     }
 
     @Test
     public void testGetDataRestoreError_onDownloadFailed_returnsErrorFetching() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        (executor, receiver) -> {
+                            mManager.updateDataDownloadState(DATA_DOWNLOAD_FAILED);
+                            mManager.getHealthConnectDataState(executor, receiver);
+                        },
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA,
+                        MANAGE_HEALTH_DATA);
 
-        try {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA",
-                            MANAGE_HEALTH_DATA);
-            service.updateDataDownloadState(DATA_DOWNLOAD_FAILED);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreError())
+        assertThat(healthConnectDataState.getDataRestoreError())
                 .isEqualTo(RESTORE_ERROR_FETCHING_DATA);
-        deleteAllStagedRemoteData();
     }
 
     @Test
     public void testGetDataRestoreError_onNoErrorDuringRestore_returnsNoError() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        CountDownLatch stateLatch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        File dataDir = mContext.getDataDir();
+        File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
+        File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
 
-        try {
-            File dataDir = context.getDataDir();
-            File testRestoreFile1 = createAndGetNonEmptyFile(dataDir, "testRestoreFile1");
-            File testRestoreFile2 = createAndGetNonEmptyFile(dataDir, "testRestoreFile2");
+        assertThat(testRestoreFile1.exists()).isTrue();
+        assertThat(testRestoreFile2.exists()).isTrue();
 
-            assertThat(testRestoreFile1.exists()).isTrue();
-            assertThat(testRestoreFile2.exists()).isTrue();
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                testRestoreFile1.getName(),
+                ParcelFileDescriptor.open(testRestoreFile1, ParcelFileDescriptor.MODE_READ_ONLY));
+        pfdsByFileName.put(
+                testRestoreFile2.getName(),
+                ParcelFileDescriptor.open(testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
 
-            Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
-            pfdsByFileName.put(
-                    testRestoreFile1.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile1, ParcelFileDescriptor.MODE_READ_ONLY));
-            pfdsByFileName.put(
-                    testRestoreFile2.getName(),
-                    ParcelFileDescriptor.open(
-                            testRestoreFile2, ParcelFileDescriptor.MODE_READ_ONLY));
+        Void unused =
+                callAndGetResponseWithShellPermissionIdentity(
+                        StageRemoteDataException.class,
+                        (executor, receiver) ->
+                                mManager.stageAllHealthConnectRemoteData(
+                                        pfdsByFileName, executor, receiver),
+                        STAGE_HEALTH_CONNECT_REMOTE_DATA);
 
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA",
-                            MANAGE_HEALTH_DATA);
-            service.stageAllHealthConnectRemoteData(
-                    pfdsByFileName,
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(Void result) {
-                            latch.countDown();
-                        }
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        mManager::getHealthConnectDataState, MANAGE_HEALTH_DATA);
 
-                        @Override
-                        public void onError(@NonNull StageRemoteDataException error) {}
-                    });
-            assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            stateLatch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } catch (IOException e) {
-            Log.e(TAG, "Error creating / writing to test files.", e);
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-
-        assertThat(stateLatch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataRestoreError())
-                .isEqualTo(RESTORE_ERROR_NONE);
-        deleteAllStagedRemoteData();
+        assertThat(healthConnectDataState.getDataRestoreError()).isEqualTo(RESTORE_ERROR_NONE);
     }
 
     @Test
     public void testDataMigrationState_byDefault_returnsIdleState() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<HealthConnectDataState> returnedHealthConnectDataState =
-                new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        HealthConnectDataState healthConnectDataState =
+                callAndGetResponseWithShellPermissionIdentity(
+                        mManager::getHealthConnectDataState, MANAGE_HEALTH_DATA);
 
-        try {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {
-                            returnedHealthConnectDataState.set(healthConnectDataState);
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {}
-                    });
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedHealthConnectDataState.get().getDataMigrationState())
-                .isEqualTo(MIGRATION_STATE_IDLE);
-        deleteAllStagedRemoteData();
+        assertThat(healthConnectDataState.getDataMigrationState()).isEqualTo(MIGRATION_STATE_IDLE);
     }
 
     @Test
     public void testGetHealthConnectDataState_withoutPermission_returnsSecurityException()
             throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<HealthConnectException> returnedException = new AtomicReference<>();
-        Context context = ApplicationProvider.getApplicationContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        assertThat(service).isNotNull();
+        HealthConnectReceiver<HealthConnectDataState> receiver = new HealthConnectReceiver<>();
+        mManager.getHealthConnectDataState(outcomeExecutor(), receiver);
 
-        try {
-            service.getHealthConnectDataState(
-                    Executors.newSingleThreadExecutor(),
-                    new OutcomeReceiver<>() {
-                        @Override
-                        public void onResult(HealthConnectDataState healthConnectDataState) {}
-
-                        @Override
-                        public void onError(@NonNull HealthConnectException e) {
-                            returnedException.set(e);
-                            latch.countDown();
-                        }
-                    });
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-        assertThat(latch.await(10, TimeUnit.SECONDS)).isEqualTo(true);
-        assertThat(returnedException.get().getErrorCode())
+        HealthConnectException healthConnectException = receiver.assertAndGetException();
+        assertThat(healthConnectException.getErrorCode())
                 .isEqualTo(HealthConnectException.ERROR_SECURITY);
-        deleteAllStagedRemoteData();
     }
 
     @Test
     public void testDataApis_migrationInProgress_apisBlocked() throws InterruptedException {
         UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
-        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         startMigrationWithShellPermissionIdentity();
 
         StepsRecord testRecord = DataFactory.getStepsRecord();
@@ -1642,38 +1115,39 @@
                     .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
         }
 
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         try {
-            uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
             TestUtils.getApplicationInfo();
             Assert.fail();
         } catch (HealthConnectException exception) {
             assertThat(exception).isNotNull();
             assertThat(exception.getErrorCode())
                     .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+        } finally {
             uiAutomation.dropShellPermissionIdentity();
         }
 
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         try {
-            uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-
             TestUtils.queryAccessLogs();
             Assert.fail();
         } catch (HealthConnectException exception) {
             assertThat(exception).isNotNull();
             assertThat(exception.getErrorCode())
                     .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+        } finally {
             uiAutomation.dropShellPermissionIdentity();
         }
 
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
         try {
-            uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
-
             TestUtils.setAutoDeletePeriod(1);
             Assert.fail();
         } catch (HealthConnectException exception) {
             assertThat(exception).isNotNull();
             assertThat(exception.getErrorCode())
                     .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
+        } finally {
             uiAutomation.dropShellPermissionIdentity();
         }
 
@@ -1746,42 +1220,6 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testCreateMedicalDataSource_migrationInProgress_apiBlocked()
-            throws InterruptedException {
-        startMigrationWithShellPermissionIdentity();
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
-
-        mManager.createMedicalDataSource(getCreateMedicalDataSourceRequest(), executor, receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
-
-        finishMigrationWithShellPermissionIdentity();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testReadMedicalResourcesByRequest_migrationInProgress_apiBlocked()
-            throws InterruptedException {
-        startMigrationWithShellPermissionIdentity();
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .build();
-
-        mManager.readMedicalResources(request, executor, receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_DATA_SYNC_IN_PROGRESS);
-
-        finishMigrationWithShellPermissionIdentity();
-    }
-
-    @Test
     public void testGetRecordTypeInfo_InsertRecords_correctContributingPackages() throws Exception {
         // Insert a set of test records for StepRecords, ExerciseSessionRecord, HeartRateRecord,
         // BasalMetabolicRateRecord.
@@ -1964,1226 +1402,6 @@
         verifyRecordTypeResponse(response, expectedResponseMap);
     }
 
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testCreateMedicalDataSource_succeeds() throws InterruptedException {
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
-        CreateMedicalDataSourceRequest request = getCreateMedicalDataSourceRequest();
-
-        mManager.createMedicalDataSource(request, executor, receiver);
-
-        MedicalDataSource responseDataSource = receiver.getResponse();
-        assertThat(responseDataSource).isInstanceOf(MedicalDataSource.class);
-        assertThat(responseDataSource.getId()).isNotEmpty();
-        assertThat(responseDataSource.getFhirBaseUri()).isEqualTo(request.getFhirBaseUri());
-        assertThat(responseDataSource.getDisplayName()).isEqualTo(request.getDisplayName());
-        assertThat(responseDataSource.getPackageName()).isEqualTo(APP_PACKAGE_NAME);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testCreateMedicalDataSource_hasDataManagementPermission_throws()
-            throws InterruptedException {
-        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
-
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.createMedicalDataSource(
-                                getCreateMedicalDataSourceRequest(),
-                                Executors.newSingleThreadExecutor(),
-                                receiver),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_SECURITY);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testCreateMedicalDataSource_maxNumberOfSources_succeeds()
-            throws InterruptedException {
-        for (int i = 0; i < MAX_ALLOWED_MEDICAL_DATA_SOURCES - 1; i++) {
-            String suffix = String.valueOf(i);
-            createDataSource(getCreateMedicalDataSourceRequest(suffix));
-        }
-
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
-        mManager.createMedicalDataSource(getCreateMedicalDataSourceRequest(), executor, receiver);
-
-        receiver.verifyNoExceptionOrThrow();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testCreateMedicalDataSource_moreThanAllowedMax_throws()
-            throws InterruptedException {
-        for (int i = 0; i < MAX_ALLOWED_MEDICAL_DATA_SOURCES; i++) {
-            String suffix = String.valueOf(i);
-            createDataSource(getCreateMedicalDataSourceRequest(suffix));
-        }
-
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
-        mManager.createMedicalDataSource(getCreateMedicalDataSourceRequest(), executor, receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalDataSources_emptyIds_returnsEmptyList() throws InterruptedException {
-        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
-
-        mManager.getMedicalDataSources(List.of(), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).isEmpty();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testGetMedicalDataSources_invalidId_fails() throws Exception {
-        HealthConnectReceiver<List<MedicalDataSource>> callback = new HealthConnectReceiver<>();
-
-        mManager.getMedicalDataSources(
-                List.of("illegal id"), Executors.newSingleThreadExecutor(), callback);
-
-        assertThat(callback.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalDataSourcesById_notPresent_returnsEmptyList() throws Exception {
-        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
-        List<String> ids = List.of(DATA_SOURCE_ID);
-
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.getMedicalDataSources(
-                                ids, Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(receiver.getResponse()).isEmpty();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalDataSourcesById_onePresent_returnsIt() throws Exception {
-        HealthConnectReceiver<MedicalDataSource> createReceiver = new HealthConnectReceiver<>();
-        mManager.createMedicalDataSource(
-                getCreateMedicalDataSourceRequest(),
-                Executors.newSingleThreadExecutor(),
-                createReceiver);
-        MedicalDataSource dataSource = createReceiver.getResponse();
-        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
-
-        mManager.getMedicalDataSources(
-                List.of(dataSource.getId()), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).containsExactly(dataSource);
-        assertThat(dataSource.getLastDataUpdateTime()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalDataSourcesByRequest_nothingPresent_returnsEmpty() throws Exception {
-        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
-        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
-
-        SystemUtil.runWithShellPermissionIdentity(
-                () -> {
-                    mManager.getMedicalDataSources(
-                            request, Executors.newSingleThreadExecutor(), receiver);
-                },
-                MANAGE_HEALTH_DATA);
-
-        assertThat(receiver.getResponse()).isEmpty();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalDataSourcesByRequest_onePresent_returnsIt() throws Exception {
-        HealthConnectReceiver<MedicalDataSource> createReceiver = new HealthConnectReceiver<>();
-        mManager.createMedicalDataSource(
-                getCreateMedicalDataSourceRequest(),
-                Executors.newSingleThreadExecutor(),
-                createReceiver);
-        MedicalDataSource dataSource = createReceiver.getResponse();
-        HealthConnectReceiver<List<MedicalDataSource>> receiver = new HealthConnectReceiver<>();
-        GetMedicalDataSourcesRequest request = new GetMedicalDataSourcesRequest.Builder().build();
-
-        mManager.getMedicalDataSources(request, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).containsExactly(dataSource);
-        assertThat(dataSource.getLastDataUpdateTime()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testHealthConnectManager_deleteMedicalDataSourceInvalidId_fails() throws Exception {
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-
-        mManager.deleteMedicalDataSourceWithData(
-                "illegal id", Executors.newSingleThreadExecutor(), callback);
-
-        assertThat(callback.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testHealthConnectManager_deleteMedicalDataSourceDoesntExist_fails()
-            throws Exception {
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-
-        mManager.deleteMedicalDataSourceWithData(
-                DATA_SOURCE_ID, Executors.newSingleThreadExecutor(), callback);
-
-        assertThat(callback.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testHealthConnectManager_deleteMedicalDataSourceExists_succeedsAndDeletes()
-            throws Exception {
-        HealthConnectReceiver<MedicalDataSource> createReceiver = new HealthConnectReceiver<>();
-        mManager.createMedicalDataSource(
-                getCreateMedicalDataSourceRequest(),
-                Executors.newSingleThreadExecutor(),
-                createReceiver);
-        MedicalDataSource dataSource = createReceiver.getResponse();
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-
-        mManager.deleteMedicalDataSourceWithData(
-                dataSource.getId(), Executors.newSingleThreadExecutor(), callback);
-
-        assertThat(callback.getResponse()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testHealthConnectManager_deleteMedicalDataSourceExistsWithData_succeedsAndDeletes()
-            throws Exception {
-        // Create the datasource
-        HealthConnectReceiver<MedicalDataSource> createReceiver = new HealthConnectReceiver<>();
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        mManager.createMedicalDataSource(
-                getCreateMedicalDataSourceRequest(), executor, createReceiver);
-        MedicalDataSource dataSource = createReceiver.getResponse();
-        MedicalResource resource = upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-
-        mManager.deleteMedicalDataSourceWithData(dataSource.getId(), executor, callback);
-
-        assertThat(callback.getResponse()).isNull();
-        // Check for existence of data
-        HealthConnectReceiver<List<MedicalResource>> readResourceReceiver =
-                new HealthConnectReceiver<>();
-        mManager.readMedicalResources(List.of(resource.getId()), executor, readResourceReceiver);
-        assertThat(readResourceReceiver.getResponse()).isEmpty();
-        // Check for existence of datasource by trying to create again.
-        // TODO: b/350010046 - switch to using read when it is implemented.
-        HealthConnectReceiver<MedicalDataSource> secondCreateReceiver =
-                new HealthConnectReceiver<>();
-        mManager.createMedicalDataSource(
-                getCreateMedicalDataSourceRequest(), executor, secondCreateReceiver);
-        secondCreateReceiver.verifyNoExceptionOrThrow();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testHealthConnectManager_deleteMedicalDataSourceDifferentPackage_denied()
-            throws Exception {
-        // Create the datasource
-        MedicalDataSource dataSource =
-                APP_WRITE_PERMS_ONLY.createMedicalDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource resource =
-                APP_WRITE_PERMS_ONLY.upsertMedicalResource(
-                        dataSource.getId(), FHIR_DATA_IMMUNIZATION);
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-
-        mManager.deleteMedicalDataSourceWithData(dataSource.getId(), executor, callback);
-
-        assertThat(callback.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-
-        // Check for existence of the medicalResource and the dataSource.
-        HealthConnectReceiver<List<MedicalResource>> readResourceReceiver =
-                new HealthConnectReceiver<>();
-        HealthConnectReceiver<List<MedicalDataSource>> getDataSourceReceiver =
-                new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () -> {
-                    mManager.readMedicalResources(
-                            List.of(resource.getId()), executor, readResourceReceiver);
-                    mManager.getMedicalDataSources(
-                            List.of(dataSource.getId()), executor, getDataSourceReceiver);
-                },
-                MANAGE_HEALTH_DATA);
-        assertThat(readResourceReceiver.getResponse()).containsExactly(resource);
-        assertThat(getDataSourceReceiver.getResponse()).containsExactly(dataSource);
-    }
-
-    // TODO(b/343923754): Add more upsert/readMedicalResources tests once deleteAll can be called.
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_forOwnDataSource_succeeds() throws InterruptedException {
-        MedicalDataSource dataSource = createDataSource(getCreateMedicalDataSourceRequest());
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest =
-                new UpsertMedicalResourceRequest.Builder(
-                                dataSource.getId(), FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
-                        .build();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        receiver.verifyNoExceptionOrThrow();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_dataSourceOwnedByOtherApp_throws() throws Exception {
-        // Create data source with different package name
-        MedicalDataSource dataSource =
-                APP_WRITE_PERMS_ONLY.createMedicalDataSource(getCreateMedicalDataSourceRequest());
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest =
-                new UpsertMedicalResourceRequest.Builder(
-                                dataSource.getId(), FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
-                        .build();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_dataSourceDoesNotExist_throws()
-            throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest = getUpsertMedicalResourceRequest();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_emptyList_returnsEmptyList()
-            throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-
-        mManager.upsertMedicalResources(List.of(), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).isEmpty();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_invalidJson_throws() throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID,
-                                FHIR_VERSION_R4,
-                                FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID)
-                        .build();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_missingResourceId_throws() throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID,
-                                FHIR_VERSION_R4,
-                                FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS)
-                        .build();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_emptyResourceId_throws() throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION_ID_EMPTY)
-                        .build();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_missingResourceType_throws()
-            throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID,
-                                FHIR_VERSION_R4,
-                                FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS)
-                        .build();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_unsupportedResourceType_throws()
-            throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID,
-                                FHIR_VERSION_R4,
-                                FHIR_DATA_IMMUNIZATION_UNSUPPORTED_RESOURCE_TYPE)
-                        .build();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testUpsertMedicalResources_unsupportedVersion_throws() throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest upsertRequest =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID, FHIR_VERSION_UNSUPPORTED, FHIR_DATA_IMMUNIZATION)
-                        .build();
-
-        mManager.upsertMedicalResources(
-                List.of(upsertRequest), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testUpsertMedicalResources_hasDataManagementPermission_throws()
-            throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.upsertMedicalResources(
-                                List.of(getUpsertMedicalResourceRequest()),
-                                Executors.newSingleThreadExecutor(),
-                                receiver),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_SECURITY);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testReadMedicalResources_emptyIds_returnsEmptyList() throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-
-        mManager.readMedicalResources(List.of(), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).isEmpty();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testReadMedicalResources_byIds_exceedsMaxPageSize_throws() {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        List<MedicalResourceId> ids = new ArrayList<>(MAXIMUM_PAGE_SIZE + 1);
-        for (int i = 0; i < MAXIMUM_PAGE_SIZE + 1; i++) {
-            ids.add(
-                    new MedicalResourceId(
-                            Integer.toString(i),
-                            FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                            FHIR_RESOURCE_ID_IMMUNIZATION));
-        }
-
-        assertThrows(
-                IllegalArgumentException.class,
-                () ->
-                        mManager.readMedicalResources(
-                                ids, Executors.newSingleThreadExecutor(), receiver));
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testReadMedicalResources_byIds_noData_returnsEmptyList()
-            throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        List<MedicalResourceId> ids = List.of(getMedicalResourceId());
-
-        mManager.readMedicalResources(ids, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).isEmpty();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testReadMedicalResources_byRequest_noData_returnsEmptyList()
-            throws InterruptedException {
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .build();
-
-        mManager.readMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
-        assertThat(receiver.getResponse().getMedicalResources()).isEmpty();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testReadMedicalResources_byRequest_filtersByMedicalResourceType()
-            throws InterruptedException {
-        // Create two data sources.
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest("1"));
-        MedicalDataSource dataSource2 = createDataSource(getCreateMedicalDataSourceRequest("2"));
-        // Insert 3 Immunizations and 1 Allergy.
-        MedicalResource immunization1 =
-                upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
-        MedicalResource immunization2 =
-                upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
-        MedicalResource immunization3 =
-                upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
-        upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
-        // Read all Immunizations in 2 pages.
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allImmunizationsRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .setPageSize(2)
-                        .build();
-
-        mManager.readMedicalResources(
-                allImmunizationsRequest, Executors.newSingleThreadExecutor(), receiver1);
-
-        assertThat(receiver1.getResponse().getMedicalResources())
-                .containsExactly(immunization1, immunization2);
-        String nextPageToken = receiver1.getResponse().getNextPageToken();
-        assertThat(nextPageToken).isNotEmpty();
-
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
-                new HealthConnectReceiver<>();
-        mManager.readMedicalResources(
-                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build(),
-                Executors.newSingleThreadExecutor(),
-                receiver2);
-
-        assertThat(receiver2.getResponse().getMedicalResources()).containsExactly(immunization3);
-        assertThat(receiver2.getResponse().getNextPageToken()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testReadMedicalResources_byRequest_filtersByMedicalResourceTypeAndOneDataSource()
-            throws InterruptedException {
-        // Create two data sources.
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest("1"));
-        MedicalDataSource dataSource2 = createDataSource(getCreateMedicalDataSourceRequest("2"));
-        // Insert 3 Immunizations and 1 Allergy.
-        MedicalResource immunization1FromDataSource1 =
-                upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
-        MedicalResource immunization2FromDataSource1 =
-                upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
-        upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
-        upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
-        // Read Immunizations only from data source 1 in 2 pages.
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest immunizationsFromDataSource1Request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .addDataSourceId(dataSource1.getId())
-                        .setPageSize(1)
-                        .build();
-
-        mManager.readMedicalResources(
-                immunizationsFromDataSource1Request,
-                Executors.newSingleThreadExecutor(),
-                receiver1);
-
-        assertThat(receiver1.getResponse().getMedicalResources())
-                .containsExactly(immunization1FromDataSource1);
-        String nextPageToken = receiver1.getResponse().getNextPageToken();
-        assertThat(nextPageToken).isNotEmpty();
-
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
-                new HealthConnectReceiver<>();
-        mManager.readMedicalResources(
-                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build(),
-                Executors.newSingleThreadExecutor(),
-                receiver2);
-
-        assertThat(receiver2.getResponse().getMedicalResources())
-                .containsExactly(immunization2FromDataSource1);
-        assertThat(receiver2.getResponse().getNextPageToken()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testReadMedicalResources_byRequest_filtersByMedicalResourceTypeAndBothDataSources()
-            throws InterruptedException {
-        // Create two data sources.
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest("1"));
-        MedicalDataSource dataSource2 = createDataSource(getCreateMedicalDataSourceRequest("2"));
-        // Insert 2 Immunizations and 1 Allergy.
-        MedicalResource immunizationFromDataSource1 =
-                upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
-        MedicalResource immunizationFromDataSource2 =
-                upsertMedicalData(dataSource2.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
-        upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
-        // Read Immunizations only from both data sources in 2 pages.
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver1 =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest immunizationsFromBothDataSourcesRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .addDataSourceId(dataSource1.getId())
-                        .addDataSourceId(dataSource2.getId())
-                        .setPageSize(1)
-                        .build();
-
-        mManager.readMedicalResources(
-                immunizationsFromBothDataSourcesRequest,
-                Executors.newSingleThreadExecutor(),
-                receiver1);
-
-        assertThat(receiver1.getResponse().getMedicalResources())
-                .containsExactly(immunizationFromDataSource1);
-        String nextPageToken = receiver1.getResponse().getNextPageToken();
-        assertThat(nextPageToken).isNotEmpty();
-
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver2 =
-                new HealthConnectReceiver<>();
-        mManager.readMedicalResources(
-                new ReadMedicalResourcesPageRequest.Builder(nextPageToken).build(),
-                Executors.newSingleThreadExecutor(),
-                receiver2);
-
-        assertThat(receiver2.getResponse().getMedicalResources())
-                .containsExactly(immunizationFromDataSource2);
-        assertThat(receiver2.getResponse().getNextPageToken()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testDeleteMedicalResources_byIdsNonExistent_succeeds() throws InterruptedException {
-        MedicalDataSource dataSource = createDataSource(getCreateMedicalDataSourceRequest());
-        List<MedicalResourceId> ids = new ArrayList<>(MAXIMUM_PAGE_SIZE + 1);
-        for (int i = 0; i < MAXIMUM_PAGE_SIZE + 1; i++) {
-            ids.add(
-                    new MedicalResourceId(
-                            dataSource.getId(),
-                            FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                            FHIR_RESOURCE_ID_IMMUNIZATION + "." + i));
-        }
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-
-        mManager.deleteMedicalResources(ids, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testDeleteMedicalResourcesByIds_managementPermissionNoData_succeeds()
-            throws InterruptedException {
-        MedicalDataSource dataSource = createDataSource(getCreateMedicalDataSourceRequest());
-        List<MedicalResourceId> ids = new ArrayList<>(MAXIMUM_PAGE_SIZE + 1);
-        for (int i = 0; i < MAXIMUM_PAGE_SIZE + 1; i++) {
-            ids.add(
-                    new MedicalResourceId(
-                            dataSource.getId(),
-                            FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                            FHIR_RESOURCE_ID_IMMUNIZATION + "." + i));
-        }
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.deleteMedicalResources(
-                                ids, Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-
-        receiver.verifyNoExceptionOrThrow();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testDeleteMedicalResourcesByIds_anIdMissing_succeeds() throws InterruptedException {
-        MedicalDataSource dataSource = createDataSource(getCreateMedicalDataSourceRequest());
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-        MedicalResourceId id =
-                new MedicalResourceId(
-                        dataSource.getId(),
-                        FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                        FHIR_RESOURCE_ID_IMMUNIZATION);
-
-        mManager.deleteMedicalResources(List.of(id), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testDeleteMedicalResourcesByIds_emptyIds_succeeds() throws InterruptedException {
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-
-        mManager.deleteMedicalResources(List.of(), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testDeleteMedicalResourcesByIds_managementPermissionAMissingId_succeeds()
-            throws InterruptedException {
-        MedicalDataSource dataSource = createDataSource(getCreateMedicalDataSourceRequest());
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-        MedicalResourceId id =
-                new MedicalResourceId(
-                        dataSource.getId(),
-                        FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                        FHIR_RESOURCE_ID_IMMUNIZATION);
-
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.deleteMedicalResources(
-                                List.of(id), Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-
-        receiver.verifyNoExceptionOrThrow();
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testDeleteMedicalResourcesByIds_managementPermissionEmptyIds_succeeds()
-            throws InterruptedException {
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.deleteMedicalResources(
-                                List.of(), Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(receiver.getResponse()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testDeleteMedicalResourcesByIds_managementPermissionCreate2Delete1_succeeds()
-            throws InterruptedException {
-        MedicalDataSource dataSource = createDataSource(getCreateMedicalDataSourceRequest());
-        // Insert some data
-        MedicalResource resource1 = upsertMedicalData(dataSource.getId(), FHIR_DATA_IMMUNIZATION);
-        MedicalResource resource2 =
-                upsertMedicalData(dataSource.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.deleteMedicalResources(
-                                List.of(resource1.getId()),
-                                Executors.newSingleThreadExecutor(),
-                                callback),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(callback.getResponse()).isNull();
-        // Test resource2 is still present
-        HealthConnectReceiver<ReadMedicalResourcesResponse> readReceiver =
-                new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.readMedicalResources(
-                                new ReadMedicalResourcesInitialRequest.Builder(
-                                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                                        .build(),
-                                Executors.newSingleThreadExecutor(),
-                                readReceiver));
-        assertThat(readReceiver.getResponse().getMedicalResources()).containsExactly(resource2);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testDeleteMedicalResourcesByRequest_managementPermissionCreate2Delete1_succeeds()
-            throws InterruptedException {
-        // Create the datasource
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest("1"));
-        MedicalDataSource dataSource2 = createDataSource(getCreateMedicalDataSourceRequest("2"));
-        // Insert some data
-        MedicalResource resource1 = upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
-        MedicalResource resource2 = upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
-
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-        DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId(dataSource1.getId())
-                        .build();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.deleteMedicalResources(
-                                request, Executors.newSingleThreadExecutor(), callback),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(callback.getResponse()).isNull();
-        // Test resource2 is still present
-        HealthConnectReceiver<List<MedicalResource>> readReceiver2 = new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.readMedicalResources(
-                                List.of(resource1.getId(), resource2.getId()),
-                                Executors.newSingleThreadExecutor(),
-                                readReceiver2));
-        assertThat(readReceiver2.getResponse()).containsExactly(resource2);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testDeleteMedicalResourcesByRequest_badDataSourceId_doesntDeleteAll()
-            throws InterruptedException {
-        // Create the datasource
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest("1"));
-        // Insert some data
-        MedicalResource resource1 = upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
-
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-        DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("illegal id").build();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.deleteMedicalResources(
-                                request, Executors.newSingleThreadExecutor(), callback),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(callback.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
-        // Test resource is still present
-        HealthConnectReceiver<List<MedicalResource>> readReceiver2 = new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.readMedicalResources(
-                                List.of(resource1.getId()),
-                                Executors.newSingleThreadExecutor(),
-                                readReceiver2));
-        assertThat(readReceiver2.getResponse()).containsExactly(resource1);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testDeleteMedicalResourcesByRequest_resourceTypesMatch_succeeds()
-            throws InterruptedException {
-        // Create the datasource
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest("1"));
-        MedicalDataSource dataSource2 = createDataSource(getCreateMedicalDataSourceRequest("2"));
-        // Insert some data
-        MedicalResource imm1 = upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
-        MedicalResource imm2 = upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
-
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-        DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .build();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.deleteMedicalResources(
-                                request, Executors.newSingleThreadExecutor(), callback),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(callback.getResponse()).isNull();
-        // Test resource2 is still present
-        HealthConnectReceiver<List<MedicalResource>> readReceiver2 = new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.readMedicalResources(
-                                List.of(imm1.getId(), imm2.getId()),
-                                Executors.newSingleThreadExecutor(),
-                                readReceiver2));
-        assertThat(readReceiver2.getResponse()).isEmpty();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testDeleteMedicalResourcesByRequest_resourceTypesMismatch_succeeds()
-            throws InterruptedException {
-        // Create the datasource
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest("1"));
-        MedicalDataSource dataSource2 = createDataSource(getCreateMedicalDataSourceRequest("2"));
-        // Insert some data
-        MedicalResource imm1 = upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
-        MedicalResource imm2 = upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
-
-        HealthConnectReceiver<Void> callback = new HealthConnectReceiver<>();
-        DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION + 1)
-                        .build();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.deleteMedicalResources(
-                                request, Executors.newSingleThreadExecutor(), callback),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(callback.getResponse()).isNull();
-        // Test resource2 is still present
-        HealthConnectReceiver<List<MedicalResource>> readReceiver2 = new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.readMedicalResources(
-                                List.of(imm1.getId(), imm2.getId()),
-                                Executors.newSingleThreadExecutor(),
-                                readReceiver2));
-        assertThat(readReceiver2.getResponse()).containsExactly(imm1, imm2);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testDeleteMedicalResources_byRequestNothingPresent_succeeds() throws Exception {
-        // Insert a data source to ensure we have an appInfoId.
-        createDataSource(getCreateMedicalDataSourceRequest());
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-        DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId(UUID.randomUUID().toString())
-                        .build();
-
-        mManager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse()).isNull();
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testQueryAllMedicalResourceTypeInfos_succeeds() throws InterruptedException {
-        // Create some data sources with data: ds1 contains [immunization, differentImmunization,
-        // allergy], ds2 contains [immunization], and ds3 contains [allergy].
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest("1"));
-        MedicalDataSource dataSource2 = createDataSource(getCreateMedicalDataSourceRequest("2"));
-        MedicalDataSource dataSource3 = createDataSource(getCreateMedicalDataSourceRequest("3"));
-        upsertMedicalData(dataSource1.getId(), FHIR_DATA_IMMUNIZATION);
-        upsertMedicalData(dataSource1.getId(), DIFFERENT_FHIR_DATA_IMMUNIZATION);
-        upsertMedicalData(dataSource1.getId(), FHIR_DATA_ALLERGY);
-        upsertMedicalData(dataSource2.getId(), FHIR_DATA_IMMUNIZATION);
-        upsertMedicalData(dataSource3.getId(), FHIR_DATA_ALLERGY);
-
-        HealthConnectReceiver<List<MedicalResourceTypeInfo>> receiver =
-                new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.queryAllMedicalResourceTypeInfos(
-                                Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(receiver.getResponse())
-                .containsExactly(
-                        new MedicalResourceTypeInfo(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                Set.of(dataSource1, dataSource3)),
-                        new MedicalResourceTypeInfo(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                Set.of(dataSource1, dataSource2)),
-                        new MedicalResourceTypeInfo(
-                                MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_MEDICATIONS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PREGNANCY, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PROBLEMS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PROCEDURES, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VITAL_SIGNS, Set.of()));
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testQueryAllMedicalResourceTypeInfos_noDataSources_succeeds()
-            throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResourceTypeInfo>> receiver =
-                new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.queryAllMedicalResourceTypeInfos(
-                                Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(receiver.getResponse())
-                .containsExactly(
-                        new MedicalResourceTypeInfo(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, Set.of()),
-                        new MedicalResourceTypeInfo(
-                                MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_MEDICATIONS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PREGNANCY, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PROBLEMS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PROCEDURES, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VITAL_SIGNS, Set.of()));
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testQueryAllMedicalResourceTypeInfos_noMedicalResources_succeeds()
-            throws InterruptedException {
-        createDataSource(getCreateMedicalDataSourceRequest("1"));
-
-        HealthConnectReceiver<List<MedicalResourceTypeInfo>> receiver =
-                new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.queryAllMedicalResourceTypeInfos(
-                                Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(receiver.getResponse())
-                .containsExactly(
-                        new MedicalResourceTypeInfo(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION, Set.of()),
-                        new MedicalResourceTypeInfo(
-                                MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_MEDICATIONS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PREGNANCY, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PROBLEMS, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_PROCEDURES, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY, Set.of()),
-                        new MedicalResourceTypeInfo(MEDICAL_RESOURCE_TYPE_VITAL_SIGNS, Set.of()));
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testLabResultsInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource labResult =
-                upsertMedicalData(
-                        dataSource1.getId(),
-                        new ObservationBuilder()
-                                .setBloodGlucose()
-                                .setCategory(LABORATORY)
-                                .toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allLabResultsRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(
-                                MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS)
-                        .build();
-
-        mManager.readMedicalResources(
-                allLabResultsRequest, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(labResult);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testPregnancyInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource pregnancyStatus =
-                upsertMedicalData(
-                        dataSource1.getId(),
-                        new ObservationBuilder()
-                                .setPregnancyStatus(ObservationBuilder.PregnancyStatus.PREGNANT)
-                                .toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allPregnancyRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_PREGNANCY)
-                        .build();
-
-        mManager.readMedicalResources(
-                allPregnancyRequest, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(pregnancyStatus);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testSocialHistoryInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource smoking =
-                upsertMedicalData(
-                        dataSource1.getId(),
-                        new ObservationBuilder()
-                                .setTobaccoUse(ObservationBuilder.CurrentSmokingStatus.SMOKER)
-                                .toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allSocialHistoryRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY)
-                        .build();
-
-        mManager.readMedicalResources(
-                allSocialHistoryRequest, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(smoking);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testVitalSignsInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource heartRate =
-                upsertMedicalData(
-                        dataSource1.getId(), new ObservationBuilder().setHeartRate(100).toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allVitalSignsRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VITAL_SIGNS)
-                        .build();
-
-        mManager.readMedicalResources(
-                allVitalSignsRequest, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(heartRate);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testConditionInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource condition =
-                upsertMedicalData(dataSource1.getId(), new ConditionBuilder().toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allProblems =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_PROBLEMS)
-                        .build();
-
-        mManager.readMedicalResources(allProblems, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(condition);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testProcedureInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource procedure =
-                upsertMedicalData(dataSource1.getId(), new ProcedureBuilder().toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allProblems =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_PROCEDURES)
-                        .build();
-
-        mManager.readMedicalResources(allProblems, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(procedure);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testMedicationInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource medication =
-                upsertMedicalData(dataSource1.getId(), MedicationsBuilder.medication().toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allProblems =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
-                        .build();
-
-        mManager.readMedicalResources(allProblems, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(medication);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testMedicationStatementInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource statement =
-                upsertMedicalData(dataSource1.getId(), MedicationsBuilder.statementR4().toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allProblems =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
-                        .build();
-
-        mManager.readMedicalResources(allProblems, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(statement);
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testMedicationRequestInsertAndRead() throws Exception {
-        MedicalDataSource dataSource1 = createDataSource(getCreateMedicalDataSourceRequest());
-        MedicalResource request =
-                upsertMedicalData(dataSource1.getId(), MedicationsBuilder.request().toJson());
-        HealthConnectReceiver<ReadMedicalResourcesResponse> receiver =
-                new HealthConnectReceiver<>();
-        ReadMedicalResourcesInitialRequest allProblems =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
-                        .build();
-
-        mManager.readMedicalResources(allProblems, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.getResponse().getMedicalResources()).containsExactly(request);
-    }
-
-    @Test
-    public void testGetContributorApplicationsInfo_succeeds() throws Exception {
-        // Create health fitness data.
-        Set<String> expectedPackages = new HashSet<>();
-        TestUtils.insertRecords(getTestRecords());
-        expectedPackages.add(APP_PACKAGE_NAME);
-        // Create medical data with a different package.
-        if (personalHealthRecord()) {
-            APP_WRITE_PERMS_ONLY.createMedicalDataSource(getCreateMedicalDataSourceRequest());
-            expectedPackages.add(APP_WRITE_PERMS_ONLY.getPackageName());
-        }
-
-        HealthConnectReceiver<ApplicationInfoResponse> receiver = new HealthConnectReceiver<>();
-        SystemUtil.runWithShellPermissionIdentity(
-                () ->
-                        mManager.getContributorApplicationsInfo(
-                                Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-
-        assertThat(
-                        receiver.getResponse().getApplicationInfoList().stream()
-                                .map(AppInfo::getPackageName)
-                                .collect(Collectors.toSet()))
-                .isEqualTo(expectedPackages);
-    }
-
     private boolean isEmptyContributingPackagesForAll(
             Map<Class<? extends Record>, RecordTypeInfoResponse> response) {
         // If all the responses have empty lists in their contributing packages then we
@@ -3194,47 +1412,6 @@
                 .allMatch(List::isEmpty);
     }
 
-    private MedicalDataSource createDataSource(CreateMedicalDataSourceRequest createRequest)
-            throws InterruptedException {
-        HealthConnectReceiver<MedicalDataSource> createReceiver = new HealthConnectReceiver<>();
-        mManager.createMedicalDataSource(
-                createRequest, Executors.newSingleThreadExecutor(), createReceiver);
-        return createReceiver.getResponse();
-    }
-
-    private MedicalResource upsertMedicalData(String dataSourceId, String data)
-            throws InterruptedException {
-        HealthConnectReceiver<List<MedicalResource>> dataReceiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest request =
-                new UpsertMedicalResourceRequest.Builder(dataSourceId, FHIR_VERSION_R4, data)
-                        .build();
-        mManager.upsertMedicalResources(
-                List.of(request), Executors.newSingleThreadExecutor(), dataReceiver);
-        // Make sure something got inserted.
-        return Iterables.getOnlyElement(dataReceiver.getResponse());
-    }
-
-    private static void deleteAllStagedRemoteData()
-            throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
-        try {
-            Context context = ApplicationProvider.getApplicationContext();
-            HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-            assertThat(service).isNotNull();
-
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .adoptShellPermissionIdentity(
-                            "android.permission.DELETE_STAGED_HEALTH_CONNECT_REMOTE_DATA");
-            // TODO(b/241542162): Avoid using reflection as a workaround once test apis can be
-            //  run in CTS tests.
-            service.getClass().getMethod("deleteAllStagedRemoteData").invoke(service);
-        } finally {
-            InstrumentationRegistry.getInstrumentation()
-                    .getUiAutomation()
-                    .dropShellPermissionIdentity();
-        }
-    }
-
     private static void verifyRecordTypeResponse(
             Map<Class<? extends Record>, RecordTypeInfoResponse> responses,
             HashMap<Class<? extends Record>, TestUtils.RecordTypeInfoTestResponse>
diff --git a/tests/cts/src/android/healthconnect/cts/HealthPermissionCategoryPriorityTests.java b/tests/cts/src/android/healthconnect/cts/HealthPermissionCategoryPriorityTests.java
index d2dbe37..76d3f3c 100644
--- a/tests/cts/src/android/healthconnect/cts/HealthPermissionCategoryPriorityTests.java
+++ b/tests/cts/src/android/healthconnect/cts/HealthPermissionCategoryPriorityTests.java
@@ -22,31 +22,33 @@
 import static android.health.connect.HealthDataCategory.NUTRITION;
 import static android.health.connect.HealthDataCategory.SLEEP;
 import static android.health.connect.HealthDataCategory.VITALS;
+import static android.healthconnect.cts.utils.HealthConnectReceiver.callAndGetResponseWithShellPermissionIdentity;
 import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
-import static android.healthconnect.cts.utils.TestUtils.getPriority;
-import static android.healthconnect.cts.utils.TestUtils.getPriorityWithManageHealthDataPermission;
-import static android.healthconnect.cts.utils.TestUtils.updatePriority;
-import static android.healthconnect.cts.utils.TestUtils.updatePriorityWithManageHealthDataPermission;
+import static android.healthconnect.cts.utils.TestOutcomeReceiver.outcomeExecutor;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.app.UiAutomation;
+import static java.util.Objects.requireNonNull;
+
+import android.content.Context;
 import android.health.connect.FetchDataOriginsPriorityOrderResponse;
 import android.health.connect.HealthConnectException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.UpdateDataOriginPriorityOrderRequest;
+import android.health.connect.datatypes.DataOrigin;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.HealthConnectReceiver;
 import android.healthconnect.cts.utils.TestUtils;
 
-import androidx.test.InstrumentationRegistry;
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -54,20 +56,21 @@
 public class HealthPermissionCategoryPriorityTests {
     private static final Set<Integer> sAllDataCategories =
             Set.of(ACTIVITY, BODY_MEASUREMENTS, CYCLE_TRACKING, NUTRITION, SLEEP, VITALS);
-    private static final String TAG = "PermissionCategoryPriorityTests";
-    private static final UiAutomation sUiAutomation =
-            InstrumentationRegistry.getInstrumentation().getUiAutomation();
 
     public static final String PACKAGE_NAME = "android.healthconnect.cts";
-    public static final String OTHER_PACKAGE_NAME = "";
 
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private HealthConnectManager mManager;
 
     @Before
     public void setUp() {
+        Context context = ApplicationProvider.getApplicationContext();
+        mManager = requireNonNull(context.getSystemService(HealthConnectManager.class));
         TestUtils.deleteAllStagedRemoteData();
     }
 
@@ -79,66 +82,94 @@
     @Test
     public void testGetPriority() throws InterruptedException {
         for (Integer permissionCategory : sAllDataCategories) {
-            assertThat(getPriorityWithManageHealthDataPermission(permissionCategory)).isNotNull();
+            FetchDataOriginsPriorityOrderResponse response =
+                    callAndGetResponseWithShellPermissionIdentity(
+                            (executor, receiver) ->
+                                    mManager.fetchDataOriginsPriorityOrder(
+                                            permissionCategory, executor, receiver),
+                            MANAGE_HEALTH_DATA);
+
+            assertThat(response).isNotNull();
         }
     }
 
     @Test
     public void testGetPriority_no_perm() throws InterruptedException {
         for (Integer permissionCategory : sAllDataCategories) {
-            try {
-                getPriority(permissionCategory);
-                Assert.fail("Get Priority must not be allowed without right HC permission");
-            } catch (HealthConnectException healthConnectException) {
-                assertThat(healthConnectException.getErrorCode())
-                        .isEqualTo(HealthConnectException.ERROR_SECURITY);
-            }
+            HealthConnectReceiver<FetchDataOriginsPriorityOrderResponse> receiver =
+                    new HealthConnectReceiver<>();
+            mManager.fetchDataOriginsPriorityOrder(permissionCategory, outcomeExecutor(), receiver);
+
+            HealthConnectException healthConnectException = receiver.assertAndGetException();
+            assertThat(healthConnectException.getErrorCode())
+                    .isEqualTo(HealthConnectException.ERROR_SECURITY);
         }
     }
 
     @Test
     public void testUpdatePriority_withNewApps_updatesCorrectly() throws InterruptedException {
-        sUiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+        for (Integer permissionCategory : sAllDataCategories) {
+            FetchDataOriginsPriorityOrderResponse currentPriority =
+                    callAndGetResponseWithShellPermissionIdentity(
+                            (executor, receiver) ->
+                                    mManager.fetchDataOriginsPriorityOrder(
+                                            permissionCategory, executor, receiver),
+                            MANAGE_HEALTH_DATA);
+            assertThat(currentPriority).isNotNull();
+            // The initial priority list is empty at this stage because permissions have
+            // been granted through packageManager
+            // TODO (b/314092270) - remove when the priority list is updated via the package
+            // manager
+            assertThat(currentPriority.getDataOriginsPriorityOrder()).isEmpty();
 
-        try {
-            for (Integer permissionCategory : sAllDataCategories) {
+            UpdateDataOriginPriorityOrderRequest updateRequest =
+                    createUpdateRequest(List.of(PACKAGE_NAME), permissionCategory);
+            Void unused =
+                    callAndGetResponseWithShellPermissionIdentity(
+                            (executor, receiver) ->
+                                    mManager.updateDataOriginPriorityOrder(
+                                            updateRequest, executor, receiver),
+                            MANAGE_HEALTH_DATA);
 
-                FetchDataOriginsPriorityOrderResponse currentPriority =
-                        getPriorityWithManageHealthDataPermission(permissionCategory);
-                assertThat(currentPriority).isNotNull();
-                // The initial priority list is empty at this stage because permissions have
-                // been granted through packageManager
-                // TODO (b/314092270) - remove when the priority list is updated via the package
-                // manager
-                assertThat(currentPriority.getDataOriginsPriorityOrder()).isEmpty();
+            FetchDataOriginsPriorityOrderResponse newPriority =
+                    callAndGetResponseWithShellPermissionIdentity(
+                            (executor, receiver) ->
+                                    mManager.fetchDataOriginsPriorityOrder(
+                                            permissionCategory, executor, receiver),
+                            MANAGE_HEALTH_DATA);
 
-                List<String> newPriorityListPackages = Arrays.asList(PACKAGE_NAME);
-                updatePriorityWithManageHealthDataPermission(
-                        permissionCategory, newPriorityListPackages);
-                FetchDataOriginsPriorityOrderResponse newPriority =
-                        getPriorityWithManageHealthDataPermission(permissionCategory);
-
-                assertThat(newPriority.getDataOriginsPriorityOrder().size()).isEqualTo(1);
-                assertThat(newPriority.getDataOriginsPriorityOrder().get(0).getPackageName())
-                        .isEqualTo(PACKAGE_NAME);
-            }
-        } finally {
-            sUiAutomation.dropShellPermissionIdentity();
+            assertThat(newPriority.getDataOriginsPriorityOrder()).hasSize(1);
+            assertThat(newPriority.getDataOriginsPriorityOrder().get(0).getPackageName())
+                    .isEqualTo(PACKAGE_NAME);
         }
     }
 
     @Test
     public void testUpdatePriority_no_perm() throws InterruptedException {
         for (Integer permissionCategory : sAllDataCategories) {
-            try {
-                updatePriority(permissionCategory, Arrays.asList("a", "b", "c"));
-                Assert.fail("Update priority must not be allowed without right HC permission");
-            } catch (HealthConnectException healthConnectException) {
-                assertThat(healthConnectException.getErrorCode())
-                        .isEqualTo(HealthConnectException.ERROR_SECURITY);
-            }
+            UpdateDataOriginPriorityOrderRequest updateRequest =
+                    createUpdateRequest(List.of("a", "b", "c"), permissionCategory);
+            HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
+            mManager.updateDataOriginPriorityOrder(updateRequest, outcomeExecutor(), receiver);
+
+            HealthConnectException healthConnectException = receiver.assertAndGetException();
+            assertThat(healthConnectException.getErrorCode())
+                    .isEqualTo(HealthConnectException.ERROR_SECURITY);
         }
     }
 
     // TODO(b/261618513): Test actual priority order by using other test apps
+
+    private static UpdateDataOriginPriorityOrderRequest createUpdateRequest(
+            List<String> packageNames, int dataCategory) {
+        List<DataOrigin> dataOrigins =
+                packageNames.stream()
+                        .map(
+                                (packageName) ->
+                                        new DataOrigin.Builder()
+                                                .setPackageName(packageName)
+                                                .build())
+                        .toList();
+        return new UpdateDataOriginPriorityOrderRequest(dataOrigins, dataCategory);
+    }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/HealthServicesInitializerTest.java b/tests/cts/src/android/healthconnect/cts/HealthServicesInitializerTest.java
index f2fbd17..bcd0e4b 100644
--- a/tests/cts/src/android/healthconnect/cts/HealthServicesInitializerTest.java
+++ b/tests/cts/src/android/healthconnect/cts/HealthServicesInitializerTest.java
@@ -16,17 +16,24 @@
 
 package android.healthconnect.cts;
 
-import static android.healthconnect.cts.utils.TestUtils.isHardwareSupported;
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertThrows;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
 
 import android.content.Context;
+import android.health.connect.HealthPermissions;
 import android.health.connect.HealthServicesInitializer;
+import android.healthconnect.cts.utils.TestUtils;
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.compatibility.common.util.FeatureUtil;
+import com.android.healthfitness.flags.Flags;
+
 import org.junit.Test;
 
 public class HealthServicesInitializerTest {
@@ -37,27 +44,65 @@
      */
     @Test
     public void testRegisterServiceThrowsException() {
-        Context context = InstrumentationRegistry.getInstrumentation().getContext();
-        // skip the test if the hardware not supported
-        if (!isHardwareSupported(context)) {
-            return;
-        }
+        assumeTrue(TestUtils.isHealthConnectFullySupported());
         assertThrows(
                 IllegalStateException.class, HealthServicesInitializer::registerServiceWrappers);
     }
 
     /**
-     * context.getSystemService(Context.HEALTHCONNECT_SERVICE) returns the services on supported
-     * devices.
+     * context.getSystemService(Context.HEALTHCONNECT_SERVICE) returns null on
+     * unsupported devices.
      */
     @Test
-    public void testHealthServiceRegistered() {
+    public void testHealthServiceRegisteredUnsupportedHardwareReturnsNull() {
+        assumeFalse(TestUtils.isHealthConnectFullySupported());
         Context context = InstrumentationRegistry.getInstrumentation().getContext();
         Object service = context.getSystemService(Context.HEALTHCONNECT_SERVICE);
-        if (isHardwareSupported(context)) {
-            assertThat(service).isNotNull();
-        } else {
-            assertThat(service).isNull();
-        }
+        assertThat(service).isNull();
     }
-}
+
+    /**
+     * context.getSystemService(Context.HEALTHCONNECT_SERVICE) returns the
+     * service on supported (non-watch) devices.
+     */
+    @Test
+    public void testHealthServiceRegisteredNonWatchSupportedHardwareReturnsNonNull() {
+        assumeTrue(TestUtils.isHealthConnectFullySupported());
+        assumeFalse(FeatureUtil.isWatch());
+        Context context = InstrumentationRegistry.getInstrumentation().getContext();
+        Object service = context.getSystemService(Context.HEALTHCONNECT_SERVICE);
+        assertThat(service).isNotNull();
+    }
+
+    /**
+     * context.getSystemService(Context.HEALTHCONNECT_SERVICE) returns null on
+     * watches when the package is not allowed (because it doesn't have the
+     * MANAGE_HEALTH_PERMISSIONS permission).
+     */
+    @Test
+    public void testHealthServiceRegisteredWatchUnsupportedPackageReturnsNull() {
+        assumeTrue(TestUtils.isHealthConnectFullySupported());
+        assumeTrue(FeatureUtil.isWatch());
+        Context context = InstrumentationRegistry.getInstrumentation().getContext();
+        Object service = context.getSystemService(Context.HEALTHCONNECT_SERVICE);
+        assertThat(service).isNull();
+    }
+
+    /**
+     * context.getSystemService(Context.HEALTHCONNECT_SERVICE) returns the services on watches to
+     * apps with the MANAGE_HEALTH_PERMISSIONS permission.
+     */
+    @Test
+    public void testHealthServiceRegisteredWatchPackageWithPermissionReturnsNonNull()
+            throws Exception {
+        assumeTrue(TestUtils.isHealthConnectFullySupported());
+        assumeTrue(FeatureUtil.isWatch());
+        runWithShellPermissionIdentity(
+                () -> {
+                    Context context = InstrumentationRegistry.getInstrumentation().getContext();
+                    Object service = context.getSystemService(Context.HEALTHCONNECT_SERVICE);
+                    assertThat(service).isNotNull();
+                },
+                HealthPermissions.MANAGE_HEALTH_PERMISSIONS);
+    }
+}
\ No newline at end of file
diff --git a/tests/cts/src/android/healthconnect/cts/SharedMemoryTest.java b/tests/cts/src/android/healthconnect/cts/SharedMemoryTest.java
index f590a4c..baf717f 100644
--- a/tests/cts/src/android/healthconnect/cts/SharedMemoryTest.java
+++ b/tests/cts/src/android/healthconnect/cts/SharedMemoryTest.java
@@ -73,7 +73,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void before() {
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityDurationAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityDurationAggregationTest.java
new file mode 100644
index 0000000..759babe
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityDurationAggregationTest.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.aggregation;
+
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
+import static android.health.connect.datatypes.ActivityIntensityRecord.DURATION_TOTAL;
+import static android.health.connect.datatypes.ActivityIntensityRecord.MODERATE_DURATION_TOTAL;
+import static android.health.connect.datatypes.ActivityIntensityRecord.VIGOROUS_DURATION_TOTAL;
+import static android.healthconnect.cts.lib.RecordFactory.YESTERDAY_11AM;
+import static android.healthconnect.cts.utils.TestUtils.getAggregateResponse;
+import static android.healthconnect.cts.utils.TestUtils.insertRecord;
+import static android.healthconnect.cts.utils.TestUtils.insertRecords;
+import static android.healthconnect.cts.utils.TestUtils.setupAggregation;
+
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY_DB;
+import static com.android.healthfitness.flags.Flags.FLAG_HEALTH_CONNECT_MAPPINGS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.health.connect.AggregateRecordsRequest;
+import android.health.connect.AggregateRecordsResponse;
+import android.health.connect.HealthDataCategory;
+import android.health.connect.TimeInstantRangeFilter;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.DataOrigin;
+import android.healthconnect.cts.lib.ActivityIntensityRecordFactory;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+
+import androidx.annotation.Nullable;
+
+import com.android.compatibility.common.util.ApiTest;
+
+import org.junit.Test;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.util.List;
+
+@RequiresFlagsEnabled({
+    FLAG_ACTIVITY_INTENSITY,
+    FLAG_ACTIVITY_INTENSITY_DB,
+    FLAG_HEALTH_CONNECT_MAPPINGS
+})
+@ApiTest(apis = {"android.health.connect.datatypes.ActivityIntensityRecord#DURATION_TOTAL"})
+public class ActivityIntensityDurationAggregationTest
+        extends BaseDurationAggregationTest<ActivityIntensityRecord, Duration> {
+
+    private final ActivityIntensityRecordFactory mRecordFactory =
+            new ActivityIntensityRecordFactory();
+
+    public ActivityIntensityDurationAggregationTest() {
+        super(DURATION_TOTAL, HealthDataCategory.ACTIVITY);
+    }
+
+    @Override
+    Duration getExpectedValueFromDuration(Duration duration) {
+        return duration;
+    }
+
+    @Override
+    ActivityIntensityRecord createRecord(
+            Instant startTime,
+            Instant endTime,
+            @Nullable ZoneOffset startZoneOffset,
+            @Nullable ZoneOffset endZoneOffset) {
+        return mRecordFactory.newRecord(
+                startTime,
+                endTime,
+                ACTIVITY_INTENSITY_TYPE_VIGOROUS,
+                startZoneOffset,
+                endZoneOffset);
+    }
+
+    @Test
+    public void moderateRecord_multiplierIsOne() throws Exception {
+        ActivityIntensityRecord record =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusMinutes(1).plusSeconds(32).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+
+        TestUtils.insertRecords(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(DURATION_TOTAL)).isEqualTo(getRecordDuration(record));
+    }
+
+    @Test
+    public void vigorousRecord_multiplierIsOne() throws Exception {
+        ActivityIntensityRecord record =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusMinutes(1).plusSeconds(32).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+
+        TestUtils.insertRecords(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(DURATION_TOTAL)).isEqualTo(getRecordDuration(record));
+    }
+
+    @Test
+    public void multiApp_higherPriorityModerateRecord_multiplierIsOneForBothTypes()
+            throws Exception {
+        ActivityIntensityRecord higherPriorityModerateRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusHours(1).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+        ActivityIntensityRecord lowerPriorityVigorousRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.minusMinutes(5).toInstant(),
+                        YESTERDAY_11AM.plusHours(1).plusMinutes(7).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        insertRecord(higherPriorityModerateRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityVigorousRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(DURATION_TOTAL))
+                .isEqualTo(getRecordDuration(lowerPriorityVigorousRecord));
+        assertThat(response.getDataOrigins(DURATION_TOTAL))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+
+    @Test
+    public void multiApp_higherPriorityVigorousRecord_multiplierIsOneForBothTypes()
+            throws Exception {
+        ActivityIntensityRecord higherPriorityVigorousRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusHours(1).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        ActivityIntensityRecord lowerPriorityModerateRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.minusMinutes(5).toInstant(),
+                        YESTERDAY_11AM.plusHours(1).plusMinutes(17).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+        insertRecord(higherPriorityVigorousRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityModerateRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(DURATION_TOTAL))
+                .isEqualTo(getRecordDuration(lowerPriorityModerateRecord));
+        assertThat(response.getDataOrigins(DURATION_TOTAL))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+
+    @Test
+    public void overlappingRecords_equalsToModeratePlusVigorous() throws Exception {
+        var higherPriorityRecords =
+                List.of(
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(10).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(20).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(20).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(30).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(40).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(50).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE));
+
+        var lowerPriorityRecords =
+                List.of(
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(9).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(19).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(17).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(32).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(41).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(55).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS));
+
+        insertRecords(higherPriorityRecords);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityRecords);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(DURATION_TOTAL)
+                                .addAggregationType(MODERATE_DURATION_TOTAL)
+                                .addAggregationType(VIGOROUS_DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(MODERATE_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(VIGOROUS_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(DURATION_TOTAL))
+                .isEqualTo(
+                        response.get(MODERATE_DURATION_TOTAL)
+                                .plus(response.get(VIGOROUS_DURATION_TOTAL)));
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityMinutesAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityMinutesAggregationTest.java
new file mode 100644
index 0000000..8006f8a
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityMinutesAggregationTest.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.aggregation;
+
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
+import static android.health.connect.datatypes.ActivityIntensityRecord.INTENSITY_MINUTES_TOTAL;
+import static android.health.connect.datatypes.ActivityIntensityRecord.MODERATE_DURATION_TOTAL;
+import static android.health.connect.datatypes.ActivityIntensityRecord.VIGOROUS_DURATION_TOTAL;
+import static android.healthconnect.cts.lib.RecordFactory.YESTERDAY_11AM;
+import static android.healthconnect.cts.utils.TestUtils.getAggregateResponse;
+import static android.healthconnect.cts.utils.TestUtils.insertRecord;
+import static android.healthconnect.cts.utils.TestUtils.insertRecords;
+import static android.healthconnect.cts.utils.TestUtils.setupAggregation;
+
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY_DB;
+import static com.android.healthfitness.flags.Flags.FLAG_HEALTH_CONNECT_MAPPINGS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static java.time.Duration.ofMinutes;
+
+import android.health.connect.AggregateRecordsRequest;
+import android.health.connect.AggregateRecordsResponse;
+import android.health.connect.HealthDataCategory;
+import android.health.connect.TimeInstantRangeFilter;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.DataOrigin;
+import android.healthconnect.cts.lib.ActivityIntensityRecordFactory;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+
+import androidx.annotation.Nullable;
+
+import com.android.compatibility.common.util.ApiTest;
+
+import org.junit.Test;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.util.List;
+
+@RequiresFlagsEnabled({
+    FLAG_ACTIVITY_INTENSITY,
+    FLAG_ACTIVITY_INTENSITY_DB,
+    FLAG_HEALTH_CONNECT_MAPPINGS
+})
+@ApiTest(apis = {"android.health.connect.datatypes.ActivityIntensityRecord#MINUTES_TOTAL"})
+public class ActivityIntensityMinutesAggregationTest
+        extends BaseDurationAggregationTest<ActivityIntensityRecord, Long> {
+
+    private final ActivityIntensityRecordFactory mRecordFactory =
+            new ActivityIntensityRecordFactory();
+
+    public ActivityIntensityMinutesAggregationTest() {
+        super(INTENSITY_MINUTES_TOTAL, HealthDataCategory.ACTIVITY);
+    }
+
+    @Override
+    ActivityIntensityRecord createRecord(
+            Instant startTime,
+            Instant endTime,
+            @Nullable ZoneOffset startZoneOffset,
+            @Nullable ZoneOffset endZoneOffset) {
+        return mRecordFactory.newRecord(
+                startTime,
+                endTime,
+                ACTIVITY_INTENSITY_TYPE_MODERATE,
+                startZoneOffset,
+                endZoneOffset);
+    }
+
+    @Override
+    Long getExpectedValueFromDuration(Duration duration) {
+        return duration.toMinutes();
+    }
+
+    @Test
+    public void moderateRecord_multiplierIsOne_roundsToMinutes() throws Exception {
+        ActivityIntensityRecord record =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusMinutes(17).plusSeconds(32).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+
+        insertRecords(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Long> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Long>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(INTENSITY_MINUTES_TOTAL)
+                                .build());
+
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL)).isNotNull();
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL))
+                .isEqualTo(getRecordDuration(record).toMinutes());
+    }
+
+    @Test
+    public void vigorousRecord_multiplierIsTwo_roundsToMinutes() throws Exception {
+        ActivityIntensityRecord record =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusMinutes(13).plusSeconds(32).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+
+        insertRecords(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Long> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Long>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(INTENSITY_MINUTES_TOTAL)
+                                .build());
+
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL)).isNotNull();
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL))
+                .isEqualTo(getRecordDuration(record).multipliedBy(2).toMinutes());
+    }
+
+    @Test
+    public void multipleRecords_returnsTotalWeightedDuration_inMinutes() throws Exception {
+        var records =
+                List.of(
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.toInstant(),
+                                YESTERDAY_11AM.plusMinutes(7).plusSeconds(20).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(10).plusSeconds(30).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(13).plusSeconds(40).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(20).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(20).plusSeconds(11).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(25).plusSeconds(30).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(25).plusSeconds(35).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS));
+
+        insertRecords(records);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Long> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Long>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(INTENSITY_MINUTES_TOTAL)
+                                .build());
+
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL)).isNotNull();
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL))
+                .isEqualTo(
+                        getRecordDuration(records.get(1))
+                                .plus(getRecordDuration(records.get(3)))
+                                .multipliedBy(2)
+                                .plus(getRecordDuration(records.get(0)))
+                                .plus(getRecordDuration(records.get(2)))
+                                .toMinutes());
+    }
+
+    @Test
+    public void multiApp_masksOutLowerPriorityVigorousRecord() throws Exception {
+        ActivityIntensityRecord higherPriorityModerateRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusHours(1).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+        ActivityIntensityRecord lowerPriorityVigorousRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.minusMinutes(5).toInstant(),
+                        YESTERDAY_11AM.plusHours(1).plusMinutes(17).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        insertRecord(higherPriorityModerateRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityVigorousRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Long> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Long>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(INTENSITY_MINUTES_TOTAL)
+                                .build());
+
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL)).isNotNull();
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL))
+                .isEqualTo(
+                        ofMinutes(5)
+                                .plusMinutes(17)
+                                .multipliedBy(2)
+                                .plus(getRecordDuration(higherPriorityModerateRecord))
+                                .toMinutes());
+        assertThat(response.getDataOrigins(INTENSITY_MINUTES_TOTAL))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+
+    @Test
+    public void multiApp_masksOutLowerPriorityModerateRecord() throws Exception {
+        ActivityIntensityRecord higherPriorityVigorousRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusHours(1).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        ActivityIntensityRecord lowerPriorityModerateRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.minusMinutes(5).toInstant(),
+                        YESTERDAY_11AM.plusHours(1).plusMinutes(17).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+        insertRecord(higherPriorityVigorousRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityModerateRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Long> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Long>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(INTENSITY_MINUTES_TOTAL)
+                                .build());
+
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL)).isNotNull();
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL))
+                .isEqualTo(
+                        getRecordDuration(higherPriorityVigorousRecord)
+                                .multipliedBy(2)
+                                .plusMinutes(5)
+                                .plusMinutes(17)
+                                .toMinutes());
+        assertThat(response.getDataOrigins(INTENSITY_MINUTES_TOTAL))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+
+    @Test
+    public void overlappingRecords_equalsToModeratePlusDoubleVigorous() throws Exception {
+        var higherPriorityRecords =
+                List.of(
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(10).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(20).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(20).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(30).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(40).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(50).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE));
+
+        var lowerPriorityRecords =
+                List.of(
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(9).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(16).plusSeconds(45).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(17).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(32).plusSeconds(52).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusMinutes(41).toInstant(),
+                                YESTERDAY_11AM.plusMinutes(55).plusSeconds(49).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS));
+
+        insertRecords(higherPriorityRecords);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityRecords);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> durationsResponse =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(MODERATE_DURATION_TOTAL)
+                                .addAggregationType(VIGOROUS_DURATION_TOTAL)
+                                .build());
+        AggregateRecordsResponse<Long> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Long>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(INTENSITY_MINUTES_TOTAL)
+                                .build());
+
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL)).isNotNull();
+        assertThat(durationsResponse.get(MODERATE_DURATION_TOTAL)).isNotNull();
+        assertThat(durationsResponse.get(VIGOROUS_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(INTENSITY_MINUTES_TOTAL))
+                .isEqualTo(
+                        durationsResponse
+                                .get(VIGOROUS_DURATION_TOTAL)
+                                .multipliedBy(2)
+                                .plus(durationsResponse.get(MODERATE_DURATION_TOTAL))
+                                .toMinutes());
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityModerateDurationAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityModerateDurationAggregationTest.java
new file mode 100644
index 0000000..13a184a
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityModerateDurationAggregationTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.aggregation;
+
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
+import static android.health.connect.datatypes.ActivityIntensityRecord.MODERATE_DURATION_TOTAL;
+import static android.healthconnect.cts.lib.RecordFactory.YESTERDAY_11AM;
+import static android.healthconnect.cts.utils.TestUtils.getAggregateResponse;
+import static android.healthconnect.cts.utils.TestUtils.insertRecord;
+import static android.healthconnect.cts.utils.TestUtils.insertRecords;
+import static android.healthconnect.cts.utils.TestUtils.setupAggregation;
+
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY_DB;
+import static com.android.healthfitness.flags.Flags.FLAG_HEALTH_CONNECT_MAPPINGS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static java.time.Duration.ofMinutes;
+
+import android.health.connect.AggregateRecordsRequest;
+import android.health.connect.AggregateRecordsResponse;
+import android.health.connect.HealthDataCategory;
+import android.health.connect.TimeInstantRangeFilter;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.DataOrigin;
+import android.healthconnect.cts.lib.ActivityIntensityRecordFactory;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+
+import androidx.annotation.Nullable;
+
+import com.android.compatibility.common.util.ApiTest;
+
+import org.junit.Test;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.util.List;
+
+@RequiresFlagsEnabled({
+    FLAG_ACTIVITY_INTENSITY,
+    FLAG_ACTIVITY_INTENSITY_DB,
+    FLAG_HEALTH_CONNECT_MAPPINGS
+})
+@ApiTest(
+        apis = {"android.health.connect.datatypes.ActivityIntensityRecord#MODERATE_DURATION_TOTAL"})
+public class ActivityIntensityModerateDurationAggregationTest
+        extends BaseDurationAggregationTest<ActivityIntensityRecord, Duration> {
+
+    private final ActivityIntensityRecordFactory mRecordFactory =
+            new ActivityIntensityRecordFactory();
+
+    public ActivityIntensityModerateDurationAggregationTest() {
+        super(MODERATE_DURATION_TOTAL, HealthDataCategory.ACTIVITY);
+    }
+
+    @Override
+    Duration getExpectedValueFromDuration(Duration duration) {
+        return duration;
+    }
+
+    @Override
+    ActivityIntensityRecord createRecord(
+            Instant startTime,
+            Instant endTime,
+            @Nullable ZoneOffset startZoneOffset,
+            @Nullable ZoneOffset endZoneOffset) {
+        return mRecordFactory.newRecord(
+                startTime,
+                endTime,
+                ACTIVITY_INTENSITY_TYPE_MODERATE,
+                startZoneOffset,
+                endZoneOffset);
+    }
+
+    @Test
+    public void ignoresNonModerateRecords() throws Exception {
+        List<ActivityIntensityRecord> records =
+                List.of(
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.minusHours(1).toInstant(),
+                                YESTERDAY_11AM.minusHours(1).plusMinutes(23).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.toInstant(),
+                                YESTERDAY_11AM.plusMinutes(37).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusHours(1).toInstant(),
+                                YESTERDAY_11AM.plusHours(1).plusMinutes(42).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS));
+        insertRecords(records);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(MODERATE_DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(MODERATE_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(MODERATE_DURATION_TOTAL))
+                .isEqualTo(getRecordDuration(records.get(1)));
+    }
+
+    @Test
+    public void multiApp_higherPriorityNonModerateRecord_masksOutLowerPriorityModerateRecord()
+            throws Exception {
+        ActivityIntensityRecord higherPriorityNonModerateRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusHours(1).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        ActivityIntensityRecord lowerPriorityModerateRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.minusMinutes(17).toInstant(),
+                        YESTERDAY_11AM.plusHours(1).plusMinutes(24).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+        insertRecord(higherPriorityNonModerateRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecord(lowerPriorityModerateRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(MODERATE_DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(MODERATE_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(MODERATE_DURATION_TOTAL)).isEqualTo(ofMinutes(17).plusMinutes(24));
+        assertThat(response.getDataOrigins(MODERATE_DURATION_TOTAL))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+
+    @Test
+    public void multiApp_ignoresLowerPriorityNonModerateRecord() throws Exception {
+        ActivityIntensityRecord higherPriorityModerateRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusHours(1).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+        ActivityIntensityRecord lowerPriorityNonModerateRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.minusHours(1).toInstant(),
+                        YESTERDAY_11AM.plusHours(2).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        insertRecord(higherPriorityModerateRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityNonModerateRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(MODERATE_DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(MODERATE_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(MODERATE_DURATION_TOTAL))
+                .isEqualTo(getRecordDuration(higherPriorityModerateRecord));
+        assertThat(response.getDataOrigins(MODERATE_DURATION_TOTAL))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityVigorousDurationAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityVigorousDurationAggregationTest.java
new file mode 100644
index 0000000..26dd3d3
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/ActivityIntensityVigorousDurationAggregationTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.aggregation;
+
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
+import static android.health.connect.datatypes.ActivityIntensityRecord.VIGOROUS_DURATION_TOTAL;
+import static android.healthconnect.cts.lib.RecordFactory.YESTERDAY_11AM;
+import static android.healthconnect.cts.utils.TestUtils.getAggregateResponse;
+import static android.healthconnect.cts.utils.TestUtils.insertRecord;
+import static android.healthconnect.cts.utils.TestUtils.insertRecords;
+import static android.healthconnect.cts.utils.TestUtils.setupAggregation;
+
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY_DB;
+import static com.android.healthfitness.flags.Flags.FLAG_HEALTH_CONNECT_MAPPINGS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static java.time.Duration.ofMinutes;
+
+import android.health.connect.AggregateRecordsRequest;
+import android.health.connect.AggregateRecordsResponse;
+import android.health.connect.HealthDataCategory;
+import android.health.connect.TimeInstantRangeFilter;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.DataOrigin;
+import android.healthconnect.cts.lib.ActivityIntensityRecordFactory;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+
+import androidx.annotation.Nullable;
+
+import com.android.compatibility.common.util.ApiTest;
+
+import org.junit.Test;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.util.List;
+
+@RequiresFlagsEnabled({
+    FLAG_ACTIVITY_INTENSITY,
+    FLAG_ACTIVITY_INTENSITY_DB,
+    FLAG_HEALTH_CONNECT_MAPPINGS
+})
+@ApiTest(
+        apis = {"android.health.connect.datatypes.ActivityIntensityRecord#VIGOROUS_DURATION_TOTAL"})
+public class ActivityIntensityVigorousDurationAggregationTest
+        extends BaseDurationAggregationTest<ActivityIntensityRecord, Duration> {
+
+    private final ActivityIntensityRecordFactory mRecordFactory =
+            new ActivityIntensityRecordFactory();
+
+    public ActivityIntensityVigorousDurationAggregationTest() {
+        super(VIGOROUS_DURATION_TOTAL, HealthDataCategory.ACTIVITY);
+    }
+
+    @Override
+    Duration getExpectedValueFromDuration(Duration duration) {
+        return duration;
+    }
+
+    @Override
+    ActivityIntensityRecord createRecord(
+            Instant startTime,
+            Instant endTime,
+            @Nullable ZoneOffset startZoneOffset,
+            @Nullable ZoneOffset endZoneOffset) {
+        return mRecordFactory.newRecord(
+                startTime,
+                endTime,
+                ACTIVITY_INTENSITY_TYPE_VIGOROUS,
+                startZoneOffset,
+                endZoneOffset);
+    }
+
+    @Test
+    public void ignoresNonVigorousRecords() throws Exception {
+        List<ActivityIntensityRecord> records =
+                List.of(
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.minusHours(1).toInstant(),
+                                YESTERDAY_11AM.minusHours(1).plusMinutes(23).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.toInstant(),
+                                YESTERDAY_11AM.plusMinutes(37).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_VIGOROUS),
+                        mRecordFactory.newRecord(
+                                YESTERDAY_11AM.plusHours(1).toInstant(),
+                                YESTERDAY_11AM.plusHours(1).plusMinutes(42).toInstant(),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE));
+        insertRecords(records);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(VIGOROUS_DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(VIGOROUS_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(VIGOROUS_DURATION_TOTAL))
+                .isEqualTo(getRecordDuration(records.get(1)));
+    }
+
+    @Test
+    public void multiApp_higherPriorityNonVigorousRecord_masksOutLowerPriorityVigorousRecord()
+            throws Exception {
+        ActivityIntensityRecord higherPriorityNonVigorousRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusHours(1).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+        ActivityIntensityRecord lowerPriorityVigorousRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.minusMinutes(17).toInstant(),
+                        YESTERDAY_11AM.plusHours(1).plusMinutes(24).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        insertRecord(higherPriorityNonVigorousRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecord(lowerPriorityVigorousRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(VIGOROUS_DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(VIGOROUS_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(VIGOROUS_DURATION_TOTAL)).isEqualTo(ofMinutes(17).plusMinutes(24));
+        assertThat(response.getDataOrigins(VIGOROUS_DURATION_TOTAL))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+
+    @Test
+    public void multiApp_ignoresLowerPriorityNonVigorousRecord() throws Exception {
+        ActivityIntensityRecord higherPriorityVigorousRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusHours(1).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        ActivityIntensityRecord lowerPriorityNonVigorousRecord =
+                mRecordFactory.newRecord(
+                        YESTERDAY_11AM.minusHours(1).toInstant(),
+                        YESTERDAY_11AM.plusHours(2).toInstant(),
+                        ACTIVITY_INTENSITY_TYPE_MODERATE);
+        insertRecord(higherPriorityVigorousRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityNonVigorousRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                HealthDataCategory.ACTIVITY);
+
+        AggregateRecordsResponse<Duration> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<Duration>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(VIGOROUS_DURATION_TOTAL)
+                                .build());
+
+        assertThat(response.get(VIGOROUS_DURATION_TOTAL)).isNotNull();
+        assertThat(response.get(VIGOROUS_DURATION_TOTAL))
+                .isEqualTo(getRecordDuration(higherPriorityVigorousRecord));
+        assertThat(response.getDataOrigins(VIGOROUS_DURATION_TOTAL))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/AggregateOtherAppsDataTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/AggregateOtherAppsDataTest.java
index bc5adae..104c01e 100644
--- a/tests/cts/src/android/healthconnect/cts/aggregation/AggregateOtherAppsDataTest.java
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/AggregateOtherAppsDataTest.java
@@ -61,7 +61,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/AggregateWithFiltersTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/AggregateWithFiltersTest.java
index 5dde7a2..9c39025 100644
--- a/tests/cts/src/android/healthconnect/cts/aggregation/AggregateWithFiltersTest.java
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/AggregateWithFiltersTest.java
@@ -87,7 +87,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/AggregationApisTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/AggregationApisTest.java
index c114460..ca98087 100644
--- a/tests/cts/src/android/healthconnect/cts/aggregation/AggregationApisTest.java
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/AggregationApisTest.java
@@ -93,7 +93,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/BasalCaloriesAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/BasalCaloriesAggregationTest.java
index 9c7b597..9152c8d 100644
--- a/tests/cts/src/android/healthconnect/cts/aggregation/BasalCaloriesAggregationTest.java
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/BasalCaloriesAggregationTest.java
@@ -63,7 +63,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/BaseDurationAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/BaseDurationAggregationTest.java
new file mode 100644
index 0000000..696b86c
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/BaseDurationAggregationTest.java
@@ -0,0 +1,756 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.aggregation;
+
+import static android.healthconnect.cts.lib.RecordFactory.MIDNIGHT_ONE_WEEK_AGO;
+import static android.healthconnect.cts.lib.RecordFactory.YESTERDAY_10AM_LOCAL;
+import static android.healthconnect.cts.lib.RecordFactory.YESTERDAY_11AM;
+import static android.healthconnect.cts.utils.TestUtils.getAggregateResponse;
+import static android.healthconnect.cts.utils.TestUtils.getAggregateResponseGroupByDuration;
+import static android.healthconnect.cts.utils.TestUtils.insertRecord;
+import static android.healthconnect.cts.utils.TestUtils.insertRecords;
+import static android.healthconnect.cts.utils.TestUtils.setupAggregation;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static java.time.Duration.ofHours;
+import static java.time.Duration.ofMinutes;
+
+import android.health.connect.AggregateRecordsGroupedByDurationResponse;
+import android.health.connect.AggregateRecordsGroupedByPeriodResponse;
+import android.health.connect.AggregateRecordsRequest;
+import android.health.connect.AggregateRecordsResponse;
+import android.health.connect.LocalTimeRangeFilter;
+import android.health.connect.TimeInstantRangeFilter;
+import android.health.connect.datatypes.AggregationType;
+import android.health.connect.datatypes.DataOrigin;
+import android.health.connect.datatypes.IntervalRecord;
+import android.healthconnect.cts.lib.TestAppProxy;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.annotation.Nullable;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.compatibility.common.util.ApiTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.Period;
+import java.time.ZoneOffset;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+
+@ApiTest(
+        apis = {
+            "android.health.connect.HealthConnectManager#aggregate",
+            "android.health.connect.HealthConnectManager#aggregateGroupByDuration",
+            "android.health.connect.HealthConnectManager#aggregateGroupByPeriod"
+        })
+abstract class BaseDurationAggregationTest<RecordType extends IntervalRecord, ResultType> {
+    static final String TEST_PACKAGE_NAME = getTestPackageName();
+
+    static final TestAppProxy APP_WITH_WRITE_PERMS_ONLY =
+            TestAppProxy.forPackageName("android.healthconnect.cts.testapp.writePermsOnly");
+
+    private final AggregationType<ResultType> mAggregationType;
+    private final int mHealthDataCategory;
+
+    BaseDurationAggregationTest(
+            AggregationType<ResultType> aggregationType, int healthDataCategory) {
+        mAggregationType = aggregationType;
+        mHealthDataCategory = healthDataCategory;
+    }
+
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    abstract ResultType getExpectedValueFromDuration(Duration duration);
+
+    abstract RecordType createRecord(
+            Instant startTime,
+            Instant endTime,
+            @Nullable ZoneOffset startZoneOffset,
+            @Nullable ZoneOffset endZoneOffset);
+
+    final RecordType createRecord(Instant startTime, Instant endTime) {
+        return createRecord(startTime, endTime, null, null);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        TestUtils.deleteAllStagedRemoteData();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        TestUtils.deleteAllStagedRemoteData();
+    }
+
+    @Test
+    public void noData_largeWindow_returnsNull() throws Exception {
+        setupAggregation(TEST_PACKAGE_NAME, mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNull();
+        assertThat(response.getZoneOffset(mAggregationType)).isNull();
+        assertThat(response.getDataOrigins(mAggregationType)).isEmpty();
+    }
+
+    @Test
+    public void oneRecord_largeWindow_returnsRecordDuration() throws Exception {
+        Instant startTime = YESTERDAY_11AM.toInstant();
+        Instant endTime = YESTERDAY_11AM.plusMinutes(30).toInstant();
+        RecordType record = createRecord(startTime, endTime);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNotNull();
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(getRecordDuration(record)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(record.getStartZoneOffset());
+        assertThat(response.getDataOrigins(mAggregationType))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build());
+    }
+
+    @Test
+    public void oneRecord_startsBeforeWindowStart_endsOnWindowEnd_returnsOverlapDuration()
+            throws Exception {
+        Instant startTime = YESTERDAY_11AM.toInstant();
+        Instant endTime = YESTERDAY_11AM.plusMinutes(30).toInstant();
+        RecordType record = createRecord(startTime, endTime);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(
+                                                        record.getStartTime().plus(ofMinutes(5)))
+                                                .setEndTime(record.getEndTime())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNotNull();
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(25)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(record.getStartZoneOffset());
+    }
+
+    @Test
+    public void oneRecord_startsOnWindowStart_endsAfterWindowEnd_returnsOverlapDuration()
+            throws Exception {
+        Instant startTime = YESTERDAY_11AM.toInstant();
+        Instant endTime = YESTERDAY_11AM.plusMinutes(30).toInstant();
+        RecordType record = createRecord(startTime, endTime);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(record.getStartTime())
+                                                .setEndTime(record.getEndTime().minus(ofMinutes(3)))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNotNull();
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(27)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(record.getStartZoneOffset());
+    }
+
+    @Test
+    public void oneRecord_startsBeforeWindowStart_endsAfterWindowEnd_returnsOverlapDuration()
+            throws Exception {
+
+        Instant startTime = YESTERDAY_11AM.toInstant();
+        Instant endTime = YESTERDAY_11AM.plusMinutes(30).toInstant();
+        RecordType record = createRecord(startTime, endTime);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(
+                                                        record.getStartTime().plus(ofMinutes(6)))
+                                                .setEndTime(record.getEndTime().minus(ofMinutes(3)))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNotNull();
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(21)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(record.getStartZoneOffset());
+    }
+
+    @Test
+    public void oneRecord_startsOnWindowEnd_returnsNull() throws Exception {
+        Instant startTime = YESTERDAY_11AM.toInstant();
+        Instant endTime = YESTERDAY_11AM.plusMinutes(30).toInstant();
+        RecordType record = createRecord(startTime, endTime);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(record.getStartTime())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNull();
+    }
+
+    @Test
+    public void oneRecord_endsOnWindowStart_returnsNull() throws Exception {
+        Instant startTime = YESTERDAY_11AM.toInstant();
+        Instant endTime = YESTERDAY_11AM.plusMinutes(30).toInstant();
+        RecordType record = createRecord(startTime, endTime);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(record.getEndTime())
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNull();
+    }
+
+    @Test
+    public void aggregate_multipleOverlappingRecords_takesOverlapsIntoAccount() throws Exception {
+        Instant startTime = YESTERDAY_11AM.plusHours(1).plusMinutes(10).toInstant();
+        Instant endTime = YESTERDAY_11AM.plusHours(1).plusMinutes(35).toInstant();
+        Instant startTime1 = YESTERDAY_11AM.plusMinutes(40).toInstant();
+        Instant endTime1 = YESTERDAY_11AM.plusMinutes(50).toInstant();
+        Instant startTime2 = YESTERDAY_11AM.plusMinutes(30).toInstant();
+        Instant endTime2 = YESTERDAY_11AM.plusHours(1).plusMinutes(20).toInstant();
+        Instant startTime3 = YESTERDAY_11AM.toInstant();
+        Instant endTime3 = YESTERDAY_11AM.plusHours(1).toInstant();
+        List<RecordType> records =
+                List.of(
+                        createRecord(startTime3, endTime3),
+                        createRecord(startTime2, endTime2),
+                        createRecord(startTime1, endTime1),
+                        createRecord(startTime, endTime));
+        insertRecords(records);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(records.get(3).getEndTime())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(
+                        getExpectedValueFromDuration(
+                                Duration.between(
+                                        records.get(0).getStartTime(),
+                                        records.get(3).getEndTime())));
+    }
+
+    @Test
+    public void aggregate_multipleNotOverlappingRecords_returnsSumOfDurations() throws Exception {
+        Instant startTime = YESTERDAY_11AM.plusMinutes(40).toInstant();
+        Instant endTime = YESTERDAY_11AM.plusMinutes(51).toInstant();
+        Instant startTime1 = YESTERDAY_11AM.plusMinutes(20).toInstant();
+        Instant endTime1 = YESTERDAY_11AM.plusMinutes(34).toInstant();
+        Instant startTime2 = YESTERDAY_11AM.toInstant();
+        Instant endTime2 = YESTERDAY_11AM.plusMinutes(17).toInstant();
+        List<RecordType> records =
+                List.of(
+                        createRecord(startTime2, endTime2),
+                        createRecord(startTime1, endTime1),
+                        createRecord(startTime, endTime));
+        insertRecords(records);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(records.get(2).getEndTime())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(
+                        getExpectedValueFromDuration(
+                                getRecordDuration(records.get(0))
+                                        .plus(getRecordDuration(records.get(1)))
+                                        .plus(getRecordDuration(records.get(2)))));
+    }
+
+    @Test
+    public void aggregate_localTimeFilter_recordsEqualsToWindow_returnsDuration() throws Exception {
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(1);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(1);
+        RecordType record =
+                createRecord(
+                        YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
+                        YESTERDAY_10AM_LOCAL.plusMinutes(23).toInstant(endZoneOffset),
+                        startZoneOffset,
+                        endZoneOffset);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_10AM_LOCAL)
+                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusHours(1))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(23)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(startZoneOffset);
+    }
+
+    @Test
+    public void aggregate_localTimeFilter_minMaxZoneOffsets() throws Exception {
+        ZoneOffset startZoneOffset = ZoneOffset.MAX;
+        ZoneOffset endZoneOffset = ZoneOffset.MIN;
+        RecordType record =
+                createRecord(
+                        YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
+                        YESTERDAY_10AM_LOCAL.plusMinutes(37).toInstant(endZoneOffset),
+                        startZoneOffset,
+                        endZoneOffset);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_10AM_LOCAL)
+                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusHours(1))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(37)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(startZoneOffset);
+    }
+
+    @Test
+    public void aggregate_localTimeFilter_startOffsetGreaterThanEndOffset() throws Exception {
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(4);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(2);
+        RecordType record =
+                createRecord(
+                        YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
+                        YESTERDAY_10AM_LOCAL.plusMinutes(37).toInstant(endZoneOffset),
+                        startZoneOffset,
+                        endZoneOffset);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_10AM_LOCAL)
+                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusHours(1))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(37)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(startZoneOffset);
+    }
+
+    @Test
+    public void aggregate_localTimeFilter_startOffsetLessThanEndOffset() throws Exception {
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(-2);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-1);
+        RecordType record =
+                createRecord(
+                        YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
+                        YESTERDAY_10AM_LOCAL.plusHours(2).plusMinutes(37).toInstant(endZoneOffset),
+                        startZoneOffset,
+                        endZoneOffset);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_10AM_LOCAL.minusDays(1))
+                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusDays(1))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofHours(2).plus(ofMinutes(37))));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(startZoneOffset);
+    }
+
+    @Test
+    public void aggregate_localTimeFilter_recordEndsBeforeWindow_returnsNull() throws Exception {
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(4);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(2);
+        RecordType record =
+                createRecord(
+                        YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
+                        YESTERDAY_10AM_LOCAL.plusHours(1).toInstant(endZoneOffset),
+                        startZoneOffset,
+                        endZoneOffset);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_10AM_LOCAL.plusHours(1))
+                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusDays(10))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNull();
+        assertThat(response.getZoneOffset(mAggregationType)).isNull();
+    }
+
+    @Test
+    public void aggregate_localTimeFilter_recordStartsAfterWindow_returnsNull() throws Exception {
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(4);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(2);
+        RecordType record =
+                createRecord(
+                        YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
+                        YESTERDAY_10AM_LOCAL.plusHours(1).toInstant(endZoneOffset),
+                        startZoneOffset,
+                        endZoneOffset);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_10AM_LOCAL.minusDays(10))
+                                                .setEndTime(YESTERDAY_10AM_LOCAL)
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNull();
+        assertThat(response.getZoneOffset(mAggregationType)).isNull();
+    }
+
+    @Test
+    public void aggregate_localTimeFilter_recordOverlapsWindow_returnsOverlapDuration()
+            throws Exception {
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(4);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(2);
+        RecordType record =
+                createRecord(
+                        YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
+                        YESTERDAY_10AM_LOCAL.plusHours(1).toInstant(endZoneOffset),
+                        startZoneOffset,
+                        endZoneOffset);
+        insertRecord(record);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_10AM_LOCAL.plusMinutes(47))
+                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusHours(5))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(13)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(startZoneOffset);
+    }
+
+    @Test
+    public void aggregate_localTimeFilter_overlappingRecordsWithDifferentOffsets()
+            throws Exception {
+        List<RecordType> records =
+                List.of(
+                        createRecord(
+                                YESTERDAY_10AM_LOCAL.toInstant(ZoneOffset.ofHours(2)),
+                                YESTERDAY_10AM_LOCAL
+                                        .plusMinutes(52)
+                                        .toInstant(ZoneOffset.ofHours(1)),
+                                ZoneOffset.ofHours(2),
+                                ZoneOffset.ofHours(1)),
+                        createRecord(
+                                YESTERDAY_10AM_LOCAL
+                                        .plusMinutes(35)
+                                        .toInstant(ZoneOffset.ofHours(4)),
+                                YESTERDAY_10AM_LOCAL.plusHours(1).toInstant(ZoneOffset.ofHours(3)),
+                                ZoneOffset.ofHours(4),
+                                ZoneOffset.ofHours(3)));
+
+        insertRecords(records);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_10AM_LOCAL.minusDays(1))
+                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusDays(1))
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofHours(1)));
+        assertThat(response.getZoneOffset(mAggregationType)).isEqualTo(ZoneOffset.ofHours(2));
+    }
+
+    @Test
+    public void aggregateGroupByDuration_multipleOverlappingRecords() throws Exception {
+        Instant startTime = YESTERDAY_11AM.plusHours(1).plusMinutes(10).toInstant();
+        Instant endTime = YESTERDAY_11AM.plusHours(1).plusMinutes(35).toInstant();
+        Instant startTime1 = YESTERDAY_11AM.plusMinutes(40).toInstant();
+        Instant endTime1 = YESTERDAY_11AM.plusMinutes(50).toInstant();
+        Instant startTime2 = YESTERDAY_11AM.plusMinutes(30).toInstant();
+        Instant endTime2 = YESTERDAY_11AM.plusHours(1).plusMinutes(20).toInstant();
+        Instant startTime3 = YESTERDAY_11AM.toInstant();
+        Instant endTime3 = YESTERDAY_11AM.plusHours(1).toInstant();
+        List<RecordType> records =
+                List.of(
+                        createRecord(startTime3, endTime3),
+                        createRecord(startTime2, endTime2),
+                        createRecord(startTime1, endTime1),
+                        createRecord(startTime, endTime));
+        insertRecords(records);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        List<AggregateRecordsGroupedByDurationResponse<ResultType>> responses =
+                getAggregateResponseGroupByDuration(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(
+                                                        YESTERDAY_11AM.minusMinutes(30).toInstant())
+                                                .setEndTime(YESTERDAY_11AM.plusHours(2).toInstant())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build(),
+                        Duration.of(30, ChronoUnit.MINUTES));
+
+        assertThat(responses).hasSize(5);
+        assertThat(responses.get(0).get(mAggregationType)).isNull();
+        assertThat(responses.get(1).get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(30)));
+        assertThat(responses.get(2).get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(30)));
+        assertThat(responses.get(3).get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(30)));
+        assertThat(responses.get(4).get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(ofMinutes(5)));
+    }
+
+    @Test
+    public void aggregateGroupByPeriod_returnsResponsePerGroup() throws Exception {
+        Instant startTime = MIDNIGHT_ONE_WEEK_AGO.plusDays(6).minusMinutes(40).toInstant();
+        Instant endTime = MIDNIGHT_ONE_WEEK_AGO.plusDays(6).plusMinutes(35).toInstant();
+        Instant startTime1 =
+                MIDNIGHT_ONE_WEEK_AGO.plusDays(4).plusHours(10).plusMinutes(30).toInstant();
+        Instant endTime1 =
+                MIDNIGHT_ONE_WEEK_AGO.plusDays(4).plusHours(11).plusMinutes(13).toInstant();
+        Instant startTime2 = MIDNIGHT_ONE_WEEK_AGO.plusDays(4).plusHours(10).toInstant();
+        Instant endTime2 = MIDNIGHT_ONE_WEEK_AGO.plusDays(4).plusHours(11).toInstant();
+        Instant startTime3 = MIDNIGHT_ONE_WEEK_AGO.plusDays(3).plusHours(10).toInstant();
+        Instant endTime3 = MIDNIGHT_ONE_WEEK_AGO.plusDays(3).plusHours(13).toInstant();
+        Instant startTime4 = MIDNIGHT_ONE_WEEK_AGO.plusDays(3).plusHours(11).toInstant();
+        Instant endTime4 =
+                MIDNIGHT_ONE_WEEK_AGO.plusDays(3).plusHours(11).plusMinutes(55).toInstant();
+        Instant startTime5 = MIDNIGHT_ONE_WEEK_AGO.plusDays(1).plusHours(16).toInstant();
+        Instant endTime5 =
+                MIDNIGHT_ONE_WEEK_AGO.plusDays(1).plusHours(16).plusMinutes(32).toInstant();
+        Instant startTime6 = MIDNIGHT_ONE_WEEK_AGO.plusDays(1).plusHours(10).toInstant();
+        Instant endTime6 = MIDNIGHT_ONE_WEEK_AGO.plusDays(1).plusHours(11).toInstant();
+        Instant startTime7 = MIDNIGHT_ONE_WEEK_AGO.plusHours(10).toInstant();
+        Instant endTime7 = MIDNIGHT_ONE_WEEK_AGO.plusHours(11).toInstant();
+        List<RecordType> records =
+                List.of(
+                        createRecord(startTime7, endTime7),
+                        createRecord(startTime6, endTime6),
+                        createRecord(startTime5, endTime5),
+                        createRecord(startTime4, endTime4),
+                        createRecord(startTime3, endTime3),
+                        createRecord(startTime2, endTime2),
+                        createRecord(startTime1, endTime1),
+                        createRecord(startTime, endTime));
+        insertRecords(records);
+        setupAggregation(List.of(TEST_PACKAGE_NAME), mHealthDataCategory);
+
+        List<AggregateRecordsGroupedByPeriodResponse<ResultType>> responses =
+                TestUtils.getAggregateResponseGroupByPeriod(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new LocalTimeRangeFilter.Builder()
+                                                .setStartTime(
+                                                        MIDNIGHT_ONE_WEEK_AGO.toLocalDateTime())
+                                                .setEndTime(
+                                                        MIDNIGHT_ONE_WEEK_AGO
+                                                                .plusDays(7)
+                                                                .toLocalDateTime())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build(),
+                        Period.ofDays(1));
+
+        assertThat(responses).hasSize(7);
+        assertThat(responses.get(0).get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(getRecordDuration(records.get(0))));
+        assertThat(responses.get(1).get(mAggregationType))
+                .isEqualTo(
+                        getExpectedValueFromDuration(
+                                getRecordDuration(records.get(1))
+                                        .plus(getRecordDuration(records.get(2)))));
+        assertThat(responses.get(2).get(mAggregationType)).isNull();
+        assertThat(responses.get(3).get(mAggregationType))
+                .isEqualTo(getExpectedValueFromDuration(getRecordDuration(records.get(4))));
+        assertThat(responses.get(4).get(mAggregationType))
+                .isEqualTo(
+                        getExpectedValueFromDuration(
+                                Duration.between(
+                                        records.get(5).getStartTime(),
+                                        records.get(6).getEndTime())));
+        assertThat(responses.get(5).get(mAggregationType))
+                .isEqualTo(
+                        getExpectedValueFromDuration(
+                                Duration.between(
+                                        records.get(7).getStartTime(),
+                                        MIDNIGHT_ONE_WEEK_AGO.plusDays(6).toInstant())));
+        assertThat(responses.get(6).get(mAggregationType))
+                .isEqualTo(
+                        getExpectedValueFromDuration(
+                                Duration.between(
+                                        MIDNIGHT_ONE_WEEK_AGO.plusDays(6).toInstant(),
+                                        records.get(7).getEndTime())));
+    }
+
+    @Test
+    public void multiApp_overlappingRecords_takesOverlapsIntoAccount() throws Exception {
+        RecordType higherPriorityRecord =
+                createRecord(YESTERDAY_11AM.toInstant(), YESTERDAY_11AM.plusHours(1).toInstant());
+        RecordType lowerPriorityRecord =
+                createRecord(
+                        YESTERDAY_11AM.minusMinutes(17).toInstant(),
+                        YESTERDAY_11AM.plusMinutes(30).toInstant());
+        insertRecord(higherPriorityRecord);
+        APP_WITH_WRITE_PERMS_ONLY.insertRecords(lowerPriorityRecord);
+        setupAggregation(
+                List.of(TEST_PACKAGE_NAME, APP_WITH_WRITE_PERMS_ONLY.getPackageName()),
+                mHealthDataCategory);
+
+        AggregateRecordsResponse<ResultType> response =
+                getAggregateResponse(
+                        new AggregateRecordsRequest.Builder<ResultType>(
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(Instant.EPOCH)
+                                                .setEndTime(Instant.now())
+                                                .build())
+                                .addAggregationType(mAggregationType)
+                                .build());
+
+        assertThat(response.get(mAggregationType)).isNotNull();
+        assertThat(response.get(mAggregationType))
+                .isEqualTo(
+                        getExpectedValueFromDuration(
+                                Duration.between(
+                                        lowerPriorityRecord.getStartTime(),
+                                        higherPriorityRecord.getEndTime())));
+        assertThat(response.getDataOrigins(mAggregationType))
+                .containsExactly(
+                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build(),
+                        new DataOrigin.Builder()
+                                .setPackageName(APP_WITH_WRITE_PERMS_ONLY.getPackageName())
+                                .build());
+    }
+
+    static String getTestPackageName() {
+        return ApplicationProvider.getApplicationContext().getPackageName();
+    }
+
+    static Duration getRecordDuration(IntervalRecord record) {
+        return Duration.between(record.getStartTime(), record.getEndTime());
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/ExerciseDurationAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/ExerciseDurationAggregationTest.java
index 3069ecd..e572ec2 100644
--- a/tests/cts/src/android/healthconnect/cts/aggregation/ExerciseDurationAggregationTest.java
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/ExerciseDurationAggregationTest.java
@@ -79,7 +79,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/MindfulnessDurationAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/MindfulnessDurationAggregationTest.java
index b67e1b9..2b7a427 100644
--- a/tests/cts/src/android/healthconnect/cts/aggregation/MindfulnessDurationAggregationTest.java
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/MindfulnessDurationAggregationTest.java
@@ -19,776 +19,58 @@
 import static android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_DURATION_TOTAL;
 import static android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_MEDITATION;
 import static android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata;
-import static android.healthconnect.cts.utils.TestUtils.getAggregateResponse;
-import static android.healthconnect.cts.utils.TestUtils.getAggregateResponseGroupByDuration;
-import static android.healthconnect.cts.utils.TestUtils.insertRecord;
-import static android.healthconnect.cts.utils.TestUtils.insertRecords;
-import static android.healthconnect.cts.utils.TestUtils.setupAggregation;
 
-import static com.google.common.truth.Truth.assertThat;
-
-import android.health.connect.AggregateRecordsGroupedByDurationResponse;
-import android.health.connect.AggregateRecordsGroupedByPeriodResponse;
-import android.health.connect.AggregateRecordsRequest;
-import android.health.connect.AggregateRecordsResponse;
 import android.health.connect.HealthDataCategory;
-import android.health.connect.LocalTimeRangeFilter;
-import android.health.connect.TimeInstantRangeFilter;
-import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.MindfulnessSessionRecord;
-import android.healthconnect.cts.lib.MindfulnessSessionRecordFactory;
-import android.healthconnect.cts.utils.AssumptionCheckerRule;
-import android.healthconnect.cts.utils.TestUtils;
 import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 
-import androidx.test.core.app.ApplicationProvider;
+import androidx.annotation.Nullable;
 
+import com.android.compatibility.common.util.ApiTest;
 import com.android.healthfitness.flags.Flags;
 
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
 import java.time.Duration;
 import java.time.Instant;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.Period;
-import java.time.ZoneId;
 import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
-import java.time.temporal.ChronoUnit;
-import java.util.List;
 
 @RequiresFlagsEnabled(Flags.FLAG_MINDFULNESS)
-public class MindfulnessDurationAggregationTest {
+@ApiTest(
+        apis = {
+            "android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_DURATION_TOTAL"
+        })
+public class MindfulnessDurationAggregationTest
+        extends BaseDurationAggregationTest<MindfulnessSessionRecord, Long> {
 
-    private static final ZonedDateTime YESTERDAY_11AM =
-            LocalDate.now(ZoneId.systemDefault())
-                    .minusDays(1)
-                    .atTime(11, 0)
-                    .atZone(ZoneId.systemDefault());
-
-    private static final ZonedDateTime MIDNIGHT_ONE_WEEK_AGO =
-            YESTERDAY_11AM.truncatedTo(ChronoUnit.DAYS).minusDays(7);
-
-    private static final LocalDateTime YESTERDAY_10AM_LOCAL =
-            LocalDate.now(ZoneId.systemDefault()).minusDays(1).atTime(LocalTime.parse("10:00"));
-
-    private final MindfulnessSessionRecordFactory mRecordFactory =
-            new MindfulnessSessionRecordFactory();
-
-    private static final String TEST_PACKAGE_NAME =
-            ApplicationProvider.getApplicationContext().getPackageName();
-
-    @Rule
-    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
-
-    @Rule
-    public AssumptionCheckerRule mSupportedHardwareRule =
-            new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
-
-    @Before
-    public void setUp() throws InterruptedException {
-        TestUtils.deleteAllStagedRemoteData();
+    public MindfulnessDurationAggregationTest() {
+        super(MINDFULNESS_DURATION_TOTAL, HealthDataCategory.WELLNESS);
     }
 
-    @After
-    public void tearDown() throws InterruptedException {
-        TestUtils.deleteAllStagedRemoteData();
+    @Override
+    Long getExpectedValueFromDuration(Duration duration) {
+        return duration.toMillis();
     }
 
-    @Test
-    public void noData_largeWindow_returnsNull() throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(Instant.EPOCH)
-                                                .setEndTime(Instant.now())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNull();
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL)).isNull();
-        assertThat(response.getDataOrigins(MINDFULNESS_DURATION_TOTAL)).isEmpty();
-    }
-
-    @Test
-    public void oneSession_largeWindow_returnsSessionDuration() throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        MindfulnessSessionRecord session =
-                mRecordFactory.newEmptyRecord(
+    @Override
+    MindfulnessSessionRecord createRecord(
+            Instant startTime,
+            Instant endTime,
+            @Nullable ZoneOffset startZoneOffset,
+            @Nullable ZoneOffset endZoneOffset) {
+        var builder =
+                new MindfulnessSessionRecord.Builder(
                         newEmptyMetadata(),
-                        YESTERDAY_11AM.toInstant(),
-                        YESTERDAY_11AM.plusMinutes(30).toInstant());
-        insertRecord(session);
+                        startTime,
+                        endTime,
+                        MINDFULNESS_SESSION_TYPE_MEDITATION);
 
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(Instant.EPOCH)
-                                                .setEndTime(Instant.now())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
+        if (startZoneOffset != null) {
+            builder.setStartZoneOffset(startZoneOffset);
+        }
 
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNotNull();
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(getSessionDuration(session).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(session.getStartZoneOffset());
-        assertThat(response.getDataOrigins(MINDFULNESS_DURATION_TOTAL))
-                .containsExactly(
-                        new DataOrigin.Builder().setPackageName(TEST_PACKAGE_NAME).build());
-    }
+        if (endZoneOffset != null) {
+            builder.setEndZoneOffset(endZoneOffset);
+        }
 
-    @Test
-    public void oneSession_startsBeforeWindowStart_endsOnWindowEnd_returnsOverlapDuration()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        MindfulnessSessionRecord session =
-                mRecordFactory.newEmptyRecord(
-                        newEmptyMetadata(),
-                        YESTERDAY_11AM.toInstant(),
-                        YESTERDAY_11AM.plusMinutes(30).toInstant());
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(
-                                                        session.getStartTime()
-                                                                .plus(Duration.ofMinutes(5)))
-                                                .setEndTime(session.getEndTime())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNotNull();
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(25).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(session.getStartZoneOffset());
-    }
-
-    @Test
-    public void oneSession_startsOnWindowStart_endsAfterWindowEnd_returnsOverlapDuration()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        MindfulnessSessionRecord session =
-                mRecordFactory.newEmptyRecord(
-                        newEmptyMetadata(),
-                        YESTERDAY_11AM.toInstant(),
-                        YESTERDAY_11AM.plusMinutes(30).toInstant());
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(session.getStartTime())
-                                                .setEndTime(
-                                                        session.getEndTime()
-                                                                .minus(Duration.ofMinutes(3)))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNotNull();
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(27).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(session.getStartZoneOffset());
-    }
-
-    @Test
-    public void oneSession_startsBeforeWindowStart_endsAfterWindowEnd_returnsOverlapDuration()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        MindfulnessSessionRecord session =
-                mRecordFactory.newEmptyRecord(
-                        newEmptyMetadata(),
-                        YESTERDAY_11AM.toInstant(),
-                        YESTERDAY_11AM.plusMinutes(30).toInstant());
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(
-                                                        session.getStartTime()
-                                                                .plus(Duration.ofMinutes(6)))
-                                                .setEndTime(
-                                                        session.getEndTime()
-                                                                .minus(Duration.ofMinutes(3)))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNotNull();
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(21).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(session.getStartZoneOffset());
-    }
-
-    @Test
-    public void oneSession_startsOnWindowEnd_returnsNull() throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        MindfulnessSessionRecord session =
-                mRecordFactory.newEmptyRecord(
-                        newEmptyMetadata(),
-                        YESTERDAY_11AM.toInstant(),
-                        YESTERDAY_11AM.plusMinutes(30).toInstant());
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(Instant.EPOCH)
-                                                .setEndTime(session.getStartTime())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNull();
-    }
-
-    @Test
-    public void oneSession_endsOnWindowStart_returnsNull() throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        MindfulnessSessionRecord session =
-                mRecordFactory.newEmptyRecord(
-                        newEmptyMetadata(),
-                        YESTERDAY_11AM.toInstant(),
-                        YESTERDAY_11AM.plusMinutes(30).toInstant());
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(session.getEndTime())
-                                                .setEndTime(Instant.now())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNull();
-    }
-
-    @Test
-    public void aggregate_multipleOverlappingSessions_takesOverlapsIntoAccount()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        List<MindfulnessSessionRecord> sessions =
-                List.of(
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.toInstant(),
-                                YESTERDAY_11AM.plusHours(1).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.plusMinutes(30).toInstant(),
-                                YESTERDAY_11AM.plusHours(1).plusMinutes(20).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.plusMinutes(40).toInstant(),
-                                YESTERDAY_11AM.plusMinutes(50).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.plusHours(1).plusMinutes(10).toInstant(),
-                                YESTERDAY_11AM.plusHours(1).plusMinutes(35).toInstant()));
-        insertRecords(sessions);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(Instant.EPOCH)
-                                                .setEndTime(sessions.get(3).getEndTime())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(
-                        Duration.between(
-                                        sessions.get(0).getStartTime(),
-                                        sessions.get(3).getEndTime())
-                                .toMillis());
-    }
-
-    @Test
-    public void aggregate_multipleNotOverlappingSessions_returnsSumOfDurations()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        List<MindfulnessSessionRecord> sessions =
-                List.of(
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.toInstant(),
-                                YESTERDAY_11AM.plusMinutes(17).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.plusMinutes(20).toInstant(),
-                                YESTERDAY_11AM.plusMinutes(34).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.plusMinutes(40).toInstant(),
-                                YESTERDAY_11AM.plusMinutes(51).toInstant()));
-        insertRecords(sessions);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(Instant.EPOCH)
-                                                .setEndTime(sessions.get(2).getEndTime())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(
-                        getSessionDuration(sessions.get(0))
-                                .plus(getSessionDuration(sessions.get(1)))
-                                .plus(getSessionDuration(sessions.get(2)))
-                                .toMillis());
-    }
-
-    @Test
-    public void aggregate_localTimeFilter_sessionsEqualsToWindow_returnsDuration()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        ZoneOffset startZoneOffset = ZoneOffset.ofHours(1);
-        ZoneOffset endZoneOffset = ZoneOffset.ofHours(1);
-        MindfulnessSessionRecord session =
-                new MindfulnessSessionRecord.Builder(
-                                newEmptyMetadata(),
-                                YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
-                                YESTERDAY_10AM_LOCAL.plusMinutes(23).toInstant(endZoneOffset),
-                                MINDFULNESS_SESSION_TYPE_MEDITATION)
-                        .setStartZoneOffset(startZoneOffset)
-                        .setEndZoneOffset(endZoneOffset)
-                        .build();
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(YESTERDAY_10AM_LOCAL)
-                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusHours(1))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(23).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL)).isEqualTo(startZoneOffset);
-    }
-
-    @Test
-    public void aggregate_localTimeFilter_minMaxZoneOffsets() throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        ZoneOffset startZoneOffset = ZoneOffset.MAX;
-        ZoneOffset endZoneOffset = ZoneOffset.MIN;
-        MindfulnessSessionRecord session =
-                new MindfulnessSessionRecord.Builder(
-                                newEmptyMetadata(),
-                                YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
-                                YESTERDAY_10AM_LOCAL.plusMinutes(37).toInstant(endZoneOffset),
-                                MINDFULNESS_SESSION_TYPE_MEDITATION)
-                        .setStartZoneOffset(startZoneOffset)
-                        .setEndZoneOffset(endZoneOffset)
-                        .build();
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(YESTERDAY_10AM_LOCAL)
-                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusHours(1))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(37).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL)).isEqualTo(startZoneOffset);
-    }
-
-    @Test
-    public void aggregate_localTimeFilter_startOffsetGreaterThanEndOffset()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        ZoneOffset startZoneOffset = ZoneOffset.ofHours(4);
-        ZoneOffset endZoneOffset = ZoneOffset.ofHours(2);
-        MindfulnessSessionRecord session =
-                new MindfulnessSessionRecord.Builder(
-                                newEmptyMetadata(),
-                                YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
-                                YESTERDAY_10AM_LOCAL.plusMinutes(37).toInstant(endZoneOffset),
-                                MINDFULNESS_SESSION_TYPE_MEDITATION)
-                        .setStartZoneOffset(startZoneOffset)
-                        .setEndZoneOffset(endZoneOffset)
-                        .build();
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(YESTERDAY_10AM_LOCAL)
-                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusHours(1))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(37).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL)).isEqualTo(startZoneOffset);
-    }
-
-    @Test
-    public void aggregate_localTimeFilter_startOffsetLessThanEndOffset()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        ZoneOffset startZoneOffset = ZoneOffset.ofHours(-2);
-        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-1);
-        MindfulnessSessionRecord session =
-                new MindfulnessSessionRecord.Builder(
-                                newEmptyMetadata(),
-                                YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
-                                YESTERDAY_10AM_LOCAL
-                                        .plusHours(2)
-                                        .plusMinutes(37)
-                                        .toInstant(endZoneOffset),
-                                MINDFULNESS_SESSION_TYPE_MEDITATION)
-                        .setStartZoneOffset(startZoneOffset)
-                        .setEndZoneOffset(endZoneOffset)
-                        .build();
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(YESTERDAY_10AM_LOCAL.minusDays(1))
-                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusDays(1))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofHours(2).plus(Duration.ofMinutes(37)).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL)).isEqualTo(startZoneOffset);
-    }
-
-    @Test
-    public void aggregate_localTimeFilter_sessionEndsBeforeWindow_returnsNull()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        ZoneOffset startZoneOffset = ZoneOffset.ofHours(4);
-        ZoneOffset endZoneOffset = ZoneOffset.ofHours(2);
-        MindfulnessSessionRecord session =
-                new MindfulnessSessionRecord.Builder(
-                                newEmptyMetadata(),
-                                YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
-                                YESTERDAY_10AM_LOCAL.plusHours(1).toInstant(endZoneOffset),
-                                MINDFULNESS_SESSION_TYPE_MEDITATION)
-                        .setStartZoneOffset(startZoneOffset)
-                        .setEndZoneOffset(endZoneOffset)
-                        .build();
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(YESTERDAY_10AM_LOCAL.plusHours(1))
-                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusDays(10))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNull();
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL)).isNull();
-    }
-
-    @Test
-    public void aggregate_localTimeFilter_sessionStartsAfterWindow_returnsNull()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        ZoneOffset startZoneOffset = ZoneOffset.ofHours(4);
-        ZoneOffset endZoneOffset = ZoneOffset.ofHours(2);
-        MindfulnessSessionRecord session =
-                new MindfulnessSessionRecord.Builder(
-                                newEmptyMetadata(),
-                                YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
-                                YESTERDAY_10AM_LOCAL.plusHours(1).toInstant(endZoneOffset),
-                                MINDFULNESS_SESSION_TYPE_MEDITATION)
-                        .setStartZoneOffset(startZoneOffset)
-                        .setEndZoneOffset(endZoneOffset)
-                        .build();
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(YESTERDAY_10AM_LOCAL.minusDays(10))
-                                                .setEndTime(YESTERDAY_10AM_LOCAL)
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL)).isNull();
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL)).isNull();
-    }
-
-    @Test
-    public void aggregate_localTimeFilter_sessionOverlapsWindow_returnsNull()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        ZoneOffset startZoneOffset = ZoneOffset.ofHours(4);
-        ZoneOffset endZoneOffset = ZoneOffset.ofHours(2);
-        MindfulnessSessionRecord session =
-                new MindfulnessSessionRecord.Builder(
-                                newEmptyMetadata(),
-                                YESTERDAY_10AM_LOCAL.toInstant(startZoneOffset),
-                                YESTERDAY_10AM_LOCAL.plusHours(1).toInstant(endZoneOffset),
-                                MINDFULNESS_SESSION_TYPE_MEDITATION)
-                        .setStartZoneOffset(startZoneOffset)
-                        .setEndZoneOffset(endZoneOffset)
-                        .build();
-        insertRecord(session);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(YESTERDAY_10AM_LOCAL.plusMinutes(47))
-                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusHours(5))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(13).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL)).isEqualTo(startZoneOffset);
-    }
-
-    @Test
-    public void aggregate_localTimeFilter_overlappingSessionsWithDifferentOffsets()
-            throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        List<MindfulnessSessionRecord> sessions =
-                List.of(
-                        new MindfulnessSessionRecord.Builder(
-                                        newEmptyMetadata(),
-                                        YESTERDAY_10AM_LOCAL.toInstant(ZoneOffset.ofHours(2)),
-                                        YESTERDAY_10AM_LOCAL
-                                                .plusMinutes(52)
-                                                .toInstant(ZoneOffset.ofHours(1)),
-                                        MINDFULNESS_SESSION_TYPE_MEDITATION)
-                                .setStartZoneOffset(ZoneOffset.ofHours(2))
-                                .setEndZoneOffset(ZoneOffset.ofHours(1))
-                                .build(),
-                        new MindfulnessSessionRecord.Builder(
-                                        newEmptyMetadata(),
-                                        YESTERDAY_10AM_LOCAL
-                                                .plusMinutes(35)
-                                                .toInstant(ZoneOffset.ofHours(4)),
-                                        YESTERDAY_10AM_LOCAL
-                                                .plusHours(1)
-                                                .toInstant(ZoneOffset.ofHours(3)),
-                                        MINDFULNESS_SESSION_TYPE_MEDITATION)
-                                .setStartZoneOffset(ZoneOffset.ofHours(4))
-                                .setEndZoneOffset(ZoneOffset.ofHours(3))
-                                .build());
-
-        insertRecords(sessions);
-
-        AggregateRecordsResponse<Long> response =
-                getAggregateResponse(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(YESTERDAY_10AM_LOCAL.minusDays(1))
-                                                .setEndTime(YESTERDAY_10AM_LOCAL.plusDays(1))
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build());
-        assertThat(response.get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofHours(1).toMillis());
-        assertThat(response.getZoneOffset(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(ZoneOffset.ofHours(2));
-    }
-
-    @Test
-    public void aggregateGroupByDuration_multipleOverlappingSessions() throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        List<MindfulnessSessionRecord> sessions =
-                List.of(
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.toInstant(),
-                                YESTERDAY_11AM.plusHours(1).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.plusMinutes(30).toInstant(),
-                                YESTERDAY_11AM.plusHours(1).plusMinutes(20).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.plusMinutes(40).toInstant(),
-                                YESTERDAY_11AM.plusMinutes(50).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                YESTERDAY_11AM.plusHours(1).plusMinutes(10).toInstant(),
-                                YESTERDAY_11AM.plusHours(1).plusMinutes(35).toInstant()));
-        insertRecords(sessions);
-
-        List<AggregateRecordsGroupedByDurationResponse<Long>> responses =
-                getAggregateResponseGroupByDuration(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new TimeInstantRangeFilter.Builder()
-                                                .setStartTime(
-                                                        YESTERDAY_11AM.minusMinutes(30).toInstant())
-                                                .setEndTime(YESTERDAY_11AM.plusHours(2).toInstant())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build(),
-                        Duration.of(30, ChronoUnit.MINUTES));
-
-        assertThat(responses).hasSize(5);
-        assertThat(responses.get(0).get(MINDFULNESS_DURATION_TOTAL)).isNull();
-        assertThat(responses.get(1).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(30).toMillis());
-        assertThat(responses.get(2).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(30).toMillis());
-        assertThat(responses.get(3).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(30).toMillis());
-        assertThat(responses.get(4).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(Duration.ofMinutes(5).toMillis());
-    }
-
-    @Test
-    public void aggregateGroupByPeriod_returnsResponsePerGroup() throws InterruptedException {
-        setupAggregation(TEST_PACKAGE_NAME, HealthDataCategory.WELLNESS);
-        List<MindfulnessSessionRecord> sessions =
-                List.of(
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusHours(10).toInstant(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusHours(11).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(1).plusHours(10).toInstant(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(1).plusHours(11).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(1).plusHours(16).toInstant(),
-                                MIDNIGHT_ONE_WEEK_AGO
-                                        .plusDays(1)
-                                        .plusHours(16)
-                                        .plusMinutes(32)
-                                        .toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(3).plusHours(11).toInstant(),
-                                MIDNIGHT_ONE_WEEK_AGO
-                                        .plusDays(3)
-                                        .plusHours(11)
-                                        .plusMinutes(55)
-                                        .toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(3).plusHours(10).toInstant(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(3).plusHours(13).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(4).plusHours(10).toInstant(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(4).plusHours(11).toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                MIDNIGHT_ONE_WEEK_AGO
-                                        .plusDays(4)
-                                        .plusHours(10)
-                                        .plusMinutes(30)
-                                        .toInstant(),
-                                MIDNIGHT_ONE_WEEK_AGO
-                                        .plusDays(4)
-                                        .plusHours(11)
-                                        .plusMinutes(13)
-                                        .toInstant()),
-                        mRecordFactory.newEmptyRecord(
-                                newEmptyMetadata(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(6).minusMinutes(40).toInstant(),
-                                MIDNIGHT_ONE_WEEK_AGO.plusDays(6).plusMinutes(35).toInstant()));
-        insertRecords(sessions);
-
-        List<AggregateRecordsGroupedByPeriodResponse<Long>> responses =
-                TestUtils.getAggregateResponseGroupByPeriod(
-                        new AggregateRecordsRequest.Builder<Long>(
-                                        new LocalTimeRangeFilter.Builder()
-                                                .setStartTime(
-                                                        MIDNIGHT_ONE_WEEK_AGO.toLocalDateTime())
-                                                .setEndTime(
-                                                        MIDNIGHT_ONE_WEEK_AGO
-                                                                .plusDays(7)
-                                                                .toLocalDateTime())
-                                                .build())
-                                .addAggregationType(MINDFULNESS_DURATION_TOTAL)
-                                .build(),
-                        Period.ofDays(1));
-
-        assertThat(responses).hasSize(7);
-        assertThat(responses.get(0).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(getSessionDuration(sessions.get(0)).toMillis());
-        assertThat(responses.get(1).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(
-                        getSessionDuration(sessions.get(1))
-                                .plus(getSessionDuration(sessions.get(2)))
-                                .toMillis());
-        assertThat(responses.get(2).get(MINDFULNESS_DURATION_TOTAL)).isNull();
-        assertThat(responses.get(3).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(getSessionDuration(sessions.get(4)).toMillis());
-        assertThat(responses.get(4).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(
-                        Duration.between(
-                                        sessions.get(5).getStartTime(),
-                                        sessions.get(6).getEndTime())
-                                .toMillis());
-        assertThat(responses.get(5).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(
-                        Duration.between(
-                                        sessions.get(7).getStartTime(),
-                                        MIDNIGHT_ONE_WEEK_AGO.plusDays(6).toInstant())
-                                .toMillis());
-        assertThat(responses.get(6).get(MINDFULNESS_DURATION_TOTAL))
-                .isEqualTo(
-                        Duration.between(
-                                        MIDNIGHT_ONE_WEEK_AGO.plusDays(6).toInstant(),
-                                        sessions.get(7).getEndTime())
-                                .toMillis());
-    }
-
-    private static Duration getSessionDuration(MindfulnessSessionRecord session) {
-        return Duration.between(session.getStartTime(), session.getEndTime());
+        return builder.build();
     }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/SleepDurationAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/SleepDurationAggregationTest.java
index e0b7ce2..c586141 100644
--- a/tests/cts/src/android/healthconnect/cts/aggregation/SleepDurationAggregationTest.java
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/SleepDurationAggregationTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/aggregation/TotalCaloriesAggregationTest.java b/tests/cts/src/android/healthconnect/cts/aggregation/TotalCaloriesAggregationTest.java
index 0c2bf66..db97da8 100644
--- a/tests/cts/src/android/healthconnect/cts/aggregation/TotalCaloriesAggregationTest.java
+++ b/tests/cts/src/android/healthconnect/cts/aggregation/TotalCaloriesAggregationTest.java
@@ -78,7 +78,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/backgroundread/BackgroundReadTest.java b/tests/cts/src/android/healthconnect/cts/backgroundread/BackgroundReadTest.java
index c998787..dcb469f 100644
--- a/tests/cts/src/android/healthconnect/cts/backgroundread/BackgroundReadTest.java
+++ b/tests/cts/src/android/healthconnect/cts/backgroundread/BackgroundReadTest.java
@@ -81,7 +81,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/cts/src/android/healthconnect/cts/changelogs/HealthConnectChangeLogsTests.java b/tests/cts/src/android/healthconnect/cts/changelogs/HealthConnectChangeLogsTests.java
index f932340..36272ec 100644
--- a/tests/cts/src/android/healthconnect/cts/changelogs/HealthConnectChangeLogsTests.java
+++ b/tests/cts/src/android/healthconnect/cts/changelogs/HealthConnectChangeLogsTests.java
@@ -120,7 +120,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/ActiveCaloriesBurnedRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/ActiveCaloriesBurnedRecordTest.java
index 42e64ce..3ba471e 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/ActiveCaloriesBurnedRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/ActiveCaloriesBurnedRecordTest.java
@@ -67,7 +67,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/ActivityIntensityRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/ActivityIntensityRecordTest.java
new file mode 100644
index 0000000..e7ed5ec
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/ActivityIntensityRecordTest.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.datatypes;
+
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
+import static android.health.connect.datatypes.Device.DEVICE_TYPE_FITNESS_BAND;
+import static android.health.connect.datatypes.Metadata.RECORDING_METHOD_MANUAL_ENTRY;
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY;
+
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY_DB;
+import static com.android.healthfitness.flags.Flags.FLAG_HEALTH_CONNECT_MAPPINGS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.TimeInstantRangeFilter;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.DataOrigin;
+import android.health.connect.datatypes.Device;
+import android.health.connect.datatypes.Metadata;
+import android.health.connect.datatypes.SkinTemperatureRecord;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.time.Instant;
+import java.time.ZoneOffset;
+
+@AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
+@RunWith(AndroidJUnit4.class)
+@RequiresFlagsEnabled({
+    FLAG_ACTIVITY_INTENSITY,
+    FLAG_ACTIVITY_INTENSITY_DB,
+    FLAG_HEALTH_CONNECT_MAPPINGS
+})
+public class ActivityIntensityRecordTest {
+
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    @After
+    public void tearDown() throws InterruptedException {
+        TestUtils.verifyDeleteRecords(
+                SkinTemperatureRecord.class,
+                new TimeInstantRangeFilter.Builder()
+                        .setStartTime(Instant.EPOCH)
+                        .setEndTime(Instant.now())
+                        .build());
+        TestUtils.deleteAllStagedRemoteData();
+    }
+
+    @Before
+    public void setUp() throws InterruptedException {
+        TestUtils.deleteAllStagedRemoteData();
+    }
+
+    @Test
+    public void activityIntensityRecordBuilder_allFieldsSet() {
+        Instant endTime = Instant.now();
+        Instant startTime = endTime.minusSeconds(60);
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(2);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-3);
+        Metadata metadata =
+                new Metadata.Builder()
+                        .setClientRecordId("clientRecordId")
+                        .setClientRecordVersion(123)
+                        .setDataOrigin(
+                                new DataOrigin.Builder().setPackageName("package.name").build())
+                        .setId("id-foo-bar")
+                        .setRecordingMethod(RECORDING_METHOD_MANUAL_ENTRY)
+                        .setDevice(
+                                new Device.Builder()
+                                        .setType(DEVICE_TYPE_FITNESS_BAND)
+                                        .setManufacturer("manufacturer")
+                                        .setModel("model")
+                                        .build())
+                        .setLastModifiedTime(endTime.minusSeconds(15))
+                        .build();
+
+        ActivityIntensityRecord record =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_VIGOROUS)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        assertThat(record.getRecordType()).isEqualTo(RECORD_TYPE_ACTIVITY_INTENSITY);
+        assertThat(record.getMetadata()).isEqualTo(metadata);
+        assertThat(record.getStartTime()).isEqualTo(startTime);
+        assertThat(record.getEndTime()).isEqualTo(endTime);
+        assertThat(record.getStartZoneOffset()).isEqualTo(startZoneOffset);
+        assertThat(record.getEndZoneOffset()).isEqualTo(endZoneOffset);
+        assertThat(record.getActivityIntensityType()).isEqualTo(ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+    }
+
+    @Test
+    public void activityIntensityRecordBuilder_optionalFieldsUnset() {
+        Instant endTime = Instant.now();
+        Instant startTime = endTime.minusSeconds(60);
+        Metadata metadata = new Metadata.Builder().build();
+
+        ActivityIntensityRecord record =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .build();
+
+        assertThat(record.getRecordType()).isEqualTo(RECORD_TYPE_ACTIVITY_INTENSITY);
+        assertThat(record.getMetadata()).isEqualTo(metadata);
+        assertThat(record.getStartTime()).isEqualTo(startTime);
+        assertThat(record.getEndTime()).isEqualTo(endTime);
+        assertThat(record.getStartZoneOffset()).isEqualTo(getDefaultZoneOffset(startTime));
+        assertThat(record.getEndZoneOffset()).isEqualTo(getDefaultZoneOffset(endTime));
+        assertThat(record.getActivityIntensityType()).isEqualTo(ACTIVITY_INTENSITY_TYPE_MODERATE);
+    }
+
+    @Test
+    public void activityIntensityRecordBuilder_invalidActivityIntensityType() {
+        ActivityIntensityRecord.Builder builder =
+                new ActivityIntensityRecord.Builder(
+                        new Metadata.Builder().build(),
+                        Instant.now().minusSeconds(60),
+                        Instant.now(),
+                        54);
+
+        assertThrows(IllegalArgumentException.class, builder::build);
+    }
+
+    @Test
+    public void equals_hashCode_allFieldsEqual_recordsEqual() {
+        Instant endTime = Instant.now();
+        Instant startTime = endTime.minusSeconds(60);
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(2);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-3);
+        Metadata metadata = new Metadata.Builder().build();
+
+        ActivityIntensityRecord recordA =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_VIGOROUS)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        ActivityIntensityRecord recordB =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_VIGOROUS)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        assertThat(recordA).isEqualTo(recordB);
+        assertThat(recordA.hashCode()).isEqualTo(recordB.hashCode());
+    }
+
+    @Test
+    public void equals_hashCode_metadataNotEqual_recordsNotEqual() {
+        Instant endTime = Instant.now();
+        Instant startTime = endTime.minusSeconds(60);
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(2);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-3);
+        Metadata metadataA = new Metadata.Builder().setId("id-a").build();
+        Metadata metadataB = new Metadata.Builder().setId("id-b").build();
+
+        ActivityIntensityRecord recordA =
+                new ActivityIntensityRecord.Builder(
+                                metadataA, startTime, endTime, ACTIVITY_INTENSITY_TYPE_VIGOROUS)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        ActivityIntensityRecord recordB =
+                new ActivityIntensityRecord.Builder(
+                                metadataB, startTime, endTime, ACTIVITY_INTENSITY_TYPE_VIGOROUS)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        assertThat(recordA).isNotEqualTo(recordB);
+        assertThat(recordA.hashCode()).isNotEqualTo(recordB.hashCode());
+    }
+
+    @Test
+    public void equals_hashCode_startTimeNotEqual_recordsNotEqual() {
+        Instant endTime = Instant.now();
+        Instant startTimeA = endTime.minusSeconds(60);
+        Instant startTimeB = endTime.minusSeconds(120);
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(2);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-3);
+        Metadata metadata = new Metadata.Builder().build();
+
+        ActivityIntensityRecord recordA =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTimeA, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        ActivityIntensityRecord recordB =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTimeB, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        assertThat(recordA).isNotEqualTo(recordB);
+        assertThat(recordA.hashCode()).isNotEqualTo(recordB.hashCode());
+    }
+
+    @Test
+    public void equals_hashCode_endTimeNotEqual_recordsNotEqual() {
+        Instant endTimeA = Instant.now();
+        Instant endTimeB = endTimeA.minusSeconds(1);
+        Instant startTime = endTimeA.minusSeconds(60);
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(2);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-3);
+        Metadata metadata = new Metadata.Builder().build();
+
+        ActivityIntensityRecord recordA =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTimeA, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        ActivityIntensityRecord recordB =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTimeB, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        assertThat(recordA).isNotEqualTo(recordB);
+        assertThat(recordA.hashCode()).isNotEqualTo(recordB.hashCode());
+    }
+
+    @Test
+    public void equals_hashCode_intensityTypeNotEqual_recordsNotEqual() {
+        Instant endTime = Instant.now();
+        Instant startTime = endTime.minusSeconds(60);
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(2);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-3);
+        Metadata metadata = new Metadata.Builder().build();
+
+        ActivityIntensityRecord recordA =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        ActivityIntensityRecord recordB =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_VIGOROUS)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        assertThat(recordA).isNotEqualTo(recordB);
+        assertThat(recordA.hashCode()).isNotEqualTo(recordB.hashCode());
+    }
+
+    @Test
+    public void equals_hashCode_startZoneOffsetNotEqual_recordsNotEqual() {
+        Instant endTime = Instant.now();
+        Instant startTime = endTime.minusSeconds(60);
+        ZoneOffset startZoneOffsetA = ZoneOffset.ofHours(2);
+        ZoneOffset startZoneOffsetB = ZoneOffset.ofHours(1);
+        ZoneOffset endZoneOffset = ZoneOffset.ofHours(-3);
+        Metadata metadata = new Metadata.Builder().build();
+
+        ActivityIntensityRecord recordA =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffsetA)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        ActivityIntensityRecord recordB =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffsetB)
+                        .setEndZoneOffset(endZoneOffset)
+                        .build();
+
+        assertThat(recordA).isNotEqualTo(recordB);
+        assertThat(recordA.hashCode()).isNotEqualTo(recordB.hashCode());
+    }
+
+    @Test
+    public void equals_hashCode_endZoneOffsetNotEqual_recordsNotEqual() {
+        Instant endTime = Instant.now();
+        Instant startTime = endTime.minusSeconds(60);
+        ZoneOffset startZoneOffset = ZoneOffset.ofHours(2);
+        ZoneOffset endZoneOffsetA = ZoneOffset.ofHours(-3);
+        ZoneOffset endZoneOffsetB = ZoneOffset.ofHours(-2);
+        Metadata metadata = new Metadata.Builder().build();
+
+        ActivityIntensityRecord recordA =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffsetA)
+                        .build();
+
+        ActivityIntensityRecord recordB =
+                new ActivityIntensityRecord.Builder(
+                                metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(startZoneOffset)
+                        .setEndZoneOffset(endZoneOffsetB)
+                        .build();
+
+        assertThat(recordA).isNotEqualTo(recordB);
+        assertThat(recordA.hashCode()).isNotEqualTo(recordB.hashCode());
+    }
+
+    private static ZoneOffset getDefaultZoneOffset(Instant instant) {
+        return ZoneOffset.systemDefault().getRules().getOffset(instant);
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/BasalBodyTemperatureRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/BasalBodyTemperatureRecordTest.java
index 0d36476..dadd926 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/BasalBodyTemperatureRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/BasalBodyTemperatureRecordTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/BasalMetabolicRateRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/BasalMetabolicRateRecordTest.java
index e409ca9..30903e9 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/BasalMetabolicRateRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/BasalMetabolicRateRecordTest.java
@@ -73,7 +73,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/BloodGlucoseRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/BloodGlucoseRecordTest.java
index 1036843..0f1ce33 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/BloodGlucoseRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/BloodGlucoseRecordTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/BloodPressureRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/BloodPressureRecordTest.java
index 6c5cd4a..c433c28 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/BloodPressureRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/BloodPressureRecordTest.java
@@ -78,7 +78,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/BodyFatRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/BodyFatRecordTest.java
index 9e76683..bbb0979 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/BodyFatRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/BodyFatRecordTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/BodyTemperatureRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/BodyTemperatureRecordTest.java
index 9cc28de..2e68b7b 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/BodyTemperatureRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/BodyTemperatureRecordTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/BodyWaterMassRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/BodyWaterMassRecordTest.java
index 6bc54df..1cd503b 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/BodyWaterMassRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/BodyWaterMassRecordTest.java
@@ -67,7 +67,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/BoneMassRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/BoneMassRecordTest.java
index 8469cec..561eff6 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/BoneMassRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/BoneMassRecordTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/CervicalMucusRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/CervicalMucusRecordTest.java
index 69fa0be..e1457fd 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/CervicalMucusRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/CervicalMucusRecordTest.java
@@ -63,7 +63,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/CyclingPedalingCadenceRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/CyclingPedalingCadenceRecordTest.java
index 519527b..e4e84c7 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/CyclingPedalingCadenceRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/CyclingPedalingCadenceRecordTest.java
@@ -76,7 +76,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/DistanceRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/DistanceRecordTest.java
index a1f4873..2946933 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/DistanceRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/DistanceRecordTest.java
@@ -73,7 +73,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
@@ -93,7 +94,7 @@
 
     @BeforeClass
     public static void setup() throws InterruptedException {
-        if (!TestUtils.isHardwareSupported()) {
+        if (!TestUtils.isHealthConnectFullySupported()) {
             return;
         }
         TestUtils.verifyDeleteRecords(
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/ElevationGainedRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/ElevationGainedRecordTest.java
index 2f9c4c4..a9072c2 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/ElevationGainedRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/ElevationGainedRecordTest.java
@@ -73,7 +73,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/ExerciseCompletionGoalTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/ExerciseCompletionGoalTest.java
index 30726c1..3e0ab20 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/ExerciseCompletionGoalTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/ExerciseCompletionGoalTest.java
@@ -55,7 +55,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/ExercisePerformanceGoalTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/ExercisePerformanceGoalTest.java
index 94c8c91..cc84290 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/ExercisePerformanceGoalTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/ExercisePerformanceGoalTest.java
@@ -58,7 +58,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/ExerciseSessionRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/ExerciseSessionRecordTest.java
index dde19b3..261e04a 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/ExerciseSessionRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/ExerciseSessionRecordTest.java
@@ -88,7 +88,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/FloorsClimbedRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/FloorsClimbedRecordTest.java
index fd962df..e52dd3e 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/FloorsClimbedRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/FloorsClimbedRecordTest.java
@@ -68,7 +68,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/HeartRateRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/HeartRateRecordTest.java
index a4de89d..0f8c8d5 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/HeartRateRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/HeartRateRecordTest.java
@@ -91,7 +91,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/HeartRateVariabilityRmssdRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/HeartRateVariabilityRmssdRecordTest.java
index dcf46c1..5a8accd 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/HeartRateVariabilityRmssdRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/HeartRateVariabilityRmssdRecordTest.java
@@ -66,7 +66,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/HeightRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/HeightRecordTest.java
index 742a188..24e8230 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/HeightRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/HeightRecordTest.java
@@ -81,7 +81,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/HydrationRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/HydrationRecordTest.java
index 3f8f460..85fccb4 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/HydrationRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/HydrationRecordTest.java
@@ -68,7 +68,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/IntermenstrualBleedingRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/IntermenstrualBleedingRecordTest.java
index 3029b87..58e6e50 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/IntermenstrualBleedingRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/IntermenstrualBleedingRecordTest.java
@@ -66,7 +66,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/LeanBodyMassRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/LeanBodyMassRecordTest.java
index 85b5155..92f8b07 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/LeanBodyMassRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/LeanBodyMassRecordTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/MenstruationFlowRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/MenstruationFlowRecordTest.java
index 9e67c21..aae3227 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/MenstruationFlowRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/MenstruationFlowRecordTest.java
@@ -63,7 +63,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/MenstruationPeriodRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/MenstruationPeriodRecordTest.java
index 36d0aac..e69388b 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/MenstruationPeriodRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/MenstruationPeriodRecordTest.java
@@ -67,7 +67,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/MindfulnessSessionRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/MindfulnessSessionRecordTest.java
index cf25dc4..d044e59 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/MindfulnessSessionRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/MindfulnessSessionRecordTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
@@ -323,7 +324,7 @@
 
         MindfulnessSessionRecord recordA =
                 new MindfulnessSessionRecord.Builder(
-                                metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_OTHER)
+                                metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_BREATHING)
                         .setTitle("titleA")
                         .setNotes("notes")
                         .setStartZoneOffset(startZoneOffset)
@@ -353,7 +354,7 @@
 
         MindfulnessSessionRecord recordA =
                 new MindfulnessSessionRecord.Builder(
-                                metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_OTHER)
+                                metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_BREATHING)
                         .setTitle("title")
                         .setNotes("notesA")
                         .setStartZoneOffset(startZoneOffset)
@@ -364,7 +365,7 @@
                 new MindfulnessSessionRecord.Builder(
                                 metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_BREATHING)
                         .setTitle("title")
-                        .setNotes("notesA")
+                        .setNotes("notesB")
                         .setStartZoneOffset(startZoneOffset)
                         .setEndZoneOffset(endZoneOffset)
                         .build();
@@ -384,7 +385,7 @@
 
         MindfulnessSessionRecord recordA =
                 new MindfulnessSessionRecord.Builder(
-                                metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_OTHER)
+                                metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_BREATHING)
                         .setTitle("title")
                         .setNotes("notesA")
                         .setStartZoneOffset(startZoneOffsetA)
@@ -415,7 +416,7 @@
 
         MindfulnessSessionRecord recordA =
                 new MindfulnessSessionRecord.Builder(
-                                metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_OTHER)
+                                metadata, startTime, endTime, MINDFULNESS_SESSION_TYPE_BREATHING)
                         .setTitle("title")
                         .setNotes("notesA")
                         .setStartZoneOffset(startZoneOffset)
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/NutritionRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/NutritionRecordTest.java
index afaf6c3..810fb1e 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/NutritionRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/NutritionRecordTest.java
@@ -157,7 +157,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/OvulationTestRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/OvulationTestRecordTest.java
index fdc7ed4..73b1def 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/OvulationTestRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/OvulationTestRecordTest.java
@@ -63,7 +63,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/OxygenSaturationRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/OxygenSaturationRecordTest.java
index 3228074..6091a28 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/OxygenSaturationRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/OxygenSaturationRecordTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseBlockTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseBlockTest.java
index 248fb6c..3e9b814 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseBlockTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseBlockTest.java
@@ -41,7 +41,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Test
     public void hashCodeAndEquals_sensitiveToAllFields() {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseSessionRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseSessionRecordTest.java
index 36cc141..2fc7109 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseSessionRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseSessionRecordTest.java
@@ -84,7 +84,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseStepTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseStepTest.java
index 83d5177..6926451 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseStepTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/PlannedExerciseStepTest.java
@@ -41,7 +41,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Test
     public void hashCodeAndEquals_sensitiveToAllFields() {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/PowerRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/PowerRecordTest.java
index fda5917..232edf3 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/PowerRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/PowerRecordTest.java
@@ -75,7 +75,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/RespiratoryRateRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/RespiratoryRateRecordTest.java
index e05bcaa..05cec8a 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/RespiratoryRateRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/RespiratoryRateRecordTest.java
@@ -63,7 +63,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/RestingHeartRateRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/RestingHeartRateRecordTest.java
index dacc772..0324e4c 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/RestingHeartRateRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/RestingHeartRateRecordTest.java
@@ -70,7 +70,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/SexualActivityRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/SexualActivityRecordTest.java
index 940abff..98dfcf7 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/SexualActivityRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/SexualActivityRecordTest.java
@@ -63,7 +63,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/SkinTemperatureRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/SkinTemperatureRecordTest.java
index 23917cd..aab2d03 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/SkinTemperatureRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/SkinTemperatureRecordTest.java
@@ -78,7 +78,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/SleepSessionRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/SleepSessionRecordTest.java
index 61fbb5d..e18c6b9 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/SleepSessionRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/SleepSessionRecordTest.java
@@ -68,7 +68,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/SpeedRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/SpeedRecordTest.java
index 7794189..a31f4c3 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/SpeedRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/SpeedRecordTest.java
@@ -83,7 +83,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/StepsCadenceRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/StepsCadenceRecordTest.java
index 7777719..66e630a 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/StepsCadenceRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/StepsCadenceRecordTest.java
@@ -77,7 +77,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/StepsRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/StepsRecordTest.java
index dd384ce..e699b30 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/StepsRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/StepsRecordTest.java
@@ -104,7 +104,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/TotalCaloriesBurnedRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/TotalCaloriesBurnedRecordTest.java
index 30da49f..0ba3ef2 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/TotalCaloriesBurnedRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/TotalCaloriesBurnedRecordTest.java
@@ -59,7 +59,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/Vo2MaxRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/Vo2MaxRecordTest.java
index 27fccef..c2a1f98 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/Vo2MaxRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/Vo2MaxRecordTest.java
@@ -63,7 +63,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/WeightRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/WeightRecordTest.java
index d107bae..8b4af09 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/WeightRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/WeightRecordTest.java
@@ -91,7 +91,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/WheelchairPushesRecordTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/WheelchairPushesRecordTest.java
index b7a5a85..47c865c 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/WheelchairPushesRecordTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/WheelchairPushesRecordTest.java
@@ -68,7 +68,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/api/ActivityIntensityRecordApiTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/api/ActivityIntensityRecordApiTest.java
new file mode 100644
index 0000000..384a24f
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/api/ActivityIntensityRecordApiTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.datatypes.api;
+
+import android.health.connect.HealthPermissions;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.healthconnect.cts.lib.ActivityIntensityRecordFactory;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+
+import org.junit.runner.RunWith;
+
+@AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
+@RunWith(AndroidJUnit4.class)
+@RequiresFlagsEnabled({
+    Flags.FLAG_ACTIVITY_INTENSITY,
+    Flags.FLAG_ACTIVITY_INTENSITY_DB,
+    Flags.FLAG_HEALTH_CONNECT_MAPPINGS
+})
+public class ActivityIntensityRecordApiTest extends BaseApiTest<ActivityIntensityRecord> {
+    public ActivityIntensityRecordApiTest() {
+        super(
+                ActivityIntensityRecord.class,
+                HealthPermissions.READ_ACTIVITY_INTENSITY,
+                HealthPermissions.WRITE_ACTIVITY_INTENSITY,
+                new ActivityIntensityRecordFactory());
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/api/ActivityIntensityRecordMultiAppApiTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/api/ActivityIntensityRecordMultiAppApiTest.java
new file mode 100644
index 0000000..64b4487
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/api/ActivityIntensityRecordMultiAppApiTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.datatypes.api;
+
+import android.health.connect.HealthPermissions;
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.healthconnect.cts.lib.ActivityIntensityRecordFactory;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+
+import org.junit.runner.RunWith;
+
+@AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
+@RunWith(AndroidJUnit4.class)
+@RequiresFlagsEnabled({
+    Flags.FLAG_ACTIVITY_INTENSITY,
+    Flags.FLAG_ACTIVITY_INTENSITY_DB,
+    Flags.FLAG_HEALTH_CONNECT_MAPPINGS
+})
+public class ActivityIntensityRecordMultiAppApiTest
+        extends BaseMultiAppApiTest<ActivityIntensityRecord> {
+    public ActivityIntensityRecordMultiAppApiTest() {
+        super(
+                ActivityIntensityRecord.class,
+                HealthPermissions.READ_ACTIVITY_INTENSITY,
+                HealthPermissions.WRITE_ACTIVITY_INTENSITY,
+                new ActivityIntensityRecordFactory());
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/api/BaseApiTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/api/BaseApiTest.java
index 40cb38c..77ca156 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/api/BaseApiTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/api/BaseApiTest.java
@@ -92,7 +92,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/datatypes/api/BaseMultiAppApiTest.java b/tests/cts/src/android/healthconnect/cts/datatypes/api/BaseMultiAppApiTest.java
index c71ec2c..7bcaa75 100644
--- a/tests/cts/src/android/healthconnect/cts/datatypes/api/BaseMultiAppApiTest.java
+++ b/tests/cts/src/android/healthconnect/cts/datatypes/api/BaseMultiAppApiTest.java
@@ -84,7 +84,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/historicaccess/HistoricAccessLimitTest.java b/tests/cts/src/android/healthconnect/cts/historicaccess/HistoricAccessLimitTest.java
index 762f01d..5b9ab29 100644
--- a/tests/cts/src/android/healthconnect/cts/historicaccess/HistoricAccessLimitTest.java
+++ b/tests/cts/src/android/healthconnect/cts/historicaccess/HistoricAccessLimitTest.java
@@ -72,7 +72,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/historicaccess/HistoricAccessLimitWithPermissionTest.java b/tests/cts/src/android/healthconnect/cts/historicaccess/HistoricAccessLimitWithPermissionTest.java
index 7fc1bd2..ad110f6 100644
--- a/tests/cts/src/android/healthconnect/cts/historicaccess/HistoricAccessLimitWithPermissionTest.java
+++ b/tests/cts/src/android/healthconnect/cts/historicaccess/HistoricAccessLimitWithPermissionTest.java
@@ -68,9 +68,10 @@
     private Instant mNow;
 
     @Rule
-    public final AssumptionCheckerRule mSupportedHardwareRule =
+    public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/migration/DataMigrationTest.java b/tests/cts/src/android/healthconnect/cts/migration/DataMigrationTest.java
index 9eafc05..63eaed3 100644
--- a/tests/cts/src/android/healthconnect/cts/migration/DataMigrationTest.java
+++ b/tests/cts/src/android/healthconnect/cts/migration/DataMigrationTest.java
@@ -25,6 +25,7 @@
 import static android.health.connect.HealthPermissions.WRITE_HEIGHT;
 import static android.health.connect.datatypes.units.Length.fromMeters;
 import static android.health.connect.datatypes.units.Power.fromWatts;
+import static android.healthconnect.cts.utils.HealthConnectReceiver.callAndGetResponseWithShellPermissionIdentity;
 
 import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
@@ -32,20 +33,14 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
-
-import static java.util.concurrent.Executors.newSingleThreadExecutor;
 
 import android.Manifest;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
-import android.health.connect.ApplicationInfoResponse;
-import android.health.connect.DeleteUsingFiltersRequest;
 import android.health.connect.FetchDataOriginsPriorityOrderResponse;
 import android.health.connect.HealthConnectDataState;
-import android.health.connect.HealthConnectException;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.HealthDataCategory;
 import android.health.connect.HealthPermissions;
@@ -78,7 +73,6 @@
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
 import android.healthconnect.cts.utils.TestUtils;
 import android.os.Build;
-import android.os.OutcomeReceiver;
 import android.os.UserHandle;
 import android.os.ext.SdkExtensions;
 
@@ -103,10 +97,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -123,18 +113,11 @@
     private static final String HEALTH_PERMISSION_PREFIX = "android.permission.health.";
     private static final String APP_NAME = "Test App";
     private static final String APP_NAME_NEW = "Test App 2";
-    private static final String ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG =
-            "enable_pause_state_change_jobs";
-    private static final String ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG =
-            "enable_complete_state_change_jobs";
-    private static final String ENABLE_PAUSE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE = "true";
-    private static final String ENABLE_COMPLETE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE = "false";
     // DEFAULT_PAGE_SIZE should hold the same value as Constants#DEFAULT_PAGE_SIZE
     private static final int DEFAULT_PAGE_SIZE = 1000;
 
     @Rule public final Expect mExpect = Expect.create();
 
-    private final Executor mOutcomeExecutor = newSingleThreadExecutor();
     private final Instant mEndTime = Instant.now().truncatedTo(ChronoUnit.MILLIS);
     private final Instant mStartTime = mEndTime.minus(Duration.ofHours(1));
 
@@ -151,25 +134,6 @@
     private String mEnablePauseJobsBackup;
     private String mStateChangeJobAdbDumpsys;
 
-    private static <T, E extends RuntimeException> T blockingCall(
-            Consumer<OutcomeReceiver<T, E>> action) {
-        final BlockingOutcomeReceiver<T, E> outcomeReceiver = new BlockingOutcomeReceiver<>();
-        action.accept(outcomeReceiver);
-        return outcomeReceiver.await();
-    }
-
-    private static <T, E extends RuntimeException> T blockingCallWithPermissions(
-            Consumer<OutcomeReceiver<T, E>> action, String... permissions) {
-        try {
-            return runWithShellPermissionIdentity(() -> blockingCall(action), permissions);
-        } catch (RuntimeException e) {
-            // runWithShellPermissionIdentity wraps and rethrows all exceptions as RuntimeException,
-            // but we need the original RuntimeException if there is one.
-            final Throwable cause = e.getCause();
-            throw cause instanceof RuntimeException ? (RuntimeException) cause : e;
-        }
-    }
-
     private static Metadata getMetadata(UUID id, String clientRecordId, String packageName) {
         return new Metadata.Builder()
                 .setId(id == null ? "" : id.toString())
@@ -211,23 +175,19 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() {
         mTargetContext = InstrumentationRegistry.getTargetContext();
         mManager = mTargetContext.getSystemService(HealthConnectManager.class);
-        clearData();
+        TestUtils.deleteAllStagedRemoteData();
     }
 
     @After
     public void tearDown() {
-        clearData();
-    }
-
-    private void clearData() {
-        deleteAllStagedRemoteData();
-        deleteAllRecords();
+        TestUtils.deleteAllStagedRemoteData();
     }
 
     @Test
@@ -238,7 +198,7 @@
                 new HeightRecord.Builder(getMetadata(entityId), mEndTime, fromMeters(3D)).build(),
                 entityId);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         final HeightRecord record = getRecord(HeightRecord.class, entityId);
         mExpect.that(record).isNotNull();
         mExpect.that(record.getHeight().getInMeters()).isEqualTo(3D);
@@ -258,7 +218,7 @@
                 new HeightRecord.Builder(getMetadata(uuid), mEndTime, fromMeters(3D)).build(),
                 entityId);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         final HeightRecord record = getRecord(HeightRecord.class, uuid);
         mExpect.that(record).isNotNull();
         mExpect.that(record.getHeight().getInMeters()).isEqualTo(3D);
@@ -285,7 +245,7 @@
         }
 
         migrate(inputMigrationEntityList.toArray(MigrationEntity[]::new));
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         final List<HeightRecord> outputRecords = getRecords(HeightRecord.class);
 
@@ -316,7 +276,7 @@
                 new StepsRecord.Builder(getMetadata(entityId), mStartTime, mEndTime, 10).build(),
                 entityId);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         final StepsRecord record = getRecord(StepsRecord.class, entityId);
         mExpect.that(record).isNotNull();
         mExpect.that(record.getCount()).isEqualTo(10);
@@ -337,7 +297,7 @@
                 new StepsRecord.Builder(getMetadata(uuid), mStartTime, mEndTime, 10).build(),
                 entityId);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         final StepsRecord record = getRecord(StepsRecord.class, uuid);
         mExpect.that(record).isNotNull();
         mExpect.that(record.getCount()).isEqualTo(10);
@@ -365,7 +325,7 @@
                         .build(),
                 entityId);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         final PowerRecord record = getRecord(PowerRecord.class, entityId);
 
         mExpect.that(record).isNotNull();
@@ -395,7 +355,7 @@
         final Length height2 = fromMeters(1D);
         migrate(new HeightRecord.Builder(getMetadata(), mStartTime, height2).build(), entityId);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         final List<HeightRecord> records = getRecords(HeightRecord.class);
         mExpect.that(records.stream().map(HeightRecord::getHeight).toList())
@@ -424,7 +384,7 @@
                 new StepsRecord.Builder(getMetadata(), mStartTime, mEndTime, steps2).build(),
                 entityId2);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         final List<StepsRecord> records = getRecords(StepsRecord.class);
         mExpect.that(records.stream().map(StepsRecord::getCount).toList()).containsExactly(steps1);
@@ -453,7 +413,7 @@
                         .build(),
                 entityId2);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         final List<StepsRecord> records = getRecords(StepsRecord.class);
         mExpect.that(records.stream().map(StepsRecord::getCount).toList())
@@ -476,7 +436,7 @@
         final Length height2 = fromMeters(2.0);
         migrate(new HeightRecord.Builder(getMetadata(), mEndTime, height2).build(), entityId2);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         final List<HeightRecord> records = getRecords(HeightRecord.class);
         mExpect.that(records.stream().map(HeightRecord::getHeight).toList())
@@ -504,7 +464,7 @@
                 new HeightRecord.Builder(getMetadata(entityId2), mEndTime, height2).build(),
                 entityId2);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         final List<HeightRecord> records = getRecords(HeightRecord.class);
         mExpect.that(records.stream().map(HeightRecord::getHeight).toList())
@@ -532,7 +492,7 @@
                 new HydrationRecord.Builder(getMetadata(), mStartTime, mEndTime, volume2).build(),
                 entityId2);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         final List<HydrationRecord> records = getRecords(HydrationRecord.class);
         mExpect.that(records.stream().map(HydrationRecord::getVolume).toList())
@@ -564,7 +524,7 @@
                         .build(),
                 entityId2);
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         final List<NutritionRecord> records = getRecords(NutritionRecord.class);
         mExpect.that(records.stream().map(NutritionRecord::getProtein).toList())
@@ -578,9 +538,8 @@
     }
 
     @Test
-    public void migratePermissions_hasValidPermissions_validPermissionsGranted() {
-        assumeFalse(TestUtils.isHardwareAutomotive());
-
+    public void migratePermissions_hasValidPermissions_validPermissionsGranted()
+            throws InterruptedException {
         revokeHealthPermissions(APP_PACKAGE_NAME);
 
         final String entityId = "permissions";
@@ -594,16 +553,15 @@
                                 .addPermission(INVALID_PERMISSION_2)
                                 .addPermission(WRITE_HEIGHT)
                                 .build()));
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         final List<String> grantedPermissions = getGrantedAppPermissions();
         mExpect.that(grantedPermissions).containsAtLeast(READ_HEIGHT, WRITE_HEIGHT);
         mExpect.that(grantedPermissions).containsNoneOf(INVALID_PERMISSION_1, INVALID_PERMISSION_2);
     }
 
     @Test
-    public void migratePermissions_allInvalidPermissions_throwsMigrationException() {
-        assumeFalse(TestUtils.isHardwareAutomotive());
-
+    public void migratePermissions_allInvalidPermissions_throwsMigrationException()
+            throws InterruptedException {
         revokeHealthPermissions(APP_PACKAGE_NAME);
 
         final String entityId = "permissions";
@@ -623,13 +581,14 @@
             mExpect.that(e.getFailedEntityId()).isEqualTo(entityId);
             mExpect.that(getGrantedAppPermissions())
                     .containsNoneOf(INVALID_PERMISSION_1, INVALID_PERMISSION_2);
-            finishMigration();
+            TestUtils.finishMigrationWithShellPermissionIdentity();
         }
     }
 
     /** Test metadata migration, migrating record retention period. */
     @Test
-    public void migrateMetadata_migratingRetentionPeriod_metadataSaved() {
+    public void migrateMetadata_migratingRetentionPeriod_metadataSaved()
+            throws InterruptedException {
 
         final String entityId = "metadata";
 
@@ -639,16 +598,15 @@
                         new MetadataMigrationPayload.Builder()
                                 .setRecordRetentionPeriodDays(100)
                                 .build()));
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         assertThat(getRecordRetentionPeriodInDays()).isEqualTo(100);
     }
 
     /** Test priority migration where migration payload have additional apps. */
     @Test
-    public void migratePriority_additionalAppsInMigrationPayload_prioritySaved() {
-        assumeFalse(TestUtils.isHardwareAutomotive());
-
+    public void migratePriority_additionalAppsInMigrationPayload_prioritySaved()
+            throws InterruptedException {
         revokeHealthPermissions(APP_PACKAGE_NAME);
         revokeHealthPermissions(APP_PACKAGE_NAME_2);
 
@@ -688,7 +646,7 @@
                                                 .build())
                                 .build()));
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
 
         List<String> activityPriorityList =
                 getHealthDataCategoryPriority(HealthDataCategory.BODY_MEASUREMENTS);
@@ -698,115 +656,58 @@
     }
 
     @Test
-    public void testStartMigrationFromIdleState() throws IOException {
-        try {
-            enableStateChangeJobs();
-            runWithShellPermissionIdentity(
-                    () -> {
-                        assertStateChangeJobDoesNotExist();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(MIGRATION_STATE_IDLE);
-                        TestUtils.startMigration();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
-                        assertStateChangeJobExists();
-                        TestUtils.finishMigration();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
-                        assertStateChangeJobDoesNotExist();
-                    },
-                    Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
-        } finally {
-            restoreDeviceConfigs();
-        }
+    public void testStartMigrationFromIdleState() throws IOException, InterruptedException {
+        assertStateChangeJobDoesNotExist();
+        assertThat(TestUtils.getHealthConnectDataMigrationState()).isEqualTo(MIGRATION_STATE_IDLE);
+        TestUtils.startMigrationWithShellPermissionIdentity();
+        assertThat(TestUtils.getHealthConnectDataMigrationState())
+                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
+        assertStateChangeJobExists();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
+        assertThat(TestUtils.getHealthConnectDataMigrationState())
+                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
+        assertStateChangeJobDoesNotExist();
     }
 
     @Test
-    public void testInsertMinDataMigrationSdkExtensionVersion_upgradeRequired() throws IOException {
+    public void testInsertMinDataMigrationSdkExtensionVersion_upgradeRequired()
+            throws IOException, InterruptedException {
         int version = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + 1;
-        try {
-            enableStateChangeJobs();
-            runWithShellPermissionIdentity(
-                    () -> {
-                        assertStateChangeJobDoesNotExist();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(MIGRATION_STATE_IDLE);
-                        TestUtils.insertMinDataMigrationSdkExtensionVersion(version);
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(MIGRATION_STATE_MODULE_UPGRADE_REQUIRED);
-                        assertStateChangeJobExists();
-                        TestUtils.startMigration();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
-                        assertStateChangeJobExists();
-                        TestUtils.finishMigration();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
-                        assertStateChangeJobDoesNotExist();
-                    },
-                    Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
-        } finally {
-            restoreDeviceConfigs();
-        }
+        assertStateChangeJobDoesNotExist();
+        assertThat(TestUtils.getHealthConnectDataMigrationState()).isEqualTo(MIGRATION_STATE_IDLE);
+        TestUtils.insertMinDataMigrationSdkExtensionVersionWithShellPermissionIdentity(version);
+        assertThat(TestUtils.getHealthConnectDataMigrationState())
+                .isEqualTo(MIGRATION_STATE_MODULE_UPGRADE_REQUIRED);
+        assertStateChangeJobExists();
+        TestUtils.startMigrationWithShellPermissionIdentity();
+        assertThat(TestUtils.getHealthConnectDataMigrationState())
+                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
+        assertStateChangeJobExists();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
+        assertThat(TestUtils.getHealthConnectDataMigrationState())
+                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
+        assertStateChangeJobDoesNotExist();
     }
 
     @Test
     public void testInsertMinDataMigrationSdkExtensionVersion_noUpgradeRequired()
-            throws IOException {
+            throws IOException, InterruptedException {
         int version = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.UPSIDE_DOWN_CAKE);
-        try {
-            enableStateChangeJobs();
-            runWithShellPermissionIdentity(
-                    () -> {
-                        assertStateChangeJobDoesNotExist();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(MIGRATION_STATE_IDLE);
-                        TestUtils.insertMinDataMigrationSdkExtensionVersion(version);
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(MIGRATION_STATE_ALLOWED);
-                        assertStateChangeJobExists();
-                        TestUtils.startMigration();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
-                        assertStateChangeJobExists();
-                        TestUtils.finishMigration();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
-                        assertStateChangeJobDoesNotExist();
-                    },
-                    Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
-        } finally {
-            restoreDeviceConfigs();
-        }
-    }
 
-    @Test
-    public void testInsertMinDataMigrationSdkExtensionVersion_jobsDisabled() throws IOException {
-        int version = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.UPSIDE_DOWN_CAKE);
-        try {
-            disableStateChangeJobs();
-            runWithShellPermissionIdentity(
-                    () -> {
-                        assertStateChangeJobDoesNotExist();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(MIGRATION_STATE_IDLE);
-                        TestUtils.insertMinDataMigrationSdkExtensionVersion(version);
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(MIGRATION_STATE_ALLOWED);
-                        assertStateChangeJobDoesNotExist();
-                        TestUtils.startMigration();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
-                        assertStateChangeJobDoesNotExist();
-                        TestUtils.finishMigration();
-                        assertThat(TestUtils.getHealthConnectDataMigrationState())
-                                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
-                        assertStateChangeJobDoesNotExist();
-                    },
-                    Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
-        } finally {
-            restoreDeviceConfigs();
-        }
+        assertStateChangeJobDoesNotExist();
+        assertThat(TestUtils.getHealthConnectDataMigrationState()).isEqualTo(MIGRATION_STATE_IDLE);
+        TestUtils.insertMinDataMigrationSdkExtensionVersionWithShellPermissionIdentity(version);
+        assertThat(TestUtils.getHealthConnectDataMigrationState())
+                .isEqualTo(MIGRATION_STATE_ALLOWED);
+        assertStateChangeJobExists();
+        TestUtils.startMigrationWithShellPermissionIdentity();
+        assertThat(TestUtils.getHealthConnectDataMigrationState())
+                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
+        assertStateChangeJobExists();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
+        assertThat(TestUtils.getHealthConnectDataMigrationState())
+                .isEqualTo(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
+        assertStateChangeJobDoesNotExist();
     }
 
     @Test
@@ -831,7 +732,7 @@
                                 .setAppIcon(iconBytes)
                                 .build()));
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         // When recordTypes are modified the appInfo also gets updated and this update happens on
         // a background thread. To ensure the test has the latest values for appInfo, add a wait
         // time before fetching it.
@@ -844,7 +745,8 @@
     }
 
     @Test
-    public void migrateAppInfo_notInstalledAppAndRecordsNotMigrated_appInfoNotSaved() {
+    public void migrateAppInfo_notInstalledAppAndRecordsNotMigrated_appInfoNotSaved()
+            throws InterruptedException {
         final String entityId = "appInfo";
         final Bitmap icon = Bitmap.createBitmap(128, 128, Bitmap.Config.ARGB_8888);
         final byte[] iconBytes = getBitmapBytes(icon);
@@ -857,7 +759,7 @@
                                 .setAppIcon(iconBytes)
                                 .build()));
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         final AppInfo appInfo = getContributorApplicationInfo(PACKAGE_NAME_NOT_INSTALLED);
 
         assertThat(appInfo).isNull();
@@ -886,7 +788,7 @@
                                 .setAppIcon(iconBytes)
                                 .build()));
 
-        finishMigration();
+        TestUtils.finishMigrationWithShellPermissionIdentity();
         // When recordTypes are modified the appInfo also gets updated and this update happens on
         // a background thread. To ensure the test has the latest values for appInfo, add a wait
         // time before fetching it.
@@ -925,48 +827,6 @@
         mStateChangeJobAdbDumpsys = output.toString();
     }
 
-    private String getHealthFitnessDeviceConfig(String key, String defaultValue)
-            throws IOException {
-        String value = TestUtils.runShellCommand("device_config get health_fitness " + key);
-        return value.isBlank() ? defaultValue : value.strip();
-    }
-
-    private void enableStateChangeJobs() throws IOException {
-        mEnableCompletionJobsBackup =
-                getHealthFitnessDeviceConfig(
-                        ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG,
-                        ENABLE_COMPLETE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE);
-        mEnablePauseJobsBackup =
-                getHealthFitnessDeviceConfig(
-                        ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG,
-                        ENABLE_PAUSE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE);
-        setHealthFitnessDeviceConfig(ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG, "true");
-        setHealthFitnessDeviceConfig(ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG, "true");
-    }
-
-    private void disableStateChangeJobs() throws IOException {
-        mEnableCompletionJobsBackup =
-                getHealthFitnessDeviceConfig(
-                        ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG,
-                        ENABLE_COMPLETE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE);
-        mEnablePauseJobsBackup =
-                getHealthFitnessDeviceConfig(
-                        ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG,
-                        ENABLE_PAUSE_STATE_CHANGE_JOB_DEFAULT_FLAG_VALUE);
-        setHealthFitnessDeviceConfig(ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG, "false");
-        setHealthFitnessDeviceConfig(ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG, "false");
-    }
-
-    private void restoreDeviceConfigs() throws IOException {
-        setHealthFitnessDeviceConfig(
-                ENABLE_COMPLETE_STATE_CHANGE_JOBS_FLAG, mEnableCompletionJobsBackup);
-        setHealthFitnessDeviceConfig(ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG, mEnablePauseJobsBackup);
-    }
-
-    private void setHealthFitnessDeviceConfig(String key, String value) throws IOException {
-        TestUtils.runShellCommand("device_config put health_fitness " + key + " " + value);
-    }
-
     private void assertStateChangeJobExists() throws IOException {
         boolean checkJobExists = checkJobExists();
         assertWithMessage(
@@ -987,24 +847,17 @@
                 .isFalse();
     }
 
-    private void migrate(MigrationEntity... entities) {
-        DataMigrationTest.<Void, MigrationException>blockingCallWithPermissions(
-                callback -> mManager.startMigration(mOutcomeExecutor, callback),
-                Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
-
-        DataMigrationTest.<Void, MigrationException>blockingCallWithPermissions(
-                callback ->
-                        mManager.writeMigrationData(List.of(entities), mOutcomeExecutor, callback),
-                Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
+    private void migrate(MigrationEntity... entities) throws InterruptedException {
+        TestUtils.startMigrationWithShellPermissionIdentity();
+        Void unused =
+                callAndGetResponseWithShellPermissionIdentity(
+                        MigrationException.class,
+                        (executor, receiver) ->
+                                mManager.writeMigrationData(List.of(entities), executor, receiver),
+                        Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
     }
 
-    private void finishMigration() {
-        DataMigrationTest.<Void, MigrationException>blockingCallWithPermissions(
-                callback -> mManager.finishMigration(mOutcomeExecutor, callback),
-                Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
-    }
-
-    private void migrate(Record record, String entityId) {
+    private void migrate(Record record, String entityId) throws InterruptedException {
         migrate(getRecordEntity(record, entityId));
     }
 
@@ -1018,44 +871,8 @@
                         .build());
     }
 
-    private <T extends Record> List<T> getRecords(Class<T> clazz) {
-        final Consumer<OutcomeReceiver<ReadRecordsResponse<T>, HealthConnectException>> action =
-                callback -> getRecordsAsync(clazz, callback);
-
-        final ReadRecordsResponse<T> response =
-                blockingCallWithPermissions(
-                        action, HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION);
-
-        return response.getRecords();
-    }
-
-    private <T extends Record> T getRecord(Class<T> clazz, String clientRecordId) {
-        return getRecord(
-                new ReadRecordsRequestUsingIds.Builder<>(clazz)
-                        .addClientRecordId(clientRecordId)
-                        .build());
-    }
-
-    private <T extends Record> T getRecord(Class<T> clazz, UUID uuid) {
-        return getRecord(
-                new ReadRecordsRequestUsingIds.Builder<>(clazz).addId(uuid.toString()).build());
-    }
-
-    private <T extends Record> T getRecord(ReadRecordsRequest<T> request) {
-        final Consumer<OutcomeReceiver<ReadRecordsResponse<T>, HealthConnectException>> action =
-                callback -> mManager.readRecords(request, mOutcomeExecutor, callback);
-
-        final ReadRecordsResponse<T> response =
-                blockingCallWithPermissions(
-                        action, HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION);
-
-        return response.getRecords().stream().findFirst().orElse(null);
-    }
-
-    private <T extends Record> void getRecordsAsync(
-            Class<T> clazz,
-            OutcomeReceiver<ReadRecordsResponse<T>, HealthConnectException> callback) {
-        mManager.readRecords(
+    private <T extends Record> List<T> getRecords(Class<T> clazz) throws InterruptedException {
+        ReadRecordsRequestUsingFilters<T> request =
                 new ReadRecordsRequestUsingFilters.Builder<>(clazz)
                         .setTimeRangeFilter(
                                 new TimeInstantRangeFilter.Builder()
@@ -1066,33 +883,34 @@
                                         // amount of ms.
                                         .setEndTime(mEndTime.plusMillis(1))
                                         .build())
-                        .build(),
-                mOutcomeExecutor,
-                callback);
+                        .build();
+        ReadRecordsResponse<T> response =
+                callAndGetResponseWithShellPermissionIdentity(
+                        (executor, receiver) -> mManager.readRecords(request, executor, receiver),
+                        HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION);
+        return response.getRecords();
     }
 
-    private void deleteAllRecords() {
-        runWithShellPermissionIdentity(
-                () -> blockingCall(this::deleteAllRecordsAsync),
-                HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION);
+    private <T extends Record> T getRecord(Class<T> clazz, String clientRecordId)
+            throws InterruptedException {
+        return getRecord(
+                new ReadRecordsRequestUsingIds.Builder<>(clazz)
+                        .addClientRecordId(clientRecordId)
+                        .build());
     }
 
-    private void deleteAllRecordsAsync(OutcomeReceiver<Void, HealthConnectException> callback) {
-        mManager.deleteRecords(
-                new DeleteUsingFiltersRequest.Builder()
-                        .addDataOrigin(
-                                new DataOrigin.Builder().setPackageName(APP_PACKAGE_NAME).build())
-                        .build(),
-                mOutcomeExecutor,
-                callback);
+    private <T extends Record> T getRecord(Class<T> clazz, UUID uuid) throws InterruptedException {
+        return getRecord(
+                new ReadRecordsRequestUsingIds.Builder<>(clazz).addId(uuid.toString()).build());
     }
 
-    private void deleteAllStagedRemoteData() {
-        runWithShellPermissionIdentity(
-                () ->
-                        // TODO(b/241542162): Avoid reflection once TestApi can be called from CTS
-                        mManager.getClass().getMethod("deleteAllStagedRemoteData").invoke(mManager),
-                "android.permission.DELETE_STAGED_HEALTH_CONNECT_REMOTE_DATA");
+    private <T extends Record> T getRecord(ReadRecordsRequest<T> request)
+            throws InterruptedException {
+        ReadRecordsResponse<T> response =
+                callAndGetResponseWithShellPermissionIdentity(
+                        (executor, receiver) -> mManager.readRecords(request, executor, receiver),
+                        HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION);
+        return response.getRecords().stream().findFirst().orElse(null);
     }
 
     private void revokeHealthPermissions(String packageName) {
@@ -1150,61 +968,18 @@
                                         APP_PACKAGE_NAME, PackageInfoFlags.of(GET_PERMISSIONS)));
     }
 
-    private AppInfo getContributorApplicationInfo(String packageName) {
-        return getContributorApplicationsInfo().stream()
+    private AppInfo getContributorApplicationInfo(String packageName) throws InterruptedException {
+        return getContributorApplicationInfos().stream()
                 .filter(ai -> ai.getPackageName().equals(packageName))
                 .findFirst()
                 .orElse(null);
     }
 
-    private List<AppInfo> getContributorApplicationsInfo() {
-        final ApplicationInfoResponse response =
-                runWithShellPermissionIdentity(
-                        () -> blockingCall(this::getContributorApplicationsInfoAsync));
-        return response.getApplicationInfoList();
-    }
-
-    private void getContributorApplicationsInfoAsync(
-            OutcomeReceiver<ApplicationInfoResponse, HealthConnectException> callback) {
-        mManager.getContributorApplicationsInfo(mOutcomeExecutor, callback);
-    }
-
-    @SuppressWarnings("NewClassNamingConvention") // False positive
-    private static class BlockingOutcomeReceiver<T, E extends Throwable>
-            implements OutcomeReceiver<T, E> {
-        private final Object[] mResult = new Object[1];
-        private final Throwable[] mError = new Throwable[1];
-        private final CountDownLatch mCountDownLatch = new CountDownLatch(1);
-
-        @Override
-        public void onResult(T result) {
-            mResult[0] = result;
-            mCountDownLatch.countDown();
-        }
-
-        @Override
-        public void onError(E error) {
-            mError[0] = error;
-            mCountDownLatch.countDown();
-        }
-
-        public T await() throws E {
-            try {
-                if (!mCountDownLatch.await(10, TimeUnit.SECONDS)) {
-                    throw new RuntimeException("Timeout waiting for outcome");
-                }
-
-                if (mError[0] != null) {
-                    //noinspection unchecked
-                    throw (E) mError[0];
-                }
-
-                //noinspection unchecked
-                return (T) mResult[0];
-            } catch (InterruptedException e) {
-                throw new RuntimeException(e);
-            }
-        }
+    private List<AppInfo> getContributorApplicationInfos() throws InterruptedException {
+        return callAndGetResponseWithShellPermissionIdentity(
+                        mManager::getContributorApplicationsInfo,
+                        HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION)
+                .getApplicationInfoList();
     }
 
     /**
@@ -1231,33 +1006,17 @@
      * @param dataCategory category for which priority is being fetched
      * @return list of packages ordered in priority.
      */
-    private List<String> getHealthDataCategoryPriority(int dataCategory) {
-        return runWithShellPermissionIdentity(
-                () ->
-                        DataMigrationTest
-                                .<FetchDataOriginsPriorityOrderResponse, HealthConnectException>
-                                        blockingCall(
-                                                callback ->
-                                                        getHealthDataCategoryPriorityAsync(
-                                                                dataCategory, callback))
-                                .getDataOriginsPriorityOrder()
-                                .stream()
-                                .map(dataOrigin -> dataOrigin.getPackageName())
-                                .collect(Collectors.toList()),
-                HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION);
-    }
-
-    /**
-     * Fetches data category's priority of packages asynchronously
-     *
-     * @param dataCategory category for which priority is being fetched
-     * @param callback called after receiving results.
-     */
-    private void getHealthDataCategoryPriorityAsync(
-            int dataCategory,
-            OutcomeReceiver<FetchDataOriginsPriorityOrderResponse, HealthConnectException>
-                    callback) {
-        mManager.fetchDataOriginsPriorityOrder(dataCategory, newSingleThreadExecutor(), callback);
+    private List<String> getHealthDataCategoryPriority(int dataCategory)
+            throws InterruptedException {
+        FetchDataOriginsPriorityOrderResponse response =
+                callAndGetResponseWithShellPermissionIdentity(
+                        (executor, receiver) ->
+                                mManager.fetchDataOriginsPriorityOrder(
+                                        dataCategory, executor, receiver),
+                        HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION);
+        return response.getDataOriginsPriorityOrder().stream()
+                .map(DataOrigin::getPackageName)
+                .collect(Collectors.toList());
     }
 
     /**
diff --git a/tests/cts/src/android/healthconnect/cts/nopermission/ActivityIntensityNoPermissionsDeclaredTest.java b/tests/cts/src/android/healthconnect/cts/nopermission/ActivityIntensityNoPermissionsDeclaredTest.java
new file mode 100644
index 0000000..093f32a
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/nopermission/ActivityIntensityNoPermissionsDeclaredTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.nopermission;
+
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.healthconnect.cts.lib.ActivityIntensityRecordFactory;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+
+import org.junit.runner.RunWith;
+
+@AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
+@RunWith(AndroidJUnit4.class)
+@RequiresFlagsEnabled({
+    Flags.FLAG_ACTIVITY_INTENSITY,
+    Flags.FLAG_ACTIVITY_INTENSITY_DB,
+    Flags.FLAG_HEALTH_CONNECT_MAPPINGS
+})
+public class ActivityIntensityNoPermissionsDeclaredTest
+        extends BaseNoPermissionsDeclaredTest<ActivityIntensityRecord> {
+    public ActivityIntensityNoPermissionsDeclaredTest() {
+        super(ActivityIntensityRecord.class, new ActivityIntensityRecordFactory());
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/nopermission/BaseNoPermissionsDeclaredTest.java b/tests/cts/src/android/healthconnect/cts/nopermission/BaseNoPermissionsDeclaredTest.java
new file mode 100644
index 0000000..be6e5c8
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/nopermission/BaseNoPermissionsDeclaredTest.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.nopermission;
+
+import static android.healthconnect.cts.utils.PermissionHelper.getDeclaredHealthPermissions;
+import static android.healthconnect.cts.utils.TestUtils.getChangeLogToken;
+import static android.healthconnect.cts.utils.TestUtils.insertRecords;
+import static android.healthconnect.cts.utils.TestUtils.readRecords;
+import static android.healthconnect.cts.utils.TestUtils.updateRecords;
+import static android.healthconnect.cts.utils.TestUtils.verifyDeleteRecords;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.HealthConnectException;
+import android.health.connect.ReadRecordsRequestUsingFilters;
+import android.health.connect.ReadRecordsRequestUsingIds;
+import android.health.connect.RecordIdFilter;
+import android.health.connect.TimeInstantRangeFilter;
+import android.health.connect.changelog.ChangeLogTokenRequest;
+import android.health.connect.datatypes.Record;
+import android.healthconnect.cts.lib.RecordFactory;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.TestUtils;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.List;
+import java.util.UUID;
+
+abstract class BaseNoPermissionsDeclaredTest<T extends Record> {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private static final ZonedDateTime YESTERDAY_11AM =
+            LocalDate.now(ZoneId.systemDefault())
+                    .minusDays(1)
+                    .atTime(11, 0)
+                    .atZone(ZoneId.systemDefault());
+
+    private final Class<T> mRecordClass;
+    private final RecordFactory<T> mRecordFactory;
+
+    BaseNoPermissionsDeclaredTest(Class<T> recordClass, RecordFactory<T> recordFactory) {
+        mRecordClass = recordClass;
+        mRecordFactory = recordFactory;
+    }
+
+    @Before
+    public void setUp() throws InterruptedException {
+        assertThat(getDeclaredHealthPermissions(getTestPackageName())).isEmpty();
+        TestUtils.deleteAllStagedRemoteData();
+    }
+
+    @After
+    public void tearDown() throws InterruptedException {
+        TestUtils.deleteAllStagedRemoteData();
+    }
+
+    @Test
+    public void insertRecords_returnsSecurityError() {
+        Record record =
+                mRecordFactory.newEmptyRecord(
+                        RecordFactory.newEmptyMetadata(),
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusMinutes(30).toInstant());
+
+        HealthConnectException e =
+                assertThrows(HealthConnectException.class, () -> insertRecords(record));
+        assertThat(e.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    public void updateRecords_returnsSecurityError() {
+        Record record =
+                mRecordFactory.newEmptyRecord(
+                        RecordFactory.newEmptyMetadataWithId(UUID.randomUUID().toString()),
+                        YESTERDAY_11AM.toInstant(),
+                        YESTERDAY_11AM.plusMinutes(30).toInstant());
+
+        HealthConnectException e =
+                assertThrows(HealthConnectException.class, () -> updateRecords(List.of(record)));
+        assertThat(e.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    public void deleteRecordsById_returnsSecurityError() {
+        HealthConnectException e =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                verifyDeleteRecords(
+                                        List.of(RecordIdFilter.fromId(mRecordClass, "record-id"))));
+        assertThat(e.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    public void deleteRecordsUsingFilter_returnsSecurityError() {
+        HealthConnectException e =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                verifyDeleteRecords(
+                                        mRecordClass,
+                                        new TimeInstantRangeFilter.Builder()
+                                                .setStartTime(YESTERDAY_11AM.toInstant())
+                                                .setEndTime(YESTERDAY_11AM.plusHours(2).toInstant())
+                                                .build()));
+        assertThat(e.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    public void getChangeLogToken_returnsSecurityError() {
+        HealthConnectException e =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                getChangeLogToken(
+                                        new ChangeLogTokenRequest.Builder()
+                                                .addRecordType(mRecordClass)
+                                                .build()));
+        assertThat(e.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    public void readRecordsUsingFilters_returnsSecurityError() {
+        HealthConnectException e =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                readRecords(
+                                        new ReadRecordsRequestUsingFilters.Builder<>(mRecordClass)
+                                                .build()));
+        assertThat(e.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    public void readRecordsById_returnsSecurityError() {
+        HealthConnectException e =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                readRecords(
+                                        new ReadRecordsRequestUsingIds.Builder<>(mRecordClass)
+                                                .addId("record-id")
+                                                .build()));
+        assertThat(e.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    public void readRecordsByClientId_returnsSecurityError() {
+        HealthConnectException e =
+                assertThrows(
+                        HealthConnectException.class,
+                        () ->
+                                readRecords(
+                                        new ReadRecordsRequestUsingIds.Builder<>(mRecordClass)
+                                                .addClientRecordId("client-record-id")
+                                                .build()));
+        assertThat(e.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    private static String getTestPackageName() {
+        return ApplicationProvider.getApplicationContext().getPackageName();
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/nopermission/HealthConnectManagerNoPermissionsGrantedTest.java b/tests/cts/src/android/healthconnect/cts/nopermission/HealthConnectManagerNoPermissionsGrantedTest.java
index 998e9f8..b35dc33 100644
--- a/tests/cts/src/android/healthconnect/cts/nopermission/HealthConnectManagerNoPermissionsGrantedTest.java
+++ b/tests/cts/src/android/healthconnect/cts/nopermission/HealthConnectManagerNoPermissionsGrantedTest.java
@@ -24,7 +24,6 @@
 import static android.health.connect.HealthPermissions.READ_TOTAL_CALORIES_BURNED;
 import static android.health.connect.datatypes.DistanceRecord.DISTANCE_TOTAL;
 import static android.health.connect.datatypes.ExerciseSessionRecord.EXERCISE_DURATION_TOTAL;
-import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
 import static android.health.connect.datatypes.HeartRateRecord.BPM_MAX;
 import static android.health.connect.datatypes.SleepSessionRecord.SLEEP_DURATION_TOTAL;
 import static android.health.connect.datatypes.StepsRecord.STEPS_COUNT_TOTAL;
@@ -41,11 +40,6 @@
 import static android.healthconnect.cts.utils.DataFactory.getTotalCaloriesBurnedRecordWithEmptyMetadata;
 import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
 import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
 import static android.healthconnect.cts.utils.TestUtils.deleteRecords;
 import static android.healthconnect.cts.utils.TestUtils.getAggregateResponse;
 import static android.healthconnect.cts.utils.TestUtils.getAggregateResponseGroupByDuration;
@@ -56,22 +50,16 @@
 import static android.healthconnect.cts.utils.TestUtils.updateRecords;
 import static android.healthconnect.cts.utils.TestUtils.verifyDeleteRecords;
 
-import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static java.time.temporal.ChronoUnit.DAYS;
 
 import android.health.connect.AggregateRecordsRequest;
-import android.health.connect.CreateMedicalDataSourceRequest;
 import android.health.connect.HealthConnectException;
-import android.health.connect.HealthConnectManager;
 import android.health.connect.LocalTimeRangeFilter;
-import android.health.connect.MedicalResourceId;
 import android.health.connect.ReadRecordsRequestUsingFilters;
 import android.health.connect.ReadRecordsRequestUsingIds;
 import android.health.connect.TimeInstantRangeFilter;
-import android.health.connect.UpsertMedicalResourceRequest;
 import android.health.connect.changelog.ChangeLogTokenRequest;
 import android.health.connect.changelog.ChangeLogsRequest;
 import android.health.connect.datatypes.AggregationType;
@@ -79,8 +67,6 @@
 import android.health.connect.datatypes.DistanceRecord;
 import android.health.connect.datatypes.ExerciseSessionRecord;
 import android.health.connect.datatypes.HeartRateRecord;
-import android.health.connect.datatypes.MedicalDataSource;
-import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.Record;
 import android.health.connect.datatypes.SleepSessionRecord;
 import android.health.connect.datatypes.StepsRecord;
@@ -88,10 +74,8 @@
 import android.healthconnect.cts.lib.MindfulnessSessionRecordFactory;
 import android.healthconnect.cts.lib.TestAppProxy;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
-import android.healthconnect.cts.utils.HealthConnectReceiver;
 import android.healthconnect.cts.utils.TestUtils;
 import android.platform.test.annotations.AppModeFull;
-import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.util.Pair;
@@ -111,8 +95,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 
 /** These test run under an environment which has no HC permissions */
 @AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
@@ -126,7 +108,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Rule
     public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@@ -397,71 +380,6 @@
         }
     }
 
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testReadMedicalResources_noPermission_expectError() throws InterruptedException {
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-
-        manager.readMedicalResources(
-                List.of(new MedicalResourceId("123", FHIR_RESOURCE_TYPE_IMMUNIZATION, "456")),
-                Executors.newSingleThreadExecutor(),
-                receiver);
-
-        HealthConnectException exception = receiver.assertAndGetException();
-        assertThat(exception.getErrorCode()).isEqualTo(HealthConnectException.ERROR_SECURITY);
-        assertThat(exception.getMessage())
-                .contains("Caller doesn't have permission to read or write medical data");
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void createMedicalDataSource_noPermission_expectError() throws InterruptedException {
-        CreateMedicalDataSourceRequest request =
-                new CreateMedicalDataSourceRequest.Builder(
-                                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME)
-                        .build();
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-
-        manager.createMedicalDataSource(request, executor, receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_SECURITY);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void upsertMedicalResources_noPermission_expectError() throws InterruptedException {
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        UpsertMedicalResourceRequest request =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
-                        .build();
-
-        manager.upsertMedicalResources(
-                List.of(request), Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_SECURITY);
-    }
-
-    @Test
-    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD)
-    public void deleteMedicalResourcesByIds_noPermission_expectError() throws InterruptedException {
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        List<MedicalResourceId> ids =
-                List.of(new MedicalResourceId("123", FHIR_RESOURCE_TYPE_IMMUNIZATION, "456"));
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-
-        manager.deleteMedicalResources(ids, Executors.newSingleThreadExecutor(), receiver);
-
-        assertThat(receiver.assertAndGetException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_SECURITY);
-    }
-
     private static List<Record> getTestRecords() {
         return Arrays.asList(
                 getStepsRecord(),
diff --git a/tests/cts/src/android/healthconnect/cts/nopermission/HealthConnectManagerNotAllPermissionsAreGrantedTest.java b/tests/cts/src/android/healthconnect/cts/nopermission/HealthConnectManagerNotAllPermissionsAreGrantedTest.java
index 120c96f..f7dd191 100644
--- a/tests/cts/src/android/healthconnect/cts/nopermission/HealthConnectManagerNotAllPermissionsAreGrantedTest.java
+++ b/tests/cts/src/android/healthconnect/cts/nopermission/HealthConnectManagerNotAllPermissionsAreGrantedTest.java
@@ -73,7 +73,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Test
     public void testInsert_somePermissionsAreNotGranted_expectError() throws InterruptedException {
diff --git a/tests/cts/src/android/healthconnect/cts/ratelimiter/RateLimiterTest.java b/tests/cts/src/android/healthconnect/cts/ratelimiter/RateLimiterTest.java
index 787b117..c56b127 100644
--- a/tests/cts/src/android/healthconnect/cts/ratelimiter/RateLimiterTest.java
+++ b/tests/cts/src/android/healthconnect/cts/ratelimiter/RateLimiterTest.java
@@ -20,64 +20,42 @@
 import static android.healthconnect.cts.utils.DataFactory.buildDevice;
 import static android.healthconnect.cts.utils.DataFactory.getCompleteStepsRecord;
 import static android.healthconnect.cts.utils.DataFactory.getUpdatedStepsRecord;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
-import static android.healthconnect.cts.utils.PhrDataFactory.getUpsertMedicalResourceRequest;
-
-import static com.android.healthfitness.flags.Flags.FLAG_DEVELOPMENT_DATABASE;
-import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertThrows;
 
-import android.app.UiAutomation;
 import android.content.Context;
 import android.health.connect.AggregateRecordsRequest;
-import android.health.connect.CreateMedicalDataSourceRequest;
-import android.health.connect.DeleteMedicalResourcesRequest;
 import android.health.connect.DeleteUsingFiltersRequest;
 import android.health.connect.HealthConnectException;
-import android.health.connect.HealthConnectManager;
-import android.health.connect.MedicalResourceId;
 import android.health.connect.ReadRecordsRequestUsingFilters;
 import android.health.connect.ReadRecordsRequestUsingIds;
 import android.health.connect.TimeInstantRangeFilter;
-import android.health.connect.UpsertMedicalResourceRequest;
 import android.health.connect.changelog.ChangeLogTokenRequest;
 import android.health.connect.changelog.ChangeLogTokenResponse;
 import android.health.connect.changelog.ChangeLogsRequest;
 import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.Device;
 import android.health.connect.datatypes.HeartRateRecord;
-import android.health.connect.datatypes.MedicalDataSource;
-import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.Metadata;
 import android.health.connect.datatypes.Record;
 import android.health.connect.datatypes.StepsRecord;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
-import android.healthconnect.cts.utils.HealthConnectReceiver;
-import android.healthconnect.cts.utils.PhrDataFactory;
 import android.healthconnect.cts.utils.TestUtils;
 import android.platform.test.annotations.AppModeFull;
-import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
-import android.provider.DeviceConfig;
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.compatibility.common.util.ApiTest;
-import com.android.modules.utils.build.SdkLevel;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
 
 import java.time.Duration;
@@ -87,8 +65,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.Executors;
 
 @AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
 @RunWith(AndroidJUnit4.class)
@@ -97,21 +73,17 @@
     private static final int MAX_FOREGROUND_WRITE_CALL_15M = 1000;
     private static final int MAX_FOREGROUND_READ_CALL_15M = 2000;
     private static final Duration WINDOW_15M = Duration.ofMinutes(15);
-    public static final String ENABLE_RATE_LIMITER_FLAG = "enable_rate_limiter";
-    private final UiAutomation mUiAutomation =
-            InstrumentationRegistry.getInstrumentation().getUiAutomation();
 
     @Rule
     public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
 
-    @Rule public ExpectedException exception = ExpectedException.none();
-
     private int mLimitsAdjustmentForTesting = 1;
 
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws InterruptedException {
@@ -142,78 +114,37 @@
 
     @Test
     @ApiTest(apis = {"android.health.connect#insertRecords"})
-    public void testTryAcquireApiCallQuota_insertRecords_writeLimitExceeded()
-            throws InterruptedException {
-        exception.expect(HealthConnectException.class);
-        exception.expectMessage(containsString("API call quota exceeded"));
-        exceedWriteQuotaWithInsertRecords();
-    }
-
-    @Test
-    @ApiTest(apis = {"android.health.connect#createMedicalDataSource"})
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testTryAcquireApiCallQuota_createMedicalDataSource_writeLimitExceeded()
-            throws InterruptedException {
-        exception.expect(HealthConnectException.class);
-        exception.expectMessage(containsString("API call quota exceeded"));
-        exceedWriteQuotaWithCreateMedicalDataSource();
-    }
-
-    @Test
-    @ApiTest(apis = {"android.health.connect#deleteMedicalResource"})
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testTryAcquireApiCallQuota_deleteMedicalResourcesById_writeLimitExceeded()
-            throws InterruptedException {
-        exception.expect(HealthConnectException.class);
-        exception.expectMessage(containsString("API call quota exceeded"));
-        exceedWriteQuotaWithDeleteMedicalDataSourceByIds();
-    }
-
-    @Test
-    @ApiTest(apis = {"android.health.connect#deleteMedicalResource"})
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testTryAcquireApiCallQuota_deleteMedicalResourcesByRequest_writeLimitExceeded()
-            throws InterruptedException {
-        exception.expect(HealthConnectException.class);
-        exception.expectMessage(containsString("API call quota exceeded"));
-        exceedWriteQuotaWithDeleteMedicalDataSourceByRequest();
-    }
-
-    @Test
-    @ApiTest(apis = {"android.health.connect#upsertMedicalResources"})
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testTryAcquireApiCallQuota_upsertMedicalResources_writeLimitExceeded_throws() {
-        HealthConnectException thrown =
+    public void testTryAcquireApiCallQuota_insertRecords_writeLimitExceeded() {
+        HealthConnectException exception =
                 assertThrows(
-                        HealthConnectException.class,
-                        this::exceedWriteQuotaWithUpsertMedicalResources);
-        assertThat(thrown.getMessage()).contains("API call quota exceeded");
+                        HealthConnectException.class, () -> exceedWriteQuotaWithInsertRecords());
+        assertThat(exception).hasMessageThat().contains("API call quota exceeded");
     }
 
-    // TODO(b/348191816): Add rate limit tests for readMedicalResources, MemoryRollingQuota, and
-    // calling from background.
-
     @Test
     @ApiTest(apis = {"android.health.connect#readRecords"})
     public void testTryAcquireApiCallQuota_readLimitExceeded() throws InterruptedException {
-        exception.expect(HealthConnectException.class);
-        exception.expectMessage(containsString("API call quota exceeded"));
-        exceedReadQuota();
+        HealthConnectException exception =
+                assertThrows(HealthConnectException.class, this::exceedReadQuota);
+        assertThat(exception).hasMessageThat().contains("API call quota exceeded");
     }
 
     @Test
     public void testRecordsChunkSizeLimitExceeded() throws InterruptedException {
-        exception.expect(HealthConnectException.class);
-        exception.expectMessage(containsString("Records chunk size exceeded the max chunk limit"));
-        exceedChunkMemoryQuota();
+        HealthConnectException exception =
+                assertThrows(HealthConnectException.class, this::exceedChunkMemoryQuota);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains("Records chunk size exceeded the max chunk limit");
     }
 
     @Test
     public void testRecordSizeLimitExceeded() throws InterruptedException {
-        exception.expect(HealthConnectException.class);
-        exception.expectMessage(
-                containsString("Record size exceeded the single record size limit"));
-        exceedRecordMemoryQuota();
+        HealthConnectException exception =
+                assertThrows(HealthConnectException.class, this::exceedRecordMemoryQuota);
+        assertThat(exception)
+                .hasMessageThat()
+                .contains("Record size exceeded the single record size limit");
     }
 
     @Test
@@ -224,46 +155,6 @@
         exceedRecordMemoryRollingQuotaBackgroundLimit();
     }
 
-    // TODO(b/346256048): re-evaluate the "magic number"s in the tests below once we turn on the PHR
-    // flags on pre/post submit.
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testMedicalResourcesChunkSizeLimitExceeded() throws InterruptedException {
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        int nCopies = 1000 / mLimitsAdjustmentForTesting;
-        UpsertMedicalResourceRequest request =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID, FHIR_VERSION_R4, "UpsertMedicalResourceRequest")
-                        .build();
-        List<UpsertMedicalResourceRequest> requests = Collections.nCopies(nCopies, request);
-
-        manager.upsertMedicalResources(requests, Executors.newSingleThreadExecutor(), receiver);
-
-        HealthConnectException thrown = receiver.assertAndGetException();
-        assertThat(thrown.getMessage()).contains("Records chunk size exceeded the max chunk limit");
-    }
-
-    @Test
-    @RequiresFlagsEnabled({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
-    public void testMedicalResourceSizeLimitExceeded() throws InterruptedException {
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-        int nCharacters = 200000 / mLimitsAdjustmentForTesting;
-        List<Character> data = Collections.nCopies(nCharacters, '0');
-        UpsertMedicalResourceRequest request =
-                new UpsertMedicalResourceRequest.Builder(
-                                DATA_SOURCE_ID, FHIR_VERSION_R4, data.toString())
-                        .build();
-
-        manager.upsertMedicalResources(
-                List.of(request), Executors.newSingleThreadExecutor(), receiver);
-
-        HealthConnectException thrown = receiver.assertAndGetException();
-        assertThat(thrown.getMessage())
-                .contains("Record size exceeded the single record size limit");
-    }
-
     private void exceedChunkMemoryQuota() throws InterruptedException {
         List<Record> testRecord = Collections.nCopies(30000, getCompleteStepsRecord());
 
@@ -320,101 +211,6 @@
         }
     }
 
-    private void exceedWriteQuotaWithCreateMedicalDataSource() throws InterruptedException {
-        float quotaAcquired = acquireCallQuotaForWrite();
-        HealthConnectReceiver<MedicalDataSource> receiver = new HealthConnectReceiver<>();
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        int count = 0;
-
-        while (quotaAcquired > 1) {
-            count++;
-            // Append request count to the fhir base uri to avoid duplicates.
-            CreateMedicalDataSourceRequest request =
-                    PhrDataFactory.getCreateMedicalDataSourceRequest(String.valueOf(count));
-            manager.createMedicalDataSource(request, Executors.newSingleThreadExecutor(), receiver);
-            receiver.verifyNoExceptionOrThrow();
-            quotaAcquired--;
-        }
-        int tryWriteWithBuffer = 20;
-        while (tryWriteWithBuffer > 0) {
-            count++;
-            CreateMedicalDataSourceRequest request =
-                    PhrDataFactory.getCreateMedicalDataSourceRequest(String.valueOf(count));
-            manager.createMedicalDataSource(request, Executors.newSingleThreadExecutor(), receiver);
-            receiver.verifyNoExceptionOrThrow();
-            tryWriteWithBuffer--;
-        }
-    }
-
-    private void exceedWriteQuotaWithDeleteMedicalDataSourceByIds() throws InterruptedException {
-        float quotaAcquired = acquireCallQuotaForWrite();
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        // We will try to delete an id that doesn't exist. This doesn't matter.
-        List<MedicalResourceId> request = List.of(PhrDataFactory.getMedicalResourceId());
-
-        while (quotaAcquired > 1) {
-            // Using a non-existent id is fine for quota check.
-            manager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
-            receiver.verifyNoExceptionOrThrow();
-            quotaAcquired--;
-        }
-        int tryWriteWithBuffer = 20;
-        while (tryWriteWithBuffer > 0) {
-            // Using a non-existent id is fine for quota check.
-            manager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
-            receiver.verifyNoExceptionOrThrow();
-            tryWriteWithBuffer--;
-        }
-    }
-
-    private void exceedWriteQuotaWithDeleteMedicalDataSourceByRequest()
-            throws InterruptedException {
-        float quotaAcquired = acquireCallQuotaForWrite();
-        HealthConnectReceiver<Void> receiver = new HealthConnectReceiver<>();
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        // We will try to delete a data source that doesn't exist. This doesn't matter for quota
-        // check.
-        DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId(UUID.randomUUID().toString())
-                        .build();
-
-        while (quotaAcquired > 1) {
-            // Using a non-existent id is fine for quota check.
-            manager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
-            receiver.verifyNoExceptionOrThrow();
-            quotaAcquired--;
-        }
-        int tryWriteWithBuffer = 20;
-        while (tryWriteWithBuffer > 0) {
-            // Using a non-existent id is fine for quota check.
-            manager.deleteMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
-            receiver.verifyNoExceptionOrThrow();
-            tryWriteWithBuffer--;
-        }
-    }
-
-    private void exceedWriteQuotaWithUpsertMedicalResources() throws InterruptedException {
-        HealthConnectManager manager = TestUtils.getHealthConnectManager();
-        float quotaAcquired = acquireCallQuotaForWrite();
-        List<UpsertMedicalResourceRequest> request = List.of(getUpsertMedicalResourceRequest());
-
-        while (quotaAcquired > 1) {
-            HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-            manager.upsertMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
-            receiver.verifyNoExceptionOrThrow();
-            quotaAcquired--;
-        }
-        int tryWriteWithBuffer = 20;
-        while (tryWriteWithBuffer > 0) {
-            HealthConnectReceiver<List<MedicalResource>> receiver = new HealthConnectReceiver<>();
-            manager.upsertMedicalResources(request, Executors.newSingleThreadExecutor(), receiver);
-            receiver.verifyNoExceptionOrThrow();
-            tryWriteWithBuffer--;
-        }
-    }
-
     private float acquireCallQuotaForWrite() throws InterruptedException {
         Instant startTime = Instant.now();
         tryAcquireCallQuotaNTimesForWrite(MAX_FOREGROUND_WRITE_CALL_15M);
@@ -548,21 +344,4 @@
         recordList.forEach(v -> request.addId(v.getMetadata().getId()));
         TestUtils.readRecords(request.build());
     }
-
-    private void setEnableRateLimiterFlag(boolean flag) throws InterruptedException {
-        if (SdkLevel.isAtLeastU()) {
-            mUiAutomation.adoptShellPermissionIdentity(
-                    "android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG");
-        } else {
-            mUiAutomation.adoptShellPermissionIdentity("android.permission.WRITE_DEVICE_CONFIG");
-        }
-
-        DeviceConfig.setProperty(
-                DeviceConfig.NAMESPACE_HEALTH_FITNESS,
-                ENABLE_RATE_LIMITER_FLAG,
-                flag ? "true" : "false",
-                true);
-        mUiAutomation.dropShellPermissionIdentity();
-        Thread.sleep(100);
-    }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/readdata/OrderingTests.java b/tests/cts/src/android/healthconnect/cts/readdata/OrderingTests.java
index d3d1727..c72fccd 100644
--- a/tests/cts/src/android/healthconnect/cts/readdata/OrderingTests.java
+++ b/tests/cts/src/android/healthconnect/cts/readdata/OrderingTests.java
@@ -50,7 +50,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setup() {
diff --git a/tests/cts/src/android/healthconnect/cts/readdata/PaginationTests.java b/tests/cts/src/android/healthconnect/cts/readdata/PaginationTests.java
index dfb10b4..f14cad0 100644
--- a/tests/cts/src/android/healthconnect/cts/readdata/PaginationTests.java
+++ b/tests/cts/src/android/healthconnect/cts/readdata/PaginationTests.java
@@ -59,7 +59,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setup() {
diff --git a/tests/cts/src/android/healthconnect/cts/readdata/ReadByFilterTests.java b/tests/cts/src/android/healthconnect/cts/readdata/ReadByFilterTests.java
index 0f6a279..153335c 100644
--- a/tests/cts/src/android/healthconnect/cts/readdata/ReadByFilterTests.java
+++ b/tests/cts/src/android/healthconnect/cts/readdata/ReadByFilterTests.java
@@ -62,7 +62,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setup() {
diff --git a/tests/cts/src/android/healthconnect/cts/readdata/ReadByIdTests.java b/tests/cts/src/android/healthconnect/cts/readdata/ReadByIdTests.java
index aaa5242..e33ee0c 100644
--- a/tests/cts/src/android/healthconnect/cts/readdata/ReadByIdTests.java
+++ b/tests/cts/src/android/healthconnect/cts/readdata/ReadByIdTests.java
@@ -49,7 +49,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setup() {
diff --git a/tests/cts/src/android/healthconnect/cts/showmigrationinfointent/ShowMigrationInfoIntentAbsentTest.java b/tests/cts/src/android/healthconnect/cts/showmigrationinfointent/ShowMigrationInfoIntentAbsentTest.java
index 61565e1..b3feaa8 100644
--- a/tests/cts/src/android/healthconnect/cts/showmigrationinfointent/ShowMigrationInfoIntentAbsentTest.java
+++ b/tests/cts/src/android/healthconnect/cts/showmigrationinfointent/ShowMigrationInfoIntentAbsentTest.java
@@ -17,17 +17,17 @@
 package android.healthconnect.cts.showmigrationinfointent;
 
 import static android.Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA;
+import static android.healthconnect.cts.utils.TestOutcomeReceiver.outcomeExecutor;
 
-import static com.google.common.truth.Truth.assertThat;
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
-import android.app.UiAutomation;
 import android.content.Context;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.migration.MigrationException;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.TestOutcomeReceiver;
 import android.healthconnect.cts.utils.TestUtils;
 import android.os.Build;
-import android.os.OutcomeReceiver;
 import android.os.ext.SdkExtensions;
 import android.platform.test.annotations.AppModeFull;
 
@@ -40,28 +40,23 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.Collections;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
+import java.util.List;
 
 @AppModeFull(reason = "HealthConnectManager is not accessible to instant apps")
 @RunWith(AndroidJUnit4.class)
 public class ShowMigrationInfoIntentAbsentTest {
-    private Context mContext;
     private HealthConnectManager mManager;
-    UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
 
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() {
-        mContext = InstrumentationRegistry.getInstrumentation().getContext();
-        mManager = mContext.getSystemService(HealthConnectManager.class);
+        Context context = InstrumentationRegistry.getInstrumentation().getContext();
+        mManager = context.getSystemService(HealthConnectManager.class);
         TestUtils.deleteAllStagedRemoteData();
     }
 
@@ -70,59 +65,49 @@
         TestUtils.deleteAllStagedRemoteData();
     }
 
-    @Test(expected = MigrationException.class)
-    public void testInsertMinDataMigrationSdkExtensionVersion_throwsException()
-            throws InterruptedException {
+    @Test
+    public void testInsertMinDataMigrationSdkExtensionVersion_throwsException() {
+        TestOutcomeReceiver<Void, MigrationException> receiver = new TestOutcomeReceiver<>();
         int version = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + 1;
-        uiAutomation.adoptShellPermissionIdentity(MIGRATE_HEALTH_CONNECT_DATA);
-        TestUtils.insertMinDataMigrationSdkExtensionVersion(version);
-        uiAutomation.dropShellPermissionIdentity();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.insertMinDataMigrationSdkExtensionVersion(
+                            version, outcomeExecutor(), receiver);
+                    receiver.assertAndGetException();
+                },
+                MIGRATE_HEALTH_CONNECT_DATA);
     }
 
-    @Test(expected = MigrationException.class)
-    public void testStartMigration_throwsException() throws InterruptedException {
-        uiAutomation.adoptShellPermissionIdentity(MIGRATE_HEALTH_CONNECT_DATA);
-        TestUtils.startMigration();
-        uiAutomation.dropShellPermissionIdentity();
+    @Test
+    public void testStartMigration_throwsException() {
+        TestOutcomeReceiver<Void, MigrationException> receiver = new TestOutcomeReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.startMigration(outcomeExecutor(), receiver);
+                    receiver.assertAndGetException();
+                },
+                MIGRATE_HEALTH_CONNECT_DATA);
     }
 
-    @Test(expected = MigrationException.class)
-    public void testFinishMigration_throwsException() throws InterruptedException {
-        uiAutomation.adoptShellPermissionIdentity(MIGRATE_HEALTH_CONNECT_DATA);
-        TestUtils.finishMigration();
-        uiAutomation.dropShellPermissionIdentity();
+    @Test
+    public void testFinishMigration_throwsException() {
+        TestOutcomeReceiver<Void, MigrationException> receiver = new TestOutcomeReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.finishMigration(outcomeExecutor(), receiver);
+                    receiver.assertAndGetException();
+                },
+                MIGRATE_HEALTH_CONNECT_DATA);
     }
 
-    @Test(expected = MigrationException.class)
-    public void testWriteMigrationData_throwsException() throws InterruptedException {
-        uiAutomation.adoptShellPermissionIdentity(MIGRATE_HEALTH_CONNECT_DATA);
-        writeMigrationData();
-        uiAutomation.dropShellPermissionIdentity();
-    }
-
-    private void writeMigrationData() throws InterruptedException {
-        CountDownLatch latch = new CountDownLatch(1);
-        AtomicReference<MigrationException> migrationExceptionAtomicReference =
-                new AtomicReference<>();
-        mManager.writeMigrationData(
-                Collections.emptyList(),
-                Executors.newSingleThreadExecutor(),
-                new OutcomeReceiver<>() {
-
-                    @Override
-                    public void onResult(Void result) {
-                        latch.countDown();
-                    }
-
-                    @Override
-                    public void onError(MigrationException exception) {
-                        migrationExceptionAtomicReference.set(exception);
-                        latch.countDown();
-                    }
-                });
-        assertThat(latch.await(3, TimeUnit.SECONDS)).isTrue();
-        if (migrationExceptionAtomicReference.get() != null) {
-            throw migrationExceptionAtomicReference.get();
-        }
+    @Test
+    public void testWriteMigrationData_throwsException() {
+        TestOutcomeReceiver<Void, MigrationException> receiver = new TestOutcomeReceiver<>();
+        runWithShellPermissionIdentity(
+                () -> {
+                    mManager.writeMigrationData(List.of(), outcomeExecutor(), receiver);
+                    receiver.assertAndGetException();
+                },
+                MIGRATE_HEALTH_CONNECT_DATA);
     }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/ui/ActivityIntensityTest.kt b/tests/cts/src/android/healthconnect/cts/ui/ActivityIntensityTest.kt
new file mode 100644
index 0000000..ab9eb0f
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/ui/ActivityIntensityTest.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.ui
+
+import android.health.connect.HealthPermissions.READ_ACTIVITY_INTENSITY
+import android.health.connect.HealthPermissions.WRITE_ACTIVITY_INTENSITY
+import android.health.connect.datatypes.ActivityIntensityRecord
+import android.health.connect.datatypes.RespiratoryRateRecord
+import android.health.connect.datatypes.StepsRecord
+import android.healthconnect.cts.lib.RecordFactory.YESTERDAY_11AM
+import android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.text.format.DateFormat.is24HourFormat
+import com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY
+import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
+
+@RequiresFlagsEnabled(FLAG_ACTIVITY_INTENSITY, FLAG_NEW_INFORMATION_ARCHITECTURE)
+class ActivityIntensityTest : BaseDataTypeTest<ActivityIntensityRecord>() {
+
+    override val dataTypeString = "Activity intensity"
+    override val dataCategoryString = "Activity"
+    override val permissionString = "Activity intensity"
+    override val permissions = listOf(READ_ACTIVITY_INTENSITY, WRITE_ACTIVITY_INTENSITY)
+
+    override val sameCategoryDataTypeString = "Steps"
+    override val anotherCategoryString = "Vitals"
+
+    override fun createRecord() =
+        ActivityIntensityRecord.Builder(
+                newEmptyMetadata(),
+                YESTERDAY_11AM.toInstant(),
+                YESTERDAY_11AM.plusMinutes(15).toInstant(),
+                ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS,
+            )
+            .build()
+
+    override val expectedRecordHeader =
+        if (is24HourFormat(context)) "11:00 - 11:15 • ${context.packageName}"
+        else "11:00 AM - 11:15 AM • ${context.packageName}"
+
+    override val expectedRecordTitle = "Vigorous"
+    override val expectedRecordSubtitle = null
+
+    override fun createRecordToBeDeleted() =
+        ActivityIntensityRecord.Builder(
+                newEmptyMetadata(),
+                YESTERDAY_11AM.plusHours(3).toInstant(),
+                YESTERDAY_11AM.plusHours(4).plusMinutes(29).toInstant(),
+                ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE,
+            )
+            .build()
+
+    override val expectedRecordToBeDeletedHeader =
+        if (is24HourFormat(context)) "14:00 - 15:29 • ${context.packageName}"
+        else "2:00 PM - 3:29 PM • ${context.packageName}"
+
+    override val expectedRecordToBeDeletedTitle = "Moderate"
+
+    override fun createSameCategoryRecord() =
+        StepsRecord.Builder(
+                newEmptyMetadata(),
+                YESTERDAY_11AM.minusDays(1).minusHours(2).toInstant(),
+                YESTERDAY_11AM.minusDays(1).minusHours(1).toInstant(),
+                50,
+            )
+            .build()
+
+    override fun createAnotherCategoryRecord() =
+        RespiratoryRateRecord.Builder(
+                newEmptyMetadata(),
+                YESTERDAY_11AM.minusDays(1).minusHours(4).toInstant(),
+                14.0,
+            )
+            .build()
+}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/AppDataFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/AppDataFragmentTest.kt
deleted file mode 100644
index dd94967..0000000
--- a/tests/cts/src/android/healthconnect/cts/ui/AppDataFragmentTest.kt
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.healthconnect.cts.ui
-
-import android.health.connect.datatypes.HeartRateRecord
-import android.health.connect.datatypes.MenstruationPeriodRecord
-import android.health.connect.datatypes.Record
-import android.health.connect.datatypes.SleepSessionRecord
-import android.health.connect.datatypes.StepsRecord
-import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
-import android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata
-import android.healthconnect.cts.lib.TestAppProxy
-import android.healthconnect.cts.lib.UiTestUtils.findText
-import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
-import android.healthconnect.cts.lib.UiTestUtils.scrollDownTo
-import android.healthconnect.cts.lib.UiTestUtils.scrollToEnd
-import android.healthconnect.cts.lib.UiTestUtils.verifyTextNotFound
-import android.healthconnect.cts.utils.TestUtils
-import android.platform.test.annotations.RequiresFlagsEnabled
-import android.platform.test.flag.junit.CheckFlagsRule
-import android.platform.test.flag.junit.DeviceFlagsValueProvider
-import androidx.test.uiautomator.By
-import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
-import java.time.Instant
-import org.junit.After
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-
-/** CTS test for Health Connect App Data fragment in the new IA. */
-@RequiresFlagsEnabled(FLAG_NEW_INFORMATION_ARCHITECTURE)
-class AppDataFragmentTest : HealthConnectBaseTest() {
-
-    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
-
-    @Before
-    fun setup() {
-        TestUtils.deleteAllStagedRemoteData()
-        insertData()
-    }
-
-    @After
-    fun tearDown() {
-        TestUtils.deleteAllStagedRemoteData()
-    }
-
-    companion object {
-        private val NOW = Instant.now()
-
-        private val TEST_WRITER_APP =
-            TestAppProxy.forPackageName("android.healthconnect.cts.testapp.readWritePerms.A")
-    }
-
-    @Test
-    fun appPermissions_showsAppDataButton() {
-        context.launchMainActivity {
-            scrollDownTo(By.text("App permissions"))
-            findTextAndClick("App permissions")
-            findTextAndClick("CtsHealthConnectTestAppAWithNormalReadWritePermission")
-
-            scrollDownTo(By.text("Allowed to read"))
-            scrollDownTo(By.text("Allowed to write"))
-
-            scrollDownTo(By.text("See app data"))
-            findText("See app data")
-        }
-    }
-
-    @Test
-    fun navigateToAppData_showsAppData() {
-        context.launchMainActivity {
-            scrollDownTo(By.text("App permissions"))
-            findTextAndClick("App permissions")
-            findTextAndClick("CtsHealthConnectTestAppAWithNormalReadWritePermission")
-
-            scrollToEnd()
-            findTextAndClick("See app data")
-
-            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
-
-            findText("Activity")
-            findText("Steps")
-            scrollDownTo(By.text("Cycle tracking"))
-            findText("Cycle tracking")
-            findText("Menstruation")
-            scrollDownTo(By.text("Sleep"))
-            findText("Sleep")
-            scrollDownTo(By.text("Vitals"))
-            findText("Vitals")
-            findText("Heart rate")
-        }
-    }
-
-    @Test
-    fun clickOnAppDataType_navigatesToAppEntries() {
-        context.launchMainActivity {
-            scrollDownTo(By.text("App permissions"))
-            findTextAndClick("App permissions")
-            findTextAndClick("CtsHealthConnectTestAppAWithNormalReadWritePermission")
-
-            scrollToEnd()
-            findTextAndClick("See app data")
-
-            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
-
-            findText("Activity")
-            findTextAndClick("Steps")
-
-            // TODO (b/360887258) Check for display when app header shown here
-            //            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
-            verifyTextNotFound("Entries")
-            verifyTextNotFound("Access")
-        }
-    }
-
-    private fun insertData() {
-        TEST_WRITER_APP.insertRecords(
-            mutableListOf(
-                StepsRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(2), 10).build(),
-                HeartRateRecord.Builder(
-                        newEmptyMetadata(),
-                        NOW,
-                        NOW.plusSeconds(10),
-                        listOf(HeartRateRecord.HeartRateSample(140, NOW)),
-                    )
-                    .build(),
-                MenstruationPeriodRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(10))
-                    .build(),
-                SleepSessionRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(1000)).build(),
-            )
-                as List<Record>?
-        )
-    }
-}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/BaseDataTypeTest.kt b/tests/cts/src/android/healthconnect/cts/ui/BaseDataTypeTest.kt
new file mode 100644
index 0000000..5c7c1c0
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/ui/BaseDataTypeTest.kt
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.ui
+
+import android.health.connect.datatypes.Record
+import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
+import android.healthconnect.cts.lib.ActivityLauncher.launchRequestPermissionActivity
+import android.healthconnect.cts.lib.UiTestUtils.findDesc
+import android.healthconnect.cts.lib.UiTestUtils.findDescAndClick
+import android.healthconnect.cts.lib.UiTestUtils.findObject
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
+import android.healthconnect.cts.lib.UiTestUtils.grantPermissionViaPackageManager
+import android.healthconnect.cts.lib.UiTestUtils.revokePermissionViaPackageManager
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownTo
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndClick
+import android.healthconnect.cts.lib.UiTestUtils.scrollToEnd
+import android.healthconnect.cts.lib.UiTestUtils.verifyTextNotFound
+import android.healthconnect.cts.lib.UiTestUtils.waitForObjectNotFound
+import android.healthconnect.cts.utils.PermissionHelper.getGrantedHealthPermissions
+import android.healthconnect.cts.utils.TestUtils
+import android.healthconnect.cts.utils.TestUtils.readAllRecords
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import androidx.test.uiautomator.By
+import com.android.healthfitness.flags.AconfigFlagHelper
+import com.google.common.truth.Truth.assertThat
+import java.time.Duration.ofSeconds
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+abstract class BaseDataTypeTest<T : Record> : HealthConnectBaseTest() {
+    abstract val dataTypeString: String
+    abstract val dataCategoryString: String
+    abstract val permissionString: String
+    abstract val permissions: List<String>
+    abstract val sameCategoryDataTypeString: String?
+    abstract val anotherCategoryString: String
+
+    abstract fun createRecord(): T
+
+    abstract val expectedRecordHeader: String
+    abstract val expectedRecordTitle: String
+    abstract val expectedRecordSubtitle: String?
+
+    abstract fun createRecordToBeDeleted(): Record
+
+    abstract val expectedRecordToBeDeletedHeader: String
+    abstract val expectedRecordToBeDeletedTitle: String
+
+    abstract fun createSameCategoryRecord(): Record?
+
+    abstract fun createAnotherCategoryRecord(): Record
+
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+    companion object {
+        const val APP_WITH_READ_WRITE_PERMISSIONS =
+            "android.healthconnect.cts.testapp.readWritePerms.A"
+        const val APP_WITH_READ_WRITE_PERMISSIONS_LABEL =
+            "CtsHealthConnectTestAppAWithNormalReadWritePermission"
+    }
+
+    private lateinit var record: Record
+
+    @Before
+    fun setup() {
+        assertThat(getGrantedHealthPermissions(context.packageName))
+            .containsAtLeastElementsIn(permissions)
+        assertThat(getGrantedHealthPermissions(APP_WITH_READ_WRITE_PERMISSIONS))
+            .containsAtLeastElementsIn(permissions)
+
+        TestUtils.deleteAllStagedRemoteData()
+
+        val record = createRecord()
+
+        val recordToBeDeleted = createRecordToBeDeleted()
+
+        val insertedRecords = TestUtils.insertRecords(record, recordToBeDeleted)
+        this.record = insertedRecords[0]
+    }
+
+    @After
+    fun tearDown() {
+        TestUtils.deleteAllStagedRemoteData()
+        permissions.forEach {
+            grantPermissionViaPackageManager(context, APP_WITH_READ_WRITE_PERMISSIONS, it)
+            assertPermissionGranted(it, APP_WITH_READ_WRITE_PERMISSIONS)
+        }
+    }
+
+    @Test
+    fun dataAndAccess_showsEntries_deletesEntry() {
+        context.launchMainActivity {
+            scrollDownToAndClick(By.text("Data and access"))
+            scrollDownTo(By.text(dataCategoryString))
+            scrollDownToAndClick(By.text(dataTypeString))
+
+            findText("No data")
+            findDescAndClick("Previous day")
+            waitForObjectNotFound(By.text("No data"), timeout = ofSeconds(1))
+            scrollToEnd()
+
+            findText(expectedRecordHeader)
+            findText(expectedRecordTitle)
+            expectedRecordSubtitle?.let { findText(it) }
+
+            findText(expectedRecordToBeDeletedHeader)
+            // Check that clicking on the entry does not open the details screen.
+            findTextAndClick(expectedRecordToBeDeletedTitle)
+            findText(expectedRecordTitle)
+            findDesc("Previous day")
+
+            findDescAndClick("Enter deletion")
+            findTextAndClick(expectedRecordToBeDeletedTitle)
+            findDescAndClick("Delete data")
+            findTextAndClick("Delete")
+            findObject(By.text("Done"), timeout = ofSeconds(3))
+            findTextAndClick("Done")
+            verifyTextNotFound(expectedRecordToBeDeletedTitle)
+            findText(expectedRecordTitle)
+
+            assertThat(readAllRecords(record::class.java)).containsExactly(record)
+        }
+    }
+
+    @Test
+    fun dataAndAccess_deleteData_deletesDataType_doesNotDeleteOtherDataTypes() {
+        val sameCategoryRecord = createSameCategoryRecord()
+        val anotherCategoryRecord = createAnotherCategoryRecord()
+        TestUtils.insertRecords(listOfNotNull(sameCategoryRecord, anotherCategoryRecord))
+
+        context.launchMainActivity {
+            scrollDownToAndClick(By.text("Data and access"))
+            scrollToEnd()
+
+            findDescAndClick("Enter deletion")
+            findTextAndClick(dataTypeString)
+            findDescAndClick("Delete data")
+            findTextAndClick("Delete")
+            findObject(By.text("Done"), timeout = ofSeconds(3))
+            findTextAndClick("Done")
+
+            assertThat(readAllRecords(record::class.java)).isEmpty()
+            assertThat(readAllRecords(anotherCategoryRecord::class.java)).hasSize(1)
+
+            verifyTextNotFound(dataTypeString)
+            findText(anotherCategoryString)
+
+            sameCategoryRecord?.let {
+                assertThat(readAllRecords(it::class.java)).hasSize(1)
+                findText(dataCategoryString)
+                findText(sameCategoryDataTypeString!!)
+            }
+
+            if (sameCategoryRecord == null) {
+                verifyTextNotFound(dataCategoryString)
+            }
+        }
+    }
+
+    @Test
+    fun seeAllRecentAccess_showsDataCategory() {
+        context.launchMainActivity {
+            findTextAndClick("See all recent access")
+            findText("Write: ${dataCategoryString}")
+        }
+    }
+
+    @Test
+    fun appPermissions_allowAll_grantsPermissions() {
+        permissions.forEach {
+            revokePermissionViaPackageManager(context, APP_WITH_READ_WRITE_PERMISSIONS, it)
+            assertPermissionDenied(it, APP_WITH_READ_WRITE_PERMISSIONS)
+        }
+
+        context.launchMainActivity {
+            scrollDownToAndClick(By.text("App permissions"))
+            findTextAndClick(APP_WITH_READ_WRITE_PERMISSIONS_LABEL)
+            if (AconfigFlagHelper.isPersonalHealthRecordEnabled()) {
+                findTextAndClick("Fitness and wellness")
+            }
+            findTextAndClick("Allow all")
+        }
+
+        permissions.forEach { assertPermissionGranted(it, APP_WITH_READ_WRITE_PERMISSIONS) }
+    }
+
+    @Test
+    fun requestPermission_showsPermission() {
+        permissions.forEach {
+            revokePermissionViaPackageManager(context, APP_WITH_READ_WRITE_PERMISSIONS, it)
+            assertPermissionDenied(it, APP_WITH_READ_WRITE_PERMISSIONS)
+        }
+
+        context.launchRequestPermissionActivity(
+            packageName = APP_WITH_READ_WRITE_PERMISSIONS,
+            permissions = permissions,
+        ) {
+            scrollDownTo(By.text(permissionString))
+            findTextAndClick("Allow all")
+            findTextAndClick("Allow")
+        }
+
+        permissions.forEach { assertPermissionGranted(it, APP_WITH_READ_WRITE_PERMISSIONS) }
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/CategoriesFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/CategoriesFragmentTest.kt
index 6bc44ae..fa5144d 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/CategoriesFragmentTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/CategoriesFragmentTest.kt
@@ -48,7 +48,7 @@
         @JvmStatic
         @BeforeClass
         fun setup() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
             val records: List<Record> = listOf(stepsRecordFromTestApp(), stepsRecordFromTestApp())
@@ -58,7 +58,7 @@
         @JvmStatic
         @AfterClass
         fun teardown() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
             verifyDeleteRecords(
diff --git a/tests/cts/src/android/healthconnect/cts/ui/DataAccessFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/DataAccessFragmentTest.kt
index e55c69e..efeb91d 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/DataAccessFragmentTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/DataAccessFragmentTest.kt
@@ -47,7 +47,7 @@
         @JvmStatic
         @AfterClass
         fun tearDown() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
             verifyDeleteRecords(
diff --git a/tests/cts/src/android/healthconnect/cts/ui/DataEntriesFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/DataEntriesFragmentTest.kt
index 7d19430..5bd2582 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/DataEntriesFragmentTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/DataEntriesFragmentTest.kt
@@ -92,7 +92,7 @@
         @JvmStatic
         @AfterClass
         fun tearDown() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
             verifyDeleteRecords(
diff --git a/tests/cts/src/android/healthconnect/cts/ui/HealthConnectBaseTest.kt b/tests/cts/src/android/healthconnect/cts/ui/HealthConnectBaseTest.kt
index 2a4ae0a..91381a6 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/HealthConnectBaseTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/HealthConnectBaseTest.kt
@@ -16,27 +16,29 @@
 
 package android.healthconnect.cts.ui
 
+import android.app.KeyguardManager
 import android.content.Context
+import android.content.pm.PackageManager
 import android.healthconnect.cts.utils.AssumptionCheckerRule
 import android.healthconnect.cts.utils.TestUtils
 import androidx.test.core.app.ApplicationProvider
 import com.android.compatibility.common.util.DisableAnimationRule
 import com.android.compatibility.common.util.FreezeRotationRule
+import com.android.compatibility.common.util.SystemUtil.eventually
 import com.android.compatibility.common.util.SystemUtil.runShellCommandOrThrow
+import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Before
 import org.junit.Rule
 
 open class HealthConnectBaseTest {
-    @get:Rule
-    val disableAnimationRule = DisableAnimationRule()
+    @get:Rule val disableAnimationRule = DisableAnimationRule()
 
-    @get:Rule
-    val freezeRotationRule = FreezeRotationRule()
+    @get:Rule val freezeRotationRule = FreezeRotationRule()
 
     @get:Rule
     var mSupportedHardwareRule =
         AssumptionCheckerRule(
-            { TestUtils.isHardwareSupported() },
+            { TestUtils.isHealthConnectFullySupported() },
             "Tests should run on supported hardware only.",
         )
 
@@ -58,5 +60,24 @@
             runShellCommandOrThrow("input keyevent 82")
         }
         runShellCommandOrThrow("wm dismiss-keyguard")
+
+        val keyguardManager = context.getSystemService(KeyguardManager::class.java)
+
+        eventually {
+            assertWithMessage("device is locked").that(keyguardManager.isDeviceLocked).isFalse()
+            assertWithMessage("keyguard is locked").that(keyguardManager.isKeyguardLocked).isFalse()
+        }
+    }
+
+    fun assertPermissionGranted(permission: String, packageName: String) {
+        assertWithMessage("$permission for $packageName is not granted")
+            .that(context.packageManager.checkPermission(permission, packageName))
+            .isEqualTo(PackageManager.PERMISSION_GRANTED)
+    }
+
+    fun assertPermissionDenied(permission: String, packageName: String) {
+        assertWithMessage("$permission for $packageName is not denied")
+            .that(context.packageManager.checkPermission(permission, packageName))
+            .isEqualTo(PackageManager.PERMISSION_DENIED)
     }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/ui/HomeFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/HomeFragmentTest.kt
index e443379..2ae2414 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/HomeFragmentTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/HomeFragmentTest.kt
@@ -15,22 +15,25 @@
  */
 package android.healthconnect.cts.ui
 
-import android.health.connect.TimeInstantRangeFilter
 import android.health.connect.datatypes.StepsRecord
 import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
 import android.healthconnect.cts.lib.TestAppProxy
-import android.healthconnect.cts.lib.UiTestUtils.clickOnText
-import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindTextContains
+import android.healthconnect.cts.lib.UiTestUtils.scrollToEnd
+import android.healthconnect.cts.lib.UiTestUtils.verifyTextNotFound
+import android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION
+import android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest
 import android.healthconnect.cts.utils.DataFactory.getEmptyMetadata
 import android.healthconnect.cts.utils.TestUtils
-import android.healthconnect.cts.utils.TestUtils.verifyDeleteRecords
 import android.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.annotations.RequiresFlagsEnabled
 import android.platform.test.flag.junit.CheckFlagsRule
 import android.platform.test.flag.junit.DeviceFlagsValueProvider
-import androidx.test.filters.FlakyTest
-import androidx.test.uiautomator.By
 import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
-import java.time.Duration
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE
 import java.time.Instant
 import java.time.temporal.ChronoUnit
 import org.junit.AfterClass
@@ -51,9 +54,13 @@
         @JvmStatic
         @BeforeClass
         fun setup() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
+
+            TestUtils.deleteAllStagedRemoteData()
+            TestUtils.deleteAllMedicalData()
+
             val now = Instant.now().truncatedTo(ChronoUnit.MILLIS)
             APP_A_WITH_READ_WRITE_PERMS.insertRecords(
                 StepsRecord.Builder(getEmptyMetadata(), now.minusSeconds(30), now, 43).build()
@@ -63,70 +70,102 @@
         @JvmStatic
         @AfterClass
         fun teardown() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
-            verifyDeleteRecords(
-                StepsRecord::class.java,
-                TimeInstantRangeFilter.Builder()
-                    .setStartTime(Instant.EPOCH)
-                    .setEndTime(Instant.now())
-                    .build(),
-            )
+            TestUtils.deleteAllStagedRemoteData()
+            TestUtils.deleteAllMedicalData()
         }
     }
 
     @Test
-    @FlakyTest(bugId = 328200136)
-    fun homeFragment_openAppPermissions() {
+    fun homeFragment_opensAppPermissions() {
         context.launchMainActivity {
-            clickOnText("App permissions")
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
 
-            waitDisplayed(By.text("Allowed access"))
-            waitDisplayed(By.text("Not allowed access"), waitTimeout = Duration.ofSeconds(10))
+            scrollDownToAndFindText("Allowed access")
+            scrollDownToAndFindText("Not allowed access")
         }
     }
 
     @Test
     @RequiresFlagsDisabled(FLAG_NEW_INFORMATION_ARCHITECTURE)
-    fun homeFragment_openDataManagement() {
+    fun homeFragment_oldIa_opensDataManagement() {
         context.launchMainActivity {
-            clickOnText("Data and access")
+            scrollDownToAndFindText("Data and access")
+            clickOnTextAndWaitForNewWindow("Data and access")
 
-            waitDisplayed(By.text("Browse data"))
-            waitDisplayed(By.text("Manage data"))
+            scrollDownToAndFindText("Browse data")
+            scrollDownToAndFindText("Manage data")
 
-            waitDisplayed(By.text("Delete all data"))
+            scrollDownToAndFindText("Delete all data")
         }
     }
 
     @Test
-    fun homeFragment_openManageData() {
+    @RequiresFlagsEnabled(FLAG_NEW_INFORMATION_ARCHITECTURE)
+    fun homeFragment_newIa_opensDataManagement() {
         context.launchMainActivity {
-            clickOnText("Manage data")
+            scrollDownToAndFindText("Data and access")
+            clickOnTextAndWaitForNewWindow("Data and access")
 
-            waitDisplayed(By.text("Auto-delete"))
-            waitDisplayed(By.text("Data sources and priority"))
-            waitDisplayed(By.text("Set units"))
+            scrollDownToAndFindText("Activity")
+            scrollDownToAndFindText("Steps")
+        }
+    }
+
+    @Test
+    fun homeFragment_opensManageData() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("Manage data")
+            clickOnTextAndWaitForNewWindow("Manage data")
+
+            scrollDownToAndFindText("Auto-delete")
+            scrollDownToAndFindText("Data sources and priority")
+            scrollDownToAndFindText("Set units")
         }
     }
 
     @Test
     fun homeFragment_recentAccessShownOnHomeScreen() {
         context.launchMainActivity {
-            waitDisplayed(By.textContains("CtsHealthConnectTest"))
-            waitDisplayed(By.text("See all recent access"))
+            scrollDownToAndFindTextContains("CtsHealthConnectTest")
+            scrollDownToAndFindText("See all recent access")
         }
     }
 
     @Test
-    @FlakyTest(bugId = 328200136)
-    fun homeFragment_navigateToRecentAccess() {
+    fun homeFragment_navigatesToRecentAccess() {
         context.launchMainActivity {
-            clickOnText("See all recent access")
+            scrollDownToAndFindText("See all recent access")
+            clickOnTextAndWaitForNewWindow("See all recent access")
 
-            waitDisplayed(By.text("Today"))
-            waitDisplayed(By.textContains("CtsHealthConnectTest"))
+            scrollDownToAndFindText("Today")
+            scrollDownToAndFindTextContains("CtsHealthConnectTest")
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun homeFragment_withMedicalData_opensBrowseMedicalRecords() {
+        val dataSource =
+            APP_A_WITH_READ_WRITE_PERMS.createMedicalDataSource(getCreateMedicalDataSourceRequest())
+        APP_A_WITH_READ_WRITE_PERMS.upsertMedicalResource(dataSource.id, FHIR_DATA_IMMUNIZATION)
+        context.launchMainActivity {
+            scrollDownToAndFindText("Browse health records")
+            clickOnTextAndWaitForNewWindow("Browse health records")
+
+            scrollDownToAndFindText("Vaccines")
+        }
+    }
+
+    @Test
+    @RequiresFlagsDisabled(FLAG_PERSONAL_HEALTH_RECORD)
+    fun homeFragment_withMedicalData_flagOff_hidesBrowseMedicalRecords() {
+        context.launchMainActivity {
+            scrollToEnd()
+            verifyTextNotFound("Browse health records")
         }
     }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/ui/MindfulnessTest.kt b/tests/cts/src/android/healthconnect/cts/ui/MindfulnessTest.kt
index 8f0ba9d..413f5e1 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/MindfulnessTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/MindfulnessTest.kt
@@ -16,305 +16,68 @@
 
 package android.healthconnect.cts.ui
 
-import android.content.pm.PackageManager
-import android.health.connect.HealthPermissions
+import android.health.connect.HealthPermissions.READ_MINDFULNESS
+import android.health.connect.HealthPermissions.WRITE_MINDFULNESS
 import android.health.connect.datatypes.ExerciseSessionRecord
-import android.health.connect.datatypes.ExerciseSessionType
+import android.health.connect.datatypes.ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING
 import android.health.connect.datatypes.MindfulnessSessionRecord
-import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
-import android.healthconnect.cts.lib.ActivityLauncher.launchRequestPermissionActivity
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_MEDITATION
+import android.health.connect.datatypes.MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_UNKNOWN
+import android.healthconnect.cts.lib.RecordFactory.YESTERDAY_11AM
 import android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata
-import android.healthconnect.cts.lib.UiTestUtils.TEST_APP_PACKAGE_NAME
-import android.healthconnect.cts.lib.UiTestUtils.findObject
-import android.healthconnect.cts.lib.UiTestUtils.findObjectAndClick
-import android.healthconnect.cts.lib.UiTestUtils.findText
-import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
-import android.healthconnect.cts.lib.UiTestUtils.navigateUp
-import android.healthconnect.cts.lib.UiTestUtils.revokePermissionViaPackageManager
-import android.healthconnect.cts.lib.UiTestUtils.scrollDownTo
-import android.healthconnect.cts.lib.UiTestUtils.scrollToEnd
-import android.healthconnect.cts.lib.UiTestUtils.verifyObjectNotFound
-import android.healthconnect.cts.lib.UiTestUtils.verifyTextNotFound
-import android.healthconnect.cts.lib.UiTestUtils.waitForObjectNotFound
-import android.healthconnect.cts.utils.TestUtils
-import android.healthconnect.cts.utils.TestUtils.readAllRecords
-import android.platform.test.annotations.RequiresFlagsDisabled
 import android.platform.test.annotations.RequiresFlagsEnabled
-import android.platform.test.flag.junit.CheckFlagsRule
-import android.platform.test.flag.junit.DeviceFlagsValueProvider
-import androidx.test.uiautomator.By
-import com.android.healthfitness.flags.Flags
+import android.text.format.DateFormat.is24HourFormat
+import com.android.healthfitness.flags.Flags.FLAG_MINDFULNESS
 import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
-import com.google.common.truth.Correspondence.transforming
-import com.google.common.truth.Truth.assertThat
-import java.time.Duration
-import java.time.LocalDate
-import java.time.ZoneId
-import org.junit.After
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
 
-class MindfulnessTest : HealthConnectBaseTest() {
+@RequiresFlagsEnabled(FLAG_MINDFULNESS, FLAG_NEW_INFORMATION_ARCHITECTURE)
+class MindfulnessTest : BaseDataTypeTest<MindfulnessSessionRecord>() {
+    override val dataTypeString = "Mindfulness"
+    override val dataCategoryString = "Wellness"
+    override val permissionString = "Mindfulness"
+    override val permissions = listOf(READ_MINDFULNESS, WRITE_MINDFULNESS)
+    override val sameCategoryDataTypeString = null
+    override val anotherCategoryString = "Activity"
 
-    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
-
-    @Before
-    fun setup() {
-        TestUtils.deleteAllStagedRemoteData()
-        insertData()
-    }
-
-    @After
-    fun tearDown() {
-        TestUtils.deleteAllStagedRemoteData()
-    }
-
-    companion object {
-        private val YESTERDAY_11AM =
-            LocalDate.now(ZoneId.systemDefault())
-                .minusDays(1)
-                .atTime(11, 0)
-                .atZone(ZoneId.systemDefault())
-    }
-
-    @RequiresFlagsEnabled(Flags.FLAG_MINDFULNESS)
-    @RequiresFlagsDisabled(FLAG_NEW_INFORMATION_ARCHITECTURE)
-    @Test
-    fun oldIA_dataAndAccess_seeAllEntries_flagEnabled_showsMindfulness() {
-        context.launchMainActivity {
-            findTextAndClick("Data and access")
-            findText("Wellness")
-            findTextAndClick("See all categories")
-
-            scrollToEnd()
-            findTextAndClick("Wellness")
-            findText("Delete wellness data")
-            findTextAndClick("Mindfulness")
-            scrollToEnd()
-            findTextAndClick("See all entries")
-
-            findText("No data")
-            findObjectAndClick(By.desc("Previous day"))
-            waitForObjectNotFound(By.text("No data"), timeout = Duration.ofSeconds(1))
-
-            findText("11:00 AM - 11:15 AM • ${context.packageName}")
-            findText("foo-notes")
-            // Make sure that clicking on a Mindfulness entry does not open the details screen.
-            findTextAndClick("foo-title, Meditation")
-
-            findText("29m, Unknown type")
-            findObject(
-                By.desc("Delete data entry from 12:00 PM to 12:29 PM • ${context.packageName}")
+    override fun createRecord() =
+        MindfulnessSessionRecord.Builder(
+                newEmptyMetadata(),
+                YESTERDAY_11AM.toInstant(),
+                YESTERDAY_11AM.plusMinutes(15).toInstant(),
+                MINDFULNESS_SESSION_TYPE_MEDITATION,
             )
-            findObject(By.desc("Previous day"))
+            .setTitle("foo-title")
+            .setNotes("foo-notes")
+            .build()
 
-            // Delete a specific Mindfulness session.
-            findObjectAndClick(
-                By.descStartsWith(
-                    "Delete data entry from 11:00 AM to 11:15 AM • ${context.packageName}"
-                )
+    override val expectedRecordHeader =
+        if (is24HourFormat(context)) "11:00 - 11:15 • ${context.packageName}"
+        else "11:00 AM - 11:15 AM • ${context.packageName}"
+    override val expectedRecordTitle = "Meditation • foo-title"
+    override val expectedRecordSubtitle = "foo-notes"
+
+    override fun createRecordToBeDeleted() =
+        MindfulnessSessionRecord.Builder(
+                newEmptyMetadata(),
+                YESTERDAY_11AM.plusHours(3).toInstant(),
+                YESTERDAY_11AM.plusHours(4).plusMinutes(29).toInstant(),
+                MINDFULNESS_SESSION_TYPE_UNKNOWN,
             )
-            findTextAndClick("Delete")
-            findTextAndClick("Done")
-            findText("29m, Unknown type")
-            verifyObjectNotFound(By.text("foo-title, Meditation"))
+            .build()
 
-            assertThat(readAllRecords(MindfulnessSessionRecord::class.java))
-                .comparingElementsUsing(
-                    transforming(MindfulnessSessionRecord::getStartTime, "record start time")
-                )
-                .containsExactly(YESTERDAY_11AM.plusHours(1).toInstant())
-        }
-    }
+    override val expectedRecordToBeDeletedHeader =
+        if (is24HourFormat(context)) "14:00 - 15:29 • ${context.packageName}"
+        else "2:00 PM - 3:29 PM • ${context.packageName}"
+    override val expectedRecordToBeDeletedTitle = "Unknown type • 1h 29m"
 
-    @RequiresFlagsEnabled(Flags.FLAG_MINDFULNESS)
-    @RequiresFlagsDisabled(FLAG_NEW_INFORMATION_ARCHITECTURE)
-    @Test
-    fun oldIA_dataAndAccess_deleteMindfulnessData() {
-        context.launchMainActivity {
-            findTextAndClick("Data and access")
-            findTextAndClick("See all categories")
-            scrollToEnd()
-            findTextAndClick("Wellness")
-            findText("Delete wellness data")
-            findTextAndClick("Mindfulness")
+    override fun createSameCategoryRecord() = null
 
-            // Delete all Mindfulness data.
-            scrollToEnd()
-            findTextAndClick("Delete this data")
-            findTextAndClick("Delete all data")
-            findTextAndClick("Next")
-            findTextAndClick("Delete")
-            findTextAndClick("Done")
-            assertThat(readAllRecords(MindfulnessSessionRecord::class.java)).isEmpty()
-            assertThat(readAllRecords(ExerciseSessionRecord::class.java)).hasSize(1)
-
-            // Go back to the Data and Access screen.
-            navigateUp()
-            navigateUp()
-
-            // Make sure Wellness category is disabled.
-            findObject(By.text("Activity").enabled(true))
-            scrollToEnd()
-            findObject(By.text("Wellness").enabled(false))
-        }
-    }
-
-    @RequiresFlagsEnabled(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun appPermissions_flagEnabled_showsMindfulness() {
-        context.launchMainActivity {
-            findTextAndClick("App permissions")
-            findTextAndClick("Health Connect cts test app")
-            scrollDownTo(By.text("Mindfulness"))
-            findText("Mindfulness")
-        }
-    }
-
-    @RequiresFlagsEnabled(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun seeAllRecentAccess_flagEnabled_showsWellness() {
-        context.launchMainActivity {
-            findTextAndClick("See all recent access")
-            findText("Write: Activity, Wellness")
-        }
-    }
-
-    @RequiresFlagsEnabled(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun requestPermission_flagEnabled_showsMindfulness() {
-        revokePermissionViaPackageManager(
-            context,
-            TEST_APP_PACKAGE_NAME,
-            HealthPermissions.READ_MINDFULNESS,
-        )
-
-        context.launchRequestPermissionActivity(
-            packageName = TEST_APP_PACKAGE_NAME,
-            permissions = listOf(HealthPermissions.READ_MINDFULNESS),
-        ) {
-            scrollToEnd()
-            findTextAndClick("Mindfulness")
-            findTextAndClick("Allow")
-
-            assertThat(
-                    context.packageManager.checkPermission(
-                        HealthPermissions.READ_MINDFULNESS,
-                        TEST_APP_PACKAGE_NAME,
-                    )
-                )
-                .isEqualTo(PackageManager.PERMISSION_GRANTED)
-        }
-    }
-
-    @RequiresFlagsDisabled(Flags.FLAG_MINDFULNESS, FLAG_NEW_INFORMATION_ARCHITECTURE)
-    @Test
-    fun oldIA_dataAndAccess_seeAllCategories_flagDisabled_doesNotShowWellness() {
-        context.launchMainActivity {
-            findTextAndClick("Data and access")
-            findObject(By.text("Activity").enabled(true), timeout = Duration.ofSeconds(2))
-            verifyTextNotFound("Wellness")
-
-            findTextAndClick("See all categories")
-            scrollToEnd()
-            verifyTextNotFound("Wellness")
-        }
-    }
-
-    @RequiresFlagsDisabled(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun appPermissions_flagDisabled_doesNotShowMindfulness() {
-        context.launchMainActivity {
-            scrollToEnd()
-            findTextAndClick("App permissions")
-            findTextAndClick("Health Connect cts test app")
-            scrollDownTo(By.text("Steps"))
-            findText("Height")
-            findText("Steps")
-            verifyTextNotFound("Mindfulness")
-        }
-    }
-
-    @RequiresFlagsDisabled(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun seeAllRecentAccess_flagDisabled_doesNotShowMindfulness() {
-        context.launchMainActivity {
-            findTextAndClick("See all recent access")
-            findText("Write: Activity")
-        }
-    }
-
-    @RequiresFlagsDisabled(Flags.FLAG_MINDFULNESS)
-    @Test
-    fun requestPermission_flagDisabled_doesNotShowMindfulness() {
-        revokePermissionViaPackageManager(
-            context,
-            TEST_APP_PACKAGE_NAME,
-            HealthPermissions.READ_MINDFULNESS,
-        )
-        revokePermissionViaPackageManager(
-            context,
-            TEST_APP_PACKAGE_NAME,
-            HealthPermissions.READ_HEIGHT,
-        )
-
-        context.launchRequestPermissionActivity(
-            packageName = TEST_APP_PACKAGE_NAME,
-            permissions = listOf(HealthPermissions.READ_MINDFULNESS, HealthPermissions.READ_HEIGHT),
-        ) {
-            scrollToEnd()
-            findText("Height")
-            verifyTextNotFound("Mindfulness")
-            findTextAndClick("Allow all")
-            findTextAndClick("Allow")
-
-            assertThat(
-                    context.packageManager.checkPermission(
-                        HealthPermissions.READ_MINDFULNESS,
-                        TEST_APP_PACKAGE_NAME,
-                    )
-                )
-                .isEqualTo(PackageManager.PERMISSION_DENIED)
-            assertThat(
-                    context.packageManager.checkPermission(
-                        HealthPermissions.READ_HEIGHT,
-                        TEST_APP_PACKAGE_NAME,
-                    )
-                )
-                .isEqualTo(PackageManager.PERMISSION_GRANTED)
-        }
-    }
-
-    private fun insertData() {
-        TestUtils.insertRecords(
-            mutableListOf(
-                MindfulnessSessionRecord.Builder(
-                        newEmptyMetadata(),
-                        YESTERDAY_11AM.toInstant(),
-                        YESTERDAY_11AM.plusMinutes(15).toInstant(),
-                        MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_MEDITATION,
-                    )
-                    .setTitle("foo-title")
-                    .setNotes("foo-notes")
-                    .build(),
-                MindfulnessSessionRecord.Builder(
-                        newEmptyMetadata(),
-                        YESTERDAY_11AM.plusHours(1).toInstant(),
-                        YESTERDAY_11AM.plusHours(1).plusMinutes(29).toInstant(),
-                        MindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_UNKNOWN,
-                    )
-                    .build(),
-                ExerciseSessionRecord.Builder(
-                        newEmptyMetadata(),
-                        YESTERDAY_11AM.plusHours(4).toInstant(),
-                        YESTERDAY_11AM.plusHours(4).plusMinutes(13).toInstant(),
-                        ExerciseSessionType.EXERCISE_SESSION_TYPE_RUNNING,
-                    )
-                    .setTitle("Title")
-                    .setNotes("Notes lorem ipsum blah blah blah")
-                    .build(),
+    override fun createAnotherCategoryRecord() =
+        ExerciseSessionRecord.Builder(
+                newEmptyMetadata(),
+                YESTERDAY_11AM.minusDays(1).minusHours(2).toInstant(),
+                YESTERDAY_11AM.minusDays(1).minusHours(1).toInstant(),
+                EXERCISE_SESSION_TYPE_RUNNING,
             )
-        )
-    }
+            .build()
 }
diff --git a/tests/cts/src/android/healthconnect/cts/ui/PermissionTypesFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/PermissionTypesFragmentTest.kt
index 8ecb118..4a269b1 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/PermissionTypesFragmentTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/PermissionTypesFragmentTest.kt
@@ -53,7 +53,7 @@
         @JvmStatic
         @BeforeClass
         fun setup() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
             val now = Instant.now().truncatedTo(ChronoUnit.MILLIS)
@@ -66,7 +66,7 @@
         @JvmStatic
         @AfterClass
         fun teardown() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
             verifyDeleteRecords(
diff --git a/tests/cts/src/android/healthconnect/cts/ui/AllDataFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/newia/AllDataFragmentTest.kt
similarity index 81%
rename from tests/cts/src/android/healthconnect/cts/ui/AllDataFragmentTest.kt
rename to tests/cts/src/android/healthconnect/cts/ui/newia/AllDataFragmentTest.kt
index 2f4c8f3..39347cd 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/AllDataFragmentTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/newia/AllDataFragmentTest.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.healthconnect.cts.ui
+package android.healthconnect.cts.ui.newia
 
 import android.health.connect.datatypes.HeartRateRecord
 import android.health.connect.datatypes.HeightRecord
@@ -26,18 +26,23 @@
 import android.health.connect.datatypes.units.Volume
 import android.healthconnect.cts.lib.ActivityLauncher.launchDataActivity
 import android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata
+import android.healthconnect.cts.lib.UiTestUtils.clickOnDescAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
 import android.healthconnect.cts.lib.UiTestUtils.findObjectAndClick
 import android.healthconnect.cts.lib.UiTestUtils.findText
 import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
-import android.healthconnect.cts.lib.UiTestUtils.scrollDownTo
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
 import android.healthconnect.cts.lib.UiTestUtils.scrollUpTo
 import android.healthconnect.cts.lib.UiTestUtils.verifyObjectNotFound
+import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
+import android.healthconnect.cts.ui.HealthConnectBaseTest
 import android.healthconnect.cts.utils.TestUtils
 import android.platform.test.annotations.RequiresFlagsEnabled
 import android.platform.test.flag.junit.CheckFlagsRule
 import android.platform.test.flag.junit.DeviceFlagsValueProvider
 import androidx.test.uiautomator.By
 import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
+import java.time.Duration
 import java.time.Instant
 import org.junit.After
 import org.junit.Before
@@ -68,27 +73,23 @@
     @Test
     fun allDataFragment_showsAllAvailableDataTypes() {
         context.launchDataActivity {
-            findText("Activity")
-            findText("Steps")
-            scrollDownTo(By.text("Body measurements"))
-            findText("Body measurements")
-            findText("Height")
-            scrollDownTo(By.text("Cycle tracking"))
-            findText("Cycle tracking")
-            findText("Ovulation test")
-            scrollDownTo(By.text("Sleep"))
-            findText("Sleep")
-            scrollDownTo(By.text("Vitals"))
-            findText("Vitals")
-            findText("Heart rate")
+            scrollDownToAndFindText("Activity")
+            scrollDownToAndFindText("Steps")
+            scrollDownToAndFindText("Body measurements")
+            scrollDownToAndFindText("Height")
+            scrollDownToAndFindText("Cycle tracking")
+            scrollDownToAndFindText("Ovulation test")
+            scrollDownToAndFindText("Sleep")
+            scrollDownToAndFindText("Vitals")
+            scrollDownToAndFindText("Heart rate")
         }
     }
 
     @Test
     fun allDataFragment_clickOnDataSourcesIcon_navigatesToDataSources() {
         context.launchDataActivity {
-            findObjectAndClick(By.desc("Data sources and priority"))
-            findText("App sources")
+            clickOnDescAndWaitForNewWindow("Data sources and priority")
+            scrollDownToAndFindText("App sources")
         }
     }
 
@@ -103,6 +104,7 @@
             findTextAndClick("Select all")
             findObjectAndClick(By.desc("Delete data"))
             findTextAndClick("Delete")
+            waitDisplayed(By.text("Done"), Duration.ofSeconds(3))
             findTextAndClick("Done")
             findText("No data")
         }
@@ -112,7 +114,8 @@
     fun allDataFragment_clickOnPermissionType_navigatesToEntriesAndAccess() {
         context.launchDataActivity {
             findText("Activity")
-            findTextAndClick("Steps")
+            clickOnTextAndWaitForNewWindow("Steps")
+
             findText("Entries")
             findText("Access")
         }
diff --git a/tests/cts/src/android/healthconnect/cts/ui/AllEntriesFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/newia/AllEntriesFragmentTest.kt
similarity index 71%
rename from tests/cts/src/android/healthconnect/cts/ui/AllEntriesFragmentTest.kt
rename to tests/cts/src/android/healthconnect/cts/ui/newia/AllEntriesFragmentTest.kt
index 70b2010..7915454 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/AllEntriesFragmentTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/newia/AllEntriesFragmentTest.kt
@@ -13,19 +13,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.healthconnect.cts.ui
+package android.healthconnect.cts.ui.newia
 
 import android.health.connect.datatypes.StepsRecord
 import android.healthconnect.cts.lib.ActivityLauncher.launchDataActivity
 import android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findObjectAndClick
 import android.healthconnect.cts.lib.UiTestUtils.findText
 import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.lib.UiTestUtils.scrollUpTo
+import android.healthconnect.cts.lib.UiTestUtils.verifyObjectNotFound
 import android.healthconnect.cts.lib.UiTestUtils.verifyTextNotFound
+import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
+import android.healthconnect.cts.ui.HealthConnectBaseTest
 import android.healthconnect.cts.utils.TestUtils
 import android.platform.test.annotations.RequiresFlagsEnabled
 import android.platform.test.flag.junit.CheckFlagsRule
 import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import androidx.test.uiautomator.By
 import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
+import java.time.Duration
 import java.time.LocalDate
 import java.time.ZoneId
 import org.junit.After
@@ -59,7 +68,7 @@
     fun allEntries_dayView_showsDataOnlyFromDay() {
         context.launchDataActivity {
             findText("Activity")
-            findTextAndClick("Steps")
+            clickOnTextAndWaitForNewWindow("Steps")
             findText("Entries")
             findText("Access")
 
@@ -73,7 +82,7 @@
     fun allEntries_navigationView_showsDayWeekMonth() {
         context.launchDataActivity {
             findText("Activity")
-            findTextAndClick("Steps")
+            clickOnTextAndWaitForNewWindow("Steps")
             findText("Entries")
             findText("Access")
 
@@ -88,16 +97,33 @@
     fun allEntries_clickOnAccessTab_navigatesToAccessScreen() {
         context.launchDataActivity {
             findText("Activity")
-            findTextAndClick("Steps")
+            clickOnTextAndWaitForNewWindow("Steps")
             findText("Entries")
 
             findTextAndClick("Access")
             findText("Can read steps")
-            findText("Can write steps")
+            scrollDownToAndFindText("Can write steps")
         }
     }
 
-    // TODO (b/360887258) Deletion tests
+    @Test
+    fun allEntries_deletesAllData() {
+        context.launchDataActivity {
+            findText("Activity")
+            clickOnTextAndWaitForNewWindow("Steps")
+            findText("Entries")
+
+            verifyObjectNotFound(By.text("Select all"))
+            findObjectAndClick(By.desc("Enter deletion"))
+            scrollUpTo(By.text("Select all"))
+            findTextAndClick("Select all")
+            findObjectAndClick(By.desc("Delete data"))
+            findTextAndClick("Delete")
+            waitDisplayed(By.text("Done"), Duration.ofSeconds(3))
+            findTextAndClick("Done")
+            findText("No data")
+        }
+    }
 
     private fun insertData() {
         TestUtils.insertRecords(
diff --git a/tests/cts/src/android/healthconnect/cts/ui/newia/AppDataFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/newia/AppDataFragmentTest.kt
new file mode 100644
index 0000000..49c6cc4
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/ui/newia/AppDataFragmentTest.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.ui.newia
+
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.MenstruationPeriodRecord
+import android.health.connect.datatypes.Record
+import android.health.connect.datatypes.SleepSessionRecord
+import android.health.connect.datatypes.StepsRecord
+import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
+import android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata
+import android.healthconnect.cts.lib.TestAppProxy
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findObjectAndClick
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndClick
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.lib.UiTestUtils.scrollUpTo
+import android.healthconnect.cts.lib.UiTestUtils.verifyObjectNotFound
+import android.healthconnect.cts.lib.UiTestUtils.verifyTextNotFound
+import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
+import android.healthconnect.cts.ui.HealthConnectBaseTest
+import android.healthconnect.cts.utils.TestUtils
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import androidx.test.uiautomator.By
+import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
+import java.time.Duration
+import java.time.Instant
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+/** CTS test for Health Connect App Data fragment in the new IA. */
+@RequiresFlagsEnabled(FLAG_NEW_INFORMATION_ARCHITECTURE)
+class AppDataFragmentTest : HealthConnectBaseTest() {
+
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+    @Before
+    fun setup() {
+        TestUtils.deleteAllStagedRemoteData()
+        insertData()
+    }
+
+    @After
+    fun tearDown() {
+        TestUtils.deleteAllStagedRemoteData()
+    }
+
+    companion object {
+        private val NOW = Instant.now()
+
+        private val TEST_WRITER_APP =
+            TestAppProxy.forPackageName("android.healthconnect.cts.testapp.readWritePerms.A")
+    }
+
+    @Test
+    fun appPermissions_showsAppDataButton() {
+        context.launchMainActivity {
+            scrollDownToAndClick(By.text("App permissions"))
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("See app data")
+        }
+    }
+
+    @Test
+    fun navigateToAppData_showsAppData() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("See app data")
+            clickOnTextAndWaitForNewWindow("See app data")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("Activity")
+            scrollDownToAndFindText("Steps")
+            scrollDownToAndFindText("Cycle tracking")
+            scrollDownToAndFindText("Menstruation")
+            scrollDownToAndFindText("Sleep")
+            scrollDownToAndFindText("Vitals")
+            scrollDownToAndFindText("Heart rate")
+        }
+    }
+
+    @Test
+    fun clickOnAppDataType_navigatesToAppEntries() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("See app data")
+            clickOnTextAndWaitForNewWindow("See app data")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            findText("Activity")
+            clickOnTextAndWaitForNewWindow("Steps")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            verifyTextNotFound("Entries")
+            verifyTextNotFound("Access")
+        }
+    }
+
+    @Test
+    fun appDataFragment_deletesAllData() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("See app data")
+            clickOnTextAndWaitForNewWindow("See app data")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            verifyObjectNotFound(By.text("Select all"))
+            findObjectAndClick(By.desc("Enter deletion"))
+            scrollUpTo(By.text("Select all"))
+            findTextAndClick("Select all")
+            findObjectAndClick(By.desc("Delete data"))
+            findTextAndClick("Delete")
+            waitDisplayed(By.text("Done"), Duration.ofSeconds(3))
+            findTextAndClick("Done")
+            findText("No data")
+        }
+    }
+
+    private fun insertData() {
+        TEST_WRITER_APP.insertRecords(
+            mutableListOf(
+                StepsRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(2), 10).build(),
+                HeartRateRecord.Builder(
+                        newEmptyMetadata(),
+                        NOW,
+                        NOW.plusSeconds(10),
+                        listOf(HeartRateRecord.HeartRateSample(140, NOW)),
+                    )
+                    .build(),
+                MenstruationPeriodRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(10))
+                    .build(),
+                SleepSessionRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(1000)).build(),
+            )
+                as List<Record>?
+        )
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/AppEntriesFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/newia/AppEntriesFragmentTest.kt
similarity index 66%
rename from tests/cts/src/android/healthconnect/cts/ui/AppEntriesFragmentTest.kt
rename to tests/cts/src/android/healthconnect/cts/ui/newia/AppEntriesFragmentTest.kt
index 09c7850..bae96c5 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/AppEntriesFragmentTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/newia/AppEntriesFragmentTest.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.healthconnect.cts.ui
+package android.healthconnect.cts.ui.newia
 
 import android.health.connect.datatypes.HeartRateRecord
 import android.health.connect.datatypes.MenstruationPeriodRecord
@@ -23,17 +23,23 @@
 import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
 import android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata
 import android.healthconnect.cts.lib.TestAppProxy
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findObjectAndClick
 import android.healthconnect.cts.lib.UiTestUtils.findText
 import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
 import android.healthconnect.cts.lib.UiTestUtils.scrollDownTo
-import android.healthconnect.cts.lib.UiTestUtils.scrollToEnd
+import android.healthconnect.cts.lib.UiTestUtils.scrollUpTo
+import android.healthconnect.cts.lib.UiTestUtils.verifyObjectNotFound
 import android.healthconnect.cts.lib.UiTestUtils.verifyTextNotFound
+import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
+import android.healthconnect.cts.ui.HealthConnectBaseTest
 import android.healthconnect.cts.utils.TestUtils
 import android.platform.test.annotations.RequiresFlagsEnabled
 import android.platform.test.flag.junit.CheckFlagsRule
 import android.platform.test.flag.junit.DeviceFlagsValueProvider
 import androidx.test.uiautomator.By
 import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
+import java.time.Duration
 import java.time.Instant
 import org.junit.After
 import org.junit.Before
@@ -66,19 +72,18 @@
     fun appEntriesScreen_displaysCorrectly() {
         context.launchMainActivity {
             scrollDownTo(By.text("App permissions"))
-            findTextAndClick("App permissions")
-            findTextAndClick("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            clickOnTextAndWaitForNewWindow("App permissions")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
 
-            scrollToEnd()
-            findTextAndClick("See app data")
+            scrollDownTo(By.text("See app data"))
+            clickOnTextAndWaitForNewWindow("See app data")
 
             findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
 
             findText("Activity")
-            findTextAndClick("Steps")
+            clickOnTextAndWaitForNewWindow("Steps")
 
-            // TODO (b/360887258) Check for display when app header shown here
-            //            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
             verifyTextNotFound("Entries")
             verifyTextNotFound("Access")
             findText("10 steps")
@@ -90,6 +95,32 @@
         }
     }
 
+    @Test
+    fun appEntriesScreen_deletesAllData() {
+        context.launchMainActivity {
+            scrollDownTo(By.text("App permissions"))
+            clickOnTextAndWaitForNewWindow("App permissions")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownTo(By.text("See app data"))
+            clickOnTextAndWaitForNewWindow("See app data")
+
+            findText("Activity")
+            clickOnTextAndWaitForNewWindow("Steps")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            verifyObjectNotFound(By.text("Select all"))
+            findObjectAndClick(By.desc("Enter deletion"))
+            scrollUpTo(By.text("Select all"))
+            findTextAndClick("Select all")
+            findObjectAndClick(By.desc("Delete data"))
+            findTextAndClick("Delete")
+            waitDisplayed(By.text("Done"), Duration.ofSeconds(3))
+            findTextAndClick("Done")
+            findText("No data")
+        }
+    }
+
     private fun insertData() {
         TEST_WRITER_APP.insertRecords(
             mutableListOf(
diff --git a/tests/cts/src/android/healthconnect/cts/ui/permissions/AdditionalPermissionsRequestUITest.kt b/tests/cts/src/android/healthconnect/cts/ui/permissions/AdditionalPermissionsRequestUITest.kt
index fd49128..0386612 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/permissions/AdditionalPermissionsRequestUITest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/permissions/AdditionalPermissionsRequestUITest.kt
@@ -24,14 +24,15 @@
 import android.health.connect.HealthPermissions.*
 import android.healthconnect.cts.lib.ActivityLauncher.launchRequestPermissionActivity
 import android.healthconnect.cts.lib.UiTestUtils.TEST_APP_PACKAGE_NAME
-import android.healthconnect.cts.lib.UiTestUtils.clickOnText
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
 import android.healthconnect.cts.lib.UiTestUtils.grantPermissionViaPackageManager
 import android.healthconnect.cts.lib.UiTestUtils.revokePermissionViaPackageManager
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
 import android.healthconnect.cts.lib.UiTestUtils.skipOnboardingIfAppears
-import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
 import android.healthconnect.cts.ui.HealthConnectBaseTest
 import android.healthconnect.cts.utils.ProxyActivity
-import androidx.test.uiautomator.By
 import com.android.compatibility.common.util.SystemUtil
 import com.android.compatibility.common.util.UiAutomatorUtils2.getUiDevice
 import com.google.common.truth.Truth
@@ -46,7 +47,10 @@
     fun setup() {
         revokePermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            READ_HEALTH_DATA_IN_BACKGROUND,
+        )
         with(getUiDevice()) { executeShellCommand("settings put system font_scale 0.85") }
     }
 
@@ -54,7 +58,10 @@
     fun tearDown() {
         revokePermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            READ_HEALTH_DATA_IN_BACKGROUND,
+        )
         revokePermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEIGHT)
     }
 
@@ -63,15 +70,19 @@
         val permissions = listOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
         grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEIGHT)
         context.launchRequestPermissionActivity(
-            packageName = TEST_APP_PACKAGE_NAME, permissions = permissions) {
-                waitDisplayed(By.text("Allow additional access for Health Connect cts test app?"))
-                clickOnText("Access past data")
-                clickOnText("Access data in the background")
-                clickOnText("Allow")
+            packageName = TEST_APP_PACKAGE_NAME,
+            permissions = permissions,
+        ) {
+            findText("Allow additional access for Health Connect cts test app?")
+            scrollDownToAndFindText("Access past data")
+            findTextAndClick("Access past data")
+            scrollDownToAndFindText("Access data in the background")
+            findTextAndClick("Access data in the background")
+            clickOnTextAndWaitForNewWindow("Allow")
 
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
-            }
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
+        }
     }
 
     @Test
@@ -79,15 +90,19 @@
         val permissions = listOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
         grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEIGHT)
         context.launchRequestPermissionActivity(
-            packageName = TEST_APP_PACKAGE_NAME, permissions = permissions) {
-                waitDisplayed(By.text("Allow additional access for Health Connect cts test app?"))
-                clickOnText("Access past data")
-                clickOnText("Access data in the background")
-                clickOnText("Don't allow")
+            packageName = TEST_APP_PACKAGE_NAME,
+            permissions = permissions,
+        ) {
+            findText("Allow additional access for Health Connect cts test app?")
+            scrollDownToAndFindText("Access past data")
+            findTextAndClick("Access past data")
+            scrollDownToAndFindText("Access data in the background")
+            findTextAndClick("Access data in the background")
+            clickOnTextAndWaitForNewWindow("Don't allow")
 
-                assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
-                assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
-            }
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
+        }
     }
 
     @Test
@@ -95,14 +110,17 @@
         val permissions = listOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
         grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEIGHT)
         context.launchRequestPermissionActivity(
-            packageName = TEST_APP_PACKAGE_NAME, permissions = permissions) {
-                waitDisplayed(By.text("Allow additional access for Health Connect cts test app?"))
-                clickOnText("Access past data")
-                clickOnText("Allow")
+            packageName = TEST_APP_PACKAGE_NAME,
+            permissions = permissions,
+        ) {
+            findText("Allow additional access for Health Connect cts test app?")
+            scrollDownToAndFindText("Access past data")
+            findTextAndClick("Access past data")
+            clickOnTextAndWaitForNewWindow("Allow")
 
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
-                assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
-            }
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
+        }
     }
 
     @Test
@@ -111,20 +129,22 @@
         grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEIGHT)
         grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
         context.launchRequestPermissionActivity(
-            packageName = TEST_APP_PACKAGE_NAME, permissions = permissions) {
-                waitDisplayed(
-                    By.text("Allow Health Connect cts test app to access data in the background?"))
-                clickOnText("Allow")
+            packageName = TEST_APP_PACKAGE_NAME,
+            permissions = permissions,
+        ) {
+            findText("Allow Health Connect cts test app to access data in the background?")
+            clickOnTextAndWaitForNewWindow("Allow")
 
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
-            }
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
+        }
     }
 
     @Test
-    @Ignore("TODO: b/334538512")
+    @Ignore("b/382029765")
     fun requestAdditionalPermissions_noReadPermissions_returnsResultCanceled() {
         revokePermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEIGHT)
+        revokePermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_MINDFULNESS)
         val permissions = listOf(READ_HEALTH_DATA_HISTORY, READ_HEALTH_DATA_IN_BACKGROUND)
 
         val intent =
@@ -137,10 +157,12 @@
 
         SystemUtil.runWithShellPermissionIdentity(
             {
-                val result = ProxyActivity.launchActivityForResult(intent) { skipOnboardingIfAppears() }
+                val result =
+                    ProxyActivity.launchActivityForResult(intent) { skipOnboardingIfAppears() }
                 Truth.assertThat(result.resultCode).isEqualTo(Activity.RESULT_CANCELED)
             },
-            Manifest.permission.GRANT_RUNTIME_PERMISSIONS)
+            Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
+        )
     }
 
     @Test
@@ -152,23 +174,27 @@
                 READ_HEIGHT,
                 WRITE_BODY_FAT,
                 READ_HEALTH_DATA_HISTORY,
-                READ_HEALTH_DATA_IN_BACKGROUND)
+                READ_HEALTH_DATA_IN_BACKGROUND,
+            )
         context.launchRequestPermissionActivity(
-            packageName = TEST_APP_PACKAGE_NAME, permissions = permissions) {
-                waitDisplayed(
-                    By.text("Allow Health Connect cts test app to access Health Connect?"))
-                clickOnText("Height")
-                clickOnText("Allow")
+            packageName = TEST_APP_PACKAGE_NAME,
+            permissions = permissions,
+        ) {
+            findText("Allow Health Connect cts test app to access Health Connect?")
+            scrollDownToAndFindText("Height")
+            findTextAndClick("Height")
+            clickOnTextAndWaitForNewWindow("Allow")
 
-                waitDisplayed(By.text("Allow additional access for Health Connect cts test app?"))
-                clickOnText("Access past data")
-                clickOnText("Allow")
+            findText("Allow additional access for Health Connect cts test app?")
+            scrollDownToAndFindText("Access past data")
+            findTextAndClick("Access past data")
+            clickOnTextAndWaitForNewWindow("Allow")
 
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEIGHT)
-                assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, WRITE_BODY_FAT)
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
-                assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
-            }
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEIGHT)
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, WRITE_BODY_FAT)
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_HISTORY)
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEALTH_DATA_IN_BACKGROUND)
+        }
     }
 
     @Throws(Exception::class)
diff --git a/tests/cts/src/android/healthconnect/cts/ui/ExerciseRouteRequestTest.kt b/tests/cts/src/android/healthconnect/cts/ui/permissions/ExerciseRouteRequestTest.kt
similarity index 93%
rename from tests/cts/src/android/healthconnect/cts/ui/ExerciseRouteRequestTest.kt
rename to tests/cts/src/android/healthconnect/cts/ui/permissions/ExerciseRouteRequestTest.kt
index 2d9eb63..2be1b8b 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/ExerciseRouteRequestTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/permissions/ExerciseRouteRequestTest.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.healthconnect.cts.ui
+package android.healthconnect.cts.ui.permissions
 
 import android.app.Activity
 import android.content.Intent
@@ -29,12 +29,11 @@
 import android.healthconnect.cts.lib.TestAppProxy
 import android.healthconnect.cts.lib.UiTestUtils.clickOnText
 import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
-import android.healthconnect.cts.lib.UiTestUtils.waitNotDisplayed
+import android.healthconnect.cts.ui.HealthConnectBaseTest
 import android.healthconnect.cts.utils.DataFactory.getEmptyMetadata
 import android.healthconnect.cts.utils.PermissionHelper.READ_EXERCISE_ROUTES
 import android.healthconnect.cts.utils.PermissionHelper.getDeclaredHealthPermissions
 import android.healthconnect.cts.utils.PermissionHelper.grantPermission
-import android.healthconnect.cts.utils.PermissionHelper.runWithDeviceConfigForController
 import android.healthconnect.cts.utils.PermissionHelper.runWithRevokedPermission
 import android.healthconnect.cts.utils.PermissionHelper.runWithUserFixedPermission
 import android.healthconnect.cts.utils.ProxyActivity
@@ -47,7 +46,6 @@
 import java.time.Instant
 import org.junit.AfterClass
 import org.junit.Assert.assertThrows
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 
@@ -59,14 +57,13 @@
         RevokedHealthPermissionRule(ROUTE_READER_WRITER_APP.getPackageName(), READ_EXERCISE_ROUTES)
 
     companion object {
-        private const val READ_ROUTES_ALL_FEATURE_FLAG = "exercise_routes_read_all_enable"
         private val ROUTE_READER_WRITER_APP =
             TestAppProxy.forPackageName("android.healthconnect.cts.testapp.readWritePerms.A")
 
         @JvmStatic
         @AfterClass
         fun tearDown() {
-            if (!TestUtils.isHardwareSupported()) {
+            if (!TestUtils.isHealthConnectFullySupported()) {
                 return
             }
             TestUtils.verifyDeleteRecords(
@@ -403,31 +400,6 @@
     }
 
     @Test
-    @Ignore("b/322300333#comment5")
-    fun requestRoute_allowAllFeatureOff_allowAllNotDisplayed() {
-        val record = getExerciseSessionWithRoute()
-        val recordId = insertRecordAndGetId(record)
-        val requestIntent =
-            Intent(ACTION_REQUEST_EXERCISE_ROUTE).putExtra(EXTRA_SESSION_ID, recordId)
-
-        val result =
-            runWithDeviceConfigForController(READ_ROUTES_ALL_FEATURE_FLAG, "false") {
-                ROUTE_READER_WRITER_APP.startActivityForResult(requestIntent) {
-                    waitNotDisplayed(By.text("Allow all routes"))
-                    waitDisplayed(By.text("Don't allow"))
-                    clickOnText("Allow this route")
-                }
-            }
-
-        assertThat(result.resultCode).isEqualTo(Activity.RESULT_OK)
-        val extras = result.resultData.extras!!
-        assertThat(extras.keySet()).containsExactly(EXTRA_EXERCISE_ROUTE, EXTRA_SESSION_ID)
-        assertThat(extras.getParcelable(EXTRA_EXERCISE_ROUTE, ExerciseRoute::class.java))
-            .isEqualTo(record.route)
-        assertThat(extras.getString(EXTRA_SESSION_ID)).isEqualTo(recordId)
-    }
-
-    @Test
     fun requestRoute_enforcesAccessTimeLimits() {
         val record =
             getExerciseSessionWithRoute(
diff --git a/tests/cts/src/android/healthconnect/cts/ui/permissions/ManageAppHealthPermissionUITest.kt b/tests/cts/src/android/healthconnect/cts/ui/permissions/ManageAppHealthPermissionUITest.kt
index 4a9a32d..ff21de5 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/permissions/ManageAppHealthPermissionUITest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/permissions/ManageAppHealthPermissionUITest.kt
@@ -18,23 +18,25 @@
 
 import android.content.pm.PackageManager
 import android.health.connect.HealthPermissions.READ_HEIGHT
+import android.health.connect.HealthPermissions.READ_MINDFULNESS
 import android.health.connect.HealthPermissions.WRITE_BODY_FAT
 import android.health.connect.HealthPermissions.WRITE_HEIGHT
+import android.health.connect.HealthPermissions.WRITE_STEPS
 import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
 import android.healthconnect.cts.lib.UiTestUtils.TEST_APP_PACKAGE_NAME
-import android.healthconnect.cts.lib.UiTestUtils.clickOnContentDescription
+import android.healthconnect.cts.lib.UiTestUtils.clickOnDescAndWaitForNewWindow
 import android.healthconnect.cts.lib.UiTestUtils.clickOnText
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
 import android.healthconnect.cts.lib.UiTestUtils.grantPermissionViaPackageManager
 import android.healthconnect.cts.lib.UiTestUtils.navigateBackToHomeScreen
 import android.healthconnect.cts.lib.UiTestUtils.revokePermissionViaPackageManager
-import android.healthconnect.cts.lib.UiTestUtils.scrollDownTo
-import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
 import android.healthconnect.cts.ui.HealthConnectBaseTest
 import android.platform.test.annotations.RequiresFlagsDisabled
 import android.platform.test.flag.junit.CheckFlagsRule
 import android.platform.test.flag.junit.DeviceFlagsValueProvider
-import androidx.test.uiautomator.By
-import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
 import org.junit.Rule
@@ -49,23 +51,7 @@
         context.launchMainActivity {
             navigateToManageAppPermissions()
 
-            waitDisplayed(By.text("Height"))
-        }
-    }
-
-    @Test
-    @RequiresFlagsDisabled(FLAG_NEW_INFORMATION_ARCHITECTURE)
-    fun showsAdditionalPermissions() {
-        context.launchMainActivity {
-            navigateToManageAppPermissions()
-
-            scrollDownTo(By.text("Delete app data"))
-            waitDisplayed(By.text("Delete app data"))
-            scrollDownTo(By.text("Additional access"))
-            waitDisplayed(By.text("Additional access"))
-            clickOnText("Additional access")
-            waitDisplayed(By.text("Access past data"))
-            waitDisplayed(By.text("Access data in the background"))
+            scrollDownToAndFindText("Height")
         }
     }
 
@@ -75,8 +61,9 @@
         context.launchMainActivity {
             navigateToManageAppPermissions()
 
-            clickOnText("Body fat")
-            clickOnContentDescription("Navigate up")
+            scrollDownToAndFindText("Body fat")
+            findTextAndClick("Body fat")
+            clickOnDescAndWaitForNewWindow("Navigate up")
 
             assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, WRITE_BODY_FAT)
         }
@@ -89,8 +76,9 @@
             navigateToManageAppPermissions()
             assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, WRITE_BODY_FAT)
 
-            clickOnText("Body fat")
-            clickOnContentDescription("Navigate up")
+            scrollDownToAndFindText("Body fat")
+            findTextAndClick("Body fat")
+            clickOnDescAndWaitForNewWindow("Navigate up")
 
             assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, WRITE_BODY_FAT)
         }
@@ -99,33 +87,25 @@
     @Test
     fun revokeAllPermissions_revokesAllAppPermissions() {
         grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEIGHT)
+        grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_MINDFULNESS)
         grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, WRITE_HEIGHT)
         grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, WRITE_BODY_FAT)
+        grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, WRITE_STEPS)
 
         context.launchMainActivity {
             navigateToManageAppPermissions()
-            clickOnText("Allow all")
-            waitDisplayed(By.text("Remove all permissions?"))
+            scrollDownToAndFindText("Allow all")
+            findTextAndClick("Allow all")
+            findText("Remove all permissions?")
+            findText("Also delete Health Connect cts test app data from Health Connect")
             clickOnText("Remove all")
-            clickOnContentDescription("Navigate up")
+            clickOnDescAndWaitForNewWindow("Navigate up")
 
             assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_HEIGHT)
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, READ_MINDFULNESS)
             assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, WRITE_HEIGHT)
-        }
-    }
-
-    @Test
-    fun revokeAllPermissions_allowsUserToDeleteAppData() {
-        grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, READ_HEIGHT)
-        grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, WRITE_HEIGHT)
-        grantPermissionViaPackageManager(context, TEST_APP_PACKAGE_NAME, WRITE_BODY_FAT)
-        context.launchMainActivity {
-            navigateToManageAppPermissions()
-            clickOnText("Allow all")
-            waitDisplayed(By.text("Remove all permissions?"))
-            waitDisplayed(
-                By.text("Also delete Health Connect cts test app data from Health Connect")
-            )
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, WRITE_BODY_FAT)
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, WRITE_STEPS)
         }
     }
 
@@ -142,10 +122,12 @@
     }
 
     private fun navigateToManageAppPermissions() {
-        clickOnText("App permissions")
-        clickOnText("Health Connect cts test app")
-        waitDisplayed(By.text("Health Connect cts test app"))
-        waitDisplayed(By.text("Allowed to read"))
+        scrollDownToAndFindText("App permissions")
+        clickOnTextAndWaitForNewWindow("App permissions")
+        scrollDownToAndFindText("Health Connect cts test app")
+        clickOnTextAndWaitForNewWindow("Health Connect cts test app")
+        scrollDownToAndFindText("Health Connect cts test app")
+        scrollDownToAndFindText("Allowed to read")
     }
 
     @After
diff --git a/tests/cts/src/android/healthconnect/cts/ui/permissions/ManageHealthPermissionsUITest.kt b/tests/cts/src/android/healthconnect/cts/ui/permissions/ManageHealthPermissionsUITest.kt
index 9b0dfc1..2b77de3 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/permissions/ManageHealthPermissionsUITest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/permissions/ManageHealthPermissionsUITest.kt
@@ -16,19 +16,17 @@
 
 package android.healthconnect.cts.ui.permissions
 
-import android.content.pm.PackageManager
 import android.health.connect.HealthPermissions
 import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
 import android.healthconnect.cts.lib.UiTestUtils.TEST_APP_PACKAGE_NAME
-import android.healthconnect.cts.lib.UiTestUtils.clickOnContentDescription
-import android.healthconnect.cts.lib.UiTestUtils.clickOnText
+import android.healthconnect.cts.lib.UiTestUtils.clickOnDescAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
 import android.healthconnect.cts.lib.UiTestUtils.grantPermissionViaPackageManager
-import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
 import android.healthconnect.cts.ui.HealthConnectBaseTest
-import androidx.test.uiautomator.By
-import com.google.common.truth.Truth
 import org.junit.After
-import org.junit.Ignore
 import org.junit.Test
 
 class ManageHealthPermissionsUITest : HealthConnectBaseTest() {
@@ -37,34 +35,34 @@
     fun showsListOfHealthConnectApps() {
         context.launchMainActivity {
             navigateToManagePermissions()
-            waitDisplayed(By.text("Health Connect cts test app"))
+            scrollDownToAndFindText("Health Connect cts test app")
         }
     }
 
     @Test
-    @Ignore("TODO(b/265789268): Fix flaky \"Help & feedback\" not found")
     fun showsHelpAndFeedback() {
         context.launchMainActivity {
             navigateToManagePermissions()
-
-            waitDisplayed(By.text("Help & feedback"))
+            scrollDownToAndFindText("Settings & help")
         }
     }
 
     @Test
-    @Ignore("TODO(b/265789268):Fix flaky \"Remove access for all apps\" not found")
-    fun revokeAllPermissions_revokeAllConnectedAppsPermission() {
+    fun revokeAllPermissions_showsRevokeAllConnectedAppsPermission() {
         grantPermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.READ_HEIGHT,
+        )
 
         context.launchMainActivity {
             navigateToManagePermissions()
 
-            clickOnText("Remove access for all apps")
-            clickOnText("Remove all")
-
-            waitDisplayed(By.text("Not allowed access"))
-            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            scrollDownToAndFindText("Remove access for all apps")
+            findTextAndClick("Remove access for all apps")
+            findText("Remove all")
+            // We cannot actually revoke all the permissions because that would also
+            // revoke the test app permissions and lead to a test crash
         }
     }
 
@@ -72,30 +70,33 @@
     fun showSearchOption() {
         context.launchMainActivity {
             navigateToManagePermissions()
-
-            clickOnContentDescription("Search apps")
-
-            waitDisplayed(By.text("Search apps"))
+            clickOnDescAndWaitForNewWindow("Search apps")
+            findText("Search apps")
         }
     }
 
     @After
     fun tearDown() {
         grantPermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.READ_HEIGHT,
+        )
         grantPermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.WRITE_HEIGHT,
+        )
         grantPermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_BODY_FAT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.WRITE_BODY_FAT,
+        )
     }
 
     private fun navigateToManagePermissions() {
-        clickOnText("App permissions")
-        waitDisplayed(By.text("Allowed access"))
-    }
-
-    private fun assertPermNotGrantedForApp(packageName: String, permName: String) {
-        Truth.assertThat(context.packageManager.checkPermission(permName, packageName))
-            .isEqualTo(PackageManager.PERMISSION_DENIED)
+        scrollDownToAndFindText("App permissions")
+        clickOnTextAndWaitForNewWindow("App permissions")
+        scrollDownToAndFindText("Allowed access")
     }
 }
diff --git a/tests/cts/src/android/healthconnect/cts/ui/permissions/MedicalPermissionsRequestUITest.kt b/tests/cts/src/android/healthconnect/cts/ui/permissions/MedicalPermissionsRequestUITest.kt
new file mode 100644
index 0000000..c8f751f
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/ui/permissions/MedicalPermissionsRequestUITest.kt
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.ui.permissions
+
+import android.content.pm.PackageManager
+import android.health.connect.HealthPermissions
+import android.healthconnect.cts.lib.ActivityLauncher.launchRequestPermissionActivity
+import android.healthconnect.cts.lib.UiTestUtils.TEST_APP_2_PACKAGE_NAME
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
+import android.healthconnect.cts.lib.UiTestUtils.grantPermissionViaPackageManager
+import android.healthconnect.cts.lib.UiTestUtils.revokePermissionViaPackageManager
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.lib.UiTestUtils.verifyTextNotFound
+import android.healthconnect.cts.ui.HealthConnectBaseTest
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+
+class MedicalPermissionsRequestUITest : HealthConnectBaseTest() {
+
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalWrite_allow_grantsPermission() {
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.WRITE_MEDICAL_DATA,
+        )
+        context.launchRequestPermissionActivity(
+            packageName = TEST_APP_2_PACKAGE_NAME,
+            permissions = listOf(HealthPermissions.WRITE_MEDICAL_DATA),
+        ) {
+            scrollDownToAndFindText(
+                "Allow Health Connect cts test app 2 to access your health records?"
+            )
+            scrollDownToAndFindText("Data to share includes")
+
+            clickOnTextAndWaitForNewWindow("Allow")
+            assertPermGrantedForApp(TEST_APP_2_PACKAGE_NAME, HealthPermissions.WRITE_MEDICAL_DATA)
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalWrite_dontAllow_doesNotGrantPermission() {
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.WRITE_MEDICAL_DATA,
+        )
+        context.launchRequestPermissionActivity(
+            packageName = TEST_APP_2_PACKAGE_NAME,
+            permissions = listOf(HealthPermissions.WRITE_MEDICAL_DATA),
+        ) {
+            scrollDownToAndFindText(
+                "Allow Health Connect cts test app 2 to access your health records?"
+            )
+            scrollDownToAndFindText("Data to share includes")
+
+            clickOnTextAndWaitForNewWindow("Don't allow")
+            assertPermNotGrantedForApp(
+                TEST_APP_2_PACKAGE_NAME,
+                HealthPermissions.WRITE_MEDICAL_DATA,
+            )
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalReadAndWrite_showsRequestedPermissions() {
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.WRITE_MEDICAL_DATA,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+        )
+        context.launchRequestPermissionActivity(
+            packageName = TEST_APP_2_PACKAGE_NAME,
+            permissions =
+                listOf(
+                    HealthPermissions.WRITE_MEDICAL_DATA,
+                    HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+                    HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                ),
+        ) {
+            scrollDownToAndFindText(
+                "Allow Health Connect cts test app 2 to access your health records?"
+            )
+            scrollDownToAndFindText("Allergies")
+            scrollDownToAndFindText("Conditions")
+            scrollDownToAndFindText("All health records")
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalReadAndWrite_doesNotShowGrantedPermissions() {
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.WRITE_MEDICAL_DATA,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+        )
+        grantPermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+        )
+        context.launchRequestPermissionActivity(
+            packageName = TEST_APP_2_PACKAGE_NAME,
+            permissions =
+                listOf(
+                    HealthPermissions.WRITE_MEDICAL_DATA,
+                    HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+                    HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                ),
+        ) {
+            scrollDownToAndFindText(
+                "Allow Health Connect cts test app 2 to access your health records?"
+            )
+            scrollDownToAndFindText("Allergies")
+
+            verifyTextNotFound("Conditions")
+
+            scrollDownToAndFindText("All health records")
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalReadAndWrite_grantsOnlyRequestedPermissions() {
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.WRITE_MEDICAL_DATA,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+        )
+        context.launchRequestPermissionActivity(
+            packageName = TEST_APP_2_PACKAGE_NAME,
+            permissions =
+                listOf(
+                    HealthPermissions.WRITE_MEDICAL_DATA,
+                    HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+                    HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                ),
+        ) {
+            scrollDownToAndFindText(
+                "Allow Health Connect cts test app 2 to access your health records?"
+            )
+            scrollDownToAndFindText("Allergies")
+            findTextAndClick("Allergies")
+
+            scrollDownToAndFindText("Conditions")
+
+            scrollDownToAndFindText("All health records")
+            findTextAndClick("All health records")
+
+            clickOnTextAndWaitForNewWindow("Allow")
+
+            assertPermGrantedForApp(TEST_APP_2_PACKAGE_NAME, HealthPermissions.WRITE_MEDICAL_DATA)
+            assertPermGrantedForApp(
+                TEST_APP_2_PACKAGE_NAME,
+                HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+            )
+            assertPermNotGrantedForApp(
+                TEST_APP_2_PACKAGE_NAME,
+                HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+            )
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalReadAndWrite_allowAll_grantsAllRequestedPermissions() {
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.WRITE_MEDICAL_DATA,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+        )
+        context.launchRequestPermissionActivity(
+            packageName = TEST_APP_2_PACKAGE_NAME,
+            permissions =
+                listOf(
+                    HealthPermissions.WRITE_MEDICAL_DATA,
+                    HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+                    HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                ),
+        ) {
+            findText("Allow Health Connect cts test app 2 to access your health records?")
+            scrollDownToAndFindText("Allow all")
+            findTextAndClick("Allow all")
+
+            clickOnTextAndWaitForNewWindow("Allow")
+
+            assertPermGrantedForApp(TEST_APP_2_PACKAGE_NAME, HealthPermissions.WRITE_MEDICAL_DATA)
+            assertPermGrantedForApp(
+                TEST_APP_2_PACKAGE_NAME,
+                HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+            )
+            assertPermGrantedForApp(
+                TEST_APP_2_PACKAGE_NAME,
+                HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+            )
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    fun requestMedicalReadAndWrite_dontAllow_doesNotGrantPermissions() {
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.WRITE_MEDICAL_DATA,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+        )
+        revokePermissionViaPackageManager(
+            context,
+            TEST_APP_2_PACKAGE_NAME,
+            HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+        )
+        context.launchRequestPermissionActivity(
+            packageName = TEST_APP_2_PACKAGE_NAME,
+            permissions =
+                listOf(
+                    HealthPermissions.WRITE_MEDICAL_DATA,
+                    HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+                    HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                ),
+        ) {
+            findText("Allow Health Connect cts test app 2 to access your health records?")
+
+            clickOnTextAndWaitForNewWindow("Don't allow")
+
+            assertPermNotGrantedForApp(
+                TEST_APP_2_PACKAGE_NAME,
+                HealthPermissions.WRITE_MEDICAL_DATA,
+            )
+            assertPermNotGrantedForApp(
+                TEST_APP_2_PACKAGE_NAME,
+                HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+            )
+            assertPermNotGrantedForApp(
+                TEST_APP_2_PACKAGE_NAME,
+                HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+            )
+        }
+    }
+
+    @Throws(Exception::class)
+    private fun assertPermGrantedForApp(packageName: String, permName: String) {
+        Truth.assertThat(context.packageManager.checkPermission(permName, packageName))
+            .isEqualTo(PackageManager.PERMISSION_GRANTED)
+    }
+
+    @Throws(Exception::class)
+    private fun assertPermNotGrantedForApp(packageName: String, permName: String) {
+        Truth.assertThat(context.packageManager.checkPermission(permName, packageName))
+            .isEqualTo(PackageManager.PERMISSION_DENIED)
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/permissions/RequestHealthPermissionUITest.kt b/tests/cts/src/android/healthconnect/cts/ui/permissions/RequestHealthPermissionUITest.kt
index 80e3472..970d2a9 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/permissions/RequestHealthPermissionUITest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/permissions/RequestHealthPermissionUITest.kt
@@ -20,14 +20,17 @@
 import android.health.connect.HealthPermissions
 import android.healthconnect.cts.lib.ActivityLauncher.launchRequestPermissionActivity
 import android.healthconnect.cts.lib.UiTestUtils.TEST_APP_PACKAGE_NAME
-import android.healthconnect.cts.lib.UiTestUtils.clickOnText
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.findTextAndClick
 import android.healthconnect.cts.lib.UiTestUtils.grantPermissionViaPackageManager
 import android.healthconnect.cts.lib.UiTestUtils.revokePermissionViaPackageManager
-import android.healthconnect.cts.lib.UiTestUtils.waitDisplayed
-import android.healthconnect.cts.lib.UiTestUtils.waitNotDisplayed
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.lib.UiTestUtils.waitForObjectNotFound
 import android.healthconnect.cts.ui.HealthConnectBaseTest
 import androidx.test.uiautomator.By
 import com.google.common.truth.Truth
+import java.time.Duration.ofSeconds
 import org.junit.After
 import org.junit.Test
 
@@ -36,77 +39,114 @@
     @Test
     fun showsAppName_showsRequestedPermissions() {
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.READ_HEIGHT,
+        )
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_BODY_FAT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.WRITE_BODY_FAT,
+        )
         context.launchRequestPermissionActivity(
             packageName = TEST_APP_PACKAGE_NAME,
-            permissions = listOf(HealthPermissions.READ_HEIGHT, HealthPermissions.WRITE_BODY_FAT)) {
-                waitDisplayed(
-                    By.text("Allow Health Connect cts test app to access Health Connect?"))
-                waitDisplayed(By.text("Height"))
-                waitDisplayed(By.text("Body fat"))
-            }
+            permissions = listOf(HealthPermissions.READ_HEIGHT, HealthPermissions.WRITE_BODY_FAT),
+        ) {
+            findText("Allow Health Connect cts test app to access Health Connect?")
+            scrollDownToAndFindText("Height")
+            scrollDownToAndFindText("Body fat")
+        }
     }
 
     @Test
     fun requestGrantedPermissions_doesNotShowGrantedPermissions() {
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_BODY_FAT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.WRITE_BODY_FAT,
+        )
         grantPermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.READ_HEIGHT,
+        )
 
         context.launchRequestPermissionActivity(
             packageName = TEST_APP_PACKAGE_NAME,
-            permissions = listOf(HealthPermissions.READ_HEIGHT, HealthPermissions.WRITE_BODY_FAT)) {
-                waitNotDisplayed(By.text("Height"))
-                waitDisplayed(By.text("Body fat"))
-            }
+            permissions = listOf(HealthPermissions.READ_HEIGHT, HealthPermissions.WRITE_BODY_FAT),
+        ) {
+            waitForObjectNotFound(By.text("Height"), timeout = ofSeconds(1))
+            scrollDownToAndFindText("Body fat")
+        }
     }
 
     @Test
     fun grantPermission_grantsOnlyRequestedPermission() {
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.READ_HEIGHT,
+        )
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_BODY_FAT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.WRITE_BODY_FAT,
+        )
         context.launchRequestPermissionActivity(
             packageName = TEST_APP_PACKAGE_NAME,
-            permissions = listOf(HealthPermissions.READ_HEIGHT, HealthPermissions.WRITE_BODY_FAT)) {
-                clickOnText("Height")
+            permissions = listOf(HealthPermissions.READ_HEIGHT, HealthPermissions.WRITE_BODY_FAT),
+        ) {
+            scrollDownToAndFindText("Height")
+            findTextAndClick("Height")
+            clickOnTextAndWaitForNewWindow("Allow")
 
-                clickOnText("Allow")
-
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
-                assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_BODY_FAT)
-            }
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            assertPermNotGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_BODY_FAT)
+        }
     }
 
     @Test
     fun grantAllPermissions_grantsAllPermissions() {
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.READ_HEIGHT,
+        )
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.WRITE_HEIGHT,
+        )
         context.launchRequestPermissionActivity(
             packageName = TEST_APP_PACKAGE_NAME,
-            permissions = listOf(HealthPermissions.READ_HEIGHT, HealthPermissions.WRITE_HEIGHT)) {
-                clickOnText("Allow all")
-                clickOnText("Allow")
+            permissions = listOf(HealthPermissions.READ_HEIGHT, HealthPermissions.WRITE_HEIGHT),
+        ) {
+            scrollDownToAndFindText("Allow all")
+            findTextAndClick("Allow all")
+            clickOnTextAndWaitForNewWindow("Allow")
 
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
-                assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_HEIGHT)
-            }
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            assertPermGrantedForApp(TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_HEIGHT)
+        }
     }
 
     @After
     fun tearDown() {
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.READ_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.READ_HEIGHT,
+        )
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_HEIGHT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.WRITE_HEIGHT,
+        )
         revokePermissionViaPackageManager(
-            context, TEST_APP_PACKAGE_NAME, HealthPermissions.WRITE_BODY_FAT)
+            context,
+            TEST_APP_PACKAGE_NAME,
+            HealthPermissions.WRITE_BODY_FAT,
+        )
     }
 
     @Throws(Exception::class)
diff --git a/tests/cts/src/android/healthconnect/cts/ui/phr/AllMedicalDataFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/phr/AllMedicalDataFragmentTest.kt
new file mode 100644
index 0000000..461f75d
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/ui/phr/AllMedicalDataFragmentTest.kt
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.cts.ui.phr
+
+import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
+import android.healthconnect.cts.lib.TestAppProxy
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY
+import android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION
+import android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest
+import android.healthconnect.cts.ui.HealthConnectBaseTest
+import android.healthconnect.cts.utils.TestUtils
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@RequiresFlagsEnabled(
+    FLAG_NEW_INFORMATION_ARCHITECTURE,
+    FLAG_PERSONAL_HEALTH_RECORD,
+    FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+)
+class AllMedicalDataFragmentTest : HealthConnectBaseTest() {
+
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+    private val APP_A_WITH_READ_WRITE_PERMS: TestAppProxy =
+        TestAppProxy.forPackageName("android.healthconnect.cts.testapp.readWritePerms.A")
+
+    @Before
+    fun setup() {
+        TestUtils.deleteAllStagedRemoteData()
+        TestUtils.deleteAllMedicalData()
+        insertMedicalData()
+    }
+
+    @After
+    fun tearDown() {
+        TestUtils.deleteAllStagedRemoteData()
+        TestUtils.deleteAllMedicalData()
+    }
+
+    private fun insertMedicalData() {
+        val dataSource =
+            APP_A_WITH_READ_WRITE_PERMS.createMedicalDataSource(getCreateMedicalDataSourceRequest())
+        APP_A_WITH_READ_WRITE_PERMS.upsertMedicalResource(dataSource.id, FHIR_DATA_IMMUNIZATION)
+        APP_A_WITH_READ_WRITE_PERMS.upsertMedicalResource(dataSource.id, FHIR_DATA_ALLERGY)
+    }
+
+    @Test
+    fun allMedicalDataFragment_showsAvailableDataTypes() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("Browse health records")
+            clickOnTextAndWaitForNewWindow("Browse health records")
+
+            scrollDownToAndFindText("Allergies")
+            scrollDownToAndFindText("Vaccines")
+        }
+    }
+
+    @Test
+    fun allMedicalDataFragment_clickOnPermissionType_navigatesToEntriesAndAccess() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("Browse health records")
+            clickOnTextAndWaitForNewWindow("Browse health records")
+
+            scrollDownToAndFindText("Allergies")
+            clickOnTextAndWaitForNewWindow("Allergies")
+            findText("Entries")
+            findText("Access")
+        }
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/phr/AllMedicalEntriesFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/phr/AllMedicalEntriesFragmentTest.kt
new file mode 100644
index 0000000..8f4126a
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/ui/phr/AllMedicalEntriesFragmentTest.kt
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.ui.phr
+
+import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
+import android.healthconnect.cts.lib.TestAppProxy
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findObject
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_FHIR_DATA_IMMUNIZATION
+import android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION
+import android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest
+import android.healthconnect.cts.ui.HealthConnectBaseTest
+import android.healthconnect.cts.utils.TestUtils
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import androidx.test.uiautomator.By
+import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@RequiresFlagsEnabled(
+    FLAG_NEW_INFORMATION_ARCHITECTURE,
+    FLAG_PERSONAL_HEALTH_RECORD,
+    FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+)
+class AllMedicalEntriesFragmentTest : HealthConnectBaseTest() {
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+    private val APP_A_WITH_READ_WRITE_PERMS: TestAppProxy =
+        TestAppProxy.forPackageName("android.healthconnect.cts.testapp.readWritePerms.A")
+
+    @Before
+    fun setup() {
+        TestUtils.deleteAllStagedRemoteData()
+        TestUtils.deleteAllMedicalData()
+        insertMedicalData()
+    }
+
+    @After
+    fun tearDown() {
+        TestUtils.deleteAllStagedRemoteData()
+        TestUtils.deleteAllMedicalData()
+    }
+
+    private fun insertMedicalData() {
+        val dataSource =
+            APP_A_WITH_READ_WRITE_PERMS.createMedicalDataSource(getCreateMedicalDataSourceRequest())
+        APP_A_WITH_READ_WRITE_PERMS.upsertMedicalResource(dataSource.id, FHIR_DATA_IMMUNIZATION)
+        APP_A_WITH_READ_WRITE_PERMS.upsertMedicalResource(
+            dataSource.id,
+            DIFFERENT_FHIR_DATA_IMMUNIZATION,
+        )
+    }
+
+    @Test
+    fun allMedicalEntriesFragment_showsAvailableEntries() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("Browse health records")
+            clickOnTextAndWaitForNewWindow("Browse health records")
+
+            scrollDownToAndFindText("Vaccines")
+            clickOnTextAndWaitForNewWindow("Vaccines")
+
+            findText("Entries")
+            findText("Access")
+            findObject(By.textContains("Hospital X"))
+            findText("Tdap")
+        }
+    }
+
+    @Test
+    fun allMedicalEntriesFragment_navigatesToAccessScreen() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("Browse health records")
+            clickOnTextAndWaitForNewWindow("Browse health records")
+
+            scrollDownToAndFindText("Vaccines")
+            clickOnTextAndWaitForNewWindow("Vaccines")
+
+            findText("Entries")
+            clickOnTextAndWaitForNewWindow("Access")
+            scrollDownToAndFindText("Can write vaccines")
+        }
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/phr/ConnectedAppFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/phr/ConnectedAppFragmentTest.kt
new file mode 100644
index 0000000..9e88aa2
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/ui/phr/ConnectedAppFragmentTest.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.ui.phr
+
+import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.ui.HealthConnectBaseTest
+import android.healthconnect.cts.utils.TestUtils
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@RequiresFlagsEnabled(FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+class ConnectedAppFragmentTest : HealthConnectBaseTest() {
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+    @Before
+    fun setup() {
+        TestUtils.deleteAllStagedRemoteData()
+    }
+
+    @Test
+    fun appWithMedicalAndFitnessPermissions_showsCombinedPermssionsScreen() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
+            scrollDownToAndFindText("Health Connect cts test app 2")
+            clickOnTextAndWaitForNewWindow("Health Connect cts test app 2")
+
+            findText("Health Connect cts test app 2")
+            scrollDownToAndFindText("Permissions")
+            scrollDownToAndFindText("Fitness and wellness")
+            scrollDownToAndFindText("Health records")
+            scrollDownToAndFindText("Additional access")
+
+            scrollDownToAndFindText("Manage app")
+            scrollDownToAndFindText("See app data")
+            scrollDownToAndFindText("Remove access for this app")
+        }
+    }
+
+    @Test
+    fun appWithFitnessPermissionsOnly_showsFitnessPermissionsScreen() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
+
+            scrollDownToAndFindText("CtsHealthConnectTestAppBWithNormalReadWritePermission")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppBWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("Allowed to read")
+            scrollDownToAndFindText("Allowed to write")
+
+            scrollDownToAndFindText("See app data")
+        }
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/phr/MedicalAppDataFragmentTest.kt b/tests/cts/src/android/healthconnect/cts/ui/phr/MedicalAppDataFragmentTest.kt
new file mode 100644
index 0000000..2919372
--- /dev/null
+++ b/tests/cts/src/android/healthconnect/cts/ui/phr/MedicalAppDataFragmentTest.kt
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.cts.ui.phr
+
+import android.health.connect.datatypes.HeartRateRecord
+import android.health.connect.datatypes.MenstruationPeriodRecord
+import android.health.connect.datatypes.Record
+import android.health.connect.datatypes.SleepSessionRecord
+import android.health.connect.datatypes.StepsRecord
+import android.healthconnect.cts.lib.ActivityLauncher.launchMainActivity
+import android.healthconnect.cts.lib.RecordFactory.newEmptyMetadata
+import android.healthconnect.cts.lib.TestAppProxy
+import android.healthconnect.cts.lib.UiTestUtils.clickOnTextAndWaitForNewWindow
+import android.healthconnect.cts.lib.UiTestUtils.findObject
+import android.healthconnect.cts.lib.UiTestUtils.findText
+import android.healthconnect.cts.lib.UiTestUtils.scrollDownToAndFindText
+import android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY
+import android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION
+import android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest
+import android.healthconnect.cts.ui.HealthConnectBaseTest
+import android.healthconnect.cts.utils.TestUtils
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import androidx.test.uiautomator.By
+import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD
+import com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE
+import java.time.Instant
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@RequiresFlagsEnabled(
+    FLAG_NEW_INFORMATION_ARCHITECTURE,
+    FLAG_PERSONAL_HEALTH_RECORD,
+    FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+)
+class MedicalAppDataFragmentTest : HealthConnectBaseTest() {
+
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+    private val APP_A_WITH_READ_WRITE_PERMS: TestAppProxy =
+        TestAppProxy.forPackageName("android.healthconnect.cts.testapp.readWritePerms.A")
+
+    @Before
+    fun setup() {
+        TestUtils.deleteAllStagedRemoteData()
+        TestUtils.deleteAllMedicalData()
+        insertMedicalData()
+    }
+
+    @After
+    fun tearDown() {
+        TestUtils.deleteAllStagedRemoteData()
+        TestUtils.deleteAllMedicalData()
+    }
+
+    private fun insertMedicalData() {
+        val dataSource =
+            APP_A_WITH_READ_WRITE_PERMS.createMedicalDataSource(getCreateMedicalDataSourceRequest())
+        APP_A_WITH_READ_WRITE_PERMS.upsertMedicalResource(dataSource.id, FHIR_DATA_IMMUNIZATION)
+        APP_A_WITH_READ_WRITE_PERMS.upsertMedicalResource(dataSource.id, FHIR_DATA_ALLERGY)
+    }
+
+    @Test
+    fun medicalAppData_showsAvailableDataTypes() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
+            scrollDownToAndFindText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("See app data")
+            clickOnTextAndWaitForNewWindow("See app data")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            scrollDownToAndFindText("Allergies")
+            scrollDownToAndFindText("Vaccines")
+        }
+    }
+
+    @Test
+    fun appWithFitnessAndMedicalData_showsBothTypes() {
+        val NOW = Instant.now()
+        APP_A_WITH_READ_WRITE_PERMS.insertRecords(
+            mutableListOf(
+                StepsRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(2), 10).build(),
+                HeartRateRecord.Builder(
+                        newEmptyMetadata(),
+                        NOW,
+                        NOW.plusSeconds(10),
+                        listOf(HeartRateRecord.HeartRateSample(140, NOW)),
+                    )
+                    .build(),
+                MenstruationPeriodRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(10))
+                    .build(),
+                SleepSessionRecord.Builder(newEmptyMetadata(), NOW, NOW.plusSeconds(1000)).build(),
+            )
+                as List<Record>?
+        )
+        context.launchMainActivity {
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
+            scrollDownToAndFindText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("See app data")
+            clickOnTextAndWaitForNewWindow("See app data")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("Activity")
+            scrollDownToAndFindText("Steps")
+            scrollDownToAndFindText("Cycle tracking")
+            scrollDownToAndFindText("Menstruation")
+            scrollDownToAndFindText("Sleep")
+            scrollDownToAndFindText("Vitals")
+            scrollDownToAndFindText("Heart rate")
+            scrollDownToAndFindText("Health records")
+            scrollDownToAndFindText("Allergies")
+            scrollDownToAndFindText("Vaccines")
+        }
+    }
+
+    @Test
+    fun clickOnMedicalAppDataType_navigatesToMedicalAppEntries() {
+        context.launchMainActivity {
+            scrollDownToAndFindText("App permissions")
+            clickOnTextAndWaitForNewWindow("App permissions")
+            scrollDownToAndFindText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            clickOnTextAndWaitForNewWindow("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+
+            scrollDownToAndFindText("See app data")
+            clickOnTextAndWaitForNewWindow("See app data")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            scrollDownToAndFindText("Allergies")
+            clickOnTextAndWaitForNewWindow("Allergies")
+
+            findText("CtsHealthConnectTestAppAWithNormalReadWritePermission")
+            findObject(By.textContains("Hospital X"))
+        }
+    }
+}
diff --git a/tests/cts/src/android/healthconnect/cts/ui/widget/DatePickerDialogTest.kt b/tests/cts/src/android/healthconnect/cts/ui/widget/DatePickerDialogTest.kt
index 38db9f8..491f387 100644
--- a/tests/cts/src/android/healthconnect/cts/ui/widget/DatePickerDialogTest.kt
+++ b/tests/cts/src/android/healthconnect/cts/ui/widget/DatePickerDialogTest.kt
@@ -21,8 +21,13 @@
 import android.app.DatePickerDialog.OnDateSetListener
 import android.content.DialogInterface
 import android.healthconnect.cts.ui.HealthConnectBaseTest
+import android.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
 import androidx.test.annotation.UiThreadTest
+import com.android.healthfitness.flags.Flags.FLAG_NEW_INFORMATION_ARCHITECTURE
 import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
 import org.junit.Test
 import org.mockito.ArgumentMatchers.any
 import org.mockito.ArgumentMatchers.eq
@@ -30,8 +35,11 @@
 import org.mockito.Mockito.mock
 import org.mockito.kotlin.verify
 
+@RequiresFlagsDisabled(FLAG_NEW_INFORMATION_ARCHITECTURE)
 class DatePickerDialogTest : HealthConnectBaseTest() {
 
+    @get:Rule val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
     @Test
     @UiThreadTest
     fun testConstructor() {
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ConditionBuilder.java b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ConditionBuilder.java
deleted file mode 100644
index 834720a..0000000
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ConditionBuilder.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.healthconnect.cts.utils;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * A helper class that supports making FHIR Condition data for tests.
- *
- * <p>The Default result will be a valid FHIR Condition, but that is all that should be relied upon.
- * Anything else that is relied upon by a test should be set by one of the methods.
- */
-public class ConditionBuilder {
-    private static final String DEFAULT_JSON =
-            "{  \"resourceType\" : \"Condition\",  \"id\" : \"f201\",  \"identifier\" : [{   "
-                + " \"value\" : \"12345\"  }],  \"clinicalStatus\" : {    \"coding\" : [{     "
-                + " \"system\" : \"http://terminology.hl7.org/CodeSystem/condition-clinical\",     "
-                + " \"code\" : \"resolved\"    }]  },  \"verificationStatus\" : {    \"coding\" :"
-                + " [{      \"system\" :"
-                + " \"http://terminology.hl7.org/CodeSystem/condition-ver-status\",      \"code\" :"
-                + " \"confirmed\"    }]  },  \"category\" : [{    \"coding\" : [{      \"system\" :"
-                + " \"http://snomed.info/sct\",      \"code\" : \"55607006\",      \"display\" :"
-                + " \"Problem\"    },    {      \"system\" :"
-                + " \"http://terminology.hl7.org/CodeSystem/condition-category\",      \"code\" :"
-                + " \"problem-list-item\"    }]  }],  \"severity\" : {    \"coding\" : [{     "
-                + " \"system\" : \"http://snomed.info/sct\",      \"code\" : \"255604002\",     "
-                + " \"display\" : \"Mild\"    }]  },  \"code\" : {    \"coding\" : [{     "
-                + " \"system\" : \"http://snomed.info/sct\",      \"code\" : \"386661006\",     "
-                + " \"display\" : \"Fever\"    }]  },  \"bodySite\" : [{    \"coding\" : [{     "
-                + " \"system\" : \"http://snomed.info/sct\",      \"code\" : \"38266002\",     "
-                + " \"display\" : \"Entire body as a whole\"    }]  }],  \"subject\" : {   "
-                + " \"reference\" : \"Patient/f201\",    \"display\" : \"Roel\"  },  \"encounter\""
-                + " : {    \"reference\" : \"Encounter/f201\"  },  \"onsetDateTime\" :"
-                + " \"2013-04-02\",  \"abatementString\" : \"around April 9, 2013\", "
-                + " \"recordedDate\" : \"2013-04-04\",  \"participant\" : [{    \"function\" : {   "
-                + "   \"coding\" : [{        \"system\" :"
-                + " \"http://terminology.hl7.org/CodeSystem/provenance-participant-type\",       "
-                + " \"code\" : \"enterer\",        \"display\" : \"Enterer\"      }]    },   "
-                + " \"actor\" : {      \"reference\" : \"Practitioner/f201\"    }  },  {   "
-                + " \"function\" : {      \"coding\" : [{        \"system\" :"
-                + " \"http://terminology.hl7.org/CodeSystem/provenance-participant-type\",       "
-                + " \"code\" : \"verifier\",        \"display\" : \"Verifier\"      }]    },   "
-                + " \"actor\" : {      \"reference\" : \"Practitioner/f201\"    }  }], "
-                + " \"evidence\" : [{    \"concept\" : {      \"coding\" : [{        \"system\" :"
-                + " \"http://snomed.info/sct\",        \"code\" : \"258710007\",        \"display\""
-                + " : \"degrees C\"      }]    },    \"reference\" : {      \"reference\" :"
-                + " \"Observation/f202\",      \"display\" : \"Temperature\"    }  }]}";
-    private final JSONObject mFhir;
-
-    /**
-     * Creates a default valid FHIR Observation.
-     *
-     * <p>All that should be relied on is that the Observation is valid. To rely on anything else
-     * set it with the other methods.
-     */
-    public ConditionBuilder() {
-        try {
-            this.mFhir = new JSONObject(DEFAULT_JSON);
-        } catch (JSONException e) {
-            // Should never happen, but JSONException is declared, and is a checked exception.
-            throw new IllegalStateException(e);
-        }
-    }
-
-    /**
-     * Set the FHIR id.
-     *
-     * @return this Builder.
-     */
-    public ConditionBuilder setId(String id) {
-        try {
-            mFhir.put("id", id);
-        } catch (JSONException e) {
-            throw new IllegalArgumentException(e);
-        }
-        return this;
-    }
-
-    /** Returns the current state of this builder as a JSON FHIR string. */
-    public String toJson() {
-        try {
-            return mFhir.toString(/* indentSpaces= */ 2);
-        } catch (JSONException e) {
-            // Should never happen, but JSONException is declared, and is a checked exception.
-            throw new IllegalStateException(e);
-        }
-    }
-}
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/DeviceConfigRule.java b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/DeviceConfigRule.java
deleted file mode 100644
index 2aaf505..0000000
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/DeviceConfigRule.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.healthconnect.cts.utils;
-
-import static android.healthconnect.cts.utils.TestUtils.getDeviceConfigValue;
-import static android.healthconnect.cts.utils.TestUtils.setDeviceConfigValue;
-
-import org.junit.rules.ExternalResource;
-
-/** Sets a device config value for the duration of the test. */
-public class DeviceConfigRule extends ExternalResource {
-    private final String mKey;
-    private final String mValue;
-    private String mOriginalValue;
-
-    public DeviceConfigRule(String key, String value) {
-        mKey = key;
-        mValue = value;
-    }
-
-    @Override
-    protected void before() throws Throwable {
-        mOriginalValue = getDeviceConfigValue(mKey);
-        setDeviceConfigValue(mKey, mValue);
-    }
-
-    @Override
-    protected void after() {
-        setDeviceConfigValue(mKey, mOriginalValue);
-    }
-}
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/HealthConnectReceiver.java b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/HealthConnectReceiver.java
index cecfb10..c8169cb 100644
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/HealthConnectReceiver.java
+++ b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/HealthConnectReceiver.java
@@ -16,6 +16,7 @@
 
 package android.healthconnect.cts.utils;
 
+import android.app.UiAutomation;
 import android.health.connect.HealthConnectException;
 
 /**
@@ -24,5 +25,26 @@
  *
  * @param <T> the type of object being received,
  */
-public final class HealthConnectReceiver<T>
-        extends TestOutcomeReceiver<T, HealthConnectException> {}
+public final class HealthConnectReceiver<T> extends TestOutcomeReceiver<T, HealthConnectException> {
+
+    /**
+     * Helper for calling an API method that returns its response via an {@link
+     * android.os.OutcomeReceiver}.
+     */
+    public static <R> R callAndGetResponse(CallableForOutcome<R, HealthConnectException> callable)
+            throws InterruptedException {
+        return callAndGetResponse(HealthConnectException.class, callable);
+    }
+
+    /**
+     * Helper for calling an API method that returns its response via an {@link
+     * android.os.OutcomeReceiver} while holding permissions via {@link
+     * UiAutomation#adoptShellPermissionIdentity(String...)}.
+     */
+    public static <R> R callAndGetResponseWithShellPermissionIdentity(
+            CallableForOutcome<R, HealthConnectException> callable, String... permissions)
+            throws InterruptedException {
+        return callAndGetResponseWithShellPermissionIdentity(
+                HealthConnectException.class, callable, permissions);
+    }
+}
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/MedicationsBuilder.java b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/MedicationsBuilder.java
deleted file mode 100644
index b2e2ac4..0000000
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/MedicationsBuilder.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.healthconnect.cts.utils;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Test helper class for making medication related FHIR data, including <a
- * href="https://www.hl7.org/fhir/medication.html">Medication</a>, <a
- * href="https://www.hl7.org/fhir/medicationrequest.html">MedicationRequest</a> and <a
- * href="https://www.hl7.org/fhir/medicationstatement.html">MedicationStatement</a>.
- */
-public class MedicationsBuilder {
-
-    private abstract static class ResourceBuilder<T extends ResourceBuilder<T>> {
-        private final JSONObject mFhir;
-
-        private ResourceBuilder(String json) {
-            try {
-                this.mFhir = new JSONObject(json);
-            } catch (JSONException e) {
-                throw new IllegalArgumentException(e);
-            }
-        }
-
-        /**
-         * Help the subclasses return the correct type.
-         *
-         * @return the current object, correctly typed.
-         */
-        protected abstract T returnThis();
-
-        /**
-         * Set the FHIR id for the Observation.
-         *
-         * @return this Builder.
-         */
-        public T setId(String id) {
-            return set("id", id);
-        }
-
-        /**
-         * Sets an arbitrary String or JSON Object element in the observation FHIR.
-         *
-         * @param field the element to set.
-         * @param value the value to set
-         * @return this builder
-         */
-        public T set(String field, Object value) {
-            try {
-                mFhir.put(field, value);
-            } catch (JSONException e) {
-                throw new IllegalArgumentException(e);
-            }
-            return returnThis();
-        }
-
-        /** Returns the current state of this builder as a JSON FHIR string. */
-        public String toJson() {
-            try {
-                return mFhir.toString(/* indentSpaces= */ 2);
-            } catch (JSONException e) {
-                // Should never happen, but JSONException is declared, and is a checked exception.
-                throw new IllegalStateException(e);
-            }
-        }
-    }
-
-    /**
-     * Builder class for creating FHIR <a
-     * href="https://www.hl7.org/fhir/medication.html">Medications</a>
-     */
-    public static class MedicationBuilder extends ResourceBuilder<MedicationBuilder> {
-
-        private static final String DEFAULT_MEDICATION_JSON =
-                "{  \"resourceType\" : \"Medication\",  "
-                        + "\"id\" : \"med0311\","
-                        + "\"contained\" : [{"
-                        + "  \"resourceType\" : \"Substance\",    "
-                        + "  \"id\" : \"sub03\",    "
-                        + "\"instance\" : false,"
-                        + "\"code\" : {"
-                        + "  \"concept\" : {"
-                        + "    \"coding\" : [{         "
-                        + " \"system\" : \"http://snomed.info/sct\","
-                        + "\"code\" : \"116602009\","
-                        + "\"display\" : \"Prednisone (substance)\" "
-                        + " }]"
-                        + "}"
-                        + "} "
-                        + "}],"
-                        + "\"code\" : {"
-                        + "  \"coding\" : [{"
-                        + "    \"system\" :\"http://snomed.info/sct\","
-                        + "    \"code\" : \"373994007\","
-                        + "    \"display\": \"Prednisone 5mg tablet (Product)\""
-                        + "   }]"
-                        + "},"
-                        + "\"doseForm\" : {"
-                        + "  \"coding\" : [{"
-                        + "    \"system\" : \"http://snomed.info/sct\","
-                        + "    \"code\" : \"385055001\","
-                        + "    \"display\" : \"Tablet dose form (qualifier value)\" "
-                        + "  }]"
-                        + "},"
-                        + "\"ingredient\" : [{"
-                        + "  \"item\" : {"
-                        + "    \"reference\" : {"
-                        + "      \"reference\" : \"#sub03\""
-                        + "     }"
-                        + "  },"
-                        + "  \"strengthRatio\" : {"
-                        + "     \"numerator\" : {"
-                        + "        \"value\" : 5,"
-                        + "        \"system\" :\"http://unitsofmeasure.org\","
-                        + "        \"code\" : \"mg\""
-                        + "      },"
-                        + "      \"denominator\" : {"
-                        + "         \"value\" : 1,"
-                        + "         \"system\" :"
-                        + " \"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
-                        + " \"code\" : \"TAB\""
-                        + "}"
-                        + "}"
-                        + "}]}";
-
-        private static final String TYLENOL =
-                "{"
-                        + "\"resourceType\" : \"Medication\","
-                        + "    \"id\" : \"med0309\","
-                        + "    \"code\" : {"
-                        + "    \"coding\" : [{"
-                        + "        \"system\" : \"http://hl7.org/fhir/sid/ndc\","
-                        + "    \"code\" : \"50580-608-02\","
-                        + "        \"display\" : \"Tylenol PM\""
-                        + "    }]"
-                        + "  },"
-                        + "\"doseForm\" : {"
-                        + "  \"coding\" : [{"
-                        + "    \"system\" : \"http://snomed.info/sct\","
-                        + "    \"code\" : \"385057009\","
-                        + "    \"display\" : \"Film-coated tablet (qualifier value)\""
-                        + "   }]"
-                        + " },"
-                        + " \"ingredient\" : [{"
-                        + "   \"item\" : {"
-                        + "     \"concept\" : {"
-                        + "       \"coding\" : [{"
-                        + "          \"system\" : \"http://www.nlm.nih.gov/research/umls/rxnorm\","
-                        + "          \"code\" : \"315266\","
-                        + "          \"display\" : \"Acetaminophen 500 MG\""
-                        + "        }]"
-                        + "      }"
-                        + "    },"
-                        + "    \"strengthRatio\" : {"
-                        + "      \"numerator\" : {"
-                        + "       \"value\" : 500,"
-                        + "       \"system\" : \"http://unitsofmeasure.org\","
-                        + "       \"code\" : \"mg\""
-                        + "      },"
-                        + "      \"denominator\" : {"
-                        + "        \"value\" : 1,"
-                        + "        \"system\" :"
-                        + " \"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
-                        + "         \"code\" : \"TAB\""
-                        + "        }"
-                        + "      }"
-                        + "    },"
-                        + "    {"
-                        + "      \"item\" : {"
-                        + "        \"concept\" : {"
-                        + "          \"coding\" : [{"
-                        + "            \"system\" :"
-                        + " \"http://www.nlm.nih.gov/research/umls/rxnorm\","
-                        + "            \"code\" : \"901813\","
-                        + "            \"display\" : \"Diphenhydramine Hydrochloride 25 mg\""
-                        + "          }]"
-                        + "        } "
-                        + "     },"
-                        + "     \"strengthRatio\" : {"
-                        + "       \"numerator\" : {"
-                        + "          \"value\" : 25,"
-                        + "          \"system\" : \"http://unitsofmeasure.org\","
-                        + "          \"code\" : \"mg\""
-                        + "        },"
-                        + "      \"denominator\" : {"
-                        + "          \"value\" : 1,"
-                        + "          \"system\" :"
-                        + " \"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
-                        + "          \"code\" : \"TAB\""
-                        + "        }"
-                        + "      }"
-                        + "    }],"
-                        + "    \"batch\" : {     "
-                        + "      \"lotNumber\" : \"9494788\","
-                        + "      \"expirationDate\" : \"2017-05-22\""
-                        + "    } "
-                        + " }";
-
-        public MedicationBuilder() {
-            super(DEFAULT_MEDICATION_JSON);
-        }
-
-        /**
-         * Set this medication to be Tylenol.
-         *
-         * @return this builder
-         */
-        public MedicationBuilder setTylenol() {
-            try {
-                JSONObject tylenol = new JSONObject(TYLENOL);
-                Iterator<String> keys = tylenol.keys();
-                while (keys.hasNext()) {
-                    String key = keys.next();
-                    set(key, tylenol.get(key));
-                }
-            } catch (JSONException e) {
-                throw new IllegalStateException(e);
-            }
-            return this;
-        }
-
-        @Override
-        protected MedicationBuilder returnThis() {
-            return this;
-        }
-    }
-
-    /**
-     * Builder class for creating FHIR <a
-     * href="https://www.hl7.org/fhir/medicationstatement.html">MedicationStatements</a>
-     */
-    public static class MedicationStatementR4Builder
-            extends ResourceBuilder<MedicationStatementR4Builder> {
-        private static final String DEFAULT_MEDICATION_STATEMENT_JSON =
-                "{  "
-                        + "\"resourceType\" : \"MedicationStatement\","
-                        + "\"id\" : \"example001\", "
-                        + " \"contained\" : [],"
-                        + " \"identifier\" : [{"
-                        + "    \"use\" : \"official\","
-                        + " \"system\" : \"http://www.bmc.nl/portal/medstatements\","
-                        + "    \"value\" : \"12345689\""
-                        + "  }],"
-                        + "  \"status\" : \"recorded\","
-                        + "  \"category\" : [{   "
-                        + " \"coding\" : [{"
-                        + "      \"system\" :"
-                        + "\"http://terminology.hl7.org/CodeSystem/"
-                        + "medication-statement-category\","
-                        + "      \"code\" : \"inpatient\","
-                        + "      \"display\" : \"Inpatient\""
-                        + "    }]"
-                        + "  }], "
-                        + " \"subject\" : {"
-                        + "    \"reference\" : \"Patient/pat1\","
-                        + "    \"display\" : \"Donald Duck\""
-                        + "  },  "
-                        + "\"effectiveDateTime\" : \"2015-01-23\","
-                        + " \"dateAsserted\" : \"2015-02-22\","
-                        + "  \"informationSource\" : [{"
-                        + " \"reference\" : \"Patient/pat1\","
-                        + "    \"display\" : \"Donald Duck\""
-                        + "  }], "
-                        + " \"derivedFrom\" : [{"
-                        + "    \"reference\" : \"MedicationRequest/medrx002\""
-                        + "  }],"
-                        + "  \"reason\" : [{"
-                        + "    \"concept\" : {"
-                        + "      \"coding\" : [{"
-                        + "       \"system\" : \"http://snomed.info/sct\","
-                        + "        \"code\" : \"32914008\","
-                        + " \"display\" : \"Restless Legs\""
-                        + "      }]"
-                        + "    }"
-                        + "  }],"
-                        + "  \"note\" : [{"
-                        + " \"text\" : \"Patient indicates they miss the occasional dose\""
-                        + "}], "
-                        + " \"dosage\" : [{"
-                        + "    \"sequence\" : 1,"
-                        + "    \"text\" : \"1-2 tablets once daily at bedtime as needed for "
-                        + "       restless legs\","
-                        + "    \"additionalInstruction\" : [{"
-                        + "      \"text\" : \"Taking at bedtime\""
-                        + "    }],"
-                        + "    \"timing\" : {     "
-                        + " \"repeat\" : {"
-                        + "        \"frequency\" : 1,"
-                        + "        \"period\" : 1,"
-                        + "        \"periodUnit\" : \"d\""
-                        + "      }"
-                        + "    },"
-                        + "    \"asNeededFor\" : [{"
-                        + "      \"coding\" : [{"
-                        + "        \"system\" : \"http://snomed.info/sct\","
-                        + "        \"code\" :\"32914008\","
-                        + "        \"display\" : \"Restless Legs\""
-                        + "      }]"
-                        + "    }],"
-                        + " \"route\" : {"
-                        + "      \"coding\" : [{"
-                        + "        \"system\" :\"http://snomed.info/sct\","
-                        + "        \"code\" : \"26643006\","
-                        + "       "
-                        + " \"display\" : \"Oral Route\""
-                        + "      }]"
-                        + "    },"
-                        + "    \"doseAndRate\" : [{"
-                        + "      \"type\" : {"
-                        + "        \"coding\" : [{"
-                        + "          \"system\" :"
-                        + " \"http://terminology.hl7.org/CodeSystem/dose-rate-type\","
-                        + "          \"code\" : \"ordered\","
-                        + "          \"display\" : \"Ordered\""
-                        + "        }]"
-                        + "      },"
-                        + " \"doseRange\" : {"
-                        + "        \"low\" : {"
-                        + "          \"value\" : 1,         "
-                        + "          \"unit\" : \"TAB\","
-                        + "          \"system\" :"
-                        + " \"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
-                        + " \"code\" : \"TAB\""
-                        + "        },"
-                        + "        \"high\" : {"
-                        + "          \"value\" : 2,"
-                        + "          \"unit\" : \"TAB\","
-                        + "          \"system\" :"
-                        + " \"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
-                        + "          \"code\" : \"TAB\""
-                        + "        }"
-                        + "      }"
-                        + "    }]"
-                        + "  }]}";
-
-        public MedicationStatementR4Builder() {
-            super(DEFAULT_MEDICATION_STATEMENT_JSON);
-            setContainedMedication(medication().setTylenol());
-        }
-
-        /**
-         * Set this medication statement to contain the given medication.
-         *
-         * @param medication the medication to be contained (may be modified).
-         * @return this builder
-         */
-        public MedicationStatementR4Builder setContainedMedication(MedicationBuilder medication) {
-            String containedId = "med123";
-            try {
-                set(
-                        "contained",
-                        new JSONArray(
-                                List.of(new JSONObject(medication.setId(containedId).toJson()))));
-                set("medicationReference", new JSONObject(Map.of("reference", "#" + containedId)));
-            } catch (JSONException e) {
-                throw new IllegalArgumentException(e);
-            }
-            return this;
-        }
-
-        @Override
-        protected MedicationStatementR4Builder returnThis() {
-            return this;
-        }
-    }
-
-    public static class MedicationRequestBuilder extends ResourceBuilder<MedicationRequestBuilder> {
-
-        private static final String DEFAULT_REQUEST_JSON =
-                "{  \"resourceType\": \"MedicationRequest\","
-                        + "  \"id\": \"medrx0331\","
-                        + " \"contained\": [{"
-                        + "\"resourceType\": \"Medication\","
-                        + "\"id\": \"med0350\","
-                        + "\"code\": {"
-                        + "  \"coding\": [{"
-                        + "    \"system\": \"http://www.nlm.nih.gov/research/umls/rxnorm\","
-                        + "    \"code\": \"114194\","
-                        + "    \"display\": \"Warfarin Sodium\""
-                        + "   }]"
-                        + "},"
-                        + "\"form\": {"
-                        + "  \"coding\": [{"
-                        + "    \"system\": \"http://snomed.info/sct\","
-                        + "    \"code\": \"421026006\","
-                        + "    \"display\": \"Oral Tablet\""
-                        + "   }]"
-                        + "  }"
-                        + "}],"
-                        + "\"identifier\": [{"
-                        + "  \"use\": \"official\","
-                        + "  \"system\": \"http://www.bmc.nl/portal/prescriptions\","
-                        + "  \"value\": \"12345689\""
-                        + "}],"
-                        + "\"status\": \"active\","
-                        + "\"intent\": \"order\", "
-                        + "\"medicationReference\": {"
-                        + "  \"reference\": \"#med0350\"  "
-                        + "},"
-                        + "\"subject\": {"
-                        + "  \"reference\": \"Patient/pat1\","
-                        + "  \"display\": \"Donald Duck\""
-                        + "}, "
-                        + "\"authoredOn\": \"2015-01-15\","
-                        + "\"requester\": {"
-                        + "  \"reference\": \"Practitioner/f007\","
-                        + "  \"display\": \"Patrick Pump\""
-                        + "},"
-                        + " \"dosageInstruction\": [{"
-                        + "   \"sequence\": 1,"
-                        + "   \"text\": \"7mg once daily\","
-                        + "   \"timing\": {"
-                        + "     \"repeat\": {"
-                        + "       \"frequency\": 1,"
-                        + "       \"period\": 1,"
-                        + "       \"periodUnit\": \"d\""
-                        + "     }"
-                        + "   },"
-                        + "   \"doseAndRate\": [{"
-                        + "     \"type\": {"
-                        + "       \"coding\": [{"
-                        + "\"system\": \"http://terminology.hl7.org/CodeSystem/dose-rate-type\","
-                        + "           \"code\": \"ordered\","
-                        + "           \"display\": \"Ordered\""
-                        + "        }]"
-                        + "      },"
-                        + "      \"doseQuantity\": {"
-                        + "        \"value\": 7,"
-                        + "        \"unit\": \"mg\","
-                        + "        \"system\": \"http://unitsofmeasure.org\","
-                        + "        \"code\": \"mg\""
-                        + "       }"
-                        + "     }]"
-                        + "   }],"
-                        + " \"dispenseRequest\": {"
-                        + "    \"validityPeriod\": {"
-                        + "       \"start\": \"2015-01-15\","
-                        + "       \"end\": \"2016-01-15\""
-                        + "     },"
-                        + "     \"numberOfRepeatsAllowed\": 3,"
-                        + "    \"quantity\": {"
-                        + "      \"value\": 30,"
-                        + "      \"unit\": \"TAB\","
-                        + "     \"system\":"
-                        + "\"http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm\","
-                        + "       \"code\": \"TAB\""
-                        + "    },"
-                        + "    \"expectedSupplyDuration\": {"
-                        + "      \"value\": 30,"
-                        + "      \"unit\": \"days\","
-                        + "      \"system\": \"http://unitsofmeasure.org\","
-                        + "      \"code\": \"d\""
-                        + "    }"
-                        + "  },"
-                        + " \"substitution\": {"
-                        + "    \"allowedBoolean\": true,"
-                        + "    \"reason\": {"
-                        + "      \"coding\": [{"
-                        + "\"system\": \"http://terminology.hl7.org/CodeSystem/v3-ActReason\","
-                        + "\"code\": \"FP\","
-                        + "\"display\": \"formulary policy\" "
-                        + "}]"
-                        + "}  }"
-                        + "}";
-
-        public MedicationRequestBuilder() {
-            super(DEFAULT_REQUEST_JSON);
-        }
-
-        @Override
-        protected MedicationRequestBuilder returnThis() {
-            return this;
-        }
-    }
-
-    /**
-     * Returns a builder class that will help build <a
-     * href="https://www.hl7.org/fhir/medication.html">Medication</a> FHIR JSON.
-     */
-    public static MedicationBuilder medication() {
-        return new MedicationBuilder();
-    }
-
-    /**
-     * Returns a builder class that will help build <a
-     * href="https://www.hl7.org/fhir/medication.html">Medication</a> FHIR JSON, in FHIR version R4
-     * format.
-     */
-    public static MedicationStatementR4Builder statementR4() {
-        return new MedicationStatementR4Builder();
-    }
-
-    /**
-     * Returns a builder class that will help build <a
-     * href="https://www.hl7.org/fhir/medicationrequest.html">MedicationRequest</a> FHIR JSON.
-     */
-    public static MedicationRequestBuilder request() {
-        return new MedicationRequestBuilder();
-    }
-}
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/PermissionHelper.java b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/PermissionHelper.java
index 12abf24..3104f9c 100644
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/PermissionHelper.java
+++ b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/PermissionHelper.java
@@ -16,6 +16,7 @@
 
 package android.healthconnect.cts.utils;
 
+import static android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS;
 import static android.content.pm.PackageManager.GET_PERMISSIONS;
 import static android.healthconnect.cts.utils.TestUtils.getHealthConnectManager;
 
@@ -23,6 +24,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
+import android.annotation.SuppressLint;
 import android.app.UiAutomation;
 import android.content.Context;
 import android.content.pm.PackageInfo;
@@ -32,6 +34,7 @@
 import android.os.UserHandle;
 
 import androidx.annotation.Nullable;
+import androidx.test.core.app.ApplicationProvider;
 
 import com.android.compatibility.common.util.SystemUtil;
 import com.android.compatibility.common.util.ThrowingRunnable;
@@ -56,53 +59,55 @@
             "android.permission.health.READ_EXERCISE_ROUTES";
     private static final String MANAGE_HEALTH_PERMISSIONS =
             HealthPermissions.MANAGE_HEALTH_PERMISSIONS;
-    private static final String HEALTH_PERMISSION_PREFIX = "android.permission.health.";
 
-    /** Returns permissions declared in the Manifest of the given package. */
-    public static List<String> getDeclaredHealthPermissions(String pkgName) {
-        final PackageInfo pi = getAppPackageInfo(pkgName);
-        final String[] requestedPermissions = pi.requestedPermissions;
+    /** Returns valid Health permissions declared in the Manifest of the given package. */
+    public static List<String> getDeclaredHealthPermissions(String packageName) {
+        Context context = ApplicationProvider.getApplicationContext();
+        PackageInfo packageInfo = getAppPackageInfo(context, packageName);
+        String[] requestedPermissions = packageInfo.requestedPermissions;
 
         if (requestedPermissions == null) {
             return List.of();
         }
 
         return Arrays.stream(requestedPermissions)
-                .filter(permission -> permission.startsWith(HEALTH_PERMISSION_PREFIX))
+                .filter(permission -> HealthConnectManager.isHealthPermission(context, permission))
                 .toList();
     }
 
-    public static List<String> getGrantedHealthPermissions(String pkgName) {
-        final PackageInfo pi = getAppPackageInfo(pkgName);
-        final String[] requestedPermissions = pi.requestedPermissions;
-        final int[] requestedPermissionsFlags = pi.requestedPermissionsFlags;
+    /** Returns all Health permissions that are granted to the specified package. */
+    public static List<String> getGrantedHealthPermissions(String packageName) {
+        Context context = ApplicationProvider.getApplicationContext();
+        PackageInfo packageInfo = getAppPackageInfo(context, packageName);
+        String[] requestedPermissions = packageInfo.requestedPermissions;
+        int[] requestedPermissionsFlags = packageInfo.requestedPermissionsFlags;
 
-        if (requestedPermissions == null) {
+        if (requestedPermissions == null || requestedPermissionsFlags == null) {
             return List.of();
         }
 
         final List<String> permissions = new ArrayList<>();
 
         for (int i = 0; i < requestedPermissions.length; i++) {
-            if ((requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
-                if (requestedPermissions[i].startsWith(HEALTH_PERMISSION_PREFIX)) {
-                    permissions.add(requestedPermissions[i]);
-                }
+            if ((requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0
+                    && HealthConnectManager.isHealthPermission(context, requestedPermissions[i])) {
+                permissions.add(requestedPermissions[i]);
             }
         }
 
         return permissions;
     }
 
-    private static PackageInfo getAppPackageInfo(String pkgName) {
-        final Context targetContext = androidx.test.InstrumentationRegistry.getTargetContext();
+    private static PackageInfo getAppPackageInfo(Context context, String packageName) {
+        return getAppPackageInfo(context.getPackageManager(), packageName);
+    }
+
+    private static PackageInfo getAppPackageInfo(
+            PackageManager packageManager, String packageName) {
         return runWithShellPermissionIdentity(
                 () ->
-                        targetContext
-                                .getPackageManager()
-                                .getPackageInfo(
-                                        pkgName,
-                                        PackageManager.PackageInfoFlags.of(GET_PERMISSIONS)));
+                        packageManager.getPackageInfo(
+                                packageName, PackageManager.PackageInfoFlags.of(GET_PERMISSIONS)));
     }
 
     public static void grantPermission(String pkgName, String permission) {
@@ -171,31 +176,28 @@
         }
     }
 
+    /** Revokes all granted Health permissions from the specified package. */
+    @SuppressLint("MissingPermission")
     public static void revokeHealthPermissions(String packageName) {
-        runWithShellPermissionIdentity(() -> revokeHealthPermissionsPrivileged(packageName));
-    }
+        Context context = ApplicationProvider.getApplicationContext();
+        PackageManager packageManager = context.getPackageManager();
+        UserHandle user = context.getUser();
 
-    private static void revokeHealthPermissionsPrivileged(String packageName)
-            throws PackageManager.NameNotFoundException {
-        final Context targetContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        final PackageManager packageManager = targetContext.getPackageManager();
-        final UserHandle user = targetContext.getUser();
-
-        final PackageInfo packageInfo =
-                packageManager.getPackageInfo(
-                        packageName,
-                        PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS));
-
-        final String[] permissions = packageInfo.requestedPermissions;
+        PackageInfo packageInfo = getAppPackageInfo(packageManager, packageName);
+        String[] permissions = packageInfo.requestedPermissions;
         if (permissions == null) {
             return;
         }
 
-        for (String permission : permissions) {
-            if (permission.startsWith(HEALTH_PERMISSION_PREFIX)) {
-                packageManager.revokeRuntimePermission(packageName, permission, user);
-            }
-        }
+        runWithShellPermissionIdentity(
+                () -> {
+                    for (String permission : permissions) {
+                        if (HealthConnectManager.isHealthPermission(context, permission)) {
+                            packageManager.revokeRuntimePermission(packageName, permission, user);
+                        }
+                    }
+                },
+                REVOKE_RUNTIME_PERMISSIONS);
     }
 
     /**
@@ -238,7 +240,7 @@
     public static <T> T runWithRevokedPermissions(
             ThrowingSupplier<T> supplier, String packageName, String... permissions)
             throws Exception {
-        Context context = androidx.test.InstrumentationRegistry.getTargetContext();
+        Context context = ApplicationProvider.getApplicationContext();
         checkArgument(
                 !context.getPackageName().equals(packageName),
                 "Can not be called on self, only on other apps");
@@ -274,32 +276,4 @@
                             "pm clear-permission-flags %s %s user-fixed", packageName, permission));
         }
     }
-
-    /**
-     * Sets the device config value for the duration of the supplier.
-     *
-     * <p>Kills the HC controller after each device config update as the most reliable way of making
-     * sure the controller picks up the updated value. Otherwise the callback which the controller
-     * uses to listen to device config changes might arrive late (and usually does).
-     */
-    public static <T> T runWithDeviceConfigForController(
-            String key, String value, ThrowingSupplier<T> supplier) throws Exception {
-        DeviceConfigRule rule = new DeviceConfigRule(key, value);
-        try {
-            rule.before();
-            killHealthConnectController();
-            return supplier.get();
-        } catch (Throwable e) {
-            throw new Exception(e);
-        } finally {
-            rule.after();
-            killHealthConnectController();
-        }
-    }
-
-    /** Kills Health Connect controller. */
-    private static void killHealthConnectController() {
-        SystemUtil.runShellCommandOrThrow(
-                "am force-stop com.google.android.healthconnect.controller");
-    }
 }
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ProcedureBuilder.java b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ProcedureBuilder.java
deleted file mode 100644
index 88aab2a..0000000
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/ProcedureBuilder.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.healthconnect.cts.utils;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public final class ProcedureBuilder {
-
-    private static final String DEFAULT_JSON =
-            "{"
-                    + "  \"resourceType\" : \"Procedure\","
-                    + "  \"id\" : \"f001\","
-                    + "  \"status\" : \"completed\","
-                    + "  \"code\" : {"
-                    + "    \"coding\" : [{"
-                    + "      \"system\" : \"http://snomed.info/sct\","
-                    + "      \"code\" : \"34068001\","
-                    + "      \"display\" : \"Heart valve replacement\""
-                    + "    }]"
-                    + "  },"
-                    + "  \"subject\" : {"
-                    + "    \"reference\" : \"Patient/f001\","
-                    + "    \"display\" : \"A. Lincoln\""
-                    + "  },"
-                    + "  \"encounter\" : {"
-                    + "    \"reference\" : \"Encounter/f001\""
-                    + "  },"
-                    + "  \"occurrencePeriod\" : {"
-                    + "    \"start\" : \"2011-06-26\","
-                    + "    \"end\" : \"2011-06-27\""
-                    + "  },"
-                    + "  \"performer\" : [{"
-                    + "    \"function\" : {"
-                    + "      \"coding\" : [{"
-                    + "        \"system\" : \"urn:oid:2.16.840.1.113883.2.4.15.111\","
-                    + "        \"code\" : \"01.000\","
-                    + "        \"display\" : \"Arts\""
-                    + "      }],"
-                    + "      \"text\" : \"Care role\""
-                    + "    },"
-                    + "    \"actor\" : {"
-                    + "      \"reference\" : \"Practitioner/f002\","
-                    + "      \"display\" : \"G. Washington\""
-                    + "    }"
-                    + "  }],"
-                    + "  \"reason\" : [{"
-                    + "    \"concept\" : {"
-                    + "      \"text\" : \"Heart valve disorder\""
-                    + "    }"
-                    + "  }],"
-                    + "  \"bodySite\" : [{"
-                    + "    \"coding\" : [{"
-                    + "      \"system\" : \"http://snomed.info/sct\","
-                    + "      \"code\" : \"17401000\","
-                    + "      \"display\" : \"Heart valve structure\""
-                    + "    }]"
-                    + "  }],"
-                    + "  \"outcome\" : {"
-                    + "    \"text\" : \"improved blood circulation\""
-                    + "  },"
-                    + "  \"report\" : [{"
-                    + "    \"reference\" : \"DiagnosticReport/f001\","
-                    + "    \"display\" : \"Lab results blood test\""
-                    + "  }],"
-                    + "  \"followUp\" : [{"
-                    + "    \"text\" : \"described in care plan\""
-                    + "  }]"
-                    + "}";
-    private final JSONObject mFhir;
-
-    /**
-     * Creates a default valid FHIR Observation.
-     *
-     * <p>All that should be relied on is that the Observation is valid. To rely on anything else
-     * set it with the other methods.
-     */
-    public ProcedureBuilder() {
-        try {
-            this.mFhir = new JSONObject(DEFAULT_JSON);
-        } catch (JSONException e) {
-            // Should never happen, but JSONException is declared, and is a checked exception.
-            throw new IllegalStateException(e);
-        }
-    }
-
-    /**
-     * Set the FHIR id.
-     *
-     * @return this Builder.
-     */
-    public ProcedureBuilder setId(String id) {
-        try {
-            mFhir.put("id", id);
-        } catch (JSONException e) {
-            throw new IllegalArgumentException(e);
-        }
-        return this;
-    }
-
-    /** Returns the current state of this builder as a JSON FHIR string. */
-    public String toJson() {
-        try {
-            return mFhir.toString(/* indentSpaces= */ 2);
-        } catch (JSONException e) {
-            // Should never happen, but JSONException is declared, and is a checked exception.
-            throw new IllegalStateException(e);
-        }
-    }
-}
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/TestOutcomeReceiver.java b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/TestOutcomeReceiver.java
index 6d3eb14..345dc7e 100644
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/TestOutcomeReceiver.java
+++ b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/TestOutcomeReceiver.java
@@ -18,12 +18,16 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.app.UiAutomation;
 import android.os.OutcomeReceiver;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.test.platform.app.InstrumentationRegistry;
 
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -38,6 +42,14 @@
     private static final String TAG = "HCTestOutcomeReceiver";
     private static final int DEFAULT_TIMEOUT_SECONDS = 5;
 
+    private static final Executor sExecutor =
+            Executors.newSingleThreadExecutor(
+                    runnable -> {
+                        Thread t = Executors.defaultThreadFactory().newThread(runnable);
+                        t.setName("HealthConnectReceiver");
+                        return t;
+                    });
+
     private final CountDownLatch mLatch = new CountDownLatch(1);
     private final AtomicReference<T> mResponse = new AtomicReference<>();
     private final AtomicReference<E> mException = new AtomicReference<>();
@@ -91,7 +103,53 @@
     @Override
     public void onError(@NonNull E error) {
         mException.set(error);
-        Log.e(TAG, error.getMessage());
+        Log.e(TAG, "onError", error);
         mLatch.countDown();
     }
+
+    /** Returns an {@code Executor} that can be used for delivering an outcome to a receiver. */
+    public static Executor outcomeExecutor() {
+        return sExecutor;
+    }
+
+    /**
+     * Wraps an API call that returns its response via an {@link android.os.OutcomeReceiver}.
+     *
+     * @see #callAndGetResponse(Class, CallableForOutcome)
+     */
+    public interface CallableForOutcome<R, E extends RuntimeException> {
+        /** Calls the API method with the specified {@code executor} and {@code receiver}. */
+        void call(Executor executor, TestOutcomeReceiver<R, E> receiver);
+    }
+
+    /**
+     * Helper for calling an API method that returns its response via an {@link
+     * android.os.OutcomeReceiver}.
+     */
+    public static <R, E extends RuntimeException> R callAndGetResponse(
+            Class<E> exceptionType, CallableForOutcome<R, E> callable) throws InterruptedException {
+        TestOutcomeReceiver<R, E> receiver = new TestOutcomeReceiver<>();
+        callable.call(sExecutor, receiver);
+        return receiver.getResponse();
+    }
+
+    /**
+     * Helper for calling an API method that returns its response via an {@link
+     * android.os.OutcomeReceiver} while holding permissions via {@link
+     * UiAutomation#adoptShellPermissionIdentity(String...)}.
+     */
+    public static <R, E extends RuntimeException> R callAndGetResponseWithShellPermissionIdentity(
+            Class<E> exceptionType, CallableForOutcome<R, E> callable, String... permissions)
+            throws InterruptedException {
+        // Don't use SystemUtil.runWithShellPermissionIdentity as that wraps all thrown exceptions
+        // in RuntimeException, which is unnecessary for our APIs which don't throw any
+        // checked exceptions.
+        UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        automation.adoptShellPermissionIdentity(permissions);
+        try {
+            return callAndGetResponse(exceptionType, callable);
+        } finally {
+            automation.dropShellPermissionIdentity();
+        }
+    }
 }
diff --git a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/TestUtils.java b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/TestUtils.java
index fea1eec..5802669 100644
--- a/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/TestUtils.java
+++ b/tests/cts/utils/HealthConnectTestUtils/src/android/healthconnect/cts/utils/TestUtils.java
@@ -16,8 +16,6 @@
 
 package android.healthconnect.cts.utils;
 
-import static android.Manifest.permission.READ_DEVICE_CONFIG;
-import static android.Manifest.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG;
 import static android.health.connect.HealthDataCategory.ACTIVITY;
 import static android.health.connect.HealthDataCategory.BODY_MEASUREMENTS;
 import static android.health.connect.HealthDataCategory.CYCLE_TRACKING;
@@ -31,6 +29,7 @@
 import static android.health.connect.HealthPermissionCategory.STEPS;
 import static android.healthconnect.cts.utils.DataFactory.NOW;
 import static android.healthconnect.cts.utils.DataFactory.getDataOrigin;
+import static android.healthconnect.cts.utils.HealthConnectReceiver.callAndGetResponseWithShellPermissionIdentity;
 import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
 import static android.healthconnect.test.app.TestAppReceiver.ACTION_AGGREGATE_STEPS_COUNT;
 import static android.healthconnect.test.app.TestAppReceiver.ACTION_INSERT_EXERCISE_RECORD;
@@ -48,8 +47,6 @@
 import static android.healthconnect.test.app.TestAppReceiver.EXTRA_SENDER_PACKAGE_NAME;
 import static android.healthconnect.test.app.TestAppReceiver.EXTRA_TIMES;
 
-import static com.android.compatibility.common.util.FeatureUtil.AUTOMOTIVE_FEATURE;
-import static com.android.compatibility.common.util.FeatureUtil.hasSystemFeature;
 import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 import static com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled;
 
@@ -71,7 +68,6 @@
 import android.health.connect.DeleteUsingFiltersRequest;
 import android.health.connect.FetchDataOriginsPriorityOrderResponse;
 import android.health.connect.GetMedicalDataSourcesRequest;
-import android.health.connect.HealthConnectDataState;
 import android.health.connect.HealthConnectException;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.HealthPermissionCategory;
@@ -134,19 +130,19 @@
 import android.health.connect.datatypes.Vo2MaxRecord;
 import android.health.connect.datatypes.WeightRecord;
 import android.health.connect.datatypes.WheelchairPushesRecord;
-import android.health.connect.migration.MigrationEntity;
 import android.health.connect.migration.MigrationException;
 import android.healthconnect.test.app.TestAppReceiver;
 import android.os.Bundle;
 import android.os.OutcomeReceiver;
 import android.os.ParcelFileDescriptor;
-import android.provider.DeviceConfig;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.healthfitness.flags.Flags;
+
 import java.io.BufferedReader;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -186,10 +182,6 @@
     private static final String TEST_APP_RECEIVER =
             PKG_TEST_APP + "." + TestAppReceiver.class.getSimpleName();
 
-    public static boolean isHardwareAutomotive() {
-        return hasSystemFeature(AUTOMOTIVE_FEATURE);
-    }
-
     public static ChangeLogTokenResponse getChangeLogToken(ChangeLogTokenRequest request)
             throws InterruptedException {
         return getChangeLogToken(request, ApplicationProvider.getApplicationContext());
@@ -304,6 +296,22 @@
         return receiver.getResponse();
     }
 
+    /**
+     * Given {@link PermissionHelper#MANAGE_HEALTH_DATA} permission, invokes {@link
+     * HealthConnectManager#aggregate} with the given {@code request}.
+     */
+    public static <T> AggregateRecordsResponse<T> getAggregateResponseWithManagePermission(
+            AggregateRecordsRequest<T> request) throws InterruptedException {
+        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+
+        try {
+            return getAggregateResponse(request);
+        } finally {
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
     public static <T> AggregateRecordsResponse<T> getAggregateResponse(
             AggregateRecordsRequest<T> request) throws InterruptedException {
         HealthConnectReceiver<AggregateRecordsResponse<T>> receiver =
@@ -347,6 +355,22 @@
         return receiver.getResponse();
     }
 
+    /**
+     * Given {@link PermissionHelper#MANAGE_HEALTH_DATA} permission, invokes {@link
+     * HealthConnectManager#readRecords} with the given {@code request}.
+     */
+    public static <T extends Record> List<T> readRecordsWithManagePermission(
+            ReadRecordsRequest<T> request) throws InterruptedException {
+        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        uiAutomation.adoptShellPermissionIdentity(MANAGE_HEALTH_DATA);
+
+        try {
+            return readRecords(request);
+        } finally {
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
     public static <T extends Record> List<T> readRecords(ReadRecordsRequest<T> request)
             throws InterruptedException {
         return getReadRecordsResponse(request).getRecords();
@@ -558,54 +582,40 @@
         }
     }
 
-    /** Calls {@link #startMigration()} ()} with shell permission identity. */
-    public static void startMigrationWithShellPermissionIdentity() {
-        runWithShellPermissionIdentity(
-                () -> {
-                    startMigration();
-                    assertThat(TestUtils.getHealthConnectDataMigrationState())
-                            .isEqualTo(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
-                },
+    /** Calls {@link HealthConnectManager#startMigration} ()} with shell permission identity. */
+    public static void startMigrationWithShellPermissionIdentity() throws InterruptedException {
+        callAndGetResponseWithShellPermissionIdentity(
+                MigrationException.class,
+                getHealthConnectManager()::startMigration,
                 Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
     }
 
-    public static void startMigration() throws InterruptedException {
-        MigrationReceiver receiver = new MigrationReceiver();
-        getHealthConnectManager().startMigration(Executors.newSingleThreadExecutor(), receiver);
-        receiver.verifyNoExceptionOrThrow();
+    /** Calls {@link HealthConnectManager#finishMigration} with shell permission identity. */
+    public static void finishMigrationWithShellPermissionIdentity() throws InterruptedException {
+        callAndGetResponseWithShellPermissionIdentity(
+                MigrationException.class,
+                getHealthConnectManager()::finishMigration,
+                Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
     }
 
-    public static void writeMigrationData(List<MigrationEntity> entities)
-            throws InterruptedException {
-        MigrationReceiver receiver = new MigrationReceiver();
-        getHealthConnectManager()
-                .writeMigrationData(entities, Executors.newSingleThreadExecutor(), receiver);
-        receiver.verifyNoExceptionOrThrow();
-    }
-
-    public static void finishMigration() throws InterruptedException {
-        MigrationReceiver receiver = new MigrationReceiver();
-        getHealthConnectManager().finishMigration(Executors.newSingleThreadExecutor(), receiver);
-        receiver.verifyNoExceptionOrThrow();
-    }
-
-    /** Calls {@link #finishMigration()} with shell permission identity. */
-    public static void finishMigrationWithShellPermissionIdentity() {
-        runWithShellPermissionIdentity(
-                TestUtils::finishMigration, Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
-    }
-
-    public static void insertMinDataMigrationSdkExtensionVersion(int version)
-            throws InterruptedException {
-        MigrationReceiver receiver = new MigrationReceiver();
-        getHealthConnectManager()
-                .insertMinDataMigrationSdkExtensionVersion(
-                        version, Executors.newSingleThreadExecutor(), receiver);
-        receiver.verifyNoExceptionOrThrow();
+    /** Calls insertMinDataMigrationSdkExtensionVersion with shell permission identity. */
+    public static void insertMinDataMigrationSdkExtensionVersionWithShellPermissionIdentity(
+            int version) throws InterruptedException {
+        Void unused =
+                callAndGetResponseWithShellPermissionIdentity(
+                        MigrationException.class,
+                        (executor, receiver) ->
+                                getHealthConnectManager()
+                                        .insertMinDataMigrationSdkExtensionVersion(
+                                                version, executor, receiver),
+                        Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
     }
 
     public static void deleteAllStagedRemoteData() {
-        HealthConnectManager service = getHealthConnectManager();
+        deleteAllStagedRemoteData(getHealthConnectManager());
+    }
+
+    public static void deleteAllStagedRemoteData(HealthConnectManager service) {
         runWithShellPermissionIdentity(
                 () ->
                         // TODO(b/241542162): Avoid reflection once TestApi can be called from CTS
@@ -634,21 +644,15 @@
     }
 
     public static int getHealthConnectDataMigrationState() throws InterruptedException {
-        HealthConnectReceiver<HealthConnectDataState> receiver = new HealthConnectReceiver<>();
-        getHealthConnectManager()
-                .getHealthConnectDataState(Executors.newSingleThreadExecutor(), receiver);
-        return receiver.getResponse().getDataMigrationState();
+        return callAndGetResponseWithShellPermissionIdentity(
+                        getHealthConnectManager()::getHealthConnectDataState, MANAGE_HEALTH_DATA)
+                .getDataMigrationState();
     }
 
     public static int getHealthConnectDataRestoreState() throws InterruptedException {
-        HealthConnectReceiver<HealthConnectDataState> receiver = new HealthConnectReceiver<>();
-        runWithShellPermissionIdentity(
-                () ->
-                        getHealthConnectManager()
-                                .getHealthConnectDataState(
-                                        Executors.newSingleThreadExecutor(), receiver),
-                MANAGE_HEALTH_DATA);
-        return receiver.getResponse().getDataRestoreState();
+        return callAndGetResponseWithShellPermissionIdentity(
+                        getHealthConnectManager()::getHealthConnectDataState, MANAGE_HEALTH_DATA)
+                .getDataRestoreState();
     }
 
     public static List<AppInfo> getApplicationInfo() throws InterruptedException {
@@ -899,6 +903,8 @@
             }
         } catch (FileNotFoundException e) {
             Log.e(TAG, e.getMessage());
+        } finally {
+            uiAutomation.dropShellPermissionIdentity();
         }
 
         return output.toString();
@@ -914,20 +920,6 @@
         return requireNonNull(context.getSystemService(HealthConnectManager.class));
     }
 
-    public static String getDeviceConfigValue(String key) {
-        return runWithShellPermissionIdentity(
-                () -> DeviceConfig.getProperty(DeviceConfig.NAMESPACE_HEALTH_FITNESS, key),
-                READ_DEVICE_CONFIG);
-    }
-
-    public static void setDeviceConfigValue(String key, String value) {
-        runWithShellPermissionIdentity(
-                () ->
-                        DeviceConfig.setProperty(
-                                DeviceConfig.NAMESPACE_HEALTH_FITNESS, key, value, false),
-                WRITE_ALLOWLISTED_DEVICE_CONFIG);
-    }
-
     /** Reads {@link StepsRecord}s using record IDs. */
     public static void readStepsRecordsUsingRecordIdsViaTestApp(
             Context context, List<String> recordIds) {
@@ -1081,12 +1073,11 @@
         receiver.verifyNoExceptionOrThrow(3);
     }
 
-    public static boolean isHardwareSupported() {
-        return isHardwareSupported(ApplicationProvider.getApplicationContext());
+    public static boolean isHealthConnectFullySupported() {
+        return isHealthConnectFullySupported(ApplicationProvider.getApplicationContext());
     }
 
-    /** returns true if the hardware is supported by HealthConnect. */
-    public static boolean isHardwareSupported(Context context) {
+    public static boolean isHealthConnectFullySupported(Context context) {
         PackageManager pm = context.getPackageManager();
         return (!pm.hasSystemFeature(PackageManager.FEATURE_EMBEDDED)
                 && !pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
@@ -1094,6 +1085,18 @@
                 && !pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE));
     }
 
+    public static boolean areHealthPermissionsSupported() {
+        return areHealthPermissionsSupported(ApplicationProvider.getApplicationContext());
+    }
+
+    /** returns true if the hardware is supported by HealthConnect. */
+    public static boolean areHealthPermissionsSupported(Context context) {
+        PackageManager pm = context.getPackageManager();
+        boolean isWatchEnabled = pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
+          && Flags.replaceBodySensorPermissionEnabled();
+        return isHealthConnectFullySupported(context) || isWatchEnabled;
+    }
+
     /** Gets the priority list after getting the MANAGE_HEALTH_DATA permission. */
     public static FetchDataOriginsPriorityOrderResponse getPriorityWithManageHealthDataPermission(
             int permissionCategory) throws InterruptedException {
@@ -1283,14 +1286,29 @@
 
     /**
      * Sets value for a field using reflection. This can be used to set fields for immutable class.
+     *
+     * <p>This method recursively looks for the field in the object's class and its superclasses.
      */
     public static void setFieldValueUsingReflection(Object object, String fieldName, Object value)
             throws NoSuchFieldException, IllegalAccessException {
-        Field field = object.getClass().getDeclaredField(fieldName);
+        Field field = findFieldUsingReflection(object.getClass(), fieldName);
         field.setAccessible(true);
         field.set(object, value);
     }
 
+    private static Field findFieldUsingReflection(Class<?> type, String fieldName) {
+        try {
+            return type.getDeclaredField(fieldName);
+        } catch (NoSuchFieldException e) {
+            // If field isn't present, recursively look for it in the class's superclass.
+            Class<?> superClass = type.getSuperclass();
+            if (superClass != null) {
+                return findFieldUsingReflection(superClass, fieldName);
+            }
+        }
+        throw new IllegalArgumentException("Could not find field " + fieldName);
+    }
+
     // TODO(b/328228842): Avoid using reflection once we have Builder(Record) constructors
     private static void copyRecordIdViaReflection(Record from, Record to) {
         setRecordIdViaReflection(to.getMetadata(), from.getMetadata().getId());
@@ -1354,9 +1372,6 @@
         }
     }
 
-    public static final class MigrationReceiver
-            extends TestOutcomeReceiver<Void, MigrationException> {}
-
     /**
      * A {@link Consumer} that allows throwing checked exceptions from its single abstract method.
      */
diff --git a/tests/integrationtests/Android.bp b/tests/integrationtests/Android.bp
index da9adb5..c7b9d4f 100644
--- a/tests/integrationtests/Android.bp
+++ b/tests/integrationtests/Android.bp
@@ -38,6 +38,7 @@
         "compatibility-device-util-axt",
         "androidx.test.ext.truth",
         "cts-healthconnect-utils",
+        "cts-healthconnect-phr-lib",
     ],
     srcs: [
         "src/android/healthconnect/tests/backuprestore/*.java",
diff --git a/tests/integrationtests/AndroidManifestBackupRestore.xml b/tests/integrationtests/AndroidManifestBackupRestore.xml
index 5539b40..224033c 100644
--- a/tests/integrationtests/AndroidManifestBackupRestore.xml
+++ b/tests/integrationtests/AndroidManifestBackupRestore.xml
@@ -118,4 +118,5 @@
     <uses-permission android:name="android.permission.health.WRITE_VO2_MAX"/>
     <uses-permission android:name="android.permission.health.WRITE_WEIGHT"/>
     <uses-permission android:name="android.permission.health.WRITE_WHEELCHAIR_PUSHES"/>
+    <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
 </manifest>
diff --git a/tests/integrationtests/AndroidManifestExportImport.xml b/tests/integrationtests/AndroidManifestExportImport.xml
index a46868f..aec5aa9 100644
--- a/tests/integrationtests/AndroidManifestExportImport.xml
+++ b/tests/integrationtests/AndroidManifestExportImport.xml
@@ -21,6 +21,14 @@
 
     <application>
         <uses-library android:name="android.test.runner"/>
+        <activity android:name=".EmptyActivity"
+            android:label="EmptyActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
+                <category android:name="android.intent.category.HEALTH_PERMISSIONS"/>
+            </intent-filter>
+        </activity>
     </application>
 
     <!-- To get visibility of the app with health permissions definitions,
diff --git a/tests/integrationtests/src/android/healthconnect/tests/backuprestore/BackupRestoreApiTest.java b/tests/integrationtests/src/android/healthconnect/tests/backuprestore/BackupRestoreApiTest.java
index 13aa92a..1d08628 100644
--- a/tests/integrationtests/src/android/healthconnect/tests/backuprestore/BackupRestoreApiTest.java
+++ b/tests/integrationtests/src/android/healthconnect/tests/backuprestore/BackupRestoreApiTest.java
@@ -76,7 +76,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/integrationtests/src/android/healthconnect/tests/backuprestore/BackupRestoreE2ETest.java b/tests/integrationtests/src/android/healthconnect/tests/backuprestore/BackupRestoreE2ETest.java
index 1e5eb1c..7a8e99a 100644
--- a/tests/integrationtests/src/android/healthconnect/tests/backuprestore/BackupRestoreE2ETest.java
+++ b/tests/integrationtests/src/android/healthconnect/tests/backuprestore/BackupRestoreE2ETest.java
@@ -16,6 +16,7 @@
 
 package android.healthconnect.tests.backuprestore;
 
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
 import static android.healthconnect.cts.utils.PermissionHelper.getHealthDataHistoricalAccessStartDate;
 import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
 import static android.healthconnect.cts.utils.PermissionHelper.revokeAllPermissions;
@@ -45,22 +46,34 @@
 import android.health.connect.datatypes.ExerciseSessionType;
 import android.health.connect.datatypes.InstantRecord;
 import android.health.connect.datatypes.IntervalRecord;
+import android.health.connect.datatypes.MedicalResource;
 import android.health.connect.datatypes.Metadata;
 import android.health.connect.datatypes.PlannedExerciseSessionRecord;
 import android.health.connect.datatypes.Record;
 import android.health.connect.datatypes.units.Energy;
+import android.healthconnect.cts.phr.utils.PhrCtsTestUtils;
 import android.healthconnect.cts.utils.DataFactory;
 import android.healthconnect.cts.utils.TestUtils;
 import android.os.ParcelFileDescriptor;
 import android.os.UserHandle;
 import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.provider.Settings;
-import android.test.InstrumentationTestCase;
 
 import androidx.annotation.NonNull;
-import androidx.test.InstrumentationRegistry;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
 
 import com.android.compatibility.common.util.BackupUtils;
+import com.android.healthfitness.flags.Flags;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import java.io.InputStream;
 import java.time.Instant;
@@ -69,8 +82,9 @@
 import java.util.List;
 import java.util.UUID;
 
+@RunWith(AndroidJUnit4.class)
 @AppModeFull
-public class BackupRestoreE2ETest extends InstrumentationTestCase {
+public class BackupRestoreE2ETest {
     /** Whether to print out logs in tests for debugging purposes. */
     private static final boolean IS_DEBUGGING_TEST = false;
 
@@ -95,23 +109,29 @@
                 @Override
                 protected InputStream executeShellCommand(String command) {
                     final ParcelFileDescriptor pfd =
-                            getInstrumentation().getUiAutomation().executeShellCommand(command);
+                            InstrumentationRegistry.getInstrumentation()
+                                    .getUiAutomation()
+                                    .executeShellCommand(command);
                     return new ParcelFileDescriptor.AutoCloseInputStream(pfd);
                 }
             };
-    private final Context mContext = InstrumentationRegistry.getTargetContext();
+    private final Context mContext =
+            InstrumentationRegistry.getInstrumentation().getTargetContext();
+    private PhrCtsTestUtils mPhrTestUtil;
 
     private String mBackupRestoreApkPackageName;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        if (!TestUtils.isHardwareSupported()) {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Before
+    public void setUp() throws Exception {
+        if (!TestUtils.isHealthConnectFullySupported()) {
             return;
         }
         mBackupRestoreApkPackageName = getBackupRestoreApkPackageName();
         // enable backup on the test device
-        mBackupUtils.enableBackup(true);
+        mBackupUtils.enableBackupForUser(true, UserHandle.myUserId());
         // switch backup transport to local
         mBackupUtils.setBackupTransportForUser(
                 mBackupUtils.getLocalTransportName(), UserHandle.myUserId());
@@ -124,11 +144,59 @@
 
         deleteAllStagedRemoteData();
         verifyDeleteRecords(new DeleteUsingFiltersRequest.Builder().build());
+        mPhrTestUtil = new PhrCtsTestUtils(TestUtils.getHealthConnectManager());
     }
 
+    @Test
+    @RequiresFlagsEnabled({
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_ENABLE_D2D_AND_EXPORT_IMPORT
+    })
+    @RequiresFlagsDisabled(Flags.FLAG_PERSONAL_HEALTH_RECORD_DISABLE_D2D)
+    public void testBackupThenRestore_over5000MedicalResources_expectDataIsRestoredCorrectly()
+            throws Exception {
+        if (!TestUtils.isHealthConnectFullySupported()) {
+            return;
+        }
+
+        // Insert records.
+        int numOfRecords = 100;
+        List<Record> insertedRecords =
+                insertRecordsWithChunking(
+                        this::getCompleteActiveCaloriesBurnedRecord, numOfRecords);
+        assertThat(insertedRecords).hasSize(numOfRecords);
+        // Insert medical resources.
+        int numOfMedicalResources = 7000;
+        String dataSourceId =
+                mPhrTestUtil.createDataSource(getCreateMedicalDataSourceRequest("1")).getId();
+        List<MedicalResource> medicalResources =
+                mPhrTestUtil.upsertVaccineMedicalResources(dataSourceId, numOfMedicalResources);
+        assertThat(medicalResources).hasSize(numOfMedicalResources);
+
+        mBackupUtils.backupNowAndAssertSuccessForUser(
+                mBackupRestoreApkPackageName, UserHandle.myUserId());
+
+        // Delete records.
+        verifyDeleteRecords(new DeleteUsingFiltersRequest.Builder().build());
+        readAndAssertRecordsNotExistUsingIds(insertedRecords);
+        // Delete medical data source that would delete all of the medical resources
+        // with it.
+        mPhrTestUtil.deleteMedicalDataSourceWithData(dataSourceId);
+        readMedicalResourcesAndAssertEmpty(medicalResources);
+
+        mBackupUtils.restoreAndAssertSuccessForUser(
+                LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName, UserHandle.myUserId());
+
+        assertWithTimeout(() -> readAndAssertMedicalResourcesExistUsingIds(medicalResources));
+        assertWithTimeout(() -> readAndAssertRecordsExistUsingIds(insertedRecords));
+        log("Data Restore state = " + getHealthConnectDataRestoreState());
+    }
+
+    @Test
     public void testBackupThenRestore_over2000Records_expectDataIsRestoredCorrectly()
             throws Exception {
-        if (!TestUtils.isHardwareSupported()) {
+        if (!TestUtils.isHealthConnectFullySupported()) {
             return;
         }
         int numOfRecords = 2050;
@@ -137,20 +205,23 @@
                         this::getCompleteActiveCaloriesBurnedRecord, numOfRecords);
         assertThat(insertedRecords).hasSize(numOfRecords);
 
-        mBackupUtils.backupNowAndAssertSuccess(mBackupRestoreApkPackageName);
+        mBackupUtils.backupNowAndAssertSuccessForUser(
+                mBackupRestoreApkPackageName, UserHandle.myUserId());
 
         verifyDeleteRecords(new DeleteUsingFiltersRequest.Builder().build());
         readAndAssertRecordsNotExistUsingIds(insertedRecords);
 
-        mBackupUtils.restoreAndAssertSuccess(LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName);
+        mBackupUtils.restoreAndAssertSuccessForUser(
+                LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName, UserHandle.myUserId());
 
         assertWithTimeout(() -> readAndAssertRecordsExistUsingIds(insertedRecords));
         log("Data Restore state = " + getHealthConnectDataRestoreState());
     }
 
+    @Test
     public void testBackupThenRestore_trainingPlans_expectDataIsRestoredCorrectly()
             throws Exception {
-        if (!TestUtils.isHardwareSupported()) {
+        if (!TestUtils.isHealthConnectFullySupported()) {
             return;
         }
         DataOrigin dataOrigin = DataFactory.getDataOrigin(mContext.getPackageName());
@@ -189,14 +260,16 @@
                 .isEqualTo(insertedExerciseSession.getMetadata().getId());
 
         // Proceed with backup.
-        mBackupUtils.backupNowAndAssertSuccess(mBackupRestoreApkPackageName);
+        mBackupUtils.backupNowAndAssertSuccessForUser(
+                mBackupRestoreApkPackageName, UserHandle.myUserId());
 
         // Delete the now backed up records from the database.
         verifyDeleteRecords(new DeleteUsingFiltersRequest.Builder().build());
         readAndAssertRecordsNotExistUsingIds(insertedTrainingPlans);
         readAndAssertRecordsNotExistUsingIds(insertedExercises);
 
-        mBackupUtils.restoreAndAssertSuccess(LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName);
+        mBackupUtils.restoreAndAssertSuccessForUser(
+                LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName, UserHandle.myUserId());
 
         assertWithTimeout(
                 () -> {
@@ -215,6 +288,7 @@
         log("Data Restore state = " + getHealthConnectDataRestoreState());
     }
 
+    @Test
     public void testPermissionRestoredBeforeHCRestore_expectGrantTimeIsRestoredCorrectly()
             throws Exception {
         // revoke all permissions for both test apps to remove all stored grant time as setup step
@@ -234,7 +308,8 @@
 
         // trigger backup, only test app 1 has grant time now, so the staged backup file should
         // contains only grant time for test app 1, not test app 2
-        mBackupUtils.backupNowAndAssertSuccess(mBackupRestoreApkPackageName);
+        mBackupUtils.backupNowAndAssertSuccessForUser(
+                mBackupRestoreApkPackageName, UserHandle.myUserId());
 
         // grant permissions to simulate the case where permission controller module is restored
         // before HC module.
@@ -257,7 +332,8 @@
         // trigger restore, now the staged backup file which contains grant time for test app 1
         // should override ONLY the newly created grant time of test app 1, but not the
         // test app 2's.
-        mBackupUtils.restoreAndAssertSuccess(LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName);
+        mBackupUtils.restoreAndAssertSuccessForUser(
+                LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName, UserHandle.myUserId());
 
         // assert that test app 1's grant time is restored correctly
         assertWithTimeout(
@@ -271,6 +347,7 @@
                                 .isEqualTo(historicAccessStartDate2));
     }
 
+    @Test
     public void testPermissionsRestoredAfterHCRestore_expectGrantTimeIsRestoredCorrectly()
             throws Exception {
         // revoke all permissions for the test app to remove all stored grant time as setup step
@@ -288,12 +365,14 @@
                         });
 
         // trigger backup, the staged backup file should contains  grant time for test app 1.
-        mBackupUtils.backupNowAndAssertSuccess(mBackupRestoreApkPackageName);
+        mBackupUtils.backupNowAndAssertSuccessForUser(
+                mBackupRestoreApkPackageName, UserHandle.myUserId());
         Thread.sleep(1000); // add some delay so second grant time is definitely different
 
         // revoke all permissions and then restore the grant time file.
         revokeAllPermissions(TEST_APP_1_PACKAGE_NAME, "");
-        mBackupUtils.restoreAndAssertSuccess(LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName);
+        mBackupUtils.restoreAndAssertSuccessForUser(
+                LOCAL_TRANSPORT_TOKEN, mBackupRestoreApkPackageName, UserHandle.myUserId());
 
         // Since permissions haven't been restored, expect null access date.
         assertWithTimeout(
@@ -337,6 +416,21 @@
                 .build();
     }
 
+    private void readMedicalResourcesAndAssertEmpty(List<MedicalResource> medicalResources)
+            throws InterruptedException {
+        List<MedicalResource> result = mPhrTestUtil.readMedicalResources(medicalResources);
+
+        assertThat(result).isEmpty();
+    }
+
+    private void readAndAssertMedicalResourcesExistUsingIds(List<MedicalResource> medicalResources)
+            throws InterruptedException {
+        List<MedicalResource> result = mPhrTestUtil.readMedicalResources(medicalResources);
+
+        assertThat(result.size()).isEqualTo(medicalResources.size());
+        assertThat(result).containsExactlyElementsIn(medicalResources);
+    }
+
     private static void readAndAssertRecordsExistUsingIds(List<Record> insertedRecords)
             throws InterruptedException {
         String logTag = "readAndAssertRecordsExistUsingIds";
diff --git a/tests/integrationtests/src/android/healthconnect/tests/exportimport/ExportImportApiTest.java b/tests/integrationtests/src/android/healthconnect/tests/exportimport/ExportImportApiTest.java
index 94874df..48169ef 100644
--- a/tests/integrationtests/src/android/healthconnect/tests/exportimport/ExportImportApiTest.java
+++ b/tests/integrationtests/src/android/healthconnect/tests/exportimport/ExportImportApiTest.java
@@ -17,19 +17,19 @@
 package android.healthconnect.tests.exportimport;
 
 import static android.health.connect.HealthPermissions.WRITE_STEPS;
+import static android.healthconnect.cts.utils.PermissionHelper.MANAGE_HEALTH_DATA;
 import static android.healthconnect.cts.utils.PermissionHelper.grantPermission;
 import static android.healthconnect.cts.utils.TestUtils.deleteAllStagedRemoteData;
 import static android.healthconnect.cts.utils.TestUtils.deleteRecords;
 import static android.healthconnect.cts.utils.TestUtils.insertRecords;
 import static android.healthconnect.cts.utils.TestUtils.readAllRecords;
-
-import static com.android.healthfitness.flags.Flags.FLAG_EXPORT_IMPORT_FAST_FOLLOW;
+import static android.healthconnect.tests.exportimport.HealthConnectReceiver.callAndGetResponseWithShellPermissionIdentity;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
-import android.health.connect.HealthConnectException;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.datatypes.DataOrigin;
 import android.health.connect.datatypes.Device;
@@ -40,19 +40,18 @@
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
 import android.healthconnect.cts.utils.TestUtils;
 import android.net.Uri;
-import android.os.OutcomeReceiver;
-import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.annotations.EnableFlags;
 import android.util.Slog;
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.compatibility.common.util.SystemUtil;
-import com.android.server.healthconnect.exportimport.DatabaseContext;
+import com.android.healthfitness.flags.Flags;
+import com.android.server.healthconnect.storage.StorageContext;
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -62,8 +61,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executors;
 
 /** Integration test for the export/import functionality of HealthConnect service. */
 @RunWith(AndroidJUnit4.class)
@@ -76,15 +73,18 @@
     private static final String REMOTE_EXPORT_DATABASE_FILE_NAME = "remote_file.db";
     private static final int SLEEP_TIME_MS = 1000;
 
+    private static final int TIMEOUT_MS = 10000;
+
     private Context mContext;
     private HealthConnectManager mHealthConnectManager;
-    private DatabaseContext mExportedDbContext;
+    private StorageContext mExportedDbContext;
     private Uri mRemoteExportFileUri;
 
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
@@ -94,12 +94,12 @@
         deleteAllStagedRemoteData();
         runShellCommandForHCJob("cancel -n");
         mExportedDbContext =
-                DatabaseContext.create(
-                        mContext, REMOTE_EXPORT_DATABASE_DIR_NAME, mContext.getUser());
+                StorageContext.create(
+                        mContext, mContext.getUser(), REMOTE_EXPORT_DATABASE_DIR_NAME);
         // TODO(b/318484678): Improve tests using Uri from a different app.
         mRemoteExportFileUri =
                 Uri.fromFile(
-                        new File(mExportedDbContext.getDatabaseDir(), REMOTE_EXPORT_ZIP_FILE_NAME));
+                        new File(mExportedDbContext.getDataDir(), REMOTE_EXPORT_ZIP_FILE_NAME));
     }
 
     @After
@@ -119,60 +119,55 @@
         assertThat(stepsRecords).isNotEmpty();
 
         SystemUtil.runWithShellPermissionIdentity(
-                () -> {
-                    mHealthConnectManager.configureScheduledExport(
-                            new ScheduledExportSettings.Builder()
-                                    .setUri(mRemoteExportFileUri)
-                                    .setPeriodInDays(1)
-                                    .build());
-                },
-                "android.permission.MANAGE_HEALTH_DATA");
-        // TODO(b/318484678): Improve tests (as possible) replacing sleep by conditions.
-        Thread.sleep(SLEEP_TIME_MS);
+                () ->
+                        mHealthConnectManager.configureScheduledExport(
+                                new ScheduledExportSettings.Builder()
+                                        .setUri(mRemoteExportFileUri)
+                                        .setPeriodInDays(1)
+                                        .build()),
+                MANAGE_HEALTH_DATA);
+        SystemUtil.eventually(
+                () ->
+                        assertWithMessage("The job is still not scheduled after 10 secs")
+                                .that(isExportImportJobScheduled())
+                                .isTrue(),
+                TIMEOUT_MS);
         runShellCommandForHCJob("run -f -n");
+        // TODO: b/375190993 - Improve tests (as possible) replacing sleep by conditions.
         Thread.sleep(SLEEP_TIME_MS);
 
         deleteRecords(stepsRecords);
         List<StepsRecord> stepsRecordsAfterDeletion = readAllRecords(StepsRecord.class);
         assertThat(stepsRecordsAfterDeletion).isEmpty();
 
-        CountDownLatch latch = new CountDownLatch(1);
-        mHealthConnectManager.runImport(
-                mRemoteExportFileUri,
-                Executors.newSingleThreadExecutor(),
-                new OutcomeReceiver<Void, HealthConnectException>() {
-                    @Override
-                    public void onResult(Void result) {
-                        latch.countDown();
-                    }
+        callAndGetResponseWithShellPermissionIdentity(
+                (executor, receiver) ->
+                        mHealthConnectManager.runImport(mRemoteExportFileUri, executor, receiver),
+                MANAGE_HEALTH_DATA);
 
-                    @Override
-                    public void onError(HealthConnectException exception) {
-                        latch.countDown();
-                    }
-                });
-        Thread.sleep(SLEEP_TIME_MS);
         List<StepsRecord> stepsRecordsAfterImport = readAllRecords(StepsRecord.class);
         assertThat(stepsRecordsAfterImport).isEqualTo(stepsRecords);
     }
 
-    @Ignore("TODO(b/364855153): Fix before flag is enabled.")
-    @RequiresFlagsEnabled({FLAG_EXPORT_IMPORT_FAST_FOLLOW})
     @Test
+    @EnableFlags({Flags.FLAG_EXPORT_IMPORT_FAST_FOLLOW})
     public void exportOn_thenExportOff_noJobScheduled() throws Exception {
         SystemUtil.runWithShellPermissionIdentity(
-                () -> {
-                    mHealthConnectManager.configureScheduledExport(
-                            new ScheduledExportSettings.Builder()
-                                    .setUri(mRemoteExportFileUri)
-                                    .setPeriodInDays(1)
-                                    .build());
-                },
-                "android.permission.MANAGE_HEALTH_DATA");
-        // TODO(b/318484678): Improve tests (as possible) replacing sleep by conditions.
-        Thread.sleep(SLEEP_TIME_MS);
+                () ->
+                        mHealthConnectManager.configureScheduledExport(
+                                new ScheduledExportSettings.Builder()
+                                        .setUri(mRemoteExportFileUri)
+                                        .setPeriodInDays(1)
+                                        .build()),
+                MANAGE_HEALTH_DATA);
+        // TODO: b/375190993 - Improve tests (as possible) by replacing polling checks.
+        SystemUtil.eventually(
+                () ->
+                        assertWithMessage("The job is still not scheduled after 10 secs")
+                                .that(isExportImportJobScheduled())
+                                .isTrue(),
+                TIMEOUT_MS);
         runShellCommandForHCJob("run -f -n");
-        assertThat(isExportImportJobScheduled()).isTrue();
 
         SystemUtil.runWithShellPermissionIdentity(
                 () -> {
@@ -182,12 +177,18 @@
                                     .setPeriodInDays(0)
                                     .build());
                 },
-                "android.permission.MANAGE_HEALTH_DATA");
-        Thread.sleep(SLEEP_TIME_MS);
-        runShellCommandForHCJob("run -f -n");
-        assertThat(isExportImportJobScheduled()).isFalse();
+                MANAGE_HEALTH_DATA);
+        // TODO: b/375190993 - Improve tests (as possible) by replacing polling checks.
+        SystemUtil.eventually(
+                () ->
+                        assertWithMessage("The job is still scheduled after 10 secs")
+                                .that(isExportImportJobScheduled())
+                                .isFalse(),
+                TIMEOUT_MS);
     }
 
+    // TODO(b/370954019): Add test for immediate export.
+
     private boolean isExportImportJobScheduled() throws Exception {
         String dumpsysOutput = TestUtils.runShellCommand("dumpsys jobscheduler");
         return dumpsysOutput.contains("HEALTH_CONNECT_IMPORT_EXPORT_JOBS:");
diff --git a/tests/integrationtests/src/android/healthconnect/tests/exportimport/HealthConnectReceiver.java b/tests/integrationtests/src/android/healthconnect/tests/exportimport/HealthConnectReceiver.java
new file mode 100644
index 0000000..a25d499
--- /dev/null
+++ b/tests/integrationtests/src/android/healthconnect/tests/exportimport/HealthConnectReceiver.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.tests.exportimport;
+
+import android.app.UiAutomation;
+import android.health.connect.HealthConnectException;
+
+/**
+ * A specialization of {@link TestOutcomeReceiver} for the case when {@link HealthConnectException}
+ * may be thrown.
+ *
+ * @param <T> the type of object being received,
+ */
+public final class HealthConnectReceiver<T> extends TestOutcomeReceiver<T, HealthConnectException> {
+
+    /**
+     * Helper for calling an API method that returns its response via an {@link
+     * android.os.OutcomeReceiver}.
+     */
+    public static Void callAndGetResponse(CallableForOutcome<Void, HealthConnectException> callable)
+            throws InterruptedException {
+        return callAndGetResponse(HealthConnectException.class, callable);
+    }
+
+    /**
+     * Helper for calling an API method that returns its response via an {@link
+     * android.os.OutcomeReceiver} while holding permissions via {@link
+     * UiAutomation#adoptShellPermissionIdentity(String...)}.
+     */
+    public static Void callAndGetResponseWithShellPermissionIdentity(
+            CallableForOutcome<Void, HealthConnectException> callable, String... permissions)
+            throws InterruptedException {
+        return callAndGetResponseWithShellPermissionIdentity(
+                HealthConnectException.class, callable, permissions);
+    }
+}
diff --git a/tests/integrationtests/src/android/healthconnect/tests/exportimport/QueryDocumentProvidersTest.java b/tests/integrationtests/src/android/healthconnect/tests/exportimport/QueryDocumentProvidersTest.java
index 60cecd6..7decd9d 100644
--- a/tests/integrationtests/src/android/healthconnect/tests/exportimport/QueryDocumentProvidersTest.java
+++ b/tests/integrationtests/src/android/healthconnect/tests/exportimport/QueryDocumentProvidersTest.java
@@ -54,6 +54,9 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
+// When running these tests locally make sure to disable/uninstall any apps on the device that
+// implement the document provider API. The tests will fail otherwise as they're only expecting the
+// document providers configured by the tests.
 @RunWith(AndroidJUnit4.class)
 public final class QueryDocumentProvidersTest {
     private static final String TEST_DOCUMENT_PROVIDER_APP_PACKAGE_NAME =
@@ -88,7 +91,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @After
     public void tearDown() throws Exception {
diff --git a/tests/integrationtests/src/android/healthconnect/tests/exportimport/TestOutcomeReceiver.java b/tests/integrationtests/src/android/healthconnect/tests/exportimport/TestOutcomeReceiver.java
new file mode 100644
index 0000000..37020b2
--- /dev/null
+++ b/tests/integrationtests/src/android/healthconnect/tests/exportimport/TestOutcomeReceiver.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.tests.exportimport;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.UiAutomation;
+import android.os.OutcomeReceiver;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Implementation of {@link OutcomeReceiver} that is useful in tests for verifying results or
+ * errors. This implementation should be used with OutcomeReceiver that sends a void result, i.e.
+ * {@code OutcomeReceiver<Void, E extends Throwable>}.
+ *
+ * @param <T> The type of the result being sent
+ * @param <E> The type of the throwable for any error
+ */
+public class TestOutcomeReceiver<T, E extends RuntimeException> implements OutcomeReceiver<T, E> {
+    private static final String TAG = "HCTestOutcomeReceiver";
+    private static final int DEFAULT_TIMEOUT_SECONDS = 10;
+
+    private static final Executor sExecutor =
+            Executors.newSingleThreadExecutor(
+                    runnable -> {
+                        Thread t = Executors.defaultThreadFactory().newThread(runnable);
+                        t.setName("HealthConnectReceiver");
+                        return t;
+                    });
+
+    private final CountDownLatch mLatch = new CountDownLatch(1);
+    private final AtomicReference<T> mResponse = new AtomicReference<>();
+    private final AtomicReference<E> mException = new AtomicReference<>();
+
+    /**
+     * Returns the response received. Fails if no response received within the default timeout.
+     *
+     * @throws InterruptedException if this is interrupted before any response received
+     */
+    public T getResponse() throws InterruptedException {
+        verifyNoExceptionOrThrow();
+        return mResponse.get();
+    }
+
+    /**
+     * Returns the exception received. Fails if no response received within the default timeout.
+     *
+     * @throws InterruptedException if this is interrupted before any response received
+     */
+    public E assertAndGetException() throws InterruptedException {
+        assertThat(mLatch.await(DEFAULT_TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
+        assertThat(mResponse.get()).isNull();
+        return mException.get();
+    }
+
+    /**
+     * Asserts that no exception is received within the default timeout. If an exception is received
+     * it is rethrown by this method.
+     */
+    public void verifyNoExceptionOrThrow() throws InterruptedException {
+        verifyNoExceptionOrThrow(DEFAULT_TIMEOUT_SECONDS);
+    }
+
+    /**
+     * Asserts that no exception is received within the given timeout. If an exception is received
+     * it is rethrown by this method.
+     */
+    public void verifyNoExceptionOrThrow(int timeoutSeconds) throws InterruptedException {
+        assertThat(mLatch.await(timeoutSeconds, TimeUnit.SECONDS)).isTrue();
+        if (mException.get() != null) {
+            throw mException.get();
+        }
+    }
+
+    @Override
+    public void onResult(T result) {
+        mResponse.set(result);
+        mLatch.countDown();
+    }
+
+    @Override
+    public void onError(@NonNull E error) {
+        mException.set(error);
+        Log.e(TAG, "onError", error);
+        mLatch.countDown();
+    }
+
+    /** Returns an {@code Executor} that can be used for delivering an outcome to a receiver. */
+    public static Executor outcomeExecutor() {
+        return sExecutor;
+    }
+
+    /**
+     * Wraps an API call that returns its response via an {@link OutcomeReceiver}.
+     *
+     * @see #callAndGetResponse(Class, CallableForOutcome)
+     */
+    public interface CallableForOutcome<R, E extends RuntimeException> {
+        /** Calls the API method with the specified {@code executor} and {@code receiver}. */
+        void call(Executor executor, TestOutcomeReceiver<R, E> receiver);
+    }
+
+    /**
+     * Helper for calling an API method that returns its response via an {@link OutcomeReceiver}.
+     */
+    public static <E extends RuntimeException> Void callAndGetResponse(
+            Class<E> exceptionType, CallableForOutcome<Void, E> callable)
+            throws InterruptedException {
+        TestOutcomeReceiver<Void, E> receiver = new TestOutcomeReceiver<>();
+        callable.call(sExecutor, receiver);
+        return receiver.getResponse();
+    }
+
+    /**
+     * Helper for calling an API method that returns its response via an {@link OutcomeReceiver}
+     * while holding permissions via {@link UiAutomation#adoptShellPermissionIdentity(String...)}.
+     */
+    public static <E extends RuntimeException> Void callAndGetResponseWithShellPermissionIdentity(
+            Class<E> exceptionType, CallableForOutcome<Void, E> callable, String... permissions)
+            throws InterruptedException {
+        // Don't use SystemUtil.runWithShellPermissionIdentity as that wraps all thrown exceptions
+        // in RuntimeException, which is unnecessary for our APIs which don't throw any
+        // checked exceptions.
+        UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        automation.adoptShellPermissionIdentity(permissions);
+        try {
+            return callAndGetResponse(exceptionType, callable);
+        } finally {
+            automation.dropShellPermissionIdentity();
+        }
+    }
+}
diff --git a/tests/integrationtests/src/android/healthconnect/tests/migration/HealthConnectPermissionsMigrationTest.java b/tests/integrationtests/src/android/healthconnect/tests/migration/HealthConnectPermissionsMigrationTest.java
index 0499e35..3a13e66 100644
--- a/tests/integrationtests/src/android/healthconnect/tests/migration/HealthConnectPermissionsMigrationTest.java
+++ b/tests/integrationtests/src/android/healthconnect/tests/migration/HealthConnectPermissionsMigrationTest.java
@@ -63,7 +63,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/integrationtests/src/android/healthconnect/tests/permissions/GrantTimeIntegrationTest.java b/tests/integrationtests/src/android/healthconnect/tests/permissions/GrantTimeIntegrationTest.java
index 2c949bf..831568c 100644
--- a/tests/integrationtests/src/android/healthconnect/tests/permissions/GrantTimeIntegrationTest.java
+++ b/tests/integrationtests/src/android/healthconnect/tests/permissions/GrantTimeIntegrationTest.java
@@ -64,7 +64,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::areHealthPermissionsSupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/integrationtests/src/android/healthconnect/tests/permissions/HealthConnectWithManagePermissionsTest.java b/tests/integrationtests/src/android/healthconnect/tests/permissions/HealthConnectWithManagePermissionsTest.java
index 18db64b..5618218 100644
--- a/tests/integrationtests/src/android/healthconnect/tests/permissions/HealthConnectWithManagePermissionsTest.java
+++ b/tests/integrationtests/src/android/healthconnect/tests/permissions/HealthConnectWithManagePermissionsTest.java
@@ -26,6 +26,8 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
 
 import android.Manifest;
 import android.content.Context;
@@ -40,6 +42,8 @@
 import androidx.test.InstrumentationRegistry;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
+import com.android.compatibility.common.util.FeatureUtil;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -84,12 +88,15 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::areHealthPermissionsSupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
         mContext = InstrumentationRegistry.getTargetContext();
-        mHealthConnectManager = mContext.getSystemService(HealthConnectManager.class);
+        mHealthConnectManager = runWithShellPermissionIdentity(
+                    () -> mContext.getSystemService(HealthConnectManager.class),
+                    MANAGE_HEALTH_PERMISSIONS);
 
         revokePermissionViaPackageManager(DEFAULT_APP_PACKAGE, DEFAULT_PERM);
         revokePermissionViaPackageManager(DEFAULT_APP_PACKAGE, DEFAULT_PERM_2);
@@ -97,12 +104,12 @@
         resetPermissionFlags(DEFAULT_APP_PACKAGE, DEFAULT_PERM_2);
         assertPermNotGrantedForApp(DEFAULT_APP_PACKAGE, DEFAULT_PERM);
         assertPermNotGrantedForApp(DEFAULT_APP_PACKAGE, DEFAULT_PERM_2);
-        deleteAllStagedRemoteData();
+        deleteAllStagedRemoteData(mHealthConnectManager);
     }
 
     @After
     public void tearDown() {
-        deleteAllStagedRemoteData();
+        deleteAllStagedRemoteData(mHealthConnectManager);
     }
 
     @Test
@@ -146,13 +153,22 @@
     }
 
     @Test(expected = SecurityException.class)
-    public void testGrantHealthPermission_usageIntentNotSupported_throwsIllegalArgumentException()
+    public void testGrantHealthPermission_usageIntentNotSupported_nonWatch_throwsIllegalArgumentException()
             throws Exception {
+        assumeFalse(FeatureUtil.isWatch());
         grantHealthPermission(NO_USAGE_INTENT_APP_PACKAGE, DEFAULT_PERM);
         fail("Expected SecurityException due to undeclared health permissions usage intent.");
     }
 
     @Test
+    public void testGrantHealthPermission_usageIntentNotSupported_watch_succeeds()
+            throws Exception {
+        assumeTrue(FeatureUtil.isWatch());
+        grantHealthPermission(NO_USAGE_INTENT_APP_PACKAGE, DEFAULT_PERM);
+        assertPermGrantedForApp(NO_USAGE_INTENT_APP_PACKAGE, DEFAULT_PERM);
+    }
+
+    @Test
     public void testGrantHealthPermission_permissionAlreadyGranted_success() throws Exception {
         grantHealthPermission(DEFAULT_APP_PACKAGE, DEFAULT_PERM);
         assertPermGrantedForApp(DEFAULT_APP_PACKAGE, DEFAULT_PERM);
@@ -553,6 +569,7 @@
 
     @Test
     public void testPermissionApis_migrationInProgress_apisBlocked() throws Exception {
+        assumeTrue(TestUtils.isHealthConnectFullySupported());
         runWithShellPermissionIdentity(
                 IntegrationTestUtils::startMigration,
                 Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA);
@@ -566,7 +583,7 @@
             assertNotNull(exception);
         }
         assertPermNotGrantedForApp(DEFAULT_APP_PACKAGE, DEFAULT_PERM);
-        deleteAllStagedRemoteData();
+        deleteAllStagedRemoteData(mHealthConnectManager);
 
         // Revoke permission
         runWithShellPermissionIdentity(
diff --git a/tests/integrationtests/src/android/healthconnect/tests/permissions/HealthConnectWithoutManagePermissionsTest.java b/tests/integrationtests/src/android/healthconnect/tests/permissions/HealthConnectWithoutManagePermissionsTest.java
index 020b417..d326fc1 100644
--- a/tests/integrationtests/src/android/healthconnect/tests/permissions/HealthConnectWithoutManagePermissionsTest.java
+++ b/tests/integrationtests/src/android/healthconnect/tests/permissions/HealthConnectWithoutManagePermissionsTest.java
@@ -56,7 +56,8 @@
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::areHealthPermissionsSupported,
+                    "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
diff --git a/tests/unittests/Android.bp b/tests/unittests/Android.bp
index 3df81c8..a9c4a5c 100644
--- a/tests/unittests/Android.bp
+++ b/tests/unittests/Android.bp
@@ -34,6 +34,12 @@
         "mts-target-sdk-version-current",
         "modules-utils-testable-device-config-defaults",
     ],
+    // This needs to be added to the unit tests as this build change is guarded by a build system
+    // flag (soong_config_bool_variable "phr_fhir_validation"), which is part of the PHR FHIR
+    // structural validation feature.
+    java_resources: [
+        ":generate-fhir-spec-r4-binarypb",
+    ],
     static_libs: [
         "TestParameterInjector",
         "service-healthfitness.impl",
@@ -47,8 +53,8 @@
         "services.core",
         "androidx.test.ext.truth",
         "cts-healthconnect-utils",
+        "cts-healthconnect-phr-lib",
         "flag-junit",
-        "truth-java8-extension",
         "platform-parametric-runner-lib",
         "framework-annotations-lib",
     ],
diff --git a/tests/unittests/AndroidManifest.xml b/tests/unittests/AndroidManifest.xml
index 8ae3c62..331da3a 100644
--- a/tests/unittests/AndroidManifest.xml
+++ b/tests/unittests/AndroidManifest.xml
@@ -23,6 +23,14 @@
     <!-- The application has to be debuggable for static mocking to work. -->
     <application android:debuggable="true">
         <uses-library android:name="android.test.runner"/>
+        <activity android:name=".EmptyActivity"
+            android:label="EmptyActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
+                <category android:name="android.intent.category.HEALTH_PERMISSIONS"/>
+            </intent-filter>
+        </activity>
     </application>
 
     <!-- To get visibility of the app with health permissions definitions,
@@ -31,7 +39,6 @@
         android:name="androidx.test.runner.AndroidJUnitRunner"
         android:label="HealthConnect Unit Tests"
         android:targetPackage="com.android.healthconnect.unittests"/>
-    <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
 
     <uses-permission android:name="android.permission.health.READ_STEPS"/>
 </manifest>
\ No newline at end of file
diff --git a/tests/unittests/src/android/health/connect/HealthConnectManagerTest.java b/tests/unittests/src/android/health/connect/HealthConnectManagerTest.java
index 551cbc4..4625074 100644
--- a/tests/unittests/src/android/health/connect/HealthConnectManagerTest.java
+++ b/tests/unittests/src/android/health/connect/HealthConnectManagerTest.java
@@ -16,7 +16,8 @@
 
 package android.health.connect;
 
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResourceId;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResourceId;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -31,7 +32,7 @@
 import android.health.connect.aidl.IHealthConnectService;
 import android.health.connect.aidl.IMedicalDataSourcesResponseCallback;
 import android.health.connect.datatypes.MedicalDataSource;
-import android.healthconnect.cts.utils.PhrDataFactory;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
 import android.os.OutcomeReceiver;
 import android.os.RemoteException;
 
@@ -303,7 +304,7 @@
                 .when(mService)
                 .deleteMedicalResourcesByRequest(any(), any(), any());
         DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
 
         healthConnectManager.deleteMedicalResources(
                 request, Executors.newSingleThreadExecutor(), receiver);
@@ -328,7 +329,7 @@
                 .when(mService)
                 .deleteMedicalResourcesByRequest(any(), any(), any());
         DeleteMedicalResourcesRequest request =
-                new DeleteMedicalResourcesRequest.Builder().addDataSourceId("foo").build();
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
 
         healthConnectManager.deleteMedicalResources(
                 request, Executors.newSingleThreadExecutor(), receiver);
diff --git a/tests/unittests/src/android/health/connect/HealthPermissionsTest.java b/tests/unittests/src/android/health/connect/HealthPermissionsTest.java
index 0557d2e..c913d41 100644
--- a/tests/unittests/src/android/health/connect/HealthPermissionsTest.java
+++ b/tests/unittests/src/android/health/connect/HealthPermissionsTest.java
@@ -16,20 +16,24 @@
 
 package android.health.connect;
 
-import static android.health.connect.HealthPermissions.HEALTH_PERMISSION_GROUP;
 import static android.health.connect.HealthPermissions.READ_EXERCISE_ROUTE;
-import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE;
-import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_CONDITIONS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PREGNANCY;
-import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PROBLEMS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PROCEDURES;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VISITS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS;
 import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.health.connect.HealthPermissions.isValidHealthPermission;
 
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
@@ -46,6 +50,8 @@
 import androidx.test.InstrumentationRegistry;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
+import com.android.healthfitness.flags.Flags;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -55,6 +61,8 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @RunWith(AndroidJUnit4.class)
 public class HealthPermissionsTest {
@@ -73,97 +81,107 @@
     // {@link android.healthconnect.cts.HealthPermissionsPresenceTest.HEALTH_PERMISSIONS}
     // sets.
     private static final Set<String> ALL_EXPECTED_HEALTH_PERMISSIONS =
-            Set.of(
-                    HealthPermissions.READ_HEALTH_DATA_HISTORY,
-                    HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND,
-                    HealthPermissions.READ_ACTIVE_CALORIES_BURNED,
-                    HealthPermissions.READ_DISTANCE,
-                    HealthPermissions.READ_ELEVATION_GAINED,
-                    HealthPermissions.READ_EXERCISE,
-                    HealthPermissions.READ_EXERCISE_ROUTES,
-                    HealthPermissions.READ_PLANNED_EXERCISE,
-                    HealthPermissions.READ_FLOORS_CLIMBED,
-                    HealthPermissions.READ_STEPS,
-                    HealthPermissions.READ_TOTAL_CALORIES_BURNED,
-                    HealthPermissions.READ_VO2_MAX,
-                    HealthPermissions.READ_WHEELCHAIR_PUSHES,
-                    HealthPermissions.READ_POWER,
-                    HealthPermissions.READ_SPEED,
-                    HealthPermissions.READ_BASAL_METABOLIC_RATE,
-                    HealthPermissions.READ_BODY_FAT,
-                    HealthPermissions.READ_BODY_WATER_MASS,
-                    HealthPermissions.READ_BONE_MASS,
-                    HealthPermissions.READ_HEIGHT,
-                    HealthPermissions.READ_LEAN_BODY_MASS,
-                    HealthPermissions.READ_WEIGHT,
-                    HealthPermissions.READ_CERVICAL_MUCUS,
-                    HealthPermissions.READ_INTERMENSTRUAL_BLEEDING,
-                    HealthPermissions.READ_MENSTRUATION,
-                    HealthPermissions.READ_OVULATION_TEST,
-                    HealthPermissions.READ_SEXUAL_ACTIVITY,
-                    HealthPermissions.READ_HYDRATION,
-                    HealthPermissions.READ_NUTRITION,
-                    HealthPermissions.READ_SLEEP,
-                    HealthPermissions.READ_BASAL_BODY_TEMPERATURE,
-                    HealthPermissions.READ_BLOOD_GLUCOSE,
-                    HealthPermissions.READ_BLOOD_PRESSURE,
-                    HealthPermissions.READ_BODY_TEMPERATURE,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.READ_HEART_RATE_VARIABILITY,
-                    HealthPermissions.READ_OXYGEN_SATURATION,
-                    HealthPermissions.READ_RESPIRATORY_RATE,
-                    HealthPermissions.READ_RESTING_HEART_RATE,
-                    HealthPermissions.READ_SKIN_TEMPERATURE,
-                    HealthPermissions.READ_MINDFULNESS,
-                    HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE,
-                    HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION,
-                    HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS,
-                    HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS,
-                    HealthPermissions.READ_MEDICAL_DATA_PREGNANCY,
-                    HealthPermissions.READ_MEDICAL_DATA_PROBLEMS,
-                    HealthPermissions.READ_MEDICAL_DATA_PROCEDURES,
-                    HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY,
-                    HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS,
-                    HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED,
-                    HealthPermissions.WRITE_DISTANCE,
-                    HealthPermissions.WRITE_ELEVATION_GAINED,
-                    HealthPermissions.WRITE_EXERCISE,
-                    HealthPermissions.WRITE_EXERCISE_ROUTE,
-                    HealthPermissions.WRITE_PLANNED_EXERCISE,
-                    HealthPermissions.WRITE_FLOORS_CLIMBED,
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.WRITE_TOTAL_CALORIES_BURNED,
-                    HealthPermissions.WRITE_VO2_MAX,
-                    HealthPermissions.WRITE_WHEELCHAIR_PUSHES,
-                    HealthPermissions.WRITE_POWER,
-                    HealthPermissions.WRITE_SPEED,
-                    HealthPermissions.WRITE_BASAL_METABOLIC_RATE,
-                    HealthPermissions.WRITE_BODY_FAT,
-                    HealthPermissions.WRITE_BODY_WATER_MASS,
-                    HealthPermissions.WRITE_BONE_MASS,
-                    HealthPermissions.WRITE_HEIGHT,
-                    HealthPermissions.WRITE_LEAN_BODY_MASS,
-                    HealthPermissions.WRITE_WEIGHT,
-                    HealthPermissions.WRITE_CERVICAL_MUCUS,
-                    HealthPermissions.WRITE_INTERMENSTRUAL_BLEEDING,
-                    HealthPermissions.WRITE_MENSTRUATION,
-                    HealthPermissions.WRITE_OVULATION_TEST,
-                    HealthPermissions.WRITE_SEXUAL_ACTIVITY,
-                    HealthPermissions.WRITE_HYDRATION,
-                    HealthPermissions.WRITE_NUTRITION,
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_BASAL_BODY_TEMPERATURE,
-                    HealthPermissions.WRITE_BLOOD_GLUCOSE,
-                    HealthPermissions.WRITE_BLOOD_PRESSURE,
-                    HealthPermissions.WRITE_BODY_TEMPERATURE,
-                    HealthPermissions.WRITE_HEART_RATE,
-                    HealthPermissions.WRITE_HEART_RATE_VARIABILITY,
-                    HealthPermissions.WRITE_OXYGEN_SATURATION,
-                    HealthPermissions.WRITE_RESPIRATORY_RATE,
-                    HealthPermissions.WRITE_RESTING_HEART_RATE,
-                    HealthPermissions.WRITE_SKIN_TEMPERATURE,
-                    HealthPermissions.WRITE_MINDFULNESS,
-                    HealthPermissions.WRITE_MEDICAL_DATA);
+            Stream.concat(
+                            Stream.of(
+                                    HealthPermissions.READ_HEALTH_DATA_HISTORY,
+                                    HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND,
+                                    HealthPermissions.READ_ACTIVE_CALORIES_BURNED,
+                                    HealthPermissions.READ_DISTANCE,
+                                    HealthPermissions.READ_ELEVATION_GAINED,
+                                    HealthPermissions.READ_EXERCISE,
+                                    HealthPermissions.READ_EXERCISE_ROUTES,
+                                    HealthPermissions.READ_PLANNED_EXERCISE,
+                                    HealthPermissions.READ_FLOORS_CLIMBED,
+                                    HealthPermissions.READ_STEPS,
+                                    HealthPermissions.READ_TOTAL_CALORIES_BURNED,
+                                    HealthPermissions.READ_VO2_MAX,
+                                    HealthPermissions.READ_WHEELCHAIR_PUSHES,
+                                    HealthPermissions.READ_POWER,
+                                    HealthPermissions.READ_SPEED,
+                                    HealthPermissions.READ_BASAL_METABOLIC_RATE,
+                                    HealthPermissions.READ_BODY_FAT,
+                                    HealthPermissions.READ_BODY_WATER_MASS,
+                                    HealthPermissions.READ_BONE_MASS,
+                                    HealthPermissions.READ_HEIGHT,
+                                    HealthPermissions.READ_LEAN_BODY_MASS,
+                                    HealthPermissions.READ_WEIGHT,
+                                    HealthPermissions.READ_CERVICAL_MUCUS,
+                                    HealthPermissions.READ_INTERMENSTRUAL_BLEEDING,
+                                    HealthPermissions.READ_MENSTRUATION,
+                                    HealthPermissions.READ_OVULATION_TEST,
+                                    HealthPermissions.READ_SEXUAL_ACTIVITY,
+                                    HealthPermissions.READ_HYDRATION,
+                                    HealthPermissions.READ_NUTRITION,
+                                    HealthPermissions.READ_SLEEP,
+                                    HealthPermissions.READ_BASAL_BODY_TEMPERATURE,
+                                    HealthPermissions.READ_BLOOD_GLUCOSE,
+                                    HealthPermissions.READ_BLOOD_PRESSURE,
+                                    HealthPermissions.READ_BODY_TEMPERATURE,
+                                    HealthPermissions.READ_HEART_RATE,
+                                    HealthPermissions.READ_HEART_RATE_VARIABILITY,
+                                    HealthPermissions.READ_OXYGEN_SATURATION,
+                                    HealthPermissions.READ_RESPIRATORY_RATE,
+                                    HealthPermissions.READ_RESTING_HEART_RATE,
+                                    HealthPermissions.READ_SKIN_TEMPERATURE,
+                                    HealthPermissions.READ_MINDFULNESS,
+                                    HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                                    HealthPermissions.READ_MEDICAL_DATA_CONDITIONS,
+                                    HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS,
+                                    HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS,
+                                    HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS,
+                                    HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS,
+                                    HealthPermissions.READ_MEDICAL_DATA_PREGNANCY,
+                                    HealthPermissions.READ_MEDICAL_DATA_PROCEDURES,
+                                    HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY,
+                                    HealthPermissions.READ_MEDICAL_DATA_VACCINES,
+                                    HealthPermissions.READ_MEDICAL_DATA_VISITS,
+                                    HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS,
+                                    HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED,
+                                    HealthPermissions.WRITE_DISTANCE,
+                                    HealthPermissions.WRITE_ELEVATION_GAINED,
+                                    HealthPermissions.WRITE_EXERCISE,
+                                    HealthPermissions.WRITE_EXERCISE_ROUTE,
+                                    HealthPermissions.WRITE_PLANNED_EXERCISE,
+                                    HealthPermissions.WRITE_FLOORS_CLIMBED,
+                                    HealthPermissions.WRITE_STEPS,
+                                    HealthPermissions.WRITE_TOTAL_CALORIES_BURNED,
+                                    HealthPermissions.WRITE_VO2_MAX,
+                                    HealthPermissions.WRITE_WHEELCHAIR_PUSHES,
+                                    HealthPermissions.WRITE_POWER,
+                                    HealthPermissions.WRITE_SPEED,
+                                    HealthPermissions.WRITE_BASAL_METABOLIC_RATE,
+                                    HealthPermissions.WRITE_BODY_FAT,
+                                    HealthPermissions.WRITE_BODY_WATER_MASS,
+                                    HealthPermissions.WRITE_BONE_MASS,
+                                    HealthPermissions.WRITE_HEIGHT,
+                                    HealthPermissions.WRITE_LEAN_BODY_MASS,
+                                    HealthPermissions.WRITE_WEIGHT,
+                                    HealthPermissions.WRITE_CERVICAL_MUCUS,
+                                    HealthPermissions.WRITE_INTERMENSTRUAL_BLEEDING,
+                                    HealthPermissions.WRITE_MENSTRUATION,
+                                    HealthPermissions.WRITE_OVULATION_TEST,
+                                    HealthPermissions.WRITE_SEXUAL_ACTIVITY,
+                                    HealthPermissions.WRITE_HYDRATION,
+                                    HealthPermissions.WRITE_NUTRITION,
+                                    HealthPermissions.WRITE_SLEEP,
+                                    HealthPermissions.WRITE_BASAL_BODY_TEMPERATURE,
+                                    HealthPermissions.WRITE_BLOOD_GLUCOSE,
+                                    HealthPermissions.WRITE_BLOOD_PRESSURE,
+                                    HealthPermissions.WRITE_BODY_TEMPERATURE,
+                                    HealthPermissions.WRITE_HEART_RATE,
+                                    HealthPermissions.WRITE_HEART_RATE_VARIABILITY,
+                                    HealthPermissions.WRITE_OXYGEN_SATURATION,
+                                    HealthPermissions.WRITE_RESPIRATORY_RATE,
+                                    HealthPermissions.WRITE_RESTING_HEART_RATE,
+                                    HealthPermissions.WRITE_SKIN_TEMPERATURE,
+                                    HealthPermissions.WRITE_MINDFULNESS,
+                                    HealthPermissions.WRITE_MEDICAL_DATA),
+                            Flags.activityIntensity()
+                                    ? Stream.of(
+                                            HealthPermissions.READ_ACTIVITY_INTENSITY,
+                                            HealthPermissions.WRITE_ACTIVITY_INTENSITY)
+                                    : Stream.of())
+                    .collect(Collectors.toSet());
     private PackageManager mPackageManager;
     private Context mContext;
     @Mock private PackageInfo mPackageInfo1;
@@ -292,25 +310,28 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalPermissions_returnsValidPermissions() {
         Set<String> permissions = HealthPermissions.getAllMedicalPermissions();
         assertThat(permissions)
                 .containsAtLeast(
                         WRITE_MEDICAL_DATA,
-                        READ_MEDICAL_DATA_ALLERGY_INTOLERANCE,
-                        READ_MEDICAL_DATA_IMMUNIZATION,
+                        READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
+                        READ_MEDICAL_DATA_CONDITIONS,
                         READ_MEDICAL_DATA_LABORATORY_RESULTS,
                         READ_MEDICAL_DATA_MEDICATIONS,
+                        READ_MEDICAL_DATA_PERSONAL_DETAILS,
+                        READ_MEDICAL_DATA_PRACTITIONER_DETAILS,
                         READ_MEDICAL_DATA_PREGNANCY,
-                        READ_MEDICAL_DATA_PROBLEMS,
                         READ_MEDICAL_DATA_PROCEDURES,
                         READ_MEDICAL_DATA_SOCIAL_HISTORY,
+                        READ_MEDICAL_DATA_VACCINES,
+                        READ_MEDICAL_DATA_VISITS,
                         READ_MEDICAL_DATA_VITAL_SIGNS);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalPermissions_returnsAllMedicalPermissions() throws Exception {
         Set<String> permissions = HealthPermissions.getAllMedicalPermissions();
 
@@ -323,10 +344,6 @@
         }
     }
 
-    private boolean isValidHealthPermission(PermissionInfo permissionInfo) {
-        return permissionInfo.group != null && permissionInfo.group.equals(HEALTH_PERMISSION_GROUP);
-    }
-
     private PermissionInfo[] getHealthPermissionInfos() throws Exception {
         String healthControllerPackageName = getControllerUiPackageName();
 
diff --git a/tests/unittests/src/android/health/connect/RateLimiterTest.java b/tests/unittests/src/android/health/connect/RateLimiterTest.java
index ab096e0..18d39fd 100644
--- a/tests/unittests/src/android/health/connect/RateLimiterTest.java
+++ b/tests/unittests/src/android/health/connect/RateLimiterTest.java
@@ -18,24 +18,14 @@
 
 import static org.hamcrest.CoreMatchers.containsString;
 
-import android.Manifest;
-import android.app.UiAutomation;
-import android.content.Context;
 import android.health.connect.ratelimiter.RateLimiter;
 import android.health.connect.ratelimiter.RateLimiter.QuotaCategory;
 
-import androidx.test.platform.app.InstrumentationRegistry;
-
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-import com.android.server.healthconnect.TestUtils;
 
-import org.junit.After;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
 import java.time.Duration;
@@ -50,40 +40,12 @@
     private static final Duration WINDOW_15M = Duration.ofMinutes(15);
     private static final int MEMORY_COST = 20000;
 
-    private static final UiAutomation UI_AUTOMATION =
-            InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
     @Rule public ExpectedException exception = ExpectedException.none();
 
     @Rule
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this).setStrictness(Strictness.LENIENT).build();
 
-    @Mock Context mContext;
-
-    @Before
-    public void setUp() {
-        TestUtils.runWithShellPermissionIdentity(
-                () -> {
-                    HealthConnectDeviceConfigManager.initializeInstance(mContext);
-                    HealthConnectDeviceConfigManager.getInitialisedInstance()
-                            .updateRateLimiterValues();
-                },
-                Manifest.permission.READ_DEVICE_CONFIG);
-        RateLimiter.updateEnableRateLimiterFlag(true);
-    }
-
-    @After
-    public void tearDown() {
-        TestUtils.runWithShellPermissionIdentity(
-                () -> {
-                    HealthConnectDeviceConfigManager.initializeInstance(mContext);
-                    HealthConnectDeviceConfigManager.getInitialisedInstance()
-                            .updateRateLimiterValues();
-                },
-                Manifest.permission.READ_DEVICE_CONFIG);
-    }
-
     @Test
     public void testTryAcquireApiCallQuota_invalidQuotaCategory() {
         RateLimiter.clearCache();
diff --git a/tests/unittests/src/android/healthconnect/CreateMedicalDataSourceRequestTest.java b/tests/unittests/src/android/healthconnect/CreateMedicalDataSourceRequestTest.java
index 690fe06..2639630 100644
--- a/tests/unittests/src/android/healthconnect/CreateMedicalDataSourceRequestTest.java
+++ b/tests/unittests/src/android/healthconnect/CreateMedicalDataSourceRequestTest.java
@@ -16,8 +16,9 @@
 
 package android.healthconnect;
 
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_VERSION;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -33,7 +34,9 @@
     public void testCreateMedicalDataSourceRequest_getDataSize() {
         CreateMedicalDataSourceRequest original =
                 new CreateMedicalDataSourceRequest.Builder(
-                                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_FHIR_BASE_URI,
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
 
         Parcel parcel = Parcel.obtain();
diff --git a/tests/unittests/src/android/healthconnect/aidl/MedicalResourceListParcelTest.java b/tests/unittests/src/android/healthconnect/aidl/MedicalResourceListParcelTest.java
new file mode 100644
index 0000000..16d5945
--- /dev/null
+++ b/tests/unittests/src/android/healthconnect/aidl/MedicalResourceListParcelTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.healthconnect.aidl;
+
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createAllergyMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createVaccineMedicalResource;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.aidl.MedicalResourceListParcel;
+import android.health.connect.datatypes.MedicalResource;
+import android.os.Parcel;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import com.android.healthfitness.flags.Flags;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.util.List;
+
+@RequiresFlagsEnabled(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+public class MedicalResourceListParcelTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Test
+    public void testMedicalResourceListParcel_successfulCreateAndGet() {
+        List<MedicalResource> resources =
+                List.of(
+                        createAllergyMedicalResource(DATA_SOURCE_ID),
+                        createVaccineMedicalResource(DATA_SOURCE_ID));
+
+        MedicalResourceListParcel medicalResourceListParcel =
+                new MedicalResourceListParcel(resources);
+
+        assertThat(medicalResourceListParcel.getMedicalResources())
+                .containsExactlyElementsIn(resources);
+    }
+
+    @Test
+    public void testMedicalResourceListParcel_nullRequests_throws() {
+        assertThrows(NullPointerException.class, () -> new MedicalResourceListParcel(null));
+    }
+
+    @Test
+    public void testMedicalResourceListParcelWriteToParcelThenRestore_propertiesAreIdentical() {
+        List<MedicalResource> resources =
+                List.of(
+                        createAllergyMedicalResource(DATA_SOURCE_ID),
+                        createVaccineMedicalResource(DATA_SOURCE_ID));
+        MedicalResourceListParcel original = new MedicalResourceListParcel(resources);
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        MedicalResourceListParcel restoredParcel =
+                MedicalResourceListParcel.CREATOR.createFromParcel(parcel);
+
+        assertThat(restoredParcel.getMedicalResources()).isEqualTo(resources);
+        parcel.recycle();
+    }
+}
diff --git a/tests/unittests/src/android/healthconnect/aidl/ReadMedicalResourcesRequestParcelTest.java b/tests/unittests/src/android/healthconnect/aidl/ReadMedicalResourcesRequestParcelTest.java
index cc8ac9f..dbe0433 100644
--- a/tests/unittests/src/android/healthconnect/aidl/ReadMedicalResourcesRequestParcelTest.java
+++ b/tests/unittests/src/android/healthconnect/aidl/ReadMedicalResourcesRequestParcelTest.java
@@ -17,11 +17,10 @@
 
 import static android.health.connect.Constants.MAXIMUM_PAGE_SIZE;
 import static android.health.connect.Constants.MINIMUM_PAGE_SIZE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.PAGE_TOKEN;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.PAGE_TOKEN;
 import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -42,7 +41,7 @@
     @Test
     public void testWriteInitialRequestToParcelThenRestore_propertiesAreIdentical() {
         ReadMedicalResourcesInitialRequest original =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .setPageSize(100)
@@ -55,7 +54,7 @@
                 ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel);
 
         assertThat(restoredParcel.getMedicalResourceType())
-                .isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                .isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
         assertThat(restoredParcel.getDataSourceIds())
                 .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
         assertThat(restoredParcel.getPageToken()).isNull();
@@ -74,18 +73,33 @@
         ReadMedicalResourcesRequestParcel restoredParcel =
                 ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel);
 
-        assertThat(restoredParcel.getMedicalResourceType())
-                .isEqualTo(MEDICAL_RESOURCE_TYPE_UNKNOWN);
+        assertThat(restoredParcel.getMedicalResourceType()).isEqualTo(0);
         assertThat(restoredParcel.getDataSourceIds()).isEmpty();
         assertThat(restoredParcel.getPageToken()).isEqualTo(PAGE_TOKEN);
         assertThat(restoredParcel.getPageSize()).isEqualTo(100);
     }
 
     @Test
+    public void testRestoreInvalidPageRequestFromParcel_nullPageToken_expectException()
+            throws NoSuchFieldException, IllegalAccessException {
+        ReadMedicalResourcesPageRequest original =
+                new ReadMedicalResourcesPageRequest.Builder(PAGE_TOKEN).setPageSize(100).build();
+        setFieldValueUsingReflection(original, "mPageToken", null);
+
+        Parcel parcel = Parcel.obtain();
+        original.toParcel().writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel));
+    }
+
+    @Test
     public void testRestoreInvalidMedicalResourceTypeFromParcel_expectException()
             throws NoSuchFieldException, IllegalAccessException {
         ReadMedicalResourcesRequestParcel original =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .setPageSize(100)
@@ -106,7 +120,7 @@
     public void testRestoreInvalidDataSourceIdFromParcel_expectException()
             throws NoSuchFieldException, IllegalAccessException {
         ReadMedicalResourcesRequestParcel original =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .setPageSize(100)
@@ -127,7 +141,7 @@
     public void testRestoreTooSmallPageSizeFromParcel_expectException()
             throws NoSuchFieldException, IllegalAccessException {
         ReadMedicalResourcesRequestParcel original =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .setPageSize(100)
@@ -148,7 +162,7 @@
     public void testRestoreTooLargePageSizeFromParcel_expectException()
             throws NoSuchFieldException, IllegalAccessException {
         ReadMedicalResourcesRequestParcel original =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .setPageSize(100)
diff --git a/tests/unittests/src/android/healthconnect/aidl/UpsertMedicalResourceRequestsParcelTest.java b/tests/unittests/src/android/healthconnect/aidl/UpsertMedicalResourceRequestsParcelTest.java
new file mode 100644
index 0000000..7277b4d
--- /dev/null
+++ b/tests/unittests/src/android/healthconnect/aidl/UpsertMedicalResourceRequestsParcelTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.aidl;
+
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.UpsertMedicalResourceRequest;
+import android.health.connect.aidl.UpsertMedicalResourceRequestsParcel;
+import android.os.Parcel;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import com.android.healthfitness.flags.Flags;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.util.List;
+
+@RequiresFlagsEnabled(Flags.FLAG_PERSONAL_HEALTH_RECORD)
+public class UpsertMedicalResourceRequestsParcelTest {
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Test
+    public void testUpsertMedicalResourceRequestsParcel_successfulCreateAndGet() {
+        UpsertMedicalResourceRequest request1 =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_ALLERGY)
+                        .build();
+        UpsertMedicalResourceRequest request2 =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+
+        UpsertMedicalResourceRequestsParcel requestsParcel =
+                new UpsertMedicalResourceRequestsParcel(List.of(request1, request2));
+
+        assertThat(requestsParcel.getUpsertRequests()).containsExactly(request1, request2);
+    }
+
+    @Test
+    public void testUpsertMedicalResourceRequestsParcel_nullRequests_throws() {
+        assertThrows(
+                NullPointerException.class, () -> new UpsertMedicalResourceRequestsParcel(null));
+    }
+
+    @Test
+    public void
+            testUpsertMedicalResourceRequestsParcel_writeToParcelThenRestore_propertiesIdentical() {
+        UpsertMedicalResourceRequest request1 =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_ALLERGY)
+                        .build();
+        UpsertMedicalResourceRequest request2 =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+        UpsertMedicalResourceRequestsParcel original =
+                new UpsertMedicalResourceRequestsParcel(List.of(request1, request2));
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        UpsertMedicalResourceRequestsParcel restoredParcel =
+                UpsertMedicalResourceRequestsParcel.CREATOR.createFromParcel(parcel);
+
+        assertThat(restoredParcel.getUpsertRequests()).containsExactly(request1, request2);
+        parcel.recycle();
+    }
+}
diff --git a/tests/unittests/src/android/healthconnect/backuprestore/BackupChangeTest.java b/tests/unittests/src/android/healthconnect/backuprestore/BackupChangeTest.java
new file mode 100644
index 0000000..481d0b0
--- /dev/null
+++ b/tests/unittests/src/android/healthconnect/backuprestore/BackupChangeTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.backuprestore;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.health.connect.backuprestore.BackupChange;
+import android.os.Parcel;
+
+import org.junit.Test;
+
+public class BackupChangeTest {
+
+    @Test
+    public void upsertionChangeParcel_propertiesAreIdentical() {
+        BackupChange original = new BackupChange("uid123", 123, false, new byte[] {1, 2, 3});
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        BackupChange restoredParcel = BackupChange.CREATOR.createFromParcel(parcel);
+
+        assertThat(restoredParcel.getUid()).isEqualTo("uid123");
+        assertThat(restoredParcel.getVersion()).isEqualTo(123);
+        assertThat(restoredParcel.isDeletion()).isFalse();
+        assertThat(restoredParcel.getData()).isEqualTo(new byte[] {1, 2, 3});
+        parcel.recycle();
+    }
+
+    @Test
+    public void deletionChangeParcel_propertiesAreIdentical() {
+        BackupChange original = new BackupChange("uid123", 123, true, null);
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        BackupChange restoredParcel = BackupChange.CREATOR.createFromParcel(parcel);
+
+        assertThat(restoredParcel.getUid()).isEqualTo("uid123");
+        assertThat(restoredParcel.getVersion()).isEqualTo(123);
+        assertThat(restoredParcel.isDeletion()).isTrue();
+        assertThat(restoredParcel.getData()).isNull();
+        parcel.recycle();
+    }
+}
diff --git a/tests/unittests/src/android/healthconnect/backuprestore/BackupSettingsTest.java b/tests/unittests/src/android/healthconnect/backuprestore/BackupSettingsTest.java
new file mode 100644
index 0000000..658ef63
--- /dev/null
+++ b/tests/unittests/src/android/healthconnect/backuprestore/BackupSettingsTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.backuprestore;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.health.connect.backuprestore.BackupSettings;
+import android.os.Parcel;
+
+import org.junit.Test;
+
+public class BackupSettingsTest {
+
+    @Test
+    public void backupSettingsParcel_propertiesAreIdentical() {
+        BackupSettings original = new BackupSettings(123, new byte[] {1, 2, 3});
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        BackupSettings restoredParcel = BackupSettings.CREATOR.createFromParcel(parcel);
+
+        assertThat(restoredParcel.getVersion()).isEqualTo(123);
+        assertThat(restoredParcel.getData()).isEqualTo(new byte[] {1, 2, 3});
+        parcel.recycle();
+    }
+}
diff --git a/tests/unittests/src/android/healthconnect/backuprestore/GetChangesForBackupResponseTest.java b/tests/unittests/src/android/healthconnect/backuprestore/GetChangesForBackupResponseTest.java
new file mode 100644
index 0000000..d6e70e4
--- /dev/null
+++ b/tests/unittests/src/android/healthconnect/backuprestore/GetChangesForBackupResponseTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.backuprestore;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.health.connect.backuprestore.BackupChange;
+import android.health.connect.backuprestore.GetChangesForBackupResponse;
+import android.os.Parcel;
+
+import org.junit.Test;
+
+import java.util.List;
+
+public class GetChangesForBackupResponseTest {
+
+    @Test
+    public void getChangesForBackupResponseParcel_propertiesAreIdentical() {
+        GetChangesForBackupResponse original =
+                new GetChangesForBackupResponse(
+                        List.of(
+                                new BackupChange("uid123", 123, false, new byte[] {1, 2, 3}),
+                                new BackupChange("uid234", 234, false, new byte[] {2, 3, 4}),
+                                new BackupChange("uid345", 345, false, new byte[] {3, 4, 5})),
+                        "changeToken");
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        GetChangesForBackupResponse restoredParcel =
+                GetChangesForBackupResponse.CREATOR.createFromParcel(parcel);
+
+        assertThat(restoredParcel.getChanges())
+                .containsExactly(
+                        new BackupChange("uid123", 123, false, new byte[] {1, 2, 3}),
+                        new BackupChange("uid234", 234, false, new byte[] {2, 3, 4}),
+                        new BackupChange("uid345", 345, false, new byte[] {3, 4, 5}))
+                .inOrder();
+        assertThat(restoredParcel.getNextChangeToken()).isEqualTo("changeToken");
+        parcel.recycle();
+    }
+}
diff --git a/tests/unittests/src/android/healthconnect/backuprestore/GetSettingsForBackupResponseTest.java b/tests/unittests/src/android/healthconnect/backuprestore/GetSettingsForBackupResponseTest.java
new file mode 100644
index 0000000..6b10e04
--- /dev/null
+++ b/tests/unittests/src/android/healthconnect/backuprestore/GetSettingsForBackupResponseTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.backuprestore;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.health.connect.backuprestore.BackupSettings;
+import android.health.connect.backuprestore.GetSettingsForBackupResponse;
+import android.os.Parcel;
+
+import org.junit.Test;
+
+public class GetSettingsForBackupResponseTest {
+
+    @Test
+    public void getSettingsForBackupResponseParcel_propertiesAreIdentical() {
+        GetSettingsForBackupResponse original =
+                new GetSettingsForBackupResponse(new BackupSettings(123, new byte[] {1, 2, 3}));
+
+        Parcel parcel = Parcel.obtain();
+        original.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        GetSettingsForBackupResponse restoredParcel =
+                GetSettingsForBackupResponse.CREATOR.createFromParcel(parcel);
+
+        assertThat(restoredParcel.getSettings())
+                .isEqualTo(new BackupSettings(123, new byte[] {1, 2, 3}));
+        parcel.recycle();
+    }
+}
diff --git a/tests/unittests/src/android/healthconnect/internal/datatypes/ActivityIntensityRecordInternalTest.java b/tests/unittests/src/android/healthconnect/internal/datatypes/ActivityIntensityRecordInternalTest.java
new file mode 100644
index 0000000..f25e7b0
--- /dev/null
+++ b/tests/unittests/src/android/healthconnect/internal/datatypes/ActivityIntensityRecordInternalTest.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.healthconnect.internal.datatypes;
+
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
+import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
+import static android.health.connect.datatypes.Device.DEVICE_TYPE_UNKNOWN;
+import static android.health.connect.datatypes.Device.DEVICE_TYPE_WATCH;
+import static android.health.connect.datatypes.Metadata.RECORDING_METHOD_AUTOMATICALLY_RECORDED;
+import static android.health.connect.datatypes.Metadata.RECORDING_METHOD_MANUAL_ENTRY;
+import static android.health.connect.datatypes.Metadata.RECORDING_METHOD_UNKNOWN;
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY;
+
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY;
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY_DB;
+import static com.android.healthfitness.flags.Flags.FLAG_HEALTH_CONNECT_MAPPINGS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.health.connect.datatypes.ActivityIntensityRecord;
+import android.health.connect.datatypes.DataOrigin;
+import android.health.connect.datatypes.Device;
+import android.health.connect.datatypes.Metadata;
+import android.health.connect.internal.datatypes.ActivityIntensityRecordInternal;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
+import android.os.Parcel;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.util.TimeZone;
+import java.util.UUID;
+
+@RequiresFlagsEnabled({
+    FLAG_ACTIVITY_INTENSITY,
+    FLAG_ACTIVITY_INTENSITY_DB,
+    FLAG_HEALTH_CONNECT_MAPPINGS
+})
+public class ActivityIntensityRecordInternalTest {
+
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Before
+    public void setUp() {
+        HealthConnectMappings.resetInstanceForTesting();
+    }
+
+    @Test
+    public void toExternalRecord_allFieldsSet() {
+        UUID uuid = UUID.randomUUID();
+        ActivityIntensityRecordInternal internalRecord =
+                (ActivityIntensityRecordInternal)
+                        new ActivityIntensityRecordInternal()
+                                .setActivityIntensityType(ACTIVITY_INTENSITY_TYPE_MODERATE)
+                                .setStartTime(1357924680)
+                                .setEndTime(2468013579L)
+                                .setStartZoneOffset(-2 * 3600)
+                                .setEndZoneOffset(3 * 3600)
+                                .setAppInfoId(123)
+                                .setAppName("app.name")
+                                .setClientRecordId("client-record-id")
+                                .setClientRecordVersion(567)
+                                .setDeviceInfoId(8)
+                                .setDeviceType(DEVICE_TYPE_WATCH)
+                                .setLastModifiedTime(9012345)
+                                .setManufacturer("manufacturer")
+                                .setModel("model")
+                                .setPackageName("package.name")
+                                .setRecordingMethod(RECORDING_METHOD_AUTOMATICALLY_RECORDED)
+                                .setRowId(468)
+                                .setUuid(uuid);
+
+        ActivityIntensityRecord externalRecord = internalRecord.toExternalRecord();
+
+        Metadata metadata = externalRecord.getMetadata();
+        assertThat(externalRecord.getRecordType()).isEqualTo(RECORD_TYPE_ACTIVITY_INTENSITY);
+        assertThat(externalRecord.getActivityIntensityType())
+                .isEqualTo(ACTIVITY_INTENSITY_TYPE_MODERATE);
+        assertThat(externalRecord.getStartTime()).isEqualTo(Instant.ofEpochMilli(1357924680));
+        assertThat(externalRecord.getEndTime()).isEqualTo(Instant.ofEpochMilli(2468013579L));
+        assertThat(externalRecord.getStartZoneOffset()).isEqualTo(ZoneOffset.ofHours(-2));
+        assertThat(externalRecord.getEndZoneOffset()).isEqualTo(ZoneOffset.ofHours(3));
+        assertThat(metadata.getClientRecordId()).isEqualTo("client-record-id");
+        assertThat(metadata.getClientRecordVersion()).isEqualTo(567);
+        assertThat(metadata.getDataOrigin().getPackageName()).isEqualTo("package.name");
+        assertThat(metadata.getDevice().getType()).isEqualTo(DEVICE_TYPE_WATCH);
+        assertThat(metadata.getDevice().getModel()).isEqualTo("model");
+        assertThat(metadata.getDevice().getManufacturer()).isEqualTo("manufacturer");
+        assertThat(metadata.getId()).isEqualTo(uuid.toString());
+        assertThat(metadata.getLastModifiedTime()).isEqualTo(Instant.ofEpochMilli(9012345));
+        assertThat(metadata.getRecordingMethod())
+                .isEqualTo(RECORDING_METHOD_AUTOMATICALLY_RECORDED);
+    }
+
+    @Test
+    public void toExternalRecord_optionalFieldsNotSet() {
+        UUID uuid = UUID.randomUUID();
+        ActivityIntensityRecordInternal internalRecord =
+                (ActivityIntensityRecordInternal)
+                        new ActivityIntensityRecordInternal()
+                                .setPackageName("package.name")
+                                .setUuid(uuid);
+
+        ActivityIntensityRecord externalRecord = internalRecord.toExternalRecord();
+
+        Metadata metadata = externalRecord.getMetadata();
+        assertThat(externalRecord.getRecordType()).isEqualTo(RECORD_TYPE_ACTIVITY_INTENSITY);
+        assertThat(externalRecord.getActivityIntensityType())
+                .isEqualTo(ACTIVITY_INTENSITY_TYPE_MODERATE);
+        assertThat(externalRecord.getStartTime()).isEqualTo(Instant.EPOCH);
+        assertThat(externalRecord.getEndTime()).isEqualTo(Instant.EPOCH);
+        assertThat(externalRecord.getStartZoneOffset()).isEqualTo(ZoneOffset.UTC);
+        assertThat(externalRecord.getEndZoneOffset()).isEqualTo(ZoneOffset.UTC);
+        assertThat(metadata.getClientRecordId()).isNull();
+        assertThat(metadata.getClientRecordVersion()).isEqualTo(-1);
+        assertThat(metadata.getDataOrigin().getPackageName()).isEqualTo("package.name");
+        assertThat(metadata.getDevice().getType()).isEqualTo(DEVICE_TYPE_UNKNOWN);
+        assertThat(metadata.getDevice().getModel()).isNull();
+        assertThat(metadata.getDevice().getManufacturer()).isNull();
+        assertThat(metadata.getId()).isEqualTo(uuid.toString());
+        assertThat(metadata.getLastModifiedTime()).isEqualTo(Instant.EPOCH.minusMillis(1));
+        assertThat(metadata.getRecordingMethod()).isEqualTo(RECORDING_METHOD_UNKNOWN);
+    }
+
+    @Test
+    public void writeToParcel_populateUsing_allFieldsSet() {
+        UUID uuid = UUID.randomUUID();
+        ActivityIntensityRecordInternal internalRecord =
+                (ActivityIntensityRecordInternal)
+                        new ActivityIntensityRecordInternal()
+                                .setActivityIntensityType(ACTIVITY_INTENSITY_TYPE_VIGOROUS)
+                                .setStartTime(1357924680)
+                                .setEndTime(2468013579L)
+                                .setStartZoneOffset(-2 * 3600)
+                                .setEndZoneOffset(3 * 3600)
+                                .setAppInfoId(123)
+                                .setAppName("app.name")
+                                .setClientRecordId("client-record-id")
+                                .setClientRecordVersion(567)
+                                .setDeviceInfoId(8)
+                                .setDeviceType(DEVICE_TYPE_WATCH)
+                                .setLastModifiedTime(9012345)
+                                .setManufacturer("manufacturer")
+                                .setModel("model")
+                                .setPackageName("package.name")
+                                .setRecordingMethod(RECORDING_METHOD_MANUAL_ENTRY)
+                                .setRowId(468)
+                                .setUuid(uuid);
+
+        Parcel parcel = Parcel.obtain();
+        internalRecord.writeToParcel(parcel);
+        parcel.setDataPosition(0);
+        ActivityIntensityRecordInternal decodedRecord = new ActivityIntensityRecordInternal();
+        decodedRecord.populateUsing(parcel);
+        parcel.recycle();
+
+        assertThat(decodedRecord.getActivityIntensityType())
+                .isEqualTo(ACTIVITY_INTENSITY_TYPE_VIGOROUS);
+        assertThat(decodedRecord.getStartTimeInMillis()).isEqualTo(1357924680);
+        assertThat(decodedRecord.getEndTimeInMillis()).isEqualTo(2468013579L);
+        assertThat(decodedRecord.getStartZoneOffsetInSeconds()).isEqualTo(-2 * 3600);
+        assertThat(decodedRecord.getEndZoneOffsetInSeconds()).isEqualTo(3 * 3600);
+        assertThat(decodedRecord.getAppInfoId()).isEqualTo(-1);
+        assertThat(decodedRecord.getAppName()).isEqualTo("app.name");
+        assertThat(decodedRecord.getClientRecordId()).isEqualTo("client-record-id");
+        assertThat(decodedRecord.getClientRecordVersion()).isEqualTo(567);
+        assertThat(decodedRecord.getDeviceInfoId()).isEqualTo(-1);
+        assertThat(decodedRecord.getDeviceType()).isEqualTo(DEVICE_TYPE_WATCH);
+        assertThat(decodedRecord.getLastModifiedTime()).isEqualTo(9012345);
+        assertThat(decodedRecord.getManufacturer()).isEqualTo("manufacturer");
+        assertThat(decodedRecord.getModel()).isEqualTo("model");
+        assertThat(decodedRecord.getPackageName()).isEqualTo("package.name");
+        assertThat(decodedRecord.getRecordingMethod()).isEqualTo(RECORDING_METHOD_MANUAL_ENTRY);
+        assertThat(decodedRecord.getRowId()).isEqualTo(-1);
+        assertThat(decodedRecord.getUuid()).isEqualTo(uuid);
+    }
+
+    @Test
+    public void writeToParcel_populateUsing_optionalFieldsNotSet() {
+        UUID uuid = UUID.randomUUID();
+        ActivityIntensityRecordInternal internalRecord =
+                (ActivityIntensityRecordInternal)
+                        new ActivityIntensityRecordInternal()
+                                .setPackageName("package.name")
+                                .setUuid(uuid);
+
+        Parcel parcel = Parcel.obtain();
+        internalRecord.writeToParcel(parcel);
+        parcel.setDataPosition(0);
+        ActivityIntensityRecordInternal decodedRecord = new ActivityIntensityRecordInternal();
+        decodedRecord.populateUsing(parcel);
+        parcel.recycle();
+
+        assertThat(decodedRecord.getActivityIntensityType())
+                .isEqualTo(ACTIVITY_INTENSITY_TYPE_MODERATE);
+        assertThat(decodedRecord.getStartTimeInMillis()).isEqualTo(0);
+        assertThat(decodedRecord.getEndTimeInMillis()).isEqualTo(0);
+        assertThat(decodedRecord.getStartZoneOffsetInSeconds()).isEqualTo(0);
+        assertThat(decodedRecord.getEndZoneOffsetInSeconds()).isEqualTo(0);
+        assertThat(decodedRecord.getAppInfoId()).isEqualTo(-1);
+        assertThat(decodedRecord.getAppName()).isNull();
+        assertThat(decodedRecord.getClientRecordId()).isNull();
+        assertThat(decodedRecord.getClientRecordVersion()).isEqualTo(-1);
+        assertThat(decodedRecord.getDeviceInfoId()).isEqualTo(-1);
+        assertThat(decodedRecord.getDeviceType()).isEqualTo(DEVICE_TYPE_UNKNOWN);
+        assertThat(decodedRecord.getLastModifiedTime()).isEqualTo(-1);
+        assertThat(decodedRecord.getManufacturer()).isNull();
+        assertThat(decodedRecord.getModel()).isNull();
+        assertThat(decodedRecord.getPackageName()).isEqualTo("package.name");
+        assertThat(decodedRecord.getRecordingMethod()).isEqualTo(RECORDING_METHOD_UNKNOWN);
+        assertThat(decodedRecord.getRowId()).isEqualTo(-1);
+        assertThat(decodedRecord.getUuid()).isEqualTo(uuid);
+    }
+
+    @Test
+    public void activityIntensityRecord_toInternalRecord_allFieldsSet() {
+        UUID uuid = UUID.randomUUID();
+        Metadata metadata =
+                new Metadata.Builder()
+                        .setId(uuid.toString())
+                        .setClientRecordId("client-record-id")
+                        .setClientRecordVersion(567)
+                        .setDevice(
+                                new Device.Builder()
+                                        .setType(DEVICE_TYPE_WATCH)
+                                        .setModel("model")
+                                        .setManufacturer("manufacturer")
+                                        .build())
+                        .setDataOrigin(
+                                new DataOrigin.Builder().setPackageName("package.name").build())
+                        .setRecordingMethod(RECORDING_METHOD_MANUAL_ENTRY)
+                        .setLastModifiedTime(Instant.ofEpochMilli(9012345))
+                        .build();
+        ActivityIntensityRecord externalRecord =
+                new ActivityIntensityRecord.Builder(
+                                metadata,
+                                Instant.ofEpochMilli(1357924680),
+                                Instant.ofEpochMilli(2468013579L),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .setStartZoneOffset(ZoneOffset.ofHours(-2))
+                        .setEndZoneOffset(ZoneOffset.ofHours(3))
+                        .build();
+
+        ActivityIntensityRecordInternal internalRecord = externalRecord.toRecordInternal();
+
+        assertThat(internalRecord.getActivityIntensityType())
+                .isEqualTo(ACTIVITY_INTENSITY_TYPE_MODERATE);
+        assertThat(internalRecord.getStartTimeInMillis()).isEqualTo(1357924680);
+        assertThat(internalRecord.getEndTimeInMillis()).isEqualTo(2468013579L);
+        assertThat(internalRecord.getStartZoneOffsetInSeconds()).isEqualTo(-2 * 3600);
+        assertThat(internalRecord.getEndZoneOffsetInSeconds()).isEqualTo(3 * 3600);
+        assertThat(internalRecord.getAppInfoId()).isEqualTo(-1);
+        assertThat(internalRecord.getAppName()).isNull();
+        assertThat(internalRecord.getClientRecordId()).isEqualTo("client-record-id");
+        assertThat(internalRecord.getClientRecordVersion()).isEqualTo(567);
+        assertThat(internalRecord.getDeviceInfoId()).isEqualTo(-1);
+        assertThat(internalRecord.getDeviceType()).isEqualTo(DEVICE_TYPE_WATCH);
+        assertThat(internalRecord.getLastModifiedTime()).isEqualTo(9012345);
+        assertThat(internalRecord.getManufacturer()).isEqualTo("manufacturer");
+        assertThat(internalRecord.getModel()).isEqualTo("model");
+        assertThat(internalRecord.getPackageName()).isEqualTo("package.name");
+        assertThat(internalRecord.getRecordingMethod()).isEqualTo(RECORDING_METHOD_MANUAL_ENTRY);
+        assertThat(internalRecord.getRowId()).isEqualTo(-1);
+        assertThat(internalRecord.getUuid()).isEqualTo(uuid);
+    }
+
+    @Test
+    public void activityIntensityRecord_toInternalRecord_optionalFieldsNotSet() {
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")));
+        Metadata metadata = new Metadata.Builder().build();
+        ActivityIntensityRecord externalRecord =
+                new ActivityIntensityRecord.Builder(
+                                metadata,
+                                Instant.ofEpochMilli(1357924680),
+                                Instant.ofEpochMilli(2468013579L),
+                                ACTIVITY_INTENSITY_TYPE_MODERATE)
+                        .build();
+
+        ActivityIntensityRecordInternal internalRecord = externalRecord.toRecordInternal();
+
+        assertThat(internalRecord.getActivityIntensityType())
+                .isEqualTo(ACTIVITY_INTENSITY_TYPE_MODERATE);
+        assertThat(internalRecord.getStartTimeInMillis()).isEqualTo(1357924680);
+        assertThat(internalRecord.getEndTimeInMillis()).isEqualTo(2468013579L);
+        assertThat(internalRecord.getStartZoneOffsetInSeconds()).isEqualTo(0);
+        assertThat(internalRecord.getEndZoneOffsetInSeconds()).isEqualTo(0);
+        assertThat(internalRecord.getAppInfoId()).isEqualTo(-1);
+        assertThat(internalRecord.getAppName()).isNull();
+        assertThat(internalRecord.getClientRecordId()).isNull();
+        assertThat(internalRecord.getClientRecordVersion()).isEqualTo(0);
+        assertThat(internalRecord.getDeviceInfoId()).isEqualTo(-1);
+        assertThat(internalRecord.getDeviceType()).isEqualTo(DEVICE_TYPE_UNKNOWN);
+        assertThat(internalRecord.getLastModifiedTime()).isEqualTo(0);
+        assertThat(internalRecord.getManufacturer()).isNull();
+        assertThat(internalRecord.getModel()).isNull();
+        assertThat(internalRecord.getPackageName()).isNull();
+        assertThat(internalRecord.getRecordingMethod()).isEqualTo(RECORDING_METHOD_UNKNOWN);
+        assertThat(internalRecord.getRowId()).isEqualTo(-1);
+        assertThat(internalRecord.getUuid()).isNull();
+    }
+}
diff --git a/tests/unittests/src/android/healthconnect/internal/datatypes/utils/FhirResourceTypeStringToIntMapperTest.java b/tests/unittests/src/android/healthconnect/internal/datatypes/utils/FhirResourceTypeStringToIntMapperTest.java
index f897c60..0157988 100644
--- a/tests/unittests/src/android/healthconnect/internal/datatypes/utils/FhirResourceTypeStringToIntMapperTest.java
+++ b/tests/unittests/src/android/healthconnect/internal/datatypes/utils/FhirResourceTypeStringToIntMapperTest.java
@@ -18,6 +18,7 @@
 import static android.health.connect.internal.datatypes.utils.FhirResourceTypeStringToIntMapper.getFhirResourceTypeInt;
 
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -37,12 +38,18 @@
 
     @Test
     @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testFlagOff() {
+    public void testFeatureFlagOff_expectException() {
         assertThrows(UnsupportedOperationException.class, () -> getFhirResourceTypeInt(""));
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void testDbFlagOff_expectException() {
+        assertThrows(UnsupportedOperationException.class, () -> getFhirResourceTypeInt(""));
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testFhirResourceTypeInt_immunizationType() {
         assertThat(getFhirResourceTypeInt("immunization"))
                 .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION);
@@ -53,7 +60,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testFhirResourceTypeInt_allergyIntoleranceType() {
         assertThat(getFhirResourceTypeInt("allergyintolerance"))
                 .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
@@ -64,7 +71,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testFhirResourceTypeInt_observationType() {
         assertThat(getFhirResourceTypeInt("observation"))
                 .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_OBSERVATION);
@@ -75,7 +82,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testFhirResourceTypeInt_conditionType() {
         assertThat(getFhirResourceTypeInt("condition"))
                 .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_CONDITION);
@@ -86,7 +93,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testFhirResourceTypeInt_procedureType() {
         assertThat(getFhirResourceTypeInt("procedure"))
                 .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PROCEDURE);
@@ -97,7 +104,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testFhirResourceTypeInt_medicationType() {
         assertThat(getFhirResourceTypeInt("medication"))
                 .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_MEDICATION);
@@ -108,7 +115,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testFhirResourceTypeInt_medicationStatementType() {
         assertThat(getFhirResourceTypeInt("medicationstatement"))
                 .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT);
@@ -119,7 +126,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testFhirResourceTypeInt_medicationRequestType() {
         assertThat(getFhirResourceTypeInt("medicationrequest"))
                 .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_REQUEST);
@@ -130,10 +137,80 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testFhirResourceTypeInt_unknownType() {
-        int fhirResourceTypeInt = getFhirResourceTypeInt("patient");
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testFhirResourceTypeInt_patientType() {
+        assertThat(getFhirResourceTypeInt("patient"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PATIENT);
+        assertThat(getFhirResourceTypeInt("Patient"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PATIENT);
+        assertThat(getFhirResourceTypeInt("PATIENT"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PATIENT);
+    }
 
-        assertThat(fhirResourceTypeInt).isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_UNKNOWN);
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testFhirResourceTypeInt_practitionerType() {
+        assertThat(getFhirResourceTypeInt("practitioner"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER);
+        assertThat(getFhirResourceTypeInt("Practitioner"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER);
+        assertThat(getFhirResourceTypeInt("PRACTITIONER"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testFhirResourceTypeInt_practitionerRoleType() {
+        assertThat(getFhirResourceTypeInt("practitionerRole"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE);
+        assertThat(getFhirResourceTypeInt("PractitionerRole"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE);
+        assertThat(getFhirResourceTypeInt("PRACTITIONERROLE"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testFhirResourceTypeInt_encounterType() {
+        assertThat(getFhirResourceTypeInt("encounter"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_ENCOUNTER);
+        assertThat(getFhirResourceTypeInt("Encounter"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_ENCOUNTER);
+        assertThat(getFhirResourceTypeInt("ENCOUNTER"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_ENCOUNTER);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testFhirResourceTypeInt_locationType() {
+        assertThat(getFhirResourceTypeInt("location"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_LOCATION);
+        assertThat(getFhirResourceTypeInt("Location"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_LOCATION);
+        assertThat(getFhirResourceTypeInt("LOCATION"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_LOCATION);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testFhirResourceTypeInt_organizationType() {
+        assertThat(getFhirResourceTypeInt("organization"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_ORGANIZATION);
+        assertThat(getFhirResourceTypeInt("Organization"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_ORGANIZATION);
+        assertThat(getFhirResourceTypeInt("ORGANIZATION"))
+                .isEqualTo(FhirResource.FHIR_RESOURCE_TYPE_ORGANIZATION);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testFhirResourceTypeInt_unknownType_throws() {
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () -> getFhirResourceTypeInt("researchstudy"));
+        assertThat(thrown)
+                .hasMessageThat()
+                .isEqualTo("Unsupported FHIR resource type: researchstudy");
     }
 }
diff --git a/tests/unittests/src/android/healthconnect/internal/datatypes/utils/HealthConnectMappingsTest.java b/tests/unittests/src/android/healthconnect/internal/datatypes/utils/HealthConnectMappingsTest.java
index efdf45b..176c371 100644
--- a/tests/unittests/src/android/healthconnect/internal/datatypes/utils/HealthConnectMappingsTest.java
+++ b/tests/unittests/src/android/healthconnect/internal/datatypes/utils/HealthConnectMappingsTest.java
@@ -17,6 +17,7 @@
 package android.healthconnect.internal.datatypes.utils;
 
 import static android.health.connect.Constants.DEFAULT_INT;
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_ACTIVITY_INTENSITY;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_UNKNOWN;
 import static android.health.connect.internal.datatypes.utils.DataTypeDescriptors.getAllDataTypeDescriptors;
 
@@ -37,6 +38,7 @@
 import android.health.connect.internal.datatypes.utils.RecordMapper;
 import android.health.connect.internal.datatypes.utils.RecordTypePermissionCategoryMapper;
 import android.health.connect.internal.datatypes.utils.RecordTypeRecordCategoryMapper;
+import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 
@@ -63,9 +65,16 @@
         assertThat(recordTypeIds).doesNotContain(RECORD_TYPE_UNKNOWN);
         assertThat(recordTypeIds).containsNoDuplicates();
         assertThat(recordTypeIds).hasSize(getAllDataTypeDescriptors().size());
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getAllRecordTypeIdentifiers_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+
         // UNKNOWN is not actually a valid record type id. Not removing it from VALID_TYPES to keep
         // the existing implementation intact. The new implementation does not return it.
-        assertThat(recordTypeIds)
+        assertThat(healthConnectMappings.getAllRecordTypeIdentifiers())
                 .containsExactlyElementsIn(
                         RecordTypeIdentifier.VALID_TYPES.stream()
                                 .filter(not(isEqual(RECORD_TYPE_UNKNOWN)))
@@ -80,6 +89,14 @@
                             healthConnectMappings.getHealthReadPermission(
                                     descriptor.getPermissionCategory()))
                     .isEqualTo(descriptor.getReadPermission());
+        }
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getHealthReadPermission_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+        for (DataTypeDescriptor descriptor : getAllDataTypeDescriptors()) {
             assertThat(
                             healthConnectMappings.getHealthReadPermission(
                                     descriptor.getPermissionCategory()))
@@ -98,6 +115,14 @@
                             healthConnectMappings.getHealthWritePermission(
                                     descriptor.getPermissionCategory()))
                     .isEqualTo(descriptor.getWritePermission());
+        }
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getHealthWritePermission_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+        for (DataTypeDescriptor descriptor : getAllDataTypeDescriptors()) {
             assertWithMessage(descriptor.getRecordClass().getSimpleName())
                     .that(
                             healthConnectMappings.getHealthWritePermission(
@@ -115,13 +140,17 @@
             assertWithMessage(descriptor.getWritePermission())
                     .that(healthConnectMappings.isWritePermission(descriptor.getWritePermission()))
                     .isTrue();
-            assertWithMessage(descriptor.getWritePermission())
-                    .that(healthConnectMappings.isWritePermission(descriptor.getWritePermission()))
-                    .isEqualTo(
-                            HealthPermissions.isWritePermission(descriptor.getWritePermission()));
             assertWithMessage(descriptor.getReadPermission())
                     .that(healthConnectMappings.isWritePermission(descriptor.getReadPermission()))
                     .isFalse();
+        }
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void isWritePermission_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+        for (DataTypeDescriptor descriptor : getAllDataTypeDescriptors()) {
             assertWithMessage(descriptor.getReadPermission())
                     .that(healthConnectMappings.isWritePermission(descriptor.getReadPermission()))
                     .isEqualTo(HealthPermissions.isWritePermission(descriptor.getReadPermission()));
@@ -141,13 +170,6 @@
                                     writePermission))
                     .isEqualTo(descriptor.getDataCategory());
 
-            assertWithMessage(writePermission)
-                    .that(
-                            healthConnectMappings.getHealthDataCategoryForWritePermission(
-                                    writePermission))
-                    .isEqualTo(
-                            HealthPermissions.getHealthDataCategoryForWritePermission(
-                                    writePermission));
             assertWithMessage(readPermission)
                     .that(
                             healthConnectMappings.getHealthDataCategoryForWritePermission(
@@ -161,6 +183,22 @@
                 .isEqualTo(DEFAULT_INT);
     }
 
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getHealthDataCategoryForWritePermission_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+        for (DataTypeDescriptor descriptor : getAllDataTypeDescriptors()) {
+            String writePermission = descriptor.getWritePermission();
+            assertWithMessage(writePermission)
+                    .that(
+                            healthConnectMappings.getHealthDataCategoryForWritePermission(
+                                    writePermission))
+                    .isEqualTo(
+                            HealthPermissions.getHealthDataCategoryForWritePermission(
+                                    writePermission));
+        }
+    }
+
     @EnableFlags(Flags.FLAG_MINDFULNESS)
     @Test
     public void getWriteHealthPermissionsFor() {
@@ -180,6 +218,25 @@
                                         permission))
                         .isEqualTo(descriptor.getDataCategory());
             }
+        }
+
+        assertThat(
+                        healthConnectMappings.getWriteHealthPermissionsFor(
+                                HealthPermissionCategory.UNKNOWN))
+                .isEmpty();
+        assertThat(healthConnectMappings.getWriteHealthPermissionsFor(100)).isEmpty();
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getWriteHealthPermissionsFor_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+
+        for (DataTypeDescriptor descriptor : getAllDataTypeDescriptors()) {
+            String[] permissions =
+                    healthConnectMappings.getWriteHealthPermissionsFor(
+                            descriptor.getDataCategory());
+
             // The HealthPermissions implementation uses static fields and because WELLNESS is
             // flagged it doesn't respect @EnableFlags and can't be made consistent.
             if (descriptor.getDataCategory() != HealthDataCategory.WELLNESS) {
@@ -190,12 +247,6 @@
                                         descriptor.getDataCategory()));
             }
         }
-
-        assertThat(
-                        healthConnectMappings.getWriteHealthPermissionsFor(
-                                HealthPermissionCategory.UNKNOWN))
-                .isEmpty();
-        assertThat(healthConnectMappings.getWriteHealthPermissionsFor(100)).isEmpty();
     }
 
     @Test
@@ -208,7 +259,14 @@
         assertThat(map).hasSize(getAllDataTypeDescriptors().size());
         assertThat(map.keySet()).isEqualTo(healthConnectMappings.getAllRecordTypeIdentifiers());
         assertThat(map.values()).containsNoDuplicates();
-        assertThat(map)
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getRecordIdToExternalRecordClassMap_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+
+        assertThat(healthConnectMappings.getRecordIdToExternalRecordClassMap())
                 .containsExactlyEntriesIn(
                         RecordMapper.getInstance().getRecordIdToExternalRecordClassMap());
     }
@@ -223,7 +281,14 @@
         assertThat(map).hasSize(getAllDataTypeDescriptors().size());
         assertThat(map.keySet()).isEqualTo(healthConnectMappings.getAllRecordTypeIdentifiers());
         assertThat(map.values()).containsNoDuplicates();
-        assertThat(map)
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getRecordIdToInternalRecordClassMap_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+
+        assertThat(healthConnectMappings.getRecordIdToInternalRecordClassMap())
                 .containsExactlyEntriesIn(
                         RecordMapper.getInstance().getRecordIdToInternalRecordClassMap());
     }
@@ -235,6 +300,14 @@
             assertWithMessage(descriptor.getRecordClass().getSimpleName())
                     .that(healthConnectMappings.getRecordType(descriptor.getRecordClass()))
                     .isEqualTo(descriptor.getRecordTypeIdentifier());
+        }
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getRecordType_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+        for (var descriptor : getAllDataTypeDescriptors()) {
             assertWithMessage(descriptor.getRecordClass().getSimpleName())
                     .that(healthConnectMappings.getRecordType(descriptor.getRecordClass()))
                     .isEqualTo(
@@ -249,6 +322,14 @@
             assertWithMessage(descriptor.getRecordClass().getSimpleName())
                     .that(healthConnectMappings.hasRecordType(descriptor.getRecordClass()))
                     .isTrue();
+        }
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void hasRecordType_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+        for (var descriptor : getAllDataTypeDescriptors()) {
             assertWithMessage(descriptor.getRecordClass().getSimpleName())
                     .that(healthConnectMappings.hasRecordType(descriptor.getRecordClass()))
                     .isEqualTo(
@@ -256,17 +337,14 @@
         }
     }
 
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
     @Test
-    public void getHealthPermissionCategoryForRecordType() {
+    public void getHealthPermissionCategoryForRecordType_equalsToLegacy() {
         HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
         for (var descriptor : getAllDataTypeDescriptors()) {
             int permissionCategory =
                     healthConnectMappings.getHealthPermissionCategoryForRecordType(
                             descriptor.getRecordTypeIdentifier());
-
-            assertWithMessage(descriptor.getRecordClass().getSimpleName())
-                    .that(permissionCategory)
-                    .isEqualTo(descriptor.getPermissionCategory());
             assertWithMessage(descriptor.getRecordClass().getSimpleName())
                     .that(permissionCategory)
                     .isEqualTo(
@@ -285,6 +363,18 @@
                             descriptor.getRecordTypeIdentifier());
 
             assertThat(dataCategory).isEqualTo(descriptor.getDataCategory());
+        }
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getRecordCategoryForRecordType_equalsToLegacy() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+        for (var descriptor : getAllDataTypeDescriptors()) {
+            int dataCategory =
+                    healthConnectMappings.getRecordCategoryForRecordType(
+                            descriptor.getRecordTypeIdentifier());
+
             assertThat(dataCategory)
                     .isEqualTo(
                             RecordTypeRecordCategoryMapper.getRecordCategoryForRecordType(
@@ -307,4 +397,33 @@
                                 .map(DataTypeDescriptor::getDataCategory)
                                 .collect(Collectors.toSet()));
     }
+
+    @EnableFlags({Flags.FLAG_ACTIVITY_INTENSITY, Flags.FLAG_ACTIVITY_INTENSITY_DB})
+    @Test
+    public void activityIntensityFlagsEnabled_containsActivityIntensity() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+
+        assertThat(healthConnectMappings.getAllRecordTypeIdentifiers())
+                .contains(RECORD_TYPE_ACTIVITY_INTENSITY);
+    }
+
+    @EnableFlags(Flags.FLAG_ACTIVITY_INTENSITY_DB)
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void activityIntensityFlagDisabled_doesNotContainsActivityIntensity() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+
+        assertThat(healthConnectMappings.getAllRecordTypeIdentifiers())
+                .doesNotContain(RECORD_TYPE_ACTIVITY_INTENSITY);
+    }
+
+    @EnableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY_DB)
+    @Test
+    public void activityIntensityDbFlagDisabled_doesNotContainsActivityIntensity() {
+        HealthConnectMappings healthConnectMappings = new HealthConnectMappings();
+
+        assertThat(healthConnectMappings.getAllRecordTypeIdentifiers())
+                .doesNotContain(RECORD_TYPE_ACTIVITY_INTENSITY);
+    }
 }
diff --git a/tests/unittests/src/android/healthconnect/internal/datatypes/utils/MedicalResourceTypePermissionMapperTest.java b/tests/unittests/src/android/healthconnect/internal/datatypes/utils/MedicalResourceTypePermissionMapperTest.java
index a4ebc08..fc1a72b 100644
--- a/tests/unittests/src/android/healthconnect/internal/datatypes/utils/MedicalResourceTypePermissionMapperTest.java
+++ b/tests/unittests/src/android/healthconnect/internal/datatypes/utils/MedicalResourceTypePermissionMapperTest.java
@@ -16,18 +16,21 @@
 
 package android.healthconnect.internal.datatypes.utils;
 
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PREGNANCY;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROBLEMS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_PROCEDURES;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_SOCIAL_HISTORY;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS;
 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS;
 
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -44,32 +47,30 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
+@EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
 public class MedicalResourceTypePermissionMapperTest {
     @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalReadPermissionForResourceType_immunizationType_returns() {
+    public void testGetMedicalReadPermissionForResourceType_vaccineType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                        MEDICAL_RESOURCE_TYPE_VACCINES);
 
-        assertThat(readPermission).isEqualTo(HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION);
+        assertThat(readPermission).isEqualTo(HealthPermissions.READ_MEDICAL_DATA_VACCINES);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalReadPermissionForResourceType_allergyType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
-                        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
 
         assertThat(readPermission)
-                .isEqualTo(HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE);
+                .isEqualTo(HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalReadPermissionForResourceType_labsType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
@@ -80,7 +81,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalReadPermissionForResourceType_medicationsType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
@@ -90,7 +90,25 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testGetMedicalReadPermissionForResourceType_personalDetailsType_returns() {
+        String readPermission =
+                MedicalResourceTypePermissionMapper.getMedicalReadPermission(
+                        MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS);
+
+        assertThat(readPermission).isEqualTo(HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS);
+    }
+
+    @Test
+    public void testGetMedicalReadPermissionForResourceType_practitionerDetailsType_returns() {
+        String readPermission =
+                MedicalResourceTypePermissionMapper.getMedicalReadPermission(
+                        MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS);
+
+        assertThat(readPermission)
+                .isEqualTo(HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS);
+    }
+
+    @Test
     public void testGetMedicalReadPermissionForResourceType_pregnancyType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
@@ -100,17 +118,15 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalReadPermissionForResourceType_problemsType_returns() {
+    public void testGetMedicalReadPermissionForResourceType_conditionsType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
-                        MEDICAL_RESOURCE_TYPE_PROBLEMS);
+                        MEDICAL_RESOURCE_TYPE_CONDITIONS);
 
-        assertThat(readPermission).isEqualTo(HealthPermissions.READ_MEDICAL_DATA_PROBLEMS);
+        assertThat(readPermission).isEqualTo(HealthPermissions.READ_MEDICAL_DATA_CONDITIONS);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalReadPermissionForResourceType_proceduresType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
@@ -120,7 +136,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalReadPermissionForResourceType_socialHistoryType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
@@ -130,7 +145,15 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testGetMedicalReadPermissionForResourceType_visitsType_returns() {
+        String readPermission =
+                MedicalResourceTypePermissionMapper.getMedicalReadPermission(
+                        MEDICAL_RESOURCE_TYPE_VISITS);
+
+        assertThat(readPermission).isEqualTo(HealthPermissions.READ_MEDICAL_DATA_VISITS);
+    }
+
+    @Test
     public void testGetMedicalReadPermissionForResourceType_vitalSignsType_returns() {
         String readPermission =
                 MedicalResourceTypePermissionMapper.getMedicalReadPermission(
@@ -140,27 +163,22 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalReadPermissionForResourceType_unknownType_throws() {
         assertThrows(
                 IllegalArgumentException.class,
-                () ->
-                        MedicalResourceTypePermissionMapper.getMedicalReadPermission(
-                                MEDICAL_RESOURCE_TYPE_UNKNOWN));
+                () -> MedicalResourceTypePermissionMapper.getMedicalReadPermission(0));
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalResourceTypeForReadPermission_immunizationType_returns() {
+    public void testGetMedicalResourceTypeForReadPermission_vaccineType_returns() {
         int medicalResourceType =
                 MedicalResourceTypePermissionMapper.getMedicalResourceType(
-                        HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION);
+                        HealthPermissions.READ_MEDICAL_DATA_VACCINES);
 
-        assertThat(medicalResourceType).isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+        assertThat(medicalResourceType).isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalResourceTypeForReadPermission_coversAllPermissions() {
         Set<String> medicalReadPermissions =
                 HealthPermissions.getAllMedicalPermissions().stream()
@@ -175,11 +193,10 @@
                         .collect(Collectors.toSet());
 
         assertThat(medicalResourceTypes.size()).isEqualTo(medicalReadPermissions.size());
-        assertThat(medicalResourceTypes.size()).isEqualTo(9);
+        assertThat(medicalResourceTypes.size()).isEqualTo(12);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalResourceTypeForReadPermission_fitnessDataType_throws() {
         assertThrows(
                 IllegalArgumentException.class,
diff --git a/tests/unittests/src/com/android/healthfitness/flags/AconfigFlagHelperTest.java b/tests/unittests/src/com/android/healthfitness/flags/AconfigFlagHelperTest.java
index 04b3576..c18aa81 100644
--- a/tests/unittests/src/com/android/healthfitness/flags/AconfigFlagHelperTest.java
+++ b/tests/unittests/src/com/android/healthfitness/flags/AconfigFlagHelperTest.java
@@ -18,6 +18,7 @@
 
 import static com.android.healthfitness.flags.AconfigFlagHelper.DB_VERSION_TO_DB_FLAG_MAP;
 import static com.android.healthfitness.flags.AconfigFlagHelper.getDbVersion;
+import static com.android.healthfitness.flags.AconfigFlagHelper.isEcosystemMetricsEnabled;
 import static com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled;
 import static com.android.healthfitness.flags.DatabaseVersions.LAST_ROLLED_OUT_DB_VERSION;
 
@@ -31,11 +32,11 @@
 
 import org.junit.Before;
 import org.junit.ClassRule;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
 import java.util.Map;
+import java.util.function.BooleanSupplier;
 
 public class AconfigFlagHelperTest {
     @ClassRule public static final SetFlagsRule.ClassRule mClassRule = new SetFlagsRule.ClassRule();
@@ -50,7 +51,7 @@
     @DisableFlags({Flags.FLAG_INFRA_TO_GUARD_DB_CHANGES})
     public void infraToGuardDbChangesDisabled() {
         // putting a very high DB version mapping to true to the map
-        DB_VERSION_TO_DB_FLAG_MAP.put(1000_000, true);
+        DB_VERSION_TO_DB_FLAG_MAP.put(1000_000, () -> true);
 
         // since FLAG_INFRA_TO_GUARD_DB_CHANGES is disabled, that very high version shouldn't be
         // taken into account.
@@ -59,6 +60,7 @@
 
     @Test
     @EnableFlags({Flags.FLAG_INFRA_TO_GUARD_DB_CHANGES})
+    @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void infraToGuardDbChangesEnabled() {
         assertThat(getDbVersion()).isEqualTo(LAST_ROLLED_OUT_DB_VERSION);
     }
@@ -83,9 +85,9 @@
     public void testGetDbVersion_true_true_true() {
         // initialize DB_VERSION_TO_DB_FLAG_MAP, so it won't be empty when getDbVersion() is called,
         // so the entries created in this test will be used.
-        DB_VERSION_TO_DB_FLAG_MAP.put(1, true);
-        DB_VERSION_TO_DB_FLAG_MAP.put(2, true);
-        DB_VERSION_TO_DB_FLAG_MAP.put(3, true);
+        DB_VERSION_TO_DB_FLAG_MAP.put(1, () -> true);
+        DB_VERSION_TO_DB_FLAG_MAP.put(2, () -> true);
+        DB_VERSION_TO_DB_FLAG_MAP.put(3, () -> true);
 
         assertThat(getDbVersion()).isEqualTo(3);
     }
@@ -95,9 +97,9 @@
     public void testGetDbVersion_true_false_true() {
         // initialize DB_VERSION_TO_DB_FLAG_MAP, so it won't be empty when getDbVersion() is called,
         // so the entries created in this test will be used.
-        DB_VERSION_TO_DB_FLAG_MAP.put(1, true);
-        DB_VERSION_TO_DB_FLAG_MAP.put(2, false);
-        DB_VERSION_TO_DB_FLAG_MAP.put(3, true);
+        DB_VERSION_TO_DB_FLAG_MAP.put(1, () -> true);
+        DB_VERSION_TO_DB_FLAG_MAP.put(2, () -> false);
+        DB_VERSION_TO_DB_FLAG_MAP.put(3, () -> true);
 
         assertThat(getDbVersion()).isEqualTo(1);
     }
@@ -107,9 +109,9 @@
     public void testGetDbVersion_true_false_false() {
         // initialize DB_VERSION_TO_DB_FLAG_MAP, so it won't be empty when getDbVersion() is called,
         // so the entries created in this test will be used.
-        DB_VERSION_TO_DB_FLAG_MAP.put(1, true);
-        DB_VERSION_TO_DB_FLAG_MAP.put(2, false);
-        DB_VERSION_TO_DB_FLAG_MAP.put(3, false);
+        DB_VERSION_TO_DB_FLAG_MAP.put(1, () -> true);
+        DB_VERSION_TO_DB_FLAG_MAP.put(2, () -> false);
+        DB_VERSION_TO_DB_FLAG_MAP.put(3, () -> false);
 
         assertThat(getDbVersion()).isEqualTo(1);
     }
@@ -127,18 +129,20 @@
         // - DB_VERSION_TO_DB_FLAG_MAP contains a single entry of 15 => false
         // Now, if a version X = 16 is added to DatabaseVersions.java, and X is assigned to
         // LAST_ROLLED_OUT_DB_VERSION, then this test would fail.
-        for (Map.Entry<Integer, Boolean> entry : DB_VERSION_TO_DB_FLAG_MAP.entrySet()) {
+        for (Map.Entry<Integer, BooleanSupplier> entry : DB_VERSION_TO_DB_FLAG_MAP.entrySet()) {
             int dbVersion = entry.getKey();
-            boolean flagValue = entry.getValue();
+            boolean flagValue = entry.getValue().getAsBoolean();
             if (!flagValue) { // flagValue being `false` means the feature hasn't been rolled out
                 // If a feature hasn't been rolled out, then its DB version must be greater than
                 // the last rolled out DB version.
                 assertTrue(
                         String.format(
                                 "DB version %d hasn't been rolled out yet, it's likely a mistake to"
-                                    + " set DatabaseVersions#LAST_ROLLED_OUT_DB_VERSION to a number"
-                                    + " greater than %d. Make sure you follow the instructions in"
-                                    + " go/hc-mainline-dev/trunk_stable/add-db-changes.",
+                                        + " set DatabaseVersions#LAST_ROLLED_OUT_DB_VERSION to a "
+                                        + "number"
+                                        + " greater than %d. Make sure you follow the "
+                                        + "instructions in"
+                                        + " go/hc-mainline-dev/trunk_stable/add-db-changes.",
                                 dbVersion, dbVersion),
                         dbVersion > LAST_ROLLED_OUT_DB_VERSION);
             }
@@ -164,11 +168,35 @@
         assertThat(isPersonalHealthRecordEnabled()).isFalse();
     }
 
-    @Ignore("TODO(b/357062401): enabled this test when PHR schemas are finalized")
     @Test
     @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD)
     @DisableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void phr_featureFlagTrueAndDbFalse_expectFalse() {
         assertThat(isPersonalHealthRecordEnabled()).isFalse();
     }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ECOSYSTEM_METRICS_DB_CHANGES)
+    @DisableFlags(Flags.FLAG_ECOSYSTEM_METRICS)
+    public void isEcosystemMetricsEnabled_featureFlagOff_expectFalse() {
+        assertThat(isEcosystemMetricsEnabled()).isFalse();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ECOSYSTEM_METRICS)
+    @DisableFlags(Flags.FLAG_ECOSYSTEM_METRICS_DB_CHANGES)
+    public void isEcosystemMetricsEnabled_dbFlagOff_expectFalse() {
+        assertThat(isEcosystemMetricsEnabled()).isFalse();
+    }
+
+    @Test
+    @EnableFlags({
+        Flags.FLAG_ECOSYSTEM_METRICS,
+        Flags.FLAG_ECOSYSTEM_METRICS_DB_CHANGES,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_ACTIVITY_INTENSITY_DB
+    })
+    public void isEcosystemMetricsEnabled_bothFlagsOn_expectTrue() {
+        assertThat(isEcosystemMetricsEnabled()).isTrue();
+    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/EnvironmentFixture.java b/tests/unittests/src/com/android/server/healthconnect/EnvironmentFixture.java
new file mode 100644
index 0000000..38d3a15
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/EnvironmentFixture.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect;
+
+import static org.mockito.Mockito.when;
+
+import static java.util.Objects.requireNonNull;
+
+import android.content.Context;
+import android.os.Environment;
+import android.util.Log;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
+import com.android.modules.utils.testing.StaticMockFixture;
+
+import java.io.File;
+
+/**
+ * A fixture for use with {@link com.android.modules.utils.testing.ExtendedMockitoRule} that mocks
+ * {@link Environment#getDataDirectory()} to return an empty directory that is deleted at the end of
+ * the test.
+ */
+public class EnvironmentFixture implements StaticMockFixture {
+
+    private static final String TAG = "EnvironmentFixture";
+
+    private final String mName;
+    private final int mFileMode;
+    private File mDataDirectory;
+
+    public EnvironmentFixture() {
+        this("test_data", Context.MODE_PRIVATE);
+    }
+
+    public EnvironmentFixture(String name, int fileMode) {
+        mName = name;
+        mFileMode = fileMode;
+    }
+
+    @Override
+    public StaticMockitoSessionBuilder setUpMockedClasses(
+            StaticMockitoSessionBuilder sessionBuilder) {
+        return sessionBuilder.mockStatic(Environment.class);
+    }
+
+    @Override
+    public void setUpMockBehaviors() {
+        Context context = ApplicationProvider.getApplicationContext();
+        mDataDirectory = context.getDir(mName, mFileMode);
+        // Ensure directory doesn't contain anything left over from previous tests.
+        for (File file : mDataDirectory.listFiles()) {
+            delete(file);
+        }
+        when(Environment.getDataDirectory()).thenReturn(mDataDirectory);
+    }
+
+    @Override
+    public void tearDown() {
+        delete(mDataDirectory);
+    }
+
+    public File getDataDirectory() {
+        return requireNonNull(mDataDirectory);
+    }
+
+    private void delete(File file) {
+        if (file.isDirectory()) {
+            for (File f : file.listFiles()) {
+                delete(f);
+            }
+        }
+        if (!file.delete()) {
+            throw new IllegalStateException("Failed to delete " + file.getName());
+        }
+        Log.v(TAG, "Deleted " + file.getName());
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/FakePreferenceHelper.java b/tests/unittests/src/com/android/server/healthconnect/FakePreferenceHelper.java
index 7f97745..97f5730 100644
--- a/tests/unittests/src/com/android/server/healthconnect/FakePreferenceHelper.java
+++ b/tests/unittests/src/com/android/server/healthconnect/FakePreferenceHelper.java
@@ -28,7 +28,7 @@
 public class FakePreferenceHelper extends PreferenceHelper {
 
     public FakePreferenceHelper() {
-        super(null);
+        super(null, new DatabaseHelpers());
         mPreferences = new ConcurrentHashMap<>();
     }
 
diff --git a/tests/unittests/src/com/android/server/healthconnect/HealthConnectDailyJobsTest.java b/tests/unittests/src/com/android/server/healthconnect/HealthConnectDailyJobsTest.java
index 064c480..055d628 100644
--- a/tests/unittests/src/com/android/server/healthconnect/HealthConnectDailyJobsTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/HealthConnectDailyJobsTest.java
@@ -23,7 +23,7 @@
 
 import android.app.job.JobScheduler;
 import android.content.Context;
-
+import android.os.UserHandle;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -48,9 +48,9 @@
 
     @Test
     public void testJobSchedule() {
-        HealthConnectDailyJobs.schedule(mContext, 0);
+        HealthConnectDailyJobs.schedule(mContext, UserHandle.getUserHandleForUid(0));
         verify(mJobScheduler, times(1)).schedule(any());
-        HealthConnectDailyJobs.schedule(mContext, 1);
+        HealthConnectDailyJobs.schedule(mContext, UserHandle.getUserHandleForUid(1));
         verify(mJobScheduler, times(2)).schedule(any());
         HealthConnectDailyJobs.cancelAllJobs(mContext);
         verify(mJobScheduler, times(1)).cancelAll();
diff --git a/tests/unittests/src/com/android/server/healthconnect/HealthConnectManagerServiceTest.java b/tests/unittests/src/com/android/server/healthconnect/HealthConnectManagerServiceTest.java
index d708e67..51f5998 100644
--- a/tests/unittests/src/com/android/server/healthconnect/HealthConnectManagerServiceTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/HealthConnectManagerServiceTest.java
@@ -25,32 +25,26 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.Manifest;
 import android.app.job.JobScheduler;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PermissionGroupInfo;
 import android.content.pm.PermissionInfo;
-import android.os.Environment;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.permission.PermissionManager;
-import android.platform.test.flag.junit.FlagsParameterization;
-import android.platform.test.flag.junit.SetFlagsRule;
 
+import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
-import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
 import com.android.server.SystemService;
 import com.android.server.appop.AppOpsManagerLocal;
 import com.android.server.healthconnect.backuprestore.BackupRestore;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.migration.MigrationStateChangeJob;
-import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
 
 import com.google.common.truth.Truth;
 
@@ -61,12 +55,7 @@
 import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
-import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
-import platform.test.runner.parameterized.Parameters;
-
-import java.util.List;
-
-@RunWith(ParameterizedAndroidJunit4.class)
+@RunWith(AndroidJUnit4.class)
 public class HealthConnectManagerServiceTest {
 
     private static final String HEALTH_CONNECT_DAILY_JOB_NAMESPACE = "HEALTH_CONNECT_DAILY_JOB";
@@ -75,20 +64,13 @@
     private static final String ANDROID_SERVER_PACKAGE_NAME = "com.android.server";
 
     @Rule(order = 1)
-    public SetFlagsRule mSetFlagsRule;
-
-    @Rule(order = 2)
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(BackupRestore.BackupRestoreJobService.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 3)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
-
     @Mock Context mContext;
     @Mock private SystemService.TargetUser mMockTargetUser;
     @Mock private JobScheduler mJobScheduler;
@@ -98,21 +80,8 @@
     @Mock private AppOpsManagerLocal mAppOpsManagerLocal;
     private HealthConnectManagerService mHealthConnectManagerService;
 
-    @Parameters(name = "{0}")
-    public static List<FlagsParameterization> getParams() {
-        return FlagsParameterization.allCombinationsOf(Flags.FLAG_DEPENDENCY_INJECTION);
-    }
-
-    public HealthConnectManagerServiceTest(FlagsParameterization flags) {
-        mSetFlagsRule = new SetFlagsRule(flags);
-    }
-
     @Before
     public void setUp() throws PackageManager.NameNotFoundException {
-        InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation()
-                .adoptShellPermissionIdentity(Manifest.permission.READ_DEVICE_CONFIG);
-        TransactionManager.cleanUpForTest();
         HealthConnectInjector.resetInstanceForTest();
         when(mJobScheduler.forNamespace(HEALTH_CONNECT_DAILY_JOB_NAMESPACE))
                 .thenReturn(mJobScheduler);
diff --git a/tests/unittests/src/com/android/server/healthconnect/HealthConnectServiceImplTest.java b/tests/unittests/src/com/android/server/healthconnect/HealthConnectServiceImplTest.java
index 0fdcf3a..11502c7 100644
--- a/tests/unittests/src/com/android/server/healthconnect/HealthConnectServiceImplTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/HealthConnectServiceImplTest.java
@@ -19,38 +19,60 @@
 import static android.Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA;
 import static android.content.pm.PackageManager.PERMISSION_DENIED;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.HealthConnectException.ERROR_INVALID_ARGUMENT;
 import static android.health.connect.HealthConnectException.ERROR_SECURITY;
 import static android.health.connect.HealthConnectException.ERROR_UNSUPPORTED_OPERATION;
 import static android.health.connect.HealthConnectManager.DATA_DOWNLOAD_STARTED;
 import static android.health.connect.HealthPermissions.MANAGE_HEALTH_DATA_PERMISSION;
 import static android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND;
-import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
 import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
 import static android.health.connect.HealthPermissions.getAllMedicalPermissions;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.health.connect.ratelimiter.RateLimiter.QuotaCategory.QUOTA_CATEGORY_READ;
 import static android.health.connect.ratelimiter.RateLimiter.QuotaCategory.QUOTA_CATEGORY_WRITE;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_UUID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_PACKAGE_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
-import static android.healthconnect.cts.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
-import static android.healthconnect.cts.utils.PhrDataFactory.getGetMedicalDataSourceRequest;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalDataSourceRequiredFieldsOnly;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResourceId;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_VERSION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_UUID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getGetMedicalDataSourceRequest;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalDataSourceRequiredFieldsOnly;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResourceId;
+import static android.healthconnect.cts.utils.DataFactory.MAXIMUM_PAGE_SIZE;
+import static android.healthconnect.cts.utils.DataFactory.NOW;
 
 import static com.android.healthfitness.flags.AconfigFlagHelper.isPersonalHealthRecordEnabled;
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW;
 import static com.android.server.healthconnect.TestUtils.waitForAllScheduledTasksToComplete;
 import static com.android.server.healthconnect.backuprestore.BackupRestore.DATA_DOWNLOAD_STATE_KEY;
 import static com.android.server.healthconnect.backuprestore.BackupRestore.DATA_RESTORE_STATE_KEY;
 import static com.android.server.healthconnect.backuprestore.BackupRestore.INTERNAL_RESTORE_STATE_STAGING_DONE;
 import static com.android.server.healthconnect.backuprestore.BackupRestore.INTERNAL_RESTORE_STATE_STAGING_IN_PROGRESS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.CREATE_MEDICAL_DATA_SOURCE;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_DATA_SOURCE_WITH_DATA;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_RESOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.DELETE_MEDICAL_RESOURCES_BY_REQUESTS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.GET_MEDICAL_DATA_SOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.GET_MEDICAL_DATA_SOURCES_BY_REQUESTS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.READ_MEDICAL_RESOURCES_BY_IDS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.READ_MEDICAL_RESOURCES_BY_REQUESTS;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.ApiMethods.UPSERT_MEDICAL_RESOURCES;
+import static com.android.server.healthconnect.logging.HealthConnectServiceLogger.MEDICAL_RESOURCE_TYPE_NOT_ASSIGNED_DEFAULT_VALUE;
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
@@ -80,6 +102,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.database.sqlite.SQLiteException;
+import android.health.HealthFitnessStatsLog;
 import android.health.connect.DeleteMedicalResourcesRequest;
 import android.health.connect.GetMedicalDataSourcesRequest;
 import android.health.connect.HealthConnectException;
@@ -93,10 +116,12 @@
 import android.health.connect.aidl.IHealthConnectService;
 import android.health.connect.aidl.IMedicalDataSourceResponseCallback;
 import android.health.connect.aidl.IMedicalDataSourcesResponseCallback;
+import android.health.connect.aidl.IMedicalResourceListParcelResponseCallback;
 import android.health.connect.aidl.IMedicalResourceTypeInfosCallback;
 import android.health.connect.aidl.IMedicalResourcesResponseCallback;
 import android.health.connect.aidl.IMigrationCallback;
 import android.health.connect.aidl.IReadMedicalResourcesResponseCallback;
+import android.health.connect.aidl.UpsertMedicalResourceRequestsParcel;
 import android.health.connect.datatypes.MedicalDataSource;
 import android.health.connect.exportimport.ScheduledExportSettings;
 import android.health.connect.migration.MigrationEntityParcel;
@@ -105,8 +130,8 @@
 import android.health.connect.restore.StageRemoteDataRequest;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
 import android.net.Uri;
-import android.os.Environment;
 import android.os.ParcelFileDescriptor;
+import android.os.Process;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.permission.PermissionManager;
@@ -122,6 +147,7 @@
 import com.android.modules.utils.testing.ExtendedMockitoRule;
 import com.android.server.LocalManagerRegistry;
 import com.android.server.appop.AppOpsManagerLocal;
+import com.android.server.healthconnect.backuprestore.BackupRestore;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
 import com.android.server.healthconnect.migration.MigrationCleaner;
@@ -130,14 +156,17 @@
 import com.android.server.healthconnect.migration.MigrationUiStateManager;
 import com.android.server.healthconnect.permission.FirstGrantTimeManager;
 import com.android.server.healthconnect.permission.HealthConnectPermissionHelper;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.phr.PhrPageTokenWrapper;
 import com.android.server.healthconnect.phr.ReadMedicalResourcesInternalResponse;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.FakeTimeSource;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -145,6 +174,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatchers;
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.quality.Strictness;
@@ -154,13 +184,14 @@
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeoutException;
+import java.util.function.Supplier;
 
 /** Unit test class for {@link HealthConnectServiceImpl} */
 @RunWith(AndroidJUnit4.class)
@@ -215,10 +246,15 @@
                     "getMedicalDataSourcesByRequest",
                     "deleteMedicalResourcesByIds",
                     "deleteMedicalResourcesByRequest",
+                    "upsertMedicalResourcesFromRequestsParcel",
                     "upsertMedicalResources",
                     "readMedicalResourcesByIds",
                     "readMedicalResourcesByRequest",
-                    "queryAllMedicalResourceTypeInfos");
+                    "queryAllMedicalResourceTypeInfos",
+                    "runImmediateExport",
+                    "getChangesForBackup",
+                    "getSettingsForBackup",
+                    "pushSettingsForRestore");
 
     /** Health connect service APIs that do not block calls when data sync is in progress. */
     public static final Set<String> DO_NOT_BLOCK_CALLS_DURING_DATA_SYNC_LIST =
@@ -241,25 +277,23 @@
     private static final String TEST_URI = "content://com.android.server.healthconnect/testuri";
     private static final long DEFAULT_PACKAGE_APP_INFO = 123L;
 
+    /** Package name where {@link HealthConnectServiceImplTest this test} runs in. */
+    private static final String THIS_TEST_PACKAGE_NAME = "com.android.healthconnect.unittests";
+
     @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Rule
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
-                    .mockStatic(AppInfoHelper.class)
-                    .mockStatic(Environment.class)
-                    .mockStatic(PreferenceHelper.class)
                     .mockStatic(LocalManagerRegistry.class)
-                    .mockStatic(UserHandle.class)
-                    .mockStatic(TransactionManager.class)
-                    .mockStatic(HealthDataCategoryPriorityHelper.class)
+                    .mockStatic(HealthFitnessStatsLog.class)
                     .spyStatic(RateLimiter.class)
                     .setStrictness(Strictness.LENIENT)
+                    .addStaticMockFixtures(EnvironmentFixture::new)
                     .build();
 
     @Mock private TransactionManager mTransactionManager;
     @Mock private AppInfoHelper mAppInfoHelper;
-    @Mock private HealthConnectDeviceConfigManager mDeviceConfigManager;
     @Mock private HealthConnectPermissionHelper mHealthConnectPermissionHelper;
     @Mock private MigrationCleaner mMigrationCleaner;
     @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
@@ -267,90 +301,115 @@
     @Mock private MigrationUiStateManager mMigrationUiStateManager;
     @Mock private Context mServiceContext;
     @Mock private PreferenceHelper mPreferenceHelper;
+    @Mock private PreferencesManager mPreferencesManager;
     @Mock private AppOpsManagerLocal mAppOpsManagerLocal;
     @Mock private PackageManager mPackageManager;
     @Mock private PermissionManager mPermissionManager;
     @Mock private MedicalDataSourceHelper mMedicalDataSourceHelper;
     @Mock private MedicalResourceHelper mMedicalResourceHelper;
     @Mock private HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
     @Mock IMigrationCallback mMigrationCallback;
     @Mock IMedicalDataSourceResponseCallback mMedicalDataSourceCallback;
     @Mock IMedicalDataSourcesResponseCallback mMedicalDataSourcesResponseCallback;
     @Mock IReadMedicalResourcesResponseCallback mReadMedicalResourcesResponseCallback;
+    @Mock IEmptyResponseCallback mEmptyResponseCallback;
+    @Mock IMedicalResourcesResponseCallback mMedicalResourcesResponseCallback;
+    @Mock IMedicalResourceListParcelResponseCallback mMedicalResourceListParcelResponseCallback;
     @Captor ArgumentCaptor<HealthConnectExceptionParcel> mErrorCaptor;
     @Captor ArgumentCaptor<List<MedicalDataSource>> mMedicalDataSourcesResponseCaptor;
+    private FakeTimeSource mFakeTimeSource;
     private Context mContext;
     private AttributionSource mAttributionSource;
     private HealthConnectServiceImpl mHealthConnectService;
     private UserHandle mUserHandle;
-    private File mMockDataDirectory;
+    private BackupRestore mBackupRestore;
     private ThreadPoolExecutor mInternalTaskScheduler;
     private String mTestPackageName;
 
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    android.healthconnect.cts.utils.TestUtils::isHardwareSupported,
+                    android.healthconnect.cts.utils.TestUtils::isHealthConnectFullySupported,
                     "Tests should run on supported hardware only.");
 
     @Before
     public void setUp() throws Exception {
-        when(TransactionManager.getInitialisedInstance()).thenReturn(mTransactionManager);
-        when(AppInfoHelper.getInstance()).thenReturn(mAppInfoHelper);
-        when(UserHandle.of(anyInt())).thenCallRealMethod();
-        when(UserHandle.getUserHandleForUid(anyInt())).thenCallRealMethod();
-        mUserHandle = UserHandle.of(UserHandle.myUserId());
+        mContext = InstrumentationRegistry.getInstrumentation().getContext();
+        mUserHandle = mContext.getUser();
+
+        when(mPackageManager.getPackageUid(anyString(), anyInt())).thenReturn(Process.myUid());
         when(mServiceContext.getPackageManager()).thenReturn(mPackageManager);
         when(mServiceContext.getUser()).thenReturn(mUserHandle);
-        mInternalTaskScheduler = HealthConnectThreadScheduler.sInternalBackgroundExecutor;
-
-        mContext =
-                new HealthConnectUserContext(
-                        InstrumentationRegistry.getInstrumentation().getContext(), mUserHandle);
-        HealthConnectDeviceConfigManager.initializeInstance(mContext);
-        mAttributionSource = mContext.getAttributionSource();
-        mTestPackageName = mAttributionSource.getPackageName();
-        when(mServiceContext.createContextAsUser(mUserHandle, 0)).thenReturn(mContext);
+        when(mServiceContext.createContextAsUser(mUserHandle, 0)).thenReturn(mServiceContext);
         when(mServiceContext.getSystemService(ActivityManager.class))
                 .thenReturn(mContext.getSystemService(ActivityManager.class));
-        mMockDataDirectory = mContext.getDir("mock_data", Context.MODE_PRIVATE);
-        when(Environment.getDataDirectory()).thenReturn(mMockDataDirectory);
-        when(PreferenceHelper.getInstance()).thenReturn(mPreferenceHelper);
-        when(LocalManagerRegistry.getManager(AppOpsManagerLocal.class))
-                .thenReturn(mAppOpsManagerLocal);
         when(mServiceContext.getSystemService(PermissionManager.class))
                 .thenReturn(mPermissionManager);
+
+        mInternalTaskScheduler = HealthConnectThreadScheduler.sInternalBackgroundExecutor;
+        mFakeTimeSource = new FakeTimeSource(NOW);
+        mAttributionSource = mContext.getAttributionSource();
+        mTestPackageName = mAttributionSource.getPackageName();
+        when(LocalManagerRegistry.getManager(AppOpsManagerLocal.class))
+                .thenReturn(mAppOpsManagerLocal);
         setUpAllMedicalPermissionChecksHardDenied();
 
         HealthConnectInjector healthConnectInjector =
-                HealthConnectInjectorImpl.newBuilderForTest(mContext)
+                HealthConnectInjectorImpl.newBuilderForTest(mServiceContext)
                         .setPreferenceHelper(mPreferenceHelper)
+                        .setPreferencesManager(mPreferencesManager)
+                        .setTransactionManager(mTransactionManager)
                         .setHealthDataCategoryPriorityHelper(mHealthDataCategoryPriorityHelper)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .setHealthConnectPermissionHelper(mHealthConnectPermissionHelper)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setMigrationCleaner(mMigrationCleaner)
+                        .setMedicalDataSourceHelper(mMedicalDataSourceHelper)
+                        .setMedicalResourceHelper(mMedicalResourceHelper)
+                        .setMigrationStateManager(mMigrationStateManager)
+                        .setMigrationUiStateManager(mMigrationUiStateManager)
+                        .setAppInfoHelper(mAppInfoHelper)
+                        .setAppInfoHelper(mAppInfoHelper)
+                        .setTimeSource(mFakeTimeSource)
                         .build();
 
         mHealthConnectService =
                 new HealthConnectServiceImpl(
-                        mTransactionManager,
-                        mDeviceConfigManager,
-                        mHealthConnectPermissionHelper,
-                        mMigrationCleaner,
-                        mFirstGrantTimeManager,
-                        mMigrationStateManager,
-                        mMigrationUiStateManager,
                         mServiceContext,
-                        mMedicalResourceHelper,
-                        mMedicalDataSourceHelper,
+                        healthConnectInjector.getTimeSource(),
+                        healthConnectInjector.getInternalHealthConnectMappings(),
+                        healthConnectInjector.getTransactionManager(),
+                        healthConnectInjector.getHealthConnectPermissionHelper(),
+                        healthConnectInjector.getFirstGrantTimeManager(),
+                        healthConnectInjector.getMigrationEntityHelper(),
+                        healthConnectInjector.getMigrationStateManager(),
+                        healthConnectInjector.getMigrationUiStateManager(),
+                        healthConnectInjector.getMigrationCleaner(),
+                        healthConnectInjector.getMedicalResourceHelper(),
+                        healthConnectInjector.getMedicalDataSourceHelper(),
                         healthConnectInjector.getExportManager(),
                         healthConnectInjector.getExportImportSettingsStorage(),
+                        healthConnectInjector.getBackupRestore(),
                         healthConnectInjector.getAccessLogsHelper(),
-                        healthConnectInjector.getHealthDataCategoryPriorityHelper());
+                        healthConnectInjector.getHealthDataCategoryPriorityHelper(),
+                        healthConnectInjector.getActivityDateHelper(),
+                        healthConnectInjector.getChangeLogsHelper(),
+                        healthConnectInjector.getChangeLogsRequestHelper(),
+                        healthConnectInjector.getPriorityMigrationHelper(),
+                        healthConnectInjector.getAppInfoHelper(),
+                        healthConnectInjector.getDeviceInfoHelper(),
+                        healthConnectInjector.getPreferenceHelper(),
+                        healthConnectInjector.getDatabaseHelpers(),
+                        healthConnectInjector.getPreferencesManager());
+        mBackupRestore = healthConnectInjector.getBackupRestore();
     }
 
     @After
     public void tearDown() throws TimeoutException {
-        TestUtils.waitForAllScheduledTasksToComplete();
-        deleteDir(mMockDataDirectory);
+        waitForAllScheduledTasksToComplete();
         clearInvocations(mPreferenceHelper);
+        clearInvocations(mPreferencesManager);
     }
 
     @Test
@@ -380,7 +439,7 @@
                 new StageRemoteDataRequest(pfdsByFileName), mUserHandle, callback);
 
         verify(callback, timeout(5000).times(1)).onResult();
-        var stagedFileNames = mHealthConnectService.getStagedRemoteFileNames(mUserHandle);
+        var stagedFileNames = mBackupRestore.getStagedRemoteFileNames(mUserHandle);
         assertThat(stagedFileNames.size()).isEqualTo(2);
         assertThat(stagedFileNames.contains(testRestoreFile1.getName())).isTrue();
         assertThat(stagedFileNames.contains(testRestoreFile2.getName())).isTrue();
@@ -408,7 +467,7 @@
                 new StageRemoteDataRequest(pfdsByFileName), mUserHandle, callback);
 
         verify(callback, timeout(5000).times(1)).onError(any());
-        var stagedFileNames = mHealthConnectService.getStagedRemoteFileNames(mUserHandle);
+        var stagedFileNames = mBackupRestore.getStagedRemoteFileNames(mUserHandle);
         assertThat(stagedFileNames.size()).isEqualTo(1);
         assertThat(stagedFileNames.contains(testRestoreFile2.getName())).isTrue();
     }
@@ -440,7 +499,7 @@
                 new StageRemoteDataRequest(pfdsByFileName), mUserHandle, callback);
 
         verify(callback, timeout(5000)).onResult();
-        var stagedFileNames = mHealthConnectService.getStagedRemoteFileNames(mUserHandle);
+        var stagedFileNames = mBackupRestore.getStagedRemoteFileNames(mUserHandle);
         assertThat(stagedFileNames.size()).isEqualTo(2);
         assertThat(stagedFileNames.contains(testRestoreFile1.getName())).isTrue();
         assertThat(stagedFileNames.contains(testRestoreFile2.getName())).isTrue();
@@ -471,7 +530,7 @@
                 new StageRemoteDataRequest(pfdsByFileName), mUserHandle, callback);
 
         verify(callback, timeout(5000)).onResult();
-        var stagedFileNames = mHealthConnectService.getStagedRemoteFileNames(mUserHandle);
+        var stagedFileNames = mBackupRestore.getStagedRemoteFileNames(mUserHandle);
         assertThat(stagedFileNames.size()).isEqualTo(0);
     }
 
@@ -489,7 +548,7 @@
         setUpPassingPermissionCheckFor(MIGRATE_HEALTH_CONNECT_DATA);
         mHealthConnectService.startMigration(
                 MigrationTestUtils.MOCK_CONFIGURED_PACKAGE, mMigrationCallback);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
         verifyZeroInteractions(mMigrationStateManager);
         verify(mMigrationCallback).onError(any(MigrationException.class));
     }
@@ -503,7 +562,7 @@
         MigrationTestUtils.setResolveActivityResult(new ResolveInfo(), mPackageManager);
         mHealthConnectService.startMigration(
                 MigrationTestUtils.MOCK_CONFIGURED_PACKAGE, mMigrationCallback);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
         verify(mMigrationStateManager).startMigration(mServiceContext);
     }
 
@@ -513,7 +572,7 @@
         setUpPassingPermissionCheckFor(MIGRATE_HEALTH_CONNECT_DATA);
         mHealthConnectService.finishMigration(
                 MigrationTestUtils.MOCK_CONFIGURED_PACKAGE, mMigrationCallback);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
         verifyZeroInteractions(mMigrationStateManager);
         verify(mMigrationCallback).onError(any(MigrationException.class));
     }
@@ -527,7 +586,7 @@
         MigrationTestUtils.setResolveActivityResult(new ResolveInfo(), mPackageManager);
         mHealthConnectService.finishMigration(
                 MigrationTestUtils.MOCK_CONFIGURED_PACKAGE, mMigrationCallback);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
         verify(mMigrationStateManager).finishMigration(mServiceContext);
     }
 
@@ -539,7 +598,7 @@
                 MigrationTestUtils.MOCK_CONFIGURED_PACKAGE,
                 mock(MigrationEntityParcel.class),
                 mMigrationCallback);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
         verifyZeroInteractions(mMigrationStateManager);
         verify(mMigrationCallback).onError(any(MigrationException.class));
     }
@@ -555,7 +614,7 @@
                 MigrationTestUtils.MOCK_CONFIGURED_PACKAGE,
                 mock(MigrationEntityParcel.class),
                 mMigrationCallback);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
         verify(mMigrationStateManager).validateWriteMigrationData();
         verify(mMigrationCallback).onSuccess();
     }
@@ -566,7 +625,7 @@
         setUpPassingPermissionCheckFor(MIGRATE_HEALTH_CONNECT_DATA);
         mHealthConnectService.insertMinDataMigrationSdkExtensionVersion(
                 MigrationTestUtils.MOCK_CONFIGURED_PACKAGE, 0, mMigrationCallback);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
         verifyZeroInteractions(mMigrationStateManager);
         verify(mMigrationCallback).onError(any(MigrationException.class));
     }
@@ -580,7 +639,7 @@
         MigrationTestUtils.setResolveActivityResult(new ResolveInfo(), mPackageManager);
         mHealthConnectService.insertMinDataMigrationSdkExtensionVersion(
                 MigrationTestUtils.MOCK_CONFIGURED_PACKAGE, 0, mMigrationCallback);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
         verify(mMigrationStateManager).validateSetMinSdkVersion();
         verify(mMigrationCallback).onSuccess();
     }
@@ -591,7 +650,7 @@
         mHealthConnectService.configureScheduledExport(
                 new ScheduledExportSettings.Builder().setUri(Uri.parse(TEST_URI)).build(),
                 mUserHandle);
-        Thread.sleep(500);
+        awaitAllExecutorsIdle();
 
         assertThat(mInternalTaskScheduler.getCompletedTaskCount()).isEqualTo(taskCount + 1);
     }
@@ -611,13 +670,14 @@
         for (Method m : allMethods) {
             assertWithMessage(
                             "Method '%s' does not belong to either"
-                                + " BLOCK_CALLS_DURING_DATA_SYNC_LIST or"
-                                + " DO_NOT_BLOCK_CALLS_DURING_DATA_SYNC_LIST. Make sure the method"
-                                + " implementation includes a section blocking calls during data"
-                                + " sync, then add the method to BLOCK_CALLS_DURING_DATA_SYNC_LIST"
-                                + " (check the Javadoc for this constant for more details). If the"
-                                + " method must allow calls during data sync, add it to"
-                                + " DO_NOT_BLOCK_CALLS_DURING_DATA_SYNC_LIST.",
+                                    + " BLOCK_CALLS_DURING_DATA_SYNC_LIST or"
+                                    + " DO_NOT_BLOCK_CALLS_DURING_DATA_SYNC_LIST. Make sure the"
+                                    + " method implementation includes a section blocking calls"
+                                    + " during data sync, then add the method to"
+                                    + " BLOCK_CALLS_DURING_DATA_SYNC_LIST (check the Javadoc for"
+                                    + " this constant for more details). If the method must allow"
+                                    + " calls during data sync, add it to"
+                                    + " DO_NOT_BLOCK_CALLS_DURING_DATA_SYNC_LIST.",
                             m.getName())
                     .that(
                             DO_NOT_BLOCK_CALLS_DURING_DATA_SYNC_LIST.contains(m.getName())
@@ -649,6 +709,53 @@
     }
 
     @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testGetMedicalDataSourcesByIds_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.getMedicalDataSourcesByIds(
+                mAttributionSource,
+                List.of(UUID.randomUUID().toString()),
+                mMedicalDataSourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testGetMedicalDataSourcesByIds_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.getMedicalDataSourcesByIds(
+                mAttributionSource,
+                List.of(UUID.randomUUID().toString()),
+                mMedicalDataSourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(GET_MEDICAL_DATA_SOURCES_BY_IDS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(GET_MEDICAL_DATA_SOURCES_BY_IDS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+    }
+
+    @Test
     @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalDataSources_byIds_flagOff_throws() throws Exception {
         mHealthConnectService.getMedicalDataSourcesByIds(
@@ -661,11 +768,11 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byIds_hasDataManagementPermission_callsHelper()
             throws RemoteException {
         setUpPhrMocksWithIrrelevantResponses();
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
 
         mHealthConnectService.getMedicalDataSourcesByIds(
                 mAttributionSource, List.of(DATA_SOURCE_ID), mMedicalDataSourcesResponseCallback);
@@ -677,7 +784,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byIds_noReadWritePermissions_throws() throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
 
@@ -691,7 +798,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byIds_onlyWritePermission_callsHelper()
             throws RemoteException {
         setUpPhrMocksWithIrrelevantResponses();
@@ -714,12 +821,12 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byIds_bothReadWritePermissions_callsHelper()
             throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
 
         mHealthConnectService.getMedicalDataSourcesByIds(
@@ -731,7 +838,7 @@
                 .getMedicalDataSourcesByIdsWithPermissionChecks(
                         eq(List.of(DATA_SOURCE_UUID)),
                         /* GrantedReadMedicalResourceTypes= */ eq(
-                                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)),
+                                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES)),
                         eq(mTestPackageName),
                         /* hasWritePermission= */ eq(true),
                         anyBoolean(),
@@ -739,11 +846,11 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byIds_onlyReadPermissions_callsHelper() throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
 
         mHealthConnectService.getMedicalDataSourcesByIds(
                 mAttributionSource, List.of(DATA_SOURCE_ID), mMedicalDataSourcesResponseCallback);
@@ -754,7 +861,7 @@
                 .getMedicalDataSourcesByIdsWithPermissionChecks(
                         eq(List.of(DATA_SOURCE_UUID)),
                         /* GrantedReadMedicalResourceTypes= */ eq(
-                                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)),
+                                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES)),
                         eq(mTestPackageName),
                         /* hasWritePermission= */ eq(false),
                         anyBoolean(),
@@ -762,11 +869,11 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byIds_fromForeground_callsHelper() throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(true);
 
@@ -786,40 +893,14 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalDataSources_byIds_fromBgNoBgRead_callsHelper() throws Exception {
-        setUpPhrMocksWithIrrelevantResponses();
-        setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
-        setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
-        when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(false);
-
-        mHealthConnectService.getMedicalDataSourcesByIds(
-                mAttributionSource, List.of(DATA_SOURCE_ID), mMedicalDataSourcesResponseCallback);
-
-        verify(mMedicalDataSourcesResponseCallback, timeout(5000)).onResult(any());
-        verify(mMedicalDataSourcesResponseCallback, never()).onError(any());
-        verify(mMedicalDataSourceHelper, times(1))
-                .getMedicalDataSourcesByIdsWithPermissionChecks(
-                        eq(List.of(DATA_SOURCE_UUID)),
-                        any(),
-                        eq(mTestPackageName),
-                        anyBoolean(),
-                        /* isCalledFromBgWithoutBgRead= */ eq(true),
-                        eq(mAppInfoHelper));
-    }
-
-    @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byIds_fromBgNoBgReadPerm_callsHelper() throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        setBackendReadPermission(PERMISSION_DENIED);
+        setBackgroundReadPermission(PERMISSION_DENIED);
 
         mHealthConnectService.getMedicalDataSourcesByIds(
                 mAttributionSource, List.of(DATA_SOURCE_ID), mMedicalDataSourcesResponseCallback);
@@ -837,16 +918,15 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byIds_fromBgWithBgReadPerm_callsHelper()
             throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        setBackendReadPermission(PERMISSION_GRANTED);
+        setBackgroundReadPermission(PackageManager.PERMISSION_GRANTED);
 
         mHealthConnectService.getMedicalDataSourcesByIds(
                 mAttributionSource, List.of(DATA_SOURCE_ID), mMedicalDataSourcesResponseCallback);
@@ -864,6 +944,71 @@
     }
 
     @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testGetMedicalDataSourcesByIds_maxPageSizeExceeded_throws() throws RemoteException {
+        List<String> ids = new ArrayList<>(MAXIMUM_PAGE_SIZE + 1);
+        for (int i = 0; i < MAXIMUM_PAGE_SIZE + 1; i++) {
+            ids.add(UUID.randomUUID().toString());
+        }
+
+        mHealthConnectService.getMedicalDataSourcesByIds(
+                mAttributionSource, ids, mMedicalDataSourcesResponseCallback);
+
+        verify(mMedicalDataSourcesResponseCallback, timeout(5000).times(1))
+                .onError(mErrorCaptor.capture());
+        HealthConnectException exception = mErrorCaptor.getValue().getHealthConnectException();
+        assertThat(exception.getErrorCode()).isEqualTo(ERROR_INVALID_ARGUMENT);
+        assertThat(exception.getMessage()).contains("The number of requested IDs must be <= 5000");
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testGetMedicalDataSourcesByRequests_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.getMedicalDataSourcesByRequest(
+                mAttributionSource,
+                getGetMedicalDataSourceRequest(Set.of("com.abc")),
+                mMedicalDataSourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testGetMedicalDataSourcesByRequests_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.getMedicalDataSourcesByRequest(
+                mAttributionSource,
+                getGetMedicalDataSourceRequest(Set.of("com.abc")),
+                mMedicalDataSourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(GET_MEDICAL_DATA_SOURCES_BY_REQUESTS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(GET_MEDICAL_DATA_SOURCES_BY_REQUESTS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+    }
+
+    @Test
     @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetMedicalDataSource_byRequest_flagOff_throws() throws Exception {
         mHealthConnectService.getMedicalDataSourcesByRequest(
@@ -878,11 +1023,11 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byRequest_hasDataManagementPermission_callsHelper()
             throws RemoteException {
         setUpPhrMocksWithIrrelevantResponses();
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
         Set<String> packageNames = Set.of("com.foo", "com.bar");
 
         mHealthConnectService.getMedicalDataSourcesByRequest(
@@ -897,7 +1042,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byRequest_noReadWritePermissions_throws()
             throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
@@ -914,7 +1059,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byRequest_onlyWritePermission_callsHelper()
             throws RemoteException {
         setUpPhrMocksWithIrrelevantResponses();
@@ -939,12 +1084,12 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byRequest_bothReadWritePermissions_callsHelper()
             throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         Set<String> packageNames = Set.of("com.foo", "com.bar");
 
@@ -959,19 +1104,19 @@
                 .getMedicalDataSourcesByPackageWithPermissionChecks(
                         eq(packageNames),
                         /* GrantedReadMedicalResourceTypes= */ eq(
-                                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)),
+                                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES)),
                         eq(mTestPackageName),
                         /* hasWritePermission= */ eq(true),
                         anyBoolean());
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byRequest_onlyReadPermissions_callsHelper()
             throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         Set<String> packageNames = Set.of("com.foo", "com.bar");
 
         mHealthConnectService.getMedicalDataSourcesByRequest(
@@ -985,18 +1130,18 @@
                 .getMedicalDataSourcesByPackageWithPermissionChecks(
                         eq(packageNames),
                         /* GrantedReadMedicalResourceTypes= */ eq(
-                                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)),
+                                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES)),
                         eq(mTestPackageName),
                         /* hasWritePermission= */ eq(false),
                         anyBoolean());
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byRequest_fromForeground_callsHelper() throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(true);
         Set<String> packageNames = Set.of("com.foo", "com.bar");
@@ -1018,43 +1163,15 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testGetMedicalDataSources_byRequest_fromBgNoBgRead_callsHelper() throws Exception {
-        setUpPhrMocksWithIrrelevantResponses();
-        setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
-        setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
-        when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(false);
-        Set<String> packageNames = Set.of("com.foo", "com.bar");
-
-        mHealthConnectService.getMedicalDataSourcesByRequest(
-                mAttributionSource,
-                getGetMedicalDataSourceRequest(packageNames),
-                mMedicalDataSourcesResponseCallback);
-
-        verify(mMedicalDataSourcesResponseCallback, timeout(5000)).onResult(any());
-        verify(mMedicalDataSourcesResponseCallback, never()).onError(any());
-        verify(mMedicalDataSourceHelper, times(1))
-                .getMedicalDataSourcesByPackageWithPermissionChecks(
-                        eq(packageNames),
-                        any(),
-                        eq(mTestPackageName),
-                        anyBoolean(),
-                        /* isCalledFromBgWithoutBgRead= */ eq(true));
-    }
-
-    @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byRequest_fromBgNoBgReadPerm_callsHelper()
             throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        setBackendReadPermission(PERMISSION_DENIED);
+        setBackgroundReadPermission(PERMISSION_DENIED);
         Set<String> packageNames = Set.of("com.foo", "com.bar");
 
         mHealthConnectService.getMedicalDataSourcesByRequest(
@@ -1074,16 +1191,15 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetMedicalDataSources_byRequest_fromBgWithBgReadPerm_callsHelper()
             throws Exception {
         setUpPhrMocksWithIrrelevantResponses();
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        setBackendReadPermission(PERMISSION_GRANTED);
+        setBackgroundReadPermission(PackageManager.PERMISSION_GRANTED);
         Set<String> packageNames = Set.of("com.foo", "com.bar");
 
         mHealthConnectService.getMedicalDataSourcesByRequest(
@@ -1114,6 +1230,118 @@
     }
 
     @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testUpsertMedicalResources_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.upsertMedicalResources(
+                mAttributionSource,
+                List.of(
+                        new UpsertMedicalResourceRequest.Builder(
+                                        DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                                .build()),
+                mMedicalResourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testUpsertMedicalResourcesFromRequestsParcel_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.upsertMedicalResourcesFromRequestsParcel(
+                mAttributionSource,
+                new UpsertMedicalResourceRequestsParcel(
+                        List.of(
+                                new UpsertMedicalResourceRequest.Builder(
+                                                DATA_SOURCE_ID,
+                                                FHIR_VERSION_R4,
+                                                FHIR_DATA_IMMUNIZATION)
+                                        .build())),
+                mMedicalResourceListParcelResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testUpsertMedicalResources_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.upsertMedicalResources(
+                mAttributionSource,
+                List.of(
+                        new UpsertMedicalResourceRequest.Builder(
+                                        DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                                .build()),
+                mMedicalResourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(UPSERT_MEDICAL_RESOURCES),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(UPSERT_MEDICAL_RESOURCES),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testUpsertMedicalResourcesFromRequestsParcel_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.upsertMedicalResourcesFromRequestsParcel(
+                mAttributionSource,
+                new UpsertMedicalResourceRequestsParcel(
+                        List.of(
+                                new UpsertMedicalResourceRequest.Builder(
+                                                DATA_SOURCE_ID,
+                                                FHIR_VERSION_R4,
+                                                FHIR_DATA_IMMUNIZATION)
+                                        .build())),
+                mMedicalResourceListParcelResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(UPSERT_MEDICAL_RESOURCES),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(UPSERT_MEDICAL_RESOURCES),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+    }
+
+    @Test
     @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testUpsertMedicalResources_flagOff_throws() throws Exception {
         IMedicalResourcesResponseCallback callback = mock(IMedicalResourcesResponseCallback.class);
@@ -1133,6 +1361,184 @@
 
     @Test
     @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    public void testUpsertMedicalResourcesFromRequestsParcel_flagOff_throws() throws Exception {
+
+        mHealthConnectService.upsertMedicalResourcesFromRequestsParcel(
+                mAttributionSource,
+                new UpsertMedicalResourceRequestsParcel(
+                        List.of(
+                                new UpsertMedicalResourceRequest.Builder(
+                                                DATA_SOURCE_ID,
+                                                FHIR_VERSION_R4,
+                                                FHIR_DATA_IMMUNIZATION)
+                                        .build())),
+                mMedicalResourceListParcelResponseCallback);
+
+        verify(mMedicalResourceListParcelResponseCallback, timeout(5000).times(1))
+                .onError(mErrorCaptor.capture());
+        assertThat(mErrorCaptor.getValue().getHealthConnectException().getErrorCode())
+                .isEqualTo(ERROR_UNSUPPORTED_OPERATION);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testReadMedicalResourcesByRequests_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+        mFakeTimeSource.setInstant(NOW);
+
+        mHealthConnectService.readMedicalResourcesByRequest(
+                mAttributionSource,
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build()
+                        .toParcel(),
+                mReadMedicalResourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        verify(mPreferencesManager, never()).setLastPhrReadMedicalResourcesApiTimeStamp(any());
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testReadMedicalResourcesByRequests_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+        mFakeTimeSource.setInstant(NOW);
+
+        mHealthConnectService.readMedicalResourcesByRequest(
+                mAttributionSource,
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build()
+                        .toParcel(),
+                mReadMedicalResourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(READ_MEDICAL_RESOURCES_BY_REQUESTS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(READ_MEDICAL_RESOURCES_BY_REQUESTS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                List.of(
+                        HEALTH_CONNECT_PHR_API_INVOKED__MEDICAL_RESOURCE_TYPE__MEDICAL_RESOURCE_TYPE_VACCINES),
+                1);
+        verify(mPreferencesManager, times(1)).setLastPhrReadMedicalResourcesApiTimeStamp(eq(NOW));
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void
+            testReadMedicalResourcesByRequests_telemetryFlagOnAndHasDataManagementPermission_expectMonthlyTimeStamp()
+                    throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+        mFakeTimeSource.setInstant(NOW);
+        setDataManagementPermission(PERMISSION_GRANTED);
+
+        mHealthConnectService.readMedicalResourcesByRequest(
+                mAttributionSource,
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build()
+                        .toParcel(),
+                mReadMedicalResourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertThat(mPreferencesManager.getPhrLastReadMedicalResourcesApiTimeStamp()).isNull();
+        verify(mPreferencesManager, times(1)).setLastPhrReadMedicalResourcesApiTimeStamp(eq(NOW));
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testReadMedicalResourcesByIds_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+        mFakeTimeSource.setInstant(NOW);
+
+        mHealthConnectService.readMedicalResourcesByIds(
+                mAttributionSource,
+                List.of(getMedicalResourceId()),
+                mReadMedicalResourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        verify(mPreferencesManager, never()).setLastPhrReadMedicalResourcesApiTimeStamp(any());
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testReadMedicalResourcesByIds_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+        mFakeTimeSource.setInstant(NOW);
+
+        mHealthConnectService.readMedicalResourcesByIds(
+                mAttributionSource,
+                List.of(getMedicalResourceId()),
+                mReadMedicalResourcesResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(READ_MEDICAL_RESOURCES_BY_IDS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(READ_MEDICAL_RESOURCES_BY_IDS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        verify(mPreferencesManager, times(1)).setLastPhrReadMedicalResourcesApiTimeStamp(eq(NOW));
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void
+            testReadMedicalResourcesByIds_telemetryFlagOnAndHasDataManagementPermission_expectMonthlyTimeStamp()
+                    throws TimeoutException {
+        setUpSuccessfulMocksForPhrTelemetry();
+        mFakeTimeSource.setInstant(NOW);
+        setDataManagementPermission(PERMISSION_GRANTED);
+
+        mHealthConnectService.readMedicalResourcesByIds(
+                mAttributionSource,
+                List.of(getMedicalResourceId()),
+                mReadMedicalResourcesResponseCallback);
+
+        waitForAllScheduledTasksToComplete();
+        verify(mPreferencesManager, times(1)).setLastPhrReadMedicalResourcesApiTimeStamp(eq(NOW));
+    }
+
+    @Test
+    @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testReadMedicalResources_byIds_flagOff_throws() throws Exception {
         mHealthConnectService.readMedicalResourcesByIds(
                 mAttributionSource,
@@ -1146,10 +1552,10 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_hasDataManagementPermission_callsHelper()
             throws RemoteException {
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
         setUpPhrMocksWithIrrelevantResponses();
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
 
@@ -1163,7 +1569,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_noReadWritePermissions_throws() throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
 
@@ -1179,7 +1585,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_onlyWritePermission_callsHelper()
             throws RemoteException {
         setDataManagementPermission(PERMISSION_DENIED);
@@ -1202,7 +1608,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_numberOfIdsTooLarge_expectException()
             throws RemoteException {
         setDataManagementPermission(PERMISSION_DENIED);
@@ -1219,15 +1625,15 @@
         verify(mReadMedicalResourcesResponseCallback, timeout(5000).times(1))
                 .onError(mErrorCaptor.capture());
         assertThat(mErrorCaptor.getValue().getHealthConnectException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+                .isEqualTo(ERROR_INVALID_ARGUMENT);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_bothReadWritePermissions_callsHelper()
             throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         setUpPhrMocksWithIrrelevantResponses();
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
@@ -1241,17 +1647,17 @@
                 .readMedicalResourcesByIdsWithPermissionChecks(
                         eq(ids),
                         /* grantedReadMedicalResourceTypes= */ eq(
-                                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)),
+                                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES)),
                         eq(mTestPackageName),
                         /* hasWritePermission= */ eq(true),
                         anyBoolean());
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_onlyReadPermissions_callsHelper() throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setUpPhrMocksWithIrrelevantResponses();
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
 
@@ -1264,17 +1670,17 @@
                 .readMedicalResourcesByIdsWithPermissionChecks(
                         eq(ids),
                         /* grantedReadMedicalResourceTypes= */ eq(
-                                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)),
+                                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES)),
                         eq(mTestPackageName),
                         /* hasWritePermission= */ eq(false),
                         anyBoolean());
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_fromForeground_callsHelper() throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         setUpPhrMocksWithIrrelevantResponses();
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(true);
@@ -1295,40 +1701,14 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testReadMedicalResources_byIds_fromBgNoBgRead_callsHelper() throws Exception {
-        setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
-        setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
-        setUpPhrMocksWithIrrelevantResponses();
-        when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(false);
-        List<MedicalResourceId> ids = List.of(getMedicalResourceId());
-
-        mHealthConnectService.readMedicalResourcesByIds(
-                mAttributionSource, ids, mReadMedicalResourcesResponseCallback);
-
-        verify(mReadMedicalResourcesResponseCallback, timeout(5000)).onResult(any());
-        verify(mReadMedicalResourcesResponseCallback, never()).onError(any());
-        verify(mMedicalResourceHelper, times(1))
-                .readMedicalResourcesByIdsWithPermissionChecks(
-                        eq(ids),
-                        any(),
-                        eq(mTestPackageName),
-                        anyBoolean(),
-                        /* isCalledFromBgWithoutBgRead= */ eq(true));
-    }
-
-    @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_fromBgNoBgReadPerm_callsHelper() throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         setUpPhrMocksWithIrrelevantResponses();
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        setBackendReadPermission(PERMISSION_DENIED);
+        setBackgroundReadPermission(PERMISSION_DENIED);
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
 
         mHealthConnectService.readMedicalResourcesByIds(
@@ -1346,15 +1726,14 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byIds_fromBgWithBgReadPerm_callsHelper() throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         setUpPhrMocksWithIrrelevantResponses();
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        setBackendReadPermission(PERMISSION_GRANTED);
+        setBackgroundReadPermission(PackageManager.PERMISSION_GRANTED);
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
 
         mHealthConnectService.readMedicalResourcesByIds(
@@ -1376,7 +1755,7 @@
     public void testReadMedicalResources_byRequest_flagOff_throws() throws Exception {
         mHealthConnectService.readMedicalResourcesByRequest(
                 mAttributionSource,
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build()
                         .toParcel(),
                 mReadMedicalResourcesResponseCallback);
@@ -1388,14 +1767,14 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byRequest_hasDataManagementPermission_callsHelper()
             throws RemoteException {
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
         setUpPhrMocksWithIrrelevantResponses();
 
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         mHealthConnectService.readMedicalResourcesByRequest(
                 mAttributionSource, request.toParcel(), mReadMedicalResourcesResponseCallback);
@@ -1409,14 +1788,14 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byRequest_noReadWritePermissions_throws()
             throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
 
         mHealthConnectService.readMedicalResourcesByRequest(
                 mAttributionSource,
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build()
                         .toParcel(),
                 mReadMedicalResourcesResponseCallback);
@@ -1428,14 +1807,14 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byRequest_onlyWritePermission_selfReads()
             throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         setUpPhrMocksWithIrrelevantResponses();
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         mHealthConnectService.readMedicalResourcesByRequest(
@@ -1452,15 +1831,16 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byRequest_bothReadWritePermissions_selfReads()
             throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
         setUpPhrMocksWithIrrelevantResponses();
+        setBackgroundReadPermission(PERMISSION_DENIED);
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         mHealthConnectService.readMedicalResourcesByRequest(
@@ -1477,15 +1857,15 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byRequest_onlyReadPermission_foreground_noSelfReads()
             throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setUpPhrMocksWithIrrelevantResponses();
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(true);
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         mHealthConnectService.readMedicalResourcesByRequest(
@@ -1502,44 +1882,16 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testReadMedicalResources_byRequest_onlyReadPermission_bgNoReadFeature_selfReads()
-            throws Exception {
-        setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
-        setUpPhrMocksWithIrrelevantResponses();
-        when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(false);
-        setBackendReadPermission(PERMISSION_DENIED);
-        ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .build();
-
-        mHealthConnectService.readMedicalResourcesByRequest(
-                mAttributionSource, request.toParcel(), mReadMedicalResourcesResponseCallback);
-
-        verify(mReadMedicalResourcesResponseCallback, timeout(5000)).onResult(any());
-        verify(mReadMedicalResourcesResponseCallback, never()).onError(any());
-        verify(mMedicalResourceHelper, times(1))
-                .readMedicalResourcesByRequestWithPermissionChecks(
-                        eq(PhrPageTokenWrapper.from(request.toParcel())),
-                        eq(request.getPageSize()),
-                        eq(mTestPackageName),
-                        /* enforceSelfRead= */ eq(true));
-    }
-
-    @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byRequest_onlyReadPermission_bgNoReadPerm_selfReads()
             throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setUpPhrMocksWithIrrelevantResponses();
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        setBackendReadPermission(PERMISSION_DENIED);
+        setBackgroundReadPermission(PERMISSION_DENIED);
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         mHealthConnectService.readMedicalResourcesByRequest(
@@ -1556,17 +1908,16 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testReadMedicalResources_byRequest_onlyReadPermission_withBgRead_noSelfReads()
             throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
-        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_IMMUNIZATION);
+        setDataReadWritePermissionGranted(READ_MEDICAL_DATA_VACCINES);
         setUpPhrMocksWithIrrelevantResponses();
         when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(false);
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        setBackendReadPermission(PERMISSION_GRANTED);
+        setBackgroundReadPermission(PackageManager.PERMISSION_GRANTED);
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         mHealthConnectService.readMedicalResourcesByRequest(
@@ -1583,12 +1934,10 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testUpsertMedicalResources_hasDataManagementPermission_throws()
             throws RemoteException {
-        setDataManagementPermission(PERMISSION_GRANTED);
-
-        IMedicalResourcesResponseCallback callback = mock(IMedicalResourcesResponseCallback.class);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
 
         mHealthConnectService.upsertMedicalResources(
                 mAttributionSource,
@@ -1596,15 +1945,39 @@
                         new UpsertMedicalResourceRequest.Builder(
                                         DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
                                 .build()),
-                callback);
+                mMedicalResourcesResponseCallback);
 
-        verify(callback, timeout(5000).times(1)).onError(mErrorCaptor.capture());
+        verify(mMedicalResourcesResponseCallback, timeout(5000).times(1))
+                .onError(mErrorCaptor.capture());
         assertThat(mErrorCaptor.getValue().getHealthConnectException().getErrorCode())
                 .isEqualTo(HealthConnectException.ERROR_SECURITY);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResourcesFromRequestsParcel_hasDataManagementPermission_throws()
+            throws RemoteException {
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
+
+        mHealthConnectService.upsertMedicalResourcesFromRequestsParcel(
+                mAttributionSource,
+                new UpsertMedicalResourceRequestsParcel(
+                        List.of(
+                                new UpsertMedicalResourceRequest.Builder(
+                                                DATA_SOURCE_ID,
+                                                FHIR_VERSION_R4,
+                                                FHIR_DATA_IMMUNIZATION)
+                                        .build())),
+                mMedicalResourceListParcelResponseCallback);
+
+        verify(mMedicalResourceListParcelResponseCallback, timeout(5000).times(1))
+                .onError(mErrorCaptor.capture());
+        assertThat(mErrorCaptor.getValue().getHealthConnectException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testUpsertMedicalResources_noWriteMedicalDataPermission_throws() throws Exception {
         IMedicalResourcesResponseCallback callback = mock(IMedicalResourcesResponseCallback.class);
 
@@ -1622,11 +1995,32 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void testUpsertMedicalResourcesFromRequestsParcel_noWriteMedicalDataPermission_throws()
+            throws Exception {
+        mHealthConnectService.upsertMedicalResourcesFromRequestsParcel(
+                mAttributionSource,
+                new UpsertMedicalResourceRequestsParcel(
+                        List.of(
+                                new UpsertMedicalResourceRequest.Builder(
+                                                DATA_SOURCE_ID,
+                                                FHIR_VERSION_R4,
+                                                FHIR_DATA_IMMUNIZATION)
+                                        .build())),
+                mMedicalResourceListParcelResponseCallback);
+
+        verify(mMedicalResourceListParcelResponseCallback, timeout(5000).times(1))
+                .onError(mErrorCaptor.capture());
+        assertThat(mErrorCaptor.getValue().getHealthConnectException().getErrorCode())
+                .isEqualTo(HealthConnectException.ERROR_SECURITY);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testCreateMedicalDataSource_hasDataManagementPermission_throws()
             throws RemoteException {
         setUpCreateMedicalDataSourceDefaultMocks();
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
 
         mHealthConnectService.createMedicalDataSource(
                 mAttributionSource,
@@ -1639,7 +2033,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testCreateMedicalDataSource_transactionManagerSqlLiteException_throws()
             throws RemoteException {
         setUpCreateMedicalDataSourceDefaultMocks();
@@ -1659,7 +2053,54 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testCreateMedicalDataSource_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.createMedicalDataSource(
+                mAttributionSource,
+                getCreateMedicalDataSourceRequest(),
+                mMedicalDataSourceCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testCreateMedicalDataSource_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.createMedicalDataSource(
+                mAttributionSource,
+                getCreateMedicalDataSourceRequest(),
+                mMedicalDataSourceCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(CREATE_MEDICAL_DATA_SOURCE),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(CREATE_MEDICAL_DATA_SOURCE),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testCreateMedicalDataSource_noWriteMedicalDataPermission_throws()
             throws RemoteException {
         setUpCreateMedicalDataSourceDefaultMocks();
@@ -1675,25 +2116,67 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testDeleteMedicalDataSourceWithData_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.deleteMedicalDataSourceWithData(
+                mAttributionSource, UUID.randomUUID().toString(), mEmptyResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testDeleteMedicalDataSourceWithData_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.deleteMedicalDataSourceWithData(
+                mAttributionSource, UUID.randomUUID().toString(), mEmptyResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(DELETE_MEDICAL_DATA_SOURCE_WITH_DATA),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(DELETE_MEDICAL_DATA_SOURCE_WITH_DATA),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalDataSourceWithData_badId_fails() throws RemoteException {
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
         doThrow(new IllegalArgumentException())
                 .when(mMedicalDataSourceHelper)
-                .deleteMedicalDataSource(any(), any());
+                .deleteMedicalDataSourceWithoutPermissionChecks(any());
 
         mHealthConnectService.deleteMedicalDataSourceWithData(mAttributionSource, "foo", callback);
 
         verify(callback, timeout(5000)).onError(mErrorCaptor.capture());
         HealthConnectException exception = mErrorCaptor.getValue().getHealthConnectException();
-        assertThat(exception.getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+        assertThat(exception.getErrorCode()).isEqualTo(ERROR_INVALID_ARGUMENT);
         verifyNoMoreInteractions(callback);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalDataSourceWithData_noPermission_fails() throws RemoteException {
         setDataManagementPermission(PERMISSION_DENIED);
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
@@ -1703,7 +2186,8 @@
                                 id.toString(),
                                 DATA_SOURCE_PACKAGE_NAME,
                                 DATA_SOURCE_FHIR_BASE_URI,
-                                DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
         when(mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
                         List.of(id)))
@@ -1719,7 +2203,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalDataSourceWithData_wrongPackage_fails() throws RemoteException {
         setDataManagementPermission(PERMISSION_DENIED);
         setDataReadWritePermissionGranted(WRITE_MEDICAL_DATA);
@@ -1730,14 +2214,15 @@
                                 id.toString(),
                                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME,
                                 DATA_SOURCE_FHIR_BASE_URI,
-                                DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
         when(mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
                         List.of(id)))
                 .thenReturn(List.of(datasource));
         doThrow(new IllegalArgumentException())
                 .when(mMedicalDataSourceHelper)
-                .deleteMedicalDataSource(any(), any());
+                .deleteMedicalDataSourceWithPermissionChecks(any(), any());
 
         mHealthConnectService.deleteMedicalDataSourceWithData(
                 mAttributionSource, id.toString(), callback);
@@ -1745,14 +2230,13 @@
         verify(callback, timeout(5000)).onError(mErrorCaptor.capture());
         verifyNoMoreInteractions(callback);
         HealthConnectException exception = mErrorCaptor.getValue().getHealthConnectException();
-        assertThat(exception.getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_INVALID_ARGUMENT);
+        assertThat(exception.getErrorCode()).isEqualTo(ERROR_INVALID_ARGUMENT);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalDataSourceWithData_existingId_succeeds() throws RemoteException {
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
         UUID id = UUID.randomUUID();
         MedicalDataSource datasource =
@@ -1760,7 +2244,8 @@
                                 id.toString(),
                                 DATA_SOURCE_PACKAGE_NAME,
                                 DATA_SOURCE_FHIR_BASE_URI,
-                                DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
         when(mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
                         List.of(id)))
@@ -1793,7 +2278,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalResources_noIds_returns() throws RemoteException {
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
 
@@ -1804,7 +2289,50 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testDeleteMedicalResourcesByIds_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.deleteMedicalResourcesByIds(
+                mAttributionSource, List.of(getMedicalResourceId()), mEmptyResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testDeleteMedicalResourcesByIds_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+
+        mHealthConnectService.deleteMedicalResourcesByIds(
+                mAttributionSource, List.of(getMedicalResourceId()), mEmptyResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(DELETE_MEDICAL_RESOURCES_BY_IDS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(DELETE_MEDICAL_RESOURCES_BY_IDS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalResources_someIds_success() throws RemoteException {
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
 
@@ -1822,7 +2350,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalResources_noWriteMedicalDataPermission_throws() throws Exception {
         setDataManagementPermission(PERMISSION_DENIED);
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
@@ -1842,10 +2370,10 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalResources_dataManagementPermissionNothingThere_success()
             throws Exception {
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
 
         mHealthConnectService.deleteMedicalResourcesByIds(
@@ -1862,6 +2390,57 @@
     }
 
     @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testDeleteMedicalResourcesByRequests_telemetryFlagOff_expectNoLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(UUID.randomUUID().toString())
+                        .build();
+
+        mHealthConnectService.deleteMedicalResourcesByRequest(
+                mAttributionSource, request, mEmptyResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+        assertPhrApiPrivateWestWorldWrites(ArgumentMatchers::anyInt, ArgumentMatchers::anyInt, 0);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY_PRIVATE_WW
+    })
+    public void testDeleteMedicalResourcesByRequests_telemetryFlagOn_expectCorrectLogs()
+            throws InterruptedException {
+        setUpSuccessfulMocksForPhrTelemetry();
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(UUID.randomUUID().toString())
+                        .build();
+
+        mHealthConnectService.deleteMedicalResourcesByRequest(
+                mAttributionSource, request, mEmptyResponseCallback);
+
+        awaitAllExecutorsIdle();
+        assertPhrApiWestWorldWrites(
+                () -> eq(DELETE_MEDICAL_RESOURCES_BY_REQUESTS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+        assertPhrApiPrivateWestWorldWrites(
+                () -> eq(DELETE_MEDICAL_RESOURCES_BY_REQUESTS),
+                () -> eq(HEALTH_CONNECT_API_CALLED__API_STATUS__SUCCESS),
+                1);
+    }
+
+    @Test
     @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testDeleteMedicalResourcesByRequest_flagOff_throws() throws Exception {
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
@@ -1879,7 +2458,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalResourcesByRequest_noPermission_securityError()
             throws RemoteException {
         setDataManagementPermission(PERMISSION_DENIED);
@@ -1899,7 +2478,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalResourcesByRequest_nonExistentRequest_success()
             throws RemoteException {
         when(mAppInfoHelper.getAppInfoId(any())).thenReturn(DEFAULT_PACKAGE_APP_INFO);
@@ -1922,10 +2501,10 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalResourcesByRequest_nonExistentRequestHasManagement_success()
             throws RemoteException {
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
@@ -1940,14 +2519,14 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testDeleteMedicalResourcesByRequest_requestWithFhirType_success()
             throws RemoteException {
-        setDataManagementPermission(PERMISSION_GRANTED);
+        setDataManagementPermission(PackageManager.PERMISSION_GRANTED);
         IEmptyResponseCallback callback = mock(IEmptyResponseCallback.class);
         DeleteMedicalResourcesRequest request =
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         mHealthConnectService.deleteMedicalResourcesByRequest(
@@ -1970,23 +2549,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
-    public void testQueryAllMedicalResourceTypeInfos_noDataManagementPermission_throws()
-            throws Exception {
-        doThrow(SecurityException.class)
-                .when(mServiceContext)
-                .enforcePermission(eq(MANAGE_HEALTH_DATA_PERMISSION), anyInt(), anyInt(), isNull());
-        IMedicalResourceTypeInfosCallback callback = mock(IMedicalResourceTypeInfosCallback.class);
-
-        mHealthConnectService.queryAllMedicalResourceTypeInfos(callback);
-
-        verify(callback, timeout(5000).times(1)).onError(mErrorCaptor.capture());
-        assertThat(mErrorCaptor.getValue().getHealthConnectException().getErrorCode())
-                .isEqualTo(HealthConnectException.ERROR_SECURITY);
-    }
-
-    @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetAllContributorAppInfoIds_noDataManagementPermission_throws()
             throws Exception {
         doThrow(SecurityException.class)
@@ -2003,14 +2566,42 @@
 
     @Test
     public void testUserSwitching() throws TimeoutException {
-        doNothing()
-                .when(mHealthDataCategoryPriorityHelper)
-                .maybeAddContributingAppsToPriorityList(mContext);
-
         mHealthConnectService.onUserSwitching(mUserHandle);
 
         waitForAllScheduledTasksToComplete();
-        verify(mHealthDataCategoryPriorityHelper).maybeAddContributingAppsToPriorityList(any());
+    }
+
+    /**
+     * Sets up the mocks so all checks are bypassed and all PHR API calls are successful. Although,
+     * notably data management permission is denied so the logs are logged in {@link
+     * com.android.server.healthconnect.logging.HealthConnectServiceLogger}.
+     */
+    private void setUpSuccessfulMocksForPhrTelemetry() {
+        setDataManagementPermission(PERMISSION_DENIED);
+        when(mPermissionManager.checkPermissionForPreflight(any(), any()))
+                .thenReturn(PermissionManager.PERMISSION_GRANTED);
+        when(mPermissionManager.checkPermissionForDataDelivery(any(), any(), any()))
+                .thenReturn(PermissionManager.PERMISSION_GRANTED);
+        when(mAppOpsManagerLocal.isUidInForeground(anyInt())).thenReturn(true);
+        ExtendedMockito.doNothing()
+                .when(
+                        () ->
+                                RateLimiter.tryAcquireApiCallQuota(
+                                        anyInt(),
+                                        eq(QUOTA_CATEGORY_WRITE),
+                                        anyBoolean(),
+                                        anyLong()));
+        ExtendedMockito.doNothing()
+                .when(
+                        () ->
+                                RateLimiter.tryAcquireApiCallQuota(
+                                        anyInt(),
+                                        eq(QUOTA_CATEGORY_READ),
+                                        anyBoolean(),
+                                        anyLong()));
+        ExtendedMockito.doNothing().when(() -> RateLimiter.checkMaxChunkMemoryUsage(anyLong()));
+        ExtendedMockito.doNothing().when(() -> RateLimiter.checkMaxRecordMemoryUsage(anyLong()));
+        setUpPhrMocksWithIrrelevantResponses();
     }
 
     private void setUpCreateMedicalDataSourceDefaultMocks() {
@@ -2039,10 +2630,26 @@
                 .thenReturn(List.of());
         when(mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
                         any(), anyInt()))
-                .thenReturn(new ReadMedicalResourcesInternalResponse(List.of(), null));
+                .thenReturn(new ReadMedicalResourcesInternalResponse(List.of(), null, 0));
         when(mMedicalResourceHelper.readMedicalResourcesByRequestWithPermissionChecks(
                         any(), anyInt(), anyString(), anyBoolean()))
-                .thenReturn(new ReadMedicalResourcesInternalResponse(List.of(), null));
+                .thenReturn(new ReadMedicalResourcesInternalResponse(List.of(), null, 0));
+        when(mMedicalResourceHelper.upsertMedicalResources(any(), any())).thenReturn(List.of());
+        doNothing()
+                .when(mMedicalResourceHelper)
+                .deleteMedicalResourcesByIdsWithoutPermissionChecks(any());
+        doNothing()
+                .when(mMedicalResourceHelper)
+                .deleteMedicalResourcesByIdsWithPermissionChecks(any(), any());
+        doNothing()
+                .when(mMedicalResourceHelper)
+                .deleteMedicalResourcesByRequestWithoutPermissionChecks(any());
+        doNothing()
+                .when(mMedicalResourceHelper)
+                .deleteMedicalResourcesByRequestWithPermissionChecks(any(), any());
+
+        when(mMedicalDataSourceHelper.createMedicalDataSource(any(), any(), any()))
+                .thenReturn(getMedicalDataSourceRequiredFieldsOnly());
         when(mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(any()))
                 .thenReturn(List.of());
         when(mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
@@ -2055,12 +2662,78 @@
                 .thenReturn(List.of());
     }
 
+    // Suppliers must to be used because Matchers can't be passed directly through method calls.
+    // See https://stackoverflow.com/a/55297901
+    private static void assertPhrApiWestWorldWrites(
+            Supplier<Integer> apiMethodMatcherSupplier,
+            Supplier<Integer> apiStatusMatcherSupplier,
+            int wantedNumberOfInvocations) {
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_API_CALLED),
+                                apiMethodMatcherSupplier.get(),
+                                apiStatusMatcherSupplier.get(),
+                                anyInt(),
+                                anyLong(),
+                                anyInt(),
+                                anyInt(),
+                                anyInt(),
+                                eq(THIS_TEST_PACKAGE_NAME)),
+                times(wantedNumberOfInvocations));
+    }
+
+    /**
+     * {@code wantedNumberOfInvocations} indicates the wanted number of invocations for <b>each
+     * item</b> in {@code medicalResourceTypes}.
+     */
+    // Suppliers must to be used because Matchers can't be passed directly through method calls.
+    // See https://stackoverflow.com/a/55297901
+    private static void assertPhrApiPrivateWestWorldWrites(
+            Supplier<Integer> apiMethodMatcherSupplier,
+            Supplier<Integer> apiStatusMatcherSupplier,
+            Collection<Integer> medicalResourceTypes,
+            int wantedNumberOfInvocations) {
+        for (int medicalResourceType : medicalResourceTypes) {
+            ExtendedMockito.verify(
+                    () ->
+                            HealthFitnessStatsLog.write(
+                                    eq(HEALTH_CONNECT_PHR_API_INVOKED),
+                                    apiMethodMatcherSupplier.get(),
+                                    apiStatusMatcherSupplier.get(),
+                                    eq(THIS_TEST_PACKAGE_NAME),
+                                    eq(medicalResourceType)),
+                    times(wantedNumberOfInvocations));
+        }
+    }
+
+    /**
+     * This method should be used instead of {@link #assertPhrApiPrivateWestWorldWrites(Supplier,
+     * Supplier, Collection, int)} when medical resource type is irrelevant.
+     */
+    // Suppliers must to be used because Matchers can't be passed directly through method calls.
+    // See https://stackoverflow.com/a/55297901
+    private static void assertPhrApiPrivateWestWorldWrites(
+            Supplier<Integer> apiMethodMatcherSupplier,
+            Supplier<Integer> apiStatusMatcherSupplier,
+            int wantedNumberOfInvocations) {
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PHR_API_INVOKED),
+                                apiMethodMatcherSupplier.get(),
+                                apiStatusMatcherSupplier.get(),
+                                eq(THIS_TEST_PACKAGE_NAME),
+                                eq(MEDICAL_RESOURCE_TYPE_NOT_ASSIGNED_DEFAULT_VALUE)),
+                times(wantedNumberOfInvocations));
+    }
+
     private void setDataManagementPermission(int result) {
         when(mServiceContext.checkPermission(eq(MANAGE_HEALTH_DATA_PERMISSION), anyInt(), anyInt()))
                 .thenReturn(result);
     }
 
-    private void setBackendReadPermission(int result) {
+    private void setBackgroundReadPermission(int result) {
         when(mServiceContext.checkPermission(
                         eq(READ_HEALTH_DATA_IN_BACKGROUND), anyInt(), anyInt()))
                 .thenReturn(result);
@@ -2109,23 +2782,11 @@
         return file;
     }
 
-    private static void deleteDir(File dir) {
-        File[] files = dir.listFiles();
-        if (files != null) {
-            for (var file : files) {
-                if (file.isDirectory()) {
-                    deleteDir(file);
-                } else {
-                    assertThat(file.delete()).isTrue();
-                }
-            }
-        }
-        assertWithMessage(
-                        "Directory "
-                                + dir.getAbsolutePath()
-                                + " is not empty, Files present = "
-                                + Arrays.toString(dir.list()))
-                .that(dir.delete())
-                .isTrue();
+    /**
+     * Waits until all executors in {@link HealthConnectServiceImpl} idle. For now this just waits
+     * for a fixed duration with {@link Thread#sleep(long)}, this could be improved later.
+     */
+    private static void awaitAllExecutorsIdle() throws InterruptedException {
+        Thread.sleep(500);
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/HealthConnectThreadSchedulerTest.java b/tests/unittests/src/com/android/server/healthconnect/HealthConnectThreadSchedulerTest.java
index 56860da..369303d 100644
--- a/tests/unittests/src/com/android/server/healthconnect/HealthConnectThreadSchedulerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/HealthConnectThreadSchedulerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.server.healthconnect;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.when;
 
 import android.app.ActivityManager;
@@ -25,8 +27,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
-import com.google.common.truth.Truth;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,6 +34,7 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.List;
+import java.util.concurrent.Future;
 import java.util.concurrent.ThreadPoolExecutor;
 
 @RunWith(AndroidJUnit4.class)
@@ -130,10 +131,10 @@
 
     @Test
     public void testHealthConnectSchedulerClear() {
-        Truth.assertThat(mInternalTaskSchedulerCompletedJobs).isEqualTo(0);
-        Truth.assertThat(mControllerTaskSchedulerCompletedJobs).isEqualTo(0);
-        Truth.assertThat(mForegroundTaskSchedulerCompletedJobs).isEqualTo(0);
-        Truth.assertThat(mBackgroundTaskSchedulerCompletedJobs).isEqualTo(0);
+        assertThat(mInternalTaskSchedulerCompletedJobs).isEqualTo(0);
+        assertThat(mControllerTaskSchedulerCompletedJobs).isEqualTo(0);
+        assertThat(mForegroundTaskSchedulerCompletedJobs).isEqualTo(0);
+        assertThat(mBackgroundTaskSchedulerCompletedJobs).isEqualTo(0);
     }
 
     @Test
@@ -145,4 +146,31 @@
         HealthConnectThreadScheduler.scheduleInternalTask(() -> {});
         HealthConnectThreadScheduler.scheduleControllerTask(() -> {});
     }
+
+    @Test
+    public void testInternalSchedulerThreadName() throws Exception {
+        Future<String> name = mInternalTaskScheduler.submit(() -> Thread.currentThread().getName());
+        assertThat(name.get()).isEqualTo("hc-int-bg-0");
+    }
+
+    @Test
+    public void testControllerSchedulerThreadName() throws Exception {
+        Future<String> name =
+                mControllerTaskScheduler.submit(() -> Thread.currentThread().getName());
+        assertThat(name.get()).startsWith("hc-ctrl-");
+    }
+
+    @Test
+    public void testForegroundSchedulerThreadName() throws Exception {
+        Future<String> name =
+                mForegroundTaskScheduler.submit(() -> Thread.currentThread().getName());
+        assertThat(name.get()).startsWith("hc-fg-0");
+    }
+
+    @Test
+    public void testBackgroundSchedulerThreadName() throws Exception {
+        Future<String> name =
+                mBackgroundTaskScheduler.submit(() -> Thread.currentThread().getName());
+        assertThat(name.get()).isEqualTo("hc-bg-0");
+    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/HealthConnectUserContextTest.java b/tests/unittests/src/com/android/server/healthconnect/HealthConnectUserContextTest.java
deleted file mode 100644
index 6d2178e..0000000
--- a/tests/unittests/src/com/android/server/healthconnect/HealthConnectUserContextTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.healthconnect;
-
-import android.os.UserHandle;
-
-import androidx.test.platform.app.InstrumentationRegistry;
-
-
-import com.google.common.truth.Truth;
-
-import org.junit.Test;
-
-public class HealthConnectUserContextTest {
-    @Test
-    public void testHealthConnectUserContext() {
-        HealthConnectUserContext healthConnectUserContext =
-                new HealthConnectUserContext(
-                        InstrumentationRegistry.getInstrumentation().getContext(),
-                        UserHandle.SYSTEM);
-        Truth.assertThat(healthConnectUserContext.getCurrentUserHandle().getIdentifier())
-                .isEqualTo(UserHandle.SYSTEM.getIdentifier());
-    }
-}
diff --git a/tests/unittests/src/com/android/server/healthconnect/SQLiteDatabaseFixture.java b/tests/unittests/src/com/android/server/healthconnect/SQLiteDatabaseFixture.java
new file mode 100644
index 0000000..3df8639
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/SQLiteDatabaseFixture.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
+
+import static org.mockito.ArgumentMatchers.any;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.util.Log;
+
+import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
+import com.android.modules.utils.testing.StaticMockFixture;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A fixture for use with {@link com.android.modules.utils.testing.ExtendedMockitoRule} that spies
+ * {@link SQLiteDatabase#openDatabase(File, SQLiteDatabase.OpenParams)} and closes and deletes all
+ * opened databases at the end of the test.
+ */
+public class SQLiteDatabaseFixture implements StaticMockFixture {
+
+    private static final String TAG = "SQLiteDatabaseFixture";
+
+    private final List<SQLiteDatabase> mOpenedDatabases = new ArrayList<>();
+
+    @Override
+    public StaticMockitoSessionBuilder setUpMockedClasses(
+            StaticMockitoSessionBuilder sessionBuilder) {
+        return sessionBuilder.spyStatic(SQLiteDatabase.class);
+    }
+
+    @Override
+    public void setUpMockBehaviors() {
+        doAnswer(
+                        invocation -> {
+                            SQLiteDatabase database = (SQLiteDatabase) invocation.callRealMethod();
+                            mOpenedDatabases.add(database);
+                            return database;
+                        })
+                .when(() -> SQLiteDatabase.openDatabase(any(), any()));
+    }
+
+    @Override
+    public void tearDown() {
+        for (SQLiteDatabase database : mOpenedDatabases) {
+            while (database.isOpen()) {
+                database.close();
+            }
+            File path = new File(database.getPath());
+            if (path.exists()) {
+                if (!SQLiteDatabase.deleteDatabase(path)) {
+                    throw new IllegalStateException("Failed to delete " + path);
+                }
+                Log.v(TAG, "Deleted " + path);
+            }
+        }
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/TestUtils.java b/tests/unittests/src/com/android/server/healthconnect/TestUtils.java
index 8ffdc10..6ed9354 100644
--- a/tests/unittests/src/com/android/server/healthconnect/TestUtils.java
+++ b/tests/unittests/src/com/android/server/healthconnect/TestUtils.java
@@ -16,11 +16,10 @@
 
 package com.android.server.healthconnect;
 
-import android.app.UiAutomation;
+import android.database.DatabaseUtils;
 import android.os.UserHandle;
 
-import androidx.annotation.NonNull;
-import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.server.healthconnect.storage.HealthConnectDatabase;
 
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
@@ -75,22 +74,8 @@
                 15);
     }
 
-    public static long getInternalBackgroundExecutorTaskCount() {
-        return HealthConnectThreadScheduler.sInternalBackgroundExecutor.getTaskCount();
-    }
-
-    /** Runs a {@link Runnable} adopting a subset of Shell's permissions. */
-    public static void runWithShellPermissionIdentity(
-            @NonNull Runnable runnable, String... permissions) {
-        final UiAutomation uiAutomation =
-                InstrumentationRegistry.getInstrumentation().getUiAutomation();
-        uiAutomation.adoptShellPermissionIdentity(permissions);
-        try {
-            runnable.run();
-        } catch (Exception e) {
-            throw new RuntimeException("Caught exception", e);
-        } finally {
-            uiAutomation.dropShellPermissionIdentity();
-        }
+    /** Returns the number of rows in the specified table. */
+    public static long queryNumEntries(HealthConnectDatabase database, String tableName) {
+        return DatabaseUtils.queryNumEntries(database.getReadableDatabase(), tableName);
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreDatabaseHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreDatabaseHelperTest.java
new file mode 100644
index 0000000..2359d00
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreDatabaseHelperTest.java
@@ -0,0 +1,522 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.healthconnect.backuprestore;
+
+import static com.android.server.healthconnect.backuprestore.BackupRestoreDatabaseHelper.MAXIMUM_PAGE_SIZE;
+import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createBloodPressureRecord;
+import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createStepsRecord;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.content.Context;
+import android.health.connect.DeleteUsingFiltersRequest;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.TimeInstantRangeFilter;
+import android.health.connect.aidl.DeleteUsingFiltersRequestParcel;
+import android.health.connect.backuprestore.BackupChange;
+import android.health.connect.backuprestore.GetChangesForBackupResponse;
+import android.health.connect.datatypes.BloodPressureRecord;
+import android.health.connect.datatypes.StepsRecord;
+import android.health.connect.internal.datatypes.BloodPressureRecordInternal;
+import android.health.connect.internal.datatypes.RecordInternal;
+import android.health.connect.internal.datatypes.StepsRecordInternal;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.BackupChangeTokenHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
+import com.android.server.healthconnect.storage.request.DeleteTableRequest;
+import com.android.server.healthconnect.storage.request.DeleteTransactionRequest;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/** Unit test for class {@link BackupRestoreDatabaseHelper}. */
+@RunWith(AndroidJUnit4.class)
+@EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+public class BackupRestoreDatabaseHelperTest {
+
+    private static final String TEST_PACKAGE_NAME = "test.package.name";
+    private static final long TEST_START_TIME_IN_MILLIS = 2000;
+    private static final long TEST_END_TIME_IN_MILLIS = 3000;
+    private static final int TEST_STEP_COUNT = 1345;
+    private static final int TEST_TIME_IN_MILLIS = 1234;
+    private static final double TEST_SYSTOLIC = 60.2;
+    private static final double TEST_DIASTOLIC = 92.6;
+    private static final String ACTIVE_CALORIES_BURNED_RECORD_TABLE =
+            "active_calories_burned_record_table";
+    private static final String BLOOD_PRESSURE_RECORD_TABLE = "blood_pressure_record_table";
+
+    private static Object deserializeRecordInternal(byte[] bytes)
+            throws IOException, ClassNotFoundException {
+        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
+                ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
+            return objectInputStream.readObject();
+        }
+    }
+
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .build();
+
+    private BackupRestoreDatabaseHelper mBackupRestoreDatabaseHelper;
+    private TransactionTestUtils mTransactionTestUtils;
+    private TransactionManager mTransactionManager;
+    private AccessLogsHelper mAccessLogsHelper;
+    private AppInfoHelper mAppInfoHelper;
+
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
+    @Before
+    public void setUp() {
+        Context context = ApplicationProvider.getApplicationContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .build();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+        mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
+        mAccessLogsHelper = healthConnectInjector.getAccessLogsHelper();
+
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+
+        DeviceInfoHelper deviceInfoHelper = healthConnectInjector.getDeviceInfoHelper();
+        HealthConnectMappings healthConnectMappings =
+                healthConnectInjector.getHealthConnectMappings();
+        InternalHealthConnectMappings internalHealthConnectMappings =
+                healthConnectInjector.getInternalHealthConnectMappings();
+        ChangeLogsHelper changeLogsHelper = healthConnectInjector.getChangeLogsHelper();
+        ChangeLogsRequestHelper changeLogsRequestHelper =
+                healthConnectInjector.getChangeLogsRequestHelper();
+
+        mBackupRestoreDatabaseHelper =
+                new BackupRestoreDatabaseHelper(
+                        mTransactionManager,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        deviceInfoHelper,
+                        healthConnectMappings,
+                        internalHealthConnectMappings,
+                        changeLogsHelper,
+                        changeLogsRequestHelper);
+    }
+
+    @Test
+    public void getChangesAndTokenFromDataTables_noRecordsInDb_noChangesReturned() {
+        List<BackupChange> changes =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables().getChanges();
+
+        assertThat(changes).isEmpty();
+    }
+
+    @Test
+    public void getChangesAndTokenFromDataTables_recordsInDb_correctRecordsReturned()
+            throws IOException, ClassNotFoundException {
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT),
+                createBloodPressureRecord(TEST_TIME_IN_MILLIS, TEST_SYSTOLIC, TEST_DIASTOLIC));
+
+        List<BackupChange> changes =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables().getChanges();
+
+        assertThat(changes.size()).isEqualTo(2);
+        BackupChange stepsRecordBackupChange = changes.get(0);
+        assertThat(stepsRecordBackupChange.getVersion()).isEqualTo(0);
+        assertThat(stepsRecordBackupChange.isDeletion()).isEqualTo(false);
+        StepsRecordInternal stepsRecord =
+                (StepsRecordInternal) deserializeRecordInternal(stepsRecordBackupChange.getData());
+        String uuid = stepsRecord.getUuid() != null ? stepsRecord.getUuid().toString() : null;
+        assertThat(stepsRecordBackupChange.getUid()).isEqualTo(uuid);
+        assertThat(stepsRecord.getCount()).isEqualTo(TEST_STEP_COUNT);
+        assertThat(stepsRecord.getStartTimeInMillis()).isEqualTo(TEST_START_TIME_IN_MILLIS);
+        assertThat(stepsRecord.getEndTimeInMillis()).isEqualTo(TEST_END_TIME_IN_MILLIS);
+        BackupChange bloodPressureBackupChange = changes.get(1);
+        assertThat(bloodPressureBackupChange.getVersion()).isEqualTo(0);
+        assertThat(stepsRecordBackupChange.isDeletion()).isEqualTo(false);
+        BloodPressureRecordInternal bloodPressureRecord =
+                (BloodPressureRecordInternal)
+                        deserializeRecordInternal(bloodPressureBackupChange.getData());
+        assertThat(bloodPressureRecord.getDiastolic()).isEqualTo(TEST_DIASTOLIC);
+        assertThat(bloodPressureRecord.getSystolic()).isEqualTo(TEST_SYSTOLIC);
+        assertThat(bloodPressureRecord.getTimeInMillis()).isEqualTo(TEST_TIME_IN_MILLIS);
+    }
+
+    @Test
+    public void getChangesFromDataTables_singleRecordsExceedPageSize_correctResponseReturned() {
+        List<RecordInternal<?>> records = new ArrayList<>();
+        for (int recordNumber = 0; recordNumber < MAXIMUM_PAGE_SIZE * 2; recordNumber++) {
+            records.add(
+                    createStepsRecord(
+                            // Add offsets to start time and end time for distinguishing different
+                            // records.
+                            TEST_START_TIME_IN_MILLIS + recordNumber,
+                            TEST_END_TIME_IN_MILLIS + recordNumber,
+                            TEST_STEP_COUNT));
+        }
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, records);
+
+        GetChangesForBackupResponse response =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+
+        assertThat(response.getChanges().size()).isEqualTo(MAXIMUM_PAGE_SIZE);
+        String nextChangeTokenRowId = response.getNextChangeToken();
+        assertThat(nextChangeTokenRowId).isEqualTo("1");
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, nextChangeTokenRowId);
+        // See {@link android.health.connect.PageTokenWrapper}.
+        assertThat(backupChangeToken.getDataTablePageToken()).isEqualTo(14000);
+        assertThat(backupChangeToken.getDataTableName()).isEqualTo("steps_record_table");
+        assertThat(backupChangeToken.getChangeLogsRequestToken()).isEqualTo("1");
+    }
+
+    @Test
+    public void getChangesFromDataTables_withSingleRecords_usingToken_correctResponseReturned() {
+        List<RecordInternal<?>> records = new ArrayList<>();
+        for (int recordNumber = 0; recordNumber < MAXIMUM_PAGE_SIZE * 2; recordNumber++) {
+            records.add(
+                    createStepsRecord(
+                            // Add offsets to start time and end time for distinguishing different
+                            // records.
+                            TEST_START_TIME_IN_MILLIS + recordNumber,
+                            TEST_END_TIME_IN_MILLIS + recordNumber,
+                            TEST_STEP_COUNT));
+        }
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, records);
+
+        GetChangesForBackupResponse firstResponse =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, firstResponse.getNextChangeToken());
+        GetChangesForBackupResponse secondResponse =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables(
+                        backupChangeToken.getDataTableName(),
+                        backupChangeToken.getDataTablePageToken(),
+                        backupChangeToken.getChangeLogsRequestToken());
+
+        assertThat(secondResponse.getChanges().size()).isEqualTo(MAXIMUM_PAGE_SIZE);
+        String secondChangeTokenRowId = secondResponse.getNextChangeToken();
+        assertThat(secondChangeTokenRowId).isEqualTo("2");
+        BackupChangeTokenHelper.BackupChangeToken secondBackupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, secondChangeTokenRowId);
+        assertThat(secondBackupChangeToken.getDataTablePageToken()).isEqualTo(-1);
+        assertThat(secondBackupChangeToken.getDataTableName())
+                .isEqualTo(ACTIVE_CALORIES_BURNED_RECORD_TABLE);
+        // Change logs token is still the same.
+        assertThat(secondBackupChangeToken.getChangeLogsRequestToken())
+                .isEqualTo(backupChangeToken.getChangeLogsRequestToken());
+    }
+
+    @Test
+    public void getChangesFromDataTables_mixedRecordsNotInSamePage_correctChangeTokenReturned() {
+        List<RecordInternal<?>> records = new ArrayList<>();
+        for (int recordNumber = 0; recordNumber < MAXIMUM_PAGE_SIZE; recordNumber++) {
+            records.add(
+                    createStepsRecord(
+                            // Add offsets to start time and end time for distinguishing different
+                            // records.
+                            TEST_START_TIME_IN_MILLIS + recordNumber,
+                            TEST_END_TIME_IN_MILLIS + recordNumber,
+                            TEST_STEP_COUNT));
+        }
+        records.add(createBloodPressureRecord(TEST_TIME_IN_MILLIS, TEST_SYSTOLIC, TEST_DIASTOLIC));
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, records);
+
+        GetChangesForBackupResponse response =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+
+        assertThat(response.getChanges().size()).isEqualTo(MAXIMUM_PAGE_SIZE);
+        String nextChangeTokenRowId = response.getNextChangeToken();
+        assertThat(nextChangeTokenRowId).isEqualTo("1");
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, nextChangeTokenRowId);
+        // All data in step_record_table has been returned, page token reset as -1.
+        assertThat(backupChangeToken.getDataTablePageToken()).isEqualTo(-1);
+        assertThat(backupChangeToken.getDataTableName())
+                .isEqualTo(ACTIVE_CALORIES_BURNED_RECORD_TABLE);
+        assertThat(backupChangeToken.getChangeLogsRequestToken()).isEqualTo("1");
+    }
+
+    @Test
+    public void getChangesFromDataTables_mixedRecordsNotInSamePage_usingToken_responseReturned() {
+        List<RecordInternal<?>> records = new ArrayList<>();
+        for (int recordNumber = 0; recordNumber < MAXIMUM_PAGE_SIZE; recordNumber++) {
+            records.add(
+                    createStepsRecord(
+                            // Add offsets to start time and end time for distinguishing different
+                            // records.
+                            TEST_START_TIME_IN_MILLIS + recordNumber,
+                            TEST_END_TIME_IN_MILLIS + recordNumber,
+                            TEST_STEP_COUNT));
+        }
+        records.add(createBloodPressureRecord(TEST_TIME_IN_MILLIS, TEST_SYSTOLIC, TEST_DIASTOLIC));
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, records);
+
+        GetChangesForBackupResponse firstResponse =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, firstResponse.getNextChangeToken());
+        GetChangesForBackupResponse secondResponse =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables(
+                        backupChangeToken.getDataTableName(),
+                        backupChangeToken.getDataTablePageToken(),
+                        backupChangeToken.getChangeLogsRequestToken());
+
+        assertThat(secondResponse.getChanges().size()).isEqualTo(1);
+        String secondChangeTokenRowId = secondResponse.getNextChangeToken();
+        assertThat(secondChangeTokenRowId).isEqualTo("2");
+        BackupChangeTokenHelper.BackupChangeToken secondBackupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, secondChangeTokenRowId);
+        assertThat(secondBackupChangeToken.getDataTablePageToken()).isEqualTo(-1);
+        assertThat(secondBackupChangeToken.getDataTableName()).isEqualTo(null);
+        // Change logs token is still the same.
+        assertThat(secondBackupChangeToken.getChangeLogsRequestToken())
+                .isEqualTo(backupChangeToken.getChangeLogsRequestToken());
+    }
+
+    @Test
+    public void getChangesFromDataTables_mixedRecordsWithinSamePage_correctChangeTokenReturned() {
+        List<RecordInternal<?>> records = new ArrayList<>();
+        // Create 2500 step records and 2501 blood pressure records.
+        for (int recordNumber = 0; recordNumber < MAXIMUM_PAGE_SIZE / 2; recordNumber++) {
+            records.add(
+                    createStepsRecord(
+                            // Add offsets to start time and end time for distinguishing different
+                            // records.
+                            TEST_START_TIME_IN_MILLIS + recordNumber,
+                            TEST_END_TIME_IN_MILLIS + recordNumber,
+                            TEST_STEP_COUNT));
+        }
+        for (int recordNumber = 0; recordNumber < MAXIMUM_PAGE_SIZE / 2 + 1; recordNumber++) {
+            records.add(
+                    createBloodPressureRecord(
+                            TEST_TIME_IN_MILLIS + recordNumber, TEST_SYSTOLIC, TEST_DIASTOLIC));
+        }
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, records);
+
+        GetChangesForBackupResponse response =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+
+        assertThat(response.getChanges().size()).isEqualTo(MAXIMUM_PAGE_SIZE);
+        String nextChangeTokenRowId = response.getNextChangeToken();
+        assertThat(nextChangeTokenRowId).isEqualTo("1");
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, nextChangeTokenRowId);
+        assertThat(backupChangeToken.getDataTablePageToken()).isEqualTo(7468);
+        assertThat(backupChangeToken.getDataTableName()).isEqualTo(BLOOD_PRESSURE_RECORD_TABLE);
+        assertThat(backupChangeToken.getChangeLogsRequestToken()).isEqualTo("1");
+    }
+
+    @Test
+    public void isChangeLogsTokenValid_tokenIsNull_invalid() {
+        assertThat(mBackupRestoreDatabaseHelper.isChangeLogsTokenValid(null)).isFalse();
+    }
+
+    @Test
+    public void isChangeLogsTokenValid_nextChangeLogNoLongerExists_invalid() {
+        RecordInternal<StepsRecord> stepRecord =
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT);
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, stepRecord);
+        GetChangesForBackupResponse response =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+        // Insert a blood pressure record and generate a change log so the previous returned token
+        // does not point to the end of the table.
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createBloodPressureRecord(TEST_TIME_IN_MILLIS, TEST_SYSTOLIC, TEST_DIASTOLIC));
+
+        // Delete some change logs.
+        mTransactionManager.delete(
+                new DeleteTableRequest(ChangeLogsHelper.TABLE_NAME, stepRecord.getRecordType()));
+
+        assertThat(
+                        mBackupRestoreDatabaseHelper.isChangeLogsTokenValid(
+                                response.getNextChangeToken()))
+                .isFalse();
+    }
+
+    @Test
+    public void isChangeLogsTokenValid_nextChangeLogExists_valid() {
+        RecordInternal<StepsRecord> stepRecord =
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT);
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, stepRecord);
+        GetChangesForBackupResponse response =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+        // Insert a blood pressure record and generate a change log so the previous returned token
+        // does not point to the end of the table.
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createBloodPressureRecord(TEST_TIME_IN_MILLIS, TEST_SYSTOLIC, TEST_DIASTOLIC));
+
+        assertThat(
+                        mBackupRestoreDatabaseHelper.isChangeLogsTokenValid(
+                                response.getNextChangeToken()))
+                .isTrue();
+    }
+
+    @Test
+    public void isChangeLogsTokenValid_tokenPointsToEndOfTable_valid() {
+        RecordInternal<StepsRecord> stepRecord =
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT);
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, stepRecord);
+        GetChangesForBackupResponse response =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+
+        assertThat(
+                        mBackupRestoreDatabaseHelper.isChangeLogsTokenValid(
+                                response.getNextChangeToken()))
+                .isTrue();
+    }
+
+    @Test
+    public void getIncrementalChanges_changeLogsTokenIsNull_throwsException() {
+        assertThrows(
+                IllegalStateException.class,
+                () -> mBackupRestoreDatabaseHelper.getIncrementalChanges(null));
+    }
+
+    @Test
+    public void getIncrementalChanges_upsertRecords_correctChangeReturned()
+            throws IOException, ClassNotFoundException {
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT));
+        // All data tables have been iterated through.
+        GetChangesForBackupResponse response =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, response.getNextChangeToken());
+
+        // Insert a new record and generate access logs.
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createBloodPressureRecord(TEST_TIME_IN_MILLIS, TEST_SYSTOLIC, TEST_DIASTOLIC));
+        GetChangesForBackupResponse secondResponse =
+                mBackupRestoreDatabaseHelper.getIncrementalChanges(
+                        backupChangeToken.getChangeLogsRequestToken());
+
+        assertThat(secondResponse.getChanges().size()).isEqualTo(1);
+        BackupChange bloodPressureBackupChange = secondResponse.getChanges().get(0);
+        assertThat(bloodPressureBackupChange.getVersion()).isEqualTo(0);
+        BloodPressureRecordInternal bloodPressureRecord =
+                (BloodPressureRecordInternal)
+                        deserializeRecordInternal(bloodPressureBackupChange.getData());
+        assertThat(bloodPressureRecord.getDiastolic()).isEqualTo(TEST_DIASTOLIC);
+        assertThat(bloodPressureRecord.getSystolic()).isEqualTo(TEST_SYSTOLIC);
+        assertThat(bloodPressureRecord.getTimeInMillis()).isEqualTo(TEST_TIME_IN_MILLIS);
+    }
+
+    @Test
+    public void getIncrementalChanges_includesDeletedRecords_correctChangeReturned() {
+        RecordInternal<BloodPressureRecord> bloodPressureRecordInternal =
+                createBloodPressureRecord(TEST_TIME_IN_MILLIS, TEST_SYSTOLIC, TEST_DIASTOLIC);
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT),
+                bloodPressureRecordInternal);
+        // All data tables have been iterated through.
+        GetChangesForBackupResponse response =
+                mBackupRestoreDatabaseHelper.getChangesAndTokenFromDataTables();
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, response.getNextChangeToken());
+
+        // Delete the blood pressure record.
+        DeleteUsingFiltersRequest deleteRequest =
+                new DeleteUsingFiltersRequest.Builder()
+                        .addRecordType(BloodPressureRecord.class)
+                        .setTimeRangeFilter(
+                                new TimeInstantRangeFilter.Builder()
+                                        .setStartTime(Instant.EPOCH)
+                                        .build())
+                        .build();
+        DeleteUsingFiltersRequestParcel parcel = new DeleteUsingFiltersRequestParcel(deleteRequest);
+        mTransactionManager.deleteAllRecords(
+                new DeleteTransactionRequest(TEST_PACKAGE_NAME, parcel, mAppInfoHelper),
+                /* shouldRecordDeleteAccessLogs= */ true,
+                mAccessLogsHelper);
+
+        GetChangesForBackupResponse secondResponse =
+                mBackupRestoreDatabaseHelper.getIncrementalChanges(
+                        backupChangeToken.getChangeLogsRequestToken());
+
+        assertThat(secondResponse.getChanges().size()).isEqualTo(1);
+        BackupChange deletedBloodPressureBackupChange = secondResponse.getChanges().get(0);
+        UUID bloodPressureRecordUuid = bloodPressureRecordInternal.getUuid();
+        assertThat(bloodPressureRecordUuid).isNotNull();
+        assertThat(deletedBloodPressureBackupChange.isDeletion()).isTrue();
+        assertThat(deletedBloodPressureBackupChange.getUid())
+                .isEqualTo(bloodPressureRecordUuid.toString());
+        assertThat(deletedBloodPressureBackupChange.getData()).isNull();
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreTest.java b/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreTest.java
index 91a4799..d94e8e9 100644
--- a/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreTest.java
@@ -24,6 +24,7 @@
 import static android.health.connect.HealthConnectManager.DATA_DOWNLOAD_RETRY;
 import static android.health.connect.HealthConnectManager.DATA_DOWNLOAD_STARTED;
 
+import static com.android.compatibility.common.util.SystemUtil.eventually;
 import static com.android.server.healthconnect.backuprestore.BackupRestore.BackupRestoreJobService.BACKUP_RESTORE_JOBS_NAMESPACE;
 import static com.android.server.healthconnect.backuprestore.BackupRestore.BackupRestoreJobService.EXTRA_JOB_NAME_KEY;
 import static com.android.server.healthconnect.backuprestore.BackupRestore.DATA_DOWNLOAD_STATE_KEY;
@@ -56,7 +57,6 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.timeout;
@@ -71,23 +71,27 @@
 import android.health.connect.HealthConnectManager;
 import android.health.connect.restore.BackupFileNamesSet;
 import android.health.connect.restore.StageRemoteDataRequest;
-import android.os.Environment;
 import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
 import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.util.ArrayMap;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
 import com.android.server.healthconnect.FakePreferenceHelper;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
 import com.android.server.healthconnect.migration.MigrationStateManager;
 import com.android.server.healthconnect.permission.FirstGrantTimeManager;
 import com.android.server.healthconnect.permission.GrantTimeXmlHelper;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.permission.UserGrantTimeState;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
@@ -117,10 +121,14 @@
     private static final String DATABASE_NAME = "healthconnect.db";
     private static final String GRANT_TIME_FILE_NAME = "health-permissions-first-grant-times.xml";
 
-    @Rule
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    private final EnvironmentFixture mEnvironmentFixture = new EnvironmentFixture();
+
+    @Rule(order = 2)
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
-                    .mockStatic(Environment.class)
                     .mockStatic(PreferenceHelper.class)
                     .mockStatic(TransactionManager.class)
                     .mockStatic(BackupRestore.BackupRestoreJobService.class)
@@ -128,12 +136,14 @@
                     .mockStatic(SQLiteDatabase.class)
                     .spyStatic(GrantTimeXmlHelper.class)
                     .setStrictness(Strictness.LENIENT)
+                    .addStaticMockFixtures(() -> mEnvironmentFixture)
                     .build();
 
     @Mock Context mServiceContext;
     @Mock private TransactionManager mTransactionManager;
-    @Mock private AppInfoHelper mAppInfoHelper;
     @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
     @Mock private MigrationStateManager mMockMigrationStateManager;
     @Mock private Context mContext;
     @Mock private JobScheduler mJobScheduler;
@@ -141,17 +151,14 @@
     private BackupRestore mBackupRestore;
     private final PreferenceHelper mFakePreferenceHelper = new FakePreferenceHelper();
     private UserHandle mUserHandle = UserHandle.of(UserHandle.myUserId());
-    private File mMockDataDirectory;
     private File mMockBackedDataDirectory;
     private File mMockStagedDataDirectory;
 
     @Before
     public void setUp() throws Exception {
         mContext = InstrumentationRegistry.getInstrumentation().getContext();
-        mMockDataDirectory = mContext.getDir("mock_data", Context.MODE_PRIVATE);
         mMockBackedDataDirectory = mContext.getDir("mock_backed_data", Context.MODE_PRIVATE);
         mMockStagedDataDirectory = mContext.getDir("mock_staged_data", Context.MODE_PRIVATE);
-        when(Environment.getDataDirectory()).thenReturn(mMockDataDirectory);
 
         when(mJobScheduler.forNamespace(BACKUP_RESTORE_JOBS_NAMESPACE)).thenReturn(mJobScheduler);
         when(mServiceContext.getUser()).thenReturn(mUserHandle);
@@ -162,8 +169,9 @@
                 HealthConnectInjectorImpl.newBuilderForTest(mContext)
                         .setPreferenceHelper(mFakePreferenceHelper)
                         .setMigrationStateManager(mMockMigrationStateManager)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
                         .setTransactionManager(mTransactionManager)
-                        .setAppInfoHelper(mAppInfoHelper)
                         .build();
 
         mBackupRestore =
@@ -180,11 +188,9 @@
 
     @After
     public void tearDown() {
-        FilesUtil.deleteDir(mMockDataDirectory);
         FilesUtil.deleteDir(mMockBackedDataDirectory);
         FilesUtil.deleteDir(mMockStagedDataDirectory);
         mFakePreferenceHelper.clearCache();
-        clearInvocations(mTransactionManager);
     }
 
     @Test
@@ -208,8 +214,10 @@
     }
 
     @Test
+    @DisableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DISABLE_D2D})
     public void testGetAllBackupData_forDeviceToDevice_copiesAllData() throws Exception {
-        File dbFileToBackup = createAndGetNonEmptyFile(mMockDataDirectory, DATABASE_NAME);
+        File dbFileToBackup =
+                createAndGetNonEmptyFile(mEnvironmentFixture.getDataDirectory(), DATABASE_NAME);
         File dbFileBacked = createAndGetEmptyFile(mMockBackedDataDirectory, STAGED_DATABASE_NAME);
         File grantTimeFileBacked =
                 createAndGetEmptyFile(mMockBackedDataDirectory, GRANT_TIME_FILE_NAME);
@@ -530,9 +538,11 @@
         when(SQLiteDatabase.openDatabase(any(), any())).thenReturn(mockDb);
 
         mBackupRestore.scheduleAllJobs();
-        Thread.sleep(2000);
-        assertThat(mFakePreferenceHelper.getPreference(DATA_RESTORE_STATE_KEY))
-                .isEqualTo(String.valueOf(INTERNAL_RESTORE_STATE_MERGING_DONE));
+
+        eventually(
+                () ->
+                        assertThat(mFakePreferenceHelper.getPreference(DATA_RESTORE_STATE_KEY))
+                                .isEqualTo(String.valueOf(INTERNAL_RESTORE_STATE_MERGING_DONE)));
     }
 
     @Test
diff --git a/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreWithoutMocksTest.java b/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreWithoutMocksTest.java
new file mode 100644
index 0000000..5bcc148
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupRestoreWithoutMocksTest.java
@@ -0,0 +1,549 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.backuprestore;
+
+import static com.android.server.healthconnect.TestUtils.queryNumEntries;
+import static com.android.server.healthconnect.backuprestore.BackupRestore.GRANT_TIME_FILE_NAME;
+import static com.android.server.healthconnect.backuprestore.BackupRestore.STAGED_DATABASE_DIR;
+import static com.android.server.healthconnect.backuprestore.BackupRestore.STAGED_DATABASE_NAME;
+import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createStepsRecord;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.health.connect.restore.StageRemoteDataRequest;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
+import android.healthconnect.cts.utils.AssumptionCheckerRule;
+import android.healthconnect.cts.utils.TestUtils;
+import android.os.Environment;
+import android.os.ParcelFileDescriptor;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.util.ArrayMap;
+import android.util.Pair;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.FakePreferenceHelper;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.GrantTimeXmlHelper;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.permission.UserGrantTimeState;
+import com.android.server.healthconnect.storage.HealthConnectDatabase;
+import com.android.server.healthconnect.storage.PhrTestUtils;
+import com.android.server.healthconnect.storage.StorageContext;
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
+import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.quality.Strictness;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(AndroidJUnit4.class)
+public class BackupRestoreWithoutMocksTest {
+    private static final String TEST_PACKAGE_NAME = "package.name";
+    private static final String DATA_SOURCE_SUFFIX = "ds1";
+    private static final String ORIGINAL_DATABASE_NAME = "healthconnect.db";
+    private static final Instant INSTANT_NOW = Instant.now();
+    private static final Instant INSTANT_NOW_PLUS_TEN_SEC = INSTANT_NOW.plusSeconds(10);
+    private static final Instant INSTANT_NOW_PLUS_TWENTY_SEC = INSTANT_NOW.plusSeconds(20);
+
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .mockStatic(Environment.class)
+                    .setStrictness(Strictness.LENIENT)
+                    .mockStatic(BackupRestore.BackupRestoreJobService.class)
+                    .build();
+
+    @Rule(order = 3)
+    public final HealthConnectDatabaseTestRule mDatabaseTestRule =
+            new HealthConnectDatabaseTestRule();
+
+    @Rule
+    public AssumptionCheckerRule mSupportedHardwareRule =
+            new AssumptionCheckerRule(
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
+
+    private StorageContext mContext;
+    private TransactionTestUtils mTransactionTestUtils;
+    private BackupRestore mBackupRestore;
+    private PhrTestUtils mPhrTestUtils;
+
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
+    @Before
+    public void setUp() throws Exception {
+        mContext = mDatabaseTestRule.getDatabaseContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(mContext)
+                        .setPreferenceHelper(new FakePreferenceHelper())
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .build();
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+
+        AppInfoHelper appInfoHelper = healthConnectInjector.getAppInfoHelper();
+        TransactionManager transactionManager = healthConnectInjector.getTransactionManager();
+        mBackupRestore =
+                new BackupRestore(
+                        appInfoHelper,
+                        mFirstGrantTimeManager,
+                        healthConnectInjector.getMigrationStateManager(),
+                        healthConnectInjector.getPreferenceHelper(),
+                        transactionManager,
+                        mContext,
+                        healthConnectInjector.getDeviceInfoHelper(),
+                        healthConnectInjector.getHealthDataCategoryPriorityHelper());
+
+        mPhrTestUtils = new PhrTestUtils(mContext, healthConnectInjector);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        StorageContext dbContext =
+                StorageContext.create(mContext, mContext.getUser(), STAGED_DATABASE_DIR);
+        File stagedDir = dbContext.getDataDir();
+        File[] allContents = stagedDir.listFiles();
+        if (allContents != null) {
+            for (File file : allContents) {
+                file.delete();
+            }
+        }
+        stagedDir.delete();
+    }
+
+    @Test
+    @EnableFlags({
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DISABLE_D2D
+    })
+    public void testGetAllDataForBackup_disableD2dFlagEnabled_copiesAllDataExceptPhr()
+            throws Exception {
+        // Insert a MedicalDataSource and MedicalResource.
+        MedicalDataSource dataSource =
+                mPhrTestUtils.insertR4MedicalDataSource("ds", TEST_PACKAGE_NAME);
+        mPhrTestUtils.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+        // Insert a Step record.
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 456, 7));
+        // Ensure the original database contains the inserted data above.
+        HealthConnectDatabase originalDatabase =
+                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "steps_record_table")).isEqualTo(1);
+
+        // Create the files where the database and the grant time files will be backed up to.
+        File dbFileBacked = createAndGetEmptyFile(mContext.getDataDir(), STAGED_DATABASE_NAME);
+        File grantTimeFileBacked =
+                createAndGetEmptyFile(mContext.getDataDir(), GRANT_TIME_FILE_NAME);
+        UserGrantTimeState userGrantTimeState =
+                new UserGrantTimeState(Map.of("package", Instant.now()), Map.of(), 1);
+        when(mFirstGrantTimeManager.getGrantTimeStateForUser(mContext.getUser()))
+                .thenReturn(userGrantTimeState);
+        // Prepare the pfds where the database and the grant time files are backed up to.
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                dbFileBacked.getName(),
+                ParcelFileDescriptor.open(dbFileBacked, ParcelFileDescriptor.MODE_READ_WRITE));
+        pfdsByFileName.put(
+                grantTimeFileBacked.getName(),
+                ParcelFileDescriptor.open(
+                        grantTimeFileBacked, ParcelFileDescriptor.MODE_READ_WRITE));
+
+        mBackupRestore.getAllDataForBackup(
+                new StageRemoteDataRequest(pfdsByFileName), mContext.getUser());
+
+        // Ensure the backed up database does not contain PHR data but includes everything else.
+        try (HealthConnectDatabase backupDatabase =
+                new HealthConnectDatabase(mContext, dbFileBacked.getName())) {
+            assertThat(queryNumEntries(backupDatabase, "medical_data_source_table")).isEqualTo(0);
+            assertThat(queryNumEntries(backupDatabase, "medical_resource_table")).isEqualTo(0);
+            assertThat(queryNumEntries(backupDatabase, "steps_record_table")).isEqualTo(1);
+        }
+        assertThat(GrantTimeXmlHelper.parseGrantTime(grantTimeFileBacked).toString())
+                .isEqualTo(userGrantTimeState.toString());
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DISABLE_D2D})
+    public void testGetAllDataForBackup_disableD2dFlagDisabled_copiesAllDataIncludingPhr()
+            throws Exception {
+        // Insert a MedicalDataSource and MedicalResource.
+        MedicalDataSource dataSource =
+                mPhrTestUtils.insertR4MedicalDataSource("ds", TEST_PACKAGE_NAME);
+        mPhrTestUtils.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+        // Insert a Step record.
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 456, 7));
+        // Ensure the original database contains the inserted data above.
+        HealthConnectDatabase originalDatabase =
+                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "steps_record_table")).isEqualTo(1);
+
+        // Create the files where the database and the grant time files will be backed up to.
+        File dbFileBacked = createAndGetEmptyFile(mContext.getDataDir(), STAGED_DATABASE_NAME);
+        File grantTimeFileBacked =
+                createAndGetEmptyFile(mContext.getDataDir(), GRANT_TIME_FILE_NAME);
+        UserGrantTimeState userGrantTimeState =
+                new UserGrantTimeState(Map.of("package", Instant.now()), Map.of(), 1);
+        when(mFirstGrantTimeManager.getGrantTimeStateForUser(mContext.getUser()))
+                .thenReturn(userGrantTimeState);
+        // Prepare the pfds where the database and the grant time files are backed up to.
+        Map<String, ParcelFileDescriptor> pfdsByFileName = new ArrayMap<>();
+        pfdsByFileName.put(
+                dbFileBacked.getName(),
+                ParcelFileDescriptor.open(dbFileBacked, ParcelFileDescriptor.MODE_READ_WRITE));
+        pfdsByFileName.put(
+                grantTimeFileBacked.getName(),
+                ParcelFileDescriptor.open(
+                        grantTimeFileBacked, ParcelFileDescriptor.MODE_READ_WRITE));
+
+        mBackupRestore.getAllDataForBackup(
+                new StageRemoteDataRequest(pfdsByFileName), mContext.getUser());
+
+        // Ensure the backed up database does not contain PHR data but includes everything else.
+        try (HealthConnectDatabase backupDatabase =
+                new HealthConnectDatabase(mContext, dbFileBacked.getName())) {
+            assertThat(queryNumEntries(backupDatabase, "medical_data_source_table")).isEqualTo(1);
+            assertThat(queryNumEntries(backupDatabase, "medical_resource_table")).isEqualTo(1);
+            assertThat(queryNumEntries(backupDatabase, "steps_record_table")).isEqualTo(1);
+        }
+        assertThat(GrantTimeXmlHelper.parseGrantTime(grantTimeFileBacked).toString())
+                .isEqualTo(userGrantTimeState.toString());
+    }
+
+    @Test
+    @EnableFlags({
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_ENABLE_D2D_AND_EXPORT_IMPORT
+    })
+    public void testMerge_withPhrMergeEnabled_over5000Resources_copiesAllPhrData()
+            throws Exception {
+        StorageContext dbContext =
+                StorageContext.create(mContext, mContext.getUser(), STAGED_DATABASE_DIR);
+        createAndGetEmptyFile(dbContext.getDataDir(), STAGED_DATABASE_NAME);
+        HealthConnectDatabase stagedDb = new HealthConnectDatabase(dbContext, STAGED_DATABASE_NAME);
+        mTransactionTestUtils.insertApp(stagedDb, TEST_PACKAGE_NAME);
+        Pair<Long, String> rowIdUuidPair =
+                mPhrTestUtils.insertMedicalDataSource(
+                        stagedDb, dbContext, DATA_SOURCE_SUFFIX, TEST_PACKAGE_NAME, INSTANT_NOW);
+        int numOfResources = 5100;
+        mPhrTestUtils.insertMedicalResources(
+                stagedDb,
+                PhrDataFactory::createVaccineMedicalResources,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TEN_SEC,
+                numOfResources);
+        assertThat(queryNumEntries(stagedDb, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_table")).isEqualTo(numOfResources);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_indices_table"))
+                .isEqualTo(numOfResources);
+        // Read the dataSources and lastModifiedTimestamps.
+        List<Pair<MedicalDataSource, Long>> dataSourceRowsStaged =
+                mPhrTestUtils.readMedicalDataSources(stagedDb);
+        // Read the medicalResources and lastModifiedTimestamps.
+        List<Pair<MedicalResource, Long>> medicalResourceRowsStaged =
+                mPhrTestUtils.readAllMedicalResources(stagedDb);
+
+        mBackupRestore.merge();
+
+        HealthConnectDatabase originalDatabase =
+                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table"))
+                .isEqualTo(numOfResources);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_indices_table"))
+                .isEqualTo(numOfResources);
+        // Read the dataSources and lastModifiedTimestamps of original db after merge.
+        List<Pair<MedicalDataSource, Long>> dataSourceRowsOriginal =
+                mPhrTestUtils.readMedicalDataSources(originalDatabase);
+        // Assert dataSources and their timestamps of the staged db is the same as original db.
+        assertThat(dataSourceRowsOriginal).isEqualTo(dataSourceRowsStaged);
+        // Read the medicalResources and lastModifiedTimestamps of original db after merge.
+        List<Pair<MedicalResource, Long>> medicalResourceRowsOriginal =
+                mPhrTestUtils.readAllMedicalResources(originalDatabase);
+        // Assert medicalResources and their timestamps of the staged db is the same as original db.
+        assertThat(medicalResourceRowsOriginal).hasSize(numOfResources);
+        assertThat(medicalResourceRowsOriginal).isEqualTo(medicalResourceRowsStaged);
+    }
+
+    @Test
+    @EnableFlags({
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_ENABLE_D2D_AND_EXPORT_IMPORT
+    })
+    public void testMerge_withPhrMergeEnabled_copiesAllPhrData() throws Exception {
+        StorageContext dbContext =
+                StorageContext.create(mContext, mContext.getUser(), STAGED_DATABASE_DIR);
+        createAndGetEmptyFile(dbContext.getDataDir(), STAGED_DATABASE_NAME);
+        HealthConnectDatabase stagedDb = new HealthConnectDatabase(dbContext, STAGED_DATABASE_NAME);
+        mTransactionTestUtils.insertApp(stagedDb, TEST_PACKAGE_NAME);
+        Pair<Long, String> rowIdUuidPair =
+                mPhrTestUtils.insertMedicalDataSource(
+                        stagedDb, dbContext, DATA_SOURCE_SUFFIX, TEST_PACKAGE_NAME, INSTANT_NOW);
+        mPhrTestUtils.insertMedicalResource(
+                stagedDb,
+                PhrDataFactory::createVaccineMedicalResource,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        mPhrTestUtils.insertMedicalResource(
+                stagedDb,
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TWENTY_SEC);
+        assertThat(queryNumEntries(stagedDb, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_table")).isEqualTo(2);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_indices_table")).isEqualTo(2);
+        // Read the dataSources and lastModifiedTimestamps.
+        List<Pair<MedicalDataSource, Long>> dataSourceRowsStaged =
+                mPhrTestUtils.readMedicalDataSources(stagedDb);
+        // Read the medicalResources and lastModifiedTimestamps.
+        List<Pair<MedicalResource, Long>> medicalResourceRowsStaged =
+                mPhrTestUtils.readAllMedicalResources(stagedDb);
+
+        mBackupRestore.merge();
+
+        HealthConnectDatabase originalDatabase =
+                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table")).isEqualTo(2);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_indices_table"))
+                .isEqualTo(2);
+        // Read the dataSources and lastModifiedTimestamps of original db after merge.
+        List<Pair<MedicalDataSource, Long>> dataSourceRowsOriginal =
+                mPhrTestUtils.readMedicalDataSources(originalDatabase);
+        // Assert dataSources and their timestamps of the staged db is the same as original db.
+        assertThat(dataSourceRowsOriginal).isEqualTo(dataSourceRowsStaged);
+        // Read the medicalResources and lastModifiedTimestamps of original db after merge.
+        List<Pair<MedicalResource, Long>> medicalResourceRowsOriginal =
+                mPhrTestUtils.readAllMedicalResources(originalDatabase);
+        // Assert medicalResources and their timestamps of the staged db is the same as original db.
+        assertThat(medicalResourceRowsOriginal).hasSize(2);
+        assertThat(medicalResourceRowsOriginal).isEqualTo(medicalResourceRowsStaged);
+    }
+
+    @Test
+    @EnableFlags({
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_ENABLE_D2D_AND_EXPORT_IMPORT
+    })
+    public void testMerge_withPhrMergeEnabled_doesNotCopyMedicalDataSourceDuplicates()
+            throws Exception {
+        // TODO(b/376645901): Improve the test to assert on the exact data in the two databases
+        // rather than just the database size.
+        // Insert a dataSource with display name using DATA_SOURCE_SUFFIX and TEST_PACKAGE_NAME.
+        MedicalDataSource dataSource =
+                mPhrTestUtils.insertR4MedicalDataSource(DATA_SOURCE_SUFFIX, TEST_PACKAGE_NAME);
+        // Insert an allergy medicalResource.
+        mPhrTestUtils.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource);
+        HealthConnectDatabase originalDatabase =
+                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
+        // Verify data exists.
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_indices_table"))
+                .isEqualTo(1);
+        // Create the staged db file.
+        StorageContext dbContext =
+                StorageContext.create(mContext, mContext.getUser(), STAGED_DATABASE_DIR);
+        createAndGetEmptyFile(dbContext.getDataDir(), STAGED_DATABASE_NAME);
+        HealthConnectDatabase stagedDb = new HealthConnectDatabase(dbContext, STAGED_DATABASE_NAME);
+        mTransactionTestUtils.insertApp(stagedDb, TEST_PACKAGE_NAME);
+        // Insert a dataSource with the same unique ids (displayName, appId) into the
+        // staged database.
+        Pair<Long, String> rowIdUuidPair =
+                mPhrTestUtils.insertMedicalDataSource(
+                        stagedDb, dbContext, DATA_SOURCE_SUFFIX, TEST_PACKAGE_NAME, INSTANT_NOW);
+        // Insert two different vaccine medicalResources associated with the dataSource we just
+        // created.
+        mPhrTestUtils.insertMedicalResource(
+                stagedDb,
+                PhrDataFactory::createVaccineMedicalResource,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        mPhrTestUtils.insertMedicalResource(
+                stagedDb,
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TWENTY_SEC);
+        assertThat(queryNumEntries(stagedDb, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_table")).isEqualTo(2);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_indices_table")).isEqualTo(2);
+
+        mBackupRestore.merge();
+
+        // We expect the medical_data_source table to contain 1 dataSource. Even though there was
+        // 1 dataSource in original database and 1 in the staged database, they both have the
+        // same unique ids so the one in the stagedDatabase will be ignored.
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(1);
+        // We expect 3 rows in both medical_resource and medical_resource_indices tables,
+        // since there was one medicalResource in the original database and two medicalResources
+        // in the staged database.
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table")).isEqualTo(3);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_indices_table"))
+                .isEqualTo(3);
+    }
+
+    @Test
+    @EnableFlags({
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_ENABLE_D2D_AND_EXPORT_IMPORT
+    })
+    public void testMerge_withPhrMergeEnabled_doesNotCopyMedicalResourceDuplicates()
+            throws Exception {
+        // Insert a dataSource with display name using DATA_SOURCE_SUFFIX and TEST_PACKAGE_NAME.
+        MedicalDataSource dataSource =
+                mPhrTestUtils.insertR4MedicalDataSource(DATA_SOURCE_SUFFIX, TEST_PACKAGE_NAME);
+        // Insert a vaccine medicalResource.
+        mPhrTestUtils.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+        HealthConnectDatabase originalDatabase =
+                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
+        // Verify data exists.
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table")).isEqualTo(1);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_indices_table"))
+                .isEqualTo(1);
+        // Create the staged db file.
+        StorageContext dbContext =
+                StorageContext.create(mContext, mContext.getUser(), STAGED_DATABASE_DIR);
+        createAndGetEmptyFile(dbContext.getDataDir(), STAGED_DATABASE_NAME);
+        HealthConnectDatabase stagedDb = new HealthConnectDatabase(dbContext, STAGED_DATABASE_NAME);
+        mTransactionTestUtils.insertApp(stagedDb, TEST_PACKAGE_NAME);
+        // Insert a dataSource with the same unique ids (displayName, appId) into the
+        // staged database.
+        Pair<Long, String> rowIdUuidPair =
+                mPhrTestUtils.insertMedicalDataSource(
+                        stagedDb, dbContext, DATA_SOURCE_SUFFIX, TEST_PACKAGE_NAME, INSTANT_NOW);
+        // Insert the same vaccine resource as the one in the original database.
+        mPhrTestUtils.insertMedicalResource(
+                stagedDb,
+                PhrDataFactory::createVaccineMedicalResource,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        // Insert a different vaccine resource.
+        mPhrTestUtils.insertMedicalResource(
+                stagedDb,
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TWENTY_SEC);
+        assertThat(queryNumEntries(stagedDb, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_table")).isEqualTo(2);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_indices_table")).isEqualTo(2);
+
+        mBackupRestore.merge();
+
+        // We expect the medical_data_source table to contain 1 dataSource. Even though there was
+        // 1 dataSource in original database and 1 in the staged database, they both have the
+        // same unique ids so the one in the stagedDatabase will be ignored.
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(1);
+        // Overall we have 3 medicalResources in both original and staged database but
+        // we expect 2 rows in both medical_resource and medical_resource_indices tables after merge
+        // since one of the vaccine resources in the stagedDatabase is a duplicate of an existing
+        // resource in the original database.
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table")).isEqualTo(2);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_indices_table"))
+                .isEqualTo(2);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_ENABLE_D2D_AND_EXPORT_IMPORT})
+    public void testMerge_withPhrMergeDisabled_doesNotCopyPhrData() throws Exception {
+        StorageContext dbContext =
+                StorageContext.create(mContext, mContext.getUser(), STAGED_DATABASE_DIR);
+        createAndGetEmptyFile(dbContext.getDataDir(), STAGED_DATABASE_NAME);
+        HealthConnectDatabase stagedDb = new HealthConnectDatabase(dbContext, STAGED_DATABASE_NAME);
+        mTransactionTestUtils.insertApp(stagedDb, TEST_PACKAGE_NAME);
+        Pair<Long, String> rowIdUuidPair =
+                mPhrTestUtils.insertMedicalDataSource(
+                        stagedDb, dbContext, "ds1", TEST_PACKAGE_NAME, INSTANT_NOW);
+        mPhrTestUtils.insertMedicalResource(
+                stagedDb,
+                PhrDataFactory::createVaccineMedicalResource,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        mPhrTestUtils.insertMedicalResource(
+                stagedDb,
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                rowIdUuidPair.second,
+                rowIdUuidPair.first,
+                INSTANT_NOW_PLUS_TWENTY_SEC);
+        assertThat(queryNumEntries(stagedDb, "medical_data_source_table")).isEqualTo(1);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_table")).isEqualTo(2);
+        assertThat(queryNumEntries(stagedDb, "medical_resource_indices_table")).isEqualTo(2);
+
+        mBackupRestore.merge();
+
+        HealthConnectDatabase originalDatabase =
+                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
+        assertThat(queryNumEntries(originalDatabase, "medical_data_source_table")).isEqualTo(0);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_table")).isEqualTo(0);
+        assertThat(queryNumEntries(originalDatabase, "medical_resource_indices_table"))
+                .isEqualTo(0);
+    }
+
+    private static File createAndGetEmptyFile(File dir, String fileName) throws IOException {
+        dir.mkdirs();
+        File file = new File(dir, fileName);
+        file.createNewFile();
+        return file;
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupSettingsHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupSettingsHelperTest.java
new file mode 100644
index 0000000..e37eda4
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/backuprestore/BackupSettingsHelperTest.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.backuprestore;
+
+import static com.android.server.healthconnect.backuprestore.BackupSettingsHelper.AUTO_DELETE_PREF_KEY;
+import static com.android.server.healthconnect.backuprestore.BackupSettingsHelper.DISTANCE_UNIT_PREF_KEY;
+import static com.android.server.healthconnect.backuprestore.BackupSettingsHelper.ENERGY_UNIT_PREF_KEY;
+import static com.android.server.healthconnect.backuprestore.BackupSettingsHelper.HEIGHT_UNIT_PREF_KEY;
+import static com.android.server.healthconnect.backuprestore.BackupSettingsHelper.TEMPERATURE_UNIT_PREF_KEY;
+import static com.android.server.healthconnect.backuprestore.BackupSettingsHelper.WEIGHT_UNIT_PREF_KEY;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.AutoDeleteFrequency;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.DEFAULT_DISTANCE_UNIT;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.DEFAULT_ENERGY_UNIT;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.DEFAULT_HEIGHT_UNIT;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.DEFAULT_TEMPERATURE_UNIT;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.DEFAULT_WEIGHT_UNIT;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.DistanceUnit;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.EnergyUnit;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.HeightUnit;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.TemperatureUnit;
+import static com.android.server.healthconnect.backuprestore.CloudBackupSettings.WeightUnit;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.HealthDataCategory;
+import android.health.connect.exportimport.ScheduledExportSettings;
+import android.net.Uri;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.FakePreferenceHelper;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
+import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.quality.Strictness;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(AndroidJUnit4.class)
+public class BackupSettingsHelperTest {
+
+    private static final String TEST_PACKAGE_NAME = "package.name";
+    private static final String TEST_PACKAGE_NAME_2 = "other.app";
+    private static final Uri TEST_URI = Uri.parse("content://exports/hcbackup.zip");
+
+    private PreferenceHelper mPreferenceHelper;
+    private HealthDataCategoryPriorityHelper mPriorityHelper;
+    private BackupSettingsHelper mBackupSettingsHelper;
+
+    @Rule(order = 1)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .setStrictness(Strictness.LENIENT)
+                    .build();
+
+    @Mock private ExportImportSettingsStorage mExportImportSettingsStorage;
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
+    @Before
+    public void setUp() throws Exception {
+        HealthConnectInjector.resetInstanceForTest();
+
+        Context context = ApplicationProvider.getApplicationContext();
+        mPreferenceHelper = new FakePreferenceHelper();
+
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setPreferenceHelper(mPreferenceHelper)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .setExportImportSettingsStorage(mExportImportSettingsStorage)
+                        .build();
+
+        TransactionTestUtils transactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        transactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+        transactionTestUtils.insertApp(TEST_PACKAGE_NAME_2);
+
+        mPriorityHelper = healthConnectInjector.getHealthDataCategoryPriorityHelper();
+        mBackupSettingsHelper =
+                new BackupSettingsHelper(
+                        mPriorityHelper, mPreferenceHelper, mExportImportSettingsStorage);
+
+        when(mExportImportSettingsStorage.getUri()).thenReturn(TEST_URI);
+    }
+
+    @Test
+    public void emptyPriorityList_setsPriorityListAsEmptyList() {
+        Map<Integer, List<Long>> priorityMapImmutable =
+                mPriorityHelper.getHealthDataCategoryToAppIdPriorityMapImmutable();
+        assertThat(priorityMapImmutable).isEmpty();
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        Map<Integer, List<Long>> actualResult = userSettings.getPriorityListMapSetting();
+
+        assertThat(actualResult).isEmpty();
+    }
+
+    @Test
+    public void oneCategoryPriorityList_setsPriorityListCorrectly() throws IOException {
+        mPriorityHelper.setPriorityOrder(
+                HealthDataCategory.ACTIVITY, List.of(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME_2));
+        Map<Integer, List<Long>> expectedPriorityList =
+                mPriorityHelper.getHealthDataCategoryToAppIdPriorityMapImmutable();
+        assertThat(expectedPriorityList).isNotEmpty();
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        Map<Integer, List<Long>> actualPriorityList = userSettings.getPriorityListMapSetting();
+
+        assertThat(actualPriorityList).isEqualTo(expectedPriorityList);
+    }
+
+    @Test
+    public void defaultUnitPreferences_setsUnitPreferencesCorrectly() {
+        mPreferenceHelper.insertOrReplacePreference(
+                TEMPERATURE_UNIT_PREF_KEY, DEFAULT_TEMPERATURE_UNIT.toString());
+        mPreferenceHelper.insertOrReplacePreference(
+                ENERGY_UNIT_PREF_KEY, DEFAULT_ENERGY_UNIT.toString());
+        mPreferenceHelper.insertOrReplacePreference(
+                HEIGHT_UNIT_PREF_KEY, DEFAULT_HEIGHT_UNIT.toString());
+        mPreferenceHelper.insertOrReplacePreference(
+                WEIGHT_UNIT_PREF_KEY, DEFAULT_WEIGHT_UNIT.toString());
+        mPreferenceHelper.insertOrReplacePreference(
+                DISTANCE_UNIT_PREF_KEY, DEFAULT_DISTANCE_UNIT.toString());
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        assertThat(userSettings.getTemperatureUnitSetting()).isEqualTo(DEFAULT_TEMPERATURE_UNIT);
+        assertThat(userSettings.getEnergyUnitSetting()).isEqualTo(DEFAULT_ENERGY_UNIT);
+        assertThat(userSettings.getWeightUnitSetting()).isEqualTo(DEFAULT_WEIGHT_UNIT);
+        assertThat(userSettings.getHeightUnitSetting()).isEqualTo(DEFAULT_HEIGHT_UNIT);
+        assertThat(userSettings.getDistanceUnitSetting()).isEqualTo(DEFAULT_DISTANCE_UNIT);
+    }
+
+    @Test
+    public void nonDefaultUnitPreference_setsUnitPreferencesCorrectly() {
+        mPreferenceHelper.insertOrReplacePreference(
+                TEMPERATURE_UNIT_PREF_KEY, TemperatureUnit.KELVIN.toString());
+        mPreferenceHelper.insertOrReplacePreference(
+                ENERGY_UNIT_PREF_KEY, EnergyUnit.KILOJOULE.toString());
+        mPreferenceHelper.insertOrReplacePreference(
+                HEIGHT_UNIT_PREF_KEY, HeightUnit.FEET.toString());
+        mPreferenceHelper.insertOrReplacePreference(
+                WEIGHT_UNIT_PREF_KEY, WeightUnit.POUND.toString());
+        mPreferenceHelper.insertOrReplacePreference(
+                DISTANCE_UNIT_PREF_KEY, DistanceUnit.MILES.toString());
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        assertThat(userSettings.getTemperatureUnitSetting()).isEqualTo(TemperatureUnit.KELVIN);
+        assertThat(userSettings.getEnergyUnitSetting()).isEqualTo(EnergyUnit.KILOJOULE);
+        assertThat(userSettings.getWeightUnitSetting()).isEqualTo(WeightUnit.POUND);
+        assertThat(userSettings.getHeightUnitSetting()).isEqualTo(HeightUnit.FEET);
+        assertThat(userSettings.getDistanceUnitSetting()).isEqualTo(DistanceUnit.MILES);
+    }
+
+    @Test
+    public void exportSettingsDaily_setsExportSettingsCorrectly() {
+        when(mExportImportSettingsStorage.getScheduledExportPeriodInDays()).thenReturn(1);
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        ScheduledExportSettings expectedSettings =
+                new ScheduledExportSettings.Builder().setPeriodInDays(1).setUri(TEST_URI).build();
+        ScheduledExportSettings actualSettings = userSettings.getScheduledExportSettings();
+
+        assertThat(actualSettings).isNotNull();
+        assertThat(actualSettings).isEqualTo(expectedSettings);
+    }
+
+    @Test
+    public void exportSettingsWeekly_setsExportSettingsCorrectly() {
+        when(mExportImportSettingsStorage.getScheduledExportPeriodInDays()).thenReturn(7);
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        ScheduledExportSettings expectedSettings =
+                new ScheduledExportSettings.Builder().setPeriodInDays(7).setUri(TEST_URI).build();
+        ScheduledExportSettings actualSettings = userSettings.getScheduledExportSettings();
+
+        assertThat(actualSettings).isNotNull();
+        assertThat(actualSettings).isEqualTo(expectedSettings);
+    }
+
+    @Test
+    public void exportSettingsMonthly_setsExportSettingsCorrectly() {
+        when(mExportImportSettingsStorage.getScheduledExportPeriodInDays()).thenReturn(30);
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        ScheduledExportSettings expectedSettings =
+                new ScheduledExportSettings.Builder().setPeriodInDays(30).setUri(TEST_URI).build();
+        ScheduledExportSettings actualSettings = userSettings.getScheduledExportSettings();
+
+        assertThat(actualSettings).isNotNull();
+        assertThat(actualSettings).isEqualTo(expectedSettings);
+    }
+
+    @Test
+    public void autoDeleteSettingsOff_setsAutoDeleteSettingsCorrectly() {
+        mPreferenceHelper.insertOrReplacePreference(
+                AUTO_DELETE_PREF_KEY, AutoDeleteFrequency.AUTO_DELETE_RANGE_NEVER.toString());
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        assertThat(userSettings.getAutoDeleteSetting())
+                .isEqualTo(AutoDeleteFrequency.AUTO_DELETE_RANGE_NEVER);
+    }
+
+    @Test
+    public void autoDeleteSettingsThreeMonths_setsAutoDeleteSettingsCorrectly() {
+        mPreferenceHelper.insertOrReplacePreference(
+                AUTO_DELETE_PREF_KEY,
+                AutoDeleteFrequency.AUTO_DELETE_RANGE_THREE_MONTHS.toString());
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        assertThat(userSettings.getAutoDeleteSetting())
+                .isEqualTo(AutoDeleteFrequency.AUTO_DELETE_RANGE_THREE_MONTHS);
+    }
+
+    @Test
+    public void autoDeleteSettingsEighteenMonths_setsAutoDeleteSettingsCorrectly() {
+        mPreferenceHelper.insertOrReplacePreference(
+                AUTO_DELETE_PREF_KEY,
+                AutoDeleteFrequency.AUTO_DELETE_RANGE_EIGHTEEN_MONTHS.toString());
+
+        CloudBackupSettings userSettings = mBackupSettingsHelper.collectUserSettings();
+
+        assertThat(userSettings.getAutoDeleteSetting())
+                .isEqualTo(AutoDeleteFrequency.AUTO_DELETE_RANGE_EIGHTEEN_MONTHS);
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/backuprestore/CloudBackupManagerTest.java b/tests/unittests/src/com/android/server/healthconnect/backuprestore/CloudBackupManagerTest.java
new file mode 100644
index 0000000..bd3fb14
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/backuprestore/CloudBackupManagerTest.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.healthconnect.backuprestore;
+
+import static android.health.connect.PageTokenWrapper.EMPTY_PAGE_TOKEN;
+
+import static com.android.server.healthconnect.backuprestore.BackupRestoreDatabaseHelper.MAXIMUM_PAGE_SIZE;
+import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createStepsRecord;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.database.sqlite.SQLiteException;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.backuprestore.GetChangesForBackupResponse;
+import android.health.connect.internal.datatypes.RecordInternal;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
+import android.os.Environment;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
+import com.android.server.healthconnect.storage.HealthConnectDatabase;
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.BackupChangeTokenHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
+import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
+import com.android.server.healthconnect.storage.request.DeleteTableRequest;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Unit test for class {@link CloudBackupManager}. */
+@RunWith(AndroidJUnit4.class)
+@EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+public class CloudBackupManagerTest {
+    private static final String TEST_PACKAGE_NAME = "test.package.name";
+    private static final long TEST_START_TIME_IN_MILLIS = 2000;
+    private static final long TEST_END_TIME_IN_MILLIS = 3000;
+    private static final int TEST_STEP_COUNT = 1345;
+
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .mockStatic(Environment.class)
+                    .build();
+
+    @Rule(order = 3)
+    public final HealthConnectDatabaseTestRule mDatabaseTestRule =
+            new HealthConnectDatabaseTestRule();
+
+    private TransactionManager mTransactionManager;
+    private TransactionTestUtils mTransactionTestUtils;
+    private CloudBackupManager mCloudBackupManager;
+
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(mDatabaseTestRule.getDatabaseContext())
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .build();
+
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+        AppInfoHelper appInfoHelper = healthConnectInjector.getAppInfoHelper();
+        AccessLogsHelper accessLogsHelper = healthConnectInjector.getAccessLogsHelper();
+        DeviceInfoHelper deviceInfoHelper = healthConnectInjector.getDeviceInfoHelper();
+        HealthDataCategoryPriorityHelper priorityHelper =
+                healthConnectInjector.getHealthDataCategoryPriorityHelper();
+        PreferenceHelper preferenceHelper = healthConnectInjector.getPreferenceHelper();
+        HealthConnectMappings healthConnectMappings =
+                healthConnectInjector.getHealthConnectMappings();
+        InternalHealthConnectMappings internalHealthConnectMappings =
+                healthConnectInjector.getInternalHealthConnectMappings();
+        ChangeLogsHelper changeLogsHelper = healthConnectInjector.getChangeLogsHelper();
+        ChangeLogsRequestHelper changeLogsRequestHelper =
+                healthConnectInjector.getChangeLogsRequestHelper();
+        ExportImportSettingsStorage exportImportSettingsStorage =
+                healthConnectInjector.getExportImportSettingsStorage();
+
+        mCloudBackupManager =
+                new CloudBackupManager(
+                        mTransactionManager,
+                        appInfoHelper,
+                        accessLogsHelper,
+                        deviceInfoHelper,
+                        healthConnectMappings,
+                        internalHealthConnectMappings,
+                        changeLogsHelper,
+                        changeLogsRequestHelper,
+                        priorityHelper,
+                        preferenceHelper,
+                        exportImportSettingsStorage);
+    }
+
+    @Test
+    public void getChangesForBackup_noMoreChangeLogs_correctResponseReturned() {
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT));
+        GetChangesForBackupResponse response = mCloudBackupManager.getChangesForBackup(null);
+        BackupChangeTokenHelper.BackupChangeToken firstBackupToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, response.getNextChangeToken());
+
+        GetChangesForBackupResponse secondResponse =
+                mCloudBackupManager.getChangesForBackup(response.getNextChangeToken());
+
+        assertThat(secondResponse.getChanges().size()).isEqualTo(0);
+        BackupChangeTokenHelper.BackupChangeToken secondBackupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, secondResponse.getNextChangeToken());
+        assertThat(secondBackupChangeToken.getDataTableName()).isNull();
+        assertThat(secondBackupChangeToken.getDataTablePageToken())
+                .isEqualTo(EMPTY_PAGE_TOKEN.encode());
+        // Same change logs token so the next incremental call will start from the same point.
+        assertThat(secondBackupChangeToken.getChangeLogsRequestToken())
+                .isEqualTo(firstBackupToken.getChangeLogsRequestToken());
+    }
+
+    @Test
+    public void getChangesForBackup_dataTableIsNotNull_succeed() {
+        List<RecordInternal<?>> records = new ArrayList<>();
+        for (int recordNumber = 0; recordNumber < MAXIMUM_PAGE_SIZE + 1; recordNumber++) {
+            records.add(
+                    createStepsRecord(
+                            // Add offsets to start time and end time for distinguishing different
+                            // records.
+                            TEST_START_TIME_IN_MILLIS + recordNumber,
+                            TEST_END_TIME_IN_MILLIS + recordNumber,
+                            TEST_STEP_COUNT));
+        }
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, records);
+
+        GetChangesForBackupResponse response = mCloudBackupManager.getChangesForBackup(null);
+
+        GetChangesForBackupResponse secondResponse =
+                mCloudBackupManager.getChangesForBackup(response.getNextChangeToken());
+        assertThat(secondResponse.getChanges().size()).isEqualTo(1);
+    }
+
+    @Test
+    public void getChangesForBackup_changeLogsTokenInvalid_invalidateToken() {
+        List<RecordInternal<?>> records = new ArrayList<>();
+        // Use MAXIMUM_PAGE_SIZE + 1 to make sure the returned change token, which to be used for
+        // the second call of getChangesForBackup, is not empty.
+        for (int recordNumber = 0; recordNumber < MAXIMUM_PAGE_SIZE + 1; recordNumber++) {
+            records.add(
+                    createStepsRecord(
+                            // Add offsets to start time and end time for distinguishing different
+                            // records.
+                            TEST_START_TIME_IN_MILLIS + recordNumber,
+                            TEST_END_TIME_IN_MILLIS + recordNumber,
+                            TEST_STEP_COUNT));
+        }
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, records);
+        GetChangesForBackupResponse response = mCloudBackupManager.getChangesForBackup(null);
+        // Delete change logs.
+        mTransactionManager.delete(new DeleteTableRequest(ChangeLogsHelper.TABLE_NAME));
+
+        GetChangesForBackupResponse secondResponse =
+                mCloudBackupManager.getChangesForBackup(response.getNextChangeToken());
+        assertThat(secondResponse.getChanges()).isEmpty();
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, secondResponse.getNextChangeToken());
+        assertThat(backupChangeToken.getChangeLogsRequestToken()).isEqualTo(null);
+        assertThat(backupChangeToken.getDataTablePageToken()).isEqualTo(EMPTY_PAGE_TOKEN.encode());
+        assertThat(backupChangeToken.getDataTableName()).isEqualTo(null);
+    }
+
+    @Test
+    public void getChangesForBackup_changeTokenIsNull_succeed() {
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT));
+
+        GetChangesForBackupResponse response = mCloudBackupManager.getChangesForBackup(null);
+
+        assertThat(response.getChanges().size()).isEqualTo(1);
+        String nextChangeToken = response.getNextChangeToken();
+        assertThat(nextChangeToken).isEqualTo("1");
+    }
+
+    @Test
+    public void getChangesForBackup_throwsDatabaseException() {
+        mTransactionTestUtils.insertRecords(
+                TEST_PACKAGE_NAME,
+                createStepsRecord(
+                        TEST_START_TIME_IN_MILLIS, TEST_END_TIME_IN_MILLIS, TEST_STEP_COUNT));
+
+        // Delete backup_change_token_table.
+        HealthConnectDatabase database =
+                new HealthConnectDatabase(mDatabaseTestRule.getDatabaseContext());
+        database.getWritableDatabase()
+                .execSQL("DROP TABLE IF EXISTS " + BackupChangeTokenHelper.getTableName());
+
+        assertThrows(SQLiteException.class, () -> mCloudBackupManager.getChangesForBackup(null));
+        // Add backup_change_token_table back to not affect other tests.
+        BackupChangeTokenHelper.applyBackupTokenUpgrade(database.getWritableDatabase());
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/backuprestore/CloudRestoreManagerTest.java b/tests/unittests/src/com/android/server/healthconnect/backuprestore/CloudRestoreManagerTest.java
new file mode 100644
index 0000000..66f80a2
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/backuprestore/CloudRestoreManagerTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package healthconnect.backuprestore;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.HealthConnectManager;
+import android.health.connect.backuprestore.BackupSettings;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.backuprestore.CloudRestoreManager;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** Unit test for class {@link CloudRestoreManager}. */
+@RunWith(AndroidJUnit4.class)
+public class CloudRestoreManagerTest {
+
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .build();
+
+    private CloudRestoreManager mCloudRestoreManager;
+
+    @Before
+    public void setUp() {
+        mCloudRestoreManager = new CloudRestoreManager();
+    }
+
+    @Test
+    public void whenPushSettingsForRestoreCalled_unsupportedOperationExceptionThrown() {
+        BackupSettings backupSettings = new BackupSettings(0, new byte[0]);
+        assertThrows(
+                UnsupportedOperationException.class,
+                () -> mCloudRestoreManager.pushSettingsForRestore(backupSettings));
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportImportJobsTest.java b/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportImportJobsTest.java
index c508cfd..417f443 100644
--- a/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportImportJobsTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportImportJobsTest.java
@@ -16,8 +16,6 @@
 
 package com.android.server.healthconnect.exportimport;
 
-import static com.android.healthfitness.flags.Flags.FLAG_EXPORT_IMPORT_FAST_FOLLOW;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -36,7 +34,6 @@
 import android.os.UserHandle;
 import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
-import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.SetFlagsRule;
 
 import com.android.healthfitness.flags.Flags;
@@ -76,7 +73,6 @@
     @Mock Context mContext;
     @Mock private JobScheduler mJobScheduler;
     @Mock private ExportManager mExportManager;
-    @Mock private TransactionManager mTransactionManager;
     @Mock private HealthConnectNotificationSender mHealthConnectNotificationSender;
 
     @Captor ArgumentCaptor<JobInfo> mJobInfoCaptor;
@@ -89,13 +85,10 @@
         MockitoAnnotations.initMocks(this);
         mExportImportSettingsStorage = new ExportImportSettingsStorage(mFakePreferenceHelper);
 
-        when(PreferenceHelper.getInstance()).thenReturn(mFakePreferenceHelper);
         when(mJobScheduler.forNamespace(ExportImportJobs.NAMESPACE)).thenReturn(mJobScheduler);
         when(mContext.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
         when(mContext.getPackageName()).thenReturn(ANDROID_SERVER_PACKAGE_NAME);
         when(mContext.createContextAsUser(any(), anyInt())).thenReturn(mContext);
-        when(mContext.getUser()).thenReturn(UserHandle.CURRENT);
-        when(TransactionManager.getInitialisedInstance()).thenReturn(mTransactionManager);
         when(ExportImportNotificationSender.createSender(any()))
                 .thenReturn(mHealthConnectNotificationSender);
     }
@@ -106,19 +99,19 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(0).build());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
 
         verify(mJobScheduler, times(0)).schedule(any());
     }
 
-    @RequiresFlagsEnabled({FLAG_EXPORT_IMPORT_FAST_FOLLOW})
     @Test
+    @EnableFlags({Flags.FLAG_EXPORT_IMPORT_FAST_FOLLOW})
     public void schedulePeriodicExportJob_cancelsPreviousJob() {
         mExportImportSettingsStorage.configure(
                 new ScheduledExportSettings.Builder().setPeriodInDays(0).build());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
 
         verify(mJobScheduler, times(1)).cancelAll();
     }
@@ -129,11 +122,11 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
         verify(mJobScheduler, times(1)).schedule(any());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
         verify(mJobScheduler, times(2)).schedule(any());
     }
 
@@ -144,7 +137,7 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
         verify(mJobScheduler, times(1)).schedule(any());
         verify(mJobScheduler, times(1)).cancelAll();
     }
@@ -155,7 +148,7 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(7).build());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
         verify(mJobScheduler, times(1)).schedule(mJobInfoCaptor.capture());
         assertThat(mJobInfoCaptor.getValue().getIntervalMillis())
                 .isEqualTo(Duration.ofHours(1).toMillis());
@@ -174,7 +167,7 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
 
         verify(mJobScheduler, times(1)).schedule(mJobInfoCaptor.capture());
         assertThat(mJobInfoCaptor.getValue().isPersisted()).isTrue();
@@ -188,7 +181,7 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(7).setUri(uri).build());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
         verify(mJobScheduler, times(1)).schedule(mJobInfoCaptor.capture());
         assertThat(mJobInfoCaptor.getValue().getIntervalMillis())
                 .isEqualTo(Duration.ofDays(7).toMillis());
@@ -210,7 +203,7 @@
                         .build());
 
         ExportImportJobs.schedulePeriodicExportJob(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
         verify(mJobScheduler, times(1)).schedule(mJobInfoCaptor.capture());
         assertThat(mJobInfoCaptor.getValue().getIntervalMillis())
                 .isEqualTo(Duration.ofHours(1).toMillis());
@@ -224,14 +217,18 @@
 
     @Test
     @EnableFlags({Flags.FLAG_EXPORT_IMPORT})
-    public void executePeriodicExportJob_withPeriodZero_doesNotRunExport() {
+    public void executePeriodicExportJob_withPeriodZero_doesNotrunExport() {
         mExportImportSettingsStorage.configure(
                 new ScheduledExportSettings.Builder().setPeriodInDays(0).build());
 
         ExportImportJobs.executePeriodicExportJob(
-                mContext, 0, new PersistableBundle(), mExportManager, mExportImportSettingsStorage);
+                mContext,
+                UserHandle.CURRENT,
+                new PersistableBundle(),
+                mExportManager,
+                mExportImportSettingsStorage);
 
-        verify(mExportManager, times(0)).runExport();
+        verify(mExportManager, times(0)).runExport(UserHandle.CURRENT);
     }
 
     @Test
@@ -243,7 +240,7 @@
         boolean isExportSuccessful =
                 ExportImportJobs.executePeriodicExportJob(
                         mContext,
-                        0,
+                        UserHandle.CURRENT,
                         new PersistableBundle(),
                         mExportManager,
                         mExportImportSettingsStorage);
@@ -258,9 +255,13 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
 
         ExportImportJobs.executePeriodicExportJob(
-                mContext, 0, new PersistableBundle(), mExportManager, mExportImportSettingsStorage);
+                mContext,
+                UserHandle.CURRENT,
+                new PersistableBundle(),
+                mExportManager,
+                mExportImportSettingsStorage);
 
-        verify(mExportManager, times(1)).runExport();
+        verify(mExportManager, times(1)).runExport(UserHandle.CURRENT);
     }
 
     @Test
@@ -268,12 +269,12 @@
     public void executePeriodicExportJob_successfulExport_returnsTrue() {
         mExportImportSettingsStorage.configure(
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
-        when(mExportManager.runExport()).thenReturn(true);
+        when(mExportManager.runExport(UserHandle.CURRENT)).thenReturn(true);
 
         boolean isExportSuccessful =
                 ExportImportJobs.executePeriodicExportJob(
                         mContext,
-                        0,
+                        UserHandle.CURRENT,
                         new PersistableBundle(),
                         mExportManager,
                         mExportImportSettingsStorage);
@@ -287,12 +288,12 @@
     public void executePeriodicExportJob_failedExport_returnsFalse() {
         mExportImportSettingsStorage.configure(
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
-        when(mExportManager.runExport()).thenReturn(false);
+        when(mExportManager.runExport(UserHandle.CURRENT)).thenReturn(false);
 
         boolean isExportSuccessful =
                 ExportImportJobs.executePeriodicExportJob(
                         mContext,
-                        0,
+                        UserHandle.CURRENT,
                         new PersistableBundle(),
                         mExportManager,
                         mExportImportSettingsStorage);
@@ -305,13 +306,17 @@
     public void executePeriodicExportJob_successfulFirstExport_reschedulesJob() {
         mExportImportSettingsStorage.configure(
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
-        when(mExportManager.runExport()).thenReturn(true);
+        when(mExportManager.runExport(UserHandle.CURRENT)).thenReturn(true);
 
         PersistableBundle extras = new PersistableBundle();
         extras.putBoolean(ExportImportJobs.IS_FIRST_EXPORT, true);
         boolean isExportSuccessful =
                 ExportImportJobs.executePeriodicExportJob(
-                        mContext, 0, extras, mExportManager, mExportImportSettingsStorage);
+                        mContext,
+                        UserHandle.CURRENT,
+                        extras,
+                        mExportManager,
+                        mExportImportSettingsStorage);
 
         assertThat(isExportSuccessful).isTrue();
         verify(mJobScheduler, times(1)).schedule(any());
@@ -324,7 +329,7 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
 
         ExportImportJobs.schedulePeriodicJobIfNotScheduled(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
 
         verify(mJobScheduler, times(1)).schedule(any());
     }
@@ -337,7 +342,7 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(1).build());
 
         ExportImportJobs.schedulePeriodicJobIfNotScheduled(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
 
         verify(mJobScheduler, times(1)).schedule(any());
     }
@@ -354,7 +359,7 @@
         when(mJobScheduler.getAllPendingJobs()).thenReturn(List.of(jobInfo));
 
         ExportImportJobs.schedulePeriodicJobIfNotScheduled(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
 
         verify(mJobScheduler, times(0)).schedule(any());
     }
@@ -366,7 +371,7 @@
                 new ScheduledExportSettings.Builder().setPeriodInDays(0).build());
 
         ExportImportJobs.schedulePeriodicJobIfNotScheduled(
-                0, mContext, mExportImportSettingsStorage, mExportManager);
+                UserHandle.CURRENT, mContext, mExportImportSettingsStorage, mExportManager);
 
         verify(mJobScheduler, times(0)).schedule(any());
     }
diff --git a/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportImportNotificationFactoryTest.java b/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportImportNotificationFactoryTest.java
index 3b543ad..82e3d0f 100644
--- a/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportImportNotificationFactoryTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportImportNotificationFactoryTest.java
@@ -31,6 +31,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Icon;
+import android.health.connect.HealthConnectManager;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 
@@ -54,8 +55,6 @@
 
     private static final String NOTIFICATION_CHANNEL_ID = "healthconnect-channel";
 
-    private static final String HEALTH_CONNECT_HOME_ACTION =
-            "android.health.connect.action.HEALTH_HOME_SETTINGS";
     private static final String HEALTH_CONNECT_RESTART_IMPORT_ACTION =
             "android.health.connect.action.START_IMPORT_FLOW";
     private static final String HEALTH_CONNECT_RESTART_EXPORT_SETUP =
@@ -91,7 +90,7 @@
     @Test
     public void importCompletesSuccessfully_notificationDisplayedCorrectly() {
         Notification result = mFactory.createNotification(NOTIFICATION_TYPE_IMPORT_COMPLETE);
-        Intent expectedIntent = new Intent(HEALTH_CONNECT_HOME_ACTION);
+        Intent expectedIntent = new Intent(HealthConnectManager.ACTION_MANAGE_HEALTH_DATA);
         PendingIntent expectedPendingIntent =
                 PendingIntent.getActivity(
                         mContext, 0, expectedIntent, PendingIntent.FLAG_IMMUTABLE);
diff --git a/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportManagerTest.java b/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportManagerTest.java
index c800188..d0c7117 100644
--- a/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportManagerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/exportimport/ExportManagerTest.java
@@ -20,6 +20,7 @@
 import static android.health.connect.exportimport.ScheduledExportStatus.DATA_EXPORT_ERROR_UNKNOWN;
 import static android.health.connect.exportimport.ScheduledExportStatus.DATA_EXPORT_STARTED;
 
+import static com.android.server.healthconnect.TestUtils.queryNumEntries;
 import static com.android.server.healthconnect.exportimport.ExportManager.LOCAL_EXPORT_DATABASE_FILE_NAME;
 import static com.android.server.healthconnect.exportimport.ExportManager.LOCAL_EXPORT_DIR_NAME;
 import static com.android.server.healthconnect.exportimport.ExportManager.LOCAL_EXPORT_ZIP_FILE_NAME;
@@ -39,30 +40,39 @@
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalDataSource;
 import android.health.connect.exportimport.ScheduledExportSettings;
 import android.health.connect.exportimport.ScheduledExportStatus;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
 import android.healthconnect.cts.utils.AssumptionCheckerRule;
 import android.healthconnect.cts.utils.TestUtils;
 import android.net.Uri;
-import android.os.Environment;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.util.Slog;
 
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
 import com.android.modules.utils.testing.ExtendedMockitoRule.MockStatic;
 import com.android.modules.utils.testing.ExtendedMockitoRule.MockStaticClasses;
+import com.android.server.healthconnect.EnvironmentFixture;
 import com.android.server.healthconnect.FakePreferenceHelper;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
 import com.android.server.healthconnect.logging.ExportImportLogger;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
 import com.android.server.healthconnect.storage.HealthConnectDatabase;
+import com.android.server.healthconnect.storage.PhrTestUtils;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
 import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
 
 import org.junit.After;
@@ -70,6 +80,7 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
 import java.io.File;
@@ -86,58 +97,64 @@
     private static final String REMOTE_EXPORT_DATABASE_DIR_NAME = "remote";
     private static final String REMOTE_EXPORT_ZIP_FILE_NAME = "remote_file.zip";
     private static final String REMOTE_EXPORT_DATABASE_FILE_NAME = "remote_file.db";
-    private static final String ORIGINAL_DATABASE_NAME = "healthconnect.db";
 
     @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
-                    .setStrictness(Strictness.LENIENT)
-                    .mockStatic(HealthConnectDeviceConfigManager.class)
                     .mockStatic(ExportImportLogger.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule mDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
-
     @Rule
     public AssumptionCheckerRule mSupportedHardwareRule =
             new AssumptionCheckerRule(
-                    TestUtils::isHardwareSupported, "Tests should run on supported hardware only.");
+                    TestUtils::isHealthConnectFullySupported,
+                    "Tests should run on supported hardware only.");
 
-    private HealthConnectUserContext mContext;
+    private Context mContext;
     private TransactionTestUtils mTransactionTestUtils;
     private ExportManager mExportManager;
-    private DatabaseContext mExportedDbContext;
+    private StorageContext mExportedDbContext;
     private Instant mTimeStamp;
-    private Clock mFakeClock;
     private ExportImportSettingsStorage mExportImportSettingsStorage;
+    private PhrTestUtils mPhrTestUtils;
+
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
 
     @Before
     public void setUp() throws Exception {
-        mContext = mDatabaseTestRule.getUserContext();
-        TransactionManager transactionManager = mDatabaseTestRule.getTransactionManager();
-        mTransactionTestUtils = new TransactionTestUtils(mContext, transactionManager);
-        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
-
-        mTimeStamp = Instant.parse("2024-06-04T16:39:12Z");
-        mFakeClock = Clock.fixed(mTimeStamp, ZoneId.of("UTC"));
-
+        mContext = ApplicationProvider.getApplicationContext();
         HealthConnectInjector healthConnectInjector =
                 HealthConnectInjectorImpl.newBuilderForTest(mContext)
                         .setPreferenceHelper(new FakePreferenceHelper())
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
                         .build();
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+        TransactionManager transactionManager = healthConnectInjector.getTransactionManager();
+
+        mTimeStamp = Instant.parse("2024-06-04T16:39:12Z");
+        Clock fakeClock = Clock.fixed(mTimeStamp, ZoneId.of("UTC"));
 
         mExportImportSettingsStorage = healthConnectInjector.getExportImportSettingsStorage();
         mExportManager =
                 new ExportManager(
-                        mContext, mFakeClock, mExportImportSettingsStorage, transactionManager);
+                        mContext, fakeClock, mExportImportSettingsStorage, transactionManager);
+
+        mPhrTestUtils = new PhrTestUtils(mContext, healthConnectInjector);
 
         mExportedDbContext =
-                DatabaseContext.create(
-                        mContext, REMOTE_EXPORT_DATABASE_DIR_NAME, mContext.getUser());
+                StorageContext.create(
+                        mContext, mContext.getUser(), REMOTE_EXPORT_DATABASE_DIR_NAME);
         configureExportUri();
     }
 
@@ -149,19 +166,68 @@
     }
 
     @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    @DisableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DISABLE_EXPORT_IMPORT})
+    public void testWhenPhrExportNotDisabled_tableContentIsExported() throws Exception {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.insertR4MedicalDataSource("ds", TEST_PACKAGE_NAME);
+        mPhrTestUtils.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+        assertThat(mTransactionTestUtils.queryNumEntries("medical_data_source_table")).isEqualTo(1);
+        assertThat(mTransactionTestUtils.queryNumEntries("medical_resource_table")).isEqualTo(1);
+        assertThat(mTransactionTestUtils.queryNumEntries("medical_resource_indices_table"))
+                .isEqualTo(1);
+
+        assertThat(mExportManager.runExport(mContext.getUser())).isTrue();
+
+        decompressExportedZip();
+        try (HealthConnectDatabase exportedDatabase =
+                new HealthConnectDatabase(mExportedDbContext, REMOTE_EXPORT_DATABASE_FILE_NAME)) {
+            assertThat(queryNumEntries(exportedDatabase, "medical_data_source_table")).isEqualTo(1);
+            assertThat(queryNumEntries(exportedDatabase, "medical_resource_table")).isEqualTo(1);
+            assertThat(queryNumEntries(exportedDatabase, "medical_resource_indices_table"))
+                    .isEqualTo(1);
+        }
+    }
+
+    @Test
+    @EnableFlags({
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DISABLE_EXPORT_IMPORT
+    })
+    public void testDisableExportForPhr_deletesPhrTablesContent() throws Exception {
+        MedicalDataSource dataSource =
+                mPhrTestUtils.insertR4MedicalDataSource("ds", TEST_PACKAGE_NAME);
+        mPhrTestUtils.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+        assertThat(mTransactionTestUtils.queryNumEntries("medical_data_source_table")).isEqualTo(1);
+        assertThat(mTransactionTestUtils.queryNumEntries("medical_resource_table")).isEqualTo(1);
+        assertThat(mTransactionTestUtils.queryNumEntries("medical_resource_indices_table"))
+                .isEqualTo(1);
+
+        assertThat(mExportManager.runExport(mContext.getUser())).isTrue();
+
+        decompressExportedZip();
+        try (HealthConnectDatabase exportedDatabase =
+                new HealthConnectDatabase(mExportedDbContext, REMOTE_EXPORT_DATABASE_FILE_NAME)) {
+            assertThat(queryNumEntries(exportedDatabase, "medical_data_source_table")).isEqualTo(0);
+            assertThat(queryNumEntries(exportedDatabase, "medical_resource_table")).isEqualTo(0);
+            assertThat(queryNumEntries(exportedDatabase, "medical_resource_indices_table"))
+                    .isEqualTo(0);
+        }
+    }
+
+    @Test
     public void deletesAccessLogsTableContent() throws Exception {
         mTransactionTestUtils.insertAccessLog();
         mTransactionTestUtils.insertAccessLog();
-        HealthConnectDatabase originalDatabase =
-                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
-        assertTableSize(originalDatabase, "access_logs_table", 2);
+        assertThat(mTransactionTestUtils.queryNumEntries("access_logs_table")).isEqualTo(2);
 
-        assertThat(mExportManager.runExport()).isTrue();
+        assertThat(mExportManager.runExport(mContext.getUser())).isTrue();
 
         decompressExportedZip();
-        try (HealthConnectDatabase remoteExportHealthConnectDatabase =
+        try (HealthConnectDatabase exportedDatabase =
                 new HealthConnectDatabase(mExportedDbContext, REMOTE_EXPORT_DATABASE_FILE_NAME)) {
-            assertTableSize(remoteExportHealthConnectDatabase, "access_logs_table", 0);
+            assertThat(queryNumEntries(exportedDatabase, "access_logs_table")).isEqualTo(0);
         }
     }
 
@@ -195,33 +261,29 @@
     public void deletesChangeLogsTableContent() throws Exception {
         mTransactionTestUtils.insertChangeLog();
         mTransactionTestUtils.insertChangeLog();
-        HealthConnectDatabase originalDatabase =
-                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
-        assertTableSize(originalDatabase, "change_logs_table", 2);
+        assertThat(mTransactionTestUtils.queryNumEntries("change_logs_table")).isEqualTo(2);
 
-        assertThat(mExportManager.runExport()).isTrue();
+        assertThat(mExportManager.runExport(mContext.getUser())).isTrue();
 
         decompressExportedZip();
-        try (HealthConnectDatabase remoteExportHealthConnectDatabase =
+        try (HealthConnectDatabase exportedDatabase =
                 new HealthConnectDatabase(mExportedDbContext, REMOTE_EXPORT_DATABASE_FILE_NAME)) {
-            assertTableSize(remoteExportHealthConnectDatabase, "change_logs_table", 0);
+            assertThat(queryNumEntries(exportedDatabase, "change_logs_table")).isEqualTo(0);
         }
     }
 
     @Test
     public void runExport_whenCompleted_deletesLocalCopies() {
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 456, 7));
-        HealthConnectDatabase originalDatabase =
-                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
-        assertTableSize(originalDatabase, "steps_record_table", 1);
+        assertThat(mTransactionTestUtils.queryNumEntries("steps_record_table")).isEqualTo(1);
 
-        assertThat(mExportManager.runExport()).isTrue();
+        assertThat(mExportManager.runExport(mContext.getUser())).isTrue();
 
-        DatabaseContext databaseContext =
-                DatabaseContext.create(mContext, LOCAL_EXPORT_DIR_NAME, mContext.getUser());
-        assertThat(databaseContext.getDatabasePath(LOCAL_EXPORT_DATABASE_FILE_NAME).exists())
+        StorageContext storageContext =
+                StorageContext.create(mContext, mContext.getUser(), LOCAL_EXPORT_DIR_NAME);
+        assertThat(storageContext.getDatabasePath(LOCAL_EXPORT_DATABASE_FILE_NAME).exists())
                 .isFalse();
-        assertThat(databaseContext.getDatabasePath(LOCAL_EXPORT_ZIP_FILE_NAME).exists()).isFalse();
+        assertThat(storageContext.getDatabasePath(LOCAL_EXPORT_ZIP_FILE_NAME).exists()).isFalse();
     }
 
     @Test
@@ -229,7 +291,7 @@
     public void runExport_localExportFails_logsWithGenericError() throws IOException {
         when(Files.copy((Path) any(), any(), any())).thenThrow(new IOException("Copy failed"));
 
-        assertThat(mExportManager.runExport()).isFalse();
+        assertThat(mExportManager.runExport(mContext.getUser())).isFalse();
 
         // Time not recorded due to fake clock.
         assertErrorStatusStored(DATA_EXPORT_ERROR_UNKNOWN, mTimeStamp);
@@ -254,7 +316,7 @@
     // Compressor is mocked so no zip file will be exported.
     @MockStaticClasses({@MockStatic(Compressor.class), @MockStatic(Slog.class)})
     public void runExport_noCompressedFile_logsWithGenericError() {
-        assertThat(mExportManager.runExport()).isFalse();
+        assertThat(mExportManager.runExport(mContext.getUser())).isFalse();
         // Time not recorded due to fake clock.
         assertErrorStatusStored(DATA_EXPORT_ERROR_UNKNOWN, mTimeStamp);
         ExtendedMockito.verify(
@@ -272,31 +334,29 @@
 
     @Test
     public void deleteLocalExportFiles_deletesLocalCopies() {
-        DatabaseContext databaseContext =
-                DatabaseContext.create(mContext, LOCAL_EXPORT_DIR_NAME, mContext.getUser());
-        new File(databaseContext.getDatabaseDir(), LOCAL_EXPORT_DATABASE_FILE_NAME).mkdirs();
-        new File(databaseContext.getDatabaseDir(), LOCAL_EXPORT_ZIP_FILE_NAME).mkdirs();
+        StorageContext storageContext =
+                StorageContext.create(mContext, mContext.getUser(), LOCAL_EXPORT_DIR_NAME);
+        new File(storageContext.getDataDir(), LOCAL_EXPORT_DATABASE_FILE_NAME).mkdirs();
+        new File(storageContext.getDataDir(), LOCAL_EXPORT_ZIP_FILE_NAME).mkdirs();
 
-        mExportManager.deleteLocalExportFiles();
+        mExportManager.deleteLocalExportFiles(mContext.getUser());
 
-        assertThat(databaseContext.getDatabasePath(LOCAL_EXPORT_DATABASE_FILE_NAME).exists())
+        assertThat(storageContext.getDatabasePath(LOCAL_EXPORT_DATABASE_FILE_NAME).exists())
                 .isFalse();
-        assertThat(databaseContext.getDatabasePath(LOCAL_EXPORT_ZIP_FILE_NAME).exists()).isFalse();
+        assertThat(storageContext.getDatabasePath(LOCAL_EXPORT_ZIP_FILE_NAME).exists()).isFalse();
     }
 
     @Test
     public void makesRemoteCopyOfDatabase() throws Exception {
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 456, 7));
-        HealthConnectDatabase originalDatabase =
-                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
-        assertTableSize(originalDatabase, "steps_record_table", 1);
+        assertThat(mTransactionTestUtils.queryNumEntries("steps_record_table")).isEqualTo(1);
 
-        assertThat(mExportManager.runExport()).isTrue();
+        assertThat(mExportManager.runExport(mContext.getUser())).isTrue();
 
         decompressExportedZip();
-        try (HealthConnectDatabase remoteExportHealthConnectDatabase =
+        try (HealthConnectDatabase exportedDatabase =
                 new HealthConnectDatabase(mExportedDbContext, REMOTE_EXPORT_DATABASE_FILE_NAME)) {
-            assertTableSize(remoteExportHealthConnectDatabase, "steps_record_table", 1);
+            assertThat(queryNumEntries(exportedDatabase, "steps_record_table")).isEqualTo(1);
         }
     }
 
@@ -306,10 +366,7 @@
         // Inserting multiple rows to vary the size for testing of size logging
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 456, 7));
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(124, 457, 7));
-
-        HealthConnectDatabase originalDatabase =
-                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
-        assertTableSize(originalDatabase, "steps_record_table", 2);
+        assertThat(mTransactionTestUtils.queryNumEntries("steps_record_table")).isEqualTo(2);
 
         mExportImportSettingsStorage.setLastExportError(
                 ScheduledExportStatus.DATA_EXPORT_ERROR_NONE, mTimeStamp);
@@ -319,7 +376,7 @@
                         .setUri(Uri.fromFile(new File("inaccessible")))
                         .build());
 
-        assertThat(mExportManager.runExport()).isFalse();
+        assertThat(mExportManager.runExport(mContext.getUser())).isFalse();
         assertExportStartRecorded();
 
         // time not recorded due to fake clock
@@ -344,12 +401,10 @@
     @Test
     public void updatesLastSuccessfulExport_onSuccessOnly() throws Exception {
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 456, 7));
-        HealthConnectDatabase originalDatabase =
-                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
-        assertTableSize(originalDatabase, "steps_record_table", 1);
+        assertThat(mTransactionTestUtils.queryNumEntries("steps_record_table")).isEqualTo(1);
 
         // running a successful export records a "last successful export"
-        assertThat(mExportManager.runExport()).isTrue();
+        assertThat(mExportManager.runExport(mContext.getUser())).isTrue();
         assertExportStartRecorded();
 
         // Get the actual size of the files rather than using a fixed size as the size isn't fixed
@@ -374,7 +429,7 @@
                 new ScheduledExportSettings.Builder()
                         .setUri(Uri.fromFile(new File("inaccessible")))
                         .build());
-        assertThat(mExportManager.runExport()).isFalse();
+        assertThat(mExportManager.runExport(mContext.getUser())).isFalse();
 
         // Last successful export should hold the previous timestamp as the last export failed
         Instant lastSuccessfulExport =
@@ -393,13 +448,12 @@
         when(contentResolver.query(any(), any(), any(), any(), any())).thenReturn(cursor);
         when(cursor.moveToFirst()).thenReturn(true);
         when(cursor.getString(anyInt())).thenReturn(REMOTE_EXPORT_ZIP_FILE_NAME);
+
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 456, 7));
-        HealthConnectDatabase originalDatabase =
-                new HealthConnectDatabase(mContext, ORIGINAL_DATABASE_NAME);
-        assertTableSize(originalDatabase, "steps_record_table", 1);
+        assertThat(mTransactionTestUtils.queryNumEntries("steps_record_table")).isEqualTo(1);
 
         // Running a successful export records a "last successful export".
-        assertThat(mExportManager.runExport()).isTrue();
+        assertThat(mExportManager.runExport(mContext.getUser())).isTrue();
         assertThat(
                         mExportImportSettingsStorage
                                 .getScheduledExportStatus(context)
@@ -411,7 +465,7 @@
                 new ScheduledExportSettings.Builder()
                         .setUri(Uri.fromFile(new File("inaccessible")))
                         .build());
-        assertThat(mExportManager.runExport()).isFalse();
+        assertThat(mExportManager.runExport(mContext.getUser())).isFalse();
 
         // Last successful export should hold the previous file name as the last export failed
         assertThat(
@@ -431,14 +485,6 @@
                         .build());
     }
 
-    private void assertTableSize(HealthConnectDatabase database, String tableName, int tableRows) {
-        Cursor cursor =
-                database.getWritableDatabase()
-                        .rawQuery("SELECT count(*) FROM " + tableName + ";", null);
-        cursor.moveToNext();
-        assertThat(cursor.getInt(0)).isEqualTo(tableRows);
-    }
-
     private void assertExportStartRecorded() {
         ExtendedMockito.verify(
                 () ->
diff --git a/tests/unittests/src/com/android/server/healthconnect/exportimport/ImportManagerTest.java b/tests/unittests/src/com/android/server/healthconnect/exportimport/ImportManagerTest.java
index e0e2b48..0343148 100644
--- a/tests/unittests/src/com/android/server/healthconnect/exportimport/ImportManagerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/exportimport/ImportManagerTest.java
@@ -19,21 +19,23 @@
 import static android.health.connect.exportimport.ImportStatus.DATA_IMPORT_ERROR_NONE;
 import static android.health.connect.exportimport.ImportStatus.DATA_IMPORT_ERROR_VERSION_MISMATCH;
 import static android.health.connect.exportimport.ImportStatus.DATA_IMPORT_ERROR_WRONG_FILE;
+import static android.health.connect.exportimport.ImportStatus.DATA_IMPORT_STARTED;
 
 import static com.android.server.healthconnect.exportimport.ExportManager.LOCAL_EXPORT_DATABASE_FILE_NAME;
 import static com.android.server.healthconnect.exportimport.ImportManager.IMPORT_DATABASE_DIR_NAME;
 import static com.android.server.healthconnect.exportimport.ImportManager.IMPORT_DATABASE_FILE_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createBloodPressureRecord;
 import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createStepsRecord;
-import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.getReadTransactionRequest;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import android.Manifest;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
 import android.health.connect.HealthConnectManager;
@@ -41,30 +43,38 @@
 import android.health.connect.datatypes.RecordTypeIdentifier;
 import android.health.connect.internal.datatypes.RecordInternal;
 import android.net.Uri;
-import android.os.Environment;
 import android.os.UserHandle;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
 import com.android.server.healthconnect.FakePreferenceHelper;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.TestUtils;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.logging.ExportImportLogger;
 import com.android.server.healthconnect.notifications.HealthConnectNotificationSender;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper.DatabaseHelpers;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
 import com.android.server.healthconnect.storage.request.ReadTransactionRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -74,6 +84,7 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
 import java.io.File;
@@ -81,6 +92,9 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.ZoneId;
 import java.util.List;
 import java.util.UUID;
 
@@ -95,77 +109,86 @@
     private static final String TEST_PACKAGE_NAME_2 = "other.app";
     private static final String TEST_PACKAGE_NAME_3 = "another.app";
 
-    private static final String CHANNEL_ID = "healthconnect-channel";
+    private static final int TEST_COMPRESSED_FILE_SIZE = 1042;
 
     @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .mockStatic(ExportImportLogger.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule mDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
+    private ImportManager mImportManagerSpy;
 
-    private HealthConnectUserContext mContext;
-
+    private Context mContext;
     private TransactionManager mTransactionManager;
     private TransactionTestUtils mTransactionTestUtils;
     private HealthDataCategoryPriorityHelper mPriorityHelper;
-
-    private ImportManager mImportManager;
-    private HealthConnectNotificationSender mNotificationSender;
     private ExportImportSettingsStorage mExportImportSettingsStorage;
     private AppInfoHelper mAppInfoHelper;
     private AccessLogsHelper mAccessLogsHelper;
+    private DatabaseHelpers mDatabaseHelpers;
     private DeviceInfoHelper mDeviceInfoHelper;
+    private InternalHealthConnectMappings mInternalHealthConnectMappings;
+
+    @Mock private HealthConnectNotificationSender mNotificationSender;
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
 
     @Before
     public void setUp() throws Exception {
-        InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation()
-                .adoptShellPermissionIdentity(Manifest.permission.READ_DEVICE_CONFIG);
-        HealthDataCategoryPriorityHelper.clearInstanceForTest();
-        mContext = mDatabaseTestRule.getUserContext();
-        mTransactionManager = mDatabaseTestRule.getTransactionManager();
-        mTransactionTestUtils = new TransactionTestUtils(mContext, mTransactionManager);
-        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
-        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME_2);
-        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME_3);
-        mNotificationSender = mock(HealthConnectNotificationSender.class);
-        AppInfoHelper.resetInstanceForTest();
-
+        mContext = ApplicationProvider.getApplicationContext();
         HealthConnectInjector healthConnectInjector =
                 HealthConnectInjectorImpl.newBuilderForTest(mContext)
                         .setPreferenceHelper(new FakePreferenceHelper())
-                        .setTransactionManager(mTransactionManager)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
                         .build();
-
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+        mDatabaseHelpers = healthConnectInjector.getDatabaseHelpers();
         mExportImportSettingsStorage = healthConnectInjector.getExportImportSettingsStorage();
         mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
         mAccessLogsHelper = healthConnectInjector.getAccessLogsHelper();
         mDeviceInfoHelper = healthConnectInjector.getDeviceInfoHelper();
+        mInternalHealthConnectMappings = healthConnectInjector.getInternalHealthConnectMappings();
 
-        mImportManager =
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME_2);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME_3);
+
+        mPriorityHelper = healthConnectInjector.getHealthDataCategoryPriorityHelper();
+        mPriorityHelper.setPriorityOrder(HealthDataCategory.ACTIVITY, List.of(TEST_PACKAGE_NAME));
+
+        Instant timeStamp = Instant.parse("2024-06-04T16:39:12Z");
+        Clock fakeClock = Clock.fixed(timeStamp, ZoneId.of("UTC"));
+
+        ImportManager importManager =
                 new ImportManager(
-                        healthConnectInjector.getAppInfoHelper(),
+                        mAppInfoHelper,
                         mContext,
-                        mNotificationSender,
                         mExportImportSettingsStorage,
                         mTransactionManager,
-                        healthConnectInjector.getDeviceInfoHelper(),
-                        healthConnectInjector.getHealthDataCategoryPriorityHelper());
-        HealthConnectDeviceConfigManager.initializeInstance(mContext);
-
-        mPriorityHelper = HealthDataCategoryPriorityHelper.getInstance();
-        mPriorityHelper.setPriorityOrder(HealthDataCategory.ACTIVITY, List.of(TEST_PACKAGE_NAME));
+                        mDeviceInfoHelper,
+                        mPriorityHelper,
+                        fakeClock,
+                        mNotificationSender);
+        mImportManagerSpy = ExtendedMockito.spy(importManager);
+        doReturn(TEST_COMPRESSED_FILE_SIZE)
+                .when(mImportManagerSpy)
+                .getFileSizeInKb(any(ContentResolver.class), any(Uri.class));
     }
 
     @After
     public void tearDown() throws Exception {
-        DatabaseHelper.clearAllData(mTransactionManager);
+        TestUtils.waitForAllScheduledTasksToComplete();
 
         File testDir = mContext.getDir(TEST_DIRECTORY_NAME, Context.MODE_PRIVATE);
         File[] allContents = testDir.listFiles();
@@ -187,9 +210,9 @@
 
         File zipToImport = zipExportedDb(exportCurrentDb());
 
-        DatabaseHelper.clearAllData(mTransactionManager);
+        mDatabaseHelpers.clearAllData(mTransactionManager);
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -203,7 +226,7 @@
         List<UUID> stepsUuids = ImmutableList.of(UUID.fromString(uuids.get(0)));
         List<UUID> bloodPressureUuids = ImmutableList.of(UUID.fromString(uuids.get(1)));
         ReadTransactionRequest request =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         ImmutableMap.of(
                                 RecordTypeIdentifier.RECORD_TYPE_STEPS,
                                 stepsUuids,
@@ -212,7 +235,11 @@
 
         List<RecordInternal<?>> records =
                 mTransactionManager.readRecordsByIds(
-                        request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                        request,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
         assertThat(records).hasSize(2);
         assertThat(records.get(0).getUuid()).isEqualTo(stepsUuids.get(0));
         assertThat(records.get(1).getUuid()).isEqualTo(bloodPressureUuids.get(0));
@@ -225,22 +252,22 @@
         // Insert data so that getPriorityOrder doesn't remove apps from priority list.
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 345, 100));
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME_2, createStepsRecord(234, 432, 200));
-        AppInfoHelper.getInstance().syncAppInfoRecordTypesUsed();
+        mAppInfoHelper.syncAppInfoRecordTypesUsed();
 
         mPriorityHelper.setPriorityOrder(
                 HealthDataCategory.ACTIVITY, List.of(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME_2));
-        assertThat(mPriorityHelper.getPriorityOrder(HealthDataCategory.ACTIVITY, mContext))
+        assertThat(mPriorityHelper.syncAndGetPriorityOrder(HealthDataCategory.ACTIVITY))
                 .containsExactly(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME_2)
                 .inOrder();
 
         File zipToImport = zipExportedDb(exportCurrentDb());
 
         mPriorityHelper.setPriorityOrder(HealthDataCategory.ACTIVITY, List.of(TEST_PACKAGE_NAME_2));
-        assertThat(mPriorityHelper.getPriorityOrder(HealthDataCategory.ACTIVITY, mContext))
+        assertThat(mPriorityHelper.syncAndGetPriorityOrder(HealthDataCategory.ACTIVITY))
                 .containsExactly(TEST_PACKAGE_NAME_2)
                 .inOrder();
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -251,7 +278,7 @@
                         ExportImportNotificationSender.NOTIFICATION_TYPE_IMPORT_COMPLETE,
                         DEFAULT_USER_HANDLE);
 
-        assertThat(mPriorityHelper.getPriorityOrder(HealthDataCategory.ACTIVITY, mContext))
+        assertThat(mPriorityHelper.syncAndGetPriorityOrder(HealthDataCategory.ACTIVITY))
                 .containsExactly(TEST_PACKAGE_NAME_2, TEST_PACKAGE_NAME)
                 .inOrder();
     }
@@ -262,11 +289,11 @@
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 345, 100));
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME_2, createStepsRecord(234, 432, 200));
         mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME_3, createStepsRecord(400, 510, 305));
-        AppInfoHelper.getInstance().syncAppInfoRecordTypesUsed();
+        mAppInfoHelper.syncAppInfoRecordTypesUsed();
 
         mPriorityHelper.setPriorityOrder(
                 HealthDataCategory.ACTIVITY, List.of(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME_2));
-        assertThat(mPriorityHelper.getPriorityOrder(HealthDataCategory.ACTIVITY, mContext))
+        assertThat(mPriorityHelper.syncAndGetPriorityOrder(HealthDataCategory.ACTIVITY))
                 .containsExactly(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME_2)
                 .inOrder();
 
@@ -274,11 +301,11 @@
 
         mPriorityHelper.setPriorityOrder(
                 HealthDataCategory.ACTIVITY, List.of(TEST_PACKAGE_NAME_2, TEST_PACKAGE_NAME_3));
-        assertThat(mPriorityHelper.getPriorityOrder(HealthDataCategory.ACTIVITY, mContext))
+        assertThat(mPriorityHelper.syncAndGetPriorityOrder(HealthDataCategory.ACTIVITY))
                 .containsExactly(TEST_PACKAGE_NAME_2, TEST_PACKAGE_NAME_3)
                 .inOrder();
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -289,7 +316,7 @@
                         ExportImportNotificationSender.NOTIFICATION_TYPE_IMPORT_COMPLETE,
                         DEFAULT_USER_HANDLE);
 
-        assertThat(mPriorityHelper.getPriorityOrder(HealthDataCategory.ACTIVITY, mContext))
+        assertThat(mPriorityHelper.syncAndGetPriorityOrder(HealthDataCategory.ACTIVITY))
                 .containsExactly(TEST_PACKAGE_NAME_2, TEST_PACKAGE_NAME_3, TEST_PACKAGE_NAME)
                 .inOrder();
     }
@@ -306,7 +333,8 @@
 
         // Delete steps record table in import db.
         String stepsRecordTableName =
-                RecordHelperProvider.getRecordHelper(RecordTypeIdentifier.RECORD_TYPE_STEPS)
+                mInternalHealthConnectMappings
+                        .getRecordHelper(RecordTypeIdentifier.RECORD_TYPE_STEPS)
                         .getMainTableName();
         try (SQLiteDatabase importDb =
                 SQLiteDatabase.openDatabase(
@@ -316,9 +344,9 @@
 
         File zipToImport = zipExportedDb(dbToImport);
 
-        DatabaseHelper.clearAllData(mTransactionManager);
+        mDatabaseHelpers.clearAllData(mTransactionManager);
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -332,7 +360,7 @@
         List<UUID> stepsUuids = ImmutableList.of(UUID.fromString(uuids.get(0)));
         List<UUID> bloodPressureUuids = ImmutableList.of(UUID.fromString(uuids.get(1)));
         ReadTransactionRequest request =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         ImmutableMap.of(
                                 RecordTypeIdentifier.RECORD_TYPE_STEPS,
                                 stepsUuids,
@@ -341,7 +369,11 @@
 
         List<RecordInternal<?>> records =
                 mTransactionManager.readRecordsByIds(
-                        request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                        request,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
         assertThat(records).hasSize(1);
         assertThat(records.get(0).getUuid()).isEqualTo(bloodPressureUuids.get(0));
     }
@@ -350,7 +382,7 @@
     public void deletesTheDatabase() throws Exception {
         File dbToImport = exportCurrentDb();
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(dbToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(dbToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -363,19 +395,42 @@
                         DEFAULT_USER_HANDLE);
 
         File databaseDir =
-                DatabaseContext.create(mContext, IMPORT_DATABASE_DIR_NAME, mContext.getUser())
-                        .getDatabaseDir();
+                StorageContext.create(mContext, mContext.getUser(), IMPORT_DATABASE_DIR_NAME)
+                        .getDataDir();
         assertThat(new File(databaseDir, IMPORT_DATABASE_FILE_NAME).exists()).isFalse();
     }
 
     @Test
+    public void importNotADatabase_logsWrongFileError() throws Exception {
+        File textFileToImport =
+                createTextFile(
+                        mContext.getDir(TEST_DIRECTORY_NAME, Context.MODE_PRIVATE), "export.txt");
+        File zipToImport = zipExportedDb(textFileToImport);
+
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+
+        ExtendedMockito.verify(
+                () ->
+                        ExportImportLogger.logImportStatus(
+                                eq(DATA_IMPORT_STARTED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED)),
+                times(1));
+        ExtendedMockito.verify(
+                () ->
+                        ExportImportLogger.logImportStatus(
+                                DATA_IMPORT_ERROR_WRONG_FILE, 0, 0, TEST_COMPRESSED_FILE_SIZE));
+    }
+
+    @Test
     public void importNotADatabase_setsWrongFileError() throws Exception {
         File textFileToImport =
                 createTextFile(
                         mContext.getDir(TEST_DIRECTORY_NAME, Context.MODE_PRIVATE), "export.txt");
         File zipToImport = zipExportedDb(textFileToImport);
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -401,7 +456,7 @@
                 new File(mContext.getDir(TEST_DIRECTORY_NAME, Context.MODE_PRIVATE), "export.zip");
         Compressor.compress(textFileToImport, "wrong_name.txt", zipToImport);
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -418,6 +473,34 @@
     }
 
     @Test
+    public void importWrongFileName_logsWrongFileError() throws Exception {
+        doReturn(0)
+                .when(mImportManagerSpy)
+                .getFileSizeInKb(any(ContentResolver.class), any(Uri.class));
+
+        File textFileToImport =
+                createTextFile(
+                        mContext.getDir(TEST_DIRECTORY_NAME, Context.MODE_PRIVATE),
+                        "wrong_name.txt");
+        File zipToImport =
+                new File(mContext.getDir(TEST_DIRECTORY_NAME, Context.MODE_PRIVATE), "export.zip");
+        Compressor.compress(textFileToImport, "wrong_name.txt", zipToImport);
+
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+
+        ExtendedMockito.verify(
+                () ->
+                        ExportImportLogger.logImportStatus(
+                                eq(DATA_IMPORT_STARTED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED)),
+                times(1));
+        ExtendedMockito.verify(
+                () -> ExportImportLogger.logImportStatus(DATA_IMPORT_ERROR_WRONG_FILE, 0, 0, 0));
+    }
+
+    @Test
     public void versionMismatch_setsVersionMismatchError() throws Exception {
         File dbToImport = exportCurrentDb();
         try (SQLiteDatabase sqlDbToImport =
@@ -427,7 +510,7 @@
         }
         File zipToImport = zipExportedDb(dbToImport);
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -447,7 +530,7 @@
     public void successfulImport_setsNoError() throws Exception {
         File zipToImport = zipExportedDb(exportCurrentDb());
 
-        mImportManager.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
 
         verify(mNotificationSender, times(1))
                 .sendNotificationAsUser(
@@ -462,6 +545,127 @@
                 .isEqualTo(DATA_IMPORT_ERROR_NONE);
     }
 
+    @Test
+    public void importedStarted_logsNoError() throws Exception {
+        File zipToImport = zipExportedDb(exportCurrentDb());
+
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+
+        ExtendedMockito.verify(
+                () ->
+                        ExportImportLogger.logImportStatus(
+                                eq(DATA_IMPORT_STARTED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED)),
+                times(1));
+    }
+
+    @Test
+    public void successfulImport_logsNoError() throws Exception {
+        File currentDb = exportCurrentDb();
+        File zipToImport = zipExportedDb(currentDb);
+        int expectedOriginalFileSize = intSizeInKb(currentDb);
+
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+
+        ExtendedMockito.verify(
+                () ->
+                        ExportImportLogger.logImportStatus(
+                                eq(DATA_IMPORT_STARTED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED),
+                                eq(ExportImportLogger.NO_VALUE_RECORDED)),
+                times(1));
+
+        ExtendedMockito.verify(
+                () ->
+                        ExportImportLogger.logImportStatus(
+                                DATA_IMPORT_ERROR_NONE,
+                                0,
+                                expectedOriginalFileSize,
+                                TEST_COMPRESSED_FILE_SIZE),
+                times(1));
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_CLOUD_BACKUP_AND_RESTORE)
+    public void copiesAllData_usingInsertAllWithoutAccessLogs() throws Exception {
+        List<String> uuids =
+                mTransactionTestUtils.insertRecords(
+                        TEST_PACKAGE_NAME,
+                        createStepsRecord(123, 345, 100),
+                        createBloodPressureRecord(234, 120.0, 80.0));
+
+        File zipToImport = zipExportedDb(exportCurrentDb());
+
+        mDatabaseHelpers.clearAllData(mTransactionManager);
+
+        // Insert a change log so insertAllWithoutAccessLogs is called instead of insertAll.
+        mTransactionTestUtils.insertChangeLog();
+
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+
+        verify(mNotificationSender, times(1))
+                .sendNotificationAsUser(
+                        ExportImportNotificationSender.NOTIFICATION_TYPE_IMPORT_IN_PROGRESS,
+                        DEFAULT_USER_HANDLE);
+        verify(mNotificationSender, times(1))
+                .sendNotificationAsUser(
+                        ExportImportNotificationSender.NOTIFICATION_TYPE_IMPORT_COMPLETE,
+                        DEFAULT_USER_HANDLE);
+
+        List<UUID> stepsUuids = ImmutableList.of(UUID.fromString(uuids.get(0)));
+        List<UUID> bloodPressureUuids = ImmutableList.of(UUID.fromString(uuids.get(1)));
+        ReadTransactionRequest request =
+                mTransactionTestUtils.getReadTransactionRequest(
+                        ImmutableMap.of(
+                                RecordTypeIdentifier.RECORD_TYPE_STEPS,
+                                stepsUuids,
+                                RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE,
+                                bloodPressureUuids));
+
+        List<RecordInternal<?>> records =
+                mTransactionManager.readRecordsByIds(
+                        request,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
+        assertThat(records).hasSize(2);
+        assertThat(records.get(0).getUuid()).isEqualTo(stepsUuids.get(0));
+        assertThat(records.get(1).getUuid()).isEqualTo(bloodPressureUuids.get(0));
+        assertThat(mExportImportSettingsStorage.getImportStatus().getDataImportError())
+                .isEqualTo(DATA_IMPORT_ERROR_NONE);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_CLOUD_BACKUP_AND_RESTORE)
+    public void copiesAllData_changeLogsTokenExists_generateChangeLogs() throws Exception {
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 345, 100));
+        File zipToImport = zipExportedDb(exportCurrentDb());
+        mDatabaseHelpers.clearAllData(mTransactionManager);
+
+        // Insert a change log.
+        mTransactionTestUtils.insertChangeLog();
+
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+
+        assertThat(mTransactionTestUtils.queryNumEntries(ChangeLogsHelper.TABLE_NAME)).isEqualTo(1);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_CLOUD_BACKUP_AND_RESTORE)
+    public void copiesAllData_noChangeLogsToken_noChangeLogs() throws Exception {
+        mTransactionTestUtils.insertRecords(TEST_PACKAGE_NAME, createStepsRecord(123, 345, 100));
+        File zipToImport = zipExportedDb(exportCurrentDb());
+        mDatabaseHelpers.clearAllData(mTransactionManager);
+
+        mImportManagerSpy.runImport(mContext.getUser(), Uri.fromFile(zipToImport));
+
+        assertThat(mTransactionTestUtils.queryNumEntries(ChangeLogsHelper.TABLE_NAME)).isEqualTo(0);
+    }
+
     private File exportCurrentDb() throws Exception {
         File originalDb = mTransactionManager.getDatabasePath();
         File dbToImport =
@@ -484,4 +688,8 @@
         fileWriter.close();
         return file;
     }
+
+    private int intSizeInKb(File file) {
+        return (int) (file.length() / 1024.0);
+    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/injector/HealthConnectInjectorTest.java b/tests/unittests/src/com/android/server/healthconnect/injector/HealthConnectInjectorTest.java
index 254844b..4a659a4 100644
--- a/tests/unittests/src/com/android/server/healthconnect/injector/HealthConnectInjectorTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/injector/HealthConnectInjectorTest.java
@@ -22,9 +22,8 @@
 
 import androidx.test.InstrumentationRegistry;
 
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.permission.PackageInfoUtils;
-import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 
 import org.junit.Before;
@@ -34,43 +33,50 @@
 
 public class HealthConnectInjectorTest {
 
-    private Context mContext;
     @Mock private PackageInfoUtils mPackageInfoUtils;
-    @Mock private TransactionManager mTransactionManager;
     @Mock private HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
 
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock
+    private com.android.server.healthconnect.permission.FirstGrantTimeManager
+            mFirstGrantTimeManager;
+
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
+    private HealthConnectInjectorImpl.Builder mBuilder;
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mContext = InstrumentationRegistry.getContext();
-        HealthConnectDeviceConfigManager.initializeInstance(mContext);
+        Context context = InstrumentationRegistry.getContext();
+        mBuilder =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager);
     }
 
     @Test
     public void setFakePackageInfoUtils_injectorReturnsFakePackageInfoUtils() {
         HealthConnectInjector healthConnectInjector =
-                HealthConnectInjectorImpl.newBuilderForTest(mContext)
-                        .setPackageInfoUtils(mPackageInfoUtils)
-                        .build();
+                mBuilder.setPackageInfoUtils(mPackageInfoUtils).build();
 
         assertThat(healthConnectInjector.getPackageInfoUtils()).isEqualTo(mPackageInfoUtils);
     }
 
     @Test
     public void testProductionInjector_injectorReturnsOriginalPackageInfoUtils() {
-        HealthConnectInjector healthConnectInjector =
-                HealthConnectInjectorImpl.newBuilderForTest(mContext).build();
+        HealthConnectInjector healthConnectInjector = mBuilder.build();
 
-        assertThat(healthConnectInjector.getPackageInfoUtils())
-                .isEqualTo(PackageInfoUtils.getInstance());
+        assertThat(healthConnectInjector.getPackageInfoUtils()).isNotEqualTo(mPackageInfoUtils);
     }
 
     @Test
-    public void setFakeHealthDataCategoryPriorityHelper_injectorReturnsFakeTransactionManager() {
+    public void
+            setFakeHealthDataCategoryPriorityHelper_injectorReturnsFakeHealthDataCategoryPriorityHelper() {
         HealthConnectInjector healthConnectInjector =
-                HealthConnectInjectorImpl.newBuilderForTest(mContext)
-                        .setHealthDataCategoryPriorityHelper(mHealthDataCategoryPriorityHelper)
+                mBuilder.setHealthDataCategoryPriorityHelper(mHealthDataCategoryPriorityHelper)
                         .build();
 
         assertThat(healthConnectInjector.getHealthDataCategoryPriorityHelper())
@@ -79,10 +85,9 @@
 
     @Test
     public void testProductionInjector_injectorReturnsOriginalHealthDataCategoryPriorityHelper() {
-        HealthConnectInjector healthConnectInjector =
-                HealthConnectInjectorImpl.newBuilderForTest(mContext).build();
+        HealthConnectInjector healthConnectInjector = mBuilder.build();
 
         assertThat(healthConnectInjector.getHealthDataCategoryPriorityHelper())
-                .isEqualTo(HealthDataCategoryPriorityHelper.getInstance());
+                .isNotEqualTo(mHealthDataCategoryPriorityHelper);
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/logging/DailyLoggingServiceTest.java b/tests/unittests/src/com/android/server/healthconnect/logging/DailyLoggingServiceTest.java
index b5bb60c..933443f 100644
--- a/tests/unittests/src/com/android/server/healthconnect/logging/DailyLoggingServiceTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/logging/DailyLoggingServiceTest.java
@@ -17,57 +17,94 @@
 package healthconnect.logging;
 
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_EXPORT_IMPORT_STATS_REPORTED;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PERMISSION_STATS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_STORAGE_STATS;
+import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_PHR_USAGE_STATS;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_STORAGE_STATS;
 import static android.health.HealthFitnessStatsLog.HEALTH_CONNECT_USAGE_STATS;
+import static android.health.connect.HealthPermissions.READ_DISTANCE;
+import static android.health.connect.HealthPermissions.READ_EXERCISE;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_CONDITIONS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
+import static android.healthconnect.cts.utils.DataFactory.NOW;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERMISSION_METRICS;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.Context;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
 import android.database.DatabaseUtils;
 import android.health.HealthFitnessStatsLog;
 import android.health.connect.HealthConnectManager;
-import android.os.Process;
-import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
 import com.android.server.healthconnect.logging.DailyLoggingService;
+import com.android.server.healthconnect.logging.UsageStatsCollector;
+import com.android.server.healthconnect.permission.PackageInfoUtils;
+import com.android.server.healthconnect.storage.StorageContext;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.BloodPressureRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseStatsCollector;
+import com.android.server.healthconnect.storage.datatypehelpers.FakeTimeSource;
 import com.android.server.healthconnect.storage.datatypehelpers.HeartRateRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HeightRecordHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.SpeedRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.StepsRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.TotalCaloriesBurnedRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.Vo2MaxRecordHelper;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Answers;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.quality.Strictness;
 
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 public class DailyLoggingServiceTest {
 
-    @Rule
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthFitnessStatsLog.class)
@@ -79,54 +116,108 @@
                     .build();
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
+    private StorageContext mStorageContext;
 
     @Mock private PackageInfo mPackageInfoConnectedApp;
+    @Mock private PackageInfo mPackageInfoConnectedAppTwo;
     @Mock private PackageInfo mPackageInfoNotHoldingPermission;
     @Mock private PackageInfo mPackageInfoNotConnectedApp;
+    @Mock private PackageInfo mPackageInfoNotConnectedAppTwo;
     @Mock private PreferenceHelper mPreferenceHelper;
+    @Mock private PreferencesManager mPreferencesManager;
     @Mock private AccessLogsHelper mAccessLogsHelper;
-    private final UserHandle mCurrentUser = Process.myUserHandle();
-    private static final String HEALTH_PERMISSION = "HEALTH_PERMISSION";
+    @Mock private TransactionManager mTransactionManager;
+    @Mock private MedicalDataSourceHelper mMedicalDataSourceHelper;
+    @Mock private MedicalResourceHelper mMedicalResourceHelper;
+
+    private DatabaseStatsCollector mDatabaseStatsCollector;
+    private UsageStatsCollector mUsageStatsCollector;
+
+    private FakeTimeSource mFakeTimeSource;
+    @Captor private ArgumentCaptor<List<String>> mStringListCaptor;
+
     private static final String NOT_HEALTH_PERMISSION = "NOT_HEALTH_PERMISSION";
+    private static final String READ_STEPS = "android.permission.health.READ_STEPS";
+    private static final String WRITE_STEPS = "android.permission.health.WRITE_STEPS";
+    private static final String WRITE_EXERCISE = "android.permission.health.WRITE_EXERCISE";
+    private static final String READ_STEPS_SHORTENED = "READ_STEPS";
+    private static final String WRITE_STEPS_SHORTENED = "WRITE_STEPS";
+    private static final String WRITE_EXERCISE_SHORTENED = "WRITE_EXERCISE";
     private static final String USER_MOST_RECENT_ACCESS_LOG_TIME =
             "USER_MOST_RECENT_ACCESS_LOG_TIME";
     private static final String EXPORT_PERIOD_PREFERENCE_KEY = "export_period_key";
+    private static final String CONNECTED_APP_PACKAGE_NAME = "connected.app";
+    private static final String CONNECTED_APP_TWO_PACKAGE_NAME = "connected.app.two";
+    private static final String NOT_CONNECTED_APP_PACKAGE_NAME = "not.connected.app";
+    private static final String NOT_CONNECTED_APP_PACKAGE_NAME_TWO = "not.connected.app.2";
+    private static final String NOT_HOLDING_HC_PERMISSIONS_APP_PACKAGE_NAME =
+            "not.holding.permission.app";
 
     @Before
     public void mockStatsLog() {
+        mFakeTimeSource = new FakeTimeSource(NOW);
+        when(mStorageContext.createContextAsUser(any(), anyInt())).thenReturn(mStorageContext);
         ExtendedMockito.doReturn(true)
-                .when(() -> HealthConnectManager.isHealthPermission(mContext, HEALTH_PERMISSION));
+                .when(() -> HealthConnectManager.isHealthPermission(mStorageContext, READ_STEPS));
         ExtendedMockito.doReturn(false)
                 .when(
                         () ->
                                 HealthConnectManager.isHealthPermission(
-                                        mContext, NOT_HEALTH_PERMISSION));
-        mPackageInfoConnectedApp.requestedPermissions = new String[] {HEALTH_PERMISSION};
+                                        mStorageContext, NOT_HEALTH_PERMISSION));
+        ExtendedMockito.doReturn(Set.of(READ_STEPS, WRITE_STEPS, WRITE_EXERCISE))
+                .when(() -> HealthConnectManager.getHealthPermissions(mStorageContext));
+        mPackageInfoConnectedApp.requestedPermissions = new String[] {READ_STEPS, WRITE_STEPS};
         mPackageInfoConnectedApp.requestedPermissionsFlags =
-                new int[] {PackageInfo.REQUESTED_PERMISSION_GRANTED};
+                new int[] {
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED
+                };
+        mPackageInfoConnectedApp.packageName = CONNECTED_APP_PACKAGE_NAME;
+
+        mPackageInfoConnectedAppTwo.requestedPermissions =
+                new String[] {READ_STEPS, WRITE_STEPS, WRITE_EXERCISE};
+        mPackageInfoConnectedAppTwo.requestedPermissionsFlags =
+                new int[] {
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED
+                };
+        mPackageInfoConnectedAppTwo.packageName = CONNECTED_APP_TWO_PACKAGE_NAME;
 
         mPackageInfoNotHoldingPermission.requestedPermissions =
                 new String[] {NOT_HEALTH_PERMISSION};
         mPackageInfoNotHoldingPermission.requestedPermissionsFlags =
                 new int[] {PackageInfo.REQUESTED_PERMISSION_GRANTED};
+        mPackageInfoNotHoldingPermission.packageName = NOT_HOLDING_HC_PERMISSIONS_APP_PACKAGE_NAME;
 
-        mPackageInfoNotConnectedApp.requestedPermissions = new String[] {HEALTH_PERMISSION};
+        mPackageInfoNotConnectedApp.requestedPermissions = new String[] {READ_STEPS};
         mPackageInfoNotConnectedApp.requestedPermissionsFlags =
                 new int[] {PackageInfo.REQUESTED_PERMISSION_NEVER_FOR_LOCATION};
+        mPackageInfoNotConnectedApp.packageName = NOT_CONNECTED_APP_PACKAGE_NAME;
+
+        mPackageInfoNotConnectedAppTwo.requestedPermissions = new String[] {READ_STEPS};
+        mPackageInfoNotConnectedAppTwo.requestedPermissionsFlags =
+                new int[] {PackageInfo.REQUESTED_PERMISSION_NEVER_FOR_LOCATION};
+        mPackageInfoNotConnectedAppTwo.packageName = NOT_CONNECTED_APP_PACKAGE_NAME_TWO;
+
+        mDatabaseStatsCollector = Mockito.spy(new DatabaseStatsCollector(mTransactionManager));
+        mUsageStatsCollector =
+                new UsageStatsCollector(
+                        mStorageContext,
+                        mPreferenceHelper,
+                        mPreferencesManager,
+                        mAccessLogsHelper,
+                        mFakeTimeSource,
+                        mMedicalResourceHelper,
+                        mMedicalDataSourceHelper,
+                        new PackageInfoUtils());
     }
 
     @Test
     public void testDatabaseLogsStats() {
 
-        TransactionManager transactionManager = mock(TransactionManager.class);
-
-        ExtendedMockito.doReturn(transactionManager)
-                .when(TransactionManager::getInitialisedInstance);
-
-        when(transactionManager.getDatabaseSize(mContext)).thenReturn(1L);
-
-        when(transactionManager.getNumberOfEntriesInTheTable(any())).thenReturn(0L);
+        when(mTransactionManager.getDatabaseSize()).thenReturn(1L);
+        when(mTransactionManager.queryNumEntries(any())).thenReturn(0L);
 
         for (String tableName :
                 new String[] {
@@ -139,11 +230,10 @@
                     SpeedRecordHelper.TABLE_NAME,
                     HeartRateRecordHelper.TABLE_NAME
                 }) {
-            doReturn(2L).when(transactionManager).getNumberOfEntriesInTheTable(tableName);
+            when(mTransactionManager.queryNumEntries(tableName)).thenReturn(2L);
         }
 
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -161,32 +251,10 @@
 
     @Test
     public void testDatabaseLogsStats_userDoesNotUseHealthConnect() {
+        when(mTransactionManager.getDatabaseSize()).thenReturn(1L);
+        when(mTransactionManager.queryNumEntries(any())).thenReturn(0L);
 
-        TransactionManager transactionManager = mock(TransactionManager.class);
-
-        ExtendedMockito.doReturn(transactionManager)
-                .when(TransactionManager::getInitialisedInstance);
-
-        when(transactionManager.getDatabaseSize(mContext)).thenReturn(1L);
-
-        when(transactionManager.getNumberOfEntriesInTheTable(any())).thenReturn(0L);
-
-        for (String tableName :
-                new String[] {
-                    ChangeLogsHelper.TABLE_NAME,
-                    BloodPressureRecordHelper.BLOOD_PRESSURE_RECORD_TABLE_NAME,
-                    HeightRecordHelper.HEIGHT_RECORD_TABLE_NAME,
-                    Vo2MaxRecordHelper.VO2_MAX_RECORD_TABLE_NAME,
-                    StepsRecordHelper.STEPS_TABLE_NAME,
-                    TotalCaloriesBurnedRecordHelper.TOTAL_CALORIES_BURNED_RECORD_TABLE_NAME,
-                    SpeedRecordHelper.TABLE_NAME,
-                    HeartRateRecordHelper.TABLE_NAME
-                }) {
-            doReturn(0L).when(transactionManager).getNumberOfEntriesInTheTable(tableName);
-        }
-
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -205,15 +273,12 @@
 
         when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
                 .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 0));
-        when(mContext.createContextAsUser(mCurrentUser, 0)
-                        .getPackageManager()
-                        .getInstalledPackages(any()))
+        when(mStorageContext.getPackageManager().getInstalledPackages(any()))
                 .thenReturn(List.of(mPackageInfoConnectedApp, mPackageInfoNotHoldingPermission));
         when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 0)));
 
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         // Makes sure we do not have count any app that does not have Health Connect permission
         // declared in the manifest as a connected or an available app.
@@ -229,15 +294,12 @@
 
         when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
                 .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 0));
-        when(mContext.createContextAsUser(mCurrentUser, 0)
-                        .getPackageManager()
-                        .getInstalledPackages(any()))
+        when(mStorageContext.getPackageManager().getInstalledPackages(any()))
                 .thenReturn(List.of(mPackageInfoConnectedApp));
         when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 0)));
 
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -251,15 +313,12 @@
 
         when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
                 .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 31));
-        when(mContext.createContextAsUser(mCurrentUser, 0)
-                        .getPackageManager()
-                        .getInstalledPackages(any()))
-                .thenReturn(List.of(mPackageInfoNotConnectedApp, mPackageInfoNotConnectedApp));
+        when(mStorageContext.getPackageManager().getInstalledPackages(any()))
+                .thenReturn(List.of(mPackageInfoNotConnectedApp, mPackageInfoNotConnectedAppTwo));
         when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 31)));
 
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -273,15 +332,12 @@
 
         when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
                 .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 1));
-        when(mContext.createContextAsUser(mCurrentUser, 0)
-                        .getPackageManager()
-                        .getInstalledPackages(any()))
+        when(mStorageContext.getPackageManager().getInstalledPackages(any()))
                 .thenReturn(List.of(mPackageInfoNotHoldingPermission));
         when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 1)));
 
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -296,8 +352,8 @@
                 .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 1));
         when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 1)));
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -310,14 +366,12 @@
     public void testDailyUsageStatsLogs_healthConnectAccessed31DaysAgo_userNotMonthlyActive() {
         when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
                 .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 31));
-        when(mContext.createContextAsUser(mCurrentUser, 0)
-                        .getPackageManager()
-                        .getInstalledPackages(any()))
-                .thenReturn(List.of(mPackageInfoNotConnectedApp, mPackageInfoNotConnectedApp));
+        when(mStorageContext.getPackageManager().getInstalledPackages(any()))
+                .thenReturn(List.of(mPackageInfoNotConnectedApp, mPackageInfoNotConnectedAppTwo));
         when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 31)));
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -334,8 +388,8 @@
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 1)));
         when(mPreferenceHelper.getPreference(EXPORT_PERIOD_PREFERENCE_KEY))
                 .thenReturn(String.valueOf(7));
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -351,8 +405,8 @@
         when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 1)));
         when(mPreferenceHelper.getPreference(EXPORT_PERIOD_PREFERENCE_KEY)).thenReturn(null);
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -367,8 +421,8 @@
                 .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 31));
         when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
                 .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 31)));
-        DailyLoggingService.logDailyMetrics(
-                mContext, mCurrentUser, mPreferenceHelper, mAccessLogsHelper);
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
 
         ExtendedMockito.verify(
                 () ->
@@ -377,6 +431,311 @@
                 never());
     }
 
+    @Test
+    @EnableFlags(FLAG_PERMISSION_METRICS)
+    public void permissionMetricsEnabled_oneConnectedApp_testPermissionsStatsLogs() {
+        when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
+                .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 0));
+        when(mStorageContext.getPackageManager().getInstalledPackages(any()))
+                .thenReturn(
+                        List.of(
+                                mPackageInfoConnectedApp,
+                                mPackageInfoNotHoldingPermission,
+                                mPackageInfoNotConnectedApp));
+        when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
+                .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 0)));
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PERMISSION_STATS),
+                                eq(CONNECTED_APP_PACKAGE_NAME),
+                                eq(new String[] {READ_STEPS_SHORTENED, WRITE_STEPS_SHORTENED})),
+                times(1));
+    }
+
+    @Test
+    @EnableFlags(FLAG_PERMISSION_METRICS)
+    public void permissionMetricsEnabled_twoConnectedApps_testPermissionsStatsLogs() {
+
+        when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
+                .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 0));
+        when(mStorageContext.getPackageManager().getInstalledPackages(any()))
+                .thenReturn(
+                        List.of(
+                                mPackageInfoConnectedApp,
+                                mPackageInfoNotHoldingPermission,
+                                mPackageInfoNotConnectedApp,
+                                mPackageInfoConnectedAppTwo));
+        when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
+                .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 0)));
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PERMISSION_STATS),
+                                eq(CONNECTED_APP_PACKAGE_NAME),
+                                eq(new String[] {READ_STEPS_SHORTENED, WRITE_STEPS_SHORTENED})),
+                times(1));
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PERMISSION_STATS),
+                                eq(CONNECTED_APP_TWO_PACKAGE_NAME),
+                                eq(
+                                        new String[] {
+                                            READ_STEPS_SHORTENED,
+                                            WRITE_STEPS_SHORTENED,
+                                            WRITE_EXERCISE_SHORTENED
+                                        })),
+                times(1));
+    }
+
+    @Test
+    @DisableFlags(FLAG_PERMISSION_METRICS)
+    public void permissionMetricsDisabled_oneConnectedApps_testPermissionsStatsDoNotLog() {
+
+        when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
+                .thenReturn(subtractDaysFromInstantNow(/* numberOfDays= */ 0));
+        when(mStorageContext.getPackageManager().getInstalledPackages(any()))
+                .thenReturn(
+                        List.of(
+                                mPackageInfoConnectedApp,
+                                mPackageInfoNotHoldingPermission,
+                                mPackageInfoNotConnectedApp));
+        when(mPreferenceHelper.getPreference(USER_MOST_RECENT_ACCESS_LOG_TIME))
+                .thenReturn(String.valueOf(subtractDaysFromInstantNow(/* numberOfDays= */ 0)));
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PERMISSION_STATS),
+                                eq(CONNECTED_APP_PACKAGE_NAME),
+                                eq(new String[] {READ_STEPS_SHORTENED, WRITE_STEPS_SHORTENED})),
+                never());
+    }
+
+    @Test
+    @DisableFlags(FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY)
+    public void phrStats_flagDisabled_expectNoLogs() {
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PHR_USAGE_STATS),
+                                anyInt(),
+                                anyInt(),
+                                anyInt(),
+                                anyInt()),
+                never());
+
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HealthFitnessStatsLog.HEALTH_CONNECT_PHR_STORAGE_STATS),
+                                anyInt()),
+                never());
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY
+    })
+    public void phrStats_flagEnabledAndIsMonthlyActiveUser_expectCorrectLogs() {
+        when(mMedicalDataSourceHelper.getMedicalDataSourcesCount()).thenReturn(101);
+        when(mMedicalResourceHelper.getMedicalResourcesCount()).thenReturn(204);
+        when(mPreferencesManager.getPhrLastReadMedicalResourcesApiTimeStamp())
+                .thenReturn(NOW.minus(29, ChronoUnit.DAYS));
+        mFakeTimeSource.setInstant(NOW);
+        mockGrantedPermissions(
+                Map.of(
+                        CONNECTED_APP_PACKAGE_NAME,
+                        List.of(WRITE_STEPS, READ_STEPS),
+                        CONNECTED_APP_PACKAGE_NAME + "1",
+                        List.of(WRITE_STEPS, READ_STEPS, WRITE_MEDICAL_DATA),
+                        CONNECTED_APP_PACKAGE_NAME + "2",
+                        List.of(WRITE_STEPS, READ_STEPS, READ_MEDICAL_DATA_VACCINES),
+                        CONNECTED_APP_PACKAGE_NAME + "3",
+                        List.of(
+                                WRITE_STEPS,
+                                READ_STEPS,
+                                WRITE_MEDICAL_DATA,
+                                READ_MEDICAL_DATA_CONDITIONS)));
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PHR_USAGE_STATS),
+                                eq(101),
+                                eq(204),
+                                /* isPhrMonthlyActiveUser */ eq(true),
+                                anyInt()),
+                times(1));
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY
+    })
+    public void phrStats_flagEnabledAndIsNotMonthlyActiveUser_expectCorrectLogs() {
+        when(mMedicalDataSourceHelper.getMedicalDataSourcesCount()).thenReturn(101);
+        when(mMedicalResourceHelper.getMedicalResourcesCount()).thenReturn(204);
+        when(mPreferencesManager.getPhrLastReadMedicalResourcesApiTimeStamp())
+                .thenReturn(NOW.minus(31, ChronoUnit.DAYS));
+        mFakeTimeSource.setInstant(NOW);
+        mockGrantedPermissions(
+                Map.of(
+                        CONNECTED_APP_PACKAGE_NAME,
+                        List.of(WRITE_STEPS, READ_STEPS),
+                        CONNECTED_APP_PACKAGE_NAME + "1",
+                        List.of(WRITE_MEDICAL_DATA),
+                        CONNECTED_APP_PACKAGE_NAME + "2",
+                        List.of(WRITE_STEPS, READ_EXERCISE),
+                        CONNECTED_APP_PACKAGE_NAME + "3",
+                        List.of(WRITE_STEPS, READ_DISTANCE)));
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PHR_USAGE_STATS),
+                                eq(101),
+                                eq(204),
+                                /* isPhrMonthlyActiveUser */ eq(false),
+                                eq(0)),
+                times(1));
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY
+    })
+    public void phrStats_flagEnabledAndIsNotMonthlyActiveUserDueToNoTimeStamp_expectCorrectLogs() {
+        when(mPreferencesManager.getPhrLastReadMedicalResourcesApiTimeStamp()).thenReturn(null);
+        mockGrantedPermissions(
+                Map.of(
+                        CONNECTED_APP_PACKAGE_NAME,
+                        List.of(WRITE_STEPS, READ_STEPS, READ_MEDICAL_DATA_VACCINES),
+                        CONNECTED_APP_PACKAGE_NAME + "1",
+                        List.of(WRITE_STEPS, READ_STEPS, WRITE_MEDICAL_DATA),
+                        CONNECTED_APP_PACKAGE_NAME + "2",
+                        List.of(
+                                READ_MEDICAL_DATA_PERSONAL_DETAILS,
+                                READ_MEDICAL_DATA_PERSONAL_DETAILS),
+                        CONNECTED_APP_PACKAGE_NAME + "3",
+                        List.of(
+                                WRITE_STEPS,
+                                READ_DISTANCE,
+                                READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES)));
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        ExtendedMockito.verify(
+                () ->
+                        HealthFitnessStatsLog.write(
+                                eq(HEALTH_CONNECT_PHR_USAGE_STATS),
+                                anyInt(),
+                                anyInt(),
+                                /* isPhrMonthlyActiveUser */ eq(false),
+                                eq(3)),
+                times(1));
+    }
+
+    private void mockGrantedPermissions(
+            Map<String, List<String>> packageNameToGrantedPermissionsMap) {
+        // This is needed so HealthConnectManager recognizes all the permissions in
+        // packageNameToGrantedPermissionsMap as health permissions.
+        ExtendedMockito.doReturn(
+                        packageNameToGrantedPermissionsMap.values().stream()
+                                .flatMap(List::stream)
+                                .collect(Collectors.toSet()))
+                .when(() -> HealthConnectManager.getHealthPermissions(mStorageContext));
+
+        List<PackageInfo> installedPackages =
+                packageNameToGrantedPermissionsMap.entrySet().stream()
+                        .map(
+                                entry -> {
+                                    String packageName = entry.getKey();
+                                    List<String> grantedPermissions = entry.getValue();
+                                    PackageInfo packageInfo = mock(PackageInfo.class);
+                                    packageInfo.requestedPermissions =
+                                            grantedPermissions.toArray(new String[0]);
+                                    packageInfo.requestedPermissionsFlags =
+                                            grantedPermissions.stream()
+                                                    .mapToInt(
+                                                            perm ->
+                                                                    PackageInfo
+                                                                            .REQUESTED_PERMISSION_GRANTED)
+                                                    .toArray();
+                                    packageInfo.packageName = packageName;
+                                    return packageInfo;
+                                })
+                        .toList();
+        PackageManager packageManager = mStorageContext.getPackageManager();
+        clearInvocations(packageManager);
+        when(packageManager.getInstalledPackages(any())).thenReturn(installedPackages);
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY
+    })
+    public void phrStats_flagEnabled_phrDataExists_expectCorrectPhrDbStatsLogs() {
+        doReturn(101L)
+                .when(mDatabaseStatsCollector)
+                .getFileBytes(
+                        eq(
+                                Set.of(
+                                        MedicalDataSourceHelper.getMainTableName(),
+                                        MedicalResourceHelper.getMainTableName(),
+                                        MedicalResourceIndicesHelper.getTableName())));
+        when(mMedicalResourceHelper.getMedicalResourcesCount()).thenReturn(1);
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        ExtendedMockito.verify(
+                () -> HealthFitnessStatsLog.write(eq(HEALTH_CONNECT_PHR_STORAGE_STATS), eq(101L)),
+                times(1));
+    }
+
+    @Test
+    @EnableFlags({
+        FLAG_PERSONAL_HEALTH_RECORD,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_TELEMETRY
+    })
+    public void phrStats_flagEnabled_noPhRdata_expectNoPhrDbStatsLogs() {
+        doReturn(101L).when(mDatabaseStatsCollector).getFileBytes(mStringListCaptor.capture());
+        when(mMedicalResourceHelper.getMedicalResourcesCount()).thenReturn(0);
+        when(mMedicalDataSourceHelper.getMedicalDataSourcesCount()).thenReturn(0);
+
+        DailyLoggingService.logDailyMetrics(mUsageStatsCollector, mDatabaseStatsCollector);
+
+        verify(mDatabaseStatsCollector, never()).getFileBytes(any());
+        ExtendedMockito.verify(
+                () -> HealthFitnessStatsLog.write(eq(HEALTH_CONNECT_PHR_STORAGE_STATS), anyInt()),
+                never());
+    }
+
     private long subtractDaysFromInstantNow(int numberOfDays) {
         return Instant.now().minus(numberOfDays, ChronoUnit.DAYS).toEpochMilli();
     }
diff --git a/tests/unittests/src/com/android/server/healthconnect/logging/HealthConnectServiceLoggerTest.java b/tests/unittests/src/com/android/server/healthconnect/logging/HealthConnectServiceLoggerTest.java
index 2321762..7067e49 100644
--- a/tests/unittests/src/com/android/server/healthconnect/logging/HealthConnectServiceLoggerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/logging/HealthConnectServiceLoggerTest.java
@@ -39,6 +39,7 @@
 import static android.health.connect.ratelimiter.RateLimiter.QuotaBucket.QUOTA_BUCKET_WRITES_PER_24H_BACKGROUND;
 import static android.health.connect.ratelimiter.RateLimiter.QuotaBucket.QUOTA_BUCKET_WRITES_PER_24H_FOREGROUND;
 
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.anyLong;
 import static org.mockito.Mockito.eq;
@@ -62,6 +63,7 @@
             HEALTH_CONNECT_API_CALLED__CALLER_FOREGROUND_STATE__FOREGROUND;
     private static final int CALLER_FOREGROUND_STATE_BACKGROUND =
             HEALTH_CONNECT_API_CALLED__CALLER_FOREGROUND_STATE__BACKGROUND;
+    private static final String TEST_APP_PACKAGE_NAME = "com.test.app";
 
     @Rule
     public final ExtendedMockitoRule mExtendedMockitoRule =
@@ -76,15 +78,25 @@
         ExtendedMockito.verify(
                 () ->
                         HealthFitnessStatsLog.write(
-                                anyInt(), anyInt(), anyInt(), anyInt(), anyLong(), anyInt(),
-                                anyInt(), anyInt()),
+                                anyInt(),
+                                anyInt(),
+                                anyInt(),
+                                anyInt(),
+                                anyLong(),
+                                anyInt(),
+                                anyInt(),
+                                anyInt(),
+                                anyString()),
                 times(0));
     }
 
     @Test
     public void testLogs_notHoldsDataManagementPermission() {
 
-        new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN).build().log();
+        new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
+                .build()
+                .log();
 
         // then
         ExtendedMockito.verify(
@@ -97,7 +109,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.NOT_USED),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -106,6 +119,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setRateLimit(QUOTA_BUCKET_READS_PER_15M_FOREGROUND, 3000)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -120,7 +134,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.FOREGROUND_15_MIN_BW_3000_TO_4000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -129,6 +144,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setRateLimit(QUOTA_BUCKET_READS_PER_15M_BACKGROUND, 3000)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -143,7 +159,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.BACKGROUND_15_MIN_ABOVE_3000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -152,6 +169,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setRateLimit(QUOTA_BUCKET_READS_PER_24H_BACKGROUND, 3000)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -166,7 +184,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.BACKGROUND_24_HRS_BW_3000_TO_4000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -175,6 +194,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setRateLimit(QUOTA_BUCKET_READS_PER_24H_FOREGROUND, 3000)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -189,7 +209,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.FOREGROUND_24_HRS_BW_3000_TO_4000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -198,6 +219,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setRateLimit(QUOTA_BUCKET_WRITES_PER_15M_FOREGROUND, 3000)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -212,7 +234,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.FOREGROUND_15_MIN_BW_3000_TO_4000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -221,6 +244,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setRateLimit(QUOTA_BUCKET_WRITES_PER_15M_BACKGROUND, 3000)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -235,7 +259,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.BACKGROUND_15_MIN_ABOVE_3000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -244,6 +269,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setRateLimit(QUOTA_BUCKET_WRITES_PER_24H_BACKGROUND, 3000)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -258,7 +284,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.BACKGROUND_24_HRS_BW_3000_TO_4000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -267,6 +294,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setRateLimit(QUOTA_BUCKET_WRITES_PER_24H_FOREGROUND, 3000)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -281,7 +309,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.FOREGROUND_24_HRS_BW_3000_TO_4000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -290,6 +319,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setHealthDataServiceApiStatusSuccess()
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -304,7 +334,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.NOT_USED),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -313,6 +344,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setHealthDataServiceApiStatusError(2)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -327,7 +359,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.NOT_USED),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -336,6 +369,7 @@
 
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setNumberOfRecords(10)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -350,7 +384,8 @@
                                 anyLong(),
                                 eq(10),
                                 eq(RateLimitingRanges.NOT_USED),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -361,6 +396,7 @@
                 .setHealthDataServiceApiStatusSuccess()
                 .setRateLimit(QUOTA_BUCKET_WRITES_PER_15M_BACKGROUND, 3000)
                 .setNumberOfRecords(10)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -375,7 +411,8 @@
                                 anyLong(),
                                 eq(10),
                                 eq(RateLimitingRanges.BACKGROUND_15_MIN_ABOVE_3000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -386,6 +423,7 @@
                 .setHealthDataServiceApiStatusError(1)
                 .setRateLimit(QUOTA_BUCKET_WRITES_PER_15M_BACKGROUND, 3000)
                 .setNumberOfRecords(10)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -400,7 +438,8 @@
                                 anyLong(),
                                 eq(10),
                                 eq(RateLimitingRanges.BACKGROUND_15_MIN_ABOVE_3000),
-                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED)),
+                                eq(CALLER_FOREGROUND_STATE_UNSPECIFIED),
+                                eq(TEST_APP_PACKAGE_NAME)),
                 times(1));
     }
 
@@ -408,6 +447,7 @@
     public void testCallerForegroundState() {
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setCallerForegroundState(true)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -422,13 +462,15 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.NOT_USED),
-                                eq(CALLER_FOREGROUND_STATE_FOREGROUND)));
+                                eq(CALLER_FOREGROUND_STATE_FOREGROUND),
+                                eq(TEST_APP_PACKAGE_NAME)));
     }
 
     @Test
     public void testCallerBackgroundState() {
         new HealthConnectServiceLogger.Builder(false, ApiMethods.API_METHOD_UNKNOWN)
                 .setCallerForegroundState(false)
+                .setPackageName(TEST_APP_PACKAGE_NAME)
                 .build()
                 .log();
 
@@ -443,7 +485,8 @@
                                 anyLong(),
                                 eq(0),
                                 eq(RateLimitingRanges.NOT_USED),
-                                eq(CALLER_FOREGROUND_STATE_BACKGROUND)));
+                                eq(CALLER_FOREGROUND_STATE_BACKGROUND),
+                                eq(TEST_APP_PACKAGE_NAME)));
     }
 
     private static final class RateLimitingRanges {
diff --git a/tests/unittests/src/com/android/server/healthconnect/logging/UsageStatsCollectorTest.java b/tests/unittests/src/com/android/server/healthconnect/logging/UsageStatsCollectorTest.java
new file mode 100644
index 0000000..ffbc4c0
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/logging/UsageStatsCollectorTest.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.logging;
+
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_CONDITIONS;
+import static android.health.connect.HealthPermissions.READ_STEPS;
+import static android.health.connect.HealthPermissions.WRITE_STEPS;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+import static com.android.server.healthconnect.logging.UsageStatsCollector.EXPORT_PERIOD_PREFERENCE_KEY;
+import static com.android.server.healthconnect.logging.UsageStatsCollector.USER_MOST_RECENT_ACCESS_LOG_TIME;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.health.connect.HealthConnectManager;
+import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.storage.StorageContext;
+import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.quality.Strictness;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class UsageStatsCollectorTest {
+
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .setStrictness(Strictness.LENIENT)
+                    .build();
+
+    @Mock private MedicalResourceHelper mMedicalResourceHelper;
+    @Mock private MedicalDataSourceHelper mMedicalDataSourceHelper;
+    @Mock private AccessLogsHelper mAccessLogsHelper;
+    @Mock private PreferencesManager mPreferencesManager;
+    @Mock private PreferenceHelper mPreferenceHelper;
+    @Mock private PackageManager mPackageManager;
+    @Mock private PackageInfo mPackageInfoConnectedApp;
+    @Mock private PackageInfo mPackageInfoPhrConnectedApp;
+    @Mock private PackageInfo mPackageInfoNotHoldingPermission;
+    @Mock private PackageInfo mPackageInfoNotConnectedApp;
+    private UsageStatsCollector mUsageStatsCollector;
+
+    private static final String NOT_HEALTH_PERMISSION = "NOT_HEALTH_PERMISSION";
+    private static final String CONNECTED_APP_PACKAGE_NAME = "connected.app";
+    private static final String PHR_CONNECTED_APP_PACKAGE_NAME = "phr.connected.app";
+    private static final String NOT_CONNECTED_APP_PACKAGE_NAME = "not.connected.app";
+    private static final String NOT_HOLDING_HC_PERMISSIONS_APP_PACKAGE_NAME =
+            "not.holding.permission.app";
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        Context context = spy(ApplicationProvider.getApplicationContext());
+        UserHandle userHandle = ApplicationProvider.getApplicationContext().getUser();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setPreferencesManager(mPreferencesManager)
+                        .setPreferenceHelper(mPreferenceHelper)
+                        .setAccessLogsHelper(mAccessLogsHelper)
+                        .setMedicalDataSourceHelper(mMedicalDataSourceHelper)
+                        .setMedicalResourceHelper(mMedicalResourceHelper)
+                        .build();
+        doReturn(context).when(context).createContextAsUser(eq(userHandle), anyInt());
+        mUsageStatsCollector =
+                healthConnectInjector.getUsageStatsCollector(
+                        StorageContext.create(context, userHandle));
+
+        doReturn(mPackageManager).when(context).getPackageManager();
+        doReturn(
+                        List.of(
+                                mPackageInfoConnectedApp,
+                                mPackageInfoNotHoldingPermission,
+                                mPackageInfoNotConnectedApp,
+                                mPackageInfoPhrConnectedApp))
+                .when(mPackageManager)
+                .getInstalledPackages(any());
+        ExtendedMockito.doReturn(Set.of(READ_STEPS, WRITE_STEPS, READ_MEDICAL_DATA_CONDITIONS))
+                .when(() -> HealthConnectManager.getHealthPermissions(any()));
+
+        mPackageInfoConnectedApp.requestedPermissions = new String[] {READ_STEPS, WRITE_STEPS};
+        mPackageInfoConnectedApp.requestedPermissionsFlags =
+                new int[] {
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED
+                };
+        mPackageInfoConnectedApp.packageName = CONNECTED_APP_PACKAGE_NAME;
+
+        mPackageInfoNotHoldingPermission.requestedPermissions =
+                new String[] {NOT_HEALTH_PERMISSION};
+        mPackageInfoNotHoldingPermission.requestedPermissionsFlags =
+                new int[] {PackageInfo.REQUESTED_PERMISSION_GRANTED};
+        mPackageInfoNotHoldingPermission.packageName = NOT_HOLDING_HC_PERMISSIONS_APP_PACKAGE_NAME;
+
+        mPackageInfoNotConnectedApp.requestedPermissions = new String[] {READ_STEPS};
+        mPackageInfoNotConnectedApp.requestedPermissionsFlags =
+                new int[] {PackageInfo.REQUESTED_PERMISSION_NEVER_FOR_LOCATION};
+        mPackageInfoNotConnectedApp.packageName = NOT_CONNECTED_APP_PACKAGE_NAME;
+
+        mPackageInfoPhrConnectedApp.requestedPermissions =
+                new String[] {READ_MEDICAL_DATA_CONDITIONS, WRITE_STEPS};
+        mPackageInfoPhrConnectedApp.requestedPermissionsFlags =
+                new int[] {
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
+                    PackageInfo.REQUESTED_PERMISSION_GRANTED
+                };
+        mPackageInfoPhrConnectedApp.packageName = PHR_CONNECTED_APP_PACKAGE_NAME;
+    }
+
+    @Test
+    public void testGetNumberOfCompatibleApps() {
+        assertThat(mUsageStatsCollector.getNumberOfAppsCompatibleWithHealthConnect()).isEqualTo(3);
+    }
+
+    @Test
+    public void testGetAppsConnectedWithHealthConnect() {
+        Map<String, List<String>> expectedResult =
+                Map.of(
+                        CONNECTED_APP_PACKAGE_NAME,
+                        List.of(READ_STEPS, WRITE_STEPS),
+                        PHR_CONNECTED_APP_PACKAGE_NAME,
+                        List.of(READ_MEDICAL_DATA_CONDITIONS, WRITE_STEPS));
+
+        assertThat(mUsageStatsCollector.getPackagesHoldingHealthPermissions())
+                .isEqualTo(expectedResult);
+    }
+
+    @Test
+    public void phrLastReadTimeStampNull_testUserIsNotPhrMonthlyActiveUser() {
+        when(mPreferencesManager.getPhrLastReadMedicalResourcesApiTimeStamp()).thenReturn(null);
+
+        assertThat(mUsageStatsCollector.isPhrMonthlyActiveUser()).isEqualTo(false);
+    }
+
+    @Test
+    public void phrLastReadTimeStampBefore30Days_testUserIsNotPhrMonthlyActiveUser() {
+        when(mPreferencesManager.getPhrLastReadMedicalResourcesApiTimeStamp())
+                .thenReturn(subtractDaysToInstantNow(/* days= */ 40));
+
+        assertThat(mUsageStatsCollector.isPhrMonthlyActiveUser()).isEqualTo(false);
+    }
+
+    @Test
+    public void phrLastReadTimeStampWithin30Days_testUserIsPhrMonthlyActiveUser() {
+        when(mPreferencesManager.getPhrLastReadMedicalResourcesApiTimeStamp())
+                .thenReturn(subtractDaysToInstantNow(/* days= */ 10));
+
+        assertThat(mUsageStatsCollector.isPhrMonthlyActiveUser()).isEqualTo(true);
+    }
+
+    @Test
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void flagEnabled_testConnectedPhrAppsCount() {
+        assertThat(mUsageStatsCollector.getGrantedPhrAppsCount()).isEqualTo(1);
+    }
+
+    @Test
+    @DisableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void flagDisabled_testConnectedPhrAppsCount() {
+        assertThat(mUsageStatsCollector.getGrantedPhrAppsCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void exportFrequencyPreferenceNull_testExportFrequency() {
+        when(mPreferenceHelper.getPreference(eq(EXPORT_PERIOD_PREFERENCE_KEY))).thenReturn(null);
+
+        assertThat(mUsageStatsCollector.getExportFrequency()).isEqualTo(0);
+    }
+
+    @Test
+    public void exportFrequencyPreferenceNonNull_testExportFrequency() {
+        when(mPreferenceHelper.getPreference(eq(EXPORT_PERIOD_PREFERENCE_KEY)))
+                .thenReturn(String.valueOf(1));
+
+        assertThat(mUsageStatsCollector.getExportFrequency()).isEqualTo(1);
+    }
+
+    @Test
+    public void mostRecentAccessLogReadTimeStampNull_testUserIsNotMonthlyActiveUser() {
+        when(mPreferenceHelper.getPreference(eq(USER_MOST_RECENT_ACCESS_LOG_TIME)))
+                .thenReturn(null);
+
+        assertThat(mUsageStatsCollector.isUserMonthlyActive()).isEqualTo(false);
+    }
+
+    @Test
+    public void mostRecentAccessLogReadTimeStampBefore30Days_testUserIsNotMonthlyActiveUser() {
+        when(mPreferenceHelper.getPreference(eq(USER_MOST_RECENT_ACCESS_LOG_TIME)))
+                .thenReturn(
+                        String.valueOf(subtractDaysToInstantNow(/* days= */ 40).toEpochMilli()));
+
+        assertThat(mUsageStatsCollector.isUserMonthlyActive()).isEqualTo(false);
+    }
+
+    @Test
+    public void mostRecentAccessLogReadTimeStampWithin30Days_testUserIsNotMonthlyActiveUser() {
+        when(mPreferenceHelper.getPreference(eq(USER_MOST_RECENT_ACCESS_LOG_TIME)))
+                .thenReturn(
+                        String.valueOf(subtractDaysToInstantNow(/* days= */ 10).toEpochMilli()));
+
+        assertThat(mUsageStatsCollector.isUserMonthlyActive()).isEqualTo(true);
+    }
+
+    @Test
+    public void noAccessLog_testDoNotUpdateLatestAccessLogsTimeStamp() {
+        when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp())
+                .thenReturn(Long.MIN_VALUE);
+
+        mUsageStatsCollector.upsertLastAccessLogTimeStamp();
+
+        verify(mPreferenceHelper, times(0)).insertOrReplacePreference(any(), any());
+    }
+
+    @Test
+    public void accessLogPresent_testUpdateLatestAccessLogsTimeStamp() {
+        when(mAccessLogsHelper.getLatestUpsertOrReadOperationAccessLogTimeStamp()).thenReturn(1L);
+
+        mUsageStatsCollector.upsertLastAccessLogTimeStamp();
+
+        verify(mPreferenceHelper, times(1))
+                .insertOrReplacePreference(
+                        eq(USER_MOST_RECENT_ACCESS_LOG_TIME), eq(String.valueOf(1L)));
+    }
+
+    @Test
+    public void testGetMedicalResourcesCount() {
+        when(mMedicalResourceHelper.getMedicalResourcesCount()).thenReturn(1);
+
+        assertThat(mUsageStatsCollector.getMedicalResourcesCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void testGetMedicalDataSourcesCount() {
+        when(mMedicalDataSourceHelper.getMedicalDataSourcesCount()).thenReturn(1);
+
+        assertThat(mUsageStatsCollector.getMedicalDataSourcesCount()).isEqualTo(1);
+    }
+
+    private Instant subtractDaysToInstantNow(int days) {
+        return Instant.now().minus(days, ChronoUnit.DAYS);
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationBroadcastSchedulingTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationBroadcastSchedulingTest.java
index 790f3f6..5697a25 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationBroadcastSchedulingTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationBroadcastSchedulingTest.java
@@ -19,8 +19,6 @@
 import static android.health.connect.HealthConnectDataState.MIGRATION_STATE_ALLOWED;
 import static android.health.connect.HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS;
 
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.MIGRATION_STATE_ALLOWED_COUNT_DEFAULT_FLAG_VALUE;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.MIGRATION_STATE_IN_PROGRESS_COUNT_DEFAULT_FLAG_VALUE;
 import static com.android.server.healthconnect.migration.MigrationBroadcastScheduler.MIGRATION_BROADCAST_NAMESPACE;
 import static com.android.server.healthconnect.migration.MigrationConstants.MIGRATION_STATE_CHANGE_NAMESPACE;
 
@@ -35,12 +33,12 @@
 import android.app.job.JobInfo;
 import android.app.job.JobScheduler;
 import android.content.Context;
+import android.os.UserHandle;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.HealthConnectThreadScheduler;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 
@@ -54,7 +52,6 @@
 import org.mockito.stubbing.Answer;
 import org.mockito.verification.VerificationMode;
 
-import java.time.Duration;
 import java.util.Objects;
 
 /** Unit tests for broadcast scheduling logic in {@link MigrationBroadcastScheduler} */
@@ -67,7 +64,6 @@
                     .spyStatic(MigrationStateManager.class)
                     .mockStatic(PreferenceHelper.class)
                     .mockStatic(HealthConnectThreadScheduler.class)
-                    .mockStatic(HealthConnectDeviceConfigManager.class)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
@@ -75,20 +71,9 @@
     @Mock private JobScheduler mJobScheduler;
     @Mock private MigrationStateManager mMigrationStateManager;
     @Mock private PreferenceHelper mPreferenceHelper;
-    @Mock private HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
 
     private MigrationBroadcastScheduler mMigrationBroadcastScheduler;
 
-    private static final int MIGRATION_STATE_ALLOWED_COUNT_MOCK_VALUE =
-            MIGRATION_STATE_ALLOWED_COUNT_DEFAULT_FLAG_VALUE;
-    private static final int MIGRATION_STATE_IN_PROGRESS_COUNT_MOCK_VALUE =
-            MIGRATION_STATE_IN_PROGRESS_COUNT_DEFAULT_FLAG_VALUE;
-
-    private static final Duration NON_IDLE_STATE_TIMEOUT_MOCK_VALUE =
-            Duration.ofDays(
-                    HealthConnectDeviceConfigManager
-                            .NON_IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE);
-
     private final long mMinPeriodMillis = JobInfo.getMinPeriodMillis();
     private final long mIntervalGreaterThanMinPeriod = mMinPeriodMillis + 1000;
     private final long mIntervalLessThanMinPeriod = mMinPeriodMillis - 1000;
@@ -98,21 +83,9 @@
         when(mContext.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
         when(mContext.getPackageName()).thenReturn("packageName");
         when(mJobScheduler.forNamespace(MIGRATION_BROADCAST_NAMESPACE)).thenReturn(mJobScheduler);
-        when(HealthConnectDeviceConfigManager.getInitialisedInstance())
-                .thenReturn(mHealthConnectDeviceConfigManager);
-        when(mHealthConnectDeviceConfigManager.getMigrationStateAllowedCount())
-                .thenReturn(MIGRATION_STATE_ALLOWED_COUNT_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getMigrationStateInProgressCount())
-                .thenReturn(MIGRATION_STATE_IN_PROGRESS_COUNT_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getNonIdleStateTimeoutPeriod())
-                .thenReturn(NON_IDLE_STATE_TIMEOUT_MOCK_VALUE);
-        ExtendedMockito.doReturn(mMigrationStateManager)
-                .when(MigrationStateManager::getInitialisedInstance);
 
         mMigrationBroadcastScheduler =
-                Mockito.spy(
-                        new MigrationBroadcastScheduler(
-                                0, mHealthConnectDeviceConfigManager, mMigrationStateManager));
+                Mockito.spy(new MigrationBroadcastScheduler(UserHandle.getUserHandleForUid(0)));
     }
 
     @Test
@@ -128,14 +101,14 @@
                                 })
                 .when(() -> HealthConnectThreadScheduler.scheduleInternalTask(any()));
 
-        MigrationStateManager.resetInitializedInstanceForTest();
         MigrationStateManager migrationStateManager =
-                MigrationStateManager.initializeInstance(
-                        0, mHealthConnectDeviceConfigManager, mPreferenceHelper);
-        migrationStateManager.setMigrationBroadcastScheduler(mMigrationBroadcastScheduler);
+                new MigrationStateManager(
+                        UserHandle.getUserHandleForUid(0),
+                        mPreferenceHelper,
+                        mMigrationBroadcastScheduler);
         migrationStateManager.updateMigrationState(mContext, MIGRATION_STATE_IN_PROGRESS);
 
-        verify(mMigrationBroadcastScheduler, times(1)).scheduleNewJobs(any());
+        verify(mMigrationBroadcastScheduler, times(1)).scheduleNewJobs(any(), any());
     }
 
     @Test
@@ -145,7 +118,7 @@
         when(mMigrationBroadcastScheduler.getRequiredInterval(eq(MIGRATION_STATE_IN_PROGRESS)))
                 .thenReturn(mIntervalGreaterThanMinPeriod);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
 
         verifyPeriodicJobSchedulerInvocation(mIntervalGreaterThanMinPeriod, times(1));
     }
@@ -156,7 +129,7 @@
         when(mMigrationBroadcastScheduler.getRequiredInterval(eq(MIGRATION_STATE_IN_PROGRESS)))
                 .thenReturn(mMinPeriodMillis);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
 
         verifyPeriodicJobSchedulerInvocation(mMinPeriodMillis, times(1));
     }
@@ -168,7 +141,7 @@
                 .thenReturn(mIntervalLessThanMinPeriod);
         when(mJobScheduler.schedule(any(JobInfo.class))).thenReturn(JobScheduler.RESULT_SUCCESS);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
 
         verifyPeriodicJobSchedulerInvocation(mMinPeriodMillis, times(1));
     }
@@ -179,7 +152,7 @@
         when(mMigrationBroadcastScheduler.getRequiredInterval(eq(MIGRATION_STATE_ALLOWED)))
                 .thenReturn(mIntervalGreaterThanMinPeriod);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
 
         verifyPeriodicJobSchedulerInvocation(mIntervalGreaterThanMinPeriod, times(1));
     }
@@ -192,7 +165,7 @@
         when(mMigrationBroadcastScheduler.getRequiredInterval(eq(MIGRATION_STATE_ALLOWED)))
                 .thenReturn(mIntervalGreaterThanMinPeriod);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
 
         verifyPeriodicJobSchedulerInvocation(mIntervalGreaterThanMinPeriod, times(0));
     }
@@ -203,21 +176,19 @@
         when(mMigrationBroadcastScheduler.getRequiredInterval(eq(MIGRATION_STATE_ALLOWED)))
                 .thenReturn(mMinPeriodMillis);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
 
         verifyPeriodicJobSchedulerInvocation(mMinPeriodMillis, times(1));
     }
 
     @Test
     public void testScheduling_migrationAllowedIntervalLessThanMinimum_periodicJobScheduled() {
-        ExtendedMockito.doReturn(mMigrationStateManager)
-                .when(MigrationStateManager::getInitialisedInstance);
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
         when(mMigrationBroadcastScheduler.getRequiredInterval(eq(MIGRATION_STATE_ALLOWED)))
                 .thenReturn(mIntervalLessThanMinPeriod);
         when(mJobScheduler.schedule(any(JobInfo.class))).thenReturn(JobScheduler.RESULT_SUCCESS);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
 
         verifyPeriodicJobSchedulerInvocation(mMinPeriodMillis, times(1));
     }
@@ -230,10 +201,10 @@
                 .thenReturn(mIntervalGreaterThanMinPeriod);
         when(mJobScheduler.schedule(any(JobInfo.class))).thenReturn(JobScheduler.RESULT_SUCCESS);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
         verify(mJobScheduler, times(1)).cancelAll();
         verifyPeriodicJobSchedulerInvocation(mIntervalGreaterThanMinPeriod, times(1));
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
         verify(mJobScheduler, times(2)).cancelAll();
         verifyPeriodicJobSchedulerInvocation(mIntervalGreaterThanMinPeriod, times(2));
     }
@@ -246,10 +217,10 @@
                 .thenReturn(mMinPeriodMillis);
         when(mJobScheduler.schedule(any(JobInfo.class))).thenReturn(JobScheduler.RESULT_SUCCESS);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
         verify(mJobScheduler, times(1)).cancelAll();
         verifyPeriodicJobSchedulerInvocation(mMinPeriodMillis, times(1));
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
         verify(mJobScheduler, times(2)).cancelAll();
         verifyPeriodicJobSchedulerInvocation(mMinPeriodMillis, times(2));
     }
@@ -260,12 +231,12 @@
         when(mMigrationBroadcastScheduler.getRequiredInterval(eq(MIGRATION_STATE_ALLOWED)))
                 .thenReturn(mIntervalGreaterThanMinPeriod);
         when(mJobScheduler.schedule(any(JobInfo.class))).thenReturn(JobScheduler.RESULT_SUCCESS);
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
         verify(mJobScheduler, times(1)).cancelAll();
         verifyPeriodicJobSchedulerInvocation(mIntervalGreaterThanMinPeriod, times(1));
         when(mMigrationBroadcastScheduler.getRequiredInterval(eq(MIGRATION_STATE_ALLOWED)))
                 .thenReturn(mMinPeriodMillis);
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
         verify(mJobScheduler, times(2)).cancelAll();
         verifyPeriodicJobSchedulerInvocation(mMinPeriodMillis, times(1));
     }
@@ -275,7 +246,7 @@
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
         when(mJobScheduler.schedule(any(JobInfo.class))).thenReturn(JobScheduler.RESULT_FAILURE);
 
-        mMigrationBroadcastScheduler.scheduleNewJobs(mContext);
+        mMigrationBroadcastScheduler.scheduleNewJobs(mContext, mMigrationStateManager);
 
         verify(mJobScheduler, atMost(1))
                 .schedule(
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationCleanerTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationCleanerTest.java
index cacf339..b80db1e 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationCleanerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationCleanerTest.java
@@ -20,14 +20,18 @@
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.health.connect.HealthConnectDataState;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
 import com.android.server.healthconnect.migration.MigrationStateManager.StateChangedListener;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.MigrationEntityHelper;
 
@@ -49,15 +53,31 @@
     @Mock private TransactionManager mTransactionManager;
     @Mock private MigrationStateManager mMigrationStateManager;
 
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
     private MigrationCleaner mCleaner;
 
     @Before
     public void before() {
         MockitoAnnotations.initMocks(this);
         // needed for now as some classes call it directly and not via constructor.
-        when(TransactionManager.getInitialisedInstance()).thenReturn(mTransactionManager);
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(
+                                InstrumentationRegistry.getInstrumentation().getContext())
+                        .setTransactionManager(mTransactionManager)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .setMigrationStateManager(mMigrationStateManager)
+                        .build();
 
-        mCleaner = new MigrationCleaner(mTransactionManager, PriorityMigrationHelper.getInstance());
+        mCleaner =
+                new MigrationCleaner(
+                        mTransactionManager,
+                        healthConnectInjector.getPriorityMigrationHelper(),
+                        healthConnectInjector.getMigrationEntityHelper());
     }
 
     @Test
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationStateChangeJobTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationStateChangeJobTest.java
index 4bdfad8..b199d7b 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationStateChangeJobTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationStateChangeJobTest.java
@@ -57,7 +57,6 @@
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
 import com.android.server.healthconnect.HealthConnectDailyService;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 
 import org.junit.After;
@@ -67,11 +66,9 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 
-import java.time.Duration;
 import java.time.Instant;
 import java.util.List;
 import java.util.Objects;
-import java.util.concurrent.TimeUnit;
 
 @RunWith(AndroidJUnit4.class)
 public class MigrationStateChangeJobTest {
@@ -82,7 +79,6 @@
                     .mockStatic(PreferenceHelper.class)
                     .mockStatic(MigrationStateManager.class)
                     .mockStatic(HealthConnectDailyService.class)
-                    .mockStatic(HealthConnectDeviceConfigManager.class)
                     .build();
 
     @Mock MigrationStateManager mMigrationStateManager;
@@ -91,34 +87,7 @@
     @Mock private JobScheduler mJobScheduler;
     @Mock private PersistableBundle mPersistableBundle;
     @Mock private JobInfo mJobInfo;
-    @Mock private HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
     private static final UserHandle DEFAULT_USER_HANDLE = UserHandle.of(UserHandle.myUserId());
-    private static final long EXECUTION_TIME_BUFFER_MOCK_VALUE =
-            TimeUnit.MINUTES.toMillis(
-                    HealthConnectDeviceConfigManager
-                            .EXECUTION_TIME_BUFFER_MINUTES_DEFAULT_FLAG_VALUE);
-    private static final Duration IDLE_STATE_TIMEOUT_MOCK_VALUE =
-            Duration.ofDays(
-                    HealthConnectDeviceConfigManager.IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE);
-    private static final Duration NON_IDLE_STATE_TIMEOUT_MOCK_VALUE =
-            Duration.ofDays(
-                    HealthConnectDeviceConfigManager
-                            .NON_IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE);
-    private static final Duration IN_PROGRESS_STATE_TIMEOUT_MOCK_VALUE =
-            Duration.ofHours(
-                    HealthConnectDeviceConfigManager
-                            .IN_PROGRESS_STATE_TIMEOUT_HOURS_DEFAULT_FLAG_VALUE);
-    private static final boolean ENABLE_STATE_CHANGE_JOB_TRUE_MOCK_VALUE = true;
-
-    private static final boolean ENABLE_STATE_CHANGE_JOB_FALSE_MOCK_VALUE_FALSE = false;
-    private static final long MIGRATION_COMPLETION_JOB_RUN_INTERVAL_MOCK_VALUE =
-            TimeUnit.DAYS.toMillis(
-                    HealthConnectDeviceConfigManager
-                            .MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_DEFAULT_FLAG_VALUE);
-    private static final long MIGRATION_PAUSE_JOB_RUN_INTERVAL_MOCK_VALUE =
-            TimeUnit.HOURS.toMillis(
-                    HealthConnectDeviceConfigManager
-                            .MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_DEFAULT_FLAG_VALUE);
 
     @Before
     public void setUp() {
@@ -126,46 +95,25 @@
                 .thenReturn(mJobScheduler);
         when(mContext.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
         when(mContext.getPackageName()).thenReturn(MOCK_CONFIGURED_PACKAGE);
-        when(HealthConnectDeviceConfigManager.getInitialisedInstance())
-                .thenReturn(mHealthConnectDeviceConfigManager);
-        when(mHealthConnectDeviceConfigManager.getExecutionTimeBuffer())
-                .thenReturn(EXECUTION_TIME_BUFFER_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getIdleStateTimeoutPeriod())
-                .thenReturn(IDLE_STATE_TIMEOUT_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getNonIdleStateTimeoutPeriod())
-                .thenReturn(NON_IDLE_STATE_TIMEOUT_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getInProgressStateTimeoutPeriod())
-                .thenReturn(IN_PROGRESS_STATE_TIMEOUT_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.isPauseStateChangeJobEnabled())
-                .thenReturn(ENABLE_STATE_CHANGE_JOB_TRUE_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.isCompleteStateChangeJobEnabled())
-                .thenReturn(ENABLE_STATE_CHANGE_JOB_TRUE_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getMigrationCompletionJobRunInterval())
-                .thenReturn(MIGRATION_COMPLETION_JOB_RUN_INTERVAL_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getMigrationPauseJobRunInterval())
-                .thenReturn(MIGRATION_PAUSE_JOB_RUN_INTERVAL_MOCK_VALUE);
     }
 
     @After
     public void tearDown() {
         clearInvocations(mPreferenceHelper);
         clearInvocations(mMigrationStateManager);
-        clearInvocations(mHealthConnectDeviceConfigManager);
     }
 
     /** Expected behavior: No changes to the state */
     @Test
     public void testExecutePauseJob_timeNotExpired() {
         long mockElapsedTime =
-                IN_PROGRESS_STATE_TIMEOUT_MOCK_VALUE.toMillis() - getTimeoutPeriodBuffer();
+                MigrationConstants.IN_PROGRESS_STATE_TIMEOUT_HOURS.toMillis()
+                        - getTimeoutPeriodBuffer();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_IN_PROGRESS);
         when(mPreferenceHelper.getPreference(eq(CURRENT_STATE_START_TIME_KEY)))
                 .thenReturn(Instant.now().minusMillis(mockElapsedTime).toString());
         MigrationStateChangeJob.executeMigrationPauseJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyNoStateChange();
     }
 
@@ -173,17 +121,14 @@
     @Test
     public void testExecutePauseJob_timeExpired_shouldChangeState() {
         long mockElapsedTime =
-                IN_PROGRESS_STATE_TIMEOUT_MOCK_VALUE
+                MigrationConstants.IN_PROGRESS_STATE_TIMEOUT_HOURS
                         .plusMillis(getTimeoutPeriodBuffer())
                         .toMillis();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_IN_PROGRESS);
         when(mPreferenceHelper.getPreference(eq(CURRENT_STATE_START_TIME_KEY)))
                 .thenReturn(Instant.now().minusMillis(mockElapsedTime).toString());
         MigrationStateChangeJob.executeMigrationPauseJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyStateChange(MIGRATION_STATE_ALLOWED, true);
     }
 
@@ -192,10 +137,7 @@
     public void testExecutePauseJob_inAllowedState() {
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
         MigrationStateChangeJob.executeMigrationPauseJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyZeroInteractions(mPreferenceHelper);
         verifyNoStateChange();
     }
@@ -205,25 +147,20 @@
     public void testExecutePauseJob_inCompleteState() {
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_COMPLETE);
         MigrationStateChangeJob.executeMigrationPauseJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyNoStateChange();
     }
 
     /** Expected behavior: No changes to the state */
     @Test
     public void testExecuteCompleteJob_fromIdleState_timeNotExpired() {
-        long mockElapsedTime = IDLE_STATE_TIMEOUT_MOCK_VALUE.toMillis() - getTimeoutPeriodBuffer();
+        long mockElapsedTime =
+                MigrationConstants.IDLE_STATE_TIMEOUT_DAYS.toMillis() - getTimeoutPeriodBuffer();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_IDLE);
         when(mPreferenceHelper.getPreference(eq(CURRENT_STATE_START_TIME_KEY)))
                 .thenReturn(Instant.now().minusMillis(mockElapsedTime).toString());
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyNoStateChange();
     }
 
@@ -231,15 +168,14 @@
     @Test
     public void testExecuteCompleteJob_fromIdleState() {
         long mockElapsedTime =
-                IDLE_STATE_TIMEOUT_MOCK_VALUE.plusMillis(getTimeoutPeriodBuffer()).toMillis();
+                MigrationConstants.IDLE_STATE_TIMEOUT_DAYS
+                        .plusMillis(getTimeoutPeriodBuffer())
+                        .toMillis();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_IDLE);
         when(mPreferenceHelper.getPreference(eq(CURRENT_STATE_START_TIME_KEY)))
                 .thenReturn(Instant.now().minusMillis(mockElapsedTime).toString());
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyStateChange(MIGRATION_STATE_COMPLETE, true);
     }
 
@@ -249,10 +185,7 @@
         setStartTime_notExpired_nonIdleState();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyNoStateChange();
     }
 
@@ -262,10 +195,7 @@
         setStartTime_expired_nonIdleState();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyStateChange(MIGRATION_STATE_COMPLETE, true);
     }
 
@@ -276,10 +206,7 @@
         when(mMigrationStateManager.getMigrationState())
                 .thenReturn(MIGRATION_STATE_APP_UPGRADE_REQUIRED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyNoStateChange();
     }
 
@@ -290,10 +217,7 @@
         when(mMigrationStateManager.getMigrationState())
                 .thenReturn(MIGRATION_STATE_APP_UPGRADE_REQUIRED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyStateChange(MIGRATION_STATE_COMPLETE, true);
     }
 
@@ -304,10 +228,7 @@
         when(mMigrationStateManager.getMigrationState())
                 .thenReturn(MIGRATION_STATE_MODULE_UPGRADE_REQUIRED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyNoStateChange();
     }
 
@@ -318,10 +239,7 @@
         when(mMigrationStateManager.getMigrationState())
                 .thenReturn(MIGRATION_STATE_MODULE_UPGRADE_REQUIRED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyStateChange(MIGRATION_STATE_COMPLETE, true);
     }
 
@@ -330,10 +248,7 @@
     public void testExecuteCompleteJob_alreadyComplete() {
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_COMPLETE);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyZeroInteractions(mPreferenceHelper);
         verifyNoStateChange();
     }
@@ -345,10 +260,7 @@
         setStartTimeAfterAllowedStateTimeout();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyStateChange(MIGRATION_STATE_COMPLETE, true);
     }
 
@@ -359,10 +271,7 @@
         setStartTimeBeforeAllowedStateTimeout();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyNoStateChange();
     }
 
@@ -373,10 +282,7 @@
         setStartTimeAfterAllowedStateTimeout();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_IN_PROGRESS);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyStateChange(MIGRATION_STATE_COMPLETE, true);
     }
 
@@ -387,25 +293,7 @@
         setStartTimeBeforeAllowedStateTimeout();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_IN_PROGRESS);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
-        verifyNoStateChange();
-    }
-
-    /** Expected behavior: No changes to the state */
-    @Test
-    public void testExecuteCompleteJob_stateChangeJobsNotEnabled() {
-        setStartTime_expired_nonIdleState();
-        when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
-        when(mHealthConnectDeviceConfigManager.isCompleteStateChangeJobEnabled())
-                .thenReturn(ENABLE_STATE_CHANGE_JOB_FALSE_MOCK_VALUE_FALSE);
-        MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyNoStateChange();
     }
 
@@ -415,10 +303,7 @@
         setStartTime_expired_nonIdleState();
         when(mMigrationStateManager.getMigrationState()).thenReturn(MIGRATION_STATE_ALLOWED);
         MigrationStateChangeJob.executeMigrationCompletionJob(
-                mContext,
-                mPreferenceHelper,
-                mHealthConnectDeviceConfigManager,
-                mMigrationStateManager);
+                mContext, mPreferenceHelper, mMigrationStateManager);
         verifyStateChange(MIGRATION_STATE_COMPLETE, true);
     }
 
@@ -435,21 +320,25 @@
 
     private void setStartTime_notExpired_nonIdleState() {
         long mockElapsedTime =
-                NON_IDLE_STATE_TIMEOUT_MOCK_VALUE.toMillis() - getTimeoutPeriodBuffer();
+                MigrationConstants.NON_IDLE_STATE_TIMEOUT_DAYS.toMillis()
+                        - getTimeoutPeriodBuffer();
         when(mPreferenceHelper.getPreference(eq(CURRENT_STATE_START_TIME_KEY)))
                 .thenReturn(Instant.now().minusMillis(mockElapsedTime).toString());
     }
 
     private void setStartTime_expired_nonIdleState() {
         long mockElapsedTime =
-                NON_IDLE_STATE_TIMEOUT_MOCK_VALUE.plusMillis(getTimeoutPeriodBuffer()).toMillis();
+                MigrationConstants.NON_IDLE_STATE_TIMEOUT_DAYS
+                        .plusMillis(getTimeoutPeriodBuffer())
+                        .toMillis();
         when(mPreferenceHelper.getPreference(eq(CURRENT_STATE_START_TIME_KEY)))
                 .thenReturn(Instant.now().minusMillis(mockElapsedTime).toString());
     }
 
     private void setStartTimeAfterAllowedStateTimeout() {
         long mockAllowedStateTimeout =
-                NON_IDLE_STATE_TIMEOUT_MOCK_VALUE.toMillis() - getTimeoutPeriodBuffer();
+                MigrationConstants.NON_IDLE_STATE_TIMEOUT_DAYS.toMillis()
+                        - getTimeoutPeriodBuffer();
         when(mMigrationStateManager.getAllowedStateTimeout())
                 .thenReturn(Instant.now().minusMillis(mockAllowedStateTimeout).toString());
     }
@@ -462,14 +351,14 @@
 
     @Test
     public void testScheduleCompletionJob() {
-        long jobRunInterval = MIGRATION_COMPLETION_JOB_RUN_INTERVAL_MOCK_VALUE;
-        MigrationStateChangeJob.scheduleMigrationCompletionJob(
-                mHealthConnectDeviceConfigManager, mContext, DEFAULT_USER_HANDLE.getIdentifier());
+        long jobRunInterval =
+                MigrationConstants.MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS.toMillis();
+        MigrationStateChangeJob.scheduleMigrationCompletionJob(mContext, DEFAULT_USER_HANDLE);
         verify(
                 () ->
                         HealthConnectDailyService.schedule(
                                 any(JobScheduler.class),
-                                anyInt(),
+                                any(UserHandle.class),
                                 argThat(
                                         job ->
                                                 hasExpectedParameters(
@@ -480,16 +369,15 @@
 
     @Test
     public void testSchedulePauseJob() {
-        long jobRunInterval = MIGRATION_PAUSE_JOB_RUN_INTERVAL_MOCK_VALUE;
-        MigrationStateChangeJob.scheduleMigrationPauseJob(
-                mHealthConnectDeviceConfigManager, mContext, DEFAULT_USER_HANDLE.getIdentifier());
+        long jobRunInterval = MigrationConstants.MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS.toMillis();
+        MigrationStateChangeJob.scheduleMigrationPauseJob(mContext, DEFAULT_USER_HANDLE);
         when(mContext.getSystemService(eq(JobScheduler.class))).thenReturn(mJobScheduler);
 
         verify(
                 () ->
                         HealthConnectDailyService.schedule(
                                 any(JobScheduler.class),
-                                anyInt(),
+                                any(UserHandle.class),
                                 argThat(
                                         job ->
                                                 hasExpectedParameters(
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationStateManagerTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationStateManagerTest.java
index 197459a..8ae8a42 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationStateManagerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationStateManagerTest.java
@@ -51,6 +51,7 @@
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
@@ -69,12 +70,16 @@
 import android.os.ext.SdkExtensions;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.TestUtils;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
 import com.android.server.healthconnect.migration.MigrationStateManager.IllegalMigrationStateException;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 
 import libcore.util.HexEncoding;
@@ -87,12 +92,10 @@
 import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
-import java.time.Duration;
 import java.time.Instant;
 import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 /** Test class for the MigrationStateManager class. */
@@ -105,60 +108,43 @@
                     .mockStatic(PreferenceHelper.class)
                     .mockStatic(MigrationStateChangeJob.class)
                     .mockStatic(HexEncoding.class)
-                    .mockStatic(HealthConnectDeviceConfigManager.class)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Mock private Context mContext;
+    private Context mContext;
     @Mock private PackageManager mPackageManager;
     @Mock private PreferenceHelper mPreferenceHelper;
     @Mock private Resources mResources;
     @Mock private PackageInfo mPackageInfo;
     @Mock private SigningInfo mSigningInfo;
     @Mock private MockListener mMockListener;
-    @Mock private HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
     private MigrationStateManager mMigrationStateManager;
 
     private static final UserHandle DEFAULT_USER_HANDLE = UserHandle.of(UserHandle.myUserId());
-    private static final long EXECUTION_TIME_BUFFER_MOCK_VALUE =
-            TimeUnit.MINUTES.toMillis(
-                    HealthConnectDeviceConfigManager
-                            .EXECUTION_TIME_BUFFER_MINUTES_DEFAULT_FLAG_VALUE);
-    private static final Duration NON_IDLE_STATE_TIMEOUT_MOCK_VALUE =
-            Duration.ofDays(
-                    HealthConnectDeviceConfigManager
-                            .NON_IDLE_STATE_TIMEOUT_DAYS_DEFAULT_FLAG_VALUE);
-    private static final int MAX_START_MIGRATION_CALLS_MOCK_VALUE =
-            HealthConnectDeviceConfigManager.MAX_START_MIGRATION_CALLS_DEFAULT_FLAG_VALUE;
 
     @Before
     public void setUp() {
+        mContext = spy(InstrumentationRegistry.getInstrumentation().getContext());
         when(mContext.getResources()).thenReturn(mResources);
+        when(mContext.getUser()).thenReturn(DEFAULT_USER_HANDLE);
         when(mResources.getIdentifier(anyString(), anyString(), anyString())).thenReturn(1);
         when(mResources.getString(anyInt())).thenReturn(MOCK_CONFIGURED_PACKAGE);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
-        when(PreferenceHelper.getInstance()).thenReturn(mPreferenceHelper);
-        when(HealthConnectDeviceConfigManager.getInitialisedInstance())
-                .thenReturn(mHealthConnectDeviceConfigManager);
-        when(mHealthConnectDeviceConfigManager.getExecutionTimeBuffer())
-                .thenReturn(EXECUTION_TIME_BUFFER_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getNonIdleStateTimeoutPeriod())
-                .thenReturn(NON_IDLE_STATE_TIMEOUT_MOCK_VALUE);
-        when(mHealthConnectDeviceConfigManager.getMaxStartMigrationCalls())
-                .thenReturn(MAX_START_MIGRATION_CALLS_MOCK_VALUE);
-        MigrationStateManager.resetInitializedInstanceForTest();
-        mMigrationStateManager =
-                MigrationStateManager.initializeInstance(
-                        DEFAULT_USER_HANDLE.getIdentifier(),
-                        mHealthConnectDeviceConfigManager,
-                        mPreferenceHelper);
+
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(mContext)
+                        .setPreferenceHelper(mPreferenceHelper)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mMigrationStateManager = healthConnectInjector.getMigrationStateManager();
         mMigrationStateManager.addStateChangedListener(mMockListener::onMigrationStateChanged);
     }
 
     @After
     public void tearDown() throws TimeoutException {
         TestUtils.waitForAllScheduledTasksToComplete();
-        MigrationStateManager.resetInitializedInstanceForTest();
         clearInvocations(mPreferenceHelper);
     }
 
@@ -617,10 +603,9 @@
 
     @Test
     public void testPauseMigration_maxStartMigrationCountReached_shouldCompleteMigration() {
-        int maxStartMigrationCount = MAX_START_MIGRATION_CALLS_MOCK_VALUE;
         setMigrationState(MIGRATION_STATE_IN_PROGRESS);
         when(mPreferenceHelper.getPreference(eq(MIGRATION_STARTS_COUNT_KEY)))
-                .thenReturn(String.valueOf(maxStartMigrationCount));
+                .thenReturn(String.valueOf(MigrationConstants.MAX_START_MIGRATION_CALLS));
         mMigrationStateManager.updateMigrationState(mContext, MIGRATION_STATE_ALLOWED);
         verifyStateChange(MIGRATION_STATE_COMPLETE);
         ExtendedMockito.verify(() -> MigrationStateChangeJob.cancelAllJobs(eq(mContext)));
@@ -628,10 +613,9 @@
 
     @Test
     public void testPauseMigration_maxStartMigrationCountNotReached_shouldNotCompleteMigration() {
-        int maxStartMigrationCount = MAX_START_MIGRATION_CALLS_MOCK_VALUE;
         setMigrationState(MIGRATION_STATE_IN_PROGRESS);
         when(mPreferenceHelper.getPreference(eq(MIGRATION_STARTS_COUNT_KEY)))
-                .thenReturn(String.valueOf(maxStartMigrationCount - 1));
+                .thenReturn(String.valueOf(MigrationConstants.MAX_START_MIGRATION_CALLS - 1));
         mMigrationStateManager.updateMigrationState(mContext, MIGRATION_STATE_ALLOWED);
         verifyStateChange(MIGRATION_STATE_ALLOWED);
         verifyCancelAllJobs();
@@ -1011,26 +995,26 @@
         ExtendedMockito.verify(
                 () ->
                         MigrationStateChangeJob.scheduleMigrationCompletionJob(
-                                eq(mHealthConnectDeviceConfigManager), eq(mContext), anyInt()));
+                                eq(mContext), any(UserHandle.class)));
     }
 
     private void verifyScheduleMigrationPauseJob() {
         ExtendedMockito.verify(
                 () ->
                         MigrationStateChangeJob.scheduleMigrationPauseJob(
-                                eq(mHealthConnectDeviceConfigManager), eq(mContext), anyInt()));
+                                eq(mContext), any(UserHandle.class)));
     }
 
     private void verifyNoJobScheduled() {
         ExtendedMockito.verify(
                 () ->
                         MigrationStateChangeJob.scheduleMigrationPauseJob(
-                                eq(mHealthConnectDeviceConfigManager), eq(mContext), anyInt()),
+                                eq(mContext), any(UserHandle.class)),
                 never());
         ExtendedMockito.verify(
                 () ->
                         MigrationStateChangeJob.scheduleMigrationCompletionJob(
-                                eq(mHealthConnectDeviceConfigManager), eq(mContext), anyInt()),
+                                eq(mContext), any(UserHandle.class)),
                 never());
     }
 
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationTestUtils.java b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationTestUtils.java
index 0e1bb58..3c91727 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationTestUtils.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationTestUtils.java
@@ -25,8 +25,6 @@
 import android.content.pm.ResolveInfo;
 import android.health.connect.HealthConnectManager;
 
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -47,8 +45,7 @@
             new String[] {Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA};
 
     static long getTimeoutPeriodBuffer() {
-        return HealthConnectDeviceConfigManager.getInitialisedInstance().getExecutionTimeBuffer()
-                * 2;
+        return MigrationConstants.EXECUTION_TIME_BUFFER_MINUTES.toMillis() * 2;
     }
 
     static List<ResolveInfo> createResolveInfoList(
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationUiStateManagerTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationUiStateManagerTest.java
index d4b6078..893157e 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/MigrationUiStateManagerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/MigrationUiStateManagerTest.java
@@ -20,7 +20,6 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -37,7 +36,6 @@
 import com.android.server.healthconnect.migration.notification.MigrationNotificationSender;
 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -60,7 +58,6 @@
     @Mock private Context mContext;
     @Mock private MigrationStateManager mMigrationStateManager;
     @Mock private MigrationNotificationSender mMigrationNotificationSender;
-    @Mock private PreferenceHelper mPreferenceHelper;
 
     private MigrationUiStateManager mMigrationUiStateManager;
     private static final UserHandle DEFAULT_USER_HANDLE = UserHandle.of(UserHandle.myUserId());
@@ -70,8 +67,6 @@
     @Before
     public void setUp() {
         mContext = InstrumentationRegistry.getInstrumentation().getContext();
-        when(PreferenceHelper.getInstance()).thenReturn(mPreferenceHelper);
-
         mMigrationUiStateManager =
                 new MigrationUiStateManager(
                         mContext,
@@ -81,11 +76,6 @@
         mMigrationUiStateManager.attachTo(mMigrationStateManager);
     }
 
-    @After
-    public void tearDown() {
-        clearInvocations(mPreferenceHelper);
-    }
-
     @Test
     public void testUiManagerInitialisation_addsListenerToMigrationStateManager() {
         verify(mMigrationStateManager).addStateChangedListener(any());
@@ -105,7 +95,7 @@
     }
 
     @Test
-    public void testStateChanged_appUpdateNeeded_noMigrationUiAppUpdateNeededNotificationSent() {
+    public void testStateChanged_appUpdateNeeded_noNotificationSent() {
         when(mMigrationStateManager.getMigrationState())
                 .thenReturn(HealthConnectDataState.MIGRATION_STATE_APP_UPGRADE_REQUIRED);
         final ArgumentCaptor<MigrationStateManager.StateChangedListener> captor =
@@ -114,9 +104,7 @@
         verify(mMigrationStateManager).addStateChangedListener(captor.capture());
         captor.getValue().onChanged(HealthConnectDataState.MIGRATION_STATE_APP_UPGRADE_REQUIRED);
         verify(mMigrationNotificationSender, never())
-                .sendNotification(
-                        MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_APP_UPDATE_NEEDED,
-                        DEFAULT_USER_HANDLE);
+                .sendNotification(anyInt(), any(UserHandle.class));
     }
 
     @Test
@@ -169,9 +157,7 @@
         captor.getValue().onChanged(HealthConnectDataState.MIGRATION_STATE_ALLOWED);
 
         verify(mMigrationNotificationSender, never())
-                .sendNotification(
-                        MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_CANCELLED,
-                        DEFAULT_USER_HANDLE);
+                .sendNotification(anyInt(), any(UserHandle.class));
     }
 
     @Test
@@ -194,7 +180,7 @@
     }
 
     @Test
-    public void testStateChanged_inProgress_noMigrationUiInProgressNotificationSent() {
+    public void testStateChanged_inProgress_noNotificationSent() {
         when(mMigrationStateManager.getMigrationState())
                 .thenReturn(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
         final ArgumentCaptor<MigrationStateManager.StateChangedListener> captor =
@@ -203,9 +189,7 @@
         verify(mMigrationStateManager).addStateChangedListener(captor.capture());
         captor.getValue().onChanged(HealthConnectDataState.MIGRATION_STATE_IN_PROGRESS);
         verify(mMigrationNotificationSender, never())
-                .sendNotification(
-                        MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_IN_PROGRESS,
-                        DEFAULT_USER_HANDLE);
+                .sendNotification(anyInt(), any(UserHandle.class));
     }
 
     @Test
@@ -223,7 +207,7 @@
     }
 
     @Test
-    public void testStateChanged_complete_noMigrationUiCompleteNotificationSent() {
+    public void testStateChanged_complete_noNotificationSent() {
         when(mMigrationStateManager.getMigrationState())
                 .thenReturn(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
         when(mMigrationStateManager.hasIdleStateTimedOut()).thenReturn(false);
@@ -233,9 +217,7 @@
         verify(mMigrationStateManager).addStateChangedListener(captor.capture());
         captor.getValue().onChanged(HealthConnectDataState.MIGRATION_STATE_COMPLETE);
         verify(mMigrationNotificationSender, never())
-                .sendNotification(
-                        MigrationNotificationSender.NOTIFICATION_TYPE_MIGRATION_COMPLETE,
-                        DEFAULT_USER_HANDLE);
+                .sendNotification(anyInt(), any(UserHandle.class));
     }
 
     @Test
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/MigratorPackageChangesReceiverTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/MigratorPackageChangesReceiverTest.java
index dfc51cf..2fd569b 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/MigratorPackageChangesReceiverTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/MigratorPackageChangesReceiverTest.java
@@ -62,7 +62,6 @@
                     .build();
 
     @Mock MigrationStateManager mMigrationStateManager;
-    @Mock PreferenceHelper mPreferenceHelper;
     @Mock private Context mContext;
     @Mock private Context mUserContext;
     @Mock private UserManager mUserManager;
@@ -73,8 +72,6 @@
 
     @Before
     public void setUp() {
-        when(MigrationStateManager.getInitialisedInstance()).thenReturn(mMigrationStateManager);
-        when(PreferenceHelper.getInstance()).thenReturn(mPreferenceHelper);
         mMigratorPackageChangesReceiver =
                 new MigratorPackageChangesReceiver(mMigrationStateManager);
         when(mContext.createContextAsUser(any(), anyInt())).thenReturn(mUserContext);
@@ -84,7 +81,6 @@
 
     @After
     public void tearDown() {
-        clearInvocations(mPreferenceHelper);
         clearInvocations(mMigrationStateManager);
     }
 
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/PriorityMigrationHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/PriorityMigrationHelperTest.java
index 85a10e7..888fa53 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/PriorityMigrationHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/PriorityMigrationHelperTest.java
@@ -37,6 +37,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper.DatabaseHelpers;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 
@@ -71,10 +72,11 @@
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
-        PriorityMigrationHelper.clearInstanceForTest();
         mPriorityMigrationHelper =
-                PriorityMigrationHelper.getInstance(
-                        mHealthDataCategoryPriorityHelper, mTransactionManager);
+                new PriorityMigrationHelper(
+                        mHealthDataCategoryPriorityHelper,
+                        mTransactionManager,
+                        new DatabaseHelpers());
     }
 
     @Test
@@ -89,8 +91,7 @@
         doReturn(preMigrationPriority)
                 .when(mHealthDataCategoryPriorityHelper)
                 .getHealthDataCategoryToAppIdPriorityMapImmutable();
-        when(mTransactionManager.getNumberOfEntriesInTheTable(eq(PRE_MIGRATION_TABLE_NAME)))
-                .thenReturn(0L);
+        when(mTransactionManager.queryNumEntries(eq(PRE_MIGRATION_TABLE_NAME))).thenReturn(0L);
 
         mPriorityMigrationHelper.populatePreMigrationPriority();
 
@@ -115,8 +116,7 @@
 
         when(mHealthDataCategoryPriorityHelper.getHealthDataCategoryToAppIdPriorityMapImmutable())
                 .thenReturn(preMigrationPriority);
-        when(mTransactionManager.getNumberOfEntriesInTheTable(eq(PRE_MIGRATION_TABLE_NAME)))
-                .thenReturn(1L);
+        when(mTransactionManager.queryNumEntries(eq(PRE_MIGRATION_TABLE_NAME))).thenReturn(1L);
         mPriorityMigrationHelper.populatePreMigrationPriority();
 
         verify(mTransactionManager, never()).insert(any());
@@ -129,8 +129,7 @@
 
         when(mHealthDataCategoryPriorityHelper.getHealthDataCategoryToAppIdPriorityMapImmutable())
                 .thenReturn(preMigrationPriority);
-        when(mTransactionManager.getNumberOfEntriesInTheTable(eq(PRE_MIGRATION_TABLE_NAME)))
-                .thenReturn(0L);
+        when(mTransactionManager.queryNumEntries(eq(PRE_MIGRATION_TABLE_NAME))).thenReturn(0L);
 
         mPriorityMigrationHelper.populatePreMigrationPriority();
 
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/PriorityMigrationTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/PriorityMigrationTest.java
index b9da299..a27e548 100644
--- a/tests/unittests/src/com/android/server/healthconnect/migration/PriorityMigrationTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/migration/PriorityMigrationTest.java
@@ -39,7 +39,8 @@
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MigrationEntityHelper;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -76,7 +77,8 @@
     @Mock HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
     @Mock PriorityMigrationHelper mPriorityMigrationHelper;
     @Mock SQLiteDatabase mSQLiteDatabase;
-    @Mock PreferenceHelper mPreferenceHelper;
+    @Mock PreferencesManager mPreferencesManager;
+    @Mock MigrationEntityHelper mMigrationEntityHelper;
 
     DataMigrationManager mDataMigrationManager;
 
@@ -107,7 +109,8 @@
                         mAppInfoHelper,
                         mHealthDataCategoryPriorityHelper,
                         mPriorityMigrationHelper,
-                        mPreferenceHelper);
+                        mMigrationEntityHelper,
+                        mPreferencesManager);
     }
 
     @Test
diff --git a/tests/unittests/src/com/android/server/healthconnect/migration/ServerSideMigrationConstantsTest.java b/tests/unittests/src/com/android/server/healthconnect/migration/ServerSideMigrationConstantsTest.java
deleted file mode 100644
index 033ae56..0000000
--- a/tests/unittests/src/com/android/server/healthconnect/migration/ServerSideMigrationConstantsTest.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.healthconnect.migration;
-
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.COUNT_MIGRATION_STATE_ALLOWED_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.COUNT_MIGRATION_STATE_IN_PROGRESS_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.EXECUTION_TIME_BUFFER_MINUTES_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.IDLE_STATE_TIMEOUT_DAYS_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.IN_PROGRESS_STATE_TIMEOUT_HOURS_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.MAX_START_MIGRATION_CALLS_ALLOWED_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_FLAG;
-import static com.android.server.healthconnect.HealthConnectDeviceConfigManager.NON_IDLE_STATE_TIMEOUT_DAYS_FLAG;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.Manifest;
-import android.app.UiAutomation;
-import android.content.Context;
-import android.provider.DeviceConfig;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.platform.app.InstrumentationRegistry;
-
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/** Unit tests for server-side configuration of {@link MigrationConstants} */
-@RunWith(AndroidJUnit4.class)
-public class ServerSideMigrationConstantsTest {
-    @Mock DeviceConfig.Properties mProperties;
-
-    private static final int VALUE_TO_SET = 150;
-    private static final UiAutomation UI_AUTOMATION =
-            InstrumentationRegistry.getInstrumentation().getUiAutomation();
-
-    private static HealthConnectDeviceConfigManager sHealthConnectDeviceConfigManager;
-
-    @Before
-    public void setUp() {
-        UI_AUTOMATION.adoptShellPermissionIdentity(Manifest.permission.READ_DEVICE_CONFIG);
-        Context context = InstrumentationRegistry.getInstrumentation().getContext();
-        HealthConnectDeviceConfigManager.initializeInstance(context);
-        sHealthConnectDeviceConfigManager =
-                HealthConnectDeviceConfigManager.getInitialisedInstance();
-    }
-
-    @After
-    public void tearDown() {
-        UI_AUTOMATION.dropShellPermissionIdentity();
-    }
-
-    @Test
-    public void testCountMigrationStateInProgress_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(COUNT_MIGRATION_STATE_IN_PROGRESS_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getMigrationStateInProgressCount())
-                .isEqualTo(VALUE_TO_SET);
-    }
-
-    @Test
-    public void testCountMigrationStateAllowed_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(COUNT_MIGRATION_STATE_ALLOWED_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getMigrationStateAllowedCount())
-                .isEqualTo(VALUE_TO_SET);
-    }
-
-    @Test
-    public void testMaxStartMigrationCallsAllowed_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(MAX_START_MIGRATION_CALLS_ALLOWED_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getMaxStartMigrationCalls())
-                .isEqualTo(VALUE_TO_SET);
-    }
-
-    @Test
-    public void testIdleStateTimeoutPeriod_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(IDLE_STATE_TIMEOUT_DAYS_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getIdleStateTimeoutPeriod())
-                .isEqualTo(Duration.ofDays((VALUE_TO_SET)));
-    }
-
-    @Test
-    public void testNonIdleStateTimeoutPeriod_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(NON_IDLE_STATE_TIMEOUT_DAYS_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getNonIdleStateTimeoutPeriod())
-                .isEqualTo(Duration.ofDays((VALUE_TO_SET)));
-    }
-
-    @Test
-    public void testInProgressStateTimeoutPeriod_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(IN_PROGRESS_STATE_TIMEOUT_HOURS_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getInProgressStateTimeoutPeriod())
-                .isEqualTo(Duration.ofHours(VALUE_TO_SET));
-    }
-
-    @Test
-    public void testExecutionTimeBuffer_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(EXECUTION_TIME_BUFFER_MINUTES_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getExecutionTimeBuffer())
-                .isEqualTo(TimeUnit.MINUTES.toMillis(VALUE_TO_SET));
-    }
-
-    @Test
-    public void
-            testMigrationCompletionJobRunInterval_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(
-                MIGRATION_COMPLETION_JOB_RUN_INTERVAL_DAYS_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getMigrationCompletionJobRunInterval())
-                .isEqualTo(TimeUnit.DAYS.toMillis(VALUE_TO_SET));
-    }
-
-    @Test
-    public void testMigrationPauseJobRunInterval_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(
-                MIGRATION_PAUSE_JOB_RUN_INTERVAL_HOURS_FLAG, Integer.toString(VALUE_TO_SET));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.getMigrationPauseJobRunInterval())
-                .isEqualTo(TimeUnit.HOURS.toMillis(VALUE_TO_SET));
-    }
-
-    @Test
-    public void testEnableStateChangeJobs_changeValueInDeviceConfig_onPropertiesChanged() {
-        Map<String, String> keyValueMap = new HashMap<String, String>();
-        keyValueMap.put(ENABLE_PAUSE_STATE_CHANGE_JOBS_FLAG, Boolean.toString(false));
-        mProperties =
-                new DeviceConfig.Properties(DeviceConfig.NAMESPACE_HEALTH_FITNESS, keyValueMap);
-
-        sHealthConnectDeviceConfigManager.onPropertiesChanged(mProperties);
-
-        assertThat(sHealthConnectDeviceConfigManager.isPauseStateChangeJobEnabled())
-                .isEqualTo(false);
-    }
-}
diff --git a/tests/unittests/src/com/android/server/healthconnect/permission/DataPermissionEnforcerTest.java b/tests/unittests/src/com/android/server/healthconnect/permission/DataPermissionEnforcerTest.java
index cacc0f7..5c49146 100644
--- a/tests/unittests/src/com/android/server/healthconnect/permission/DataPermissionEnforcerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/permission/DataPermissionEnforcerTest.java
@@ -20,7 +20,6 @@
 import static android.health.connect.HealthPermissions.READ_ACTIVE_CALORIES_BURNED;
 import static android.health.connect.HealthPermissions.READ_EXERCISE_ROUTE;
 import static android.health.connect.HealthPermissions.READ_EXERCISE_ROUTES;
-import static android.health.connect.HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND;
 import static android.health.connect.HealthPermissions.READ_STEPS;
 import static android.health.connect.HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED;
 import static android.health.connect.HealthPermissions.WRITE_EXERCISE;
@@ -32,19 +31,22 @@
 import static android.permission.PermissionManager.PERMISSION_GRANTED;
 import static android.permission.PermissionManager.PERMISSION_HARD_DENIED;
 
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.when;
 
 import android.content.AttributionSource;
 import android.content.Context;
 import android.health.connect.internal.datatypes.ExerciseRouteInternal;
 import android.health.connect.internal.datatypes.ExerciseSessionRecordInternal;
+import android.os.UserHandle;
 import android.permission.PermissionManager;
 import android.util.ArrayMap;
 
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -60,7 +62,10 @@
 
     @Mock private Context mContext;
 
-    @Mock private HealthConnectDeviceConfigManager mDeviceConfigManager;
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
 
     private AttributionSource mAttributionSource;
 
@@ -69,11 +74,20 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        HealthConnectDeviceConfigManager.initializeInstance(mContext);
-
         mAttributionSource = buildAttributionSource();
+
+        when(mContext.getUser()).thenReturn(UserHandle.CURRENT);
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(getInstrumentation().getContext())
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .build();
+
         mDataPermissionEnforcer =
-                new DataPermissionEnforcer(mPermissionManager, mContext, mDeviceConfigManager);
+                new DataPermissionEnforcer(
+                        mPermissionManager,
+                        mContext,
+                        healthConnectInjector.getInternalHealthConnectMappings());
     }
 
     /** enforceRecordIdsWritePermissions */
@@ -272,34 +286,6 @@
         mDataPermissionEnforcer.enforceAnyOfPermissions(READ_STEPS, WRITE_STEPS);
     }
 
-    /** enforceBackgroundReadRestrictions */
-    @Test
-    public void testEnforceBackgroundReadRestrictions_permissionGranted_doesNotThrow() {
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-
-        mDataPermissionEnforcer.enforceBackgroundReadRestrictions(1, 2, "error");
-    }
-
-    @Test(expected = SecurityException.class)
-    public void testEnforceBackgroundReadRestrictions_permissionDenied_throwsSecurityException() {
-        int pid = 1;
-        int uid = 2;
-        String message = "error";
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(true);
-        doThrow(SecurityException.class)
-                .when(mContext)
-                .enforcePermission(READ_HEALTH_DATA_IN_BACKGROUND, pid, uid, message);
-
-        mDataPermissionEnforcer.enforceBackgroundReadRestrictions(uid, pid, message);
-    }
-
-    @Test(expected = SecurityException.class)
-    public void testEnforceBackgroundReadRestrictions_featureDisabled_throwsSecurityException() {
-        when(mDeviceConfigManager.isBackgroundReadFeatureEnabled()).thenReturn(false);
-
-        mDataPermissionEnforcer.enforceBackgroundReadRestrictions(1, 1, "error");
-    }
-
     /** collectGrantedExtraReadPermissions */
     @Test
     public void testCollectGrantedExtraReadPermissions_permissionsGranted_returnsPermissions() {
diff --git a/tests/unittests/src/com/android/server/healthconnect/permission/FirstGrantTimeUnitTest.java b/tests/unittests/src/com/android/server/healthconnect/permission/FirstGrantTimeUnitTest.java
index 4354dc9..04ed771 100644
--- a/tests/unittests/src/com/android/server/healthconnect/permission/FirstGrantTimeUnitTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/permission/FirstGrantTimeUnitTest.java
@@ -30,36 +30,21 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.UiAutomation;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
-import android.health.connect.HealthConnectException;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.HealthPermissions;
-import android.health.connect.ReadRecordsRequest;
-import android.health.connect.ReadRecordsRequestUsingFilters;
-import android.health.connect.ReadRecordsResponse;
-import android.health.connect.TimeInstantRangeFilter;
-import android.health.connect.datatypes.Record;
-import android.health.connect.datatypes.StepsRecord;
-import android.os.OutcomeReceiver;
 import android.os.Process;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.Pair;
 
-import androidx.test.InstrumentationRegistry;
-
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.HealthConnectThreadScheduler;
-import com.android.server.healthconnect.HealthConnectUserContext;
-import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
 import com.android.server.healthconnect.migration.MigrationStateManager;
-import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 
 import org.junit.After;
@@ -77,11 +62,8 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
+import java.util.Set;
 import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicReference;
 
 // TODO(b/261432978): add test for sharedUser backup
 public class FirstGrantTimeUnitTest {
@@ -89,13 +71,14 @@
     @Rule
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
-                    .mockStatic(MigrationStateManager.class)
+                    .mockStatic(HealthConnectManager.class)
                     .mockStatic(HealthConnectThreadScheduler.class)
-                    .spyStatic(HealthDataCategoryPriorityHelper.class)
+                    .spyStatic(UserHandle.class)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
     private static final String SELF_PACKAGE_NAME = "com.android.healthconnect.unittests";
+    private static final int SELF_PACKAGE_UID = 123;
     private static final UserHandle CURRENT_USER = Process.myUserHandle();
 
     private static final int DEFAULT_VERSION = 1;
@@ -107,37 +90,59 @@
     @Mock private UserManager mUserManager;
     @Mock private Context mContext;
     @Mock private FirstGrantTimeDatastore mDatastore;
-    @Mock private PackageInfoUtils mPackageInfoUtils;
 
-    private HealthConnectInjectorImpl.Builder mHealthConnectInjectorBuilder;
-
-    private final UiAutomation mUiAutomation =
-            InstrumentationRegistry.getInstrumentation().getUiAutomation();
+    private FirstGrantTimeManager mFirstGrantTimeManager;
 
     @Before
-    public void setUp() {
-        Context context = InstrumentationRegistry.getContext();
+    public void setUp() throws PackageManager.NameNotFoundException {
         MockitoAnnotations.initMocks(this);
-        HealthConnectDeviceConfigManager.initializeInstance(context);
-        TransactionManager.initializeInstance(new HealthConnectUserContext(context, CURRENT_USER));
+
         when(mMigrationStateManager.isMigrationInProgress()).thenReturn(false);
+        when(mTracker.supportsPermissionUsageIntent(anyString(), any())).thenReturn(true);
+
         when(mDatastore.readForUser(CURRENT_USER, DATA_TYPE_CURRENT))
                 .thenReturn(new UserGrantTimeState(DEFAULT_VERSION));
         when(mDatastore.readForUser(CURRENT_USER, DATA_TYPE_STAGED))
                 .thenReturn(new UserGrantTimeState(DEFAULT_VERSION));
-        when(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
-                .thenReturn(true);
-        when(mContext.createContextAsUser(any(), anyInt())).thenReturn(context);
-        when(mContext.getApplicationContext()).thenReturn(context);
+
+        when(mContext.createContextAsUser(any(), anyInt())).thenReturn(mContext);
+        when(mContext.getApplicationContext()).thenReturn(mContext);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
-        when(mUserManager.isUserUnlocked()).thenReturn(true);
+        when(mContext.getUser()).thenReturn(CURRENT_USER);
 
-        mHealthConnectInjectorBuilder =
-                HealthConnectInjectorImpl.newBuilderForTest(context)
-                        .setMigrationStateManager(mMigrationStateManager);
-        mUiAutomation.adoptShellPermissionIdentity(
-                "android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS");
+        when(mUserManager.isUserUnlocked(any())).thenReturn(true);
+        ExtendedMockito.when(UserHandle.getUserHandleForUid(SELF_PACKAGE_UID))
+                .thenReturn(CURRENT_USER);
+
+        when(mPackageManager.getPackageUid(eq(SELF_PACKAGE_NAME), any()))
+                .thenReturn(SELF_PACKAGE_UID);
+        when(mPackageManager.getPackagesForUid(SELF_PACKAGE_UID))
+                .thenReturn(new String[] {SELF_PACKAGE_NAME});
+
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = SELF_PACKAGE_NAME;
+        packageInfo.requestedPermissions = new String[] {HealthPermissions.WRITE_STEPS};
+        packageInfo.requestedPermissionsFlags =
+                new int[] {PackageInfo.REQUESTED_PERMISSION_GRANTED};
+        when(mPackageManager.getPackageInfo(eq(SELF_PACKAGE_NAME), any())).thenReturn(packageInfo);
+        when(mPackageManager.getInstalledPackages(any())).thenReturn(List.of(packageInfo));
+
+        ExtendedMockito.when(
+                        HealthConnectManager.isHealthPermission(
+                                mContext, HealthPermissions.WRITE_STEPS))
+                .thenReturn(true);
+        ExtendedMockito.when(HealthConnectManager.getHealthPermissions(mContext))
+                .thenReturn(Set.of(HealthPermissions.WRITE_STEPS));
+
+        mFirstGrantTimeManager =
+                HealthConnectInjectorImpl.newBuilderForTest(mContext)
+                        .setMigrationStateManager(mMigrationStateManager)
+                        .setFirstGrantTimeDatastore(mDatastore)
+                        .setHealthPermissionIntentAppsTracker(mTracker)
+                        .setHealthDataCategoryPriorityHelper(mHealthDataCategoryPriorityHelper)
+                        .build()
+                        .getFirstGrantTimeManager();
     }
 
     @After
@@ -146,51 +151,50 @@
     }
 
     @Test
-    public void testSetFirstGrantTimeForAnApp_expectOtherAppsGrantTimesRemained() {
+    public void testSetFirstGrantTimeForAnApp_expectOtherAppsGrantTimesRemained()
+            throws PackageManager.NameNotFoundException {
         Instant instant1 = Instant.parse("2023-02-11T10:00:00Z");
         Instant instant2 = Instant.parse("2023-02-12T10:00:00Z");
         Instant instant3 = Instant.parse("2023-02-13T10:00:00Z");
         String anotherPackage = "another.package";
-        // mock PackageInfoUtils
+
+        // mock packageManager
         List<Pair<String, Integer>> packageNameAndUidPairs =
-                Arrays.asList(new Pair<>(SELF_PACKAGE_NAME, 0), new Pair<>(anotherPackage, 1));
-        // Need to re-initialize so that it uses the PackageInfoUtils mock
+                Arrays.asList(new Pair<>(SELF_PACKAGE_NAME, 123), new Pair<>(anotherPackage, 456));
         List<PackageInfo> packageInfos = new ArrayList<>();
         for (Pair<String, Integer> pair : packageNameAndUidPairs) {
             String packageName = pair.first;
             int uid = pair.second;
             PackageInfo packageInfo = new PackageInfo();
             packageInfo.packageName = packageName;
+            packageInfo.requestedPermissions = new String[] {HealthPermissions.WRITE_STEPS};
+            packageInfo.requestedPermissionsFlags =
+                    new int[] {PackageInfo.REQUESTED_PERMISSION_GRANTED};
             packageInfos.add(packageInfo);
-            when(mPackageInfoUtils.getPackageUid(
-                            eq(packageName), any(UserHandle.class), any(Context.class)))
-                    .thenReturn(uid);
-            when(mPackageInfoUtils.getPackageNameFromUid(eq(uid)))
-                    .thenReturn(Optional.of(packageName));
+            when(mPackageManager.getPackageUid(eq(packageName), any())).thenReturn(uid);
+            when(mPackageManager.getPackagesForUid(uid)).thenReturn(new String[] {packageName});
+            when(mPackageManager.getPackageInfo(eq(packageName), any())).thenReturn(packageInfo);
+
+            ExtendedMockito.when(UserHandle.getUserHandleForUid(uid)).thenReturn(CURRENT_USER);
         }
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(
-                        any(UserHandle.class), any(Context.class)))
-                .thenReturn(packageInfos);
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ true);
+        when(mPackageManager.getInstalledPackages(any())).thenReturn(packageInfos);
+
+        // Mock Datastore.
         UserGrantTimeState currentGrantTimeState = new UserGrantTimeState(DEFAULT_VERSION);
         currentGrantTimeState.setPackageGrantTime(SELF_PACKAGE_NAME, instant1);
         currentGrantTimeState.setPackageGrantTime(anotherPackage, instant2);
         when(mDatastore.readForUser(CURRENT_USER, DATA_TYPE_CURRENT))
                 .thenReturn(currentGrantTimeState);
-        // mock permission intent tracker
-        when(mTracker.supportsPermissionUsageIntent(anyString(), ArgumentMatchers.any()))
-                .thenReturn(true);
-        ArgumentCaptor<UserGrantTimeState> captor =
-                ArgumentCaptor.forClass(UserGrantTimeState.class);
 
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .hasValue(instant1);
-        assertThat(firstGrantTimeManager.getFirstGrantTime(anotherPackage, CURRENT_USER))
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(anotherPackage, CURRENT_USER))
                 .hasValue(instant2);
 
-        firstGrantTimeManager.setFirstGrantTime(SELF_PACKAGE_NAME, instant3, CURRENT_USER);
-        verify(mDatastore).writeForUser(captor.capture(), eq(CURRENT_USER), anyInt());
+        ArgumentCaptor<UserGrantTimeState> captor =
+                ArgumentCaptor.forClass(UserGrantTimeState.class);
+        mFirstGrantTimeManager.setFirstGrantTime(SELF_PACKAGE_NAME, instant3, CURRENT_USER);
+        verify(mDatastore).writeForUser(captor.capture(), eq(CURRENT_USER), eq(DATA_TYPE_CURRENT));
 
         UserGrantTimeState newUserGrantTimeState = captor.getValue();
         assertThat(newUserGrantTimeState.getPackageGrantTimes().keySet()).hasSize(2);
@@ -201,117 +205,56 @@
     }
 
     @Test(expected = IllegalArgumentException.class)
-    public void testUnknownPackage_throwsException() {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
-        firstGrantTimeManager.getFirstGrantTime("android.unknown_package", CURRENT_USER);
+    public void testUnknownPackage_throwsException() throws PackageManager.NameNotFoundException {
+        String unknownPackage = "android.unknown_package";
+        when(mPackageManager.getPackageUid(eq(unknownPackage), any()))
+                .thenThrow(new PackageManager.NameNotFoundException());
+        mFirstGrantTimeManager.getFirstGrantTime(unknownPackage, CURRENT_USER);
     }
 
     @Test
     public void testCurrentPackage_intentNotSupported_grantTimeIsNull() {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
-
         when(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
                 .thenReturn(false);
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .isEmpty();
     }
 
     @Test
     public void testOnPermissionsChangedCalledWhileDeviceIsLocked_getGrantTimeNotNullAfterUnlock()
             throws TimeoutException {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
         // before device is unlocked
-        when(mUserManager.isUserUnlocked()).thenReturn(false);
+        when(mUserManager.isUserUnlocked(any())).thenReturn(false);
         when(mDatastore.readForUser(CURRENT_USER, DATA_TYPE_CURRENT)).thenReturn(null);
         when(mDatastore.readForUser(CURRENT_USER, DATA_TYPE_STAGED)).thenReturn(null);
-        int uid = 123;
-        String[] packageNames = {"package.name"};
-        when(mPackageManager.getPackagesForUid(uid)).thenReturn(packageNames);
-        when(mTracker.supportsPermissionUsageIntent(eq(packageNames[0]), ArgumentMatchers.any()))
-                .thenReturn(true);
-        firstGrantTimeManager.onPermissionsChanged(uid);
+        mFirstGrantTimeManager.onPermissionsChanged(SELF_PACKAGE_UID);
         waitForAllScheduledTasksToComplete();
         // after device is unlocked
-        when(mUserManager.isUserUnlocked()).thenReturn(true);
+        when(mUserManager.isUserUnlocked(any())).thenReturn(true);
         UserGrantTimeState currentGrantTimeState = new UserGrantTimeState(DEFAULT_VERSION);
         Instant now = Instant.parse("2023-02-14T10:00:00Z");
         currentGrantTimeState.setPackageGrantTime(SELF_PACKAGE_NAME, now);
         when(mDatastore.readForUser(CURRENT_USER, DATA_TYPE_CURRENT))
                 .thenReturn(currentGrantTimeState);
 
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .hasValue(now);
     }
 
     @Test
-    public void
-            testOnPermissionsChangedCalled_withHealthPermissionsUid_expectBackgroundTaskAdded() {
-        int uid = 123;
-        String[] packageNames = {"package.name"};
-        PackageInfo packageInfo = new PackageInfo();
-        packageInfo.packageName = packageNames[0];
-        packageInfo.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_EXERCISE,
-                };
-        packageInfo.requestedPermissionsFlags =
-                new int[] {
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                };
-        when(mPackageManager.getPackagesForUid(uid)).thenReturn(packageNames);
-        when(mPackageInfoUtils.getPackageNamesForUid(uid)).thenReturn(packageNames);
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
-                .thenReturn(List.of(packageInfo));
-        when(mPackageInfoUtils.hasGrantedHealthPermissions(eq(packageNames), any(), any()))
-                .thenReturn(true);
-        when(mTracker.supportsPermissionUsageIntent(eq(packageNames[0]), ArgumentMatchers.any()))
-                .thenReturn(true);
-        when(HealthDataCategoryPriorityHelper.getInstance())
-                .thenReturn(mHealthDataCategoryPriorityHelper);
-
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ true);
-
-        firstGrantTimeManager.onPermissionsChanged(uid);
+    public void testOnPermissionsChanged_withHealthPermissionsUid_expectBackgroundTaskAdded() {
+        mFirstGrantTimeManager.onPermissionsChanged(SELF_PACKAGE_UID);
 
         ExtendedMockito.verify(
                 () -> HealthConnectThreadScheduler.scheduleInternalTask(any()), times(1));
     }
 
     @Test
-    public void
-            testOnPermissionsChangedCalled_withNoHealthPermissionsUid_expectNoBackgroundTaskAdded()
-                    throws TimeoutException {
-        int uid = 123;
-        String[] packageNames = {"package.name"};
-        PackageInfo packageInfo = new PackageInfo();
-        packageInfo.packageName = packageNames[0];
-        packageInfo.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_EXERCISE,
-                };
-        packageInfo.requestedPermissionsFlags =
-                new int[] {
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                };
-        when(mPackageManager.getPackagesForUid(uid)).thenReturn(packageNames);
-        when(mPackageInfoUtils.getPackageNamesForUid(uid)).thenReturn(packageNames);
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
-                .thenReturn(List.of(packageInfo));
-        when(mPackageInfoUtils.hasGrantedHealthPermissions(eq(packageNames), any(), any()))
-                .thenReturn(true);
-        when(mTracker.supportsPermissionUsageIntent(eq(packageNames[0]), ArgumentMatchers.any()))
+    public void testOnPermissionsChanged_withNoHealthPermissionsUid_expectNoBackgroundTaskAdded() {
+        when(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
                 .thenReturn(false);
-        when(HealthDataCategoryPriorityHelper.getInstance())
-                .thenReturn(mHealthDataCategoryPriorityHelper);
 
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ true);
-
-        firstGrantTimeManager.onPermissionsChanged(uid);
+        mFirstGrantTimeManager.onPermissionsChanged(SELF_PACKAGE_UID);
 
         ExtendedMockito.verify(
                 () -> HealthConnectThreadScheduler.scheduleInternalTask(any()), times(0));
@@ -319,11 +262,9 @@
 
     @Test
     public void testCurrentPackage_intentSupported_grantTimeIsNotNull() {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
         // Calling getFirstGrantTime will set grant time for the package
         Optional<Instant> firstGrantTime =
-                firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER);
+                mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER);
         assertThat(firstGrantTime).isPresent();
 
         assertThat(firstGrantTime.get()).isGreaterThan(Instant.now().minusSeconds((long) 1e3));
@@ -345,84 +286,59 @@
 
     @Test
     public void testCurrentPackage_noGrantTimeBackupBecameAvailable_grantTimeEqualToStaged() {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .isPresent();
         Instant backupTime = Instant.now().minusSeconds((long) 1e5);
         UserGrantTimeState stagedState = setupGrantTimeState(null, backupTime);
-        firstGrantTimeManager.applyAndStageGrantTimeStateForUser(CURRENT_USER, stagedState);
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        mFirstGrantTimeManager.applyAndStageGrantTimeStateForUser(CURRENT_USER, stagedState);
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .hasValue(backupTime);
     }
 
     @Test
     public void testCurrentPackage_noBackup_useRecordedTime() {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
         Instant stateTime = Instant.now().minusSeconds((long) 1e5);
         UserGrantTimeState stagedState = setupGrantTimeState(stateTime, null);
 
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .hasValue(stateTime);
-        firstGrantTimeManager.applyAndStageGrantTimeStateForUser(CURRENT_USER, stagedState);
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        mFirstGrantTimeManager.applyAndStageGrantTimeStateForUser(CURRENT_USER, stagedState);
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .hasValue(stateTime);
     }
 
     @Test
     public void testCurrentPackage_noBackup_grantTimeEqualToStaged() {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
         Instant backupTime = Instant.now().minusSeconds((long) 1e5);
         Instant stateTime = backupTime.plusSeconds(10);
         UserGrantTimeState stagedState = setupGrantTimeState(stateTime, backupTime);
 
-        firstGrantTimeManager.applyAndStageGrantTimeStateForUser(CURRENT_USER, stagedState);
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        mFirstGrantTimeManager.applyAndStageGrantTimeStateForUser(CURRENT_USER, stagedState);
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .hasValue(backupTime);
     }
 
     @Test
     public void testCurrentPackage_backupDataLater_stagedDataSkipped() {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
         Instant stateTime = Instant.now().minusSeconds((long) 1e5);
         UserGrantTimeState stagedState = setupGrantTimeState(stateTime, stateTime.plusSeconds(1));
 
-        firstGrantTimeManager.applyAndStageGrantTimeStateForUser(CURRENT_USER, stagedState);
-        assertThat(firstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
+        mFirstGrantTimeManager.applyAndStageGrantTimeStateForUser(CURRENT_USER, stagedState);
+        assertThat(mFirstGrantTimeManager.getFirstGrantTime(SELF_PACKAGE_NAME, CURRENT_USER))
                 .hasValue(stateTime);
     }
 
     @Test
     public void testWriteStagedData_getStagedStateForCurrentPackage_returnsCorrectState() {
-        FirstGrantTimeManager firstGrantTimeManager =
-                createFirstGrantTimeManager(/* useMockPackageInfoUtils= */ false);
         Instant stateTime = Instant.now().minusSeconds((long) 1e5);
         setupGrantTimeState(stateTime, null);
 
-        UserGrantTimeState state = firstGrantTimeManager.getGrantTimeStateForUser(CURRENT_USER);
+        UserGrantTimeState state = mFirstGrantTimeManager.getGrantTimeStateForUser(CURRENT_USER);
         assertThat(state.getSharedUserGrantTimes()).isEmpty();
         assertThat(state.getPackageGrantTimes().containsKey(SELF_PACKAGE_NAME)).isTrue();
         assertThat(state.getPackageGrantTimes().get(SELF_PACKAGE_NAME)).isEqualTo(stateTime);
     }
 
-    @Test(expected = HealthConnectException.class)
-    public <T extends Record> void testReadRecords_withNoIntent_throwsException()
-            throws InterruptedException {
-        TimeInstantRangeFilter filter =
-                new TimeInstantRangeFilter.Builder()
-                        .setStartTime(Instant.now())
-                        .setEndTime(Instant.now().plusMillis(3000))
-                        .build();
-        ReadRecordsRequestUsingFilters<StepsRecord> request =
-                new ReadRecordsRequestUsingFilters.Builder<>(StepsRecord.class)
-                        .setTimeRangeFilter(filter)
-                        .build();
-        readRecords(request);
-    }
-
     private UserGrantTimeState setupGrantTimeState(Instant currentTime, Instant stagedTime) {
         if (currentTime != null) {
             UserGrantTimeState state = new UserGrantTimeState(DEFAULT_VERSION);
@@ -437,55 +353,4 @@
         when(mDatastore.readForUser(CURRENT_USER, DATA_TYPE_STAGED)).thenReturn(backupState);
         return backupState;
     }
-
-    private static <T extends Record> List<T> readRecords(ReadRecordsRequest<T> request)
-            throws InterruptedException {
-        Context context = InstrumentationRegistry.getInstrumentation().getContext();
-        HealthConnectManager service = context.getSystemService(HealthConnectManager.class);
-        CountDownLatch latch = new CountDownLatch(1);
-        assertThat(service).isNotNull();
-        assertThat(request.getRecordType()).isNotNull();
-        AtomicReference<List<T>> response = new AtomicReference<>();
-        AtomicReference<HealthConnectException> healthConnectExceptionAtomicReference =
-                new AtomicReference<>();
-        service.readRecords(
-                request,
-                Executors.newSingleThreadExecutor(),
-                new OutcomeReceiver<>() {
-                    @Override
-                    public void onResult(ReadRecordsResponse<T> result) {
-                        response.set(result.getRecords());
-                        latch.countDown();
-                    }
-
-                    @Override
-                    public void onError(HealthConnectException exception) {
-                        healthConnectExceptionAtomicReference.set(exception);
-                        latch.countDown();
-                    }
-                });
-        assertThat(latch.await(3, TimeUnit.SECONDS)).isEqualTo(true);
-        if (healthConnectExceptionAtomicReference.get() != null) {
-            throw healthConnectExceptionAtomicReference.get();
-        }
-        return response.get();
-    }
-
-    private FirstGrantTimeManager createFirstGrantTimeManager(boolean useMockPackageInfoUtils) {
-        HealthConnectInjector healthConnectInjector;
-        if (useMockPackageInfoUtils) {
-            healthConnectInjector =
-                    mHealthConnectInjectorBuilder.setPackageInfoUtils(mPackageInfoUtils).build();
-        } else {
-            healthConnectInjector = mHealthConnectInjectorBuilder.build();
-        }
-
-        return new FirstGrantTimeManager(
-                mContext,
-                mTracker,
-                mDatastore,
-                healthConnectInjector.getPackageInfoUtils(),
-                healthConnectInjector.getHealthDataCategoryPriorityHelper(),
-                mHealthConnectInjectorBuilder.build().getMigrationStateManager());
-    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/permission/GrantTimePersistenceUnitTest.java b/tests/unittests/src/com/android/server/healthconnect/permission/GrantTimePersistenceUnitTest.java
index 1817dff..ddc53f5 100644
--- a/tests/unittests/src/com/android/server/healthconnect/permission/GrantTimePersistenceUnitTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/permission/GrantTimePersistenceUnitTest.java
@@ -23,25 +23,21 @@
 
 import static org.mockito.Mockito.when;
 
-import android.content.Context;
-import android.os.Environment;
 import android.os.UserHandle;
 import android.util.ArrayMap;
 
-import androidx.test.InstrumentationRegistry;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
 import com.android.server.LocalManagerRegistry;
 import com.android.server.appop.AppOpsManagerLocal;
+import com.android.server.healthconnect.EnvironmentFixture;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.quality.Strictness;
 
 import java.io.File;
@@ -79,32 +75,25 @@
     private static final UserGrantTimeState EMPTY_STATE =
             new UserGrantTimeState(new ArrayMap<>(), new ArrayMap<>(), 3);
 
+    private final EnvironmentFixture mEnvironmentFixture = new EnvironmentFixture();
+
     @Rule
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
-                    .mockStatic(Environment.class)
                     .mockStatic(LocalManagerRegistry.class)
                     .setStrictness(Strictness.LENIENT)
+                    .addStaticMockFixtures(() -> mEnvironmentFixture)
                     .build();
 
     private final UserHandle mUser = UserHandle.of(UserHandle.myUserId());
-    private File mMockDataDirectory;
     @Mock private AppOpsManagerLocal mAppOpsManagerLocal;
 
     @Before
     public void mockApexEnvironment() {
-        Context context = InstrumentationRegistry.getContext();
-        mMockDataDirectory = context.getDir("mock_data", Context.MODE_PRIVATE);
-        Mockito.when(Environment.getDataDirectory()).thenReturn(mMockDataDirectory);
         when(LocalManagerRegistry.getManager(AppOpsManagerLocal.class))
                 .thenReturn(mAppOpsManagerLocal);
     }
 
-    @After
-    public void tearDown() {
-        deleteFile(mMockDataDirectory);
-    }
-
     @Test
     public void testWriteReadData_packageAndSharedUserState_restoredCorrectly() {
         FirstGrantTimeDatastore datastore = FirstGrantTimeDatastore.createInstance();
@@ -159,12 +148,12 @@
     @Test
     public void testWriteReadData_statesForTwoUsersWritten_restoredCorrectly() {
         FirstGrantTimeDatastore datastore = FirstGrantTimeDatastore.createInstance();
+        UserHandle secondUser = UserHandle.of(mUser.getIdentifier() + 10);
         datastore.writeForUser(PACKAGES_STATE, mUser, DATA_TYPE_CURRENT);
-        datastore.writeForUser(SHARED_USERS_STATE, UserHandle.of(10), DATA_TYPE_CURRENT);
+        datastore.writeForUser(SHARED_USERS_STATE, secondUser, DATA_TYPE_CURRENT);
         UserGrantTimeState restoredState = datastore.readForUser(mUser, DATA_TYPE_CURRENT);
         assertRestoredStateIsCorrect(restoredState, PACKAGES_STATE);
-        UserGrantTimeState restoredState2 =
-                datastore.readForUser(UserHandle.of(10), DATA_TYPE_CURRENT);
+        UserGrantTimeState restoredState2 = datastore.readForUser(secondUser, DATA_TYPE_CURRENT);
         assertRestoredStateIsCorrect(restoredState2, SHARED_USERS_STATE);
     }
 
@@ -178,13 +167,14 @@
     @Test
     public void testParseData_stateIsNotWritten_nullIsReturned() {
         UserGrantTimeState state =
-                GrantTimeXmlHelper.parseGrantTime(new File(mMockDataDirectory, "test_file.xml"));
+                GrantTimeXmlHelper.parseGrantTime(
+                        new File(mEnvironmentFixture.getDataDirectory(), "test_file.xml"));
         assertThat(state).isNull();
     }
 
     @Test
     public void testWriteData_writeAndReadState_restoredEqualToWritten() {
-        File testFile = new File(mMockDataDirectory, "test_file.xml");
+        File testFile = new File(mEnvironmentFixture.getDataDirectory(), "test_file.xml");
         GrantTimeXmlHelper.serializeGrantTimes(testFile, DEFAULT_STATE);
         UserGrantTimeState state = GrantTimeXmlHelper.parseGrantTime(testFile);
         assertRestoredStateIsCorrect(state, DEFAULT_STATE);
@@ -200,22 +190,10 @@
         assertThat(current).isNotEqualTo(staged);
     }
 
-    private static void deleteFile(File file) {
-        File[] contents = file.listFiles();
-        if (contents != null) {
-            for (File f : contents) {
-                deleteFile(f);
-            }
-        }
-        assertThat(file.delete()).isTrue();
-    }
-
     private static void assertRestoredStateIsCorrect(
-            UserGrantTimeState restoredState, UserGrantTimeState initialState) {
-        assertThat(initialState.getVersion()).isEqualTo(restoredState.getVersion());
-        assertThat(initialState.getPackageGrantTimes())
-                .isEqualTo(restoredState.getPackageGrantTimes());
-        assertThat(initialState.getSharedUserGrantTimes())
-                .isEqualTo(restoredState.getSharedUserGrantTimes());
+            UserGrantTimeState actual, UserGrantTimeState expected) {
+        assertThat(actual.getVersion()).isEqualTo(expected.getVersion());
+        assertThat(actual.getPackageGrantTimes()).isEqualTo(expected.getPackageGrantTimes());
+        assertThat(actual.getSharedUserGrantTimes()).isEqualTo(expected.getSharedUserGrantTimes());
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/permission/HealthPermissionIntentAppsTrackerTest.java b/tests/unittests/src/com/android/server/healthconnect/permission/HealthPermissionIntentAppsTrackerTest.java
index b1e9eee..4b3ba9a 100644
--- a/tests/unittests/src/com/android/server/healthconnect/permission/HealthPermissionIntentAppsTrackerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/permission/HealthPermissionIntentAppsTrackerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.server.healthconnect.permission;
 
+import static com.android.healthfitness.flags.Flags.FLAG_PERMISSION_TRACKER_FIX_MAPPING_INIT;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -29,8 +31,11 @@
 import android.os.Process;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -42,10 +47,11 @@
     private static final String SELF_PACKAGE_NAME = "com.android.healthconnect.unittests";
     private static final UserHandle CURRENT_USER = Process.myUserHandle();
 
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     @Mock private Context mContext;
     @Mock private PackageManager mPackageManager;
     @Mock private UserManager mUserManager;
-    private HealthPermissionIntentAppsTracker mTracker;
 
     @Before
     public void setUp() {
@@ -54,13 +60,14 @@
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mContext.getSystemService(eq(UserManager.class))).thenReturn(mUserManager);
         when(mUserManager.getUserHandles(anyBoolean())).thenReturn(List.of(CURRENT_USER));
-        setSelfIntentSupport(false);
-        mTracker = new HealthPermissionIntentAppsTracker(mContext);
     }
 
     @Test
     public void testCheckPackage_packageSupportsIntent_returnsTrue() {
         setSelfIntentSupport(/* intentSupported= */ true);
+        HealthPermissionIntentAppsTracker mTracker =
+                new HealthPermissionIntentAppsTracker(mContext);
+        mTracker.onUserUnlocked(CURRENT_USER);
         assertThat(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
                 .isTrue();
     }
@@ -68,18 +75,37 @@
     @Test
     public void testCheckPackage_packageDoesntSupportIntent_returnsFalse() {
         setSelfIntentSupport(/* intentSupported= */ false);
+        HealthPermissionIntentAppsTracker mTracker =
+                new HealthPermissionIntentAppsTracker(mContext);
+        mTracker.onUserUnlocked(CURRENT_USER);
         assertThat(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
                 .isFalse();
     }
 
     @Test
+    @EnableFlags({FLAG_PERMISSION_TRACKER_FIX_MAPPING_INIT})
+    public void testCheckPackage_userNotInit_packageSupportsIntent_returnsTrue() {
+        setSelfIntentSupport(/* intentSupported= */ true);
+        HealthPermissionIntentAppsTracker mTracker =
+                new HealthPermissionIntentAppsTracker(mContext);
+        assertThat(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
+                .isTrue();
+    }
+
+    @Test
     public void testUpdatePackageState_packageSupportIntentRemoved_returnsRemovedIntentTrue() {
         setSelfIntentSupport(/* intentSupported= */ true);
+        HealthPermissionIntentAppsTracker mTracker =
+                new HealthPermissionIntentAppsTracker(mContext);
+        mTracker.onUserUnlocked(CURRENT_USER);
         assertThat(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
                 .isTrue();
         setSelfIntentSupport(/* intentSupported= */ false);
-        assertThat(mTracker.updateStateAndGetIfIntentWasRemoved(SELF_PACKAGE_NAME, CURRENT_USER))
+        // This call doesn't update the cache and continues returning true.
+        assertThat(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
                 .isTrue();
+        assertThat(mTracker.updateAndGetSupportsPackageUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
+                .isFalse();
         assertThat(mTracker.supportsPermissionUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
                 .isFalse();
     }
diff --git a/tests/unittests/src/com/android/server/healthconnect/permission/MedicalDataPermissionEnforcerTest.java b/tests/unittests/src/com/android/server/healthconnect/permission/MedicalDataPermissionEnforcerTest.java
index 216294b..825a85d 100644
--- a/tests/unittests/src/com/android/server/healthconnect/permission/MedicalDataPermissionEnforcerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/permission/MedicalDataPermissionEnforcerTest.java
@@ -16,21 +16,25 @@
 
 package com.android.server.healthconnect.permission;
 
-import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGY_INTOLERANCE;
-import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_IMMUNIZATION;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_CONDITIONS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_LABORATORY_RESULTS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_MEDICATIONS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PERSONAL_DETAILS;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PRACTITIONER_DETAILS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PREGNANCY;
-import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PROBLEMS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_PROCEDURES;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_SOCIAL_HISTORY;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VACCINES;
+import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VISITS;
 import static android.health.connect.HealthPermissions.READ_MEDICAL_DATA_VITAL_SIGNS;
 import static android.health.connect.HealthPermissions.WRITE_MEDICAL_DATA;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
 import static android.permission.PermissionManager.PERMISSION_GRANTED;
 import static android.permission.PermissionManager.PERMISSION_HARD_DENIED;
 
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -52,6 +56,7 @@
 
 import java.util.Set;
 
+@EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
 public class MedicalDataPermissionEnforcerTest {
     @Mock private PermissionManager mPermissionManager;
 
@@ -71,7 +76,6 @@
 
     /** enforceWriteMedicalDataPermission */
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testEnforceWriteMedicalDataPermission_permissionGranted_doesNotThrow() {
         when(mPermissionManager.checkPermissionForDataDelivery(
                         WRITE_MEDICAL_DATA, mAttributionSource, null))
@@ -81,7 +85,6 @@
     }
 
     @Test(expected = SecurityException.class)
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testEnforceWriteMedicalDataPermission_permissionDenied_throwsException() {
         when(mPermissionManager.checkPermissionForDataDelivery(
                         WRITE_MEDICAL_DATA, mAttributionSource, null))
@@ -92,24 +95,22 @@
 
     /** enforceMedicalReadAccessAndGetEnforceSelfRead */
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testEnforceMedicalReadAccessAndGetEnforceSelfRead_permissionGranted_returnsFalse() {
         when(mPermissionManager.checkPermissionForDataDelivery(
-                        READ_MEDICAL_DATA_IMMUNIZATION, mAttributionSource, null))
+                        READ_MEDICAL_DATA_VACCINES, mAttributionSource, null))
                 .thenReturn(PERMISSION_GRANTED);
 
         boolean selfRead =
                 mMedicalDataPermissionEnforcer.enforceMedicalReadAccessAndGetEnforceSelfRead(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION, mAttributionSource);
+                        MEDICAL_RESOURCE_TYPE_VACCINES, mAttributionSource);
 
         assertThat(selfRead).isFalse();
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testEnforceMedicalReadAccessAndGetEnforceSelfRead_onlyWriteGranted_returnsTrue() {
         when(mPermissionManager.checkPermissionForDataDelivery(
-                        READ_MEDICAL_DATA_IMMUNIZATION, mAttributionSource, null))
+                        READ_MEDICAL_DATA_VACCINES, mAttributionSource, null))
                 .thenReturn(PERMISSION_HARD_DENIED);
         when(mPermissionManager.checkPermissionForDataDelivery(
                         WRITE_MEDICAL_DATA, mAttributionSource, null))
@@ -117,14 +118,13 @@
 
         boolean selfRead =
                 mMedicalDataPermissionEnforcer.enforceMedicalReadAccessAndGetEnforceSelfRead(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION, mAttributionSource);
+                        MEDICAL_RESOURCE_TYPE_VACCINES, mAttributionSource);
 
         assertThat(selfRead).isTrue();
     }
 
     /** getGrantedMedicalPermissions */
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetGrantedMedicalPermissions_allPermissionsGranted_returnsAllPermissions() {
         when(mPermissionManager.checkPermissionForPreflight(anyString(), eq(mAttributionSource)))
                 .thenReturn(PERMISSION_GRANTED);
@@ -135,37 +135,38 @@
 
         assertThat(permissions)
                 .containsExactly(
-                        READ_MEDICAL_DATA_ALLERGY_INTOLERANCE,
-                        READ_MEDICAL_DATA_IMMUNIZATION,
+                        READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES,
                         READ_MEDICAL_DATA_LABORATORY_RESULTS,
                         READ_MEDICAL_DATA_MEDICATIONS,
+                        READ_MEDICAL_DATA_PERSONAL_DETAILS,
+                        READ_MEDICAL_DATA_PRACTITIONER_DETAILS,
                         READ_MEDICAL_DATA_PREGNANCY,
-                        READ_MEDICAL_DATA_PROBLEMS,
+                        READ_MEDICAL_DATA_CONDITIONS,
                         READ_MEDICAL_DATA_PROCEDURES,
                         READ_MEDICAL_DATA_SOCIAL_HISTORY,
+                        READ_MEDICAL_DATA_VACCINES,
+                        READ_MEDICAL_DATA_VISITS,
                         READ_MEDICAL_DATA_VITAL_SIGNS,
                         WRITE_MEDICAL_DATA);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetGrantedMedicalPermissions_onePermissionGranted_returnsOnePermission() {
         // For all other permissions, deny.
         when(mPermissionManager.checkPermissionForPreflight(anyString(), eq(mAttributionSource)))
                 .thenReturn(PERMISSION_HARD_DENIED);
         when(mPermissionManager.checkPermissionForPreflight(
-                        eq(READ_MEDICAL_DATA_IMMUNIZATION), eq(mAttributionSource)))
+                        eq(READ_MEDICAL_DATA_VACCINES), eq(mAttributionSource)))
                 .thenReturn(PERMISSION_GRANTED);
 
         Set<String> permissions =
                 mMedicalDataPermissionEnforcer.getGrantedMedicalPermissionsForPreflight(
                         mAttributionSource);
 
-        assertThat(permissions).containsExactly(READ_MEDICAL_DATA_IMMUNIZATION);
+        assertThat(permissions).containsExactly(READ_MEDICAL_DATA_VACCINES);
     }
 
     @Test
-    @EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
     public void testGetGrantedMedicalPermissions_permissionDenied_returnsEmpty() {
         when(mPermissionManager.checkPermissionForPreflight(
                         anyString(), any(AttributionSource.class)))
diff --git a/tests/unittests/src/com/android/server/healthconnect/permission/PermissionPackageChangesOrchestratorTest.java b/tests/unittests/src/com/android/server/healthconnect/permission/PermissionPackageChangesOrchestratorTest.java
index a04cdde..c0f8cd4 100644
--- a/tests/unittests/src/com/android/server/healthconnect/permission/PermissionPackageChangesOrchestratorTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/permission/PermissionPackageChangesOrchestratorTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.never;
@@ -31,11 +33,15 @@
 import android.net.Uri;
 import android.os.Process;
 import android.os.UserHandle;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.compatibility.common.util.FeatureUtil;
+import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 
@@ -50,10 +56,12 @@
     private static final UserHandle CURRENT_USER = Process.myUserHandle();
 
     @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Rule
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(TransactionManager.class)
-                    .mockStatic(HealthConnectDeviceConfigManager.class)
                     .mockStatic(HealthDataCategoryPriorityHelper.class)
                     .setStrictness(Strictness.LENIENT)
                     .build();
@@ -65,17 +73,12 @@
     @Mock private HealthConnectPermissionHelper mHelper;
     @Mock private HealthPermissionIntentAppsTracker mTracker;
     @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
-    @Mock private TransactionManager mTransactionManager;
-    @Mock private HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
     @Mock private UserHandle mUserHandle;
 
     @Mock private HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
 
     @Before
     public void setUp() throws PackageManager.NameNotFoundException {
-        when(TransactionManager.getInitialisedInstance()).thenReturn(mTransactionManager);
-        when(HealthConnectDeviceConfigManager.getInitialisedInstance())
-                .thenReturn(mHealthConnectDeviceConfigManager);
         mContext = ApplicationProvider.getApplicationContext();
         mCurrentUid = mContext.getPackageManager().getPackageUid(SELF_PACKAGE_NAME, 0);
         mOrchestrator =
@@ -85,14 +88,12 @@
                         mHelper,
                         mUserHandle,
                         mHealthDataCategoryPriorityHelper);
-        setIntentWasRemoved(/* isIntentRemoved= */ false);
+        setIntentIsPresent(/* isIntentPresent= */ true);
     }
 
     @Test
     public void testPackageAdded_callsTrackerToUpdateState_noGrantTimeOrPermsCalls() {
         mOrchestrator.onReceive(mContext, buildPackageIntent(Intent.ACTION_PACKAGE_ADDED));
-        verify(mTracker)
-                .updateStateAndGetIfIntentWasRemoved(eq(SELF_PACKAGE_NAME), eq(CURRENT_USER));
         verify(mHelper, never())
                 .revokeAllHealthPermissions(eq(SELF_PACKAGE_NAME), anyString(), eq(CURRENT_USER));
         verify(mFirstGrantTimeManager, never())
@@ -100,16 +101,25 @@
     }
 
     @Test
-    public void testPackageChanged_intentWasRemoved_revokesPerms() {
-        setIntentWasRemoved(/* isIntentRemoved= */ true);
+    public void testPackageChanged_intentWasRemoved_nonWear_revokesPerms() {
+        assumeFalse(FeatureUtil.isWatch());
+        setIntentIsPresent(/* isIntentPresent= */ false);
         mOrchestrator.onReceive(mContext, buildPackageIntent(Intent.ACTION_PACKAGE_CHANGED));
-        verify(mTracker)
-                .updateStateAndGetIfIntentWasRemoved(eq(SELF_PACKAGE_NAME), eq(CURRENT_USER));
         verify(mHelper)
                 .revokeAllHealthPermissions(eq(SELF_PACKAGE_NAME), anyString(), eq(CURRENT_USER));
     }
 
     @Test
+    @RequiresFlagsEnabled({Flags.FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED})
+    public void testPackageChanged_intentWasRemoved_wear_doesNotRevokePerms() {
+        assumeTrue(FeatureUtil.isWatch());
+        setIntentIsPresent(/* isIntentPresent= */ false);
+        mOrchestrator.onReceive(mContext, buildPackageIntent(Intent.ACTION_PACKAGE_CHANGED));
+        verify(mHelper, never())
+                .revokeAllHealthPermissions(eq(SELF_PACKAGE_NAME), anyString(), eq(CURRENT_USER));
+    }
+
+    @Test
     public void testPackageRemoved_resetsGrantTime() {
         mOrchestrator.onReceive(
                 mContext,
@@ -120,14 +130,12 @@
 
     @Test
     public void testPackageRemoved_removesFromPriorityList_whenNewAggregationOff() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
         mOrchestrator.onReceive(
                 mContext,
                 buildPackageIntent(Intent.ACTION_PACKAGE_REMOVED, /* isReplaced= */ false));
         assertThat(
-                        mHealthDataCategoryPriorityHelper.getPriorityOrder(
-                                HealthDataCategory.SLEEP, mContext))
+                        mHealthDataCategoryPriorityHelper.syncAndGetPriorityOrder(
+                                HealthDataCategory.SLEEP))
                 .isEmpty();
     }
 
@@ -143,8 +151,9 @@
     }
 
     @Test
-    public void testPackageReplaced_intentNotSupported_revokesPerms() {
-        setIntentWasRemoved(/* isIntentRemoved= */ true);
+    public void testPackageReplaced_intentNotSupported_nonWear_revokesPerms() {
+        assumeFalse(FeatureUtil.isWatch());
+        setIntentIsPresent(/* isIntentPresent= */ false);
         mOrchestrator.onReceive(
                 mContext,
                 buildPackageIntent(Intent.ACTION_PACKAGE_REMOVED, /* isReplaced= */ true));
@@ -152,6 +161,18 @@
                 .revokeAllHealthPermissions(eq(SELF_PACKAGE_NAME), anyString(), eq(CURRENT_USER));
     }
 
+    @Test
+    @RequiresFlagsEnabled({Flags.FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED})
+    public void testPackageReplaced_intentNotSupported_wear_doesNotRevokePerms() {
+        assumeTrue(FeatureUtil.isWatch());
+        setIntentIsPresent(/* isIntentPresent= */ false);
+        mOrchestrator.onReceive(
+                mContext,
+                buildPackageIntent(Intent.ACTION_PACKAGE_REMOVED, /* isReplaced= */ true));
+        verify(mHelper, never())
+                .revokeAllHealthPermissions(eq(SELF_PACKAGE_NAME), anyString(), eq(CURRENT_USER));
+    }
+
     private Intent buildPackageIntent(String action) {
         return buildPackageIntent(action, /* isReplaced= */ false);
     }
@@ -164,8 +185,10 @@
                 .putExtra(Intent.EXTRA_UID, mCurrentUid);
     }
 
-    private void setIntentWasRemoved(boolean isIntentRemoved) {
+    private void setIntentIsPresent(boolean isIntentPresent) {
+        when(mTracker.updateAndGetSupportsPackageUsageIntent(SELF_PACKAGE_NAME, CURRENT_USER))
+                .thenReturn(isIntentPresent);
         when(mTracker.updateStateAndGetIfIntentWasRemoved(SELF_PACKAGE_NAME, CURRENT_USER))
-                .thenReturn(isIntentRemoved);
+                .thenReturn(!isIntentPresent);
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/phr/PhrPageTokenWrapperTest.java b/tests/unittests/src/com/android/server/healthconnect/phr/PhrPageTokenWrapperTest.java
index 8aa082f..74397f7 100644
--- a/tests/unittests/src/com/android/server/healthconnect/phr/PhrPageTokenWrapperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/phr/PhrPageTokenWrapperTest.java
@@ -17,9 +17,9 @@
 package com.android.server.healthconnect.phr;
 
 import static android.health.connect.Constants.DEFAULT_LONG;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -46,7 +46,7 @@
     @Test
     public void phrPageTokenWrapper_createUsingInitialRequest_success() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .build();
@@ -60,7 +60,7 @@
     @Test
     public void phrPageTokenWrapper_encodeAndDecodeWithoutDataSources_success() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         PhrPageTokenWrapper expected =
                 PhrPageTokenWrapper.from(request.toParcel()).cloneWithNewLastRowId(LAST_ROW_ID);
@@ -74,7 +74,7 @@
     @Test
     public void phrPageTokenWrapper_encodeAndDecodeWithAllFilters_success() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DATA_SOURCE_ID)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .build();
@@ -88,9 +88,19 @@
     }
 
     @Test
+    public void phrPageTokenWrapper_encodeAndDecodeWithoutFilters_success() {
+        PhrPageTokenWrapper expected = PhrPageTokenWrapper.from(LAST_ROW_ID);
+
+        String pageToken = expected.encode();
+        PhrPageTokenWrapper result = PhrPageTokenWrapper.from(pageToken);
+
+        assertThat(result).isEqualTo(expected);
+    }
+
+    @Test
     public void phrPageTokenWrapper_encodeWithNegativeLastRowId_throws() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         assertThrows(
                 IllegalStateException.class,
@@ -162,20 +172,23 @@
     }
 
     @Test
-    public void phrPageTokenWrapper_pageTokenNull_throws() {
+    public void phrPageTokenWrapper_pageTokenNull_returnsEmptyPageToken() {
         String pageTokenNull = null;
-        assertThrows(IllegalArgumentException.class, () -> PhrPageTokenWrapper.from(pageTokenNull));
+
+        assertThat(PhrPageTokenWrapper.fromPageTokenAllowingNull(pageTokenNull))
+                .isEqualTo(PhrPageTokenWrapper.EMPTY_PAGE_TOKEN);
     }
 
     @Test
-    public void phrPageTokenWrapper_pageTokenEmpty_throws() {
-        assertThrows(IllegalArgumentException.class, () -> PhrPageTokenWrapper.from(""));
+    public void phrPageTokenWrapper_pageTokenEmpty_returnsEmptyPageToken() {
+        assertThat(PhrPageTokenWrapper.fromPageTokenAllowingNull(""))
+                .isEqualTo(PhrPageTokenWrapper.EMPTY_PAGE_TOKEN);
     }
 
     @Test
     public void phrPageTokenWrapper_fromInvalidRowId_throws() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         assertThrows(
                 IllegalStateException.class,
diff --git a/tests/unittests/src/com/android/server/healthconnect/phr/ReadMedicalResourcesInternalResponseTest.java b/tests/unittests/src/com/android/server/healthconnect/phr/ReadMedicalResourcesInternalResponseTest.java
index c85dafe..fc58cab 100644
--- a/tests/unittests/src/com/android/server/healthconnect/phr/ReadMedicalResourcesInternalResponseTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/phr/ReadMedicalResourcesInternalResponseTest.java
@@ -16,7 +16,7 @@
 
 package com.android.server.healthconnect.phr;
 
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResource;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -34,10 +34,11 @@
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
 
         ReadMedicalResourcesInternalResponse response =
-                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken);
+                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken, 1);
 
         assertThat(response.getMedicalResources()).isEqualTo(medicalResources);
         assertThat(response.getPageToken()).isEqualTo(pageToken);
+        assertThat(response.getRemainingCount()).isEqualTo(1);
     }
 
     @Test
@@ -45,10 +46,11 @@
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
 
         ReadMedicalResourcesInternalResponse response =
-                new ReadMedicalResourcesInternalResponse(medicalResources, null);
+                new ReadMedicalResourcesInternalResponse(medicalResources, null, 0);
 
         assertThat(response.getMedicalResources()).isEqualTo(medicalResources);
         assertThat(response.getPageToken()).isEqualTo(null);
+        assertThat(response.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
@@ -57,7 +59,7 @@
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
 
         ReadMedicalResourcesInternalResponse response =
-                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken);
+                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken, 1);
 
         assertThat(response.equals(response)).isTrue();
     }
@@ -69,9 +71,9 @@
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
 
         ReadMedicalResourcesInternalResponse response1 =
-                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken1);
+                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken1, 2);
         ReadMedicalResourcesInternalResponse response2 =
-                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken2);
+                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken2, 2);
 
         assertThat(response1.equals(response2)).isFalse();
     }
@@ -84,97 +86,66 @@
         List<MedicalResource> medicalResources2 = List.of();
 
         ReadMedicalResourcesInternalResponse response1 =
-                new ReadMedicalResourcesInternalResponse(medicalResources1, pageToken);
+                new ReadMedicalResourcesInternalResponse(medicalResources1, pageToken, 2);
         ReadMedicalResourcesInternalResponse response2 =
-                new ReadMedicalResourcesInternalResponse(medicalResources2, pageToken);
+                new ReadMedicalResourcesInternalResponse(medicalResources2, pageToken, 2);
 
         assertThat(response1.equals(response2)).isFalse();
     }
 
     @Test
-    public void testReadMedicalResourcesInternalResponse_equals_bothFieldsDifferent_success() {
+    public void testReadMedicalResourcesInternalResponse_equals_differentTotalSize() {
+        String pageToken = "aw==";
+        List<MedicalResource> medicalResources = List.of(getMedicalResource());
+
+        ReadMedicalResourcesInternalResponse response1 =
+                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken, 2);
+        ReadMedicalResourcesInternalResponse response2 =
+                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken, 3);
+
+        assertThat(response1.equals(response2)).isFalse();
+    }
+
+    @Test
+    public void testReadMedicalResourcesInternalResponse_equals_twoFieldsDifferent_success() {
         String pageToken1 = "aw==";
         String pageToken2 = "ba==";
         List<MedicalResource> medicalResources1 = List.of(getMedicalResource());
         List<MedicalResource> medicalResources2 = List.of();
 
         ReadMedicalResourcesInternalResponse response1 =
-                new ReadMedicalResourcesInternalResponse(medicalResources1, pageToken1);
+                new ReadMedicalResourcesInternalResponse(medicalResources1, pageToken1, 10);
         ReadMedicalResourcesInternalResponse response2 =
-                new ReadMedicalResourcesInternalResponse(medicalResources2, pageToken2);
+                new ReadMedicalResourcesInternalResponse(medicalResources2, pageToken2, 10);
 
         assertThat(response1.equals(response2)).isFalse();
     }
 
     @Test
-    public void testReadMedicalResourcesInternalResponse_equals_bothFieldsTheSame_success() {
+    public void testReadMedicalResourcesInternalResponse_equals_allFieldsTheSame_success() {
         String pageToken1 = "aw==";
         String pageToken2 = "aw==";
         List<MedicalResource> medicalResources1 = List.of(getMedicalResource());
         List<MedicalResource> medicalResources2 = List.of(getMedicalResource());
 
         ReadMedicalResourcesInternalResponse response1 =
-                new ReadMedicalResourcesInternalResponse(medicalResources1, pageToken1);
+                new ReadMedicalResourcesInternalResponse(medicalResources1, pageToken1, 10);
         ReadMedicalResourcesInternalResponse response2 =
-                new ReadMedicalResourcesInternalResponse(medicalResources2, pageToken2);
+                new ReadMedicalResourcesInternalResponse(medicalResources2, pageToken2, 10);
 
         assertThat(response1.equals(response2)).isTrue();
     }
 
     @Test
-    public void testReadMedicalResourcesInternalResponse_hashCode_bothFieldsTheSame_success() {
+    public void testReadMedicalResourcesInternalResponse_hashCode_allFieldsTheSame_success() {
         String pageToken = "aw==";
         List<MedicalResource> medicalResources = List.of(getMedicalResource());
-
+        int totalSize = 10;
         ReadMedicalResourcesInternalResponse response1 =
-                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken);
+                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken, totalSize);
         ReadMedicalResourcesInternalResponse response2 =
-                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken);
+                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken, totalSize);
 
         assertThat(response1.hashCode()).isEqualTo(response2.hashCode());
     }
-
-    @Test
-    public void testReadMedicalResourcesInternalResponse_hashCode_differentPageToken_success() {
-        String pageToken1 = "aw==";
-        String pageToken2 = "ab==";
-        List<MedicalResource> medicalResources = List.of(getMedicalResource());
-
-        ReadMedicalResourcesInternalResponse response1 =
-                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken1);
-        ReadMedicalResourcesInternalResponse response2 =
-                new ReadMedicalResourcesInternalResponse(medicalResources, pageToken2);
-
-        assertThat(response1.hashCode()).isNotEqualTo(response2.hashCode());
-    }
-
-    @Test
-    public void
-            testReadMedicalResourcesInternalResponse_hashCode_differentMedicalResources_success() {
-        String pageToken = "aw==";
-        List<MedicalResource> medicalResources1 = List.of(getMedicalResource());
-        List<MedicalResource> medicalResources2 = List.of();
-
-        ReadMedicalResourcesInternalResponse response1 =
-                new ReadMedicalResourcesInternalResponse(medicalResources1, pageToken);
-        ReadMedicalResourcesInternalResponse response2 =
-                new ReadMedicalResourcesInternalResponse(medicalResources2, pageToken);
-
-        assertThat(response1.hashCode()).isNotEqualTo(response2.hashCode());
-    }
-
-    @Test
-    public void testReadMedicalResourcesInternalResponse_hashCode_bothFieldsDifferent_success() {
-        String pageToken1 = "aw==";
-        String pageToken2 = "ab==";
-        List<MedicalResource> medicalResources1 = List.of(getMedicalResource());
-        List<MedicalResource> medicalResources2 = List.of();
-
-        ReadMedicalResourcesInternalResponse response1 =
-                new ReadMedicalResourcesInternalResponse(medicalResources1, pageToken1);
-        ReadMedicalResourcesInternalResponse response2 =
-                new ReadMedicalResourcesInternalResponse(medicalResources2, pageToken2);
-
-        assertThat(response1.hashCode()).isNotEqualTo(response2.hashCode());
-    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirPrimitiveTypeValidatorTest.java b/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirPrimitiveTypeValidatorTest.java
new file mode 100644
index 0000000..1645f87
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirPrimitiveTypeValidatorTest.java
@@ -0,0 +1,866 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.healthconnect.phr.validations;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION;
+import static com.android.server.healthconnect.phr.validations.FhirPrimitiveTypeValidator.validate;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_BOOLEAN;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_CANONICAL;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_CODE;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_COMPLEX;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_DATE;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_DATE_TIME;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_INSTANT;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_INTEGER;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_STRING;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_SYSTEM_STRING;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_TIME;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.healthconnect.cts.phr.utils.ImmunizationBuilder;
+import android.healthconnect.cts.phr.utils.ObservationBuilder;
+import android.healthconnect.cts.phr.utils.PractitionerBuilder;
+import android.healthconnect.cts.phr.utils.ProcedureBuilder;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class FhirPrimitiveTypeValidatorTest {
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    private static final String BOOLEAN_TYPE_EXCEPTION_MESSAGE =
+            "Invalid resource structure. Found non boolean object in field: ";
+    private static final String INTEGER_TYPE_EXCEPTION_MESSAGE =
+            "Invalid resource structure. Found non integer object in field: ";
+    private static final String STRING_TYPE_EXCEPTION_MESSAGE =
+            "Invalid resource structure. Found non string object in field: ";
+
+    @DisableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_primitiveValidationFlagDisabled_throws() {
+        assertThrows(
+                UnsupportedOperationException.class,
+                () -> validate(new Object(), "field", R4_FHIR_TYPE_BOOLEAN));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_notPrimitive_complexType_throws() {
+        assertThrows(
+                IllegalStateException.class, () -> validate(null, "field", R4_FHIR_TYPE_COMPLEX));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_objectIsNull_throws() {
+        assertThrows(
+                IllegalStateException.class, () -> validate(null, "field", R4_FHIR_TYPE_BOOLEAN));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4BooleanValid_true_succeeds() throws JSONException {
+        String booleanFieldName = "primarySource";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(booleanFieldName, true).toJson());
+
+        validate(jsonObject.get(booleanFieldName), booleanFieldName, R4_FHIR_TYPE_BOOLEAN);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4BooleanValid_false_succeeds() throws JSONException {
+        String booleanFieldName = "primarySource";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(booleanFieldName, false).toJson());
+
+        validate(jsonObject.get(booleanFieldName), booleanFieldName, R4_FHIR_TYPE_BOOLEAN);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4BooleanInvalid_asString_throws() throws JSONException {
+        String booleanFieldName = "primarySource";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(booleanFieldName, "true").toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(booleanFieldName),
+                                        booleanFieldName,
+                                        R4_FHIR_TYPE_BOOLEAN));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(BOOLEAN_TYPE_EXCEPTION_MESSAGE + booleanFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4BooleanInvalid_objectIsJsonNull_throws() throws JSONException {
+        String booleanFieldName = "primarySource";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(booleanFieldName, JSONObject.NULL).toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(booleanFieldName),
+                                        booleanFieldName,
+                                        R4_FHIR_TYPE_BOOLEAN));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(BOOLEAN_TYPE_EXCEPTION_MESSAGE + booleanFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CanonicalValid_succeeds() throws JSONException {
+        String canonicalFieldName = "instantiatesCanonical";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ProcedureBuilder()
+                                .set(canonicalFieldName, "PlanDefinition/KDN5")
+                                .toJson());
+
+        validate(jsonObject.get(canonicalFieldName), canonicalFieldName, R4_FHIR_TYPE_CANONICAL);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CanonicalInvalid_containWhiteSpace_throws() throws JSONException {
+        String canonicalFieldName = "instantiatesCanonical";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ProcedureBuilder()
+                                .set(canonicalFieldName, "PlanDefinition KDN5")
+                                .toJson());
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(canonicalFieldName),
+                                canonicalFieldName,
+                                R4_FHIR_TYPE_CANONICAL));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CanonicalInvalid_objectIsJsonNull_throws() throws JSONException {
+        String canonicalFieldName = "instantiatesCanonical";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ProcedureBuilder().set(canonicalFieldName, JSONObject.NULL).toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(canonicalFieldName),
+                                        canonicalFieldName,
+                                        R4_FHIR_TYPE_STRING));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(STRING_TYPE_EXCEPTION_MESSAGE + canonicalFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CodeValid_singleWord_succeeds() throws JSONException {
+        String codeFieldName = "status";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(codeFieldName, "completed").toJson());
+
+        validate(jsonObject.get(codeFieldName), codeFieldName, R4_FHIR_TYPE_CODE);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CodeValid_multiWords_succeeds() throws JSONException {
+        String codeFieldName = "status";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(codeFieldName, "all done").toJson());
+
+        validate(jsonObject.get(codeFieldName), codeFieldName, R4_FHIR_TYPE_CODE);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CodeInvalid_emptyString_throws() throws JSONException {
+        String codeFieldName = "status";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(codeFieldName, "").toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> validate(jsonObject.get(codeFieldName), codeFieldName, R4_FHIR_TYPE_CODE));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CodeInvalid_leadingWhiteSpaces_throws() throws JSONException {
+        String codeFieldName = "status";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(codeFieldName, " completed").toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> validate(jsonObject.get(codeFieldName), codeFieldName, R4_FHIR_TYPE_CODE));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CodeInvalid_trailingWhiteSpaces_throws() throws JSONException {
+        String codeFieldName = "status";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(codeFieldName, "completed ").toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> validate(jsonObject.get(codeFieldName), codeFieldName, R4_FHIR_TYPE_CODE));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CodeInvalid_moreThanSingleWhiteSpaces_throws() throws JSONException {
+        String codeFieldName = "status";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(codeFieldName, "all  done").toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> validate(jsonObject.get(codeFieldName), codeFieldName, R4_FHIR_TYPE_CODE));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4CodeInvalid_objectIsJsonNull_throws() throws JSONException {
+        String codeFieldName = "status";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(codeFieldName, JSONObject.NULL).toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(codeFieldName),
+                                        codeFieldName,
+                                        R4_FHIR_TYPE_STRING));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(STRING_TYPE_EXCEPTION_MESSAGE + codeFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateValid_year_succeeds() throws JSONException {
+        String dateFieldName = "birthDate";
+        JSONObject jsonObject =
+                new JSONObject(new PractitionerBuilder().set(dateFieldName, "2018").toJson());
+
+        validate(jsonObject.get(dateFieldName), dateFieldName, R4_FHIR_TYPE_DATE);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateValid_yearMonth_succeeds() throws JSONException {
+        String dateFieldName = "birthDate";
+        JSONObject jsonObject =
+                new JSONObject(new PractitionerBuilder().set(dateFieldName, "1973-06").toJson());
+
+        validate(jsonObject.get(dateFieldName), dateFieldName, R4_FHIR_TYPE_DATE);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateValid_yearMonthDay_succeeds() throws JSONException {
+        String dateFieldName = "birthDate";
+        JSONObject jsonObject =
+                new JSONObject(new PractitionerBuilder().set(dateFieldName, "1905-08-23").toJson());
+
+        validate(jsonObject.get(dateFieldName), dateFieldName, R4_FHIR_TYPE_DATE);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateInvalid_month20_throws() throws JSONException {
+        String dateFieldName = "birthDate";
+        JSONObject jsonObject =
+                new JSONObject(new PractitionerBuilder().set(dateFieldName, "2018-20-01").toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> validate(jsonObject.get(dateFieldName), dateFieldName, R4_FHIR_TYPE_DATE));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateInvalid_objectIsJsonNull_throws() throws JSONException {
+        String dateFieldName = "birthDate";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new PractitionerBuilder().set(dateFieldName, JSONObject.NULL).toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(dateFieldName),
+                                        dateFieldName,
+                                        R4_FHIR_TYPE_STRING));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(STRING_TYPE_EXCEPTION_MESSAGE + dateFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeValid_year_succeeds() throws JSONException {
+        String dateFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(dateFieldName, "2018").toJson());
+
+        validate(jsonObject.get(dateFieldName), dateFieldName, R4_FHIR_TYPE_DATE_TIME);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeValid_yearMonth_succeeds() throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(dateTimeFieldName, "1973-06").toJson());
+
+        validate(jsonObject.get(dateTimeFieldName), dateTimeFieldName, R4_FHIR_TYPE_DATE_TIME);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeValid_yearMonthDay_succeeds() throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(dateTimeFieldName, "1905-08-23").toJson());
+
+        validate(jsonObject.get(dateTimeFieldName), dateTimeFieldName, R4_FHIR_TYPE_DATE_TIME);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeValid_yearMonthDayTime_withUtcTimezone_succeeds()
+            throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(dateTimeFieldName, "2015-02-07T13:28:17Z")
+                                .toJson());
+
+        validate(jsonObject.get(dateTimeFieldName), dateTimeFieldName, R4_FHIR_TYPE_DATE_TIME);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeValid_yearMonthDayTime_withNonUtcTimezone_succeeds()
+            throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(dateTimeFieldName, "2015-02-07T13:28:17-05:00")
+                                .toJson());
+
+        validate(jsonObject.get(dateTimeFieldName), dateTimeFieldName, R4_FHIR_TYPE_DATE_TIME);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeValid_yearMonthDayTime_withMilliSeconds_succeeds()
+            throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(dateTimeFieldName, "2015-02-07T13:28:17.000Z")
+                                .toJson());
+
+        validate(jsonObject.get(dateTimeFieldName), dateTimeFieldName, R4_FHIR_TYPE_DATE_TIME);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeValid_yearMonthDayTime_withoutTimezone_throws()
+            throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(dateTimeFieldName, "2015-02-07T13:28:17")
+                                .toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(dateTimeFieldName),
+                                dateTimeFieldName,
+                                R4_FHIR_TYPE_DATE_TIME));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeInvalid_noSeconds_throws() throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(dateTimeFieldName, "2015-02-07T13:28")
+                                .toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(dateTimeFieldName),
+                                dateTimeFieldName,
+                                R4_FHIR_TYPE_DATE_TIME));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeInvalid_time24_throws() throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(dateTimeFieldName, "2015-02-07T24:00:00")
+                                .toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(dateTimeFieldName),
+                                dateTimeFieldName,
+                                R4_FHIR_TYPE_DATE_TIME));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4DateTimeInvalid_objectIsJsonNull_throws() throws JSONException {
+        String dateTimeFieldName = "occurrenceDateTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(dateTimeFieldName, JSONObject.NULL).toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(dateTimeFieldName),
+                                        dateTimeFieldName,
+                                        R4_FHIR_TYPE_STRING));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(STRING_TYPE_EXCEPTION_MESSAGE + dateTimeFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IdValid_succeeds() throws JSONException {
+        String idFieldName = "id";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(idFieldName, "immunization-1").toJson());
+
+        validate(jsonObject.get(idFieldName), idFieldName, R4_FHIR_TYPE_SYSTEM_STRING);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IdInvalid_emptyString_throws() throws JSONException {
+        String idFieldName = "id";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(idFieldName, "").toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(idFieldName),
+                                idFieldName,
+                                R4_FHIR_TYPE_SYSTEM_STRING));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IdInvalid_specialCharacter_throws() throws JSONException {
+        String idFieldName = "id";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(idFieldName, "immunization/1").toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(idFieldName),
+                                idFieldName,
+                                R4_FHIR_TYPE_SYSTEM_STRING));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IdInvalid_objectIsJsonNull_throws() throws JSONException {
+        String idFieldName = "id";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(idFieldName, JSONObject.NULL).toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(idFieldName),
+                                        idFieldName,
+                                        R4_FHIR_TYPE_STRING));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(STRING_TYPE_EXCEPTION_MESSAGE + idFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4InstantValid_withUtcTimezone_succeeds() throws JSONException {
+        String instantFieldName = "effectiveInstant";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllEffectiveMultiTypeFields()
+                                .set(instantFieldName, "2015-02-07T13:28:17.239Z")
+                                .toJson());
+
+        validate(jsonObject.get(instantFieldName), instantFieldName, R4_FHIR_TYPE_INSTANT);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4InstantValid_withNonUtcTimezone_succeeds() throws JSONException {
+        String instantFieldName = "effectiveInstant";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllEffectiveMultiTypeFields()
+                                .set(instantFieldName, "2015-02-07T13:28:17.239+02:00")
+                                .toJson());
+
+        validate(jsonObject.get(instantFieldName), instantFieldName, R4_FHIR_TYPE_INSTANT);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4InstantInvalid_dateOnly_succeeds() throws JSONException {
+        String instantFieldName = "effectiveInstant";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllEffectiveMultiTypeFields()
+                                .set(instantFieldName, "2015-02-07")
+                                .toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(instantFieldName),
+                                instantFieldName,
+                                R4_FHIR_TYPE_INSTANT));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4InstantInvalid_objectIsJsonNull_throws() throws JSONException {
+        String instantFieldName = "effectiveInstant";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllEffectiveMultiTypeFields()
+                                .set(instantFieldName, JSONObject.NULL)
+                                .toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(instantFieldName),
+                                        instantFieldName,
+                                        R4_FHIR_TYPE_STRING));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(STRING_TYPE_EXCEPTION_MESSAGE + instantFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IntegerValid_succeeds() throws JSONException {
+        String integerFieldName = "valueInteger";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(integerFieldName, 0)
+                                .toJson());
+
+        validate(jsonObject.get(integerFieldName), integerFieldName, R4_FHIR_TYPE_INTEGER);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IntegerInvalid_greaterThanMax_throws() throws JSONException {
+        String integerFieldName = "valueInteger";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(integerFieldName, 2147483648L)
+                                .toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(integerFieldName),
+                                integerFieldName,
+                                R4_FHIR_TYPE_INTEGER));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IntegerInvalid_lessThanMin_throws() throws JSONException {
+        String integerFieldName = "valueInteger";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(integerFieldName, -2147483649L)
+                                .toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(integerFieldName),
+                                integerFieldName,
+                                R4_FHIR_TYPE_INTEGER));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IntegerInvalid_asString_throws() throws JSONException {
+        String integerFieldName = "valueInteger";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(integerFieldName, "0")
+                                .toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(integerFieldName),
+                                        integerFieldName,
+                                        R4_FHIR_TYPE_INTEGER));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(INTEGER_TYPE_EXCEPTION_MESSAGE + integerFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4IntegerInvalid_objectIsJsonNull_throws() throws JSONException {
+        String integerFieldName = "valueInteger";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(integerFieldName, JSONObject.NULL)
+                                .toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(integerFieldName),
+                                        integerFieldName,
+                                        R4_FHIR_TYPE_INTEGER));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(INTEGER_TYPE_EXCEPTION_MESSAGE + integerFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4StringValid_succeeds() throws JSONException {
+        String stringFieldName = "lotNumber";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(stringFieldName, "1").toJson());
+
+        validate(jsonObject.get(stringFieldName), stringFieldName, R4_FHIR_TYPE_STRING);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4StringInvalid_emptyString_throws() throws JSONException {
+        String stringFieldName = "lotNumber";
+        JSONObject jsonObject =
+                new JSONObject(new ImmunizationBuilder().set(stringFieldName, "").toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        validate(
+                                jsonObject.get(stringFieldName),
+                                stringFieldName,
+                                R4_FHIR_TYPE_STRING));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4StringInvalid_objectIsJsonNull_throws() throws JSONException {
+        String stringFieldName = "lotNumber";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ImmunizationBuilder().set(stringFieldName, JSONObject.NULL).toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(stringFieldName),
+                                        stringFieldName,
+                                        R4_FHIR_TYPE_STRING));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(STRING_TYPE_EXCEPTION_MESSAGE + stringFieldName);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4TimeValid_succeeds() throws JSONException {
+        String timeFieldName = "valueTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(timeFieldName, "09:00:00")
+                                .toJson());
+
+        validate(jsonObject.get(timeFieldName), timeFieldName, R4_FHIR_TYPE_TIME);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4TimeInvalid_noSeconds_throws() throws JSONException {
+        String timeFieldName = "valueTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(timeFieldName, "09:00")
+                                .toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> validate(jsonObject.get(timeFieldName), timeFieldName, R4_FHIR_TYPE_TIME));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4TimeInvalid_time24_throws() throws JSONException {
+        String timeFieldName = "valueTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(timeFieldName, "24:00:00")
+                                .toJson());
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> validate(jsonObject.get(timeFieldName), timeFieldName, R4_FHIR_TYPE_TIME));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION})
+    @Test
+    public void testValidate_r4TimeInvalid_objectIsJsonNull_throws() throws JSONException {
+        String timeFieldName = "valueTime";
+        JSONObject jsonObject =
+                new JSONObject(
+                        new ObservationBuilder()
+                                .removeAllValueMultiTypeFields()
+                                .set(timeFieldName, JSONObject.NULL)
+                                .toJson());
+
+        IllegalArgumentException exception =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validate(
+                                        jsonObject.get(timeFieldName),
+                                        timeFieldName,
+                                        R4_FHIR_TYPE_STRING));
+
+        assertThat(exception)
+                .hasMessageThat()
+                .contains(STRING_TYPE_EXCEPTION_MESSAGE + timeFieldName);
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirResourceValidatorTest.java b/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirResourceValidatorTest.java
new file mode 100644
index 0000000..196b33e
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirResourceValidatorTest.java
@@ -0,0 +1,784 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.phr.validations;
+
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_FHIR_STRUCTURAL_VALIDATION;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.healthconnect.cts.phr.utils.AllergyBuilder;
+import android.healthconnect.cts.phr.utils.ImmunizationBuilder;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import com.google.testing.junit.testparameterinjector.TestParameterInjector;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(TestParameterInjector.class)
+public class FhirResourceValidatorTest {
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testConstructor_succeeds() {
+        new FhirResourceValidator();
+    }
+
+    @DisableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testConstructor_structuralValidationDisabled_throws() {
+        assertThrows(UnsupportedOperationException.class, () -> new FhirResourceValidator());
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_invalidTypeInt_throws() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        JSONObject immunizationJson = new JSONObject(FHIR_DATA_IMMUNIZATION);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> validator.validateFhirResource(immunizationJson, 100));
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_validResource_succeeds() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        JSONObject immunizationJson = new JSONObject(FHIR_DATA_IMMUNIZATION);
+
+        validator.validateFhirResource(immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeFieldValueAndExtension_succeeds()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is of type "code" which is a primitive type. Therefore the field
+        // itself and the extension field "_status" are allowed.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set("status", "completed")
+                                .set("_status", new JSONObject("{\"id\": \"1234\"}"))
+                                .toJson());
+
+        validator.validateFhirResource(immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_onlyRequiredPrimitiveTypeExtensionField_succeeds()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is a required field of type "code", which is a primitive type.
+        // Therefore the field itself and the extension field "_status" are allowed, and only one
+        // field is required to be present to fulfill the "required" check.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .removeField("status")
+                                .set("_status", new JSONObject("{\"id\": \"1234\"}"))
+                                .toJson());
+
+        validator.validateFhirResource(immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_onlyRequiredPrimitiveTypeValueField_succeeds()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is a required field of type "code" which is a primitive type.
+        // Therefore the field itself and the extension field "_status" are allowed, and only one
+        // field is required to be present to fulfill the "required" check.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set("status", "completed")
+                                .removeField("_status")
+                                .toJson());
+
+        validator.validateFhirResource(immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_missingRequiredPrimitiveTypeField_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is a required primitive type field, meaning either the field "status"
+        // or the primitive type extension "_status" needs to be present.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .removeField("status")
+                                .removeField("_status")
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Missing required field status");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_unknownField_throws() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        JSONObject immunizationJson =
+                new JSONObject(new ImmunizationBuilder().set("unknown_field", "test").toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Found unexpected field unknown_field");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_unknownFieldWithUnderscore_throws() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set("_unknown_field", new JSONObject("{\"id\": \"123\"}"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Found unexpected field _unknown_field");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_nonPrimitiveFieldWithUnderscore_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "identifier" field is of type "Identifier", which is a complex type and not a
+        // primitive type. Since only primitive types can have primitive type extensions (fields
+        // starting with "_") this is not a valid field.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set("_identifier", new JSONObject("{\"value\": \"test\"}"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Found unexpected field _identifier");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_missingRequiredField_throws() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        JSONObject immunizationJson =
+                new JSONObject(new ImmunizationBuilder().removeField("vaccineCode").toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Missing required field vaccineCode");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_requiredNonPrimitiveFieldWithUnderscore_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "vaccineCode" field is not a primitive type and therefore cannot have a primitive
+        // type extension (field starting with "_"), so this does not fulfill the required check.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .removeField("vaccineCode")
+                                .set("_vaccineCode", new JSONObject("{\"text\": \"test\"}"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Missing required field vaccineCode");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_missingRequiredMultiTypeField_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // Immunization has a required type choice field "occurrence[x]" which can be set to string
+        // or dateTime data type. Therefore if none of these fields are set we expected a validation
+        // error
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .removeField("occurrenceDateTime")
+                                .removeField("occurrenceString")
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Missing required field occurrence[x]");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_multipleTypesSetRequiredField_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // Immunization has a required type choice field "occurrence[x]" which can be set to string
+        // or dateTime date type. If more than one type field is set we expect a validation error.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set("occurrenceDateTime", "2023")
+                                .set("occurrenceString", "last year")
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Only one type should be set for field occurrence[x]");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION})
+    @Test
+    public void testValidateFhirResource_multipleTypesSetOptionalField_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // Allergy has an optional type choice field "onset[x]" which can be set to string
+        // or dateTime date type. If more than on type field is set we expect a validation error.
+        JSONObject allergyJson =
+                new JSONObject(
+                        new AllergyBuilder()
+                                .set("onsetDateTime", "2023")
+                                .set("onsetString", "last year")
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Only one type should be set for field onset[x]");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeFieldContainsNull_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is of primitive type "code"
+        JSONObject immunizationJson =
+                new JSONObject(new ImmunizationBuilder().set("status", JSONObject.NULL).toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Found null value in field: status");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeExtensionFieldContainsNull_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is of primitive type "code", and the "_status" field can contain a
+        // primitive type extension
+        JSONObject immunizationJson =
+                new JSONObject(new ImmunizationBuilder().set("_status", JSONObject.NULL).toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Found null value in field: _status");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_complexTypeFieldContainsNull_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "statusReason" field is of complex type "CodeableConcept"
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder().set("statusReason", JSONObject.NULL).toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown).hasMessageThat().contains("Found null value in field: statusReason");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_fieldContainsNullSetViaJsonString_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // This test tests that a "null" value in a json string is parsed to JSONObject.NULL as
+        // expected and therefore throws the expected error.
+        JSONObject allergyJson =
+                new JSONObject(
+                        "{"
+                                + "  \"resourceType\": \"AllergyIntolerance\","
+                                + "  \"id\": \"allergyintolerance-1\","
+                                + "  \"type\": null,"
+                                + "  \"patient\": {"
+                                + "    \"reference\": \"Patient/patient-1\","
+                                + "    \"display\": \"Example, Anne\""
+                                + "  }"
+                                + "}");
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE));
+        assertThat(thrown).hasMessageThat().contains("Found null value in field: type");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeArrayFieldIsNull_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "category" field is an array of primitive type "code"
+        JSONObject allergyJson =
+                new JSONObject(new AllergyBuilder().set("category", JSONObject.NULL).toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Invalid resource structure. Expected array for field: category");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeArrayFieldContainsNull_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "category" field is an array of primitive type "code"
+        JSONObject allergyJson =
+                new JSONObject(
+                        new AllergyBuilder()
+                                .set("category", new JSONArray("[\"value\", null, null]"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE));
+        assertThat(thrown).hasMessageThat().contains("Found null value in field: category");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeExtensionArrayFieldContainsNull_succeeds()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "category" field is an array of primitive type "code" and has the primitive type
+        // extension "_category". Primitive type extension arrays are allowed to contain null values
+        // as they act as placeholders if there is no extension for an item in the value array.
+        JSONObject allergyJson =
+                new JSONObject(
+                        new AllergyBuilder()
+                                .set("_category", new JSONArray("[null, null]"))
+                                .toJson());
+
+        validator.validateFhirResource(allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeExtensionNotJSONObject_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is of primitive type "code", and the "_status" field can contain a
+        // primitive type extension, which is expected to be an object.
+        JSONObject immunizationJson =
+                new JSONObject(new ImmunizationBuilder().set("_status", "simple_string").toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Invalid resource structure. Expected object in field: _status");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeFieldIsJSONObject_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is of primitive type "code", so should be a primitive type (string in
+        // this case) and not a json object.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set("status", new JSONObject("{\"id\": \"123\"}"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains(
+                        "Invalid resource structure. Found json object but expected primitive type"
+                                + " in field: status");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_primitiveTypeFieldIsJSONArray_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is of primitive type "code", so should be a primitive type (string in
+        // this case) and not a json array.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder().set("status", new JSONArray("[]")).toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains(
+                        "Invalid resource structure. Found json array but expected primitive type"
+                                + " in field: status");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_complexTypeFieldNotJSONObject_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "statusReason" field is of complex type "CodeableConcept", which is expected to be
+        // a json object
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder().set("statusReason", "simple string").toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Invalid resource structure. Expected object in field: statusReason");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_complexTypeFieldIsArrayNotJSONObject_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "statusReason" field is of complex type "CodeableConcept", which is expected to be
+        // a json object
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set("statusReason", new JSONArray("[{\"text\": \"test\"}]"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Invalid resource structure. Expected object in field: statusReason");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_arrayFieldIsNotArray_throws() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "identifier" field is an array of complex type "Identifier"
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set("identifier", new JSONObject("{\"value\": \"123\"}"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Invalid resource structure. Expected array for field: identifier");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_arrayOfPrimitiveTypeExtensions_succeeds()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "category" field is an array of primitive type "code", which can have a primitive
+        // type extension array "_category"
+        JSONObject allergyJson =
+                new JSONObject(
+                        new AllergyBuilder()
+                                .set(
+                                        "_category",
+                                        new JSONArray("[{\"id\": \"123\"}, {\"id\": \"456\"}]"))
+                                .toJson());
+
+        validator.validateFhirResource(allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_arrayOfPrimitiveTypeExtensionsIfNotArray_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "status" field is a primitive type field of type "code", but is not an array. So
+        // the extension field "_status" is not allowed to be an array.
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(
+                                        "_status",
+                                        new JSONArray("[{\"id\": \"123\"}, {\"id\": \"456\"}]"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Invalid resource structure. Expected object in field: _status");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_arrayOfComplexType_succeeds() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "identifier" field is an array of complex type "Identifier"
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(
+                                        "identifier",
+                                        new JSONArray(
+                                                "[{\"value\": \"123\"}, {\"value\": \"456\"}]"))
+                                .toJson());
+
+        validator.validateFhirResource(immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_arrayOfPrimitiveType_succeeds() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "category" field is an array of primitive type "code",
+        JSONObject allergyJson =
+                new JSONObject(
+                        new AllergyBuilder()
+                                .set("category", new JSONArray("[\"food\", \"medication\"]"))
+                                .toJson());
+
+        validator.validateFhirResource(allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_arrayOfPrimitiveTypeExtensionsNotJsonObject_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "category" field is an array of primitive type "code", which can have a primitive
+        // type extension array "_category" which is expected to be an array of json objects.
+        JSONObject allergyJson =
+                new JSONObject(
+                        new AllergyBuilder()
+                                .set("_category", new JSONArray("[\"value1\", \"value2\"]"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Invalid resource structure. Expected object in field: _category");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_arrayOfComplexTypeNotJsonObject_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "identifier" field is an array of complex type "Identifier"
+        JSONObject immunizationJson =
+                new JSONObject(
+                        new ImmunizationBuilder()
+                                .set(
+                                        "identifier",
+                                        new JSONArray("[\"simple_string_1\", \"simple_string_2\"]"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains("Invalid resource structure. Expected object in field: identifier");
+    }
+
+    @EnableFlags({FLAG_PHR_FHIR_STRUCTURAL_VALIDATION, FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION})
+    @Test
+    public void testValidateFhirResource_arrayOfPrimitiveTypesNotPrimitive_throws()
+            throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "category" field is an array of primitive type "code", that should not be of type
+        // json object
+        JSONObject allergyJson =
+                new JSONObject(
+                        new AllergyBuilder()
+                                .set("category", new JSONArray("[{\"id\": \"123\"}]"))
+                                .toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        allergyJson, FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains(
+                        "Invalid resource structure. Found json object but expected primitive type"
+                                + " in field: category");
+    }
+
+    @EnableFlags({
+        FLAG_PHR_FHIR_STRUCTURAL_VALIDATION,
+        FLAG_PHR_FHIR_BASIC_COMPLEX_TYPE_VALIDATION,
+        FLAG_PHR_FHIR_PRIMITIVE_TYPE_VALIDATION
+    })
+    @Test
+    public void testValidateFhirResource_primitiveValidationFails_throws() throws JSONException {
+        FhirResourceValidator validator = new FhirResourceValidator();
+        // The "primarySource" field is of primitive type "boolean" and cannot be a string.
+        JSONObject immunizationJson =
+                new JSONObject(new ImmunizationBuilder().set("primarySource", "true").toJson());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                validator.validateFhirResource(
+                                        immunizationJson, FHIR_RESOURCE_TYPE_IMMUNIZATION));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains(
+                        "Invalid resource structure. "
+                                + "Found non boolean object in field: primarySource");
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirSpecProviderTest.java b/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirSpecProviderTest.java
new file mode 100644
index 0000000..c38bee2
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/phr/validations/FhirSpecProviderTest.java
@@ -0,0 +1,695 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.phr.validations;
+
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_CONDITION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_LOCATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_REQUEST;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_OBSERVATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_ORGANIZATION;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PATIENT;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE;
+import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_PROCEDURE;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4B;
+
+import static com.android.server.healthconnect.proto.Kind.KIND_COMPLEX_TYPE;
+import static com.android.server.healthconnect.proto.Kind.KIND_PRIMITIVE_TYPE;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_BOOLEAN;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_CODE;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_COMPLEX;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_DATE;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_DATE_TIME;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_STRING;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_SYSTEM_STRING;
+import static com.android.server.healthconnect.proto.R4FhirType.R4_FHIR_TYPE_URI;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.health.connect.datatypes.FhirVersion;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import com.android.server.healthconnect.proto.FhirDataTypeConfig;
+import com.android.server.healthconnect.proto.FhirFieldConfig;
+import com.android.server.healthconnect.proto.Kind;
+import com.android.server.healthconnect.proto.MultiTypeFieldConfig;
+import com.android.server.healthconnect.proto.R4FhirType;
+
+import com.google.common.truth.Correspondence;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+
+public class FhirSpecProviderTest {
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    private static final Correspondence<MultiTypeFieldConfig, MultiTypeFieldConfig>
+            MULTI_TYPE_CONFIG_EQUIVALENCE =
+                    Correspondence.from(
+                            FhirSpecProviderTest::isMultiTypeFieldConfigEqual,
+                            "isMultiTypeFieldConfigEqual");
+
+    @Test
+    public void testConstructor_r4FhirVersion_parsesProtoFileAndSucceeds() {
+        new FhirSpecProvider(FHIR_VERSION_R4);
+    }
+
+    @Test
+    public void testConstructor_r4BFhirVersion_succeeds() {
+        new FhirSpecProvider(FHIR_VERSION_R4B);
+    }
+
+    @Test
+    public void testConstructor_otherFhirVersion_throws() {
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new FhirSpecProvider(FhirVersion.parseFhirVersion("4.0.0")));
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_immunization_returnsConfig() {
+        // Compare the full expected Fhir spec for Immunization. For the other resources we just
+        // check a number of fields are as expected instead of the full list.
+        // The test is based on the published spec at - https://hl7.org/fhir/R4/immunization.html
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of("status", "vaccineCode", "patient");
+        List<MultiTypeFieldConfig> expectedMultiTypeFieldConfigs =
+                List.of(
+                        MultiTypeFieldConfig.newBuilder()
+                                .setName("occurrence[x]")
+                                .addAllTypedFieldNames(
+                                        List.of("occurrenceDateTime", "occurrenceString"))
+                                .setIsRequired(true)
+                                .build());
+        Map<String, FhirFieldConfig> expectedFieldConfigsMap =
+                Map.ofEntries(
+                        Map.entry(
+                                "id",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_SYSTEM_STRING, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "resourceType",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_STRING, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "meta",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "implicitRules",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_URI, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "language",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_CODE, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "text",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "contained",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "extension",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "modifierExtension",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "identifier",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "status",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_CODE, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "statusReason",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "vaccineCode",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "patient",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "encounter",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "occurrenceDateTime",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_DATE_TIME, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "occurrenceString",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_STRING, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "recorded",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_DATE_TIME, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "primarySource",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_BOOLEAN, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "reportOrigin",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "location",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "manufacturer",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "lotNumber",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_STRING, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "expirationDate",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_DATE, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "site",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "route",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "doseQuantity",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "performer",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "note",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "reasonCode",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "reasonReference",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "isSubpotent",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_BOOLEAN, KIND_PRIMITIVE_TYPE)),
+                        Map.entry(
+                                "subpotentReason",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "education",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "programEligibility",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "fundingSource",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "reaction",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)),
+                        Map.entry(
+                                "protocolApplied",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE)));
+
+        FhirDataTypeConfig immunizationConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_IMMUNIZATION);
+
+        assertThat(immunizationConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(immunizationConfig.getMultiTypeFieldsList())
+                .comparingElementsUsing(MULTI_TYPE_CONFIG_EQUIVALENCE)
+                .containsExactlyElementsIn(expectedMultiTypeFieldConfigs);
+        assertThat(immunizationConfig.getAllowedFieldNamesToConfigMap())
+                .containsExactlyEntriesIn(expectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_allergy_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of("patient");
+        List<MultiTypeFieldConfig> expectedMultiTypeFieldConfigs =
+                List.of(
+                        MultiTypeFieldConfig.newBuilder()
+                                .setName("onset[x]")
+                                .addAllTypedFieldNames(
+                                        List.of(
+                                                "onsetDateTime",
+                                                "onsetAge",
+                                                "onsetPeriod",
+                                                "onsetRange",
+                                                "onsetString"))
+                                .setIsRequired(false)
+                                .build());
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "id",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_SYSTEM_STRING, KIND_PRIMITIVE_TYPE),
+                        "resourceType",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_STRING, KIND_PRIMITIVE_TYPE),
+                        "meta",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "clinicalStatus",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "criticality",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_CODE, KIND_PRIMITIVE_TYPE),
+                        "onsetRange",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "contained",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig allergyConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+
+        assertThat(allergyConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(allergyConfig.getMultiTypeFieldsList())
+                .comparingElementsUsing(MULTI_TYPE_CONFIG_EQUIVALENCE)
+                .containsExactlyElementsIn(expectedMultiTypeFieldConfigs);
+        assertThat(allergyConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_observation_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of("status", "code");
+        List<MultiTypeFieldConfig> expectedMultiTypeFieldConfigs =
+                List.of(
+                        MultiTypeFieldConfig.newBuilder()
+                                .setName("effective[x]")
+                                .addAllTypedFieldNames(
+                                        List.of(
+                                                "effectiveDateTime",
+                                                "effectivePeriod",
+                                                "effectiveTiming",
+                                                "effectiveInstant"))
+                                .setIsRequired(false)
+                                .build(),
+                        MultiTypeFieldConfig.newBuilder()
+                                .setName("value[x]")
+                                .addAllTypedFieldNames(
+                                        List.of(
+                                                "valueQuantity",
+                                                "valueCodeableConcept",
+                                                "valueString",
+                                                "valueBoolean",
+                                                "valueInteger",
+                                                "valueRange",
+                                                "valueRatio",
+                                                "valueSampledData",
+                                                "valueTime",
+                                                "valueDateTime",
+                                                "valuePeriod"))
+                                .setIsRequired(false)
+                                .build());
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "encounter",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "valueQuantity",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "valueDateTime",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_DATE_TIME, KIND_PRIMITIVE_TYPE),
+                        "dataAbsentReason",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "referenceRange",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig observationConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_OBSERVATION);
+
+        assertThat(observationConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(observationConfig.getMultiTypeFieldsList())
+                .comparingElementsUsing(MULTI_TYPE_CONFIG_EQUIVALENCE)
+                .containsExactlyElementsIn(expectedMultiTypeFieldConfigs);
+        assertThat(observationConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_condition_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of("subject");
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "id",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_SYSTEM_STRING, KIND_PRIMITIVE_TYPE),
+                        "resourceType",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_STRING, KIND_PRIMITIVE_TYPE),
+                        "code",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "onsetDateTime",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_DATE_TIME, KIND_PRIMITIVE_TYPE),
+                        "onsetAge",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig conditionConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_CONDITION);
+
+        assertThat(conditionConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(conditionConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_procedure_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of("status", "subject");
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "id",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_SYSTEM_STRING, KIND_PRIMITIVE_TYPE),
+                        "resourceType",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_STRING, KIND_PRIMITIVE_TYPE),
+                        "subject",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "performedRange",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "note",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig procedureConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_PROCEDURE);
+
+        assertThat(procedureConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(procedureConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_medication_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of();
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "manufacturer",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "ingredient",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "batch",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig medicationConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_MEDICATION);
+
+        assertThat(medicationConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(medicationConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_medicationRequest_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of("status", "intent", "subject");
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "doNotPerform",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_BOOLEAN, KIND_PRIMITIVE_TYPE),
+                        "medicationCodeableConcept",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "medicationReference",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "dosageInstruction",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "priorPrescription",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig medicationRequestConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_MEDICATION_REQUEST);
+
+        assertThat(medicationRequestConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(medicationRequestConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_medicationStatement_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of("status", "subject");
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "dateAsserted",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_DATE_TIME, KIND_PRIMITIVE_TYPE),
+                        "dosage",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig medicationStatementConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_MEDICATION_STATEMENT);
+
+        assertThat(medicationStatementConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(medicationStatementConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_patient_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of();
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "active",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_BOOLEAN, KIND_PRIMITIVE_TYPE),
+                        "name",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "deceasedBoolean",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_BOOLEAN, KIND_PRIMITIVE_TYPE),
+                        "photo",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "contact",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig patientConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_PATIENT);
+
+        assertThat(patientConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(patientConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_practitioner_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of();
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "name",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "telecom",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "qualification",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig practitionerConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_PRACTITIONER);
+
+        assertThat(practitionerConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(practitionerConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_practitionerRole_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of();
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "practitioner",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "healthcareService",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "availableTime",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "endpoint",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig practitionerRoleConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_PRACTITIONER_ROLE);
+
+        assertThat(practitionerRoleConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(practitionerRoleConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_location_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of();
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "operationalStatus",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "address",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE),
+                        "position",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig locationConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_LOCATION);
+
+        assertThat(locationConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(locationConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    @Test
+    public void testGetFhirDataTypeConfigForResourceType_organization_returnsConfig() {
+        FhirSpecProvider spec = new FhirSpecProvider(FHIR_VERSION_R4);
+        List<String> expectedRequiredFields = List.of();
+        Map<String, FhirFieldConfig> atLeastExpectedFieldConfigsMap =
+                Map.of(
+                        "name",
+                                createFhirFieldConfig(
+                                        false, R4_FHIR_TYPE_STRING, KIND_PRIMITIVE_TYPE),
+                        "alias",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_STRING, KIND_PRIMITIVE_TYPE),
+                        "contact",
+                                createFhirFieldConfig(
+                                        true, R4_FHIR_TYPE_COMPLEX, KIND_COMPLEX_TYPE));
+
+        FhirDataTypeConfig organizationConfig =
+                spec.getFhirDataTypeConfigForResourceType(FHIR_RESOURCE_TYPE_ORGANIZATION);
+
+        assertThat(organizationConfig.getRequiredFieldsList())
+                .containsExactlyElementsIn(expectedRequiredFields);
+        assertThat(organizationConfig.getAllowedFieldNamesToConfigMap())
+                .containsAtLeastEntriesIn(atLeastExpectedFieldConfigsMap);
+    }
+
+    private static FhirFieldConfig createFhirFieldConfig(
+            boolean isArray, R4FhirType r4Type, Kind kind) {
+        return FhirFieldConfig.newBuilder()
+                .setIsArray(isArray)
+                .setR4Type(r4Type)
+                .setKind(kind)
+                .build();
+    }
+
+    /**
+     * Given two {@link MultiTypeFieldConfig}s, compare whether they are equal or not. This ignores
+     * the list order when comparing {@link MultiTypeFieldConfig#getTypedFieldNamesList()} ()}.
+     */
+    private static boolean isMultiTypeFieldConfigEqual(
+            MultiTypeFieldConfig actual, MultiTypeFieldConfig expected) {
+        List<String> actualFieldNames = actual.getTypedFieldNamesList();
+        List<String> expectedFieldNames = expected.getTypedFieldNamesList();
+        if (actualFieldNames.size() != expectedFieldNames.size()
+                || !actualFieldNames.containsAll(expectedFieldNames)) {
+            return false;
+        }
+
+        MultiTypeFieldConfig actualWithoutFieldNames =
+                actual.toBuilder().clearTypedFieldNames().build();
+        MultiTypeFieldConfig expectedWithoutFieldNames =
+                expected.toBuilder().clearTypedFieldNames().build();
+
+        return actualWithoutFieldNames.equals(expectedWithoutFieldNames);
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/phr/validations/MedicalResourceValidatorTest.java b/tests/unittests/src/com/android/server/healthconnect/phr/validations/MedicalResourceValidatorTest.java
index 554c9a4..e6a42d1 100644
--- a/tests/unittests/src/com/android/server/healthconnect/phr/validations/MedicalResourceValidatorTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/phr/validations/MedicalResourceValidatorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,37 +16,40 @@
 
 package com.android.server.healthconnect.phr.validations;
 
-import static android.healthconnect.cts.utils.ObservationBuilder.LOINC;
-import static android.healthconnect.cts.utils.ObservationBuilder.ObservationCategory.LABORATORY;
-import static android.healthconnect.cts.utils.ObservationBuilder.ObservationCategory.SOCIAL_HISTORY;
-import static android.healthconnect.cts.utils.ObservationBuilder.ObservationCategory.VITAL_SIGNS;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.BEATS_PER_MINUTE;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.BREATHS_PER_MINUTE;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.CELSIUS;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.CENTIMETERS;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.KILOGRAMS;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.KILOGRAMS_PER_M2;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.MILLIMETERS_OF_MERCURY;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.PERCENT;
-import static android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits.POUNDS;
-import static android.healthconnect.cts.utils.ObservationBuilder.SNOMED_CT;
-import static android.healthconnect.cts.utils.ObservationBuilder.makeCodeableConcept;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_ID_EMPTY;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_UNSUPPORTED_RESOURCE_TYPE;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_TYPE_UNSUPPORTED;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4B;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_UNSUPPORTED;
-import static android.healthconnect.cts.utils.PhrDataFactory.getUpsertMedicalResourceRequestBuilder;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.LOINC;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.ObservationCategory.LABORATORY;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.ObservationCategory.SOCIAL_HISTORY;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.ObservationCategory.VITAL_SIGNS;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.BEATS_PER_MINUTE;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.BREATHS_PER_MINUTE;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.CELSIUS;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.CENTIMETERS;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.KILOGRAMS;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.KILOGRAMS_PER_M2;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.MILLIMETERS_OF_MERCURY;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.PERCENT;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits.POUNDS;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.SNOMED_CT;
+import static android.healthconnect.cts.phr.utils.ObservationBuilder.makeCodeableConcept;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_ALLERGY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_ID_EMPTY;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION_UNSUPPORTED_RESOURCE_TYPE;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_TYPE_UNSUPPORTED;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4B;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_UNSUPPORTED;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getUpsertMedicalResourceRequest;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getUpsertMedicalResourceRequestBuilder;
 
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
+import static com.android.healthfitness.flags.Flags.FLAG_PHR_FHIR_STRUCTURAL_VALIDATION;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -55,16 +58,18 @@
 import android.health.connect.UpsertMedicalResourceRequest;
 import android.health.connect.datatypes.FhirResource;
 import android.health.connect.datatypes.MedicalResource;
-import android.healthconnect.cts.utils.ConditionBuilder;
-import android.healthconnect.cts.utils.MedicationsBuilder;
-import android.healthconnect.cts.utils.ObservationBuilder;
-import android.healthconnect.cts.utils.ObservationBuilder.QuantityUnits;
-import android.healthconnect.cts.utils.ProcedureBuilder;
+import android.healthconnect.cts.phr.utils.ConditionBuilder;
+import android.healthconnect.cts.phr.utils.EncountersBuilder;
+import android.healthconnect.cts.phr.utils.ImmunizationBuilder;
+import android.healthconnect.cts.phr.utils.MedicationsBuilder;
+import android.healthconnect.cts.phr.utils.ObservationBuilder;
+import android.healthconnect.cts.phr.utils.ObservationBuilder.QuantityUnits;
+import android.healthconnect.cts.phr.utils.PatientBuilder;
+import android.healthconnect.cts.phr.utils.PractitionerBuilder;
+import android.healthconnect.cts.phr.utils.ProcedureBuilder;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 
-import androidx.annotation.NonNull;
-
 import com.android.server.healthconnect.storage.request.UpsertMedicalResourceInternalRequest;
 
 import com.google.testing.junit.testparameterinjector.TestParameter;
@@ -79,11 +84,17 @@
 
 import java.util.List;
 
-@EnableFlags(FLAG_PERSONAL_HEALTH_RECORD)
+@EnableFlags({
+    FLAG_PERSONAL_HEALTH_RECORD,
+    FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+    FLAG_PHR_FHIR_STRUCTURAL_VALIDATION
+})
 @RunWith(TestParameterInjector.class)
 public class MedicalResourceValidatorTest {
     @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
+    private FhirResourceValidator mFhirResourceValidator = null;
+
     @Test
     public void testValidateAndCreateInternalRequest_validAndR4_populatesInternalRequest() {
         UpsertMedicalResourceRequest upsertRequest =
@@ -93,13 +104,14 @@
         UpsertMedicalResourceInternalRequest expected =
                 new UpsertMedicalResourceInternalRequest()
                         .setDataSourceId(DATA_SOURCE_ID)
-                        .setMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .setMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES)
                         .setFhirResourceType(FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION)
                         .setFhirResourceId(FHIR_RESOURCE_ID_IMMUNIZATION)
                         .setFhirVersion(FHIR_VERSION_R4)
                         .setData(FHIR_DATA_IMMUNIZATION);
 
-        MedicalResourceValidator validator = new MedicalResourceValidator(upsertRequest);
+        MedicalResourceValidator validator =
+                new MedicalResourceValidator(upsertRequest, getFhirResourceValidator());
         UpsertMedicalResourceInternalRequest validatedRequest =
                 validator.validateAndCreateInternalRequest();
 
@@ -115,13 +127,14 @@
         UpsertMedicalResourceInternalRequest expected =
                 new UpsertMedicalResourceInternalRequest()
                         .setDataSourceId(DATA_SOURCE_ID)
-                        .setMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .setMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES)
                         .setFhirResourceType(FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION)
                         .setFhirResourceId(FHIR_RESOURCE_ID_IMMUNIZATION)
                         .setFhirVersion(FHIR_VERSION_R4B)
                         .setData(FHIR_DATA_IMMUNIZATION);
 
-        MedicalResourceValidator validator = new MedicalResourceValidator(upsertRequest);
+        MedicalResourceValidator validator =
+                new MedicalResourceValidator(upsertRequest, getFhirResourceValidator());
         UpsertMedicalResourceInternalRequest validatedRequest =
                 validator.validateAndCreateInternalRequest();
 
@@ -129,6 +142,79 @@
     }
 
     @Test
+    public void testConstructor_nullValidator_succeeds() {
+        new MedicalResourceValidator(getUpsertMedicalResourceRequest(), null);
+    }
+
+    @Test
+    public void testValidateAndCreateInternalRequest_nullValidator_succeeds() {
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, FHIR_DATA_IMMUNIZATION)
+                        .build();
+        UpsertMedicalResourceInternalRequest expected =
+                new UpsertMedicalResourceInternalRequest()
+                        .setDataSourceId(DATA_SOURCE_ID)
+                        .setMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setFhirResourceType(FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION)
+                        .setFhirResourceId(FHIR_RESOURCE_ID_IMMUNIZATION)
+                        .setFhirVersion(FHIR_VERSION_R4)
+                        .setData(FHIR_DATA_IMMUNIZATION);
+
+        MedicalResourceValidator validator = new MedicalResourceValidator(upsertRequest, null);
+        UpsertMedicalResourceInternalRequest validatedRequest =
+                validator.validateAndCreateInternalRequest();
+
+        assertThat(validatedRequest).isEqualTo(expected);
+    }
+
+    @Test
+    public void testValidateAndCreateInternalRequest_nullValidator_unknownFieldSucceeds() {
+        String immunizationWithUnknownField =
+                new ImmunizationBuilder()
+                        .setId(FHIR_RESOURCE_ID_IMMUNIZATION)
+                        .set("unknown", "test")
+                        .toJson();
+        UpsertMedicalResourceRequest upsertRequest =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, immunizationWithUnknownField)
+                        .build();
+        UpsertMedicalResourceInternalRequest expected =
+                new UpsertMedicalResourceInternalRequest()
+                        .setDataSourceId(DATA_SOURCE_ID)
+                        .setMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .setFhirResourceType(FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION)
+                        .setFhirResourceId(FHIR_RESOURCE_ID_IMMUNIZATION)
+                        .setFhirVersion(FHIR_VERSION_R4)
+                        .setData(immunizationWithUnknownField);
+
+        MedicalResourceValidator validator = new MedicalResourceValidator(upsertRequest, null);
+        UpsertMedicalResourceInternalRequest validatedRequest =
+                validator.validateAndCreateInternalRequest();
+
+        assertThat(validatedRequest).isEqualTo(expected);
+    }
+
+    @Test
+    public void testValidateAndCreateInternalRequest_nonNullValidator_unknownFieldThrows() {
+        String immunizationWithUnknownField =
+                new ImmunizationBuilder().set("unknown", "test").toJson();
+
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID, FHIR_VERSION_R4, immunizationWithUnknownField)
+                        .build();
+        MedicalResourceValidator validator =
+                new MedicalResourceValidator(request, getFhirResourceValidator());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () -> validator.validateAndCreateInternalRequest());
+        assertThat(thrown).hasMessageThat().contains("Found unexpected field ");
+    }
+
+    @Test
     public void testValidateAndCreateInternalRequest_fhirResourceWithoutType_throws() {
         MedicalResourceValidator validator =
                 makeValidator(FHIR_DATA_IMMUNIZATION_RESOURCE_TYPE_NOT_EXISTS);
@@ -156,6 +242,23 @@
     }
 
     @Test
+    public void testValidateAndCreateInternalRequest_nullValidatorMissingId_throws() {
+        UpsertMedicalResourceRequest request =
+                new UpsertMedicalResourceRequest.Builder(
+                                DATA_SOURCE_ID,
+                                FHIR_VERSION_R4,
+                                FHIR_DATA_IMMUNIZATION_ID_NOT_EXISTS)
+                        .build();
+        MedicalResourceValidator validator = new MedicalResourceValidator(request, null);
+
+        var thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        validator::validateAndCreateInternalRequest);
+        assertThat(thrown).hasMessageThat().contains("Resource is missing id field");
+    }
+
+    @Test
     public void testValidateAndCreateInternalRequest_invalidJson_throws() {
         MedicalResourceValidator validator =
                 makeValidator(FHIR_DATA_IMMUNIZATION_FIELD_MISSING_INVALID);
@@ -179,12 +282,48 @@
     }
 
     @Test
+    public void testValidateAndCreateInternalRequest_nullId_throws() {
+        String immunizationJson = new ImmunizationBuilder().set("id", JSONObject.NULL).toJson();
+        MedicalResourceValidator validator = makeValidator(immunizationJson);
+
+        var thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        validator::validateAndCreateInternalRequest);
+        assertThat(thrown).hasMessageThat().contains("id should be a string");
+    }
+
+    @Test
+    public void testValidateAndCreateInternalRequest_nonStringId_throws() {
+        String immunizationJson = new ImmunizationBuilder().set("id", 123).toJson();
+        MedicalResourceValidator validator = makeValidator(immunizationJson);
+
+        var thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        validator::validateAndCreateInternalRequest);
+        assertThat(thrown).hasMessageThat().contains("id should be a string");
+    }
+
+    @Test
+    public void testValidateAndCreateInternalRequest_nullString_succeeds() {
+        String immunizationJson = new ImmunizationBuilder().set("id", "null").toJson();
+        MedicalResourceValidator validator = makeValidator(immunizationJson);
+
+        UpsertMedicalResourceInternalRequest internalRequest =
+                validator.validateAndCreateInternalRequest();
+
+        assertThat(internalRequest.getFhirResourceId()).isEqualTo("null");
+    }
+
+    @Test
     public void testValidateAndCreateInternalRequest_unsupportedFhirVersion_throws() {
         UpsertMedicalResourceRequest upsertRequest =
                 getUpsertMedicalResourceRequestBuilder()
                         .setFhirVersion(FHIR_VERSION_UNSUPPORTED)
                         .build();
-        MedicalResourceValidator validator = new MedicalResourceValidator(upsertRequest);
+        MedicalResourceValidator validator =
+                new MedicalResourceValidator(upsertRequest, getFhirResourceValidator());
 
         var thrown =
                 assertThrows(
@@ -211,33 +350,115 @@
         assertThat(thrown)
                 .hasMessageThat()
                 .contains(
-                        "Unsupported resource type "
+                        "Unsupported FHIR resource type "
                                 + FHIR_RESOURCE_TYPE_UNSUPPORTED
                                 + " for resource with id "
                                 + FHIR_RESOURCE_ID_IMMUNIZATION);
     }
 
     @Test
-    public void testCalculateMedicalResourceType_allergy() throws JSONException {
+    public void testValidateAndCreateInternalRequest_nullResourceType_throws() {
+        String immunizationJson =
+                new ImmunizationBuilder()
+                        .setId(FHIR_RESOURCE_ID_IMMUNIZATION)
+                        .set("resourceType", JSONObject.NULL)
+                        .toJson();
+        MedicalResourceValidator validator = makeValidator(immunizationJson);
+
+        var thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        validator::validateAndCreateInternalRequest);
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains(
+                        "Unsupported FHIR resource type null for resource with id "
+                                + FHIR_RESOURCE_ID_IMMUNIZATION);
+    }
+
+    @Test
+    public void testValidateAndCreateInternalRequest_containedResourceInResource_throws() {
+        String resourceId = "id1";
+        String medicationStatementWithContainedResource =
+                new MedicationsBuilder.MedicationStatementR4Builder()
+                        .setId(resourceId)
+                        .setContainedMedication(new MedicationsBuilder.MedicationBuilder())
+                        .toJson();
+        MedicalResourceValidator validator =
+                makeValidator(medicationStatementWithContainedResource);
+
+        var thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        validator::validateAndCreateInternalRequest);
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains(
+                        "Contained resources are not supported. Found contained resource for"
+                                + " resource with id "
+                                + resourceId);
+    }
+
+    @Test
+    public void testValidateAndCreateInternalRequest_containedFieldNotArray_throws()
+            throws JSONException {
+        String resourceId = "id1";
+        String medicationStatementWithInvalidContained =
+                new MedicationsBuilder.MedicationStatementR4Builder()
+                        .setId(resourceId)
+                        .set("contained", new JSONObject("{}"))
+                        .toJson();
+        MedicalResourceValidator validator = makeValidator(medicationStatementWithInvalidContained);
+
+        var thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        validator::validateAndCreateInternalRequest);
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains(
+                        "Contained resources are not supported. Found contained field for resource"
+                                + " with id "
+                                + resourceId);
+    }
+
+    @Test
+    public void testValidateAndCreateInternalRequest_emptyContainedArray_succeeds()
+            throws JSONException {
+        String resourceId = "id1";
+        String medicationStatementWithEmptyContained =
+                new MedicationsBuilder.MedicationStatementR4Builder()
+                        .setId(resourceId)
+                        .set("contained", new JSONArray("[]"))
+                        .toJson();
+
+        MedicalResourceValidator validator = makeValidator(medicationStatementWithEmptyContained);
+
+        assertThat(validator.validateAndCreateInternalRequest().getData())
+                .isEqualTo(medicationStatementWithEmptyContained);
+    }
+
+    @Test
+    public void testCalculateMedicalResourceType_allergy() {
         MedicalResourceValidator validator = makeValidator(FHIR_DATA_ALLERGY);
 
         int type = validator.validateAndCreateInternalRequest().getMedicalResourceType();
 
-        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
     }
 
     @Test
-    public void testCalculateMedicalResourceType_condition() throws JSONException {
+    public void testCalculateMedicalResourceType_condition() {
         String fhirData = new ConditionBuilder().toJson();
         MedicalResourceValidator validator = makeValidator(fhirData);
 
         int type = validator.validateAndCreateInternalRequest().getMedicalResourceType();
 
-        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_PROBLEMS);
+        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_CONDITIONS);
     }
 
     @Test
-    public void testCalculateMedicalResourceType_procedure() throws JSONException {
+    public void testCalculateMedicalResourceType_procedure() {
         String fhirData = new ProcedureBuilder().toJson();
         MedicalResourceValidator validator = makeValidator(fhirData);
 
@@ -276,6 +497,66 @@
         assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_MEDICATIONS);
     }
 
+    @Test
+    public void testCalculateMedicalResourceType_patient() {
+        String fhirData = new PatientBuilder().toJson();
+        MedicalResourceValidator validator = makeValidator(fhirData);
+
+        int type = validator.validateAndCreateInternalRequest().getMedicalResourceType();
+
+        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_PERSONAL_DETAILS);
+    }
+
+    @Test
+    public void testCalculateMedicalResourceType_practitioner() {
+        String fhirData = new PractitionerBuilder().toJson();
+        MedicalResourceValidator validator = makeValidator(fhirData);
+
+        int type = validator.validateAndCreateInternalRequest().getMedicalResourceType();
+
+        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS);
+    }
+
+    @Test
+    public void testCalculateMedicalResourceType_practitionerRole() {
+        String fhirData = PractitionerBuilder.role().toJson();
+        MedicalResourceValidator validator = makeValidator(fhirData);
+
+        int type = validator.validateAndCreateInternalRequest().getMedicalResourceType();
+
+        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_PRACTITIONER_DETAILS);
+    }
+
+    @Test
+    public void testCalculateMedicalResourceType_encounter() {
+        String fhirData = EncountersBuilder.encounter().toJson();
+        MedicalResourceValidator validator = makeValidator(fhirData);
+
+        int type = validator.validateAndCreateInternalRequest().getMedicalResourceType();
+
+        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS);
+    }
+
+    @Test
+    public void testCalculateMedicalResourceType_location() {
+        String fhirData = EncountersBuilder.location().toJson();
+        MedicalResourceValidator validator = makeValidator(fhirData);
+
+        int type = validator.validateAndCreateInternalRequest().getMedicalResourceType();
+
+        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS);
+    }
+
+    @Test
+    public void testCalculateMedicalResourceType_organization() {
+        String fhirData = EncountersBuilder.organization().toJson();
+        MedicalResourceValidator validator = makeValidator(fhirData);
+
+        int type = validator.validateAndCreateInternalRequest().getMedicalResourceType();
+
+        assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_VISITS);
+    }
+
     // IPS artifacts: https://build.fhir.org/ig/HL7/fhir-ips/artifacts.html
     // pregnancy outcome,  status and expected delivery date.
     enum PregnancyStatusTestValue {
@@ -381,7 +662,7 @@
 
     @Test
     public void testCalculateMedicalResourceType_pregnancyStatus_pregnancy(
-            @TestParameter PregnancyStatusTestValue testValue) throws JSONException {
+            @TestParameter PregnancyStatusTestValue testValue) {
         String fhirData =
                 new ObservationBuilder()
                         .setCode(LOINC, testValue.mCode)
@@ -411,12 +692,14 @@
 
     @Test
     public void testCalculateMedicalResourceType_expectedDeliveryDate_pregnancy(
-            @TestParameter({"11778-8", "11779-6", "11780-4"}) String code) throws JSONException {
+            @TestParameter({"11778-8", "11779-6", "11780-4"}) String code) {
         // https://build.fhir.org/ig/HL7/fhir-ips/ValueSet-edd-method-uv-ips.html
         String fhirData =
                 new ObservationBuilder()
                         .setCode(LOINC, code)
+                        .removeAllEffectiveMultiTypeFields()
                         .set("effectiveDateTime", "2021-04-20")
+                        .removeAllValueMultiTypeFields()
                         .set("valueDateTime", "2021-08-07")
                         .toJson();
         MedicalResourceValidator validator = makeValidator(fhirData);
@@ -438,11 +721,12 @@
 
     @Test
     public void testCalculateMedicalResourceType_smoking_socialHistory(
-            @TestParameter SmokingTestValue value) throws JSONException {
+            @TestParameter SmokingTestValue value) {
         // https://build.fhir.org/ig/HL7/fhir-ips/StructureDefinition-Observation-tobaccouse-uv-ips.html
         String fhirData =
                 new ObservationBuilder()
                         .setCode(LOINC, value.mCode)
+                        .removeAllValueMultiTypeFields()
                         .set("valueCodeableConcept", value.mValueCodeableConcept)
                         .toJson();
         MedicalResourceValidator validator = makeValidator(fhirData);
@@ -479,7 +763,7 @@
 
     @Test
     public void testCalculateMedicalResourceType_vitalSigns_vitalSigns(
-            @TestParameter VitalSignsTestValue value) throws JSONException {
+            @TestParameter VitalSignsTestValue value) {
         // From https://hl7.org/fhir/R5/observation-vitalsigns.html
         String fhirData =
                 new ObservationBuilder()
@@ -631,11 +915,17 @@
         assertThat(type).isEqualTo(MedicalResource.MEDICAL_RESOURCE_TYPE_VITAL_SIGNS);
     }
 
-    @NonNull
-    private static MedicalResourceValidator makeValidator(String fhirData) {
+    private MedicalResourceValidator makeValidator(String fhirData) {
         UpsertMedicalResourceRequest request =
                 new UpsertMedicalResourceRequest.Builder(DATA_SOURCE_ID, FHIR_VERSION_R4, fhirData)
                         .build();
-        return new MedicalResourceValidator(request);
+        return new MedicalResourceValidator(request, getFhirResourceValidator());
+    }
+
+    private FhirResourceValidator getFhirResourceValidator() {
+        if (mFhirResourceValidator == null) {
+            mFhirResourceValidator = new FhirResourceValidator();
+        }
+        return mFhirResourceValidator;
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/AutoDeleteServiceTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/AutoDeleteServiceTest.java
deleted file mode 100644
index fb3105f..0000000
--- a/tests/unittests/src/com/android/server/healthconnect/storage/AutoDeleteServiceTest.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package healthconnect.storage;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.health.connect.datatypes.RecordTypeIdentifier;
-import android.os.Process;
-import android.util.ArrayMap;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.exportimport.ExportManager;
-import com.android.server.healthconnect.injector.HealthConnectInjector;
-import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
-import com.android.server.healthconnect.storage.AutoDeleteService;
-import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.ActiveCaloriesBurnedRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.ActivityDateHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.BasalBodyTemperatureRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.BasalMetabolicRateRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.BloodGlucoseRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.BloodPressureRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.BodyFatRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.BodyTemperatureRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.BodyWaterMassRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.BoneMassRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.CervicalMucusRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.CyclingPedalingCadenceRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.DistanceRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.ElevationGainedRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.ExerciseSessionRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.FloorsClimbedRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HeartRateRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HeartRateVariabilityRmssdHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HeightRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HydrationRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.IntermenstrualBleedingRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.LeanBodyMassRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.MenstruationFlowRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.MenstruationPeriodRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.NutritionRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.OvulationTestRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.OxygenSaturationRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PowerRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.RespiratoryRateRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.RestingHeartRateRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.SexualActivityRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.SkinTemperatureRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.SleepSessionRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.SpeedRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.StepsCadenceRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.StepsRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.TotalCaloriesBurnedRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.Vo2MaxRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.WeightRecordHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.WheelchairPushesRecordHelper;
-import com.android.server.healthconnect.storage.request.DeleteTableRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-@RunWith(AndroidJUnit4.class)
-public class AutoDeleteServiceTest {
-    private static final String AUTO_DELETE_DURATION_RECORDS_KEY =
-            "auto_delete_duration_records_key";
-
-    @Rule
-    public final ExtendedMockitoRule mExtendedMockitoRule =
-            new ExtendedMockitoRule.Builder(this)
-                    .mockStatic(PreferenceHelper.class)
-                    .mockStatic(TransactionManager.class)
-                    .mockStatic(RecordHelperProvider.class)
-                    .mockStatic(AppInfoHelper.class)
-                    .mockStatic(ActivityDateHelper.class)
-                    .build();
-
-    @Mock private PreferenceHelper mPreferenceHelper;
-    @Mock private TransactionManager mTransactionManager;
-    @Mock private ExportManager mExportManager;
-
-    @Mock private AppInfoHelper mAppInfoHelper;
-    @Mock private HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
-    @Mock Context mContext;
-
-    private HealthConnectInjector mHealthConnectInjector;
-
-    @Before
-    public void setup() {
-        when(mContext.getUser()).thenReturn(Process.myUserHandle());
-        mHealthConnectInjector =
-                HealthConnectInjectorImpl.newBuilderForTest(mContext)
-                        .setHealthDataCategoryPriorityHelper(mHealthDataCategoryPriorityHelper)
-                        .setPreferenceHelper(mPreferenceHelper)
-                        .setExportManager(mExportManager)
-                        .setTransactionManager(mTransactionManager)
-                        .setAppInfoHelper(mAppInfoHelper)
-                        .build();
-    }
-
-    @Test
-    public void testSetRecordRetentionPeriodInDays() {
-        AutoDeleteService.setRecordRetentionPeriodInDays(
-                30, mHealthConnectInjector.getPreferenceHelper());
-
-        verify(mPreferenceHelper)
-                .insertOrReplacePreference(
-                        Mockito.eq(AUTO_DELETE_DURATION_RECORDS_KEY),
-                        Mockito.eq(String.valueOf(30)));
-    }
-
-    @Test
-    public void testStartAutoDelete_getPreferenceReturnNull() {
-        when(TransactionManager.getInitialisedInstance()).thenReturn(mTransactionManager);
-        when(mPreferenceHelper.getPreference(AUTO_DELETE_DURATION_RECORDS_KEY)).thenReturn(null);
-
-        AutoDeleteService.startAutoDelete(
-                mContext,
-                mHealthConnectInjector.getHealthDataCategoryPriorityHelper(),
-                mHealthConnectInjector.getPreferenceHelper(),
-                mHealthConnectInjector.getAppInfoHelper(),
-                mHealthConnectInjector.getTransactionManager(),
-                mHealthConnectInjector.getAccessLogsHelper());
-
-        ExtendedMockito.verify(RecordHelperProvider::getRecordHelpers, never());
-        verify(mTransactionManager, Mockito.times(2))
-                .deleteWithoutChangeLogs(
-                        Mockito.argThat(
-                                (List<DeleteTableRequest> deleteTableRequestsList) ->
-                                        checkTableNames_getPreferenceReturnNull(
-                                                deleteTableRequestsList)));
-        verify(mAppInfoHelper).syncAppInfoRecordTypesUsed();
-        verify(mHealthDataCategoryPriorityHelper).reSyncHealthDataPriorityTable(mContext);
-        ExtendedMockito.verify(ActivityDateHelper::reSyncForAllRecords, times(1));
-    }
-
-    @Test
-    public void testStartAutoDelete_getPreferenceReturnNonNull() {
-        when(TransactionManager.getInitialisedInstance()).thenReturn(mTransactionManager);
-
-        when(mPreferenceHelper.getPreference(AUTO_DELETE_DURATION_RECORDS_KEY))
-                .thenReturn(String.valueOf(30));
-        when(RecordHelperProvider.getRecordHelpers()).thenReturn(getRecordHelpers());
-
-        AutoDeleteService.startAutoDelete(
-                mContext,
-                mHealthConnectInjector.getHealthDataCategoryPriorityHelper(),
-                mHealthConnectInjector.getPreferenceHelper(),
-                mHealthConnectInjector.getAppInfoHelper(),
-                mHealthConnectInjector.getTransactionManager(),
-                mHealthConnectInjector.getAccessLogsHelper());
-
-        verify(mTransactionManager, Mockito.times(2))
-                .deleteWithoutChangeLogs(
-                        Mockito.argThat(
-                                requestList ->
-                                        checkTableNames_getPreferenceReturnNonNull(requestList)));
-        verify(mTransactionManager)
-                .deleteAll(
-                        Mockito.argThat(
-                                request ->
-                                        checkTableNames_getPreferenceReturnNonNull(
-                                                request.getDeleteTableRequests())),
-                        Mockito.booleanThat(
-                                shouldRecordDeleteAccessLog -> !shouldRecordDeleteAccessLog),
-                        any());
-        verify(mAppInfoHelper).syncAppInfoRecordTypesUsed();
-        verify(mHealthDataCategoryPriorityHelper).reSyncHealthDataPriorityTable(mContext);
-        ExtendedMockito.verify(ActivityDateHelper::reSyncForAllRecords, times(1));
-    }
-
-    private boolean checkTableNames_getPreferenceReturnNull(List<DeleteTableRequest> list) {
-        Set<String> tableNames = new HashSet<>();
-        for (DeleteTableRequest request : list) {
-            tableNames.add(request.getTableName());
-        }
-        return (tableNames.equals(getTableNamesForDeletingStaleChangeLogEntries())
-                || tableNames.equals(getTableNamesForDeletingStaleAccessLogsEntries()));
-    }
-
-    private boolean checkTableNames_getPreferenceReturnNonNull(List<DeleteTableRequest> list) {
-        Set<String> tableNames = new HashSet<>();
-        for (DeleteTableRequest request : list) {
-            tableNames.add(request.getTableName());
-        }
-        return (tableNames.equals(getTableNamesForDeletingStaleChangeLogEntries())
-                || tableNames.equals(getTableNamesForDeletingStaleAccessLogsEntries())
-                || tableNames.equals(getTableNamesForDeletingStaleRecordEntries()));
-    }
-
-    private Map<Integer, RecordHelper<?>> getRecordHelpers() {
-        Map<Integer, RecordHelper<?>> recordIDToHelperMap = new ArrayMap<>();
-        recordIDToHelperMap.put(RecordTypeIdentifier.RECORD_TYPE_STEPS, new StepsRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_DISTANCE, new DistanceRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_ELEVATION_GAINED,
-                new ElevationGainedRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_ACTIVE_CALORIES_BURNED,
-                new ActiveCaloriesBurnedRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_FLOORS_CLIMBED, new FloorsClimbedRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_HYDRATION, new HydrationRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_NUTRITION, new NutritionRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_WHEELCHAIR_PUSHES,
-                new WheelchairPushesRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_TOTAL_CALORIES_BURNED,
-                new TotalCaloriesBurnedRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_HEART_RATE, new HeartRateRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_BASAL_METABOLIC_RATE,
-                new BasalMetabolicRateRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_CYCLING_PEDALING_CADENCE,
-                new CyclingPedalingCadenceRecordHelper());
-        recordIDToHelperMap.put(RecordTypeIdentifier.RECORD_TYPE_POWER, new PowerRecordHelper());
-        recordIDToHelperMap.put(RecordTypeIdentifier.RECORD_TYPE_SPEED, new SpeedRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_STEPS_CADENCE, new StepsCadenceRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_MENSTRUATION_FLOW,
-                new MenstruationFlowRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_LEAN_BODY_MASS, new LeanBodyMassRecordHelper());
-        recordIDToHelperMap.put(RecordTypeIdentifier.RECORD_TYPE_HEIGHT, new HeightRecordHelper());
-
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_OVULATION_TEST, new OvulationTestRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_CERVICAL_MUCUS, new CervicalMucusRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_BODY_TEMPERATURE,
-                new BodyTemperatureRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_BONE_MASS, new BoneMassRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE, new BloodPressureRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_BODY_FAT, new BodyFatRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_BLOOD_GLUCOSE, new BloodGlucoseRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_BASAL_BODY_TEMPERATURE,
-                new BasalBodyTemperatureRecordHelper());
-        recordIDToHelperMap.put(RecordTypeIdentifier.RECORD_TYPE_VO2_MAX, new Vo2MaxRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_SEXUAL_ACTIVITY, new SexualActivityRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_RESPIRATORY_RATE,
-                new RespiratoryRateRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_RESTING_HEART_RATE,
-                new RestingHeartRateRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_OXYGEN_SATURATION,
-                new OxygenSaturationRecordHelper());
-        recordIDToHelperMap.put(RecordTypeIdentifier.RECORD_TYPE_WEIGHT, new WeightRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_BODY_WATER_MASS, new BodyWaterMassRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_HEART_RATE_VARIABILITY_RMSSD,
-                new HeartRateVariabilityRmssdHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_INTERMENSTRUAL_BLEEDING,
-                new IntermenstrualBleedingRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_MENSTRUATION_PERIOD,
-                new MenstruationPeriodRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION,
-                new ExerciseSessionRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_SLEEP_SESSION, new SleepSessionRecordHelper());
-        recordIDToHelperMap.put(
-                RecordTypeIdentifier.RECORD_TYPE_SKIN_TEMPERATURE,
-                new SkinTemperatureRecordHelper());
-
-        recordIDToHelperMap = Collections.unmodifiableMap(recordIDToHelperMap);
-        return recordIDToHelperMap;
-    }
-
-    List<DeleteTableRequest> getDeleteTableRequests(int recordAutoDeletePeriod) {
-        List<DeleteTableRequest> deleteTableRequests = new ArrayList<>();
-
-        Map<Integer, RecordHelper<?>> recordIdToHelperMap = getRecordHelpers();
-        recordIdToHelperMap
-                .values()
-                .forEach(
-                        (recordHelper) -> {
-                            DeleteTableRequest request =
-                                    recordHelper.getDeleteRequestForAutoDelete(
-                                            recordAutoDeletePeriod);
-                            deleteTableRequests.add(request);
-                        });
-
-        return deleteTableRequests;
-    }
-
-    Set<String> getTableNamesForDeletingStaleRecordEntries() {
-        Set<String> tableNames = new HashSet<>();
-
-        for (DeleteTableRequest deleteTableRequest : getDeleteTableRequests(30)) {
-            tableNames.add(deleteTableRequest.getTableName());
-        }
-
-        return tableNames;
-    }
-
-    Set<String> getTableNamesForDeletingStaleChangeLogEntries() {
-        Set<String> tableNames = new HashSet<>();
-
-        tableNames.add(ChangeLogsHelper.getDeleteRequestForAutoDelete().getTableName());
-        tableNames.add(ChangeLogsRequestHelper.getDeleteRequestForAutoDelete().getTableName());
-
-        return tableNames;
-    }
-
-    Set<String> getTableNamesForDeletingStaleAccessLogsEntries() {
-        Set<String> tableNames = new HashSet<>();
-
-        tableNames.add(AccessLogsHelper.getDeleteRequestForAutoDelete().getTableName());
-
-        return tableNames;
-    }
-}
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/DailyCleanupJobTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/DailyCleanupJobTest.java
new file mode 100644
index 0000000..98e302c
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/DailyCleanupJobTest.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package healthconnect.storage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.Process;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.exportimport.ExportManager;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.migration.MigrationUiStateManager;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.DailyCleanupJob;
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ActivityDateHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.storage.request.DeleteTableRequest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+public class DailyCleanupJobTest {
+    private static final String AUTO_DELETE_DURATION_RECORDS_KEY =
+            "auto_delete_duration_records_key";
+
+    @Rule
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(PreferenceHelper.class)
+                    .mockStatic(TransactionManager.class)
+                    .mockStatic(AppInfoHelper.class)
+                    .mockStatic(ActivityDateHelper.class)
+                    .build();
+
+    @Mock private PreferenceHelper mPreferenceHelper;
+    @Mock private TransactionManager mTransactionManager;
+    @Mock private ExportManager mExportManager;
+
+    @Mock private AppInfoHelper mAppInfoHelper;
+    @Mock private HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
+    @Mock private ActivityDateHelper mActivityDateHelper;
+    @Mock private MigrationUiStateManager mMigrationUiStateManager;
+    @Mock Context mContext;
+
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
+    private HealthConnectInjector mHealthConnectInjector;
+    private DailyCleanupJob mDailyCleanupJob;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+
+        when(mContext.getUser()).thenReturn(Process.myUserHandle());
+        mHealthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(mContext)
+                        .setHealthDataCategoryPriorityHelper(mHealthDataCategoryPriorityHelper)
+                        .setPreferenceHelper(mPreferenceHelper)
+                        .setExportManager(mExportManager)
+                        .setTransactionManager(mTransactionManager)
+                        .setMigrationUiStateManager(mMigrationUiStateManager)
+                        .setAppInfoHelper(mAppInfoHelper)
+                        .setActivityDateHelper(mActivityDateHelper)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .build();
+        mDailyCleanupJob = mHealthConnectInjector.getDailyCleanupJob();
+    }
+
+    @Test
+    public void testStartDailyCleanup_getPreferenceReturnNull() {
+        when(mPreferenceHelper.getPreference(AUTO_DELETE_DURATION_RECORDS_KEY)).thenReturn(null);
+
+        mDailyCleanupJob.startDailyCleanup();
+
+        verify(mTransactionManager, Mockito.times(2))
+                .deleteWithoutChangeLogs(
+                        Mockito.argThat(this::checkTableNames_getPreferenceReturnNull));
+        verify(mAppInfoHelper).syncAppInfoRecordTypesUsed();
+        verify(mHealthDataCategoryPriorityHelper).reSyncHealthDataPriorityTable();
+        verify(mActivityDateHelper, times(1)).reSyncForAllRecords();
+    }
+
+    @Test
+    public void testStartDailyCleanup_getPreferenceReturnNonNull() {
+        when(mPreferenceHelper.getPreference(AUTO_DELETE_DURATION_RECORDS_KEY))
+                .thenReturn(String.valueOf(30));
+
+        mDailyCleanupJob.startDailyCleanup();
+
+        verify(mTransactionManager, Mockito.times(2))
+                .deleteWithoutChangeLogs(
+                        Mockito.argThat(this::checkTableNames_getPreferenceReturnNonNull));
+        verify(mTransactionManager)
+                .deleteAllRecords(
+                        Mockito.argThat(
+                                request ->
+                                        checkTableNames_getPreferenceReturnNonNull(
+                                                request.getDeleteTableRequests())),
+                        Mockito.booleanThat(
+                                shouldRecordDeleteAccessLog -> !shouldRecordDeleteAccessLog),
+                        any());
+        verify(mAppInfoHelper).syncAppInfoRecordTypesUsed();
+        verify(mHealthDataCategoryPriorityHelper).reSyncHealthDataPriorityTable();
+        verify(mActivityDateHelper, times(1)).reSyncForAllRecords();
+    }
+
+    private boolean checkTableNames_getPreferenceReturnNull(List<DeleteTableRequest> list) {
+        Set<String> tableNames = new HashSet<>();
+        for (DeleteTableRequest request : list) {
+            tableNames.add(request.getTableName());
+        }
+        return (tableNames.equals(getTableNamesForDeletingStaleChangeLogEntries())
+                || tableNames.equals(getTableNamesForDeletingStaleAccessLogsEntries()));
+    }
+
+    private boolean checkTableNames_getPreferenceReturnNonNull(List<DeleteTableRequest> list) {
+        Set<String> tableNames = new HashSet<>();
+        for (DeleteTableRequest request : list) {
+            tableNames.add(request.getTableName());
+        }
+        return (tableNames.equals(getTableNamesForDeletingStaleChangeLogEntries())
+                || tableNames.equals(getTableNamesForDeletingStaleAccessLogsEntries())
+                || tableNames.equals(getTableNamesForDeletingStaleRecordEntries()));
+    }
+
+    List<DeleteTableRequest> getDeleteTableRequests(int recordAutoDeletePeriod) {
+        List<DeleteTableRequest> deleteTableRequests = new ArrayList<>();
+
+        mHealthConnectInjector
+                .getInternalHealthConnectMappings()
+                .getRecordHelpers()
+                .forEach(
+                        (recordHelper) -> {
+                            DeleteTableRequest request =
+                                    recordHelper.getDeleteRequestForAutoDelete(
+                                            recordAutoDeletePeriod);
+                            deleteTableRequests.add(request);
+                        });
+
+        return deleteTableRequests;
+    }
+
+    Set<String> getTableNamesForDeletingStaleRecordEntries() {
+        Set<String> tableNames = new HashSet<>();
+
+        for (DeleteTableRequest deleteTableRequest : getDeleteTableRequests(30)) {
+            tableNames.add(deleteTableRequest.getTableName());
+        }
+
+        return tableNames;
+    }
+
+    Set<String> getTableNamesForDeletingStaleChangeLogEntries() {
+        Set<String> tableNames = new HashSet<>();
+
+        tableNames.add(ChangeLogsHelper.getDeleteRequestForAutoDelete().getTableName());
+        tableNames.add(ChangeLogsRequestHelper.getDeleteRequestForAutoDelete().getTableName());
+
+        return tableNames;
+    }
+
+    Set<String> getTableNamesForDeletingStaleAccessLogsEntries() {
+        Set<String> tableNames = new HashSet<>();
+
+        tableNames.add(AccessLogsHelper.getDeleteRequestForAutoDelete().getTableName());
+
+        return tableNames;
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/DatabaseUpgradeHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/DatabaseUpgradeHelperTest.java
index 039c29e..26091b8 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/DatabaseUpgradeHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/DatabaseUpgradeHelperTest.java
@@ -16,6 +16,9 @@
 
 package com.android.server.healthconnect.storage;
 
+import static android.database.DatabaseUtils.queryNumEntries;
+
+import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_ECOSYSTEM_METRICS;
 import static com.android.healthfitness.flags.DatabaseVersions.DB_VERSION_MINDFULNESS_SESSION;
 import static com.android.healthfitness.flags.DatabaseVersions.MIN_SUPPORTED_DB_VERSION;
 import static com.android.healthfitness.flags.Flags.FLAG_INFRA_TO_GUARD_DB_CHANGES;
@@ -24,12 +27,19 @@
 import static com.android.server.healthconnect.storage.DatabaseTestUtils.createEmptyDatabase;
 import static com.android.server.healthconnect.storage.DatabaseUpgradeHelper.onUpgrade;
 
+import static com.google.common.truth.Truth.assertThat;
+
+import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.FlagsParameterization;
 import android.platform.test.flag.junit.SetFlagsRule;
 
-import java.util.List;
+import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ReadAccessLogsHelper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -40,6 +50,8 @@
 import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
 import platform.test.runner.parameterized.Parameters;
 
+import java.util.List;
+
 @RunWith(ParameterizedAndroidJunit4.class)
 public class DatabaseUpgradeHelperTest {
     @Rule public final SetFlagsRule mSetFlagsRule;
@@ -55,8 +67,8 @@
 
     private static final int NUM_OF_TABLES_AT_MIN_SUPPORTED_VERSION = 57;
     private static final int NUM_OF_TABLES_AT_MINDFULNESS_VERSION = 64;
-    private static final int NUM_OF_TABLES_IN_STAGING = 64;
-    private static final int LATEST_DB_VERSION_IN_STAGING = DB_VERSION_MINDFULNESS_SESSION;
+    private static final int NUM_OF_TABLES_IN_STAGING = 69;
+    private static final int LATEST_DB_VERSION_IN_STAGING = DB_VERSION_ECOSYSTEM_METRICS;
 
     private SQLiteDatabase mSQLiteDatabase;
 
@@ -114,5 +126,41 @@
      */
     private void assertDbSchemaUpToDate() {
         assertNumberOfTables(mSQLiteDatabase, NUM_OF_TABLES_IN_STAGING);
+
+        // PHR
+        assertTablesExists(
+                mSQLiteDatabase,
+                List.of(
+                        MedicalDataSourceHelper.getMainTableName(),
+                        MedicalResourceHelper.getMainTableName(),
+                        MedicalResourceIndicesHelper.getTableName(),
+                        ReadAccessLogsHelper.TABLE_NAME));
+        assertColumnsExist(
+                mSQLiteDatabase,
+                AccessLogsHelper.TABLE_NAME,
+                List.of("medical_resource_type", "medical_data_source_accessed"));
+    }
+
+    /** Asserts that a list of {@code columns} exist in the specified {@code table}. */
+    private static void assertColumnsExist(SQLiteDatabase db, String table, List<String> columns) {
+        try (Cursor cursor =
+                db.rawQuery("SELECT * FROM " + table + " LIMIT 1", /* selectArgs */ null)) {
+            for (String column : columns) {
+                assertThat(cursor.getColumnIndex(column)).isNotEqualTo(-1);
+            }
+        }
+    }
+
+    /** Asserts that a list of {@code tables} exist. */
+    private static void assertTablesExists(SQLiteDatabase db, List<String> tables) {
+        for (String table : tables) {
+            long numEntries =
+                    queryNumEntries(
+                            db,
+                            "sqlite_master",
+                            /* selection= */ "type = 'table' AND name == '" + table + "'",
+                            /* selectionArgs= */ null);
+            assertThat(numEntries).isGreaterThan(0);
+        }
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/DevelopmentDatabaseHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/DevelopmentDatabaseHelperTest.java
index b438c44..95b7d16 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/DevelopmentDatabaseHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/DevelopmentDatabaseHelperTest.java
@@ -21,13 +21,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.junit.Assert.assertThrows;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.when;
-
 import android.content.Context;
-import android.database.Cursor;
-import android.database.SQLException;
 import android.database.sqlite.SQLiteDatabase;
 import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
@@ -36,23 +30,19 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
-import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
-import com.android.server.healthconnect.storage.request.ReadTableRequest;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
 
 import com.google.common.base.Preconditions;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.quality.Strictness;
 
 import java.io.File;
-import java.util.List;
-import java.util.UUID;
 
 @RunWith(AndroidJUnit4.class)
 public class DevelopmentDatabaseHelperTest {
@@ -61,27 +51,23 @@
             new SQLiteDatabase.OpenParams.Builder()
                     .setOpenFlags(SQLiteDatabase.OPEN_READONLY)
                     .build();
-    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
-    @Mock Context mContext;
+    private StorageContext mStorageContext;
 
-    private File mDatabasePath;
+    @Rule(order = 0)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 1)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .setStrictness(Strictness.LENIENT)
+                    .build();
 
     @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mDatabasePath = getMockDatabasePath();
-        DatabaseTestUtils.clearDatabase(mDatabasePath);
-        when(mContext.getDatabasePath(anyString())).thenReturn(mDatabasePath);
-    }
-
-    @After
-    public void clearDatabase() {
-        DatabaseTestUtils.clearDatabase(getMockDatabasePath());
-    }
-
-    private static File getMockDatabasePath() {
-        return InstrumentationRegistry.getInstrumentation().getContext().getDatabasePath("mock");
+    public void setup() {
+        Context context = InstrumentationRegistry.getInstrumentation().getContext();
+        mStorageContext = StorageContext.create(context, context.getUser());
     }
 
     @Test
@@ -91,7 +77,7 @@
         // database that can't be fixed after switching the flag on or off.
         // Test this is true by running onOpen twice, dropping the version in between.
 
-        try (HealthConnectDatabase helper = new HealthConnectDatabase(mContext)) {
+        try (HealthConnectDatabase helper = new HealthConnectDatabase(mStorageContext)) {
             // make sure a database file exists
             SQLiteDatabase db = helper.getWritableDatabase();
             // Drop the settings table to make sure the update code is run completely a second time.
@@ -105,17 +91,19 @@
     @EnableFlags(FLAG_DEVELOPMENT_DATABASE)
     public void testOnOpen_readOnlyDatabase_successful() {
         // GIVEN we have a guaranteed read only database.
-        try (HealthConnectDatabase helper = new HealthConnectDatabase(mContext)) {
+        File databaseFile;
+        try (HealthConnectDatabase helper = new HealthConnectDatabase(mStorageContext)) {
             // make sure a database file exists
             helper.getWritableDatabase();
+            databaseFile = helper.getDatabasePath();
         }
         // Change it to read only
-        Preconditions.checkState(mDatabasePath.setReadOnly());
+        Preconditions.checkState(databaseFile.setReadOnly());
         // Check the above code works
-        Preconditions.checkState(mDatabasePath.canRead());
-        Preconditions.checkState(!mDatabasePath.canWrite());
+        Preconditions.checkState(databaseFile.canRead());
+        Preconditions.checkState(!databaseFile.canWrite());
         try (SQLiteDatabase readOnlyDatabase =
-                SQLiteDatabase.openDatabase(mDatabasePath, READ_ONLY)) {
+                SQLiteDatabase.openDatabase(databaseFile, READ_ONLY)) {
             Preconditions.checkState(readOnlyDatabase.isReadOnly());
 
             // WHEN we call onOpen on the read only database THEN there are no errors.
@@ -149,7 +137,7 @@
     @Test
     @EnableFlags(FLAG_DEVELOPMENT_DATABASE)
     public void testDropAndCreateDevelopmentSettings_existent_overwrites() {
-        try (HealthConnectDatabase helper = new HealthConnectDatabase(mContext)) {
+        try (HealthConnectDatabase helper = new HealthConnectDatabase(mStorageContext)) {
             // getWriteableDatabase() triggers onOpen(), so the dev database with
             // version CURRENT_VERSION should be created.
             SQLiteDatabase db = helper.getWritableDatabase();
@@ -164,9 +152,9 @@
     @Test
     @DisableFlags(FLAG_DEVELOPMENT_DATABASE)
     public void testOnOpen_notDevelopment_deletesDevelopmentTables() {
-        try (HealthConnectDatabase helper = new HealthConnectDatabase(mContext)) {
+        try (HealthConnectDatabase helper = new HealthConnectDatabase(mStorageContext)) {
             // Calling getWritableDatabase() triggers onOpen(). With the flag off,
-            // should delete the development database, and not create the PHR one.
+            // should delete the development database.
             SQLiteDatabase db = helper.getWritableDatabase();
             // Now the development database should not be present.
             // Create a table that looks like some old development settings.
@@ -186,8 +174,6 @@
     @Test
     @EnableFlags(FLAG_DEVELOPMENT_DATABASE)
     public void testOnOpen_isDevelopmentHasDevelopmentTables_noChange() {
-        // Make the bad condition that the development settings version looks good, but the PHR
-        // database has not been created.
         // GIVEN we have some current development database settings, and the flags are enabled
         try (SQLiteDatabase db = createEmptyDatabase()) {
             DevelopmentDatabaseHelper.dropAndCreateDevelopmentSettingsTable(
@@ -196,15 +182,9 @@
             // WHEN onOpen is called
             DevelopmentDatabaseHelper.onOpen(db);
 
-            // THEN the settings table should be left, and nothing changed (ie PHR not created)
+            // THEN the settings table should be left, and nothing changed
             assertThat(DevelopmentDatabaseHelper.getOldVersionIfExists(db))
                     .isEqualTo(DevelopmentDatabaseHelper.CURRENT_VERSION);
-            // Check PHR not created
-            assertThrows(
-                    SQLException.class,
-                    () -> {
-                        usePhrDataSourceTable(db);
-                    });
         }
     }
 
@@ -214,45 +194,11 @@
         try (SQLiteDatabase db = createEmptyDatabase()) {
             DevelopmentDatabaseHelper.dropAndCreateDevelopmentSettingsTable(
                     db, DevelopmentDatabaseHelper.CURRENT_VERSION - 1);
-            // We need to create access_logs_table, since we are altering the table
-            // in onOpen.
-            HealthConnectDatabase.createTable(db, AccessLogsHelper.getCreateTableRequest());
 
             DevelopmentDatabaseHelper.onOpen(db);
 
             assertThat(DevelopmentDatabaseHelper.getOldVersionIfExists(db))
                     .isEqualTo(DevelopmentDatabaseHelper.CURRENT_VERSION);
-            // Check PHR is created
-            usePhrDataSourceTable(db);
-            usePhrAccessLogsColumns(db);
-        }
-    }
-
-    /**
-     * Check that the PHR tables were created on a database by attempting to read a random UUID
-     * datasource. If the table doesn't exist we expect an SQLException, if the table does exist
-     * nothing should happen.
-     */
-    private static void usePhrDataSourceTable(SQLiteDatabase db) {
-        UUID uuid = UUID.randomUUID();
-        ReadTableRequest request = MedicalDataSourceHelper.getReadTableRequest(List.of(uuid));
-        try (Cursor cursor = db.rawQuery(request.getReadCommand(), new String[] {})) {
-            assertThat(cursor.getCount()).isEqualTo(0);
-        }
-    }
-
-    /**
-     * Check that the PHR columns for access logs were added to the {@link
-     * AccessLogsHelper#TABLE_NAME}. If the columns don't exist we expect an SQLException, if the
-     * columns do exist nothing should happen.
-     */
-    private static void usePhrAccessLogsColumns(SQLiteDatabase db) {
-        try (Cursor cursor =
-                db.rawQuery(
-                        "SELECT medical_resource_type, medical_data_source_accessed FROM"
-                                + " access_logs_table",
-                        new String[] {})) {
-            assertThat(cursor.getCount()).isEqualTo(0);
         }
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/ExportImportSettingsStorageTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/ExportImportSettingsStorageTest.java
index 0914ff8..3db1de2 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/ExportImportSettingsStorageTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/ExportImportSettingsStorageTest.java
@@ -86,7 +86,6 @@
     public void setUp() throws RemoteException {
         mExportImportSettingsStorage = new ExportImportSettingsStorage(mFakePreferenceHelper);
 
-        when(PreferenceHelper.getInstance()).thenReturn(mFakePreferenceHelper);
         when(mContext.getContentResolver()).thenReturn(mContentResolver);
         when(mContentResolver.acquireUnstableContentProviderClient(any(Uri.class)))
                 .thenReturn(mContentProviderClient);
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/HealthConnectDatabaseTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/HealthConnectDatabaseTest.java
index 2711d5a..89f1ae4 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/HealthConnectDatabaseTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/HealthConnectDatabaseTest.java
@@ -16,64 +16,244 @@
 
 package com.android.server.healthconnect.storage;
 
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_STEPS;
+import static android.healthconnect.cts.utils.DataFactory.NOW;
+
 import static com.android.healthfitness.flags.DatabaseVersions.LAST_ROLLED_OUT_DB_VERSION;
+import static com.android.healthfitness.flags.Flags.FLAG_ACTIVITY_INTENSITY_DB;
+import static com.android.healthfitness.flags.Flags.FLAG_DEVELOPMENT_DATABASE;
+import static com.android.healthfitness.flags.Flags.FLAG_INFRA_TO_GUARD_DB_CHANGES;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
 import static com.android.server.healthconnect.storage.DatabaseTestUtils.NUM_OF_TABLES;
 import static com.android.server.healthconnect.storage.DatabaseTestUtils.assertNumberOfTables;
+import static com.android.server.healthconnect.storage.utils.StorageUtils.checkTableExists;
 
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.mock;
 
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.StepsRecord;
+import android.health.connect.internal.datatypes.RecordInternal;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
 import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.healthfitness.flags.AconfigFlagHelper;
 import com.android.healthfitness.flags.Flags;
-
-import com.google.common.base.Preconditions;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.logging.ExportImportLogger;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.quality.Strictness;
 
 import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
 
 public class HealthConnectDatabaseTest {
-    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
-    @Mock Context mContext;
-    private HealthConnectDatabase mHealthConnectDatabase;
-    private SQLiteDatabase mSQLiteDatabase;
+    private static final String TEST_PACKAGE_NAME = "package.test";
+
+    private Context mContext;
+
+    @Rule(order = 0)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 1)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .mockStatic(ExportImportLogger.class)
+                    .setStrictness(Strictness.LENIENT)
+                    .addStaticMockFixtures(EnvironmentFixture::new)
+                    .build();
 
     @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mContext.getDatabasePath(anyString()))
-                .thenReturn(
-                        InstrumentationRegistry.getInstrumentation()
-                                .getContext()
-                                .getDatabasePath("mock"));
-        mHealthConnectDatabase = new HealthConnectDatabase(mContext);
-
-        // Make sure there is nothing there already.
-        File databasePath = mHealthConnectDatabase.getDatabasePath();
-        if (databasePath.exists()) {
-            Preconditions.checkState(databasePath.delete());
-        }
-        mSQLiteDatabase = mHealthConnectDatabase.getWritableDatabase();
+    public void setup() {
+        mContext = InstrumentationRegistry.getInstrumentation().getContext();
     }
 
     @Test
-    @DisableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @DisableFlags({
+        FLAG_DEVELOPMENT_DATABASE,
+        FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        FLAG_ACTIVITY_INTENSITY_DB,
+        Flags.FLAG_ECOSYSTEM_METRICS_DB_CHANGES
+    })
     public void onCreate_dbWithLatestSchemaCreated() {
-        assertThat(mHealthConnectDatabase).isNotNull();
-        assertThat(mSQLiteDatabase).isNotNull();
-        assertNumberOfTables(mSQLiteDatabase, NUM_OF_TABLES);
-        assertThat(mSQLiteDatabase.getVersion()).isEqualTo(LAST_ROLLED_OUT_DB_VERSION);
+        SQLiteDatabase sqliteDatabase =
+                initializeEmptyHealthConnectDatabase().getWritableDatabase();
+
+        assertThat(sqliteDatabase).isNotNull();
+        assertNumberOfTables(sqliteDatabase, NUM_OF_TABLES);
+        assertThat(sqliteDatabase.getVersion()).isEqualTo(LAST_ROLLED_OUT_DB_VERSION);
+    }
+
+    @Test
+    @DisableFlags(FLAG_INFRA_TO_GUARD_DB_CHANGES)
+    public void onCreate_infraFlagDisabled_expectCorrectDbVersion() {
+        SQLiteDatabase sqliteDatabase =
+                initializeEmptyHealthConnectDatabase().getWritableDatabase();
+
+        assertThat(sqliteDatabase.getVersion()).isAtMost(AconfigFlagHelper.getDbVersion());
+    }
+
+    @Test
+    @EnableFlags(FLAG_INFRA_TO_GUARD_DB_CHANGES)
+    public void onCreate_infraFlagEnabled_expectCorrectDbVersion() {
+        SQLiteDatabase sqliteDatabase =
+                initializeEmptyHealthConnectDatabase().getWritableDatabase();
+
+        assertThat(sqliteDatabase.getVersion()).isAtMost(AconfigFlagHelper.getDbVersion());
+    }
+
+    @Test
+    public void upgradeToPhrWithExistingHcData_expectExistingDataIntact() {
+        // Disable the flag with `disableFlags()` so it can be enabled later in this test. That's
+        // not allowed if FLAG_PERSONAL_HEALTH_RECORD_DATABASE is added to @DisableFlags.
+        mSetFlagsRule.disableFlags(FLAG_PERSONAL_HEALTH_RECORD_DATABASE);
+        HealthConnectInjector injector = getHealthConnectInjector(mContext);
+        TransactionManager transactionManager = injector.getTransactionManager();
+        TransactionTestUtils transactionTestUtils = new TransactionTestUtils(injector);
+        // insert a StepsRecord with TEST_PACKAGE_NAME
+        transactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+        RecordInternal<StepsRecord> originalStepsRecordInternal =
+                TransactionTestUtils.createStepsRecord(
+                        NOW.toEpochMilli(), NOW.plusMillis(1000).toEpochMilli(), 2);
+        List<UUID> originalStepsRecordUuids =
+                transactionTestUtils
+                        .insertRecords(TEST_PACKAGE_NAME, originalStepsRecordInternal)
+                        .stream()
+                        .map(UUID::fromString)
+                        .toList();
+        assertPhrTablesNotExist(transactionManager);
+
+        // Enable the flag and re-initialize all dependencies including TransactionManager.
+        // When a new TransactionManager is created, it will recreate HealthConnectDatabase. Then
+        // When a transaction is executed on that database for the first time, the new value of the
+        // flag will be taken into account.
+        mSetFlagsRule.enableFlags(FLAG_PERSONAL_HEALTH_RECORD_DATABASE);
+        injector = getHealthConnectInjector(mContext);
+        transactionManager = injector.getTransactionManager();
+        transactionTestUtils = new TransactionTestUtils(injector);
+
+        assertPhrTablesExist(transactionManager);
+        // read the StepsRecord and assert that it's intact
+        List<RecordInternal<?>> recordInternals =
+                transactionManager.readRecordsByIds(
+                        transactionTestUtils.getReadTransactionRequest(
+                                TEST_PACKAGE_NAME,
+                                Map.of(RECORD_TYPE_STEPS, originalStepsRecordUuids)),
+                        injector.getAppInfoHelper(),
+                        injector.getAccessLogsHelper(),
+                        injector.getDeviceInfoHelper(),
+                        false);
+        assertThat(recordInternals).hasSize(1);
+        assertThat(recordInternals.get(0).toExternalRecord())
+                .isEqualTo(originalStepsRecordInternal.toExternalRecord());
+    }
+
+    @Test
+    public void upgradeToPhrWithExistingHcData_expectPhrFunctionsWorkProperly() {
+        // Disable the flag with `disableFlags()` so it can be enabled later in this test. That's
+        // not allowed if FLAG_PERSONAL_HEALTH_RECORD_DATABASE is added to @DisableFlags.
+        mSetFlagsRule.disableFlags(FLAG_PERSONAL_HEALTH_RECORD_DATABASE);
+        HealthConnectInjector injector = getHealthConnectInjector(mContext);
+        TransactionManager transactionManager = injector.getTransactionManager();
+        TransactionTestUtils transactionTestUtils = new TransactionTestUtils(injector);
+        // insert a StepsRecord with TEST_PACKAGE_NAME
+        transactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+        RecordInternal<StepsRecord> originalStepsRecordInternal =
+                TransactionTestUtils.createStepsRecord(
+                        NOW.toEpochMilli(), NOW.plusMillis(1000).toEpochMilli(), 2);
+        transactionTestUtils.insertRecords(TEST_PACKAGE_NAME, originalStepsRecordInternal);
+        assertPhrTablesNotExist(transactionManager);
+
+        // Enable the flag and re-initialize all dependencies including TransactionManager.
+        // When a new TransactionManager is created, it will recreate HealthConnectDatabase. Then
+        // When a transaction is executed on that database for the first time, the new value of the
+        // flag will be taken into account.
+        mSetFlagsRule.enableFlags(FLAG_PERSONAL_HEALTH_RECORD_DATABASE);
+        injector = getHealthConnectInjector(mContext);
+        transactionManager = injector.getTransactionManager();
+
+        assertPhrTablesExist(transactionManager);
+        // PHR functions should work properly.
+        MedicalDataSourceHelper medicalDataSourceHelper = injector.getMedicalDataSourceHelper();
+        MedicalDataSource originalMedicalDataSource =
+                medicalDataSourceHelper.createMedicalDataSource(
+                        mContext,
+                        PhrDataFactory.getCreateMedicalDataSourceRequest(),
+                        TEST_PACKAGE_NAME);
+        List<MedicalDataSource> readMedicalDataSources =
+                medicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
+                        List.of(UUID.fromString(originalMedicalDataSource.getId())));
+        assertThat(readMedicalDataSources).hasSize(1);
+        assertThat(originalMedicalDataSource).isEqualTo(readMedicalDataSources.get(0));
+    }
+
+    // The database needs to be initialized after the flags have been set by the annotations,
+    // hence this methods needs to be called in individual tests rather than in @Before method.
+    private HealthConnectDatabase initializeEmptyHealthConnectDatabase() {
+        HealthConnectDatabase healthConnectDatabase =
+                new HealthConnectDatabase(StorageContext.create(mContext, mContext.getUser()));
+
+        // Make sure there is nothing there already.
+        File databasePath = healthConnectDatabase.getDatabasePath();
+        if (databasePath.exists()) {
+            checkState(databasePath.delete());
+        }
+
+        return healthConnectDatabase;
+    }
+
+    private static void assertPhrTablesExist(TransactionManager transactionManager) {
+        transactionManager.runAsTransaction(
+                db -> {
+                    assertThat(checkTableExists(db, MedicalDataSourceHelper.getMainTableName()))
+                            .isTrue();
+                    assertThat(checkTableExists(db, MedicalResourceHelper.getMainTableName()))
+                            .isTrue();
+                    assertThat(checkTableExists(db, MedicalResourceIndicesHelper.getTableName()))
+                            .isTrue();
+                });
+    }
+
+    private static void assertPhrTablesNotExist(TransactionManager transactionManager) {
+        transactionManager.runAsTransaction(
+                db -> {
+                    assertThat(checkTableExists(db, MedicalDataSourceHelper.getMainTableName()))
+                            .isFalse();
+                    assertThat(checkTableExists(db, MedicalResourceHelper.getMainTableName()))
+                            .isFalse();
+                    assertThat(checkTableExists(db, MedicalResourceIndicesHelper.getTableName()))
+                            .isFalse();
+                });
+    }
+
+    private static HealthConnectInjector getHealthConnectInjector(Context context) {
+        return HealthConnectInjectorImpl.newBuilderForTest(context)
+                .setHealthPermissionIntentAppsTracker(mock(HealthPermissionIntentAppsTracker.class))
+                .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                .build();
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/NoMockAutoDeleteServiceTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/NoMockDailyCleanupJobTest.java
similarity index 65%
rename from tests/unittests/src/com/android/server/healthconnect/storage/NoMockAutoDeleteServiceTest.java
rename to tests/unittests/src/com/android/server/healthconnect/storage/NoMockDailyCleanupJobTest.java
index 607988a..5afba17 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/NoMockAutoDeleteServiceTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/NoMockDailyCleanupJobTest.java
@@ -21,71 +21,75 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.content.Context;
 import android.database.Cursor;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.os.Environment;
+
+import androidx.test.core.app.ApplicationProvider;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
-import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.StepsRecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
 import java.util.List;
 import java.util.UUID;
 
-public class NoMockAutoDeleteServiceTest {
+public class NoMockDailyCleanupJobTest {
     @Rule(order = 1)
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule testRule = new HealthConnectDatabaseTestRule();
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
 
     private static final String TEST_PACKAGE_NAME = "package.name";
 
     private TransactionManager mTransactionManager;
     private TransactionTestUtils mTransactionTestUtils;
     private HealthConnectInjector mHealthConnectInjector;
+    private DailyCleanupJob mDailyCleanupJob;
+    private PreferencesManager mPreferencesManager;
 
     @Before
     public void setup() throws Exception {
-        PreferenceHelper.clearInstanceForTest();
-
-        HealthConnectUserContext context = testRule.getUserContext();
-        mTransactionManager = testRule.getTransactionManager();
-        DatabaseHelper.clearAllData(mTransactionManager);
-        mTransactionTestUtils = new TransactionTestUtils(context, mTransactionManager);
-        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
-        DeviceInfoHelper.resetInstanceForTest();
-        AppInfoHelper.resetInstanceForTest();
-
+        Context context = ApplicationProvider.getApplicationContext();
         mHealthConnectInjector =
                 HealthConnectInjectorImpl.newBuilderForTest(context)
-                        .setTransactionManager(mTransactionManager)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
                         .build();
+        mDailyCleanupJob = mHealthConnectInjector.getDailyCleanupJob();
+        mPreferencesManager = mHealthConnectInjector.getPreferencesManager();
+        mTransactionManager = mHealthConnectInjector.getTransactionManager();
+
+        mTransactionTestUtils = new TransactionTestUtils(mHealthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
     }
 
     @Test
-    public void startAutoDelete_changeLogsGenerated() {
+    public void startDailyCleanup_changeLogsGenerated() {
         String uuid =
                 mTransactionTestUtils
                         .insertRecords(TEST_PACKAGE_NAME, createStepsRecord(4000, 5000, 100))
@@ -101,19 +105,9 @@
             assertThat(records.get(0).getUuid()).isEqualTo(UUID.fromString(uuid));
         }
 
-        AutoDeleteService.setRecordRetentionPeriodInDays(
-                30, mHealthConnectInjector.getPreferenceHelper());
-        assertThat(
-                        AutoDeleteService.getRecordRetentionPeriodInDays(
-                                mHealthConnectInjector.getPreferenceHelper()))
-                .isEqualTo(30);
-        AutoDeleteService.startAutoDelete(
-                testRule.getUserContext(),
-                mHealthConnectInjector.getHealthDataCategoryPriorityHelper(),
-                mHealthConnectInjector.getPreferenceHelper(),
-                mHealthConnectInjector.getAppInfoHelper(),
-                mHealthConnectInjector.getTransactionManager(),
-                mHealthConnectInjector.getAccessLogsHelper());
+        mPreferencesManager.setRecordRetentionPeriodInDays(30);
+        assertThat(mPreferencesManager.getRecordRetentionPeriodInDays()).isEqualTo(30);
+        mDailyCleanupJob.startDailyCleanup();
 
         try (Cursor cursor = mTransactionManager.read(new ReadTableRequest(STEPS_TABLE_NAME))) {
             List<RecordInternal<?>> records =
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/PhrTestUtils.java b/tests/unittests/src/com/android/server/healthconnect/storage/PhrTestUtils.java
index 8e440b9..1477509 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/PhrTestUtils.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/PhrTestUtils.java
@@ -17,14 +17,17 @@
 package com.android.server.healthconnect.storage;
 
 import static android.health.connect.Constants.DEFAULT_LONG;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.health.connect.Constants.MAXIMUM_PAGE_SIZE;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
 
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.LAST_MODIFIED_TIME_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorLong;
 
 import android.content.Context;
 import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
 import android.health.connect.CreateMedicalDataSourceRequest;
 import android.health.connect.accesslog.AccessLog;
 import android.health.connect.datatypes.FhirResource;
@@ -32,16 +35,25 @@
 import android.health.connect.datatypes.MedicalDataSource;
 import android.health.connect.datatypes.MedicalResource;
 import android.net.Uri;
+import android.util.Pair;
 
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.phr.PhrPageTokenWrapper;
+import com.android.server.healthconnect.phr.ReadMedicalResourcesInternalResponse;
+import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceIndicesHelper;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.request.UpsertMedicalResourceInternalRequest;
 
 import com.google.common.truth.Correspondence;
 
+import java.time.Instant;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.UUID;
 
 public class PhrTestUtils {
     public static final Correspondence<AccessLog, AccessLog> ACCESS_LOG_EQUIVALENCE =
@@ -51,16 +63,14 @@
     private final MedicalResourceHelper mMedicalResourceHelper;
     private final TransactionManager mTransactionManager;
     private final Context mContext;
+    private final AppInfoHelper mAppInfoHelper;
 
-    public PhrTestUtils(
-            Context context,
-            TransactionManager transactionManager,
-            MedicalResourceHelper medicalResourceHelper,
-            MedicalDataSourceHelper medicalDataSourceHelper) {
+    public PhrTestUtils(Context context, HealthConnectInjector healthConnectInjector) {
         mContext = context;
-        mMedicalResourceHelper = medicalResourceHelper;
-        mMedicalDataSourceHelper = medicalDataSourceHelper;
-        mTransactionManager = transactionManager;
+        mMedicalResourceHelper = healthConnectInjector.getMedicalResourceHelper();
+        mMedicalDataSourceHelper = healthConnectInjector.getMedicalDataSourceHelper();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+        mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
     }
 
     /**
@@ -118,13 +128,16 @@
     /**
      * Insert and return a {@link MedicalDataSource} where the display name, and URI will contain
      * the given name.
+     *
+     * <p>The FHIR version is set to R4.
      */
-    public MedicalDataSource insertMedicalDataSource(String name, String packageName) {
+    public MedicalDataSource insertR4MedicalDataSource(String name, String packageName) {
         Uri uri = Uri.parse(String.format("%s/%s", DATA_SOURCE_FHIR_BASE_URI, name));
         String displayName = String.format("%s %s", DATA_SOURCE_DISPLAY_NAME, name);
 
         CreateMedicalDataSourceRequest createMedicalDataSourceRequest =
-                new CreateMedicalDataSourceRequest.Builder(uri, displayName).build();
+                new CreateMedicalDataSourceRequest.Builder(uri, displayName, FHIR_VERSION_R4)
+                        .build();
         return mMedicalDataSourceHelper.createMedicalDataSource(
                 mContext, createMedicalDataSourceRequest, packageName);
     }
@@ -170,4 +183,145 @@
                 && Objects.equals(actual.getRecordTypes(), expected.getRecordTypes())
                 && actual.isMedicalDataSourceAccessed() == expected.isMedicalDataSourceAccessed();
     }
+
+    /**
+     * Inserts a {@link MedicalDataSource} into the given {@link HealthConnectDatabase} using the
+     * given {@code name}, and {@code packageName}. It returns a pair of rowId of the inserted row
+     * and the generated uuid string of the {@link MedicalDataSource}.
+     */
+    public Pair<Long, String> insertMedicalDataSource(
+            HealthConnectDatabase healthConnectDatabase,
+            Context context,
+            String name,
+            String packageName,
+            Instant instant) {
+        SQLiteDatabase db = healthConnectDatabase.getWritableDatabase();
+        long appInfoId = mAppInfoHelper.getOrInsertAppInfoId(db, packageName);
+        if (appInfoId == DEFAULT_LONG) {
+            throw new IllegalStateException("App id does not exist");
+        }
+        MedicalDataSource dataSource =
+                new MedicalDataSource.Builder(
+                                UUID.randomUUID().toString(),
+                                packageName,
+                                Uri.parse(String.format("%s/%s", DATA_SOURCE_FHIR_BASE_URI, name)),
+                                String.format("%s %s", DATA_SOURCE_DISPLAY_NAME, name),
+                                FHIR_VERSION_R4)
+                        .build();
+        long rowId =
+                db.insertWithOnConflict(
+                        MedicalDataSourceHelper.getMainTableName(),
+                        /* nullColumnHack= */ null,
+                        MedicalDataSourceHelper.getContentValues(
+                                dataSource, appInfoId, instant.toEpochMilli()),
+                        SQLiteDatabase.CONFLICT_IGNORE);
+        return new Pair<>(rowId, dataSource.getId());
+    }
+
+    /**
+     * Inserts a {@code numOfResources} of {@link MedicalResource}s into the given {@link
+     * HealthConnectDatabase} using the given {@link MedicalResourcesCreator}, {@code
+     * dataSourceUuid}, and {@code dataSourceRowId}.
+     */
+    public void insertMedicalResources(
+            HealthConnectDatabase healthConnectDatabase,
+            MedicalResourcesCreator creator,
+            String dataSourceUuid,
+            long dataSourceRowId,
+            Instant instant,
+            int numOfResources) {
+        List<MedicalResource> medicalResources = creator.create(numOfResources, dataSourceUuid);
+        SQLiteDatabase db = healthConnectDatabase.getWritableDatabase();
+        for (MedicalResource medicalResource : medicalResources) {
+            insertResource(db, medicalResource, dataSourceRowId, instant);
+        }
+    }
+
+    /**
+     * Inserts a {@link MedicalResource} into the given {@link HealthConnectDatabase} using the
+     * given {@link MedicalResourceCreator}, {@code dataSourceUuid}, and {@code dataSourceRowId}.
+     */
+    public void insertMedicalResource(
+            HealthConnectDatabase healthConnectDatabase,
+            MedicalResourceCreator creator,
+            String dataSourceUuid,
+            long dataSourceRowId,
+            Instant instant) {
+        MedicalResource medicalResource = creator.create(dataSourceUuid);
+        SQLiteDatabase db = healthConnectDatabase.getWritableDatabase();
+        insertResource(db, medicalResource, dataSourceRowId, instant);
+    }
+
+    private void insertResource(
+            SQLiteDatabase db,
+            MedicalResource medicalResource,
+            long dataSourceRowId,
+            Instant instant) {
+        long rowId =
+                db.insertWithOnConflict(
+                        MedicalResourceHelper.getMainTableName(),
+                        /* nullColumnHack= */ null,
+                        MedicalResourceHelper.getContentValues(
+                                dataSourceRowId, instant.toEpochMilli(), medicalResource),
+                        SQLiteDatabase.CONFLICT_REPLACE);
+        db.insertWithOnConflict(
+                MedicalResourceIndicesHelper.getTableName(),
+                /* nullColumnHack= */ null,
+                MedicalResourceIndicesHelper.getContentValues(rowId, medicalResource.getType()),
+                SQLiteDatabase.CONFLICT_REPLACE);
+    }
+
+    private ReadMedicalResourcesInternalResponse readMedicalResources(
+            SQLiteDatabase stagedDatabase, PhrPageTokenWrapper pageTokenWrapper) {
+        ReadTableRequest readTableRequest =
+                MedicalResourceHelper.getReadTableRequestUsingRequestFilters(
+                        pageTokenWrapper, MAXIMUM_PAGE_SIZE);
+        return MedicalResourceHelper.getMedicalResources(
+                stagedDatabase, readTableRequest, pageTokenWrapper, MAXIMUM_PAGE_SIZE);
+    }
+
+    /**
+     * Reads all the {@link MedicalResource}s and their associated last_modified_timestamp from the
+     * given {@link HealthConnectDatabase}..
+     */
+    public List<Pair<MedicalResource, Long>> readAllMedicalResources(
+            HealthConnectDatabase stagedDatabase) {
+        SQLiteDatabase db = stagedDatabase.getReadableDatabase();
+        List<Pair<MedicalResource, Long>> result = new ArrayList<>();
+        String nextPageToken = null;
+        do {
+
+            PhrPageTokenWrapper phrPageTokenWrapper =
+                    PhrPageTokenWrapper.fromPageTokenAllowingNull(nextPageToken);
+            ReadMedicalResourcesInternalResponse response =
+                    readMedicalResources(db, phrPageTokenWrapper);
+
+            result.addAll(
+                    response.getMedicalResources().stream()
+                            .map(
+                                    medicalResource ->
+                                            new Pair<>(
+                                                    medicalResource,
+                                                    medicalResource.getLastModifiedTimestamp()))
+                            .toList());
+            nextPageToken = response.getPageToken();
+
+        } while (nextPageToken != null);
+        return result;
+    }
+
+    /**
+     * Reads {@link MedicalDataSource}s and their associated last_modified_timestamp and returns it
+     * as a list of {@link Pair}s with the first element of the pair being {@link MedicalDataSource}
+     * and the second element last_modified_timestamp.
+     */
+    public List<Pair<MedicalDataSource, Long>> readMedicalDataSources(
+            HealthConnectDatabase stagedDatabase) {
+        try (Cursor cursor =
+                stagedDatabase
+                        .getReadableDatabase()
+                        .rawQuery(MedicalDataSourceHelper.getReadQueryForDataSources(), null)) {
+            return MedicalDataSourceHelper.getMedicalDataSourcesWithTimestamps(cursor);
+        }
+    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/PreferencesManagerTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/PreferencesManagerTest.java
new file mode 100644
index 0000000..79da0f9
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/PreferencesManagerTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
+import android.health.connect.HealthConnectManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.utils.PreferencesManager;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.quality.Strictness;
+
+@RunWith(AndroidJUnit4.class)
+public class PreferencesManagerTest {
+
+    @Rule(order = 1)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .setStrictness(Strictness.LENIENT)
+                    .build();
+
+    private PreferencesManager mPreferencesManager;
+
+    @Before
+    public void setup() {
+        Context context = ApplicationProvider.getApplicationContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mPreferencesManager = healthConnectInjector.getPreferencesManager();
+    }
+
+    @Test
+    public void testSetRecordRetentionPeriodInDays() {
+        mPreferencesManager.setRecordRetentionPeriodInDays(30);
+
+        assertThat(mPreferencesManager.getRecordRetentionPeriodInDays()).isEqualTo(30);
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/ReadAccessLogsHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/ReadAccessLogsHelperTest.java
new file mode 100644
index 0000000..4c115fb
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/ReadAccessLogsHelperTest.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.datatypehelpers;
+
+import static com.android.server.healthconnect.storage.datatypehelpers.ReadAccessLogsHelper.ReadAccessLog;
+import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createBloodPressureRecord;
+import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createStepsRecord;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.health.connect.datatypes.BloodPressureRecord;
+import android.health.connect.datatypes.RecordTypeIdentifier;
+import android.health.connect.datatypes.StepsRecord;
+import android.health.connect.internal.datatypes.RecordInternal;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.TransactionManager;
+
+import com.google.common.collect.ImmutableList;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.quality.Strictness;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+@EnableFlags({
+    Flags.FLAG_ECOSYSTEM_METRICS,
+    Flags.FLAG_ECOSYSTEM_METRICS_DB_CHANGES,
+})
+public class ReadAccessLogsHelperTest {
+
+    private static final String TEST_APP_PACKAGE_READER = "test.app.package.reader";
+    private static final String TEST_APP_PACKAGE_WRITER = "test.app.package.writer";
+    private long mWriterAppInfoId;
+
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .setStrictness(Strictness.LENIENT)
+                    .build();
+
+    private ReadAccessLogsHelper mReadAccessLogsHelper;
+    private TransactionManager mTransactionManager;
+
+    @Before
+    public void setup() {
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(
+                                ApplicationProvider.getApplicationContext())
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mReadAccessLogsHelper = healthConnectInjector.getReadAccessLogsHelper();
+        AppInfoHelper appInfoHelper = healthConnectInjector.getAppInfoHelper();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+        TransactionTestUtils transactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+
+        transactionTestUtils.insertApp(TEST_APP_PACKAGE_READER);
+        transactionTestUtils.insertApp(TEST_APP_PACKAGE_WRITER);
+        mWriterAppInfoId = appInfoHelper.getAppInfoId(TEST_APP_PACKAGE_WRITER);
+    }
+
+    @Test
+    public void insertReadAccessLogs_queryLogsReturnsAllLogs() {
+        RecordInternal<StepsRecord> stepsRecordRecordInternal =
+                createStepsRecord(mWriterAppInfoId, 123, Instant.now().toEpochMilli(), 100);
+        RecordInternal<BloodPressureRecord> bloodPressureRecordRecordInternal =
+                createBloodPressureRecord(mWriterAppInfoId, 1234, 120, 80);
+        long readTimeStamp = Instant.now().toEpochMilli();
+        List<ReadAccessLog> expectedReadAccessLogs =
+                List.of(
+                        new ReadAccessLog(
+                                /* readerPackage= */ TEST_APP_PACKAGE_READER,
+                                /* writerPackage= */ TEST_APP_PACKAGE_WRITER,
+                                /* dataType= */ RecordTypeIdentifier.RECORD_TYPE_STEPS,
+                                /* readTimeStamp= */ readTimeStamp,
+                                /* wasReadRecordWrittenInPast30Days= */ true),
+                        new ReadAccessLog(
+                                /* readerPackage= */ TEST_APP_PACKAGE_READER,
+                                /* writerPackage= */ TEST_APP_PACKAGE_WRITER,
+                                /* dataType= */ RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE,
+                                /* readTimeStamp= */ readTimeStamp,
+                                /* wasReadRecordWrittenInPast30Days= */ false));
+
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    mReadAccessLogsHelper.recordReadAccessLogForNonAggregationReads(
+                            db,
+                            ImmutableList.of(
+                                    stepsRecordRecordInternal, bloodPressureRecordRecordInternal),
+                            TEST_APP_PACKAGE_READER,
+                            /* readTimeStamp= */ readTimeStamp);
+                });
+        List<ReadAccessLog> readAccessLogs = mReadAccessLogsHelper.queryReadAccessLogs();
+
+        assertThat(readAccessLogs).containsExactlyElementsIn(expectedReadAccessLogs);
+    }
+
+    @Test
+    public void insertReadAccessLogsOfSameDataType_insertsOnlyLatestPerDataType() {
+        RecordInternal<StepsRecord> stepsRecordRecordInternalOne =
+                createStepsRecord(mWriterAppInfoId, 123, 345, 100);
+        RecordInternal<StepsRecord> stepsRecordRecordInternalTwo =
+                createStepsRecord(mWriterAppInfoId, 123, 350, 100);
+        RecordInternal<BloodPressureRecord> bloodPressureRecordRecordInternalOne =
+                createBloodPressureRecord(mWriterAppInfoId, 1234, 120, 80);
+        RecordInternal<BloodPressureRecord> bloodPressureRecordRecordInternalTwo =
+                createBloodPressureRecord(mWriterAppInfoId, Instant.now().toEpochMilli(), 120, 80);
+        long readTimeStamp = Instant.now().toEpochMilli();
+        List<ReadAccessLog> expectedReadAccessLogs =
+                List.of(
+                        new ReadAccessLog(
+                                /* readerPackage= */ TEST_APP_PACKAGE_READER,
+                                /* writerPackage= */ TEST_APP_PACKAGE_WRITER,
+                                /* dataType= */ RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE,
+                                /* readTimeStamp= */ readTimeStamp,
+                                /* wasReadRecordWrittenInPast30Days= */ true),
+                        new ReadAccessLog(
+                                /* readerPackage= */ TEST_APP_PACKAGE_READER,
+                                /* writerPackage= */ TEST_APP_PACKAGE_WRITER,
+                                /* dataType= */ RecordTypeIdentifier.RECORD_TYPE_STEPS,
+                                /* readTimeStamp= */ readTimeStamp,
+                                /* wasReadRecordWrittenInPast30Days= */ false));
+
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    mReadAccessLogsHelper.recordReadAccessLogForNonAggregationReads(
+                            db,
+                            ImmutableList.of(
+                                    stepsRecordRecordInternalOne,
+                                    bloodPressureRecordRecordInternalOne,
+                                    stepsRecordRecordInternalTwo,
+                                    bloodPressureRecordRecordInternalTwo),
+                            TEST_APP_PACKAGE_READER,
+                            /* readTimeStamp= */ readTimeStamp);
+                });
+        List<ReadAccessLog> readAccessLogs = mReadAccessLogsHelper.queryReadAccessLogs();
+
+        assertThat(readAccessLogs).containsExactlyElementsIn(expectedReadAccessLogs);
+    }
+
+    @Test
+    public void insertReadAccessLogsForAggregation() {
+        long endTime = Instant.now().toEpochMilli();
+        long readTime = Instant.now().toEpochMilli();
+        List<ReadAccessLog> expectedReadAccessLogs =
+                List.of(
+                        new ReadAccessLog(
+                                /* readerPackage= */ TEST_APP_PACKAGE_READER,
+                                /* writerPackage= */ TEST_APP_PACKAGE_WRITER,
+                                /* dataType= */ RecordTypeIdentifier.RECORD_TYPE_DISTANCE,
+                                /* readTimeStamp= */ readTime,
+                                /* wasReadRecordWrittenInPast30Days= */ true),
+                        new ReadAccessLog(
+                                /* readerPackage= */ TEST_APP_PACKAGE_READER,
+                                /* writerPackage= */ TEST_APP_PACKAGE_WRITER,
+                                /* dataType= */ RecordTypeIdentifier.RECORD_TYPE_STEPS,
+                                /* readTimeStamp= */ readTime,
+                                /* wasReadRecordWrittenInPast30Days= */ true));
+
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    mReadAccessLogsHelper.recordReadAccessLogForAggregationReads(
+                            db,
+                            ImmutableList.of(TEST_APP_PACKAGE_WRITER),
+                            TEST_APP_PACKAGE_READER,
+                            Set.of(
+                                    RecordTypeIdentifier.RECORD_TYPE_STEPS,
+                                    RecordTypeIdentifier.RECORD_TYPE_DISTANCE),
+                            /* endTimeStamp= */ endTime,
+                            /* readTimeStamp= */ readTime);
+                });
+        List<ReadAccessLog> readAccessLogs = mReadAccessLogsHelper.queryReadAccessLogs();
+
+        assertThat(readAccessLogs).containsExactlyElementsIn(expectedReadAccessLogs);
+    }
+
+    @Test
+    public void insertReadAccessLogsOfSamePackage_insertsOnlyForDifferentPackage() {
+        long endTime = Instant.now().toEpochMilli();
+        long readTime = Instant.now().toEpochMilli();
+        List<ReadAccessLog> expectedReadAccessLogs =
+                List.of(
+                        new ReadAccessLog(
+                                /* readerPackage= */ TEST_APP_PACKAGE_READER,
+                                /* writerPackage= */ TEST_APP_PACKAGE_WRITER,
+                                /* dataType= */ RecordTypeIdentifier.RECORD_TYPE_STEPS,
+                                /* readTimeStamp= */ readTime,
+                                /* wasReadRecordWrittenInPast30Days= */ true));
+
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    mReadAccessLogsHelper.recordReadAccessLogForAggregationReads(
+                            db,
+                            ImmutableList.of(TEST_APP_PACKAGE_WRITER, TEST_APP_PACKAGE_READER),
+                            TEST_APP_PACKAGE_READER,
+                            Set.of(RecordTypeIdentifier.RECORD_TYPE_STEPS),
+                            /* endTimeStamp= */ endTime,
+                            /* readTimeStamp= */ readTime);
+                });
+        List<ReadAccessLog> readAccessLogs = mReadAccessLogsHelper.queryReadAccessLogs();
+
+        assertThat(readAccessLogs).containsExactlyElementsIn(expectedReadAccessLogs);
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/TransactionManagerExerciseRoutesTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/TransactionManagerExerciseRoutesTest.java
index 2945f4a..3af8cab 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/TransactionManagerExerciseRoutesTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/TransactionManagerExerciseRoutesTest.java
@@ -22,7 +22,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.Manifest;
+import android.content.Context;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.HealthPermissions;
 import android.health.connect.ReadRecordsRequestUsingFilters;
@@ -31,20 +31,20 @@
 import android.health.connect.datatypes.RecordTypeIdentifier;
 import android.health.connect.internal.datatypes.ExerciseSessionRecordInternal;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.os.Environment;
 
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
 import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
 import com.android.server.healthconnect.storage.request.ReadTransactionRequest;
 
@@ -54,6 +54,7 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
 import java.time.Instant;
@@ -76,12 +77,14 @@
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule testRule = new HealthConnectDatabaseTestRule();
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
 
     private TransactionTestUtils mTransactionTestUtils;
     private TransactionManager mTransactionManager;
@@ -91,27 +94,21 @@
 
     @Before
     public void setup() {
-        InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation()
-                .adoptShellPermissionIdentity(Manifest.permission.READ_DEVICE_CONFIG);
-        HealthConnectUserContext context = testRule.getUserContext();
-        mTransactionManager = testRule.getTransactionManager();
-        mTransactionTestUtils = new TransactionTestUtils(context, mTransactionManager);
-        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
-        mTransactionTestUtils.insertApp(FOO_PACKAGE_NAME);
-        mTransactionTestUtils.insertApp(BAR_PACKAGE_NAME);
-        HealthConnectDeviceConfigManager.initializeInstance(context);
-
-        DeviceInfoHelper.resetInstanceForTest();
-        AppInfoHelper.resetInstanceForTest();
-        AccessLogsHelper.resetInstanceForTest();
+        Context context = ApplicationProvider.getApplicationContext();
         HealthConnectInjector healthConnectInjector =
                 HealthConnectInjectorImpl.newBuilderForTest(context)
-                        .setTransactionManager(mTransactionManager)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
                         .build();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
         mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
         mAccessLogsHelper = healthConnectInjector.getAccessLogsHelper();
         mDeviceInfoHelper = healthConnectInjector.getDeviceInfoHelper();
+
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+        mTransactionTestUtils.insertApp(FOO_PACKAGE_NAME);
+        mTransactionTestUtils.insertApp(BAR_PACKAGE_NAME);
     }
 
     @Test
@@ -139,7 +136,11 @@
 
         List<RecordInternal<?>> returnedRecords =
                 mTransactionManager.readRecordsByIds(
-                        request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                        request,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
 
         Map<String, ExerciseSessionRecordInternal> idToSessionMap =
                 returnedRecords.stream()
@@ -175,7 +176,11 @@
 
         List<RecordInternal<?>> returnedRecords =
                 mTransactionManager.readRecordsByIds(
-                        request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                        request,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
 
         assertThat(returnedRecords).hasSize(1);
         ExerciseSessionRecordInternal returnedRecord =
@@ -204,7 +209,11 @@
 
         List<RecordInternal<?>> returnedRecords =
                 mTransactionManager.readRecordsByIds(
-                        request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                        request,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
 
         assertThat(returnedRecords).hasSize(1);
         ExerciseSessionRecordInternal returnedRecord =
@@ -233,7 +242,11 @@
 
         List<RecordInternal<?>> returnedRecords =
                 mTransactionManager.readRecordsByIds(
-                        request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                        request,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
 
         assertThat(returnedRecords).hasSize(1);
         ExerciseSessionRecordInternal returnedRecord =
@@ -272,7 +285,11 @@
 
         List<RecordInternal<?>> returnedRecords =
                 mTransactionManager.readRecordsAndPageToken(
-                                request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper)
+                                request,
+                                mAppInfoHelper,
+                                mAccessLogsHelper,
+                                mDeviceInfoHelper,
+                                /* shouldRecordAccessLog= */ false)
                         .first;
 
         Map<String, ExerciseSessionRecordInternal> idToSessionMap =
@@ -314,7 +331,11 @@
 
         List<RecordInternal<?>> returnedRecords =
                 mTransactionManager.readRecordsAndPageToken(
-                                request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper)
+                                request,
+                                mAppInfoHelper,
+                                mAccessLogsHelper,
+                                mDeviceInfoHelper,
+                                /* shouldRecordAccessLog= */ false)
                         .first;
 
         assertThat(returnedRecords).hasSize(1);
@@ -348,7 +369,11 @@
 
         List<RecordInternal<?>> returnedRecords =
                 mTransactionManager.readRecordsAndPageToken(
-                                request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper)
+                                request,
+                                mAppInfoHelper,
+                                mAccessLogsHelper,
+                                mDeviceInfoHelper,
+                                /* shouldRecordAccessLog= */ false)
                         .first;
 
         assertThat(returnedRecords).hasSize(1);
@@ -382,7 +407,11 @@
 
         List<RecordInternal<?>> returnedRecords =
                 mTransactionManager.readRecordsAndPageToken(
-                                request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper)
+                                request,
+                                mAppInfoHelper,
+                                mAccessLogsHelper,
+                                mDeviceInfoHelper,
+                                /* shouldRecordAccessLog= */ false)
                         .first;
 
         assertThat(returnedRecords).hasSize(1);
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/TransactionManagerTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/TransactionManagerTest.java
index 39f6cdb..a93cf3b 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/TransactionManagerTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/TransactionManagerTest.java
@@ -27,12 +27,12 @@
 import static com.android.server.healthconnect.storage.datatypehelpers.InstantRecordHelper.TIME_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createBloodPressureRecord;
 import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createStepsRecord;
-import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.getReadTransactionRequest;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertThrows;
 
+import android.content.Context;
 import android.health.connect.DeleteUsingFiltersRequest;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.PageTokenWrapper;
@@ -50,27 +50,34 @@
 import android.health.connect.datatypes.StepsRecord;
 import android.health.connect.internal.datatypes.RecordInternal;
 import android.health.connect.internal.datatypes.utils.AggregationTypeIdMapper;
-import android.os.Environment;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
+import android.util.ArrayMap;
 import android.util.Pair;
 
+import androidx.test.core.app.ApplicationProvider;
+
 import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
+import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
 import com.android.server.healthconnect.storage.request.AggregateTableRequest;
 import com.android.server.healthconnect.storage.request.DeleteTransactionRequest;
+import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTransactionRequest;
-import com.android.server.healthconnect.storage.utils.RecordHelperProvider;
+import com.android.server.healthconnect.storage.request.UpsertTransactionRequest;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -78,6 +85,7 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
 import java.time.Duration;
@@ -102,38 +110,41 @@
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 3)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new com.android.server.healthconnect.storage.datatypehelpers
-                    .HealthConnectDatabaseTestRule();
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
 
     private TransactionTestUtils mTransactionTestUtils;
     private TransactionManager mTransactionManager;
     private AppInfoHelper mAppInfoHelper;
     private AccessLogsHelper mAccessLogsHelper;
     private DeviceInfoHelper mDeviceInfoHelper;
+    private InternalHealthConnectMappings mInternalHealthConnectMappings;
+    private HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
 
     @Before
     public void setup() {
-        HealthConnectUserContext context = mHealthConnectDatabaseTestRule.getUserContext();
-        mTransactionManager = mHealthConnectDatabaseTestRule.getTransactionManager();
-        mTransactionTestUtils = new TransactionTestUtils(context, mTransactionManager);
-        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
-
-        AppInfoHelper.resetInstanceForTest();
-        AccessLogsHelper.resetInstanceForTest();
-        DeviceInfoHelper.resetInstanceForTest();
+        Context context = ApplicationProvider.getApplicationContext();
         HealthConnectInjector healthConnectInjector =
                 HealthConnectInjectorImpl.newBuilderForTest(context)
-                        .setTransactionManager(mTransactionManager)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
                         .build();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
         mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
         mAccessLogsHelper = healthConnectInjector.getAccessLogsHelper();
         mDeviceInfoHelper = healthConnectInjector.getDeviceInfoHelper();
+        mInternalHealthConnectMappings = healthConnectInjector.getInternalHealthConnectMappings();
+        mHealthDataCategoryPriorityHelper =
+                healthConnectInjector.getHealthDataCategoryPriorityHelper();
+
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
     }
 
     @Test
@@ -151,14 +162,16 @@
                         .addId(uuid)
                         .build();
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(request.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        request.toReadRecordsRequestParcel());
 
         List<RecordInternal<?>> records =
                 mTransactionManager.readRecordsByIds(
                         readTransactionRequest,
                         mAppInfoHelper,
                         mAccessLogsHelper,
-                        mDeviceInfoHelper);
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
         assertThat(records).hasSize(1);
         assertThat(records.get(0).getUuid()).isEqualTo(UUID.fromString(uuid));
     }
@@ -176,7 +189,7 @@
         List<UUID> stepsUuids = ImmutableList.of(UUID.fromString(uuids.get(0)));
         List<UUID> bloodPressureUuids = ImmutableList.of(UUID.fromString(uuids.get(1)));
         ReadTransactionRequest request =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         ImmutableMap.of(
                                 RECORD_TYPE_STEPS,
                                 stepsUuids,
@@ -185,7 +198,11 @@
 
         List<RecordInternal<?>> records =
                 mTransactionManager.readRecordsByIds(
-                        request, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                        request,
+                        mAppInfoHelper,
+                        mAccessLogsHelper,
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
         assertThat(records).hasSize(2);
         assertThat(records.get(0).getUuid()).isEqualTo(UUID.fromString(uuids.get(0)));
         assertThat(records.get(1).getUuid()).isEqualTo(UUID.fromString(uuids.get(1)));
@@ -202,9 +219,14 @@
                         .addClientRecordId("id")
                         .build();
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(request.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        request.toReadRecordsRequestParcel());
         mTransactionManager.readRecordsByIds(
-                readTransactionRequest, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                readTransactionRequest,
+                mAppInfoHelper,
+                mAccessLogsHelper,
+                mDeviceInfoHelper,
+                /* shouldRecordAccessLog= */ false);
 
         List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
         assertThat(result).isEmpty();
@@ -222,7 +244,8 @@
                         .setPageSize(1)
                         .build();
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(request.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        request.toReadRecordsRequestParcel());
         Throwable thrown =
                 assertThrows(
                         IllegalArgumentException.class,
@@ -231,7 +254,8 @@
                                         readTransactionRequest,
                                         mAppInfoHelper,
                                         mAccessLogsHelper,
-                                        mDeviceInfoHelper));
+                                        mDeviceInfoHelper,
+                                        /* shouldRecordAccessLog= */ false));
         assertThat(thrown).hasMessageThat().contains("Expect read by id request");
     }
 
@@ -257,13 +281,15 @@
                         /* isAscending= */ true, /* timeMillis= */ 500, /* offset= */ 0);
 
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(request.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        request.toReadRecordsRequestParcel());
         Pair<List<RecordInternal<?>>, PageTokenWrapper> result =
                 mTransactionManager.readRecordsAndPageToken(
                         readTransactionRequest,
                         mAppInfoHelper,
                         mAccessLogsHelper,
-                        mDeviceInfoHelper);
+                        mDeviceInfoHelper,
+                        /* shouldRecordAccessLog= */ false);
         List<RecordInternal<?>> records = result.first;
         assertThat(records).hasSize(1);
         assertThat(result.first.get(0).getUuid()).isEqualTo(UUID.fromString(uuids.get(0)));
@@ -277,9 +303,14 @@
                 new ReadRecordsRequestUsingFilters.Builder<>(StepsRecord.class).build();
 
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(request.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        request.toReadRecordsRequestParcel());
         mTransactionManager.readRecordsAndPageToken(
-                readTransactionRequest, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                readTransactionRequest,
+                mAppInfoHelper,
+                mAccessLogsHelper,
+                mDeviceInfoHelper,
+                /* shouldRecordAccessLog= */ true);
 
         List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
         assertThat(result).hasSize(1);
@@ -298,9 +329,14 @@
                         .build();
 
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(request.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        request.toReadRecordsRequestParcel());
         mTransactionManager.readRecordsAndPageToken(
-                readTransactionRequest, mAppInfoHelper, mAccessLogsHelper, mDeviceInfoHelper);
+                readTransactionRequest,
+                mAppInfoHelper,
+                mAccessLogsHelper,
+                mDeviceInfoHelper,
+                /* shouldRecordAccessLog= */ true);
 
         List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
         assertThat(result).isEmpty();
@@ -313,7 +349,8 @@
                         .addId(UUID.randomUUID().toString())
                         .build();
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(request.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        request.toReadRecordsRequestParcel());
 
         Throwable thrown =
                 assertThrows(
@@ -323,7 +360,8 @@
                                         readTransactionRequest,
                                         mAppInfoHelper,
                                         mAccessLogsHelper,
-                                        mDeviceInfoHelper));
+                                        mDeviceInfoHelper,
+                                        /* shouldRecordAccessLog= */ false));
         assertThat(thrown).hasMessageThat().contains("Expect read by filter request");
     }
 
@@ -338,7 +376,7 @@
                 new DeleteUsingFiltersRequestParcel(
                         new RecordIdFiltersParcel(ids), TEST_PACKAGE_NAME);
         assertThat(parcel.usesIdFilters()).isTrue();
-        mTransactionManager.deleteAll(
+        mTransactionManager.deleteAllRecords(
                 new DeleteTransactionRequest(TEST_PACKAGE_NAME, parcel, mAppInfoHelper),
                 /* shouldRecordDeleteAccessLogs= */ false,
                 mAccessLogsHelper);
@@ -362,7 +400,7 @@
                         .build();
         DeleteUsingFiltersRequestParcel parcel = new DeleteUsingFiltersRequestParcel(deleteRequest);
         assertThat(parcel.usesIdFilters()).isFalse();
-        mTransactionManager.deleteAll(
+        mTransactionManager.deleteAllRecords(
                 new DeleteTransactionRequest(TEST_PACKAGE_NAME, parcel, mAppInfoHelper),
                 /* shouldRecordDeleteAccessLogs= */ false,
                 mAccessLogsHelper);
@@ -387,7 +425,7 @@
                                         .build())
                         .build();
         DeleteUsingFiltersRequestParcel parcel = new DeleteUsingFiltersRequestParcel(deleteRequest);
-        mTransactionManager.deleteAll(
+        mTransactionManager.deleteAllRecords(
                 new DeleteTransactionRequest(TEST_PACKAGE_NAME, parcel, mAppInfoHelper),
                 /* shouldRecordDeleteAccessLogs= */ false,
                 mAccessLogsHelper);
@@ -409,7 +447,7 @@
                                         .build())
                         .build();
         DeleteUsingFiltersRequestParcel parcel = new DeleteUsingFiltersRequestParcel(deleteRequest);
-        mTransactionManager.deleteAll(
+        mTransactionManager.deleteAllRecords(
                 new DeleteTransactionRequest(TEST_PACKAGE_NAME, parcel, mAppInfoHelper),
                 /* shouldRecordDeleteAccessLogs= */ true,
                 mAccessLogsHelper);
@@ -435,7 +473,7 @@
                                         .build())
                         .build();
         DeleteUsingFiltersRequestParcel parcel = new DeleteUsingFiltersRequestParcel(deleteRequest);
-        mTransactionManager.deleteAll(
+        mTransactionManager.deleteAllRecords(
                 new DeleteTransactionRequest(TEST_PACKAGE_NAME, parcel, mAppInfoHelper),
                 /* shouldRecordDeleteAccessLogs= */ false,
                 mAccessLogsHelper);
@@ -447,7 +485,8 @@
     @Test
     @EnableFlags(Flags.FLAG_ADD_MISSING_ACCESS_LOGS)
     public void populateWithAggregation_accessLogRecorded() {
-        RecordHelper<?> helper = RecordHelperProvider.getRecordHelper(RECORD_TYPE_HEART_RATE);
+        RecordHelper<?> helper =
+                mInternalHealthConnectMappings.getRecordHelper(RECORD_TYPE_HEART_RATE);
         AggregationType<?> aggregationType =
                 AggregationTypeIdMapper.getInstance()
                         .getAggregationTypeFor(HEART_RATE_RECORD_BPM_AVG);
@@ -456,8 +495,10 @@
                         aggregationType,
                         TEST_PACKAGE_NAME,
                         /* packageFilters= */ List.of(),
-                        HealthDataCategoryPriorityHelper.getInstance(),
+                        mHealthDataCategoryPriorityHelper,
+                        mInternalHealthConnectMappings,
                         mAppInfoHelper,
+                        mTransactionManager,
                         /* startTime= */ 123,
                         /* endTime= */ 456,
                         /* startDateAccess= */ 0,
@@ -474,7 +515,11 @@
                         .setEndTime(Instant.ofEpochMilli(456))
                         .build());
         mTransactionManager.populateWithAggregation(
-                request, TEST_PACKAGE_NAME, Set.of(RECORD_TYPE_HEART_RATE), mAccessLogsHelper);
+                request,
+                TEST_PACKAGE_NAME,
+                Set.of(RECORD_TYPE_HEART_RATE),
+                mAccessLogsHelper,
+                /* shouldRecordAccessLog= */ true);
 
         List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
         AccessLog log = result.get(0);
@@ -482,4 +527,54 @@
         assertThat(log.getRecordTypes()).containsExactly(HeartRateRecord.class);
         assertThat(log.getOperationType()).isEqualTo(OPERATION_TYPE_READ);
     }
+
+    @Test
+    public void insertAllRecords_noChangeLogs() {
+        UpsertTransactionRequest upsertTransactionRequest =
+                UpsertTransactionRequest.createForRestore(
+                        List.of(
+                                createStepsRecord(500, 750, 100)
+                                        .setPackageName(TEST_PACKAGE_NAME)
+                                        .setUuid(UUID.randomUUID())),
+                        mDeviceInfoHelper,
+                        mAppInfoHelper);
+        mTransactionManager.insertOrIgnoreOnConflict(upsertTransactionRequest.getUpsertRequests());
+
+        assertThat(mTransactionManager.count(new ReadTableRequest(ChangeLogsHelper.TABLE_NAME)))
+                .isEqualTo(0);
+    }
+
+    @Test
+    public void insertAllRecordsForRestore_addChangeLogs_withNoAccessLogs() {
+        UpsertTransactionRequest upsertTransactionRequest =
+                UpsertTransactionRequest.createForRestore(
+                        List.of(
+                                createStepsRecord(500, 750, 100)
+                                        .setPackageName(TEST_PACKAGE_NAME)
+                                        .setUuid(UUID.randomUUID())),
+                        mDeviceInfoHelper,
+                        mAppInfoHelper);
+        mTransactionManager.insertAllRecords(mAppInfoHelper, null, upsertTransactionRequest);
+
+        assertThat(mTransactionManager.count(new ReadTableRequest(ChangeLogsHelper.TABLE_NAME)))
+                .isEqualTo(1);
+        List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
+        assertThat(result).isEmpty();
+    }
+
+    @Test
+    public void insertAllRecords_addAccessLogs() {
+        UpsertTransactionRequest upsertTransactionRequest =
+                UpsertTransactionRequest.createForInsert(
+                        TEST_PACKAGE_NAME /* packageName */,
+                        List.of(createStepsRecord(500, 750, 100).setPackageName(TEST_PACKAGE_NAME)),
+                        mDeviceInfoHelper,
+                        mAppInfoHelper,
+                        new ArrayMap<>());
+        mTransactionManager.insertAllRecords(
+                mAppInfoHelper, mAccessLogsHelper, upsertTransactionRequest);
+
+        List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
+        assertThat(result).isNotEmpty();
+    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/AccessLogsHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/AccessLogsHelperTest.java
index 28c753f..ca3d222 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/AccessLogsHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/AccessLogsHelperTest.java
@@ -19,8 +19,8 @@
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_DELETE;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_READ;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_UPSERT;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_UNKNOWN;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BODY_FAT;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_DISTANCE;
@@ -28,18 +28,21 @@
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_SKIN_TEMPERATURE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_STEPS;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_STEPS_CADENCE;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
 
-import static com.android.healthfitness.flags.Flags.FLAG_DEVELOPMENT_DATABASE;
 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD;
+import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE;
 import static com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper.MEDICAL_DATA_SOURCE_ACCESSED_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper.MEDICAL_RESOURCE_TYPE_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper.getAlterTableRequestForPhrAccessLogs;
+import static com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper.populateCommonColumns;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.INTEGER;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.TEXT_NULL;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.content.ContentValues;
+import android.content.Context;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.accesslog.AccessLog;
 import android.health.connect.datatypes.BloodPressureRecord;
@@ -49,20 +52,28 @@
 import android.health.connect.datatypes.SkinTemperatureRecord;
 import android.health.connect.datatypes.StepsCadenceRecord;
 import android.health.connect.datatypes.StepsRecord;
-import android.os.Environment;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.util.Pair;
 
+import androidx.test.core.app.ApplicationProvider;
+
 import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.FakePreferenceHelper;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
 import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.AlterTableRequest;
+import com.android.server.healthconnect.storage.request.UpsertTableRequest;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
 import java.util.List;
@@ -77,39 +88,36 @@
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 3)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
-
-    private TransactionTestUtils mTransactionTestUtils;
     private TransactionManager mTransactionManager;
     private AccessLogsHelper mAccessLogsHelper;
 
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
     @Before
     public void setup() {
-        AccessLogsHelper.resetInstanceForTest();
-
-        mTransactionTestUtils =
-                new TransactionTestUtils(
-                        mHealthConnectDatabaseTestRule.getUserContext(),
-                        mHealthConnectDatabaseTestRule.getTransactionManager());
-        mTransactionManager = mHealthConnectDatabaseTestRule.getTransactionManager();
+        Context context = ApplicationProvider.getApplicationContext();
         HealthConnectInjector healthConnectInjector =
-                HealthConnectInjectorImpl.newBuilderForTest(
-                                mHealthConnectDatabaseTestRule.getUserContext())
-                        .setTransactionManager(mTransactionManager)
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setPreferenceHelper(new FakePreferenceHelper())
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
                         .build();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
         mAccessLogsHelper = healthConnectInjector.getAccessLogsHelper();
 
-        mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
+        TransactionTestUtils transactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        transactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
     }
 
     @Test
-    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testGetAlterTableRequestForPhrAccessLogs_success() {
         List<Pair<String, String>> columnInfo =
                 List.of(
@@ -124,7 +132,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testAddAccessLogsPhr_accessedSingleMedicalResourceType_success() {
         mTransactionManager.runAsTransaction(
                 (TransactionManager.TransactionRunnable<RuntimeException>)
@@ -132,7 +140,7 @@
                                 mAccessLogsHelper.addAccessLog(
                                         db,
                                         DATA_SOURCE_PACKAGE_NAME,
-                                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                                         OPERATION_TYPE_READ,
                                         /* accessedMedicalDataSource= */ false));
 
@@ -142,7 +150,7 @@
         assertThat(result).hasSize(1);
         assertThat(accessLog.getPackageName()).isEqualTo(DATA_SOURCE_PACKAGE_NAME);
         assertThat(accessLog.getMedicalResourceTypes())
-                .isEqualTo(Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION));
+                .isEqualTo(Set.of(MEDICAL_RESOURCE_TYPE_VACCINES));
         assertThat(accessLog.getRecordTypes()).isEmpty();
         assertThat(accessLog.getOperationType()).isEqualTo(OPERATION_TYPE_READ);
         assertThat(accessLog.isMedicalDataSourceAccessed()).isFalse();
@@ -150,7 +158,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testAddAccessLogsPhr_accessedMultipleMedicalResourceTypes_success() {
         mTransactionManager.runAsTransaction(
                 (TransactionManager.TransactionRunnable<RuntimeException>)
@@ -159,8 +167,8 @@
                                         db,
                                         DATA_SOURCE_PACKAGE_NAME,
                                         Set.of(
-                                                MEDICAL_RESOURCE_TYPE_UNKNOWN,
-                                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                                MEDICAL_RESOURCE_TYPE_VACCINES),
                                         OPERATION_TYPE_READ,
                                         /* accessedMedicalDataSource= */ false));
 
@@ -171,7 +179,9 @@
         assertThat(accessLog.getPackageName()).isEqualTo(DATA_SOURCE_PACKAGE_NAME);
         assertThat(accessLog.getMedicalResourceTypes())
                 .isEqualTo(
-                        Set.of(MEDICAL_RESOURCE_TYPE_UNKNOWN, MEDICAL_RESOURCE_TYPE_IMMUNIZATION));
+                        Set.of(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES));
         assertThat(accessLog.getRecordTypes()).isEmpty();
         assertThat(accessLog.getOperationType()).isEqualTo(OPERATION_TYPE_READ);
         assertThat(accessLog.isMedicalDataSourceAccessed()).isFalse();
@@ -179,7 +189,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testAddAccessLogsPhr_accessedMedicalDataSource_success() {
         mTransactionManager.runAsTransaction(
                 (TransactionManager.TransactionRunnable<RuntimeException>)
@@ -204,7 +214,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testAddAccessLogsForHCRecordType_queryAccessLogs_expectCorrectResult() {
         mAccessLogsHelper.addAccessLog(
                 DATA_SOURCE_PACKAGE_NAME,
@@ -224,7 +234,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({FLAG_PERSONAL_HEALTH_RECORD, FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void testAddAccessLogsPhr_multipleAccessLogs_success() {
         mTransactionManager.runAsTransaction(
                 db -> {
@@ -237,7 +247,7 @@
                     mAccessLogsHelper.addAccessLog(
                             db,
                             DATA_SOURCE_PACKAGE_NAME,
-                            Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                            Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                             OPERATION_TYPE_UPSERT,
                             /* accessedMedicalDataSource= */ false);
                 });
@@ -257,7 +267,7 @@
 
         assertThat(accessLog2.getPackageName()).isEqualTo(DATA_SOURCE_PACKAGE_NAME);
         assertThat(accessLog2.getMedicalResourceTypes())
-                .isEqualTo(Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION));
+                .isEqualTo(Set.of(MEDICAL_RESOURCE_TYPE_VACCINES));
         assertThat(accessLog2.getRecordTypes()).isEmpty();
         assertThat(accessLog2.getOperationType()).isEqualTo(OPERATION_TYPE_UPSERT);
         assertThat(accessLog2.isMedicalDataSourceAccessed()).isFalse();
@@ -283,6 +293,18 @@
     }
 
     @Test
+    public void queryAccessLogs_invalidAppId_excluded() {
+        ContentValues contentValues =
+                populateCommonColumns(-2, List.of(RECORD_TYPE_BLOOD_PRESSURE), OPERATION_TYPE_READ);
+        UpsertTableRequest request =
+                new UpsertTableRequest(AccessLogsHelper.TABLE_NAME, contentValues);
+        mTransactionManager.insert(request);
+
+        List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
+        assertThat(result).isEmpty();
+    }
+
+    @Test
     public void recordDeleteAccessLog_success() {
         Set<Integer> recordTypeIds = Set.of(RECORD_TYPE_STEPS_CADENCE);
         mTransactionManager.runAsTransaction(
@@ -300,6 +322,18 @@
     }
 
     @Test
+    public void recordDeleteAccessLog_packageNameNotFound_noOp() {
+        Set<Integer> recordTypeIds = Set.of(RECORD_TYPE_STEPS_CADENCE);
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    mAccessLogsHelper.recordDeleteAccessLog(db, "unknown.app", recordTypeIds);
+                });
+
+        List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
+        assertThat(result).isEmpty();
+    }
+
+    @Test
     public void recordReadAccessLog_success() {
         Set<Integer> recordTypeIds = Set.of(RECORD_TYPE_DISTANCE, RECORD_TYPE_SKIN_TEMPERATURE);
         mTransactionManager.runAsTransaction(
@@ -318,6 +352,18 @@
     }
 
     @Test
+    public void recordReadAccessLog_packageNameNotFound_noOp() {
+        Set<Integer> recordTypeIds = Set.of(RECORD_TYPE_DISTANCE, RECORD_TYPE_SKIN_TEMPERATURE);
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    mAccessLogsHelper.recordReadAccessLog(db, "unknown.app", recordTypeIds);
+                });
+
+        List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
+        assertThat(result).isEmpty();
+    }
+
+    @Test
     public void recordUpsertAccessLog_success() {
         Set<Integer> recordTypeIds = Set.of(RECORD_TYPE_BODY_FAT, RECORD_TYPE_HEIGHT);
         mTransactionManager.runAsTransaction(
@@ -335,6 +381,18 @@
     }
 
     @Test
+    public void recordUpsertAccessLog_packageNameNotFound_noOp() {
+        Set<Integer> recordTypeIds = Set.of(RECORD_TYPE_BODY_FAT, RECORD_TYPE_HEIGHT);
+        mTransactionManager.runAsTransaction(
+                db -> {
+                    mAccessLogsHelper.recordUpsertAccessLog(db, "unknown.app", recordTypeIds);
+                });
+
+        List<AccessLog> result = mAccessLogsHelper.queryAccessLogs();
+        assertThat(result).isEmpty();
+    }
+
+    @Test
     public void testAddAccessLogsForDelete_getLatestAccessLogTimeStampForMAU_expectCorrectResult() {
         Set<Integer> recordTypeIds = Set.of(RECORD_TYPE_DISTANCE, RECORD_TYPE_SKIN_TEMPERATURE);
         mTransactionManager.runAsTransaction(
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelperTest.java
index 206a747..4c76a54 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelperTest.java
@@ -16,10 +16,14 @@
 
 package com.android.server.healthconnect.storage.datatypehelpers;
 
+import static com.android.server.healthconnect.TestUtils.TEST_USER;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -29,13 +33,17 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
-import android.os.Environment;
+import android.health.connect.HealthConnectManager;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectUserContext;
-import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 
 import org.junit.After;
 import org.junit.Before;
@@ -54,14 +62,11 @@
     @Rule(order = 1)
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
-                    .mockStatic(Environment.class)
+                    .mockStatic(HealthConnectManager.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
-
     @Mock private Context mContext;
     @Mock private Drawable mDrawable;
     @Mock private PackageManager mPackageManager;
@@ -71,25 +76,26 @@
 
     @Before
     public void setup() throws PackageManager.NameNotFoundException {
-        HealthConnectUserContext healthConnectUserContext =
-                mHealthConnectDatabaseTestRule.getUserContext();
-        TransactionManager transactionManager =
-                mHealthConnectDatabaseTestRule.getTransactionManager();
-        mTransactionTestUtils =
-                new TransactionTestUtils(healthConnectUserContext, transactionManager);
+        when(mContext.getUser()).thenReturn(TEST_USER);
+        when(mContext.createContextAsUser(any(), anyInt())).thenReturn(mContext);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
+
         when(mDrawable.getIntrinsicHeight()).thenReturn(200);
         when(mDrawable.getIntrinsicWidth()).thenReturn(200);
 
-        AppInfoHelper.resetInstanceForTest();
-        mAppInfoHelper =
-                AppInfoHelper.getInstance(mHealthConnectDatabaseTestRule.getTransactionManager());
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(mContext)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
     }
 
     @After
     public void tearDown() throws Exception {
         reset(mDrawable, mContext, mPackageManager);
-        AppInfoHelper.resetInstanceForTest();
     }
 
     @Test
@@ -99,7 +105,7 @@
         when(mPackageManager.getApplicationIcon(TEST_PACKAGE_NAME)).thenReturn(mDrawable);
 
         mAppInfoHelper.addOrUpdateAppInfoIfNotInstalled(
-                mContext, TEST_PACKAGE_NAME, TEST_APP_NAME, null, /* onlyReplace= */ false);
+                TEST_PACKAGE_NAME, TEST_APP_NAME, null, /* onlyReplace= */ false);
 
         verify(mPackageManager).getApplicationIcon(TEST_PACKAGE_NAME);
     }
@@ -113,7 +119,7 @@
         when(mPackageManager.getDefaultActivityIcon()).thenReturn(mDrawable);
 
         mAppInfoHelper.addOrUpdateAppInfoIfNotInstalled(
-                mContext, TEST_PACKAGE_NAME, TEST_APP_NAME, null, /* onlyReplace= */ false);
+                TEST_PACKAGE_NAME, TEST_APP_NAME, null, /* onlyReplace= */ false);
 
         verify(mPackageManager).getDefaultActivityIcon();
     }
@@ -125,7 +131,7 @@
         when(mPackageManager.getApplicationIcon(TEST_PACKAGE_NAME)).thenReturn(mDrawable);
 
         mAppInfoHelper.addOrUpdateAppInfoIfNotInstalled(
-                mContext, TEST_PACKAGE_NAME, TEST_APP_NAME, null, /* onlyReplace= */ false);
+                TEST_PACKAGE_NAME, TEST_APP_NAME, null, /* onlyReplace= */ false);
 
         verify(mPackageManager, times(1)).getApplicationInfo(eq(TEST_PACKAGE_NAME), any());
         verify(mPackageManager, times(0)).getApplicationIcon(TEST_PACKAGE_NAME);
@@ -140,8 +146,7 @@
 
         assertThat(doesRecordExistForPackage()).isFalse();
 
-        mAppInfoHelper.addOrUpdateAppInfoIfNoAppInfoEntryExists(
-                mContext, TEST_PACKAGE_NAME, TEST_APP_NAME);
+        mAppInfoHelper.addOrUpdateAppInfoIfNoAppInfoEntryExists(TEST_PACKAGE_NAME, TEST_APP_NAME);
 
         assertThat(doesRecordExistForPackage()).isTrue();
     }
@@ -155,8 +160,7 @@
 
         assertThat(doesRecordExistForPackage()).isTrue();
 
-        mAppInfoHelper.addOrUpdateAppInfoIfNoAppInfoEntryExists(
-                mContext, TEST_PACKAGE_NAME, TEST_APP_NAME);
+        mAppInfoHelper.addOrUpdateAppInfoIfNoAppInfoEntryExists(TEST_PACKAGE_NAME, TEST_APP_NAME);
 
         verify(mPackageManager, times(0)).getApplicationInfo(eq(TEST_PACKAGE_NAME), any());
         verify(mPackageManager, times(0)).getApplicationIcon(TEST_PACKAGE_NAME);
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/BackupChangeTokenHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/BackupChangeTokenHelperTest.java
new file mode 100644
index 0000000..e218e29
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/BackupChangeTokenHelperTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.datatypehelpers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.TransactionManager;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+@EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+public class BackupChangeTokenHelperTest {
+
+    private static final String TEST_DATA_TABLE_NAME = "step_records_table";
+    private static final long TEST_DATA_TABLE_PAGE_TOKEN = 1;
+    private static final String TEST_CHANGE_LOGS_REQUEST_TOKEN = "1";
+
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .build();
+
+    private TransactionManager mTransactionManager;
+
+    @Before
+    public void setup() {
+        Context context = ApplicationProvider.getApplicationContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+    }
+
+    @Test
+    public void getTableName() {
+        assertThat(BackupChangeTokenHelper.getTableName()).isEqualTo("backup_change_token_table");
+    }
+
+    @Test
+    public void getBackupChangeTokenRowId() {
+        String backupChangeTokenRowId =
+                BackupChangeTokenHelper.getBackupChangeTokenRowId(
+                        mTransactionManager,
+                        TEST_DATA_TABLE_NAME,
+                        TEST_DATA_TABLE_PAGE_TOKEN,
+                        TEST_CHANGE_LOGS_REQUEST_TOKEN);
+
+        assertThat(backupChangeTokenRowId).isEqualTo("1");
+
+        String anotherBackupChangeTokenRowId =
+                BackupChangeTokenHelper.getBackupChangeTokenRowId(
+                        mTransactionManager, null, -1, null);
+        assertThat(anotherBackupChangeTokenRowId).isEqualTo("2");
+    }
+
+    @Test
+    public void getBackupChangeToken_withNullValues() {
+        String backupChangeTokenRowId =
+                BackupChangeTokenHelper.getBackupChangeTokenRowId(
+                        mTransactionManager, null, -1, null);
+
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, backupChangeTokenRowId);
+        assertThat(backupChangeToken.getChangeLogsRequestToken()).isNull();
+        assertThat(backupChangeToken.getDataTablePageToken()).isEqualTo(-1);
+        assertThat(backupChangeToken.getDataTableName()).isNull();
+    }
+
+    @Test
+    public void getBackupChangeToken() {
+        String backupChangeTokenRowId =
+                BackupChangeTokenHelper.getBackupChangeTokenRowId(
+                        mTransactionManager,
+                        TEST_DATA_TABLE_NAME,
+                        TEST_DATA_TABLE_PAGE_TOKEN,
+                        TEST_CHANGE_LOGS_REQUEST_TOKEN);
+
+        BackupChangeTokenHelper.BackupChangeToken backupChangeToken =
+                BackupChangeTokenHelper.getBackupChangeToken(
+                        mTransactionManager, backupChangeTokenRowId);
+        assertThat(backupChangeToken.getChangeLogsRequestToken())
+                .isEqualTo(TEST_CHANGE_LOGS_REQUEST_TOKEN);
+        assertThat(backupChangeToken.getDataTablePageToken()).isEqualTo(TEST_DATA_TABLE_PAGE_TOKEN);
+        assertThat(backupChangeToken.getDataTableName()).isEqualTo(TEST_DATA_TABLE_NAME);
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsHelperTest.java
index 7c19c63..eebde8d 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/ChangeLogsHelperTest.java
@@ -18,22 +18,77 @@
 
 import static android.health.connect.Constants.DEFAULT_PAGE_SIZE;
 import static android.health.connect.Constants.DELETE;
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE;
+import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_DISTANCE;
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_STEPS;
 
+import static com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper.APP_ID_COLUMN_NAME;
+import static com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper.OPERATION_TYPE_COLUMN_NAME;
+import static com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper.RECORD_TYPE_COLUMN_NAME;
+import static com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper.TIME_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper.UUIDS_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.bytesToUuids;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.android.server.healthconnect.storage.request.UpsertTableRequest;
+import static org.mockito.Mockito.mock;
 
+import android.content.ContentValues;
+import android.content.Context;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.accesslog.AccessLog;
+import android.health.connect.datatypes.RecordTypeIdentifier;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.request.UpsertTableRequest;
+import com.android.server.healthconnect.storage.utils.StorageUtils;
+
+import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.quality.Strictness;
 
 import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
 public class ChangeLogsHelperTest {
+
+    @Rule(order = 1)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .setStrictness(Strictness.LENIENT)
+                    .build();
+
+    private ChangeLogsHelper mChangeLogsHelper;
+    private TransactionManager mTransactionManager;
+
+    @Before
+    public void setup() {
+        Context context = ApplicationProvider.getApplicationContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mChangeLogsHelper = healthConnectInjector.getChangeLogsHelper();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+    }
+
     @Test
     public void changeLogs_getUpsertTableRequests_listLessThanDefaultPageSize() {
         ChangeLogsHelper.ChangeLogs changeLogs =
@@ -66,4 +121,59 @@
                 bytesToUuids((byte[]) requests.get(1).getContentValues().get(UUIDS_COLUMN_NAME));
         assertThat(uuidList2).hasSize(1);
     }
+
+    @Test
+    public void getRecordTypesWrittenInPast30Days_ignoresOperationsOtherThanUpsert() {
+        insertChangeLog(
+                /* recordType= */ RECORD_TYPE_STEPS,
+                /* appInfoId= */ 1,
+                /* operationType= */ AccessLog.OperationType.OPERATION_TYPE_UPSERT,
+                /* timeStamp= */ Instant.now().toEpochMilli());
+        insertChangeLog(
+                /* recordType= */ RECORD_TYPE_DISTANCE,
+                /* appInfoId= */ 1,
+                /* operationType= */ AccessLog.OperationType.OPERATION_TYPE_UPSERT,
+                /* timeStamp= */ Instant.now().minus(20, ChronoUnit.DAYS).toEpochMilli());
+        insertChangeLog(
+                /* recordType= */ RECORD_TYPE_BLOOD_PRESSURE,
+                /* appInfoId= */ 1,
+                /* operationType= */ AccessLog.OperationType.OPERATION_TYPE_DELETE,
+                /* timeStamp= */ Instant.now().minus(20, ChronoUnit.DAYS).toEpochMilli());
+
+        assertThat(mChangeLogsHelper.getRecordTypesWrittenInPast30Days())
+                .containsExactly(RECORD_TYPE_STEPS, RECORD_TYPE_DISTANCE);
+    }
+
+    @Test
+    public void getRecordTypesWrittenInPast30Days_ignoresDataWrittenMoreThan30DaysAgo() {
+        insertChangeLog(
+                /* recordType= */ RECORD_TYPE_STEPS,
+                /* appInfoId= */ 1,
+                /* operationType= */ AccessLog.OperationType.OPERATION_TYPE_UPSERT,
+                /* timeStamp= */ Instant.now().toEpochMilli());
+        insertChangeLog(
+                /* recordType= */ RECORD_TYPE_DISTANCE,
+                /* appInfoId= */ 2,
+                /* operationType= */ AccessLog.OperationType.OPERATION_TYPE_UPSERT,
+                /* timeStamp= */ Instant.now().minus(31, ChronoUnit.DAYS).toEpochMilli());
+
+        assertThat(mChangeLogsHelper.getRecordTypesWrittenInPast30Days())
+                .containsExactly(RECORD_TYPE_STEPS);
+    }
+
+    private void insertChangeLog(
+            @RecordTypeIdentifier.RecordType int recordType,
+            int appInfoId,
+            @AccessLog.OperationType.OperationTypes int operationType,
+            long timeStamp) {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(RECORD_TYPE_COLUMN_NAME, recordType);
+        contentValues.put(APP_ID_COLUMN_NAME, appInfoId);
+        contentValues.put(OPERATION_TYPE_COLUMN_NAME, operationType);
+        contentValues.put(TIME_COLUMN_NAME, timeStamp);
+        contentValues.put(
+                UUIDS_COLUMN_NAME, StorageUtils.getSingleByteArray(Collections.emptyList()));
+        mTransactionManager.insert(
+                new UpsertTableRequest(ChangeLogsHelper.TABLE_NAME, contentValues));
+    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/DatabaseHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/DatabaseHelperTest.java
index c06f506..2600039 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/DatabaseHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/DatabaseHelperTest.java
@@ -26,12 +26,7 @@
 
 public class DatabaseHelperTest {
 
-    private final Set<Class<?>> mNonSingletonClasses =
-            Set.of(
-                    ActivityDateHelper.class,
-                    MigrationEntityHelper.class,
-                    ChangeLogsHelper.class,
-                    ChangeLogsRequestHelper.class);
+    private final Set<Class<?>> mNonSingletonClasses = Set.of(MigrationEntityHelper.class);
 
     @Test
     public void nonSingletons_doNotHaveCentralState() {
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/HealthConnectDatabaseTestRule.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/HealthConnectDatabaseTestRule.java
index 6330c91..2031f1a 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/HealthConnectDatabaseTestRule.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/HealthConnectDatabaseTestRule.java
@@ -16,7 +16,7 @@
 
 package com.android.server.healthconnect.storage.datatypehelpers;
 
-import static com.android.server.healthconnect.TestUtils.TEST_USER;
+import static com.android.server.healthconnect.storage.HealthConnectDatabase.DEFAULT_DATABASE_NAME;
 
 import static org.mockito.Mockito.when;
 
@@ -25,9 +25,7 @@
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
-import com.android.server.healthconnect.HealthConnectUserContext;
-import com.android.server.healthconnect.storage.TransactionManager;
+import com.android.server.healthconnect.storage.StorageContext;
 
 import org.junit.rules.ExternalResource;
 
@@ -40,49 +38,49 @@
  * <p><code>
  * {@literal @} Rule (order = 1)
  * public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
- *     .mockStatic(HealthConnectManager.class)
- *     .mockStatic(Environment.class)
- *     .setStrictness(Strictness.LENIENT)
- *     .build();
+ * .mockStatic(HealthConnectManager.class)
+ * .mockStatic(Environment.class)
+ * .setStrictness(Strictness.LENIENT)
+ * .build();
  *
  * {@literal @} Rule (order = 2)
  * public final HealthConnectDatabaseTestRule mDatabaseTestRule =
- *     new HealthConnectDatabaseTestRule();
+ * new HealthConnectDatabaseTestRule();
  * </code>
  *
  * <p>Mocking is done in the test class rather than here to avoid interferences for Mockito session
  * handling when multiple test rules are used. It avoids starting multiple sessions in parallel.
+ *
+ * @deprecated Use {@link com.android.server.healthconnect.SQLiteDatabaseFixture} instead.
  */
+@Deprecated
 public class HealthConnectDatabaseTestRule extends ExternalResource {
-    private HealthConnectUserContext mContext;
-    private TransactionManager mTransactionManager;
+    private StorageContext mStorageContext;
+    private final String mDatabaseName;
 
     // Mock Environment using ExtendedMockitoRule in the test using this rule.
-    public HealthConnectDatabaseTestRule() {}
+    public HealthConnectDatabaseTestRule() {
+        this(DEFAULT_DATABASE_NAME);
+    }
+
+    public HealthConnectDatabaseTestRule(String databaseName) {
+        mDatabaseName = databaseName;
+    }
 
     @Override
     public void before() {
-        mContext =
-                new HealthConnectUserContext(
-                        InstrumentationRegistry.getInstrumentation().getContext(), TEST_USER);
-        File mockDataDirectory = mContext.getDir("mock_data", Context.MODE_PRIVATE);
+        Context context = InstrumentationRegistry.getInstrumentation().getContext();
+        File mockDataDirectory = context.getDir("mock_data", Context.MODE_PRIVATE);
         when(Environment.getDataDirectory()).thenReturn(mockDataDirectory);
-        TransactionManager.cleanUpForTest();
-        mTransactionManager = TransactionManager.initializeInstance(mContext);
-        HealthConnectDeviceConfigManager.initializeInstance(mContext);
+        mStorageContext = StorageContext.create(context, context.getUser());
     }
 
     @Override
     public void after() {
-        DatabaseHelper.clearAllData(mTransactionManager);
-        TransactionManager.cleanUpForTest();
+        mStorageContext.deleteDatabase(mDatabaseName);
     }
 
-    public HealthConnectUserContext getUserContext() {
-        return mContext;
-    }
-
-    public TransactionManager getTransactionManager() {
-        return mTransactionManager;
+    public StorageContext getDatabaseContext() {
+        return mStorageContext;
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelperTest.java
index 7ba3285..4ef16ea 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelperTest.java
@@ -23,13 +23,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -43,15 +42,16 @@
 import android.health.connect.HealthDataCategory;
 import android.health.connect.HealthPermissions;
 import android.health.connect.datatypes.RecordTypeIdentifier;
-import android.os.UserHandle;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.TestUtils;
-import com.android.server.healthconnect.permission.HealthConnectPermissionHelper;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.permission.PackageInfoUtils;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.DeleteTableRequest;
@@ -66,6 +66,7 @@
 import org.mockito.ArgumentMatcher;
 import org.mockito.Mock;
 import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -94,7 +95,6 @@
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(TransactionManager.class)
                     .mockStatic(AppInfoHelper.class)
-                    .mockStatic(HealthConnectDeviceConfigManager.class)
                     .mockStatic(PackageInfoUtils.class)
                     .mockStatic(PreferenceHelper.class)
                     .mockStatic(HealthConnectManager.class)
@@ -103,27 +103,29 @@
     @Mock private Cursor mCursor;
     @Mock private TransactionManager mTransactionManager;
     @Mock private AppInfoHelper mAppInfoHelper;
-    @Mock private HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
-    @Mock private HealthConnectPermissionHelper mHealthConnectPermissionHelper;
     @Mock private PackageInfoUtils mPackageInfoUtils;
     @Mock private PackageInfo mPackageInfo1;
     @Mock private PackageInfo mPackageInfo2;
-    @Mock private PackageInfo mPackageInfo3;
     @Mock private PreferenceHelper mPreferenceHelper;
+
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
+
     private HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
-    private Context mContext;
 
     @Before
     public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
         when(mTransactionManager.read(any())).thenReturn(mCursor);
-        when(mTransactionManager.getCurrentUserHandle()).thenReturn(UserHandle.CURRENT);
-        when(mAppInfoHelper.getOrInsertAppInfoId(eq(APP_PACKAGE_NAME), any()))
-                .thenReturn(APP_PACKAGE_ID);
-        when(mAppInfoHelper.getOrInsertAppInfoId(eq(APP_PACKAGE_NAME_2), any()))
+        when(mAppInfoHelper.getOrInsertAppInfoId(eq(APP_PACKAGE_NAME))).thenReturn(APP_PACKAGE_ID);
+        when(mAppInfoHelper.getOrInsertAppInfoId(eq(APP_PACKAGE_NAME_2)))
                 .thenReturn(APP_PACKAGE_ID_2);
-        when(mAppInfoHelper.getOrInsertAppInfoId(eq(APP_PACKAGE_NAME_3), any()))
+        when(mAppInfoHelper.getOrInsertAppInfoId(eq(APP_PACKAGE_NAME_3)))
                 .thenReturn(APP_PACKAGE_ID_3);
-        when(mAppInfoHelper.getOrInsertAppInfoId(eq(APP_PACKAGE_NAME_4), any()))
+        when(mAppInfoHelper.getOrInsertAppInfoId(eq(APP_PACKAGE_NAME_4)))
                 .thenReturn(APP_PACKAGE_ID_4);
         when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME)).thenReturn(APP_PACKAGE_ID);
         when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME_2)).thenReturn(APP_PACKAGE_ID_2);
@@ -138,27 +140,23 @@
         when(mCursor.getColumnIndex(eq(APP_ID_PRIORITY_ORDER_COLUMN_NAME)))
                 .thenReturn(APP_ID_PRIORITY_ORDER_COLUMN_INDEX);
 
-        HealthDataCategoryPriorityHelper.clearInstanceForTest();
+        Context context = InstrumentationRegistry.getInstrumentation().getContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .setAppInfoHelper(mAppInfoHelper)
+                        .setTransactionManager(mTransactionManager)
+                        .setPreferenceHelper(mPreferenceHelper)
+                        .setPackageInfoUtils(mPackageInfoUtils)
+                        .build();
         mHealthDataCategoryPriorityHelper =
-                HealthDataCategoryPriorityHelper.getInstance(
-                        mAppInfoHelper,
-                        mTransactionManager,
-                        mHealthConnectDeviceConfigManager,
-                        mPreferenceHelper,
-                        mPackageInfoUtils);
-        // Clear data in case the singleton is already initialised.
-        mHealthDataCategoryPriorityHelper.clearData(mTransactionManager);
-        mContext = InstrumentationRegistry.getInstrumentation().getContext();
+                healthConnectInjector.getHealthDataCategoryPriorityHelper();
     }
 
     @After
     public void tearDown() throws Exception {
         TestUtils.waitForAllScheduledTasksToComplete();
-        reset(mPackageInfo1, mPackageInfo2, mPackageInfo3);
-        mHealthDataCategoryPriorityHelper.clearData(mTransactionManager);
-        clearInvocations(mPreferenceHelper);
-        clearInvocations(mTransactionManager);
-        clearInvocations(mHealthConnectDeviceConfigManager);
     }
 
     @Test
@@ -168,11 +166,12 @@
                 HealthDataCategory.BODY_MEASUREMENTS, List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2));
         setupPriorityList(priorityList);
 
-        when(mAppInfoHelper.getOrInsertAppInfoId(any(), any())).thenReturn(APP_PACKAGE_ID);
+        when(mAppInfoHelper.getOrInsertAppInfoId(any(), anyString())).thenReturn(APP_PACKAGE_ID);
         mHealthDataCategoryPriorityHelper.appendToPriorityList(
-                APP_PACKAGE_NAME, HealthDataCategory.BODY_MEASUREMENTS, mContext, true);
+                APP_PACKAGE_NAME, HealthDataCategory.BODY_MEASUREMENTS, true);
 
-        verify(mTransactionManager, never()).insertOrReplace(any());
+        verify(mTransactionManager, never())
+                .insertOrReplaceOnConflict(any(UpsertTableRequest.class));
     }
 
     @Test
@@ -183,15 +182,15 @@
         setupPriorityList(priorityList);
 
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        doReturn(true).when(spy).isDefaultApp(eq(APP_PACKAGE_NAME_4), any());
-        when(mAppInfoHelper.getOrInsertAppInfoId(any(), any())).thenReturn(APP_PACKAGE_ID_4);
-        spy.appendToPriorityList(
-                APP_PACKAGE_NAME_4, HealthDataCategory.BODY_MEASUREMENTS, mContext, false);
+        doReturn(true).when(spy).isDefaultApp(APP_PACKAGE_NAME_4);
+        when(mAppInfoHelper.getOrInsertAppInfoId(any(), anyString())).thenReturn(APP_PACKAGE_ID_4);
+        spy.appendToPriorityList(APP_PACKAGE_NAME_4, HealthDataCategory.BODY_MEASUREMENTS, false);
 
         List<Long> expectedPriorityOrder =
                 List.of(APP_PACKAGE_ID_4, APP_PACKAGE_ID, APP_PACKAGE_ID_2);
         verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
+                .insertOrReplaceOnConflict(
+                        argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
         assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.BODY_MEASUREMENTS))
                 .isEqualTo(expectedPriorityOrder);
     }
@@ -204,15 +203,15 @@
         setupPriorityList(priorityList);
 
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        doReturn(false).when(spy).isDefaultApp(eq(APP_PACKAGE_NAME_4), any());
-        when(mAppInfoHelper.getOrInsertAppInfoId(any(), any())).thenReturn(APP_PACKAGE_ID_4);
-        spy.appendToPriorityList(
-                APP_PACKAGE_NAME_4, HealthDataCategory.BODY_MEASUREMENTS, mContext, false);
+        doReturn(false).when(spy).isDefaultApp(APP_PACKAGE_NAME_4);
+        when(mAppInfoHelper.getOrInsertAppInfoId(any(), anyString())).thenReturn(APP_PACKAGE_ID_4);
+        spy.appendToPriorityList(APP_PACKAGE_NAME_4, HealthDataCategory.BODY_MEASUREMENTS, false);
 
         List<Long> expectedPriorityOrder =
                 List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2, APP_PACKAGE_ID_4);
         verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
+                .insertOrReplaceOnConflict(
+                        argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
         assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.BODY_MEASUREMENTS))
                 .isEqualTo(expectedPriorityOrder);
     }
@@ -225,15 +224,15 @@
         setupPriorityList(priorityList);
 
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        doReturn(true).when(spy).isDefaultApp(eq(APP_PACKAGE_NAME_4), any());
-        when(mAppInfoHelper.getOrInsertAppInfoId(any(), any())).thenReturn(APP_PACKAGE_ID_4);
-        spy.appendToPriorityList(
-                APP_PACKAGE_NAME_4, HealthDataCategory.BODY_MEASUREMENTS, mContext, true);
+        doReturn(true).when(spy).isDefaultApp(APP_PACKAGE_NAME_4);
+        when(mAppInfoHelper.getOrInsertAppInfoId(any(), anyString())).thenReturn(APP_PACKAGE_ID_4);
+        spy.appendToPriorityList(APP_PACKAGE_NAME_4, HealthDataCategory.BODY_MEASUREMENTS, true);
 
         List<Long> expectedPriorityOrder =
                 List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2, APP_PACKAGE_ID_4);
         verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
+                .insertOrReplaceOnConflict(
+                        argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
         assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.BODY_MEASUREMENTS))
                 .isEqualTo(expectedPriorityOrder);
     }
@@ -245,128 +244,66 @@
                 HealthDataCategory.BODY_MEASUREMENTS, List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2));
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
         setupPriorityList(priorityList);
+        setupPackageInfoWithWritePermissionGranted();
 
-        when(mHealthConnectPermissionHelper.getGrantedHealthPermissions(
-                        eq(APP_PACKAGE_NAME), any()))
-                .thenReturn(
-                        List.of(HealthPermissions.READ_DISTANCE, HealthPermissions.WRITE_STEPS));
-        HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        spy.maybeRemoveAppFromPriorityList(
-                APP_PACKAGE_NAME,
-                HealthDataCategory.ACTIVITY,
-                mHealthConnectPermissionHelper,
-                UserHandle.CURRENT);
+        mHealthDataCategoryPriorityHelper.maybeRemoveAppFromPriorityList(
+                APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
 
-        verify(mTransactionManager, never()).insertOrReplace(any());
+        verify(mTransactionManager, never())
+                .insertOrReplaceOnConflict(any(UpsertTableRequest.class));
     }
 
     @Test
-    public void testNewMaybeRemoveAppFromPriorityList_ifDataForApp_doesNotRemoveApp() {
+    public void testMaybeRemoveAppFromPriorityList_ifDataForApp_doesNotRemoveApp() {
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(
                 HealthDataCategory.BODY_MEASUREMENTS, List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2));
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
         setupPriorityList(priorityList);
+        setupPackageInfoWithWritePermissionNotGranted();
 
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
-        when(mHealthConnectPermissionHelper.getGrantedHealthPermissions(
-                        eq(APP_PACKAGE_NAME), any()))
-                .thenReturn(List.of(HealthPermissions.READ_DISTANCE));
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
         doReturn(true)
                 .when(spy)
                 .appHasDataInCategory(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
-        spy.maybeRemoveAppFromPriorityList(
-                APP_PACKAGE_NAME,
-                HealthDataCategory.ACTIVITY,
-                mHealthConnectPermissionHelper,
-                UserHandle.CURRENT);
+        spy.maybeRemoveAppFromPriorityList(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
 
-        verify(mTransactionManager, never()).insertOrReplace(any());
+        verify(mTransactionManager, never())
+                .insertOrReplaceOnConflict(any(UpsertTableRequest.class));
     }
 
     @Test
-    public void testNewMaybeRemoveAppFromPriorityList_ifNoDataForApp_removesApp() {
+    public void testMaybeRemoveAppFromPriorityList_ifNoDataForApp_removesApp() {
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(
                 HealthDataCategory.BODY_MEASUREMENTS, List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2));
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
         setupPriorityList(priorityList);
+        setupPackageInfoWithWritePermissionNotGranted();
 
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
-        when(mHealthConnectPermissionHelper.getGrantedHealthPermissions(
-                        eq(APP_PACKAGE_NAME), any()))
-                .thenReturn(List.of(HealthPermissions.READ_DISTANCE));
-        when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME)).thenReturn(APP_PACKAGE_ID);
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
         doReturn(false)
                 .when(spy)
                 .appHasDataInCategory(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
-        spy.maybeRemoveAppFromPriorityList(
-                APP_PACKAGE_NAME,
-                HealthDataCategory.ACTIVITY,
-                mHealthConnectPermissionHelper,
-                UserHandle.CURRENT);
+        spy.maybeRemoveAppFromPriorityList(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
 
         List<Long> expectedPriorityOrder = List.of(APP_PACKAGE_ID_3);
         verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
+                .insertOrReplaceOnConflict(
+                        argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
         assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.ACTIVITY))
                 .isEqualTo(expectedPriorityOrder);
     }
 
     @Test
-    public void testOldMaybeRemoveAppFromPriorityList_ifNoWritePermissionsForApp_removesApp() {
+    public void
+            testMaybeRemoveAppFromPriorityList_allCategories_ifWritePermissionsForApp_doesNotRemoveApp() {
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
         setupPriorityList(priorityList);
+        setupPackageInfoWithWritePermissionGranted();
 
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        when(mHealthConnectPermissionHelper.getGrantedHealthPermissions(
-                        eq(APP_PACKAGE_NAME), any()))
-                .thenReturn(List.of(HealthPermissions.READ_DISTANCE));
-        when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME)).thenReturn(APP_PACKAGE_ID);
-        HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        doReturn(true)
-                .when(spy)
-                .appHasDataInCategory(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
-        spy.maybeRemoveAppFromPriorityList(
-                APP_PACKAGE_NAME,
-                HealthDataCategory.ACTIVITY,
-                mHealthConnectPermissionHelper,
-                UserHandle.CURRENT);
-
-        List<Long> expectedPriorityOrder = List.of(APP_PACKAGE_ID_3);
-        verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
-        assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.ACTIVITY))
-                .isEqualTo(expectedPriorityOrder);
-    }
-
-    @Test
-    public void testUpdateHealthDataPriority_ifWritePermissionsForApp_doesNotRemoveApp() {
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
-        setupPriorityList(priorityList);
-
-        when(mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(any(), any(), any()))
-                .thenReturn(mPackageInfo1);
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.WRITE_OVULATION_TEST
-                };
-        when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
-        mPackageInfo1.requestedPermissionsFlags =
-                new int[] {0, PackageInfo.REQUESTED_PERMISSION_GRANTED, 0, 0};
-        mHealthDataCategoryPriorityHelper.updateHealthDataPriority(
-                new String[] {APP_PACKAGE_NAME}, UserHandle.CURRENT, mContext);
+        mHealthDataCategoryPriorityHelper.maybeRemoveAppFromPriorityList(APP_PACKAGE_NAME);
 
         List<Long> expectedPriorityOrder = List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID);
         assertThat(
@@ -376,129 +313,67 @@
     }
 
     @Test
-    public void testNewUpdateHealthDataPriority_ifDataForApp_doesNotRemoveApp() {
+    public void testMaybeRemoveAppFromPriorityList_allCategories_ifDataForApp_doesNotRemoveApp() {
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
         setupPriorityList(priorityList);
+        setupPackageInfoWithWritePermissionNotGranted();
 
-        when(mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(any(), any(), any()))
-                .thenReturn(mPackageInfo1);
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.WRITE_OVULATION_TEST
-                };
-        mPackageInfo1.requestedPermissionsFlags = new int[] {0, 0, 0, 0};
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
         doReturn(true)
                 .when(spy)
                 .appHasDataInCategory(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
-        spy.updateHealthDataPriority(new String[] {APP_PACKAGE_NAME}, UserHandle.CURRENT, mContext);
+        spy.maybeRemoveAppFromPriorityList(APP_PACKAGE_NAME);
 
-        verify(mTransactionManager, never()).insertOrReplace(any());
+        verify(mTransactionManager, never())
+                .insertOrReplaceOnConflict(any(UpsertTableRequest.class));
     }
 
     @Test
-    public void testNewUpdateHealthDataPriority_ifNoDataForApp_removesApp() {
+    public void testMaybeRemoveAppFromPriorityList_allCategories_ifNoDataForApp_removesApp() {
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
         setupPriorityList(priorityList);
+        setupPackageInfoWithWritePermissionNotGranted();
 
-        when(mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(any(), any(), any()))
-                .thenReturn(mPackageInfo1);
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.WRITE_OVULATION_TEST
-                };
-        mPackageInfo1.requestedPermissionsFlags = new int[] {0, 0, 0, 0};
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
-        when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME)).thenReturn(APP_PACKAGE_ID);
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
         doReturn(false)
                 .when(spy)
                 .appHasDataInCategory(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
 
-        spy.updateHealthDataPriority(new String[] {APP_PACKAGE_NAME}, UserHandle.CURRENT, mContext);
+        spy.maybeRemoveAppFromPriorityList(APP_PACKAGE_NAME);
         List<Long> expectedPriorityOrder = List.of(APP_PACKAGE_ID_3);
         verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
-        assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.ACTIVITY))
-                .isEqualTo(expectedPriorityOrder);
-    }
-
-    @Test
-    public void testOldUpdateHealthDataPriority_ifNoWritePermissionsForApp_removesApp() {
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
-        setupPriorityList(priorityList);
-
-        when(mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(any(), any(), any()))
-                .thenReturn(mPackageInfo1);
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.WRITE_OVULATION_TEST
-                };
-        mPackageInfo1.requestedPermissionsFlags = new int[] {0, 0, 0, 0};
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME)).thenReturn(APP_PACKAGE_ID);
-        HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        doReturn(true)
-                .when(spy)
-                .appHasDataInCategory(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
-
-        spy.updateHealthDataPriority(new String[] {APP_PACKAGE_NAME}, UserHandle.CURRENT, mContext);
-
-        List<Long> expectedPriorityOrder = List.of(APP_PACKAGE_ID_3);
-        verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
-        assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.ACTIVITY))
-                .isEqualTo(expectedPriorityOrder);
-    }
-
-    @Test
-    public void testOldMaybeRemoveAppWithoutWritePermissionsFromPriorityList_removesApp() {
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
-        setupPriorityList(priorityList);
-
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME)).thenReturn(APP_PACKAGE_ID);
-        HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        spy.maybeRemoveAppWithoutWritePermissionsFromPriorityList(APP_PACKAGE_NAME);
-
-        List<Long> expectedPriorityOrder = List.of(APP_PACKAGE_ID_3);
-        verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
+                .insertOrReplaceOnConflict(
+                        argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
         assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.ACTIVITY))
                 .isEqualTo(expectedPriorityOrder);
     }
 
     @Test
     public void
-            testNewMaybeRemoveAppWithoutWritePermissionsFromPriorityList_ifNoDataForApp_removesApp() {
+            testMaybeRemoveAppWithoutWritePermissionsFromPriorityList_ifDataForApp_doesNotRemoveApp() {
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
         setupPriorityList(priorityList);
 
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
-        when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME)).thenReturn(APP_PACKAGE_ID);
+        HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
+        doReturn(true)
+                .when(spy)
+                .appHasDataInCategory(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
+        spy.maybeRemoveAppWithoutWritePermissionsFromPriorityList(APP_PACKAGE_NAME);
+
+        verify(mTransactionManager, never())
+                .insertOrReplaceOnConflict(any(UpsertTableRequest.class));
+    }
+
+    @Test
+    public void
+            testMaybeRemoveAppWithoutWritePermissionsFromPriorityList_ifNoDataForApp_removesApp() {
+        Map<Integer, List<Long>> priorityList = new HashMap<>();
+        priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
+        setupPriorityList(priorityList);
+
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
         doReturn(false)
                 .when(spy)
@@ -507,74 +382,25 @@
 
         List<Long> expectedPriorityOrder = List.of(APP_PACKAGE_ID_3);
         verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
+                .insertOrReplaceOnConflict(
+                        argThat(new UpsertRequestMatcher(expectedPriorityOrder)));
         assertThat(spy.getAppIdPriorityOrder(HealthDataCategory.ACTIVITY))
                 .isEqualTo(expectedPriorityOrder);
     }
 
     @Test
-    public void
-            testNewMaybeRemoveAppWithoutWritePermissionsFromPriorityList_ifDataForApp_doesNotRemoveApp() {
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
-        setupPriorityList(priorityList);
-
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
-        when(mAppInfoHelper.getAppInfoId(APP_PACKAGE_NAME)).thenReturn(APP_PACKAGE_ID);
-        HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        doReturn(true)
-                .when(spy)
-                .appHasDataInCategory(APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY);
-        spy.maybeRemoveAppWithoutWritePermissionsFromPriorityList(APP_PACKAGE_NAME);
-
-        verify(mTransactionManager, never()).insertOrReplace(any());
-    }
-
-    @Test
-    public void testOldGetPriorityOrder_doesNotReSyncPriority() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
+    public void testGetPriorityOrder_callsReSyncPriority() {
         when(mAppInfoHelper.getPackageNames(any()))
                 .thenReturn(List.of(APP_PACKAGE_NAME, APP_PACKAGE_NAME_2));
         HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
+        doNothing().when(spy).reSyncHealthDataPriorityTable();
 
-        spy.getPriorityOrder(HealthDataCategory.ACTIVITY, mContext);
-        verify(spy, never()).reSyncHealthDataPriorityTable(mContext);
+        spy.syncAndGetPriorityOrder(HealthDataCategory.ACTIVITY);
+        verify(spy, times(1)).reSyncHealthDataPriorityTable();
     }
 
     @Test
-    public void testNewGetPriorityOrder_callsReSyncPriority() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
-        when(mAppInfoHelper.getPackageNames(any()))
-                .thenReturn(List.of(APP_PACKAGE_NAME, APP_PACKAGE_NAME_2));
-        HealthDataCategoryPriorityHelper spy = Mockito.spy(mHealthDataCategoryPriorityHelper);
-        doNothing().when(spy).reSyncHealthDataPriorityTable(any());
-
-        spy.getPriorityOrder(HealthDataCategory.ACTIVITY, mContext);
-        verify(spy, times(1)).reSyncHealthDataPriorityTable(mContext);
-    }
-
-    @Test
-    public void testGetPriorityOrder_returnsCorrectPriorityForCategory() {
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID));
-        setupPriorityList(priorityList);
-
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        when(mAppInfoHelper.getPackageNames(any()))
-                .thenReturn(List.of(APP_PACKAGE_NAME_3, APP_PACKAGE_NAME));
-
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.getPriorityOrder(
-                                HealthDataCategory.ACTIVITY, mContext))
-                .isEqualTo(List.of(APP_PACKAGE_NAME_3, APP_PACKAGE_NAME));
-    }
-
-    @Test
-    public void testNewSetPriority_additionalPackages_addsToPriorityList() {
+    public void testSetPriority_additionalPackages_addsToPriorityList() {
         List<String> newPriorityOrder =
                 List.of(
                         APP_PACKAGE_NAME_4,
@@ -594,8 +420,6 @@
         setupPriorityList(priorityList);
 
         when(mAppInfoHelper.getAppInfoIds(eq(newPriorityOrder))).thenReturn(newPriorityOrderId);
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
         mHealthDataCategoryPriorityHelper.setPriorityOrder(
                 HealthDataCategory.BODY_MEASUREMENTS, newPriorityOrder);
 
@@ -605,7 +429,7 @@
     }
 
     @Test
-    public void testNewSetPriority_fewerPackages_removesFromPriorityList() {
+    public void testSetPriority_fewerPackages_removesFromPriorityList() {
         List<String> newPriorityOrder = List.of(APP_PACKAGE_NAME_2, APP_PACKAGE_NAME);
 
         List<Long> newPriorityOrderId = new ArrayList<>();
@@ -618,8 +442,6 @@
         setupPriorityList(priorityList);
 
         when(mAppInfoHelper.getAppInfoIds(eq(newPriorityOrder))).thenReturn(newPriorityOrderId);
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
 
         mHealthDataCategoryPriorityHelper.setPriorityOrder(
                 HealthDataCategory.BODY_MEASUREMENTS, newPriorityOrder);
@@ -629,7 +451,7 @@
     }
 
     @Test
-    public void testNewSetPriority_samePackages_reordersPriorityList() {
+    public void testSetPriority_samePackages_reordersPriorityList() {
         List<String> newPriorityOrder =
                 List.of(
                         APP_PACKAGE_NAME_3,
@@ -650,8 +472,6 @@
         setupPriorityList(priorityList);
 
         when(mAppInfoHelper.getAppInfoIds(eq(newPriorityOrder))).thenReturn(newPriorityOrderId);
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
         mHealthDataCategoryPriorityHelper.setPriorityOrder(
                 HealthDataCategory.BODY_MEASUREMENTS, newPriorityOrder);
 
@@ -661,291 +481,7 @@
     }
 
     @Test
-    public void testOldSetPriority_additionalPackagesDifferentOrder_newPackagesRemoved() {
-        List<String> newPriorityOrder =
-                List.of(
-                        APP_PACKAGE_NAME_4,
-                        APP_PACKAGE_NAME_3,
-                        APP_PACKAGE_NAME_2,
-                        APP_PACKAGE_NAME);
-
-        List<Long> newPriorityOrderId = new ArrayList<>();
-        newPriorityOrderId.add(APP_PACKAGE_ID_4);
-        newPriorityOrderId.add(APP_PACKAGE_ID_3);
-        newPriorityOrderId.add(APP_PACKAGE_ID_2);
-        newPriorityOrderId.add(APP_PACKAGE_ID);
-
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(
-                HealthDataCategory.BODY_MEASUREMENTS, List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2));
-        setupPriorityList(priorityList);
-
-        when(mAppInfoHelper.getAppInfoIds(eq(newPriorityOrder))).thenReturn(newPriorityOrderId);
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        mHealthDataCategoryPriorityHelper.setPriorityOrder(
-                HealthDataCategory.BODY_MEASUREMENTS, newPriorityOrder);
-
-        verifyPriorityUpdate(
-                List.of(APP_PACKAGE_ID_2, APP_PACKAGE_ID), HealthDataCategory.BODY_MEASUREMENTS);
-    }
-
-    @Test
-    public void testOldSetPriority_reducedPackagesDifferentOrder_oldPackagesAdded() {
-        List<String> newPriorityOrder = List.of(APP_PACKAGE_NAME_2);
-
-        List<Long> newPriorityOrderId = new ArrayList<>();
-        newPriorityOrderId.add(APP_PACKAGE_ID_2);
-
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(
-                HealthDataCategory.BODY_MEASUREMENTS, List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2));
-        setupPriorityList(priorityList);
-
-        when(mAppInfoHelper.getAppInfoIds(eq(newPriorityOrder))).thenReturn(newPriorityOrderId);
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        mHealthDataCategoryPriorityHelper.setPriorityOrder(
-                HealthDataCategory.BODY_MEASUREMENTS, newPriorityOrder);
-
-        verifyPriorityUpdate(
-                List.of(APP_PACKAGE_ID_2, APP_PACKAGE_ID), HealthDataCategory.BODY_MEASUREMENTS);
-    }
-
-    @Test
-    public void testOldSetPriority_samePackagesDifferentOrder_newPrioritySaved() {
-        List<String> newPriorityOrder =
-                List.of(
-                        APP_PACKAGE_NAME_4,
-                        APP_PACKAGE_NAME_3,
-                        APP_PACKAGE_NAME_2,
-                        APP_PACKAGE_NAME);
-
-        List<Long> newPriorityOrderId = new ArrayList<>();
-        newPriorityOrderId.add(APP_PACKAGE_ID_4);
-        newPriorityOrderId.add(APP_PACKAGE_ID_3);
-        newPriorityOrderId.add(APP_PACKAGE_ID_2);
-        newPriorityOrderId.add(APP_PACKAGE_ID);
-
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(
-                HealthDataCategory.BODY_MEASUREMENTS,
-                List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2, APP_PACKAGE_ID_3, APP_PACKAGE_ID_4));
-        setupPriorityList(priorityList);
-
-        when(mAppInfoHelper.getAppInfoIds(eq(newPriorityOrder))).thenReturn(newPriorityOrderId);
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        mHealthDataCategoryPriorityHelper.setPriorityOrder(
-                HealthDataCategory.BODY_MEASUREMENTS, newPriorityOrder);
-
-        verifyPriorityUpdate(
-                List.of(APP_PACKAGE_ID_4, APP_PACKAGE_ID_3, APP_PACKAGE_ID_2, APP_PACKAGE_ID),
-                HealthDataCategory.BODY_MEASUREMENTS);
-    }
-
-    @Test
-    public void testOldReSyncHealthDataPriorityTable_maintainsExistingOrdering() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        // Setup current priority list
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(
-                HealthDataCategory.ACTIVITY,
-                List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID, APP_PACKAGE_ID_2));
-        setupPriorityList(priorityList);
-
-        // Setup contributor apps
-        Map<Integer, Set<String>> recordTypesToContributorPackages = new HashMap<>();
-        recordTypesToContributorPackages.put(
-                RecordTypeIdentifier.RECORD_TYPE_STEPS,
-                Set.of(APP_PACKAGE_NAME, APP_PACKAGE_NAME_2, APP_PACKAGE_NAME_3));
-        when(mAppInfoHelper.getRecordTypesToContributingPackagesMap())
-                .thenReturn(recordTypesToContributorPackages);
-
-        // Setup apps with write permissions
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions = new String[] {HealthPermissions.WRITE_STEPS};
-        mPackageInfo1.requestedPermissionsFlags =
-                new int[] {PackageInfo.REQUESTED_PERMISSION_GRANTED};
-
-        mPackageInfo2.packageName = APP_PACKAGE_NAME_2;
-        mPackageInfo2.requestedPermissions = new String[] {HealthPermissions.WRITE_STEPS};
-        mPackageInfo2.requestedPermissionsFlags =
-                new int[] {PackageInfo.REQUESTED_PERMISSION_GRANTED};
-
-        mPackageInfo3.packageName = APP_PACKAGE_NAME_3;
-        mPackageInfo3.requestedPermissions = new String[] {HealthPermissions.WRITE_STEPS};
-        mPackageInfo3.requestedPermissionsFlags =
-                new int[] {PackageInfo.REQUESTED_PERMISSION_GRANTED};
-        when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
-                .thenReturn(List.of(mPackageInfo1, mPackageInfo2, mPackageInfo3));
-
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
-
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
-                                HealthDataCategory.ACTIVITY))
-                .isEqualTo(List.of(APP_PACKAGE_ID_3, APP_PACKAGE_ID, APP_PACKAGE_ID_2));
-    }
-
-    @Test
-    public void testOldReSyncHealthDataPriorityTable_addsNewApps_withWritePermission() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        // Setup current priority list
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID));
-        priorityList.put(
-                HealthDataCategory.BODY_MEASUREMENTS,
-                List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2, APP_PACKAGE_ID_3, APP_PACKAGE_ID_4));
-        priorityList.put(HealthDataCategory.SLEEP, List.of(APP_PACKAGE_ID_4, APP_PACKAGE_ID_2));
-        setupPriorityList(priorityList);
-
-        // Setup contributor apps
-        Map<Integer, Set<String>> recordTypesToContributorPackages = new HashMap<>();
-        recordTypesToContributorPackages.put(
-                RecordTypeIdentifier.RECORD_TYPE_STEPS,
-                Set.of(APP_PACKAGE_NAME, APP_PACKAGE_NAME_2));
-        recordTypesToContributorPackages.put(
-                RecordTypeIdentifier.RECORD_TYPE_DISTANCE, Set.of(APP_PACKAGE_NAME_3));
-        recordTypesToContributorPackages.put(
-                RecordTypeIdentifier.RECORD_TYPE_NUTRITION, Set.of(APP_PACKAGE_NAME_2));
-        recordTypesToContributorPackages.put(
-                RecordTypeIdentifier.RECORD_TYPE_SLEEP_SESSION,
-                Set.of(APP_PACKAGE_NAME, APP_PACKAGE_NAME_3, APP_PACKAGE_NAME_2));
-        when(mAppInfoHelper.getRecordTypesToContributingPackagesMap())
-                .thenReturn(recordTypesToContributorPackages);
-
-        // Setup apps with write permissions
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.WRITE_OVULATION_TEST
-                };
-        mPackageInfo1.requestedPermissionsFlags =
-                new int[] {
-                    0,
-                    0,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED
-                };
-
-        mPackageInfo2.packageName = APP_PACKAGE_NAME_2;
-        mPackageInfo2.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_NUTRITION,
-                    HealthPermissions.WRITE_HEART_RATE,
-                    HealthPermissions.READ_BLOOD_GLUCOSE
-                };
-        mPackageInfo2.requestedPermissionsFlags =
-                new int[] {
-                    0,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED
-                };
-        when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
-                .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
-
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
-
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
-                                HealthDataCategory.CYCLE_TRACKING))
-                .isEqualTo(List.of(APP_PACKAGE_ID));
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
-                                HealthDataCategory.NUTRITION))
-                .isEqualTo(List.of(APP_PACKAGE_ID_2));
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
-                                HealthDataCategory.VITALS))
-                .isEqualTo(List.of(APP_PACKAGE_ID_2));
-    }
-
-    @Test
-    public void testOldReSyncHealthDataPriorityTable_removesApps_withoutWritePermissionAndData() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        // Setup current priority list
-        Map<Integer, List<Long>> priorityList = new HashMap<>();
-        priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID));
-        priorityList.put(
-                HealthDataCategory.BODY_MEASUREMENTS,
-                List.of(APP_PACKAGE_ID, APP_PACKAGE_ID_2, APP_PACKAGE_ID_3, APP_PACKAGE_ID_4));
-        priorityList.put(HealthDataCategory.SLEEP, List.of(APP_PACKAGE_ID_4, APP_PACKAGE_ID_2));
-        setupPriorityList(priorityList);
-
-        // Setup apps with write permissions
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.WRITE_OVULATION_TEST
-                };
-        mPackageInfo1.requestedPermissionsFlags =
-                new int[] {
-                    0,
-                    0,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED
-                };
-
-        mPackageInfo2.packageName = APP_PACKAGE_NAME_2;
-        mPackageInfo2.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_NUTRITION,
-                    HealthPermissions.WRITE_HEART_RATE,
-                    HealthPermissions.READ_BLOOD_GLUCOSE
-                };
-        mPackageInfo2.requestedPermissionsFlags =
-                new int[] {
-                    0,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED
-                };
-        when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
-                .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
-
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
-        verify(mTransactionManager)
-                .delete(argThat(new DeleteRequestMatcher(HealthDataCategory.ACTIVITY)));
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
-                                HealthDataCategory.ACTIVITY))
-                .isEqualTo(List.of());
-
-        verify(mTransactionManager)
-                .delete(argThat(new DeleteRequestMatcher(HealthDataCategory.BODY_MEASUREMENTS)));
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
-                                HealthDataCategory.BODY_MEASUREMENTS))
-                .isEqualTo(List.of());
-
-        verify(mTransactionManager)
-                .delete(argThat(new DeleteRequestMatcher(HealthDataCategory.SLEEP)));
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
-                                HealthDataCategory.SLEEP))
-                .isEqualTo(List.of());
-    }
-
-    @Test
-    public void testNewReSyncHealthDataPriorityTable_emptyListAndNoContributingApps_remainsEmpty() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
+    public void testReSyncHealthDataPriorityTable_emptyListAndNoContributingApps_remainsEmpty() {
         // Setup current empty priority list
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of());
@@ -987,7 +523,7 @@
         when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
                 .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
 
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
+        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable();
         assertThat(
                         mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
                                 HealthDataCategory.ACTIVITY))
@@ -999,9 +535,7 @@
     }
 
     @Test
-    public void testNewReSyncHealthDataPriorityTable_emptyList_populateContributingApps() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
+    public void testReSyncHealthDataPriorityTable_emptyList_populateContributingApps() {
         // Setup current empty priority list
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of());
@@ -1057,7 +591,7 @@
         when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
                 .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
 
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
+        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable();
         assertThat(
                         mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
                                 HealthDataCategory.ACTIVITY))
@@ -1069,9 +603,7 @@
     }
 
     @Test
-    public void testNewReSyncHealthDataPriorityTable_oneEmptyList_leaveNonEmptyListsUnchanged() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
+    public void testReSyncHealthDataPriorityTable_oneEmptyList_leaveNonEmptyListsUnchanged() {
         // Setup current empty priority list
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.SLEEP, List.of(APP_PACKAGE_ID_2));
@@ -1127,7 +659,7 @@
         when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
                 .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
 
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
+        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable();
         assertThat(
                         mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
                                 HealthDataCategory.ACTIVITY))
@@ -1140,9 +672,7 @@
     }
 
     @Test
-    public void testNewReSyncHealthDataPriorityTable_newWritePermission_doesNotUpdateTable() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
+    public void testReSyncHealthDataPriorityTable_newWritePermission_doesNotUpdateTable() {
         // Setup current priority list
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID));
@@ -1202,7 +732,7 @@
         when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
                 .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
 
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
+        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable();
         assertThat(
                         mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
                                 HealthDataCategory.VITALS))
@@ -1210,9 +740,7 @@
     }
 
     @Test
-    public void testNewReSyncHealthDataPriorityTable_someAppsNoDataNopermission_removesApps() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
+    public void testReSyncHealthDataPriorityTable_someAppsNoDataNoPermission_removesApps() {
         // Setup current priority list
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID));
@@ -1272,7 +800,7 @@
         when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
                 .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
 
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
+        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable();
         verify(mTransactionManager)
                 .delete(argThat(new DeleteRequestMatcher(HealthDataCategory.ACTIVITY)));
         // This would have been empty hence not populating with contributing apps.
@@ -1294,9 +822,7 @@
     }
 
     @Test
-    public void testNewReSyncHealthDataPriorityTable_noDataNorPermission_removesApps() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
+    public void testReSyncHealthDataPriorityTable_noDataNorPermission_removesApps() {
         // Setup current priority list
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID));
@@ -1342,7 +868,7 @@
         when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
                 .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
 
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
+        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable();
         verify(mTransactionManager)
                 .delete(argThat(new DeleteRequestMatcher(HealthDataCategory.ACTIVITY)));
         assertThat(
@@ -1365,8 +891,6 @@
 
     @Test
     public void testNewReSyncHealthDataPriorityTable_ifDataForApps_doesNotRemoveApps() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
         // Setup current priority list
         Map<Integer, List<Long>> priorityList = new HashMap<>();
         priorityList.put(HealthDataCategory.ACTIVITY, List.of(APP_PACKAGE_ID));
@@ -1427,9 +951,10 @@
         when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
                 .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
 
-        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable(mContext);
+        mHealthDataCategoryPriorityHelper.reSyncHealthDataPriorityTable();
         verify(mTransactionManager, never())
-                .insertOrReplace(argThat(new UpsertRequestMatcher(List.of(APP_PACKAGE_ID))));
+                .insertOrReplaceOnConflict(
+                        argThat(new UpsertRequestMatcher(List.of(APP_PACKAGE_ID))));
         assertThat(
                         mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(
                                 HealthDataCategory.ACTIVITY))
@@ -1450,8 +975,6 @@
 
     @Test
     public void testMaybeAddInactiveAppsToPriorityList_ifPreferenceNotSet_addsToList() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
         when(mPreferenceHelper.getPreference(any())).thenReturn(null);
 
         // Setup contributor apps
@@ -1517,7 +1040,8 @@
         priorityList.put(HealthDataCategory.SLEEP, List.of(APP_PACKAGE_ID_4));
         setupPriorityList(priorityList);
 
-        mHealthDataCategoryPriorityHelper.maybeAddContributingAppsToPriorityList(mContext);
+        mHealthDataCategoryPriorityHelper
+                .addInactiveAppsWhenFirstMigratingToNewAggregationControl();
         verifyPriorityUpdate(
                 List.of(APP_PACKAGE_ID_4, APP_PACKAGE_ID, APP_PACKAGE_ID_2, APP_PACKAGE_ID_3),
                 HealthDataCategory.ACTIVITY);
@@ -1526,22 +1050,12 @@
 
     @Test
     public void testMaybeAddInactiveAppsToPriorityList_ifPreferenceExists_doesNotAdd() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
         when(mPreferenceHelper.getPreference(any())).thenReturn(String.valueOf(true));
-        mHealthDataCategoryPriorityHelper.maybeAddContributingAppsToPriorityList(mContext);
+        mHealthDataCategoryPriorityHelper
+                .addInactiveAppsWhenFirstMigratingToNewAggregationControl();
         verify(mPreferenceHelper, never()).insertOrReplacePreference(any(), any());
-        verify(mTransactionManager, never()).insertOrReplace(any());
-    }
-
-    @Test
-    public void testMaybeAddInactiveAppsToPriorityList_ifOldAggregation_doesNotAdd() {
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(false);
-        mHealthDataCategoryPriorityHelper.maybeAddContributingAppsToPriorityList(mContext);
-        verify(mPreferenceHelper, never()).getPreference(any());
-        verify(mPreferenceHelper, never()).insertOrReplacePreference(any(), any());
-        verify(mTransactionManager, never()).insertOrReplace(any());
+        verify(mTransactionManager, never())
+                .insertOrReplaceOnConflict(any(UpsertTableRequest.class));
     }
 
     @Test
@@ -1767,113 +1281,25 @@
                     PackageInfo.REQUESTED_PERMISSION_GRANTED
                 };
         when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
-                .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
+        when(mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(
+                        eq(APP_PACKAGE_NAME), any(), any()))
+                .thenReturn(mPackageInfo1);
+        when(mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(
+                        eq(APP_PACKAGE_NAME_2), any(), any()))
+                .thenReturn(mPackageInfo2);
 
         Map<Integer, Set<String>> expectedResult = new HashMap<>();
         expectedResult.put(
                 HealthDataCategory.ACTIVITY,
                 Set.of(APP_PACKAGE_NAME, APP_PACKAGE_NAME_2, APP_PACKAGE_NAME_3));
         expectedResult.put(HealthDataCategory.VITALS, Set.of(APP_PACKAGE_NAME, APP_PACKAGE_NAME_3));
-        assertThat(mHealthDataCategoryPriorityHelper.getAllInactiveApps(mContext))
+        assertThat(mHealthDataCategoryPriorityHelper.getAllInactiveApps())
                 .isEqualTo(expectedResult);
     }
 
-    @Test
-    public void testAppHasWriteHealthPermissionsForCategory_ifWritePermission_returnsTrue() {
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.WRITE_OVULATION_TEST
-                };
-        mPackageInfo1.requestedPermissionsFlags =
-                new int[] {
-                    0,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED
-                };
-
-        mPackageInfo2.packageName = APP_PACKAGE_NAME_2;
-        mPackageInfo2.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.READ_SLEEP,
-                    HealthPermissions.WRITE_HEART_RATE,
-                    HealthPermissions.READ_BLOOD_GLUCOSE
-                };
-        mPackageInfo2.requestedPermissionsFlags =
-                new int[] {
-                    0,
-                    0,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED
-                };
-        when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
-                .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.appHasWriteHealthPermissionsForCategory(
-                                APP_PACKAGE_NAME, HealthDataCategory.ACTIVITY, mContext))
-                .isTrue();
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.appHasWriteHealthPermissionsForCategory(
-                                APP_PACKAGE_NAME_2, HealthDataCategory.VITALS, mContext))
-                .isTrue();
-    }
-
-    @Test
-    public void testAppHasWriteHealthPermissionsForCategory_ifNoWritePermission_returnsFalse() {
-        mPackageInfo1.packageName = APP_PACKAGE_NAME;
-        mPackageInfo1.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.WRITE_SLEEP,
-                    HealthPermissions.READ_HEART_RATE,
-                    HealthPermissions.WRITE_OVULATION_TEST
-                };
-        mPackageInfo1.requestedPermissionsFlags =
-                new int[] {
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    0,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED
-                };
-
-        mPackageInfo2.packageName = APP_PACKAGE_NAME_2;
-        mPackageInfo2.requestedPermissions =
-                new String[] {
-                    HealthPermissions.WRITE_STEPS,
-                    HealthPermissions.READ_SLEEP,
-                    HealthPermissions.WRITE_HEART_RATE,
-                    HealthPermissions.READ_BLOOD_GLUCOSE
-                };
-        mPackageInfo2.requestedPermissionsFlags =
-                new int[] {
-                    0,
-                    0,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED,
-                    PackageInfo.REQUESTED_PERMISSION_GRANTED
-                };
-        when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
-        when(mPackageInfoUtils.getPackagesHoldingHealthPermissions(any(), any()))
-                .thenReturn(List.of(mPackageInfo1, mPackageInfo2));
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.appHasWriteHealthPermissionsForCategory(
-                                APP_PACKAGE_NAME, HealthDataCategory.SLEEP, mContext))
-                .isFalse();
-        assertThat(
-                        mHealthDataCategoryPriorityHelper.appHasWriteHealthPermissionsForCategory(
-                                APP_PACKAGE_NAME_2, HealthDataCategory.BODY_MEASUREMENTS, mContext))
-                .isFalse();
-    }
-
     private void verifyPriorityUpdate(List<Long> priorityOrder, int dataCategory) {
         verify(mTransactionManager)
-                .insertOrReplace(argThat(new UpsertRequestMatcher(priorityOrder)));
+                .insertOrReplaceOnConflict(argThat(new UpsertRequestMatcher(priorityOrder)));
 
         assertThat(mHealthDataCategoryPriorityHelper.getAppIdPriorityOrder(dataCategory))
                 .isEqualTo(priorityOrder);
@@ -1943,6 +1369,40 @@
         }
     }
 
+    private void setupPackageInfoWithWritePermissionGranted() {
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = APP_PACKAGE_NAME;
+        packageInfo.requestedPermissions =
+                new String[] {
+                    HealthPermissions.WRITE_SLEEP,
+                    HealthPermissions.WRITE_STEPS,
+                    HealthPermissions.READ_HEART_RATE,
+                    HealthPermissions.WRITE_OVULATION_TEST
+                };
+        when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
+        packageInfo.requestedPermissionsFlags =
+                new int[] {0, PackageInfo.REQUESTED_PERMISSION_GRANTED, 0, 0};
+
+        when(mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(any(), any(), any()))
+                .thenReturn(packageInfo);
+    }
+
+    private void setupPackageInfoWithWritePermissionNotGranted() {
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = APP_PACKAGE_NAME;
+        packageInfo.requestedPermissions =
+                new String[] {
+                    HealthPermissions.WRITE_SLEEP,
+                    HealthPermissions.WRITE_STEPS,
+                    HealthPermissions.READ_HEART_RATE,
+                    HealthPermissions.WRITE_OVULATION_TEST
+                };
+        when(HealthConnectManager.isHealthPermission(any(), any())).thenReturn(true);
+        packageInfo.requestedPermissionsFlags = new int[] {0, 0, 0, 0};
+        when(mPackageInfoUtils.getPackageInfoWithPermissionsAsUser(any(), any(), any()))
+                .thenReturn(packageInfo);
+    }
+
     private void setupPriorityList(Map<Integer, List<Long>> priorityList) {
         List<Boolean> cursorNext = new ArrayList<>();
         List<Integer> categories = new ArrayList<>();
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalDataSourceHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalDataSourceHelperTest.java
index 54d040d..e3d13c5 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalDataSourceHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalDataSourceHelperTest.java
@@ -16,26 +16,33 @@
 
 package com.android.server.healthconnect.storage.datatypehelpers;
 
+import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_DELETE;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_READ;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_UPSERT;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_BASE_URI;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_DISPLAY_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_PACKAGE_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.createAllergyMedicalResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.createImmunizationMedicalResource;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_FHIR_VERSION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_BASE_URI;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_DISPLAY_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_FHIR_VERSION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createAllergyMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createVaccineMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getCreateMedicalDataSourceRequest;
 
+import static com.android.server.healthconnect.TestUtils.TEST_USER;
 import static com.android.server.healthconnect.storage.PhrTestUtils.ACCESS_LOG_EQUIVALENCE;
 import static com.android.server.healthconnect.storage.PhrTestUtils.makeUpsertRequest;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.DATA_SOURCE_UUID_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.DISPLAY_NAME_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.FHIR_BASE_URI_COLUMN_NAME;
+import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.FHIR_VERSION_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.MAX_ALLOWED_MEDICAL_DATA_SOURCES;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.MEDICAL_DATA_SOURCE_TABLE_NAME;
+import static com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper.getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes;
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.LAST_MODIFIED_TIME_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.RecordHelper.PRIMARY_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.BLOB_UNIQUE_NON_NULL;
@@ -50,7 +57,9 @@
 
 import static org.junit.Assert.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.when;
 
@@ -64,17 +73,24 @@
 import android.health.connect.CreateMedicalDataSourceRequest;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.accesslog.AccessLog;
+import android.health.connect.datatypes.FhirVersion;
 import android.health.connect.datatypes.MedicalDataSource;
 import android.health.connect.datatypes.MedicalResource;
-import android.healthconnect.cts.utils.PhrDataFactory;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
 import android.net.Uri;
-import android.os.Environment;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.util.Pair;
 
 import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.FakePreferenceHelper;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.PhrTestUtils;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.CreateTableRequest;
@@ -108,15 +124,13 @@
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 3)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
-
     private static final Instant INSTANT_NOW = Instant.now();
+    private static final Instant INSTANT_NOW_PLUS_TEN_SEC = INSTANT_NOW.plusSeconds(10);
+    private static final Instant INSTANT_NOW_PLUS_TWENTY_SEC = INSTANT_NOW.plusSeconds(20);
 
     private MedicalDataSourceHelper mMedicalDataSourceHelper;
     private MedicalResourceHelper mMedicalResourceHelper;
@@ -126,40 +140,36 @@
     private AccessLogsHelper mAccessLogsHelper;
     private PhrTestUtils mUtil;
     private FakeTimeSource mFakeTimeSource;
+
     @Mock private Context mContext;
     @Mock private PackageManager mPackageManager;
     @Mock private Drawable mDrawable;
 
     @Before
     public void setup() throws NameNotFoundException {
-        AccessLogsHelper.resetInstanceForTest();
-        AppInfoHelper.resetInstanceForTest();
-        mTransactionManager = mHealthConnectDatabaseTestRule.getTransactionManager();
-        mAppInfoHelper = AppInfoHelper.getInstance(mTransactionManager);
-        mAccessLogsHelper = AccessLogsHelper.getInstance(mTransactionManager, mAppInfoHelper);
-        mFakeTimeSource = new FakeTimeSource(INSTANT_NOW);
-        mMedicalDataSourceHelper =
-                new MedicalDataSourceHelper(
-                        mTransactionManager, mAppInfoHelper, mFakeTimeSource, mAccessLogsHelper);
-        mMedicalResourceHelper =
-                new MedicalResourceHelper(
-                        mTransactionManager,
-                        mAppInfoHelper,
-                        mMedicalDataSourceHelper,
-                        mFakeTimeSource,
-                        mAccessLogsHelper);
-        // We set the context to null, because we only use insertApp in this set of tests and
-        // we don't need context for that.
-        mTransactionTestUtils =
-                new TransactionTestUtils(
-                        mHealthConnectDatabaseTestRule.getUserContext(), mTransactionManager);
-        mUtil =
-                new PhrTestUtils(
-                        mContext,
-                        mTransactionManager,
-                        mMedicalResourceHelper,
-                        mMedicalDataSourceHelper);
+
+        when(mContext.getUser()).thenReturn(TEST_USER);
+        when(mContext.createContextAsUser(any(), anyInt())).thenReturn(mContext);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
+
+        mFakeTimeSource = new FakeTimeSource(INSTANT_NOW);
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(mContext)
+                        .setPreferenceHelper(new FakePreferenceHelper())
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .setTimeSource(mFakeTimeSource)
+                        .build();
+
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+        mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
+        mAccessLogsHelper = healthConnectInjector.getAccessLogsHelper();
+        mMedicalDataSourceHelper = healthConnectInjector.getMedicalDataSourceHelper();
+        mMedicalResourceHelper = healthConnectInjector.getMedicalResourceHelper();
+
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mUtil = new PhrTestUtils(mContext, healthConnectInjector);
     }
 
     @After
@@ -176,12 +186,13 @@
                                 MedicalDataSourceHelper.getAppInfoIdColumnName(), INTEGER_NOT_NULL),
                         Pair.create(DISPLAY_NAME_COLUMN_NAME, TEXT_NOT_NULL),
                         Pair.create(FHIR_BASE_URI_COLUMN_NAME, TEXT_NOT_NULL),
+                        Pair.create(FHIR_VERSION_COLUMN_NAME, TEXT_NOT_NULL),
                         Pair.create(DATA_SOURCE_UUID_COLUMN_NAME, BLOB_UNIQUE_NON_NULL),
                         Pair.create(LAST_MODIFIED_TIME_COLUMN_NAME, INTEGER_NOT_NULL));
         CreateTableRequest expected =
                 new CreateTableRequest(MEDICAL_DATA_SOURCE_TABLE_NAME, columnInfo)
                         .addForeignKey(
-                                AppInfoHelper.getInstance().getMainTableName(),
+                                AppInfoHelper.TABLE_NAME,
                                 List.of(MedicalDataSourceHelper.getAppInfoIdColumnName()),
                                 List.of(PRIMARY_COLUMN_NAME));
 
@@ -194,7 +205,9 @@
     public void getUpsertTableRequest_correctResult() {
         CreateMedicalDataSourceRequest createMedicalDataSourceRequest =
                 new CreateMedicalDataSourceRequest.Builder(
-                                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_FHIR_BASE_URI,
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build();
         UUID uuid = UUID.randomUUID();
 
@@ -205,10 +218,12 @@
 
         assertThat(upsertRequest.getTable()).isEqualTo(MEDICAL_DATA_SOURCE_TABLE_NAME);
         assertThat(upsertRequest.getUniqueColumnsCount()).isEqualTo(1);
-        assertThat(contentValues.size()).isEqualTo(5);
+        assertThat(contentValues.size()).isEqualTo(6);
         assertThat(contentValues.get(FHIR_BASE_URI_COLUMN_NAME))
                 .isEqualTo(DATA_SOURCE_FHIR_BASE_URI.toString());
         assertThat(contentValues.get(DISPLAY_NAME_COLUMN_NAME)).isEqualTo(DATA_SOURCE_DISPLAY_NAME);
+        assertThat(contentValues.get(FHIR_VERSION_COLUMN_NAME))
+                .isEqualTo(DATA_SOURCE_FHIR_VERSION.toString());
         assertThat(contentValues.get(DATA_SOURCE_UUID_COLUMN_NAME))
                 .isEqualTo(StorageUtils.convertUUIDToBytes(uuid));
         assertThat(contentValues.get(MedicalDataSourceHelper.getAppInfoIdColumnName()))
@@ -235,94 +250,14 @@
     }
 
     @Test
-    public void getReadTableRequestJoinWithAppInfo_usingMedicalDataSourceId_correctQuery() {
-        UUID uuid1 = UUID.randomUUID();
-        UUID uuid2 = UUID.randomUUID();
-        List<String> hexValues = List.of(getHexString(uuid1), getHexString(uuid2));
-
-        ReadTableRequest readRequest =
-                MedicalDataSourceHelper.getReadTableRequestJoinWithAppInfo(List.of(uuid1, uuid2));
-
-        assertThat(readRequest.getTableName()).isEqualTo(MEDICAL_DATA_SOURCE_TABLE_NAME);
-        assertThat(readRequest.getReadCommand())
-                .isEqualTo(
-                        "SELECT * FROM ( SELECT * FROM medical_data_source_table WHERE"
-                                + " data_source_uuid IN ("
-                                + String.join(", ", hexValues)
-                                + ") ) AS inner_query_result  INNER JOIN application_info_table ON"
-                                + " inner_query_result.app_info_id ="
-                                + " application_info_table.row_id");
-    }
-
-    @Test
-    public void getReadTableRequestForDataSourceWrittenByAppIdFilterOnResourceTypes_correctQuery() {
-        UUID uuid1 = UUID.randomUUID();
-        UUID uuid2 = UUID.randomUUID();
-        List<String> hexValues = List.of(getHexString(uuid1), getHexString(uuid2));
-
-        ReadTableRequest readRequest =
-                MedicalDataSourceHelper
-                        .getReadTableRequestForDataSourceWrittenByAppIdFilterOnResourceTypes(
-                                List.of(uuid1, uuid2),
-                                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
-                                /* appId= */ 123L);
-
-        assertThat(readRequest.getReadCommand())
-                .isEqualTo(
-                        "SELECT DISTINCT package_name,data_source_uuid,fhir_base_uri,display_name"
-                            + " FROM ( SELECT * FROM medical_resource_table ) AS inner_query_result"
-                            + "  INNER JOIN ( SELECT * FROM medical_data_source_table WHERE"
-                            + " app_info_id = '123' AND data_source_uuid IN ("
-                                + String.join(", ", hexValues)
-                                + ")) medical_data_source_table ON"
-                                + " inner_query_result.data_source_id ="
-                                + " medical_data_source_table.medical_data_source_row_id  INNER"
-                                + " JOIN application_info_table ON"
-                                + " medical_data_source_table.app_info_id ="
-                                + " application_info_table.row_id  INNER JOIN ( SELECT * FROM"
-                                + " medical_resource_indices_table WHERE medical_resource_type IN"
-                                + " (1)) medical_resource_indices_table ON"
-                                + " inner_query_result.medical_resource_row_id ="
-                                + " medical_resource_indices_table.medical_resource_id");
-    }
-
-    @Test
-    public void getReadTableRequestForDataSourcesFilterOnResourceTypes_correctQuery() {
-        UUID uuid1 = UUID.randomUUID();
-        UUID uuid2 = UUID.randomUUID();
-        List<String> hexValues = List.of(getHexString(uuid1), getHexString(uuid2));
-
-        ReadTableRequest readRequest =
-                MedicalDataSourceHelper.getReadTableRequestForDataSourcesFilterOnResourceTypes(
-                        List.of(uuid1, uuid2), Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION));
-
-        assertThat(readRequest.getReadCommand())
-                .isEqualTo(
-                        "SELECT DISTINCT package_name,data_source_uuid,fhir_base_uri,display_name"
-                            + " FROM ( SELECT * FROM medical_resource_table ) AS inner_query_result"
-                            + "  INNER JOIN ( SELECT * FROM medical_data_source_table WHERE"
-                            + " data_source_uuid IN ("
-                                + String.join(", ", hexValues)
-                                + ")) medical_data_source_table ON"
-                                + " inner_query_result.data_source_id ="
-                                + " medical_data_source_table.medical_data_source_row_id  INNER"
-                                + " JOIN application_info_table ON"
-                                + " medical_data_source_table.app_info_id ="
-                                + " application_info_table.row_id  INNER JOIN ( SELECT * FROM"
-                                + " medical_resource_indices_table WHERE medical_resource_type IN"
-                                + " (1)) medical_resource_indices_table ON"
-                                + " inner_query_result.medical_resource_row_id ="
-                                + " medical_resource_indices_table.medical_resource_id");
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void getReadTableRequest_noRestrictions_success() throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource expected =
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
 
         ReadTableRequest request =
@@ -335,7 +270,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void getReadTableRequest_packageRestrictionMatches_success()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
@@ -343,6 +278,7 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
 
         long appInfoRestriction = mAppInfoHelper.getAppInfoId(DATA_SOURCE_PACKAGE_NAME);
@@ -356,7 +292,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void getReadTableRequest_packageRestrictionDoesNotMatch_noResult()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
@@ -365,10 +301,12 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         createDataSource(
                 DIFFERENT_DATA_SOURCE_BASE_URI,
                 DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         long appInfoRestriction = mAppInfoHelper.getAppInfoId(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
@@ -382,17 +320,21 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void getReadTableRequest_noIdsPackageRestrictionMatches_succeeds()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         createDataSource(
-                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME, DATA_SOURCE_PACKAGE_NAME);
+                DATA_SOURCE_FHIR_BASE_URI,
+                DATA_SOURCE_DISPLAY_NAME,
+                DATA_SOURCE_FHIR_VERSION,
+                DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource otherDataSource =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         long appInfoRestriction = mAppInfoHelper.getAppInfoId(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
@@ -405,7 +347,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void getReadTableRequest_noIdsNoPackageRestrictionMatches_succeeds()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
@@ -414,11 +356,13 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource otherDataSource =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
         ReadTableRequest request =
@@ -431,7 +375,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void createAndGetSingleMedicalDataSource_packageDoesNotExist_success()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
@@ -439,6 +383,7 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
 
         List<MedicalDataSource> result =
@@ -450,13 +395,14 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void createAndGetSingleMedicalDataSource_packageAlreadyExists_success() {
         mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1 =
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
 
         List<MedicalDataSource> result =
@@ -467,13 +413,15 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void createMedicalDataSources_sameDisplayNamesFromSamePackage_throws() {
         mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
         mMedicalDataSourceHelper.createMedicalDataSource(
                 mContext,
                 new CreateMedicalDataSourceRequest.Builder(
-                                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME)
+                                DATA_SOURCE_FHIR_BASE_URI,
+                                DATA_SOURCE_DISPLAY_NAME,
+                                DATA_SOURCE_FHIR_VERSION)
                         .build(),
                 DATA_SOURCE_PACKAGE_NAME);
 
@@ -484,17 +432,21 @@
                                 mContext,
                                 new CreateMedicalDataSourceRequest.Builder(
                                                 DIFFERENT_DATA_SOURCE_BASE_URI,
-                                                DATA_SOURCE_DISPLAY_NAME)
+                                                DATA_SOURCE_DISPLAY_NAME,
+                                                DATA_SOURCE_FHIR_VERSION)
                                         .build(),
                                 DATA_SOURCE_PACKAGE_NAME));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void createMedicalDataSource_lastModifiedTimeIsPopulated() {
         mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
         createDataSource(
-                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME, DATA_SOURCE_PACKAGE_NAME);
+                DATA_SOURCE_FHIR_BASE_URI,
+                DATA_SOURCE_DISPLAY_NAME,
+                DATA_SOURCE_FHIR_VERSION,
+                DATA_SOURCE_PACKAGE_NAME);
 
         long lastModifiedTimestamp =
                 mUtil.readLastModifiedTimestamp(MEDICAL_DATA_SOURCE_TABLE_NAME);
@@ -503,7 +455,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void createAndGetMultipleMedicalDataSources_bothPackagesAlreadyExist_success() {
         mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
         mTransactionTestUtils.insertApp(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
@@ -511,11 +463,13 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
 
         List<MedicalDataSource> result =
@@ -526,7 +480,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void createAndGetMultipleMedicalDataSourcesWithSamePackage_packageDoesNotExist_success()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
@@ -534,11 +488,13 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         List<MedicalDataSource> expected = List.of(dataSource1, dataSource2);
 
@@ -551,7 +507,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void
             createAndGetMultipleMedicalDataSourcesWithDifferentPackages_packagesDoNotExist_success()
                     throws NameNotFoundException {
@@ -561,11 +517,13 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
         List<MedicalDataSource> result =
@@ -576,7 +534,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void createMultipleMedicalDataSources_maxLimitExceeded_throws()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
@@ -585,6 +543,7 @@
             createDataSource(
                     Uri.withAppendedPath(DATA_SOURCE_FHIR_BASE_URI, "/" + suffix),
                     DATA_SOURCE_DISPLAY_NAME + " " + suffix,
+                    DATA_SOURCE_FHIR_VERSION,
                     DATA_SOURCE_PACKAGE_NAME);
         }
 
@@ -594,12 +553,13 @@
                     createDataSource(
                             DATA_SOURCE_FHIR_BASE_URI,
                             DATA_SOURCE_DISPLAY_NAME,
+                            DATA_SOURCE_FHIR_VERSION,
                             DATA_SOURCE_PACKAGE_NAME);
                 });
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void getMedicalDataSourcesByPackage_noPackages_returnsAll() throws Exception {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
@@ -607,11 +567,13 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
         List<MedicalDataSource> dataSources =
@@ -622,7 +584,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
     public void getMedicalDataSourcesByPackage_onePackage_filters() throws Exception {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
@@ -630,11 +592,13 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
         List<MedicalDataSource> dataSources1 =
@@ -649,7 +613,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getDataSourcesByIds_noWriteOrReadPerm_throws() {
         assertThrows(
                 IllegalStateException.class,
@@ -665,7 +629,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getDataSourcesByIds_hasWritePermButNeverWrittenData_noReadPerm_throws() {
         assertThrows(
                 IllegalArgumentException.class,
@@ -681,17 +645,20 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getDataSourcesByIds_inBgWithoutBgPermHasWritePerm_canReadSelfDataSources() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource1);
-        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource1, INSTANT_NOW);
+        upsertResourceAtTime(
+                PhrDataFactory::createAllergyMedicalResource,
+                dataSource1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
 
         List<MedicalDataSource> result =
@@ -703,19 +670,16 @@
                         /* isCalledFromBgWithoutBgRead= */ true,
                         mAppInfoHelper);
 
-        assertThat(result).containsExactly(dataSource1);
+        assertThat(result)
+                .containsExactly(addLastDataUpdateTime(dataSource1, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void createMedicalDataSource_createsAccessLog() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
-        CreateMedicalDataSourceRequest request =
-                new CreateMedicalDataSourceRequest.Builder(
-                                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME)
-                        .build();
         mMedicalDataSourceHelper.createMedicalDataSource(
-                mContext, request, DATA_SOURCE_PACKAGE_NAME);
+                mContext, getCreateMedicalDataSourceRequest(), DATA_SOURCE_PACKAGE_NAME);
 
         AccessLog expected =
                 new AccessLog(
@@ -731,11 +695,11 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getById_inBgWithoutBgPerm_hasWritePerm_noAccessLog() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 toUuids(List.of(dataSource1.getId())),
                 /* grantedReadMedicalResourceTypes= */ Set.of(),
@@ -759,14 +723,14 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getById_inBgWithoutBgPerm_hasWritePerm_hasReadPermForResourceTypes_noAccessLog() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 toUuids(List.of(dataSource1.getId())),
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ true,
@@ -787,14 +751,14 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void getById_inBgWithoutBgPerm_noWritePerm_immunizationReadPermOnly_noAccessLog() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getById_inBgWithoutBgPerm_noWritePerm_vaccineReadPermOnly_noAccessLog() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 toUuids(List.of(dataSource1.getId())),
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ false,
                 /* isCalledFromBgWithoutBgRead= */ true,
@@ -815,25 +779,24 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getById_expectAccessLogsWhenDataAccessedIsThroughReadPermission() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationPackage1 =
-                createImmunizationMedicalResource(dataSource1.getId());
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 = createVaccineMedicalResource(dataSource1.getId());
         MedicalResource allergyResourcePackage2 = createAllergyMedicalResource(dataSource2.getId());
 
         mMedicalResourceHelper.upsertMedicalResources(
-                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(immunizationPackage1)));
+                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(vaccineDS1)));
         mMedicalResourceHelper.upsertMedicalResources(
                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME,
                 List.of(makeUpsertRequest(allergyResourcePackage2)));
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 toUuids(List.of(dataSource1.getId(), dataSource2.getId())),
-                Set.of(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ false,
@@ -841,7 +804,7 @@
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE read permission.
+        // has MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES read permission.
         // has write permission.
         // The data that the calling app can read: dataSource1 (through selfRead)
         // dataSource1 (through read permission for allergy).
@@ -863,24 +826,23 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getById_expectAccessLogsWhenAppHasNoWritePermHasReadPermButReadOnlySelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationPackage1 =
-                createImmunizationMedicalResource(dataSource1.getId());
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 = createVaccineMedicalResource(dataSource1.getId());
         MedicalResource allergyPackage2 = createAllergyMedicalResource(dataSource2.getId());
 
         mMedicalResourceHelper.upsertMedicalResources(
-                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(immunizationPackage1)));
+                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(vaccineDS1)));
         mMedicalResourceHelper.upsertMedicalResources(
                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(allergyPackage2)));
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 toUuids(List.of(dataSource1.getId(), dataSource2.getId())),
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ false,
                 /* isCalledFromBgWithoutBgRead= */ false,
@@ -888,12 +850,12 @@
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_IMMUNIZATION read permission.
+        // has MEDICAL_RESOURCE_TYPE_VACCINES read permission.
         // no write permission.
-        // The data that the calling app can read: dataSource1 (through immunization
+        // The data that the calling app can read: dataSource1 (through vaccine
         // read permission)
         // In this case, read access log is created based on the intention of the
-        // app and the fact that the app has MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+        // app and the fact that the app has MEDICAL_RESOURCE_TYPE_VACCINES
         // even though the actual data accessed is self data.
         AccessLog expected =
                 new AccessLog(
@@ -909,19 +871,18 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getById_expectAccessLogsWhenAppHasNoWritePermHasReadPermReadNonSelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         String dataSource =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME).getId();
-        MedicalResource immunizationDifferentPackage =
-                createImmunizationMedicalResource(dataSource);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME).getId();
+        MedicalResource vaccineDifferentPackage = createVaccineMedicalResource(dataSource);
         mMedicalResourceHelper.upsertMedicalResources(
                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME,
-                List.of(makeUpsertRequest(immunizationDifferentPackage)));
+                List.of(makeUpsertRequest(vaccineDifferentPackage)));
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 toUuids(List.of(dataSource)),
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ false,
                 /* isCalledFromBgWithoutBgRead= */ false,
@@ -929,10 +890,10 @@
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_IMMUNIZATION read permission.
+        // has MEDICAL_RESOURCE_TYPE_VACCINES read permission.
         // no write permission.
-        // The data that the calling app can read: any dataSource belonging to the any immunization
-        // resources as the app has immunization permission.
+        // The data that the calling app can read: any dataSource belonging to the any vaccine
+        // resources as the app has vaccine permission.
         // In this case, read access log is created.
         AccessLog expected =
                 new AccessLog(
@@ -948,12 +909,12 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void getById_inForegroundOrBgWithPerm_hasReadImmunization_nothingRead_noAccessLog() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getById_inForegroundOrBgWithPerm_hasReadVaccine_nothingRead_noAccessLog() {
         List<UUID> dataSourceIds = List.of(UUID.fromString("a6194e35-698c-4706-918f-00bf959f123b"));
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 dataSourceIds,
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ false,
@@ -963,10 +924,10 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getById_inForegroundOrBgWithPerm_hasWritePerm_noReadPerm_noAccessLog() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
-        String dataSource = mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME).getId();
+        String dataSource = mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME).getId();
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 toUuids(List.of(dataSource)),
                 Set.of(),
@@ -990,15 +951,15 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getById_expectAccessLogsWhenAppHasWritePermHasReadPermReadSelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
         mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                 toUuids(List.of(dataSource.getId())),
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ false,
@@ -1006,10 +967,9 @@
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_IMMUNIZATION read permission.
+        // has MEDICAL_RESOURCE_TYPE_VACCINES read permission.
         // has write permission.
-        // The data that the calling app can read: dataSource of the
-        // immunization
+        // The data that the calling app can read: dataSource of the vaccine
         // In this case, read access log is created based on the intention of the app
         // even though the actual data accessed is self data.
         AccessLog expected =
@@ -1026,78 +986,96 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByIds_inBgWithoutBgPermHasWritePermHasReadPerm_canReadSelfDataSources() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource1);
-        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource1, INSTANT_NOW);
+        upsertResourceAtTime(
+                PhrDataFactory::createAllergyMedicalResource,
+                dataSource1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
 
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                         toUuids(List.of(dataSource1.getId(), dataSource2.getId())),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ true,
                         mAppInfoHelper);
 
-        assertThat(result).containsExactly(dataSource1);
+        assertThat(result)
+                .containsExactly(addLastDataUpdateTime(dataSource1, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void getByIds_inBgWithoutBgPermNoWritePermImmunizationReadPermOnly_correctResult() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByIds_inBgWithoutBgPermNoWritePermVaccineReadPermOnly_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource1);
-        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource1, INSTANT_NOW);
+        // Even though the reader does not have Allergy read permissions, this resource needs to
+        // be considered for calculating the MedicalDataSource's last data update time.
+        upsertResourceAtTime(
+                PhrDataFactory::createAllergyMedicalResource,
+                dataSource1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
 
         // App is in background without background read perm, no write permission but has
-        // immunization read permission. App can read dataSources belonging to immunizations that
+        // vaccine read permission. App can read dataSources belonging to vaccines that
         // the app wrote itself.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                         toUuids(List.of(dataSource1.getId(), dataSource2.getId())),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ true,
                         mAppInfoHelper);
 
-        assertThat(result).containsExactly(dataSource1);
+        assertThat(result)
+                .containsExactly(addLastDataUpdateTime(dataSource1, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void
-            getById_inBgWithoutBgPermNoWritePermBothAllergyAndImmunizationReadPerm_correctResult() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getById_inBgWithoutBgPermNoWritePermBothAllergyAndVaccineReadPerm_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in background without background read perm, no write permission but has
-        // immunization read permission. App can read dataSources belonging to immunizations
+        // vaccine read permission. App can read dataSources belonging to vaccines
         // and allergy resource types that the app wrote itself.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
@@ -1107,71 +1085,90 @@
                                         dataSource2Package1.getId(),
                                         dataSource1Package2.getId())),
                         Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ true,
                         mAppInfoHelper);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void getById_inForegroundOrinBgWithBgPermNoWritePermHasImmunizationPerm_correctResult() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getById_inForegroundOrinBgWithBgPermNoWritePermHasVaccinePerm_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
-        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package2,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, no write permission but has
-        // immunization read permission. App can read all dataSources belonging to immunizations.
+        // vaccine read permission. App can read all dataSources belonging to vaccines.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                         toUuids(
                                 List.of(
                                         dataSource1Package1.getId(), dataSource2Package1.getId(),
                                         dataSource1Package2.getId(), dataSource2Package2.getId())),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false,
                         mAppInfoHelper);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource1Package2);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void
             getByIds_inForegroundOrBgWithBgPermHasWritePermNoReadResourceTypesPerm_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission but
         // no read permission for any resource types.
@@ -1188,27 +1185,37 @@
                         /* isCalledFromBgWithoutBgRead= */ false,
                         mAppInfoHelper);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByIds_inForegroundOrBgWithBgPermNoWritePermHasAllergyPerm_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package2,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, no write permission but
         // has allergy resource type read permission.
@@ -1219,46 +1226,7 @@
                                 List.of(
                                         dataSource1Package1.getId(), dataSource2Package1.getId(),
                                         dataSource1Package2.getId(), dataSource2Package2.getId())),
-                        Set.of(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
-                        DATA_SOURCE_PACKAGE_NAME,
-                        /* hasWritePermission= */ false,
-                        /* isCalledFromBgWithoutBgRead= */ false,
-                        mAppInfoHelper);
-
-        assertThat(result).containsExactly(dataSource2Package1, dataSource2Package2);
-    }
-
-    @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void getByIds_inForegroundOrBgWithBgPermNoWritePermMultipleReadPerms_correctResult() {
-        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
-        MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
-        MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
-        MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
-        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
-        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
-
-        // App is in foreground or background with background read perm, no write permission but
-        // has allergy resource type and immunization read permissions.
-        // App can read dataSources belonging to allergy and immunization resource types.
-        List<MedicalDataSource> result =
-                mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
-                        toUuids(
-                                List.of(
-                                        dataSource1Package1.getId(), dataSource2Package1.getId(),
-                                        dataSource1Package2.getId(), dataSource2Package2.getId())),
-                        Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false,
@@ -1266,54 +1234,104 @@
 
         assertThat(result)
                 .containsExactly(
-                        dataSource1Package1,
-                        dataSource2Package1,
-                        dataSource1Package2,
-                        dataSource2Package2);
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package2, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void
-            getByIds_inForegroundOrBgWithBgPermHasWritePermHasReadImmunizationPerm_correctResult() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByIds_inForegroundOrBgWithBgPermNoWritePermMultipleReadPerms_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package2,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
-        // App is in foreground or background with background read perm, has write permission and
-        // has immunization read permissions.
-        // App can read dataSources they wrote themselves and dataSources belonging to
-        // immunization resource types.
+        // App is in foreground or background with background read perm, no write permission but
+        // has allergy resource type and vaccine read permissions.
+        // App can read dataSources belonging to allergy and vaccine resource types.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
                         toUuids(
                                 List.of(
                                         dataSource1Package1.getId(), dataSource2Package1.getId(),
                                         dataSource1Package2.getId(), dataSource2Package2.getId())),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES),
+                        DATA_SOURCE_PACKAGE_NAME,
+                        /* hasWritePermission= */ false,
+                        /* isCalledFromBgWithoutBgRead= */ false,
+                        mAppInfoHelper);
+
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource2Package2, INSTANT_NOW_PLUS_TEN_SEC));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByIds_inForegroundOrBgWithBgPermHasWritePermHasReadVaccinePerm_correctResult() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1Package1 =
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package1 =
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1Package2 =
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package2 =
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+
+        // App is in foreground or background with background read perm, has write permission and
+        // has vaccine read permissions.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types.
+        List<MedicalDataSource> result =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithPermissionChecks(
+                        toUuids(
+                                List.of(
+                                        dataSource1Package1.getId(), dataSource2Package1.getId(),
+                                        dataSource1Package2.getId(), dataSource2Package2.getId())),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false,
                         mAppInfoHelper);
 
         assertThat(result)
-                .containsExactly(dataSource1Package1, dataSource2Package1, dataSource1Package2);
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackage_appHasNotCreatedDataSourcesAndNoReadPermission_throws() {
         assertThrows(
                 IllegalArgumentException.class,
@@ -1328,131 +1346,151 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackage_emptyPackages_inForegroundOrBgWithBgPermHasWriteAndReadPerm_success() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission and
-        // has immunization read permissions.
+        // has vaccine read permissions.
         // The packageName set is empty so no filtering based on packageNames.
         // App can read dataSources they wrote themselves and dataSources belonging to
-        // immunization resource types.
+        // vaccine resource types.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         /* packageNames= */ Set.of(),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
         assertThat(result)
-                .containsExactly(dataSource1Package1, dataSource2Package1, dataSource1Package2);
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfIncluded_inForegroundOrBgWithBgPermHasWriteAndReadPerm_success() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission and
-        // has immunization read permissions.
+        // has vaccine read permissions.
         // The app's package name is included in the list of packages.
         // App can read dataSources they wrote themselves and dataSources belonging to
-        // immunization resource types written by any of the given packages.
+        // vaccine resource types written by any of the given packages.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
         assertThat(result)
-                .containsExactly(dataSource1Package1, dataSource2Package1, dataSource1Package2);
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void
             getByPackages_selfNotIncluded_inForegroundOrBgWithBgPermHasWriteAndReadPerm_success() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package2,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission and
-        // has immunization read permissions.
+        // has vaccine read permissions.
         // The app's package name is not included in the list of packages.
         // App can read dataSources belonging to
-        // immunization resource types written by any of the given packages.
+        // vaccine resource types written by any of the given packages.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(dataSource1Package2);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_emptyPackages_inBgWithoutBgPermHasWritePerm_canReadSelfDataSources() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in background without background read perm, has write permission and
         // no read permissions.
@@ -1466,27 +1504,33 @@
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfIncluded_inBgWithoutBgPermHasWritePerm_canReadSelfDataSources() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in background without background read perm, has write permission and
         // no read permissions.
@@ -1500,26 +1544,27 @@
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfNotIncluded_inBgWithoutBgPermHasWritePerm_throws() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
 
         // App is in background without background read perm, has write permission and
@@ -1539,94 +1584,104 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_emptyPackages_inBgWithoutBgPermHasWriteAndReadPerm_canReadSelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in background without background read perm, has write permission and
-        // has read immunization permission.
+        // has read vaccine permission.
         // The packageNames is empty so no filtering is applied.
         // App can read dataSources they wrote themselves.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         /* packageNames= */ Set.of(),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfIncluded_inBgWithoutBgPermHasWriteAndReadPerm_canReadSelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in background without background read perm, has write permission and
-        // has read immunization permission.
+        // has read vaccine permission.
         // The app's package name is included in the list of packages.
         // App can read dataSources they wrote themselves.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfNotIncluded_inBgWithoutBgPermHasWriteAndReadPerm_throws() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
 
         // App is in background without background read perm, has write permission and
-        // has read immunization permission.
+        // has read vaccine permission.
         // The app's package name is not included in the list of packages.
         // App can read not dataSources.
         assertThrows(
@@ -1634,7 +1689,7 @@
                 () -> {
                     mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                             Set.of(DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                            Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                            Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                             DATA_SOURCE_PACKAGE_NAME,
                             /* hasWritePermission= */ true,
                             /* isCalledFromBgWithoutBgRead= */ true);
@@ -1642,94 +1697,95 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_emptyPackages_inBgWithoutBgPermHasReadPermOnly_canReadSelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in background without background read perm, has no write permission and
-        // has read immunization permission.
+        // has read vaccine permission.
         // The packageNames is empty so no filtering based on packageNames.
-        // App can read dataSources belonging to immunizations the app wrote itself.
+        // App can read dataSources belonging to vaccines the app wrote itself.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         /* packageNames= */ Set.of(),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(dataSource1Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfIncluded_inBgWithoutBgPermHasReadPermOnly_canReadSelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
 
         // App is in background without background read perm, has no write permission and
-        // has read immunization permission.
+        // has read vaccine permission.
         // The app's package name is included in the list of packages.
-        // App can read dataSources belonging to immunizations the app wrote itself.
+        // App can read dataSources belonging to vaccines the app wrote itself.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(dataSource1Package1);
+        assertThat(result).containsExactly(addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfNotIncluded_inBgWithoutBgPermHasReadPermOnly_throws() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
 
         // App is in background without background read perm, has no write permission and
-        // has read immunization permission.
+        // has read vaccine permission.
         // The app's package name is not included in the list of packages.
         // App can read no dataSources.
         assertThrows(
@@ -1737,7 +1793,7 @@
                 () -> {
                     mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                             Set.of(DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                            Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                            Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                             DATA_SOURCE_PACKAGE_NAME,
                             /* hasWritePermission= */ false,
                             /* isCalledFromBgWithoutBgRead= */ true);
@@ -1745,96 +1801,111 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_emptyPackages_inBgWithoutBgPermHasMultipleReadPerms_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in background without background read perm, no write permission but has
-        // immunization and allergy read permission.
+        // vaccine and allergy read permission.
         // PackageNames is empty so no filtering based on packageNames is applied.
         // App can read dataSources belonging to
-        // immunizations and allergy resource types that the app wrote itself.
+        // vaccines and allergy resource types that the app wrote itself.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         /* packageNames= */ Set.of(),
                         Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfIncluded_inBgWithoutBgPermHasMultipleReadPerms_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in background without background read perm, no write permission but has
-        // immunization and allergy read permission. App can read dataSources belonging to
-        // immunizations and allergy resource types that the app wrote itself.
+        // vaccine and allergy read permission. App can read dataSources belonging to
+        // vaccines and allergy resource types that the app wrote itself.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
                         Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void
             getByPackages_emptyPackages_inForegroundOrBgWithBgPermOnlyWritePerm_canReadSelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission but
         // no read permission for any resource types.
@@ -1848,28 +1919,34 @@
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void
             getByPackages_selfIncluded_inForegroundOrBgWithBgPermOnlyWritePerm_canReadSelfData() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission but
         // no read permission for any resource types.
@@ -1883,26 +1960,27 @@
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(dataSource1Package1, dataSource2Package1);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_selfNotIncluded_inForegroundOrBgWithBgPermOnlyWritePerm_throws() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
 
         // App is in foreground or background with background read perm, has write permission but
@@ -1922,23 +2000,26 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_emptyPackages_inForegroundOrBgWithBgPermHasAllergyPerm_correct() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, no write permission but
         // has allergy resource type read permission.
@@ -1947,32 +2028,38 @@
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         /* packageNames= */ Set.of(),
-                        Set.of(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                        Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(dataSource2Package1, dataSource2Package2);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package2, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_inForegroundOrBgWithBgPermHasAllergyPerm_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, no write permission but
         // has allergy resource type read permission.
@@ -1981,233 +2068,1053 @@
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                        Set.of(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                        Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(dataSource2Package1, dataSource2Package2);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package2, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_emptyPackages_inForegroundOrBgWithBgPermMultipleReadPerms_correct() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package1,
+                INSTANT_NOW_PLUS_TWENTY_SEC);
 
         // App is in foreground or background with background read perm, no write permission but
-        // has allergy and immunization resource types read permission.
+        // has allergy and vaccine resource types read permission.
         // The packageNames is empty so no filtering applied based on that.
-        // App can read only read dataSources belonging to the allergy and immunization
+        // App can read only read dataSources belonging to the allergy and vaccine
         // resource types written by any apps.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         /* packageNames= */ Set.of(),
                         Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
         assertThat(result)
                 .containsExactly(
-                        dataSource1Package1,
-                        dataSource2Package1,
-                        dataSource1Package2,
-                        dataSource2Package2);
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW_PLUS_TWENTY_SEC),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource2Package2, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void getByPackages_inForegroundOrBgWithBgPermMultipleReadPerms_correctResult() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentAllergyMedicalResource,
+                dataSource2Package2,
+                INSTANT_NOW_PLUS_TWENTY_SEC);
 
         // App is in foreground or background with background read perm, no write permission but
-        // has allergy and immunization resource types read permission.
-        // App can read only read dataSources belonging to the allergy and immunization
+        // has allergy and vaccine resource types read permission.
+        // App can read only read dataSources belonging to the allergy and vaccine
         // resource types written by the provided packageNames.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
                         Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
         assertThat(result)
                 .containsExactly(
-                        dataSource1Package1,
-                        dataSource2Package1,
-                        dataSource1Package2,
-                        dataSource2Package2);
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource2Package2, INSTANT_NOW_PLUS_TWENTY_SEC));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void
             getByPackages_emptyPackages_inForegroundOrBgWithBgPermHasWriteAndReadPerm_correct() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission and
-        // has immunization resource type read permission.
+        // has vaccine resource type read permission.
         // The packageNames is empty so no filtering is applied based on that.
-        // App can read dataSources belonging to the immunization resource types written by any
+        // App can read dataSources belonging to the vaccine resource types written by any
         // apps and any other dataSources that the app wrote itself.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         /* packageNames= */ Set.of(),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
         assertThat(result)
-                .containsExactly(dataSource1Package1, dataSource2Package1, dataSource1Package2);
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void
             getByPackages_selfIncluded_inForegroundOrBgWithBgPermHasWriteAndReadPerm_correctRes() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package1,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission and
-        // has immunization resource type read permission.
+        // has vaccine resource type read permission.
         // App itself is included in the packageNames.
-        // App can read dataSources belonging to the immunization resource types written by the
+        // App can read dataSources belonging to the vaccine resource types written by the
         // provided packageNames and all dataSources written by the app itself.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
         assertThat(result)
-                .containsExactly(dataSource1Package1, dataSource2Package1, dataSource1Package2);
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2Package1, INSTANT_NOW),
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void
             getByPackages_selfNotIncluded_inForegroundOrBgWithPermHasWriteAndReadPerm_correctRes() {
         insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
         MedicalDataSource dataSource1Package1 =
-                mUtil.insertMedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package1 =
-                mUtil.insertMedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource1Package2 =
-                mUtil.insertMedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2Package2 =
-                mUtil.insertMedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package1);
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
-        mUtil.upsertResource(
-                PhrDataFactory::createImmunizationMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // Insert more data with later modified time.
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1Package2,
+                INSTANT_NOW_PLUS_TEN_SEC);
 
         // App is in foreground or background with background read perm, has write permission and
-        // has immunization resource type read permission.
+        // has vaccine resource type read permission.
         // App itself is not included in the packageNames.
-        // App can read dataSources belonging to the immunization resource types written by the
+        // App can read dataSources belonging to the vaccine resource types written by the
         // provided packageNames.
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
                         Set.of(DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(dataSource1Package2);
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1Package2, INSTANT_NOW_PLUS_TEN_SEC));
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
-    public void delete_badId_throws() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getMDSesByIdsWithoutPermissionChecks_multipleResourcesIns_correctDataUpdateTime() {
+        mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
+        mTransactionTestUtils.insertApp(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1 =
+                createDataSource(
+                        DATA_SOURCE_FHIR_BASE_URI,
+                        DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
+                        DATA_SOURCE_PACKAGE_NAME);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource1, INSTANT_NOW);
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createAllergyMedicalResource,
+                dataSource1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        MedicalDataSource dataSource2 =
+                createDataSource(
+                        DIFFERENT_DATA_SOURCE_BASE_URI,
+                        DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
+                        DATA_SOURCE_PACKAGE_NAME);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource2, INSTANT_NOW);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource,
+                dataSource2,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createAllergyMedicalResource,
+                dataSource2,
+                INSTANT_NOW_PLUS_TWENTY_SEC);
+
+        List<MedicalDataSource> result =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
+                        toUuids(List.of(dataSource1.getId(), dataSource2.getId())));
+
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2, INSTANT_NOW_PLUS_TWENTY_SEC));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getMDSesByIdsWithoutPermissionChecks_deletedResource_notCountedForDataUpdateTime() {
+        mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
+        mTransactionTestUtils.insertApp(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource =
+                createDataSource(
+                        DATA_SOURCE_FHIR_BASE_URI,
+                        DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
+                        DATA_SOURCE_PACKAGE_NAME);
+        Instant nowMinus10Seconds = INSTANT_NOW.minusSeconds(10);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource, nowMinus10Seconds);
+        MedicalResource resource2 =
+                upsertResourceAtTime(
+                        PhrDataFactory::createDifferentAllergyMedicalResource,
+                        dataSource,
+                        INSTANT_NOW);
+
+        List<MedicalDataSource> dataSourcesBeforeDelete =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
+                        toUuids(List.of(dataSource.getId())));
+        mMedicalResourceHelper.deleteMedicalResourcesByIdsWithoutPermissionChecks(
+                List.of(resource2.getId()));
+        List<MedicalDataSource> dataSourcesAfterDelete =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
+                        toUuids(List.of(dataSource.getId())));
+
+        assertThat(dataSourcesBeforeDelete)
+                .containsExactly(addLastDataUpdateTime(dataSource, INSTANT_NOW));
+        assertThat(dataSourcesAfterDelete)
+                .containsExactly(addLastDataUpdateTime(dataSource, nowMinus10Seconds));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getMDSesByIdsWithoutPermissionChecks_noResourcesInserted_nullDataUpdateTime() {
+        mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1 =
+                createDataSource(
+                        DATA_SOURCE_FHIR_BASE_URI,
+                        DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
+                        DATA_SOURCE_PACKAGE_NAME);
+
+        List<MedicalDataSource> result =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
+                        toUuids(List.of(dataSource1.getId())));
+
+        assertThat(result).hasSize(1);
+        assertThat(result.get(0).getLastDataUpdateTime()).isNull();
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void
+            getMDSesByPackageWithoutPermissionChecks_multipleResourcesIns_correctDataUpdateTime() {
+        mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
+        mTransactionTestUtils.insertApp(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1 =
+                createDataSource(
+                        DATA_SOURCE_FHIR_BASE_URI,
+                        DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
+                        DATA_SOURCE_PACKAGE_NAME);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource1, INSTANT_NOW);
+        upsertResourceAtTime(
+                PhrDataFactory::createDifferentVaccineMedicalResource,
+                dataSource1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createAllergyMedicalResource,
+                dataSource1,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        MedicalDataSource dataSource2 =
+                createDataSource(
+                        DIFFERENT_DATA_SOURCE_BASE_URI,
+                        DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
+                        DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource2, INSTANT_NOW);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource,
+                dataSource2,
+                INSTANT_NOW_PLUS_TEN_SEC);
+        upsertResourceAtTime(
+                PhrDataFactory::createAllergyMedicalResource,
+                dataSource2,
+                INSTANT_NOW_PLUS_TWENTY_SEC);
+
+        List<MedicalDataSource> result =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithoutPermissionChecks(
+                        Set.of(dataSource1.getPackageName(), dataSource2.getPackageName()));
+
+        assertThat(result)
+                .containsExactly(
+                        addLastDataUpdateTime(dataSource1, INSTANT_NOW_PLUS_TEN_SEC),
+                        addLastDataUpdateTime(dataSource2, INSTANT_NOW_PLUS_TWENTY_SEC));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void
+            getMDSesByPackageWithoutPermissionChecks_deletedResource_notCountedForDataUpdateTime() {
+        mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
+        mTransactionTestUtils.insertApp(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource =
+                createDataSource(
+                        DATA_SOURCE_FHIR_BASE_URI,
+                        DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
+                        DATA_SOURCE_PACKAGE_NAME);
+        Instant nowMinus10Seconds = INSTANT_NOW.minusSeconds(10);
+        upsertResourceAtTime(
+                PhrDataFactory::createVaccineMedicalResource, dataSource, nowMinus10Seconds);
+        MedicalResource resource2 =
+                upsertResourceAtTime(
+                        PhrDataFactory::createDifferentAllergyMedicalResource,
+                        dataSource,
+                        INSTANT_NOW);
+
+        List<MedicalDataSource> dataSourcesBeforeDelete =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithoutPermissionChecks(
+                        Set.of(dataSource.getPackageName()));
+        mMedicalResourceHelper.deleteMedicalResourcesByIdsWithoutPermissionChecks(
+                List.of(resource2.getId()));
+        List<MedicalDataSource> dataSourcesAfterDelete =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithoutPermissionChecks(
+                        Set.of(dataSource.getPackageName()));
+
+        assertThat(dataSourcesBeforeDelete)
+                .containsExactly(addLastDataUpdateTime(dataSource, INSTANT_NOW));
+        assertThat(dataSourcesAfterDelete)
+                .containsExactly(addLastDataUpdateTime(dataSource, nowMinus10Seconds));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getMDSesByPackageWithoutPermissionChecks_noResourcesInserted_nullDataUpdateTime() {
+        mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource =
+                createDataSource(
+                        DATA_SOURCE_FHIR_BASE_URI,
+                        DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
+                        DATA_SOURCE_PACKAGE_NAME);
+
+        List<MedicalDataSource> result =
+                mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithoutPermissionChecks(
+                        Set.of(dataSource.getPackageName()));
+
+        assertThat(result).hasSize(1);
+        assertThat(result.get(0).getLastDataUpdateTime()).isNull();
+    }
+
+    @Test
+    public void getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes_correctQuery() {
+        UUID uuid1 = UUID.randomUUID();
+        UUID uuid2 = UUID.randomUUID();
+        List<UUID> dataSourceIds = List.of(uuid1, uuid2);
+        List<String> dataSourceIdsHexValues = List.of(getHexString(uuid1), getHexString(uuid2));
+        Set<Long> appInfoIds = Set.of(1L);
+        Set<Integer> resourceTypes = Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
+        List<String> groupByColumnNames =
+                List.of(
+                        "medical_data_source_row_id",
+                        "display_name",
+                        "fhir_base_uri",
+                        "fhir_version",
+                        "data_source_uuid",
+                        "package_name");
+        String expectedQuery =
+                "SELECT MAX(medical_resource_table.last_modified_time) AS"
+                        + " last_data_update_time,inner_query_result.last_modified_time AS"
+                        + " last_data_source_update_time,"
+                        + String.join(",", groupByColumnNames)
+                        + " FROM ( SELECT * FROM medical_data_source_table WHERE"
+                        + " medical_data_source_row_id IN (SELECT medical_data_source_row_id FROM ("
+                        + " SELECT * FROM medical_data_source_table WHERE data_source_uuid IN"
+                        + " ("
+                        + String.join(", ", dataSourceIdsHexValues)
+                        + ") AND app_info_id IN (1) ) AS inner_query_result  INNER JOIN"
+                        + " medical_resource_table ON inner_query_result.medical_data_source_row_id"
+                        + " = medical_resource_table.data_source_id  INNER JOIN ( SELECT * FROM"
+                        + " medical_resource_indices_table WHERE medical_resource_type IN (2))"
+                        + " medical_resource_indices_table ON"
+                        + " medical_resource_table.medical_resource_row_id ="
+                        + " medical_resource_indices_table.medical_resource_id)  ) AS"
+                        + " inner_query_result  INNER JOIN application_info_table ON"
+                        + " inner_query_result.app_info_id = application_info_table.row_id  LEFT"
+                        + " JOIN medical_resource_table ON"
+                        + " inner_query_result.medical_data_source_row_id ="
+                        + " medical_resource_table.data_source_id GROUP BY "
+                        + String.join(",", groupByColumnNames);
+
+        assertThat(
+                        getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+                                dataSourceIds, appInfoIds, resourceTypes))
+                .isEqualTo(expectedQuery);
+    }
+
+    @Test
+    public void getReadQueryForDataSources_withNullResourceType_correctQuery() {
+        UUID uuid1 = UUID.randomUUID();
+        UUID uuid2 = UUID.randomUUID();
+        List<UUID> dataSourceIds = List.of(uuid1, uuid2);
+        List<String> dataSourceIdsHexValues = List.of(getHexString(uuid1), getHexString(uuid2));
+        Set<Long> appInfoIds = Set.of(1L);
+        List<String> groupByColumnNames =
+                List.of(
+                        "medical_data_source_row_id",
+                        "display_name",
+                        "fhir_base_uri",
+                        "fhir_version",
+                        "data_source_uuid",
+                        "package_name");
+        String expectedQuery =
+                "SELECT MAX(medical_resource_table.last_modified_time) AS"
+                        + " last_data_update_time,inner_query_result.last_modified_time AS"
+                        + " last_data_source_update_time,"
+                        + String.join(",", groupByColumnNames)
+                        + " FROM ( SELECT * FROM medical_data_source_table WHERE"
+                        + " medical_data_source_row_id IN (SELECT medical_data_source_row_id FROM"
+                        + " medical_data_source_table WHERE data_source_uuid IN"
+                        + " ("
+                        + String.join(", ", dataSourceIdsHexValues)
+                        + ")"
+                        + " AND app_info_id IN (1))  ) AS inner_query_result  INNER JOIN"
+                        + " application_info_table ON inner_query_result.app_info_id ="
+                        + " application_info_table.row_id  LEFT JOIN medical_resource_table ON"
+                        + " inner_query_result.medical_data_source_row_id ="
+                        + " medical_resource_table.data_source_id GROUP BY "
+                        + String.join(",", groupByColumnNames);
+
+        assertThat(
+                        getReadQueryForDataSourcesFilterOnIdsAndAppIdsAndResourceTypes(
+                                dataSourceIds, appInfoIds, null))
+                .isEqualTo(expectedQuery);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByPackage_expectAccessLogWhenDataSourceAccessedThroughReadPerm() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1Package1 =
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package1 =
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1Package2 =
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package2 =
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+
+        // App is in foreground or background with background read perm, has write permission and
+        // has vaccine read permissions.
+        // The packageName set is empty so no filtering based on packageNames.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types.
+        // So access log will be created based on the app permission to access dataSources
+        // belonging to vaccines.
+        mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
+                /* packageNames= */ Set.of(),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
+                DATA_SOURCE_PACKAGE_NAME,
+                /* hasWritePermission= */ true,
+                /* isCalledFromBgWithoutBgRead= */ false);
+
+        AccessLog readAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_READ,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .contains(readAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByPackage_expectAccessLogWhenSelfDataAccessedThroughReadPerm() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1Package1 =
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package1 =
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
+
+        // App is in foreground or background with background read perm, has write permission and
+        // has vaccine read permissions.
+        // The packageName set is empty so no filtering based on packageNames.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types. In this case the only vaccine resource type is for
+        // the app itself. Since the read happened through a read permission, access log will be
+        // created.
+        mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
+                /* packageNames= */ Set.of(),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
+                DATA_SOURCE_PACKAGE_NAME,
+                /* hasWritePermission= */ true,
+                /* isCalledFromBgWithoutBgRead= */ false);
+
+        AccessLog readAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_READ,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .contains(readAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByPackage_expectAccessLogWhenDataSourceAccessedThroughReadPermEvenSelfData() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1Package1 =
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package1 =
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1Package2 =
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package2 =
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // App is in foreground or background with background read perm, has write permission and
+        // has vaccine read permissions.
+        // The app's package name is included in the list of packages.
+        // App can read dataSources they wrote themselves and dataSources belonging to
+        // vaccine resource types written by any of the given packages.
+        // Since some vaccine resource types were read, an access log will be created.
+        mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
+                Set.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
+                DATA_SOURCE_PACKAGE_NAME,
+                /* hasWritePermission= */ true,
+                /* isCalledFromBgWithoutBgRead= */ false);
+
+        AccessLog readAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_READ,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .contains(readAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByPackages_expectAccessLogWhenDataSourceReadThroughReadPermNoSelfData() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1Package1 =
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package1 =
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1Package2 =
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package2 =
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+        // App is in foreground or background with background read perm, has write permission and
+        // has vaccine read permissions.
+        // The app's package name is not included in the list of packages.
+        // App can read dataSources belonging to
+        // vaccine resource types written by any of the given packages.
+        // Access log is created since the app has access through read permission.
+        mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
+                Set.of(DIFFERENT_DATA_SOURCE_PACKAGE_NAME),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
+                DATA_SOURCE_PACKAGE_NAME,
+                /* hasWritePermission= */ true,
+                /* isCalledFromBgWithoutBgRead= */ false);
+
+        AccessLog readAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_READ,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .contains(readAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByPackages_expectNoAccessLogWhenSelfReadPerm() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1Package1 =
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package1 =
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1Package2 =
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package2 =
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+
+        // App is in background without background read perm, has write permission and
+        // no read permissions.
+        // App can read dataSources they wrote themself, which in this case belong to the
+        // vaccine and allergy resources written. No access log should be created.
+        mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
+                /* packageNames= */ Set.of(),
+                /* grantedMedicalResourceTypes= */ Set.of(),
+                DATA_SOURCE_PACKAGE_NAME,
+                /* hasWritePermission= */ true,
+                /* isCalledFromBgWithoutBgRead= */ true);
+
+        AccessLog readAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_READ,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .doesNotContain(readAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByPackages_inForegroundOrBgWithBgPermNoReadPermCanReadSelfDataNoAccessLog() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1Package1 =
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package1 =
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1Package2 =
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package2 =
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+
+        // App is in foreground or background with background read perm, has write permission but
+        // no read permission for any resource types.
+        // The packageNames is empty so no filtering is applied based on packageNames.
+        // App can read only read dataSources they wrote themselves.
+        // No access log should be created for this.
+        mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
+                /* packageNames= */ Set.of(),
+                /* grantedMedicalResourceTypes= */ Set.of(),
+                DATA_SOURCE_PACKAGE_NAME,
+                /* hasWritePermission= */ true,
+                /* isCalledFromBgWithoutBgRead= */ false);
+
+        AccessLog readAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_READ,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .doesNotContain(readAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByPackages_expectAccessLogWhenAppAccessesDataSourceThroughReadPerm() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1Package1 =
+                mUtil.insertR4MedicalDataSource("ds/1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package1 =
+                mUtil.insertR4MedicalDataSource("ds/2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource1Package2 =
+                mUtil.insertR4MedicalDataSource("ds/3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2Package2 =
+                mUtil.insertR4MedicalDataSource("ds/4", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1Package2);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2Package2);
+
+        // App is in foreground or background with background read perm, no write permission but
+        // has allergy resource type read permission.
+        // App can only read dataSources belonging to the allergy resource types written
+        // by any apps. Access log should be created in this case.
+        mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
+                /* packageNames= */ Set.of(),
+                Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
+                DATA_SOURCE_PACKAGE_NAME,
+                /* hasWritePermission= */ false,
+                /* isCalledFromBgWithoutBgRead= */ false);
+
+        AccessLog readAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_READ,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .contains(readAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void getByPackages_expectNoAccessLogWhenNoDataSourcesRead() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
+
+        // No dataSources are inserted, so no dataSources will be returned as part of this
+        // API call. Hence no access log should be created.
+        mMedicalDataSourceHelper.getMedicalDataSourcesByPackageWithPermissionChecks(
+                /* packageNames= */ Set.of(),
+                Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
+                DATA_SOURCE_PACKAGE_NAME,
+                /* hasWritePermission= */ true,
+                /* isCalledFromBgWithoutBgRead= */ false);
+
+        AccessLog readAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_READ,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .doesNotContain(readAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalDataSourcesByIdsWithoutPermCheck_appIdDoesNotExist_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(
+                                UUID.randomUUID()));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByIdsWithoutPermCheck_deleteDataSourceThatDoesNotExist_throws() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(
+                                UUID.randomUUID()));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalDataSourcesByIdsWithPermCheck_appIdDoesNotExist_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                                UUID.randomUUID(), DATA_SOURCE_PACKAGE_NAME));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByIdsWithPermCheck_deleteDataSourceBelongingToAnotherApp_throws() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                                UUID.fromString(dataSource2.getId()), DATA_SOURCE_PACKAGE_NAME));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByIdsWithPermCheck_deleteDataSourceThatDoesNotExist_throws() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                                UUID.randomUUID(), DATA_SOURCE_PACKAGE_NAME));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteDataSourcesByIdsWithoutPermissionChecks_noDeleteAccessLogs() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(
+                UUID.fromString(dataSource1.getId()));
+
+        AccessLog deleteAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_DELETE,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .doesNotContain(deleteAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByIdsWithPermCheck_expectAccessLogForDeletedDataSourceAndResources() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                UUID.fromString(dataSource1.getId()), /* packageName= */ DATA_SOURCE_PACKAGE_NAME);
+
+        // In this test, we have inserted two different resource types from different packages.
+        // When the calling app, calls the delete API, we expect access log to be created only
+        // for the deleted dataSource belonging to the app and the medical resources associated
+        // with that dataSource.
+        AccessLog deleteAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_DELETE,
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .contains(deleteAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByIdsWithPermCheck_dataSourceHasMultipleResources_correctAccessLogs() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                UUID.fromString(dataSource1.getId()), DATA_SOURCE_PACKAGE_NAME);
+
+        // We have inserted two different resource types from one package and one overlapping
+        // resource type from another package.
+        // When the calling app, calls the delete API, we expect access log to be created for
+        // the deleted dataSource belonging to the app and the medical resources associated
+        // with that dataSource which in this case would be vaccine and allergy.
+        AccessLog deleteAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_DELETE,
+                        /* medicalResourceTypes= */ Set.of(
+                                MEDICAL_RESOURCE_TYPE_VACCINES,
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .contains(deleteAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByIdsWithPermCheck_dataSourceHasNoResources_correctAccessLogs() {
+        insertApps(List.of(DATA_SOURCE_PACKAGE_NAME, DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                UUID.fromString(dataSource1.getId()), DATA_SOURCE_PACKAGE_NAME);
+
+        // We have two dataSources but there's no data associated with the dataSource created
+        // by the calling package. When the calling app, calls the delete API, we expect access log
+        // to be created for the deleted dataSource belonging to the app and the
+        // medicalResourceTypes to be empty since the dataSource had no resources associated
+        // with it.
+        AccessLog deleteAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_DELETE,
+                        /* medicalResourceTypes= */ Set.of(),
+                        /* isMedicalDataSourceAccessed= */ true);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .contains(deleteAccessLog);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void deleteByIdsWithoutPermCheck_badId_throws() {
         assertThrows(
                 IllegalArgumentException.class,
                 () -> {
-                    mMedicalDataSourceHelper.deleteMedicalDataSource(
-                            UUID.randomUUID(), /* appInfoIdRestriction= */ null);
+                    mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(
+                            UUID.randomUUID());
                 });
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
-    public void delete_badId_leavesRecordsUnchanged() throws NameNotFoundException {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void deleteByIdsWithoutPermCheck__badId_leavesRecordsUnchanged()
+            throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource existing =
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
 
         assertThrows(
                 IllegalArgumentException.class,
                 () -> {
-                    mMedicalDataSourceHelper.deleteMedicalDataSource(
-                            UUID.randomUUID(), /* appInfoIdRestriction= */ null);
+                    mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(
+                            UUID.randomUUID());
                 });
 
         List<MedicalDataSource> result =
@@ -2217,28 +3124,30 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
-    public void delete_oneIdWrongPackage_existingDataUnchanged() throws NameNotFoundException {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void deleteByIdsWithPermCheck_oneIdWrongPackage_existingDataUnchanged()
+            throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource existing =
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource different =
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
-        long differentAppInfoId = mAppInfoHelper.getAppInfoId(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-
         assertThrows(
                 IllegalArgumentException.class,
                 () ->
-                        mMedicalDataSourceHelper.deleteMedicalDataSource(
-                                UUID.fromString(existing.getId()), differentAppInfoId));
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                                UUID.fromString(existing.getId()),
+                                DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
 
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
@@ -2247,19 +3156,20 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
-    public void delete_oneId_existingDataDeleted() throws NameNotFoundException {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void deleteByIdsWithoutPermCheck_oneId_existingDataDeleted()
+            throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource existing =
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         UUID existingUuid = UUID.fromString(existing.getId());
 
-        mMedicalDataSourceHelper.deleteMedicalDataSource(
-                existingUuid, /* appInfoIdRestriction= */ null);
+        mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(existingUuid);
 
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
@@ -2268,8 +3178,8 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
-    public void delete_multiplePresentOneIdRequestedNoAppRestriction_onlyRequestedDeleted()
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void deleteByIdsWithoutPermCheck_multiplePresentOneIdRequested_onlyRequestedDeleted()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
@@ -2277,15 +3187,17 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
-        mMedicalDataSourceHelper.deleteMedicalDataSource(
-                UUID.fromString(dataSource1.getId()), /* appInfoIdRestriction= */ null);
+        mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(
+                UUID.fromString(dataSource1.getId()));
 
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
@@ -2294,8 +3206,8 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
-    public void delete_multiplePresentOneIdRequestedMatchingAppId_onlyRequestedDeleted()
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void deleteWithPermCheck_multiplePresentOneIdRequested_onlyRequestedDeleted()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
@@ -2303,16 +3215,17 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
-        mMedicalDataSourceHelper.deleteMedicalDataSource(
-                UUID.fromString(dataSource1.getId()),
-                mAppInfoHelper.getAppInfoId(DATA_SOURCE_PACKAGE_NAME));
+        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
+                UUID.fromString(dataSource1.getId()), DATA_SOURCE_PACKAGE_NAME);
 
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
@@ -2321,8 +3234,8 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
-    public void delete_multiplePresentOneIdRequestedDifferentAppId_onlyRequestedDeleted()
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void deleteWithPermCheck_multiplePresentOneIdRequestedDifferentAppId_throws()
             throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
@@ -2330,19 +3243,21 @@
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
                 createDataSource(
                         DIFFERENT_DATA_SOURCE_BASE_URI,
                         DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                        DIFFERENT_DATA_SOURCE_FHIR_VERSION,
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
 
         assertThrows(
                 IllegalArgumentException.class,
                 () ->
-                        mMedicalDataSourceHelper.deleteMedicalDataSource(
+                        mMedicalDataSourceHelper.deleteMedicalDataSourceWithPermissionChecks(
                                 UUID.fromString(dataSource1.getId()),
-                                mAppInfoHelper.getAppInfoId(DIFFERENT_DATA_SOURCE_PACKAGE_NAME)));
+                                DIFFERENT_DATA_SOURCE_PACKAGE_NAME));
 
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
@@ -2351,22 +3266,17 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_DEVELOPMENT_DATABASE)
-    public void delete_removesAssociatedResource() throws NameNotFoundException {
+    @EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+    public void deleteByIdsWithoutPermCheck_removesAssociatedResource()
+            throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource =
                 createDataSource(
                         DATA_SOURCE_FHIR_BASE_URI,
                         DATA_SOURCE_DISPLAY_NAME,
+                        DATA_SOURCE_FHIR_VERSION,
                         DATA_SOURCE_PACKAGE_NAME);
-        MedicalResourceHelper resourceHelper =
-                new MedicalResourceHelper(
-                        mTransactionManager,
-                        mAppInfoHelper,
-                        mMedicalDataSourceHelper,
-                        new FakeTimeSource(INSTANT_NOW),
-                        mAccessLogsHelper);
-        MedicalResource medicalResource = createImmunizationMedicalResource(dataSource.getId());
+        MedicalResource medicalResource = createVaccineMedicalResource(dataSource.getId());
         UpsertMedicalResourceInternalRequest upsertRequest =
                 new UpsertMedicalResourceInternalRequest()
                         .setMedicalResourceType(medicalResource.getType())
@@ -2376,37 +3286,42 @@
                         .setData(medicalResource.getFhirResource().getData())
                         .setDataSourceId(dataSource.getId());
         MedicalResource resource =
-                resourceHelper
+                mMedicalResourceHelper
                         .upsertMedicalResources(DATA_SOURCE_PACKAGE_NAME, List.of(upsertRequest))
                         .get(0);
 
-        mMedicalDataSourceHelper.deleteMedicalDataSource(
-                UUID.fromString(dataSource.getId()), /* appInfoIdRestriction= */ null);
+        mMedicalDataSourceHelper.deleteMedicalDataSourceWithoutPermissionChecks(
+                UUID.fromString(dataSource.getId()));
 
         List<MedicalDataSource> result =
                 mMedicalDataSourceHelper.getMedicalDataSourcesByIdsWithoutPermissionChecks(
                         toUuids(List.of(dataSource.getId())));
         assertThat(result).isEmpty();
         List<MedicalResource> resourceResult =
-                resourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
                         List.of(resource.getId()));
         assertThat(resourceResult).isEmpty();
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void testGetAllContributorAppInfoIds_success() throws NameNotFoundException {
         setUpMocksForAppInfo(DATA_SOURCE_PACKAGE_NAME);
         setUpMocksForAppInfo(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         createDataSource(
-                DATA_SOURCE_FHIR_BASE_URI, DATA_SOURCE_DISPLAY_NAME, DATA_SOURCE_PACKAGE_NAME);
-        createDataSource(
-                DIFFERENT_DATA_SOURCE_BASE_URI,
-                DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                DATA_SOURCE_FHIR_BASE_URI,
+                DATA_SOURCE_DISPLAY_NAME,
+                DATA_SOURCE_FHIR_VERSION,
                 DATA_SOURCE_PACKAGE_NAME);
         createDataSource(
                 DIFFERENT_DATA_SOURCE_BASE_URI,
                 DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                DATA_SOURCE_FHIR_VERSION,
+                DATA_SOURCE_PACKAGE_NAME);
+        createDataSource(
+                DIFFERENT_DATA_SOURCE_BASE_URI,
+                DIFFERENT_DATA_SOURCE_DISPLAY_NAME,
+                DATA_SOURCE_FHIR_VERSION,
                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         long appInfoId = mAppInfoHelper.getAppInfoId(DATA_SOURCE_PACKAGE_NAME);
         long differentAppInfoId = mAppInfoHelper.getAppInfoId(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
@@ -2431,10 +3346,30 @@
         return appInfo;
     }
 
+    /**
+     * Upsert a {@link MedicalResource} using the given {@link PhrTestUtils.MedicalResourceCreator}
+     * and the {@link MedicalDataSource} at the specified {@code upsertTime}.
+     */
+    public MedicalResource upsertResourceAtTime(
+            PhrTestUtils.MedicalResourceCreator creator,
+            MedicalDataSource dataSource,
+            Instant upsertTime) {
+        Instant currentTime = mFakeTimeSource.getInstantNow();
+
+        mFakeTimeSource.setInstant(upsertTime);
+        MedicalResource resource = mUtil.upsertResource(creator, dataSource);
+
+        // reset the mFakeTimeSource time to what it was before.
+        mFakeTimeSource.setInstant(currentTime);
+
+        return resource;
+    }
+
     private MedicalDataSource createDataSource(
-            Uri baseUri, String displayName, String packageName) {
+            Uri baseUri, String displayName, FhirVersion fhirVersion, String packageName) {
         CreateMedicalDataSourceRequest request =
-                new CreateMedicalDataSourceRequest.Builder(baseUri, displayName).build();
+                new CreateMedicalDataSourceRequest.Builder(baseUri, displayName, fhirVersion)
+                        .build();
         return mMedicalDataSourceHelper.createMedicalDataSource(mContext, request, packageName);
     }
 
@@ -2454,4 +3389,19 @@
         }
         return result;
     }
+
+    /**
+     * Sets the {@code lastDataUpdateTime} on the provided data source at millisecond precision.
+     *
+     * <p>The {@code upsertTime} is converted to millisecond precision, as this is the precision
+     * that is stored in the database.
+     */
+    private static MedicalDataSource addLastDataUpdateTime(
+            MedicalDataSource dataSource, Instant lastDataUpdateTime) {
+        Instant lastDataUpdateTimeMillisPrecision =
+                Instant.ofEpochMilli(lastDataUpdateTime.toEpochMilli());
+        return new MedicalDataSource.Builder(dataSource)
+                .setLastDataUpdateTime(lastDataUpdateTimeMillisPrecision)
+                .build();
+    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceHelperTest.java
index eb7c8b5..58f61c7 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceHelperTest.java
@@ -21,27 +21,23 @@
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_READ;
 import static android.health.connect.accesslog.AccessLog.OperationType.OPERATION_TYPE_UPSERT;
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE;
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_PACKAGE_NAME;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_VERSION_R4;
-import static android.healthconnect.cts.utils.PhrDataFactory.R4_VERSION_STRING;
-import static android.healthconnect.cts.utils.PhrDataFactory.addCompletedStatus;
-import static android.healthconnect.cts.utils.PhrDataFactory.createAllergyMedicalResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.createImmunizationMedicalResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.createImmunizationMedicalResources;
-import static android.healthconnect.cts.utils.PhrDataFactory.createUpdatedImmunizationMedicalResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResourceAllergy;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResourceBuilder;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResourceDifferentImmunization;
-import static android.healthconnect.cts.utils.PhrDataFactory.getMedicalResourceId;
-import static android.healthconnect.cts.utils.PhrDataFactory.getUpdatedAllergyFhirResource;
-import static android.healthconnect.cts.utils.PhrDataFactory.getUpdatedImmunizationFhirResource;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_PACKAGE_NAME;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_RESOURCE_ID_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_VERSION_R4B;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createAllergyMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createDifferentVaccineMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createUpdatedAllergyMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createUpdatedVaccineMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createVaccineMedicalResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.createVaccineMedicalResources;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getFhirResource;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getMedicalResourceId;
 
 import static com.android.server.healthconnect.storage.PhrTestUtils.ACCESS_LOG_EQUIVALENCE;
 import static com.android.server.healthconnect.storage.PhrTestUtils.makeUpsertRequest;
@@ -49,7 +45,6 @@
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.FHIR_DATA_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.FHIR_RESOURCE_ID_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.FHIR_RESOURCE_TYPE_COLUMN_NAME;
-import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.FHIR_VERSION_COLUMN_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.MEDICAL_RESOURCE_TABLE_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getCreateTableRequest;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getPrimaryColumn;
@@ -68,8 +63,10 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.mock;
 
 import android.content.ContentValues;
+import android.content.Context;
 import android.database.Cursor;
 import android.health.connect.DeleteMedicalResourcesRequest;
 import android.health.connect.HealthConnectManager;
@@ -80,15 +77,21 @@
 import android.health.connect.datatypes.FhirResource;
 import android.health.connect.datatypes.MedicalDataSource;
 import android.health.connect.datatypes.MedicalResource;
-import android.healthconnect.cts.utils.PhrDataFactory;
-import android.os.Environment;
+import android.healthconnect.cts.phr.utils.PhrDataFactory;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.util.Pair;
 
+import androidx.test.core.app.ApplicationProvider;
+
 import com.android.healthfitness.flags.Flags;
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.phr.PhrPageTokenWrapper;
 import com.android.server.healthconnect.phr.ReadMedicalResourcesInternalResponse;
 import com.android.server.healthconnect.storage.PhrTestUtils;
@@ -126,57 +129,39 @@
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 3)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
-
     private static final long DATA_SOURCE_ROW_ID = 1234;
     private static final String INVALID_PAGE_TOKEN = "aw==";
     private static final Instant INSTANT_NOW = Instant.now();
 
     private MedicalResourceHelper mMedicalResourceHelper;
-    private MedicalDataSourceHelper mMedicalDataSourceHelper;
     private TransactionManager mTransactionManager;
-    private TransactionTestUtils mTransactionTestUtils;
-    private AppInfoHelper mAppInfoHelper;
     private AccessLogsHelper mAccessLogsHelper;
-    private HealthConnectUserContext mContext;
     private PhrTestUtils mUtil;
     private FakeTimeSource mFakeTimeSource;
 
     @Before
     public void setup() {
-        AccessLogsHelper.resetInstanceForTest();
-        AppInfoHelper.resetInstanceForTest();
-        mTransactionManager = mHealthConnectDatabaseTestRule.getTransactionManager();
-        mContext = mHealthConnectDatabaseTestRule.getUserContext();
-        mTransactionTestUtils = new TransactionTestUtils(mContext, mTransactionManager);
-        mTransactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
-        mTransactionTestUtils.insertApp(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mAppInfoHelper = AppInfoHelper.getInstance(mTransactionManager);
-        mAccessLogsHelper = AccessLogsHelper.getInstance(mTransactionManager, mAppInfoHelper);
+        Context context = ApplicationProvider.getApplicationContext();
         mFakeTimeSource = new FakeTimeSource(INSTANT_NOW);
-        mMedicalDataSourceHelper =
-                new MedicalDataSourceHelper(
-                        mTransactionManager, mAppInfoHelper, mFakeTimeSource, mAccessLogsHelper);
-        mMedicalResourceHelper =
-                new MedicalResourceHelper(
-                        mTransactionManager,
-                        mAppInfoHelper,
-                        mMedicalDataSourceHelper,
-                        mFakeTimeSource,
-                        mAccessLogsHelper);
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .setTimeSource(mFakeTimeSource)
+                        .build();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+        mAccessLogsHelper = healthConnectInjector.getAccessLogsHelper();
+        mMedicalResourceHelper = healthConnectInjector.getMedicalResourceHelper();
+        mUtil = new PhrTestUtils(context, healthConnectInjector);
 
-        mUtil =
-                new PhrTestUtils(
-                        mContext,
-                        mTransactionManager,
-                        mMedicalResourceHelper,
-                        mMedicalDataSourceHelper);
+        TransactionTestUtils transactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        transactionTestUtils.insertApp(DATA_SOURCE_PACKAGE_NAME);
+        transactionTestUtils.insertApp(DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
     }
 
     @Test
@@ -187,7 +172,6 @@
                         Pair.create(FHIR_RESOURCE_TYPE_COLUMN_NAME, INTEGER_NOT_NULL),
                         Pair.create(FHIR_RESOURCE_ID_COLUMN_NAME, TEXT_NOT_NULL),
                         Pair.create(FHIR_DATA_COLUMN_NAME, TEXT_NOT_NULL),
-                        Pair.create(FHIR_VERSION_COLUMN_NAME, TEXT_NOT_NULL),
                         Pair.create(DATA_SOURCE_ID_COLUMN_NAME, INTEGER_NOT_NULL),
                         Pair.create(LAST_MODIFIED_TIME_COLUMN_NAME, INTEGER_NOT_NULL));
         List<Pair<String, String>> columnInfoMedicalResourceIndices =
@@ -220,7 +204,7 @@
         UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest =
                 makeUpsertRequest(
                         fhirResource,
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
                         FHIR_VERSION_R4,
                         DATA_SOURCE_ID);
 
@@ -228,11 +212,10 @@
                 MedicalResourceHelper.getContentValues(
                         DATA_SOURCE_ROW_ID, upsertMedicalResourceInternalRequest, INSTANT_NOW);
 
-        assertThat(contentValues.size()).isEqualTo(6);
+        assertThat(contentValues.size()).isEqualTo(5);
         assertThat(contentValues.get(FHIR_RESOURCE_TYPE_COLUMN_NAME))
                 .isEqualTo(fhirResource.getType());
         assertThat(contentValues.get(DATA_SOURCE_ID_COLUMN_NAME)).isEqualTo(DATA_SOURCE_ROW_ID);
-        assertThat(contentValues.get(FHIR_VERSION_COLUMN_NAME)).isEqualTo(R4_VERSION_STRING);
         assertThat(contentValues.get(FHIR_DATA_COLUMN_NAME)).isEqualTo(fhirResource.getData());
         assertThat(contentValues.get(LAST_MODIFIED_TIME_COLUMN_NAME))
                 .isEqualTo(INSTANT_NOW.toEpochMilli());
@@ -261,38 +244,80 @@
                                 + ")) medical_data_source_table ON"
                                 + " inner_query_result.data_source_id ="
                                 + " medical_data_source_table.medical_data_source_row_id"
-                                + "  INNER JOIN medical_resource_indices_table ON"
+                                + "  INNER JOIN ( SELECT * FROM medical_resource_indices_table)"
+                                + " medical_resource_indices_table ON"
                                 + " inner_query_result.medical_resource_row_id ="
                                 + " medical_resource_indices_table.medical_resource_id");
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    public void getReadTableRequest_distinctResourceTypesUsingAppIdAndResourceTypes_correctQuery() {
+        long appId = 123L;
+
+        ReadTableRequest request =
+                MedicalResourceHelper.getFilteredReadRequestForDistinctResourceTypes(
+                        List.of(), Set.of(MEDICAL_RESOURCE_TYPE_VACCINES), appId);
+
+        assertThat(request.getReadCommand())
+                .isEqualTo(
+                        "SELECT DISTINCT medical_resource_type FROM ( SELECT * FROM"
+                                + " medical_resource_table ) AS inner_query_result"
+                                + "  INNER JOIN ( SELECT"
+                                + " * FROM medical_data_source_table WHERE app_info_id = '"
+                                + appId
+                                + "'"
+                                + ") medical_data_source_table ON"
+                                + " inner_query_result.data_source_id ="
+                                + " medical_data_source_table.medical_data_source_row_id"
+                                + "  INNER JOIN ( SELECT * FROM medical_resource_indices_table"
+                                + " WHERE medical_resource_type IN (1))"
+                                + " medical_resource_indices_table ON"
+                                + " inner_query_result.medical_resource_row_id ="
+                                + " medical_resource_indices_table.medical_resource_id");
+    }
+
+    @Test
+    public void getReadTableRequest_distinctResourceTypesUsingAppIdResourceTypesAndDataSourceIds() {
+        List<UUID> dataSourceIds = List.of(UUID.fromString("a6194e35-698c-4706-918f-00bf959f123b"));
+        long appId = 123L;
+        List<String> hexValues = StorageUtils.getListOfHexStrings(dataSourceIds);
+
+        ReadTableRequest request =
+                MedicalResourceHelper.getFilteredReadRequestForDistinctResourceTypes(
+                        dataSourceIds, Set.of(MEDICAL_RESOURCE_TYPE_VACCINES), appId);
+
+        assertThat(request.getReadCommand())
+                .isEqualTo(
+                        "SELECT DISTINCT medical_resource_type FROM ( SELECT * FROM"
+                                + " medical_resource_table ) AS inner_query_result"
+                                + "  INNER JOIN ( SELECT"
+                                + " * FROM medical_data_source_table WHERE app_info_id = '"
+                                + appId
+                                + "'"
+                                + " AND data_source_uuid IN ("
+                                + String.join(", ", hexValues)
+                                + ")) medical_data_source_table ON"
+                                + " inner_query_result.data_source_id ="
+                                + " medical_data_source_table.medical_data_source_row_id"
+                                + "  INNER JOIN ( SELECT * FROM medical_resource_indices_table"
+                                + " WHERE medical_resource_type IN (1))"
+                                + " medical_resource_indices_table ON"
+                                + " inner_query_result.medical_resource_row_id ="
+                                + " medical_resource_indices_table.medical_resource_id");
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertAndUpdateResource_lastModifiedTimeIsUpdated() throws JSONException {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        UpsertMedicalResourceInternalRequest upsertRequest =
-                makeUpsertRequest(
-                        getFhirResource(),
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        FHIR_VERSION_R4,
-                        dataSource.getId());
-        // The same MedicalResource with FHIR JSON updated.
-        UpsertMedicalResourceInternalRequest updateRequest =
-                makeUpsertRequest(
-                        new MedicalResource.Builder(
-                                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                        dataSource.getId(),
-                                        FHIR_VERSION_R4,
-                                        getFhirResourceBuilder()
-                                                .setData(
-                                                        addCompletedStatus(
-                                                                getFhirResource().getData()))
-                                                .build())
-                                .build());
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource resource = createVaccineMedicalResource(dataSource.getId());
+        UpsertMedicalResourceInternalRequest insertRequest = makeUpsertRequest(resource);
+        MedicalResource updatedResource = createUpdatedVaccineMedicalResource(dataSource.getId());
+        UpsertMedicalResourceInternalRequest updateRequest = makeUpsertRequest(updatedResource);
 
         mMedicalResourceHelper.upsertMedicalResources(
-                DATA_SOURCE_PACKAGE_NAME, List.of(upsertRequest));
+                DATA_SOURCE_PACKAGE_NAME, List.of(insertRequest));
         long lastModifiedTimeOriginal =
                 mUtil.readLastModifiedTimestamp(MEDICAL_RESOURCE_TABLE_NAME);
         assertThat(lastModifiedTimeOriginal).isEqualTo(INSTANT_NOW.toEpochMilli());
@@ -308,9 +333,10 @@
     }
 
     @Test
+    @EnableFlags({Flags.FLAG_PHR_READ_MEDICAL_RESOURCES_FIX_QUERY_LIMIT})
     public void getReadTableRequest_usingRequest_correctQuery() {
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         ReadTableRequest readRequest =
                 MedicalResourceHelper.getReadTableRequestUsingRequestFilters(
@@ -321,31 +347,39 @@
         assertThat(readRequest.getTableName()).isEqualTo(MEDICAL_RESOURCE_TABLE_NAME);
         assertThat(readRequest.getReadCommand())
                 .isEqualTo(
-                        "SELECT * FROM ( SELECT * FROM medical_resource_table ORDER BY"
-                                + " medical_resource_row_id LIMIT "
-                                + (DEFAULT_PAGE_SIZE + 1)
-                                + " ) AS"
+                        "SELECT medical_resource_row_id,fhir_resource_type,fhir_resource_id,"
+                                + "fhir_data,fhir_version,medical_resource_type,"
+                                + "data_source_uuid,inner_query_result.last_modified_time"
+                                + " AS medical_resource_last_modified_time FROM ( SELECT * FROM"
+                                + " medical_resource_table ) AS"
                                 + " inner_query_result  INNER JOIN ( SELECT * FROM"
                                 + " medical_resource_indices_table WHERE medical_resource_type IN "
                                 + "("
-                                + MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+                                + MEDICAL_RESOURCE_TYPE_VACCINES
                                 + ")"
                                 + ") medical_resource_indices_table ON"
                                 + " inner_query_result.medical_resource_row_id ="
                                 + " medical_resource_indices_table.medical_resource_id  INNER JOIN"
                                 + " medical_data_source_table ON inner_query_result.data_source_id"
-                                + " = medical_data_source_table.medical_data_source_row_id");
+                                + " = medical_data_source_table.medical_data_source_row_id"
+                                + " ORDER BY medical_resource_row_id"
+                                + " LIMIT "
+                                + (DEFAULT_PAGE_SIZE + 1));
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({
+        Flags.FLAG_PERSONAL_HEALTH_RECORD,
+        Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE,
+        Flags.FLAG_PHR_READ_MEDICAL_RESOURCES_FIX_QUERY_LIMIT
+    })
     public void getReadTableRequest_usingRequestWithDataSourceIds_correctQuery() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("id1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("id1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("id2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("id2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         ReadMedicalResourcesInitialRequest request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(dataSource1.getId())
                         .addDataSourceId(dataSource2.getId())
                         .build();
@@ -360,14 +394,15 @@
         assertThat(readRequest.getTableName()).isEqualTo(MEDICAL_RESOURCE_TABLE_NAME);
         assertThat(readRequest.getReadCommand())
                 .isEqualTo(
-                        "SELECT * FROM ( SELECT * FROM medical_resource_table ORDER BY"
-                                + " medical_resource_row_id LIMIT "
-                                + (DEFAULT_PAGE_SIZE + 1)
-                                + " ) AS"
+                        "SELECT medical_resource_row_id,fhir_resource_type,fhir_resource_id,"
+                                + "fhir_data,fhir_version,medical_resource_type,data_source_uuid,"
+                                + "inner_query_result.last_modified_time"
+                                + " AS medical_resource_last_modified_time FROM ( SELECT * FROM"
+                                + " medical_resource_table ) AS"
                                 + " inner_query_result  INNER JOIN ( SELECT * FROM"
                                 + " medical_resource_indices_table WHERE medical_resource_type IN "
                                 + "("
-                                + MEDICAL_RESOURCE_TYPE_IMMUNIZATION
+                                + MEDICAL_RESOURCE_TYPE_VACCINES
                                 + ")) medical_resource_indices_table ON"
                                 + " inner_query_result.medical_resource_row_id ="
                                 + " medical_resource_indices_table.medical_resource_id  INNER JOIN"
@@ -376,7 +411,10 @@
                                 + String.join(", ", dataSourceIdHexValues)
                                 + ")) medical_data_source_table ON"
                                 + " inner_query_result.data_source_id ="
-                                + " medical_data_source_table.medical_data_source_row_id");
+                                + " medical_data_source_table.medical_data_source_row_id"
+                                + " ORDER BY medical_resource_row_id"
+                                + " LIMIT "
+                                + (DEFAULT_PAGE_SIZE + 1));
     }
 
     @Test
@@ -398,14 +436,9 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readMedicalResourcesByIds_dbEmpty_returnsEmpty() {
-        List<MedicalResourceId> medicalResourceIds =
-                List.of(
-                        new MedicalResourceId(
-                                DATA_SOURCE_ID,
-                                FHIR_RESOURCE_TYPE_IMMUNIZATION,
-                                FHIR_RESOURCE_ID_IMMUNIZATION));
+        List<MedicalResourceId> medicalResourceIds = List.of(getMedicalResourceId());
 
         List<MedicalResource> resources =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
@@ -415,259 +448,195 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readMedicalResourcesByRequest_dbEmpty_returnsEmpty() {
-        ReadMedicalResourcesInitialRequest readImmunizationRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+        ReadMedicalResourcesInitialRequest request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
 
         ReadMedicalResourcesInternalResponse result =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(readImmunizationRequest.toParcel()),
-                        readImmunizationRequest.getPageSize());
+                        PhrPageTokenWrapper.from(request.toParcel()), request.getPageSize());
 
         assertThat(result.getMedicalResources()).isEmpty();
         assertThat(result.getPageToken()).isEqualTo(null);
+        assertThat(result.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void upsertAndReadMedicalResourcesByRequest_MedicalResourceTypeDoesNotExist_success() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        UpsertMedicalResourceInternalRequest upsertImmunizationResourceRequest =
-                makeUpsertRequest(
-                        fhirResource,
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        FHIR_VERSION_R4,
-                        dataSource.getId());
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccine = createVaccineMedicalResource(dataSource.getId());
 
         List<MedicalResource> upsertedResources =
                 mMedicalResourceHelper.upsertMedicalResources(
-                        DATA_SOURCE_PACKAGE_NAME, List.of(upsertImmunizationResourceRequest));
-        ReadMedicalResourcesInitialRequest readAllergyRequest =
+                        DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(vaccine)));
+        ReadMedicalResourcesInitialRequest readAllAllergiesRequest =
                 new ReadMedicalResourcesInitialRequest.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE)
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build();
         ReadMedicalResourcesInternalResponse result =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(readAllergyRequest.toParcel()),
-                        readAllergyRequest.getPageSize());
+                        PhrPageTokenWrapper.from(readAllAllergiesRequest.toParcel()),
+                        readAllAllergiesRequest.getPageSize());
 
-        assertThat(upsertedResources)
-                .containsExactly(
-                        new MedicalResource.Builder(
-                                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                        dataSource.getId(),
-                                        FHIR_VERSION_R4,
-                                        fhirResource)
-                                .build());
+        assertThat(upsertedResources).containsExactly(vaccine);
         assertThat(result.getMedicalResources()).isEmpty();
         assertThat(result.getPageToken()).isEqualTo(null);
+        assertThat(result.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void upsertMedicalResourcesSameDataSource_readMedicalResourcesByRequest_success() {
-        // Upsert 3 resources in this test: immunization, differentImmunization and allergy, all
+        // Upsert 3 resources in this test: vaccine, differentVaccine and allergy, all
         // with the same data source.
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        MedicalResource immunization =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest1 =
-                makeUpsertRequest(immunization);
-        FhirResource differentFhirResource = getFhirResourceDifferentImmunization();
-        MedicalResource differentImmunization =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                differentFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest2 =
-                makeUpsertRequest(differentImmunization);
-        FhirResource allergyFhirResource = getFhirResourceAllergy();
-        MedicalResource allergy =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                allergyFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest3 =
-                makeUpsertRequest(allergy);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccine = createVaccineMedicalResource(dataSource.getId());
+        MedicalResource differentVaccine =
+                createDifferentVaccineMedicalResource(dataSource.getId());
+        MedicalResource allergy = createAllergyMedicalResource(dataSource.getId());
         List<MedicalResource> upsertedResources =
                 mMedicalResourceHelper.upsertMedicalResources(
                         DATA_SOURCE_PACKAGE_NAME,
                         List.of(
-                                upsertMedicalResourceInternalRequest1,
-                                upsertMedicalResourceInternalRequest2,
-                                upsertMedicalResourceInternalRequest3));
+                                makeUpsertRequest(vaccine),
+                                makeUpsertRequest(differentVaccine),
+                                makeUpsertRequest(allergy)));
 
-        ReadMedicalResourcesInitialRequest readAllergyRequest =
+        ReadMedicalResourcesInitialRequest readAllAllergiesRequest =
                 new ReadMedicalResourcesInitialRequest.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE)
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build();
-        ReadMedicalResourcesInitialRequest readAllImmunizationsRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+        ReadMedicalResourcesInitialRequest readAllVaccinesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
-        ReadMedicalResourcesInitialRequest readImmunizationsFromSameDataSourceRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+        ReadMedicalResourcesInitialRequest readVaccinesFromSameDataSourceRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(dataSource.getId())
                         .build();
-        ReadMedicalResourcesInitialRequest readImmunizationsFromDifferentDataSourceRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+        ReadMedicalResourcesInitialRequest readVaccinesFromDifferentDataSourceRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
                         .build();
-        ReadMedicalResourcesInternalResponse allergyResult =
+        ReadMedicalResourcesInternalResponse allAllergiesResult =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(readAllergyRequest.toParcel()),
-                        readAllergyRequest.getPageSize());
-        ReadMedicalResourcesInternalResponse allImmunizationsResult =
+                        PhrPageTokenWrapper.from(readAllAllergiesRequest.toParcel()),
+                        readAllAllergiesRequest.getPageSize());
+        ReadMedicalResourcesInternalResponse allVaccinesResult =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(readAllImmunizationsRequest.toParcel()),
-                        readAllImmunizationsRequest.getPageSize());
-        ReadMedicalResourcesInternalResponse immunizationsFromSameDataSourceResult =
+                        PhrPageTokenWrapper.from(readAllVaccinesRequest.toParcel()),
+                        readAllVaccinesRequest.getPageSize());
+        ReadMedicalResourcesInternalResponse vaccinesFromSameDataSourceResult =
+                mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
+                        PhrPageTokenWrapper.from(readVaccinesFromSameDataSourceRequest.toParcel()),
+                        readVaccinesFromSameDataSourceRequest.getPageSize());
+        ReadMedicalResourcesInternalResponse vaccinesFromDifferentDataSourceResult =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
                         PhrPageTokenWrapper.from(
-                                readImmunizationsFromSameDataSourceRequest.toParcel()),
-                        readImmunizationsFromSameDataSourceRequest.getPageSize());
-        ReadMedicalResourcesInternalResponse immunizationsFromDifferentDataSourceResult =
-                mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(
-                                readImmunizationsFromDifferentDataSourceRequest.toParcel()),
-                        readImmunizationsFromDifferentDataSourceRequest.getPageSize());
+                                readVaccinesFromDifferentDataSourceRequest.toParcel()),
+                        readVaccinesFromDifferentDataSourceRequest.getPageSize());
 
-        assertThat(upsertedResources).containsExactly(immunization, differentImmunization, allergy);
-        assertThat(allergyResult.getMedicalResources()).containsExactly(allergy);
-        assertThat(allergyResult.getPageToken()).isEqualTo(null);
-        assertThat(allImmunizationsResult.getMedicalResources())
-                .containsExactly(immunization, differentImmunization);
-        assertThat(allImmunizationsResult.getPageToken()).isEqualTo(null);
-        assertThat(immunizationsFromSameDataSourceResult.getMedicalResources())
-                .containsExactly(immunization, differentImmunization);
-        assertThat(immunizationsFromSameDataSourceResult.getPageToken()).isEqualTo(null);
-        assertThat(immunizationsFromDifferentDataSourceResult.getMedicalResources()).isEmpty();
-        assertThat(immunizationsFromDifferentDataSourceResult.getPageToken()).isEqualTo(null);
+        assertThat(upsertedResources).containsExactly(vaccine, differentVaccine, allergy);
+        assertThat(allAllergiesResult.getMedicalResources()).containsExactly(allergy);
+        assertThat(allAllergiesResult.getPageToken()).isEqualTo(null);
+        assertThat(allAllergiesResult.getRemainingCount()).isEqualTo(0);
+        assertThat(allVaccinesResult.getMedicalResources())
+                .containsExactly(vaccine, differentVaccine);
+        assertThat(allVaccinesResult.getPageToken()).isEqualTo(null);
+        assertThat(allVaccinesResult.getRemainingCount()).isEqualTo(0);
+        assertThat(vaccinesFromSameDataSourceResult.getMedicalResources())
+                .containsExactly(vaccine, differentVaccine);
+        assertThat(vaccinesFromSameDataSourceResult.getPageToken()).isEqualTo(null);
+        assertThat(vaccinesFromDifferentDataSourceResult.getMedicalResources()).isEmpty();
+        assertThat(vaccinesFromDifferentDataSourceResult.getPageToken()).isEqualTo(null);
+        assertThat(vaccinesFromDifferentDataSourceResult.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void upsertMedicalResourcesDifferentDataSources_readMedicalResourcesByRequest_success() {
-        // Upsert 3 resources in this test: immunization, differentImmunization and allergy. Among
-        // which immunization and allergy are from data source 1 and the differentImmunization is
+        // Upsert 3 resources in this test: vaccine, differentVaccine and allergy. Among
+        // which vaccine and allergy are from data source 1 and the differentVaccine is
         // from data source 2.
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("id1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("id1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("id2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        MedicalResource immunizationDS1 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource1.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertRequestImmunizationDataSource1 =
-                makeUpsertRequest(immunizationDS1);
-        FhirResource differentFhirResource = getFhirResourceDifferentImmunization();
-        MedicalResource differentImmunizationDS2 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource2.getId(),
-                                FHIR_VERSION_R4,
-                                differentFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertRequestImmunization2DataSource2 =
-                makeUpsertRequest(differentImmunizationDS2);
-        FhirResource allergyFhirResource = getFhirResourceAllergy();
-        MedicalResource allergyDS1 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                dataSource1.getId(),
-                                FHIR_VERSION_R4,
-                                allergyFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertRequestAllergyDataSource1 =
-                makeUpsertRequest(allergyDS1);
+                mUtil.insertR4MedicalDataSource("id2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 = createVaccineMedicalResource(dataSource1.getId());
+        MedicalResource differentVaccineDS2 =
+                createDifferentVaccineMedicalResource(dataSource2.getId());
+        MedicalResource allergyDS1 = createAllergyMedicalResource(dataSource1.getId());
         List<MedicalResource> upsertedResources =
                 mMedicalResourceHelper.upsertMedicalResources(
                         DATA_SOURCE_PACKAGE_NAME,
-                        List.of(
-                                upsertRequestImmunizationDataSource1,
-                                upsertRequestAllergyDataSource1));
+                        List.of(makeUpsertRequest(vaccineDS1), makeUpsertRequest(allergyDS1)));
         upsertedResources.addAll(
                 mMedicalResourceHelper.upsertMedicalResources(
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME,
-                        List.of(upsertRequestImmunization2DataSource2)));
+                        List.of(makeUpsertRequest(differentVaccineDS2))));
 
-        ReadMedicalResourcesInitialRequest readAllergyRequest =
+        ReadMedicalResourcesInitialRequest readAllAllergiesRequest =
                 new ReadMedicalResourcesInitialRequest.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE)
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build();
-        ReadMedicalResourcesInitialRequest readImmunizationRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+        ReadMedicalResourcesInitialRequest readAllVaccinesRequest =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
-        ReadMedicalResourcesInitialRequest readImmunizationsFromDataSource1Request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+        ReadMedicalResourcesInitialRequest readVaccinesFromDataSource1Request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(dataSource1.getId())
                         .build();
-        ReadMedicalResourcesInitialRequest readImmunizationsFromDataSource2Request =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+        ReadMedicalResourcesInitialRequest readVaccinesFromDataSource2Request =
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .addDataSourceId(dataSource2.getId())
                         .build();
-        ReadMedicalResourcesInternalResponse allergyResult =
+        ReadMedicalResourcesInternalResponse allAllergiesResult =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(readAllergyRequest.toParcel()),
-                        readAllergyRequest.getPageSize());
-        ReadMedicalResourcesInternalResponse immunizationResult =
+                        PhrPageTokenWrapper.from(readAllAllergiesRequest.toParcel()),
+                        readAllAllergiesRequest.getPageSize());
+        ReadMedicalResourcesInternalResponse allVaccinesResult =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(readImmunizationRequest.toParcel()),
-                        readImmunizationRequest.getPageSize());
-        ReadMedicalResourcesInternalResponse immunizationsFromDataSource1Result =
+                        PhrPageTokenWrapper.from(readAllVaccinesRequest.toParcel()),
+                        readAllVaccinesRequest.getPageSize());
+        ReadMedicalResourcesInternalResponse vaccinesFromDataSource1Result =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(
-                                readImmunizationsFromDataSource1Request.toParcel()),
-                        readImmunizationsFromDataSource1Request.getPageSize());
-        ReadMedicalResourcesInternalResponse immunizationsFromDataSource2Result =
+                        PhrPageTokenWrapper.from(readVaccinesFromDataSource1Request.toParcel()),
+                        readVaccinesFromDataSource1Request.getPageSize());
+        ReadMedicalResourcesInternalResponse vaccinesFromDataSource2Result =
                 mMedicalResourceHelper.readMedicalResourcesByRequestWithoutPermissionChecks(
-                        PhrPageTokenWrapper.from(
-                                readImmunizationsFromDataSource2Request.toParcel()),
-                        readImmunizationsFromDataSource2Request.getPageSize());
+                        PhrPageTokenWrapper.from(readVaccinesFromDataSource2Request.toParcel()),
+                        readVaccinesFromDataSource2Request.getPageSize());
 
-        assertThat(upsertedResources)
-                .containsExactly(immunizationDS1, differentImmunizationDS2, allergyDS1);
-        assertThat(allergyResult.getMedicalResources()).containsExactly(allergyDS1);
-        assertThat(allergyResult.getPageToken()).isEqualTo(null);
-        assertThat(immunizationResult.getMedicalResources())
-                .containsExactly(immunizationDS1, differentImmunizationDS2);
-        assertThat(immunizationResult.getPageToken()).isEqualTo(null);
-        assertThat(immunizationsFromDataSource1Result.getMedicalResources())
-                .containsExactly(immunizationDS1);
-        assertThat(immunizationsFromDataSource1Result.getPageToken()).isEqualTo(null);
-        assertThat(immunizationsFromDataSource2Result.getMedicalResources())
-                .containsExactly(differentImmunizationDS2);
-        assertThat(immunizationsFromDataSource2Result.getPageToken()).isEqualTo(null);
+        assertThat(upsertedResources).containsExactly(vaccineDS1, differentVaccineDS2, allergyDS1);
+        assertThat(allAllergiesResult.getMedicalResources()).containsExactly(allergyDS1);
+        assertThat(allAllergiesResult.getPageToken()).isEqualTo(null);
+        assertThat(allAllergiesResult.getRemainingCount()).isEqualTo(0);
+        assertThat(allVaccinesResult.getMedicalResources())
+                .containsExactly(vaccineDS1, differentVaccineDS2);
+        assertThat(allVaccinesResult.getPageToken()).isEqualTo(null);
+        assertThat(allVaccinesResult.getRemainingCount()).isEqualTo(0);
+        assertThat(vaccinesFromDataSource1Result.getMedicalResources()).containsExactly(vaccineDS1);
+        assertThat(vaccinesFromDataSource1Result.getPageToken()).isEqualTo(null);
+        assertThat(vaccinesFromDataSource1Result.getRemainingCount()).isEqualTo(0);
+        assertThat(vaccinesFromDataSource2Result.getMedicalResources())
+                .containsExactly(differentVaccineDS2);
+        assertThat(vaccinesFromDataSource2Result.getPageToken()).isEqualTo(null);
+        assertThat(vaccinesFromDataSource2Result.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertMedicalResources_dataSourceNotInserted_exceptionThrown() {
         FhirResource fhirResource = getFhirResource();
         String datasourceId = "acc6c726-b7ea-42f1-a063-e34f5b4e6247";
         UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest =
                 makeUpsertRequest(
                         fhirResource,
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
                         FHIR_VERSION_R4,
                         datasourceId);
 
@@ -686,22 +655,22 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertMedicalResources_dataSourceBelongsToDifferentApp_exceptionThrownNoWrite() {
         MedicalDataSource ownDataSource =
-                mUtil.insertMedicalDataSource("id1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("id1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource differentDataSource =
-                mUtil.insertMedicalDataSource("id2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("id2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         UpsertMedicalResourceInternalRequest upsertRequestOwnDataSource =
                 makeUpsertRequest(
                         getFhirResource(),
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
                         FHIR_VERSION_R4,
                         ownDataSource.getId());
         UpsertMedicalResourceInternalRequest upsertRequestDifferentDataSource =
                 makeUpsertRequest(
                         getFhirResource(),
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
                         FHIR_VERSION_R4,
                         differentDataSource.getId());
 
@@ -721,66 +690,64 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void upsertMedicalResources_fhirVersionDoesNotMatchDataSource_exceptionThrown() {
+        MedicalDataSource dataSource =
+                mUtil.insertR4MedicalDataSource("id1", DATA_SOURCE_PACKAGE_NAME);
+        FhirResource fhirResource = getFhirResource();
+        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest =
+                makeUpsertRequest(
+                        fhirResource,
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        FHIR_VERSION_R4B,
+                        dataSource.getId());
+
+        Throwable thrown =
+                assertThrows(
+                        IllegalArgumentException.class,
+                        () ->
+                                mMedicalResourceHelper.upsertMedicalResources(
+                                        DATA_SOURCE_PACKAGE_NAME,
+                                        List.of(upsertMedicalResourceInternalRequest)));
+        assertThat(thrown)
+                .hasMessageThat()
+                .contains(
+                        String.format(
+                                "Invalid fhir version: %s. It did not match the data source's fhir"
+                                        + " version",
+                                FHIR_VERSION_R4B));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readSubsetOfResourcesByIds_multipleResourcesUpserted_success() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        MedicalResource resource1 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest1 =
-                makeUpsertRequest(resource1);
-        MedicalResourceId medicalResourceId1 =
-                new MedicalResourceId(
-                        dataSource.getId(), fhirResource.getType(), fhirResource.getId());
-        FhirResource allergyFhirResource = getFhirResourceAllergy();
-        MedicalResource resource2 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                allergyFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest2 =
-                makeUpsertRequest(resource2);
-
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource resource1 = createVaccineMedicalResource(dataSource.getId());
+        MedicalResource resource2 = createAllergyMedicalResource(dataSource.getId());
         List<MedicalResource> upsertedMedicalResources =
                 mMedicalResourceHelper.upsertMedicalResources(
                         DATA_SOURCE_PACKAGE_NAME,
-                        List.of(
-                                upsertMedicalResourceInternalRequest1,
-                                upsertMedicalResourceInternalRequest2));
-        List<MedicalResource> readResult =
+                        List.of(makeUpsertRequest(resource1), makeUpsertRequest(resource2)));
+        List<MedicalResource> readResource1Result =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
-                        List.of(medicalResourceId1));
+                        List.of(resource1.getId()));
         List<Integer> indicesResult = readEntriesInMedicalResourceIndicesTable();
 
         assertThat(upsertedMedicalResources).containsExactly(resource1, resource2);
         assertThat(indicesResult)
                 .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
-        assertThat(readResult).containsExactly(resource1);
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
+        assertThat(readResource1Result).containsExactly(resource1);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertMedicalResources_returnsMedicalResources() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        MedicalResource expectedResource =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource expectedResource = createVaccineMedicalResource(dataSource.getId());
         UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest =
                 makeUpsertRequest(expectedResource);
 
@@ -792,18 +759,11 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertSingleMedicalResource_readSingleResource() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        MedicalResource expectedResource =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource expectedResource = createVaccineMedicalResource(dataSource.getId());
         UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest =
                 makeUpsertRequest(expectedResource);
         List<MedicalResourceId> ids = List.of(expectedResource.getId());
@@ -817,11 +777,11 @@
 
         assertThat(result).isEqualTo(upsertedMedicalResources);
         assertThat(result).containsExactly(expectedResource);
-        assertThat(indicesResult).containsExactly(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+        assertThat(indicesResult).containsExactly(MEDICAL_RESOURCE_TYPE_VACCINES);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readById_noReadOrWritePermissions_throws() {
         assertThrows(
                 IllegalStateException.class,
@@ -835,7 +795,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readById_inBgWithoutBgPerm_hasWritePerm_noAccessLog() {
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
@@ -849,12 +809,12 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readById_inBgWithoutBgPerm_hasWritePerm_hasReadPermForResourceTypes_noAccessLog() {
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                 ids,
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ true);
@@ -863,12 +823,12 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void readById_inBgWithoutBgPerm_noWritePerm_immunizationReadPermOnly_noAccessLog() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void readById_inBgWithoutBgPerm_noWritePerm_vaccineReadPermOnly_noAccessLog() {
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                 ids,
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ false,
                 /* isCalledFromBgWithoutBgRead= */ true);
@@ -877,143 +837,143 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readById_expectAccessLogsOnlyContainsNonSelfRead() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationPackage1 =
-                createImmunizationMedicalResource(dataSource1.getId());
-        MedicalResource immunizationPackage2 =
-                createImmunizationMedicalResource(dataSource2.getId());
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccinePackage1 = createVaccineMedicalResource(dataSource1.getId());
+        MedicalResource vaccinePackage2 = createVaccineMedicalResource(dataSource2.getId());
         MedicalResource allergyResourcePackage2 = createAllergyMedicalResource(dataSource2.getId());
-
         mMedicalResourceHelper.upsertMedicalResources(
-                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(immunizationPackage1)));
+                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(vaccinePackage1)));
         mMedicalResourceHelper.upsertMedicalResources(
                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME,
                 List.of(
-                        makeUpsertRequest(immunizationPackage2),
+                        makeUpsertRequest(vaccinePackage2),
                         makeUpsertRequest(allergyResourcePackage2)));
+        // Clear access logs table, so that only the access logs from read will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                 List.of(
-                        immunizationPackage1.getId(),
-                        immunizationPackage2.getId(),
+                        vaccinePackage1.getId(),
+                        vaccinePackage2.getId(),
                         allergyResourcePackage2.getId()),
-                Set.of(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ false);
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE read permission.
+        // has MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES read permission.
         // has write permission.
-        // The data that the calling app can read: immunizationPackage1 (through selfRead)
+        // The data that the calling app can read: vaccinePackage1 (through selfRead)
         // allergyResourcePackage2 (through read permission)
         // In this case, read access log is only created for non self read data:
-        // MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE.
+        // MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES.
         AccessLog expected =
                 new AccessLog(
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_READ,
                         /* medicalResourceTypes= */ Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(expected);
+                .containsExactly(expected);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readById_expectAccessLogsWhenAppHasNoWritePermHasReadPermButReadOnlySelfData() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationPackage1 =
-                createImmunizationMedicalResource(dataSource1.getId());
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccinePackage1 = createVaccineMedicalResource(dataSource1.getId());
         MedicalResource allergyResourcePackage2 = createAllergyMedicalResource(dataSource2.getId());
-
         mMedicalResourceHelper.upsertMedicalResources(
-                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(immunizationPackage1)));
+                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(vaccinePackage1)));
         mMedicalResourceHelper.upsertMedicalResources(
                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME,
                 List.of(makeUpsertRequest(allergyResourcePackage2)));
+        // Clear access logs table, so that only the access logs from read will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
-                List.of(immunizationPackage1.getId(), allergyResourcePackage2.getId()),
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                List.of(vaccinePackage1.getId(), allergyResourcePackage2.getId()),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ false,
                 /* isCalledFromBgWithoutBgRead= */ false);
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_IMMUNIZATION read permission.
+        // has MEDICAL_RESOURCE_TYPE_VACCINES read permission.
         // no write permission.
-        // The data that the calling app can read: immunizationPackage1 (through read permission)
+        // The data that the calling app can read: vaccinePackage1 (through read permission)
         // In this case, read access log is created based on the intention of the app
-        // even though the actual data accessed is self data: MEDICAL_RESOURCE_TYPE_IMMUNIZATION.
+        // even though the actual data accessed is self data: MEDICAL_RESOURCE_TYPE_VACCINES.
         AccessLog expected =
                 new AccessLog(
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_READ,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(expected);
+                .containsExactly(expected);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readById_expectAccessLogsWhenAppHasNoWritePermHasReadPermReadNonSelfData() {
         String dataSource =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME).getId();
-        MedicalResource immunizationDifferentPackage =
-                createImmunizationMedicalResource(dataSource);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME).getId();
+        MedicalResource vaccineDifferentPackage = createVaccineMedicalResource(dataSource);
         mMedicalResourceHelper.upsertMedicalResources(
                 DIFFERENT_DATA_SOURCE_PACKAGE_NAME,
-                List.of(makeUpsertRequest(immunizationDifferentPackage)));
+                List.of(makeUpsertRequest(vaccineDifferentPackage)));
+        // Clear access logs table, so that only the access logs from read will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
-                List.of(immunizationDifferentPackage.getId()),
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                List.of(vaccineDifferentPackage.getId()),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ false,
                 /* isCalledFromBgWithoutBgRead= */ false);
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_IMMUNIZATION read permission.
+        // has MEDICAL_RESOURCE_TYPE_VACCINES read permission.
         // no write permission.
-        // The data that the calling app can read: immunization (through read permission)
-        // In this case, read access log is created: MEDICAL_RESOURCE_TYPE_IMMUNIZATION.
+        // The data that the calling app can read: vaccine (through read permission)
+        // In this case, read access log is created: MEDICAL_RESOURCE_TYPE_VACCINES.
         AccessLog expected =
                 new AccessLog(
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_READ,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(expected);
+                .containsExactly(expected);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void readById_inForegroundOrBgWithPerm_hasReadImmunization_noResourceRead_noAccessLog() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void readById_inForegroundOrBgWithPerm_hasReadVaccine_noResourceRead_noAccessLog() {
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                 ids,
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ false);
@@ -1022,7 +982,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readById_inForegroundOrBgWithPerm_hasWritePerm_noReadPerm_noAccessLog() {
         List<MedicalResourceId> ids = List.of(getMedicalResourceId());
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
@@ -1038,63 +998,68 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readById_expectAccessLogsWhenAppHasWritePermHasReadPermReadSelfData() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunization =
-                mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccine =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+        // Clear access logs table, so that only the access logs from read will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
-                List.of(immunization.getId()),
-                Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                List.of(vaccine.getId()),
+                Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ false);
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_IMMUNIZATION read permission.
+        // has MEDICAL_RESOURCE_TYPE_VACCINES read permission.
         // has write permission.
-        // The data that the calling app can read: immunization (through read permission)
+        // The data that the calling app can read: vaccine (through read permission)
         // In this case, read access log is created based on the intention of the app
-        // even though the actual data accessed is self data: MEDICAL_RESOURCE_TYPE_IMMUNIZATION.
+        // even though the actual data accessed is self data: MEDICAL_RESOURCE_TYPE_VACCINES.
         AccessLog expected =
                 new AccessLog(
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_READ,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(expected);
+                .containsExactly(expected);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readById_expectAccessLogsForEachResourceTypeReadBasedOnReadPerm() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunization =
-                mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccine =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+        // Clear access logs table, so that only the access logs from read will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
         mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
-                List.of(immunization.getId()),
+                List.of(vaccine.getId()),
                 Set.of(
-                        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                        MEDICAL_RESOURCE_TYPE_VACCINES),
                 DATA_SOURCE_PACKAGE_NAME,
                 /* hasWritePermission= */ true,
                 /* isCalledFromBgWithoutBgRead= */ false);
 
         // Testing the case where calling app:
         // is calling from foreground or background with permission.
-        // has MEDICAL_RESOURCE_TYPE_IMMUNIZATION and MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE read
-        // permission.
+        // has MEDICAL_RESOURCE_TYPE_VACCINES and MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES
+        // read permission.
         // has write permission.
-        // The data that the calling app reads: immunization (through read permission)
-        // In this case, read access log is created only for: MEDICAL_RESOURCE_TYPE_IMMUNIZATION.
-        // Even though the app has read permission for MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
+        // The data that the calling app reads: vaccine (through read permission)
+        // In this case, read access log is created only for: MEDICAL_RESOURCE_TYPE_VACCINES.
+        // Even though the app has read permission for MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
         // the app did
         // not read any data of that type, so no access logs added for that.
         AccessLog expected =
@@ -1102,35 +1067,32 @@
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_READ,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(expected);
+                .containsExactly(expected);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readById_inBgWithoutBgPerm_hasWritePerm_success() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
@@ -1142,101 +1104,94 @@
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(immunizationDatasource1, allergyDatasource1);
+        assertThat(result).containsExactly(vaccineDatasource1, allergyDatasource1);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readById_inBgWithoutBgPerm_hasWritePerm_hasReadPermForResourceTypes_success() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
         List<MedicalResource> result =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                         ids,
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(immunizationDatasource1, allergyDatasource1);
+        assertThat(result).containsExactly(vaccineDatasource1, allergyDatasource1);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
-    public void readById_inBgWithoutBgPerm_noWritePerm_immunizationReadPermOnly_success() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void readById_inBgWithoutBgPerm_noWritePerm_vaccineReadPermOnly_success() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
         List<MedicalResource> result =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                         ids,
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(immunizationDatasource1);
+        assertThat(result).containsExactly(vaccineDatasource1);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
-    public void
-            readById_inBgWithoutBgPerm_noWritePerm_bothAllergyAndImmunizationReadPerm_success() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void readById_inBgWithoutBgPerm_noWritePerm_bothAllergyAndVaccineReadPerm_success() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
@@ -1244,71 +1199,67 @@
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                         ids,
                         Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ true);
 
-        assertThat(result).containsExactly(immunizationDatasource1, allergyDatasource1);
+        assertThat(result).containsExactly(vaccineDatasource1, allergyDatasource1);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readById_inForegroundOrinBgWithBgPerm_noWritePerm_success() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
         List<MedicalResource> result =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                         ids,
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DIFFERENT_DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(immunizationDatasource1, immunizationDatasource2);
+        assertThat(result).containsExactly(vaccineDatasource1, vaccineDatasource2);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readById_inForeground_hasWritePerm_noReadResourceTypesPerm_canOnlyReadSelfData() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
@@ -1320,72 +1271,68 @@
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(immunizationDatasource1, allergyDatasource1);
+        assertThat(result).containsExactly(vaccineDatasource1, allergyDatasource1);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
-    public void readById_inForeground_noWritePerm_readImmunizationPerm_canOnlyReadImmunization() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void readById_inForeground_noWritePerm_readVaccinePerm_canOnlyReadVaccine() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
         List<MedicalResource> result =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                         ids,
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
-        assertThat(result).containsExactly(immunizationDatasource1, immunizationDatasource2);
+        assertThat(result).containsExactly(vaccineDatasource1, vaccineDatasource2);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void readById_inForeground_noWritePerm_readAllergyPerm_canOnlyReadAllergy() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
         List<MedicalResource> result =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                         ids,
-                        Set.of(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                        Set.of(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false);
@@ -1394,26 +1341,24 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
-    public void readById_inForeground_noWritePerm_readImmunizationAndAllergyPerm_canReadBoth() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void readById_inForeground_noWritePerm_readVaccineAndAllergyPerm_canReadBoth() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
@@ -1421,63 +1366,59 @@
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                         ids,
                         Set.of(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES,
+                                MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ false,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
         assertThat(result)
                 .containsExactly(
-                        immunizationDatasource1,
-                        immunizationDatasource2,
+                        vaccineDatasource1,
+                        vaccineDatasource2,
                         allergyDatasource1,
                         allergyDatasource2);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
-    public void
-            readById_inForeground_hasWritePermAndReadImmunization_readsSelfDataAndImmunizations() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void readById_inForeground_hasWritePermAndReadVaccine_readsSelfDataAndVaccines() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationDatasource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDatasource1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource allergyDatasource1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-        MedicalResource immunizationDatasource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+        MedicalResource vaccineDatasource2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyDatasource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
         List<MedicalResourceId> ids =
                 List.of(
-                        immunizationDatasource1.getId(),
-                        immunizationDatasource2.getId(),
+                        vaccineDatasource1.getId(),
+                        vaccineDatasource2.getId(),
                         allergyDatasource1.getId(),
                         allergyDatasource2.getId());
 
         List<MedicalResource> result =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithPermissionChecks(
                         ids,
-                        Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         DATA_SOURCE_PACKAGE_NAME,
                         /* hasWritePermission= */ true,
                         /* isCalledFromBgWithoutBgRead= */ false);
 
         assertThat(result)
-                .containsExactly(
-                        immunizationDatasource1, immunizationDatasource2, allergyDatasource1);
+                .containsExactly(vaccineDatasource1, vaccineDatasource2, allergyDatasource1);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readByRequest_isNotEnforceSelfRead_createsAccessLog() {
         ReadMedicalResourcesInitialRequest readRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         mMedicalResourceHelper.readMedicalResourcesByRequestWithPermissionChecks(
                 PhrPageTokenWrapper.from(readRequest.toParcel()),
@@ -1490,19 +1431,19 @@
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_READ,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
 
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(expected);
+                .containsExactly(expected);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readByRequest_isEnforceSelfRead_doesNotCreateAccessLog() {
         ReadMedicalResourcesInitialRequest readRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build();
         mMedicalResourceHelper.readMedicalResourcesByRequestWithPermissionChecks(
                 PhrPageTokenWrapper.from(readRequest.toParcel()),
@@ -1512,25 +1453,25 @@
 
         List<AccessLog> accessLogs = mAccessLogsHelper.queryAccessLogs();
 
-        assertThat(accessLogs).hasSize(0);
+        assertThat(accessLogs).isEmpty();
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
-    public void readByRequest_isNotEnforceSelfRead_immunizationFilter_canReadAllImmunizations() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void readByRequest_isNotEnforceSelfRead_vaccineFilter_canReadAllVaccines() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        // In total inserts 8 resources, among which 6 are Immunizations to be read in 3 pages.
-        List<MedicalResource> immunizationsDataSource1 =
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        // In total inserts 8 resources, among which 6 are vaccines to be read in 3 pages.
+        List<MedicalResource> vaccinesDataSource1 =
                 mUtil.upsertResources(
-                        PhrDataFactory::createImmunizationMedicalResources,
+                        PhrDataFactory::createVaccineMedicalResources,
                         /* numOfResources= */ 4,
                         dataSource1);
-        List<MedicalResource> immunizationsDataSource2 =
+        List<MedicalResource> vaccinesDataSource2 =
                 mUtil.upsertResources(
-                        PhrDataFactory::createImmunizationMedicalResources,
+                        PhrDataFactory::createVaccineMedicalResources,
                         /* numOfResources= */ 2,
                         dataSource2);
         List<MedicalResource> allergyDatasource1 =
@@ -1539,10 +1480,10 @@
                         /* numOfResources= */ 2,
                         dataSource1);
         List<MedicalResource> resources =
-                joinLists(immunizationsDataSource1, immunizationsDataSource2, allergyDatasource1);
+                joinLists(vaccinesDataSource1, vaccinesDataSource2, allergyDatasource1);
 
         ReadMedicalResourcesInitialRequest initialRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .setPageSize(2)
                         .build();
         PhrPageTokenWrapper initialPageTokenWrapper =
@@ -1560,6 +1501,7 @@
         assertThat(pageToken1)
                 .isEqualTo(
                         initialPageTokenWrapper.cloneWithNewLastRowId(/* lastRowId= */ 2).encode());
+        assertThat(initialResult.getRemainingCount()).isEqualTo(4);
 
         ReadMedicalResourcesPageRequest pageRequest1 =
                 new ReadMedicalResourcesPageRequest.Builder(pageToken1).setPageSize(2).build();
@@ -1576,6 +1518,7 @@
         assertThat(pageToken2).isNotEmpty();
         assertThat(pageToken2)
                 .isEqualTo(pageTokenWrapper1.cloneWithNewLastRowId(/* lastRowId= */ 4).encode());
+        assertThat(pageResult.getRemainingCount()).isEqualTo(2);
 
         ReadMedicalResourcesPageRequest pageRequest2 =
                 new ReadMedicalResourcesPageRequest.Builder(pageToken2).setPageSize(2).build();
@@ -1590,25 +1533,26 @@
         assertThat(pageResult2.getMedicalResources())
                 .containsExactlyElementsIn(List.of(resources.get(4), resources.get(5)));
         assertThat(pageToken3).isNull();
+        assertThat(pageResult2.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE})
-    public void readByRequest_enforceSelfRead_immunizationFilter_canReadOnlySelfImmunization() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
+    public void readByRequest_enforceSelfRead_vaccineFilter_canReadOnlySelfVaccines() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        // In total inserts 8 resources, among which 4 are Immunizations from data source 1 to be
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        // In total inserts 8 resources, among which 4 are vaccines from data source 1 to be
         // read in 2 pages.
-        List<MedicalResource> immunizationsDataSource1 =
+        List<MedicalResource> vaccinesDataSource1 =
                 mUtil.upsertResources(
-                        PhrDataFactory::createImmunizationMedicalResources,
+                        PhrDataFactory::createVaccineMedicalResources,
                         /* numOfResources= */ 4,
                         dataSource1);
-        List<MedicalResource> immunizationsDataSource2 =
+        List<MedicalResource> vaccinesDataSource2 =
                 mUtil.upsertResources(
-                        PhrDataFactory::createImmunizationMedicalResources,
+                        PhrDataFactory::createVaccineMedicalResources,
                         /* numOfResources= */ 2,
                         dataSource2);
         List<MedicalResource> allergyDatasource1 =
@@ -1617,10 +1561,10 @@
                         /* numOfResources= */ 2,
                         dataSource1);
         List<MedicalResource> resources =
-                joinLists(immunizationsDataSource1, immunizationsDataSource2, allergyDatasource1);
+                joinLists(vaccinesDataSource1, vaccinesDataSource2, allergyDatasource1);
 
         ReadMedicalResourcesInitialRequest initialRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .setPageSize(2)
                         .build();
         PhrPageTokenWrapper initialPageTokenWrapper =
@@ -1638,6 +1582,7 @@
         assertThat(pageToken1)
                 .isEqualTo(
                         initialPageTokenWrapper.cloneWithNewLastRowId(/* lastRowId= */ 2).encode());
+        assertThat(initialResult.getRemainingCount()).isEqualTo(2);
 
         ReadMedicalResourcesPageRequest pageRequest =
                 new ReadMedicalResourcesPageRequest.Builder(pageToken1).setPageSize(2).build();
@@ -1652,71 +1597,50 @@
         assertThat(pageResult.getMedicalResources())
                 .containsExactlyElementsIn(List.of(resources.get(2), resources.get(3)));
         assertThat(pageToken2).isNull();
+        assertThat(pageResult.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertMultipleMedicalResourcesWithSameDataSource_readMultipleResources() {
         // TODO(b/351992434): Create test utilities to make these large repeated code blocks
         // clearer.
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource1 = getFhirResource();
-        MedicalResource resource1 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource1)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest1 =
-                makeUpsertRequest(resource1);
-        FhirResource fhirResource2 = getFhirResourceAllergy();
-        MedicalResource resource2 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource2)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest2 =
-                makeUpsertRequest(resource2);
-        List<MedicalResourceId> ids = List.of(resource1.getId(), resource2.getId());
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource resource1 = createVaccineMedicalResource(dataSource.getId());
+        MedicalResource resource2 = createAllergyMedicalResource(dataSource.getId());
 
         List<MedicalResource> upsertedMedicalResources =
                 mMedicalResourceHelper.upsertMedicalResources(
                         DATA_SOURCE_PACKAGE_NAME,
-                        List.of(
-                                upsertMedicalResourceInternalRequest1,
-                                upsertMedicalResourceInternalRequest2));
+                        List.of(makeUpsertRequest(resource1), makeUpsertRequest(resource2)));
         List<MedicalResource> result =
-                mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(ids);
+                mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                        List.of(resource1.getId(), resource2.getId()));
         List<Integer> indicesResult = readEntriesInMedicalResourceIndicesTable();
 
         assertThat(result).containsExactly(resource1, resource2);
         assertThat(upsertedMedicalResources).containsExactly(resource1, resource2);
         assertThat(indicesResult)
                 .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertMedicalResourcesOfSameType_createsAccessLog_success() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         mUtil.upsertResources(
-                PhrDataFactory::createImmunizationMedicalResources,
-                /* numOfResources= */ 6,
-                dataSource);
+                PhrDataFactory::createVaccineMedicalResources, /* numOfResources= */ 6, dataSource);
 
         AccessLog expected =
                 new AccessLog(
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_UPSERT,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
 
         assertThat(mAccessLogsHelper.queryAccessLogs())
@@ -1725,14 +1649,14 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertMedicalResourcesOfDifferentTypes_createsAccessLog_success() {
-        String dataSource = mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME).getId();
-        MedicalResource immunization = createImmunizationMedicalResource(dataSource);
+        String dataSource = mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME).getId();
+        MedicalResource vaccine = createVaccineMedicalResource(dataSource);
         MedicalResource allergy = createAllergyMedicalResource(dataSource);
         mMedicalResourceHelper.upsertMedicalResources(
                 DATA_SOURCE_PACKAGE_NAME,
-                createUpsertMedicalResourceRequests(List.of(immunization, allergy), dataSource));
+                createUpsertMedicalResourceRequests(List.of(vaccine, allergy), dataSource));
 
         AccessLog expected =
                 new AccessLog(
@@ -1740,8 +1664,8 @@
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_UPSERT,
                         /* medicalResourceTypes= */ Set.of(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                                MEDICAL_RESOURCE_TYPE_VACCINES,
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         /* isMedicalDataSourceAccessed= */ false);
 
         assertThat(mAccessLogsHelper.queryAccessLogs())
@@ -1750,20 +1674,20 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertAndUpdateMedicalResources_createsAccessLog_success() throws JSONException {
-        String dataSource = mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME).getId();
-        MedicalResource immunization = createImmunizationMedicalResource(dataSource);
+        String dataSource = mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME).getId();
+        MedicalResource vaccine = createVaccineMedicalResource(dataSource);
         MedicalResource allergy = createAllergyMedicalResource(dataSource);
-        MedicalResource updatedImmunization = createUpdatedImmunizationMedicalResource(dataSource);
+        MedicalResource updatedVaccine = createUpdatedVaccineMedicalResource(dataSource);
         // initial insert
         mMedicalResourceHelper.upsertMedicalResources(
                 DATA_SOURCE_PACKAGE_NAME,
-                createUpsertMedicalResourceRequests(List.of(immunization, allergy), dataSource));
-        // update the immunization resource
+                createUpsertMedicalResourceRequests(List.of(vaccine, allergy), dataSource));
+        // update the vaccine resource
         mMedicalResourceHelper.upsertMedicalResources(
                 DATA_SOURCE_PACKAGE_NAME,
-                createUpsertMedicalResourceRequests(List.of(updatedImmunization), dataSource));
+                createUpsertMedicalResourceRequests(List.of(updatedVaccine), dataSource));
 
         AccessLog insertAccessLog =
                 new AccessLog(
@@ -1771,15 +1695,15 @@
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_UPSERT,
                         /* medicalResourceTypes= */ Set.of(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                                MEDICAL_RESOURCE_TYPE_VACCINES,
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         /* isMedicalDataSourceAccessed= */ false);
         AccessLog updateAccessLog =
                 new AccessLog(
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_UPSERT,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
 
         assertThat(mAccessLogsHelper.queryAccessLogs())
@@ -1788,237 +1712,131 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_DEVELOPMENT_DATABASE})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD, Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE})
     public void insertMultipleMedicalResourcesWithDifferentDataSources_readMultipleResources() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        MedicalResource resource1 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource1.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest1 =
-                makeUpsertRequest(resource1);
-        MedicalResource resource2 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource2.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest2 =
-                makeUpsertRequest(resource2);
-        List<MedicalResourceId> ids = List.of(resource1.getId(), resource2.getId());
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource resource1 = createVaccineMedicalResource(dataSource1.getId());
+        MedicalResource resource2 = createDifferentVaccineMedicalResource(dataSource2.getId());
 
         List<MedicalResource> upsertedMedicalResources =
                 mMedicalResourceHelper.upsertMedicalResources(
                         DATA_SOURCE_PACKAGE_NAME,
-                        List.of(
-                                upsertMedicalResourceInternalRequest1,
-                                upsertMedicalResourceInternalRequest2));
+                        List.of(makeUpsertRequest(resource1), makeUpsertRequest(resource2)));
         List<MedicalResource> result =
-                mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(ids);
+                mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                        List.of(resource1.getId(), resource2.getId()));
         List<Integer> indicesResult = readEntriesInMedicalResourceIndicesTable();
 
         assertThat(result).containsExactly(resource1, resource2);
         assertThat(upsertedMedicalResources).containsExactly(resource1, resource2);
         assertThat(indicesResult)
-                .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION, MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                .containsExactly(MEDICAL_RESOURCE_TYPE_VACCINES, MEDICAL_RESOURCE_TYPE_VACCINES);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void updateSingleMedicalResource_success() throws JSONException {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource originalFhirResource = getFhirResource();
-        FhirResource fhirResourceUpdated =
-                getFhirResourceBuilder()
-                        .setData(addCompletedStatus(getFhirResource().getData()))
-                        .build();
-        UpsertMedicalResourceInternalRequest originalUpsertRequest =
-                makeUpsertRequest(
-                        originalFhirResource,
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        FHIR_VERSION_R4,
-                        dataSource.getId());
-        MedicalResource expectedUpdatedMedicalResource =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResourceUpdated)
-                        .build();
-        UpsertMedicalResourceInternalRequest updateRequest =
-                makeUpsertRequest(expectedUpdatedMedicalResource);
-        List<MedicalResourceId> ids = List.of(expectedUpdatedMedicalResource.getId());
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource originalResource = createVaccineMedicalResource(dataSource.getId());
+        MedicalResource updatedResource = createUpdatedVaccineMedicalResource(dataSource.getId());
 
         mMedicalResourceHelper.upsertMedicalResources(
-                DATA_SOURCE_PACKAGE_NAME, List.of(originalUpsertRequest));
+                DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(originalResource)));
         List<MedicalResource> updatedMedicalResource =
                 mMedicalResourceHelper.upsertMedicalResources(
-                        DATA_SOURCE_PACKAGE_NAME, List.of(updateRequest));
+                        DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(updatedResource)));
         List<MedicalResource> result =
-                mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(ids);
+                mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                        List.of(originalResource.getId()));
         List<Integer> indicesResult = readEntriesInMedicalResourceIndicesTable();
 
-        assertThat(result).containsExactly(expectedUpdatedMedicalResource);
+        assertThat(result).containsExactly(updatedResource);
         assertThat(result).isEqualTo(updatedMedicalResource);
-        assertThat(indicesResult).containsExactly(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+        assertThat(indicesResult).containsExactly(MEDICAL_RESOURCE_TYPE_VACCINES);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void insertMultipleMedicalResources_updateSingleMedicalResource_success()
             throws JSONException {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        MedicalResource originalResource =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest1 =
-                makeUpsertRequest(originalResource);
-        FhirResource updatedFhirResource = getUpdatedImmunizationFhirResource();
-        MedicalResource updatedResource1 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                updatedFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequestUpdated1 =
-                makeUpsertRequest(updatedResource1);
-        FhirResource allergyFhirResource = getFhirResourceAllergy();
-        MedicalResource resource2 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                allergyFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest2 =
-                makeUpsertRequest(resource2);
-        List<MedicalResourceId> medicalIdFilters =
-                List.of(updatedResource1.getId(), resource2.getId());
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource originalResource1 = createVaccineMedicalResource(dataSource.getId());
+        MedicalResource updatedResource1 = createUpdatedVaccineMedicalResource(dataSource.getId());
+        MedicalResource resource2 = createAllergyMedicalResource(dataSource.getId());
 
         List<MedicalResource> upsertedMedicalResources =
                 mMedicalResourceHelper.upsertMedicalResources(
                         DATA_SOURCE_PACKAGE_NAME,
                         List.of(
-                                upsertMedicalResourceInternalRequest1,
-                                upsertMedicalResourceInternalRequest2));
+                                makeUpsertRequest(originalResource1),
+                                makeUpsertRequest(resource2)));
         List<MedicalResource> updatedMedicalResource =
                 mMedicalResourceHelper.upsertMedicalResources(
-                        DATA_SOURCE_PACKAGE_NAME,
-                        List.of(upsertMedicalResourceInternalRequestUpdated1));
-        List<MedicalResource> result =
+                        DATA_SOURCE_PACKAGE_NAME, List.of(makeUpsertRequest(updatedResource1)));
+        List<MedicalResource> readResults =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
-                        medicalIdFilters);
+                        List.of(updatedResource1.getId(), resource2.getId()));
         List<Integer> indicesResult = readEntriesInMedicalResourceIndicesTable();
 
-        assertThat(result).containsExactly(updatedResource1, resource2);
-        assertThat(upsertedMedicalResources).containsExactly(originalResource, resource2);
+        assertThat(readResults).containsExactly(updatedResource1, resource2);
+        assertThat(upsertedMedicalResources).containsExactly(originalResource1, resource2);
         assertThat(updatedMedicalResource).containsExactly(updatedResource1);
         assertThat(indicesResult)
                 .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void insertMultipleMedicalResources_updateMultipleMedicalResources_success()
             throws JSONException {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
-        FhirResource fhirResource = getFhirResource();
-        MedicalResource resource1 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                fhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest1 =
-                makeUpsertRequest(resource1);
-        FhirResource updatedFhirResource = getUpdatedImmunizationFhirResource();
-        MedicalResource updatedResource1 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                updatedFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequestUpdated1 =
-                makeUpsertRequest(updatedResource1);
-        FhirResource allergyFhirResource = getFhirResourceAllergy();
-        MedicalResource resource2 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                allergyFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequest2 =
-                makeUpsertRequest(resource2);
-        FhirResource updatedAllergyFhirResource = getUpdatedAllergyFhirResource();
-        MedicalResource updatedResource2 =
-                new MedicalResource.Builder(
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE,
-                                dataSource.getId(),
-                                FHIR_VERSION_R4,
-                                updatedAllergyFhirResource)
-                        .build();
-        UpsertMedicalResourceInternalRequest upsertMedicalResourceInternalRequestUpdated2 =
-                makeUpsertRequest(updatedResource2);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource resource1 = createVaccineMedicalResource(dataSource.getId());
+        MedicalResource updatedResource1 = createUpdatedVaccineMedicalResource(dataSource.getId());
+        MedicalResource resource2 = createAllergyMedicalResource(dataSource.getId());
+        MedicalResource updatedResource2 = createUpdatedAllergyMedicalResource(dataSource.getId());
 
-        List<MedicalResource> upsertedMedicalResources =
+        List<MedicalResource> insertedMedicalResources =
                 mMedicalResourceHelper.upsertMedicalResources(
                         DATA_SOURCE_PACKAGE_NAME,
-                        List.of(
-                                upsertMedicalResourceInternalRequest1,
-                                upsertMedicalResourceInternalRequest2));
+                        List.of(makeUpsertRequest(resource1), makeUpsertRequest(resource2)));
         List<MedicalResource> updatedMedicalResource =
                 mMedicalResourceHelper.upsertMedicalResources(
                         DATA_SOURCE_PACKAGE_NAME,
                         List.of(
-                                upsertMedicalResourceInternalRequestUpdated1,
-                                upsertMedicalResourceInternalRequestUpdated2));
+                                makeUpsertRequest(updatedResource1),
+                                makeUpsertRequest(updatedResource2)));
         List<MedicalResourceId> medicalIdFilters = List.of(resource1.getId(), resource2.getId());
         List<MedicalResource> result =
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
                         medicalIdFilters);
         List<Integer> indicesResult = readEntriesInMedicalResourceIndicesTable();
 
-        assertThat(upsertedMedicalResources).containsExactly(resource1, resource2);
+        assertThat(insertedMedicalResources).containsExactly(resource1, resource2);
         assertThat(updatedMedicalResource)
                 .containsExactly(updatedResource1, updatedResource2)
                 .inOrder();
         assertThat(result).containsExactly(updatedResource1, updatedResource2);
         assertThat(indicesResult)
                 .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void insertMultipleMedicalResources_readByRequest_success() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         List<MedicalResource> resources =
-                createImmunizationMedicalResources(/* numOfResources= */ 6, dataSource.getId());
+                createVaccineMedicalResources(/* numOfResources= */ 6, dataSource.getId());
         List<UpsertMedicalResourceInternalRequest> upsertRequests =
                 createUpsertMedicalResourceRequests(resources, dataSource.getId());
 
@@ -2028,7 +1846,7 @@
         assertThat(upsertedMedicalResources).containsExactlyElementsIn(resources);
 
         ReadMedicalResourcesInitialRequest initialRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .setPageSize(2)
                         .build();
         PhrPageTokenWrapper pageTokenWrapper = PhrPageTokenWrapper.from(initialRequest.toParcel());
@@ -2041,6 +1859,7 @@
         assertThat(pageToken1).isNotEmpty();
         assertThat(pageToken1)
                 .isEqualTo(pageTokenWrapper.cloneWithNewLastRowId(/* lastRowId= */ 2).encode());
+        assertThat(initialResult.getRemainingCount()).isEqualTo(4);
 
         ReadMedicalResourcesPageRequest pageRequest1 =
                 new ReadMedicalResourcesPageRequest.Builder(pageToken1).setPageSize(2).build();
@@ -2054,6 +1873,7 @@
         assertThat(pageToken2).isNotEmpty();
         assertThat(pageToken2)
                 .isEqualTo(pageTokenWrapper1.cloneWithNewLastRowId(/* lastRowId= */ 4).encode());
+        assertThat(pageResult1.getRemainingCount()).isEqualTo(2);
 
         ReadMedicalResourcesPageRequest pageRequest2 =
                 new ReadMedicalResourcesPageRequest.Builder(pageToken2).setPageSize(2).build();
@@ -2065,22 +1885,23 @@
         assertThat(result2.getMedicalResources())
                 .containsExactlyElementsIn(List.of(resources.get(4), resources.get(5)));
         assertThat(pageToken3).isNull();
+        assertThat(result2.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void insertMultipleMedicalResourcesReadByRequest_pageSizeLargerThanResources_success() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         List<MedicalResource> resources =
-                createImmunizationMedicalResources(/* numOfResources= */ 6, dataSource.getId());
+                createVaccineMedicalResources(/* numOfResources= */ 6, dataSource.getId());
         List<UpsertMedicalResourceInternalRequest> requests =
                 createUpsertMedicalResourceRequests(resources, dataSource.getId());
 
         List<MedicalResource> upsertedMedicalResources =
                 mMedicalResourceHelper.upsertMedicalResources(DATA_SOURCE_PACKAGE_NAME, requests);
         ReadMedicalResourcesInitialRequest readRequest =
-                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .setPageSize(10)
                         .build();
         ReadMedicalResourcesInternalResponse result =
@@ -2091,10 +1912,11 @@
         assertThat(upsertedMedicalResources).containsExactlyElementsIn(resources);
         assertThat(result.getMedicalResources()).containsExactlyElementsIn(resources);
         assertThat(result.getPageToken()).isEqualTo(null);
+        assertThat(result.getRemainingCount()).isEqualTo(0);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void readMedicalResourcedByRequest_invalidPageToken_throws() {
         ReadMedicalResourcesPageRequest request =
                 new ReadMedicalResourcesPageRequest.Builder(INVALID_PAGE_TOKEN).build();
@@ -2107,7 +1929,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_appIdDoesNotExist_throws() {
         assertThrows(
                 IllegalArgumentException.class,
@@ -2117,7 +1939,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_withPackageName_noDataDeleted_noDeleteAccessLogs() {
         mMedicalResourceHelper.deleteMedicalResourcesByIdsWithPermissionChecks(
                 List.of(getMedicalResourceId()), DATA_SOURCE_PACKAGE_NAME);
@@ -2126,80 +1948,75 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIdsWithoutPermissionChecks_noDeleteAccessLogs() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalResource resource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
         mMedicalResourceHelper.deleteMedicalResourcesByIdsWithoutPermissionChecks(
                 List.of(resource1.getId()));
 
-        AccessLog deleteAccessLog =
-                new AccessLog(
-                        DATA_SOURCE_PACKAGE_NAME,
-                        INSTANT_NOW.toEpochMilli(),
-                        OPERATION_TYPE_DELETE,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
-                        /* isMedicalDataSourceAccessed= */ false);
-
-        assertThat(mAccessLogsHelper.queryAccessLogs())
-                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .doesNotContain(deleteAccessLog);
+        assertThat(mAccessLogsHelper.queryAccessLogs()).isEmpty();
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteByIdsWithPermissionChecks_resourcesWithDifferentPackages_correctAccessLogs() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationPackage1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccinePackage1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource unknownResourcePackage2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
         mMedicalResourceHelper.deleteMedicalResourcesByIdsWithPermissionChecks(
-                List.of(immunizationPackage1.getId(), unknownResourcePackage2.getId()),
+                List.of(vaccinePackage1.getId(), unknownResourcePackage2.getId()),
                 /* packageName= */ DATA_SOURCE_PACKAGE_NAME);
 
         // In this test, we have inserted two different resource types from different packages.
         // When the calling app, calls the delete API, we expect access log to be created only
-        // for the deleted resource type. In this case it would be: immunizationPackage1
+        // for the deleted resource type. In this case it would be: vaccinePackage1
         AccessLog deleteAccessLog =
                 new AccessLog(
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_DELETE,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(deleteAccessLog);
+                .containsExactly(deleteAccessLog);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteByIds_withPackageName_resourcesWithSamePackages_correctAccessLogs() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationPackage1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccinePackage1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource unknownResourcePackage1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
         mMedicalResourceHelper.deleteMedicalResourcesByIdsWithPermissionChecks(
-                List.of(immunizationPackage1.getId(), unknownResourcePackage1.getId()),
+                List.of(vaccinePackage1.getId(), unknownResourcePackage1.getId()),
                 /* packageName= */ DATA_SOURCE_PACKAGE_NAME);
 
         // In this test, we have inserted two different resource types from the same package.
         // When the calling app, calls the delete API, we expect access log to be created
-        // for the deleted resource types. In this case it would be: immunizationPackage1,
+        // for the deleted resource types. In this case it would be: vaccinePackage1,
         // allergyResourcePackage1
         AccessLog deleteAccessLog =
                 new AccessLog(
@@ -2207,17 +2024,16 @@
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_DELETE,
                         /* medicalResourceTypes= */ Set.of(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                                MEDICAL_RESOURCE_TYPE_VACCINES,
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(deleteAccessLog);
+                .containsExactly(deleteAccessLog);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_noId_fails() {
         assertThrows(
                 IllegalArgumentException.class,
@@ -2227,7 +2043,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_oneIdNotPresent_succeeds() {
         mMedicalResourceHelper.deleteMedicalResourcesByIdsWithoutPermissionChecks(
                 List.of(
@@ -2238,12 +2054,12 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_oneIdPresent_succeedsDeleting() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds", DATA_SOURCE_PACKAGE_NAME);
         MedicalResource medicalResource1 =
-                mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
 
         mMedicalResourceHelper.deleteMedicalResourcesByIdsWithoutPermissionChecks(
                 List.of(medicalResource1.getId()));
@@ -2258,12 +2074,12 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_oneOfTwoSpecified_onlySpecifiedDeleted() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalResource medicalResource1 =
-                mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
         MedicalResource medicalResource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource);
 
@@ -2275,16 +2091,16 @@
                 mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
                         List.of(medicalResource1.getId(), medicalResource2.getId()));
         assertThat(result).containsExactly(medicalResource2);
-        assertThat(indicesResult).containsExactly(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
+        assertThat(indicesResult).containsExactly(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_oneOfTwoSpecifiedWrongPackage_nothingDeleted() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalResource medicalResource1 =
-                mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
         MedicalResource medicalResource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource);
 
@@ -2298,12 +2114,12 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_oneOfTwoSpecifiedRightPackage_oneOfTwo() {
         MedicalDataSource dataSource =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalResource medicalResource1 =
-                mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
         MedicalResource medicalResource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource);
 
@@ -2317,18 +2133,16 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void deleteMedicalResourcesByIds_multipleIdsFromDifferentPackages_succeeds() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
         MedicalResource expectedResource1Source1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource expectedResource1Source2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource expectedResource2Source1 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
         MedicalResource expectedResource2Source2 =
@@ -2348,27 +2162,39 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void deleteMedicalResourcesByDataSources_singleDataSource_succeeds() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithPermChecks_appHasNotInsertedData_throws() {
+        DeleteMedicalResourcesRequest request =
+                new DeleteMedicalResourcesRequest.Builder().addDataSourceId(DATA_SOURCE_ID).build();
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () ->
+                        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                                request, "fake.package.com"));
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithPermChecks_singleDataSource_succeeds() {
         // Create two datasources, with one resource each.
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
         MedicalResource dataSource1Resource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         MedicalResource dataSource2Resource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource dataSource1Resource2 =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
 
         // Delete all of the data for just the first datasource
-        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithoutPermissionChecks(
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
                 new DeleteMedicalResourcesRequest.Builder()
                         .addDataSourceId(dataSource1.getId())
-                        .build());
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
 
         // Test that the data for data source 1 is gone, but 2 is still present
         assertThat(
@@ -2384,14 +2210,257 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void deleteByDataSources_expectAccessLogsWhenBothDataSourcesAreFromCallingPackage() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithPermChecks_multipleDataSources_succeeds() {
+        // Create three datasources, with one resource each.
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource3 =
+                mUtil.insertR4MedicalDataSource("ds3", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        MedicalResource vaccineDS2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
+        MedicalResource vaccineDS3 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource3);
+
+        // Delete all of the data for the first and second datasource
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .addDataSourceId(dataSource2.getId())
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+
+        // Test that the data for data source 1 and 2 is gone, but 3 is still present
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccineDS1.getId(), vaccineDS2.getId())))
+                .hasSize(0);
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccineDS3.getId())))
+                .hasSize(1);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithPermChecks_singleType_succeeds() {
+        // Create two data sources, with one vaccine each and one extra allergy.
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccine1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        MedicalResource vaccine2 =
+                mUtil.upsertResource(
+                        PhrDataFactory::createDifferentVaccineMedicalResource, dataSource2);
+        MedicalResource allergy =
+                mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
+
+        // Delete all vaccines.
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+
+        // Test that only the allergy remains
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccine1.getId(), vaccine2.getId())))
+                .hasSize(0);
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(allergy.getId())))
+                .hasSize(1);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithPermChecks_multipleTypes_succeeds() {
+        // Create two data sources, with one allergy and one vaccine each.
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        MedicalResource vaccineDS2 =
+                mUtil.upsertResource(
+                        PhrDataFactory::createDifferentVaccineMedicalResource, dataSource2);
+        MedicalResource allergyDS1 =
+                mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
+        MedicalResource allergyDS2 =
+                mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+
+        // Delete all vaccines and allergies.
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+
+        // Test that nothing remains
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(
+                                        vaccineDS1.getId(),
+                                        vaccineDS2.getId(),
+                                        allergyDS1.getId(),
+                                        allergyDS2.getId())))
+                .isEmpty();
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithPermChecks_byTypeAndDataSource_succeeds() {
+        // Create two data sources, with one allergy and one vaccine each.
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        MedicalResource vaccineDS2 =
+                mUtil.upsertResource(
+                        PhrDataFactory::createDifferentVaccineMedicalResource, dataSource2);
+        MedicalResource allergyDS1 =
+                mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
+        MedicalResource allergyDS2 =
+                mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+
+        // Delete data by vaccine and data source 1.
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+
+        // Test that only one vaccine was deleted.
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(
+                                        vaccineDS2.getId(),
+                                        allergyDS1.getId(),
+                                        allergyDS2.getId())))
+                .hasSize(3);
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccineDS1.getId())))
+                .hasSize(0);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithPermChecks_byDataSourceNoData_succeeds() {
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithPermChecks_byTypeNoData_succeeds() {
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void
+            deleteMedicalResourcesByRequestWithPermChecks_byTypeDataBelongsToOtherApp_noDelete() {
+        MedicalDataSource dataSource =
+                mUtil.insertR4MedicalDataSource("ds1", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccine =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+
+        // Test that nothing was deleted
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccine.getId())))
+                .hasSize(1);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void
+            deleteMedicalResourcesByRequestWithPermChecks_bySourceDataBelongsToOtherApp_noDelete() {
+        MedicalDataSource dataSource =
+                mUtil.insertR4MedicalDataSource("ds1", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccine =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource.getId())
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+
+        // Test that nothing was deleted
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccine.getId())))
+                .hasSize(1);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void
+            deleteMedicalResourcesByRequestWithPermChecks_bySourceAndTypeOtherPackage_noDelete() {
+        MedicalDataSource dataSource =
+                mUtil.insertR4MedicalDataSource("ds1", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccine =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource.getId())
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                DATA_SOURCE_PACKAGE_NAME);
+
+        // Test that nothing was deleted
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccine.getId())))
+                .hasSize(1);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByRequestWithPermChecks_bothSourcesFromCallingPackage_expectAccessLogs() {
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
 
         // Both created dataSources are from the same calling app.
         // So when the calling app deletes medicalResources from both those dataSources,
@@ -2409,60 +2478,25 @@
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_DELETE,
                         /* medicalResourceTypes= */ Set.of(
-                                MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                                MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE),
+                                MEDICAL_RESOURCE_TYPE_VACCINES,
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(deleteAccessLog);
+                .containsExactly(deleteAccessLog);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void deleteMedicalResourcesByRequest_singleResourceType_succeeds() {
-        // Create two datasources, with one resource each.
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByRequestWithPermChecks_dataSourcesFromDifferentPackages_expectAccessLogs() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationResourceDataSource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
-        MedicalResource immunizationResourceDataSource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
-        MedicalResource allergyResource =
-                mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
-
-        // Delete all of the data for just the first datasource
-        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithoutPermissionChecks(
-                new DeleteMedicalResourcesRequest.Builder()
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
-                        .build());
-
-        // Test that the data for the immunizations are gone, but the allergy is still present
-        assertThat(
-                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
-                                List.of(
-                                        immunizationResourceDataSource1.getId(),
-                                        immunizationResourceDataSource2.getId())))
-                .hasSize(0);
-        assertThat(
-                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
-                                List.of(allergyResource.getId())))
-                .hasSize(1);
-    }
-
-    @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void deleteByRequest_expectAccessLogsWhenDataSourcesFromDifferentPackages() {
-        MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
-        MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
 
         // The created dataSources are from different calling apps.
         // When the first calling app tries to delete resources given both dataSources,
@@ -2481,24 +2515,34 @@
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_DELETE,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .contains(deleteAccessLog);
+                .containsExactly(deleteAccessLog);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void deleteByDataSources_noDataDeleted_noAccessLogsCreated() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void
+            deleteByRequestWithPermChecks_resourceTypesFromDifferentPackages_expectAccessLogs() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
 
+        // The created resources are in data sources from different calling apps.
+        // When the first calling app tries to delete resources given both resource types,
+        // only the resources belonging to the calling app will be deleted. So accessLogs are added
+        // only for the deleted resourceType.
         mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId(dataSource1.getId())
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
                         .build(),
                 /* callingPackageName= */ DATA_SOURCE_PACKAGE_NAME);
 
@@ -2507,93 +2551,265 @@
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_DELETE,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .doesNotContain(deleteAccessLog);
+                .containsExactly(deleteAccessLog);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void deleteByDataSources_withoutPackageRestriction_noAccessLogsCreated() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByRequestWithPermChecks_resourcesTypesFromSamePackage_logsForAccessedTypes() {
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource1);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
 
-        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithoutPermissionChecks(
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId(dataSource1.getId())
-                        .build());
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES)
+                        .build(),
+                /* callingPackageName= */ DATA_SOURCE_PACKAGE_NAME);
 
         AccessLog deleteAccessLog =
                 new AccessLog(
                         DATA_SOURCE_PACKAGE_NAME,
                         INSTANT_NOW.toEpochMilli(),
                         OPERATION_TYPE_DELETE,
-                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_IMMUNIZATION),
+                        /* medicalResourceTypes= */ Set.of(
+                                MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES),
                         /* isMedicalDataSourceAccessed= */ false);
-
         assertThat(mAccessLogsHelper.queryAccessLogs())
                 .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
-                .doesNotContain(deleteAccessLog);
+                .containsExactly(deleteAccessLog);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
-    public void deleteMedicalResourcesByRequest_singleResourceTypeSingleDataSource_succeeds() {
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByRequestWithPermChecks_expectAccessLogsForAccessedTypesAndSources_noMatch() {
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource2);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource2.getId())
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                /* callingPackageName= */ DATA_SOURCE_PACKAGE_NAME);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs()).isEmpty();
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByRequestWithPermChecks_expectAccessLogsForAccessedTypesAndSources_logs() {
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build(),
+                /* callingPackageName= */ DATA_SOURCE_PACKAGE_NAME);
+
+        AccessLog deleteAccessLog =
+                new AccessLog(
+                        DATA_SOURCE_PACKAGE_NAME,
+                        INSTANT_NOW.toEpochMilli(),
+                        OPERATION_TYPE_DELETE,
+                        /* medicalResourceTypes= */ Set.of(MEDICAL_RESOURCE_TYPE_VACCINES),
+                        /* isMedicalDataSourceAccessed= */ false);
+        assertThat(mAccessLogsHelper.queryAccessLogs())
+                .comparingElementsUsing(ACCESS_LOG_EQUIVALENCE)
+                .containsExactly(deleteAccessLog);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByRequestWithPermChecks_noMatchingDataSources_noAccessLogsCreated() {
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .build(),
+                /* callingPackageName= */ DATA_SOURCE_PACKAGE_NAME);
+
+        assertThat(mAccessLogsHelper.queryAccessLogs()).isEmpty();
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByRequestWithoutPermChecks_withoutPackageRestriction_noAccessLogsCreated() {
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        // Clear access logs table, so that only the access logs from delete will be present
+        mAccessLogsHelper.clearData(mTransactionManager);
+
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithoutPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .build());
+
+        assertThat(mAccessLogsHelper.queryAccessLogs()).isEmpty();
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithoutPermsCheck_singleResourceType_succeeds() {
         // Create two datasources, with one resource each.
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
-        MedicalResource immunizationResourceDataSource1 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource1);
-        MedicalResource immunizationResourceDataSource2 =
-                mUtil.upsertResource(
-                        PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+                mUtil.insertR4MedicalDataSource("ds2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        MedicalResource vaccineDS2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         MedicalResource allergyResource =
                 mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
 
         // Delete all of the data for just the first datasource
         mMedicalResourceHelper.deleteMedicalResourcesByRequestWithoutPermissionChecks(
                 new DeleteMedicalResourcesRequest.Builder()
-                        .addDataSourceId(dataSource1.getId())
-                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_IMMUNIZATION)
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
                         .build());
 
-        // Test that the data for the immunizations are gone, but the allergy is still present
+        // Test that the data for the vaccines are gone, but the allergy is still present
         assertThat(
                         mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
-                                List.of(immunizationResourceDataSource1.getId())))
+                                List.of(vaccineDS1.getId(), vaccineDS2.getId())))
                 .hasSize(0);
         assertThat(
                         mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(allergyResource.getId())))
+                .hasSize(1);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteMedicalResourcesByRequestWithoutPermsCheck_multipleSources_succeeds() {
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource3 =
+                mUtil.insertR4MedicalDataSource("ds3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        MedicalResource vaccineDS2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
+        MedicalResource vaccineDS3 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource3);
+        MedicalResource allergyDS1 =
+                mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
+
+        // Delete data for data sources 1 and 2.
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithoutPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .addDataSourceId(dataSource2.getId())
+                        .build());
+
+        // Test that only data for data source 3 remains.
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
                                 List.of(
-                                        allergyResource.getId(),
-                                        immunizationResourceDataSource2.getId())))
+                                        vaccineDS1.getId(),
+                                        vaccineDS2.getId(),
+                                        allergyDS1.getId())))
+                .hasSize(0);
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccineDS3.getId())))
+                .hasSize(1);
+    }
+
+    @Test
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    public void deleteByRequestWithoutPermChecks_oneResourceTypeAndDataSource_succeeds() {
+        // Create two data sources, with one resource each.
+        MedicalDataSource dataSource1 =
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        MedicalDataSource dataSource2 =
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+        MedicalResource vaccineDS1 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        MedicalResource vaccineDS2 =
+                mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
+        MedicalResource allergyDS1 =
+                mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
+
+        // Delete all of the data for just data source 1.
+        mMedicalResourceHelper.deleteMedicalResourcesByRequestWithoutPermissionChecks(
+                new DeleteMedicalResourcesRequest.Builder()
+                        .addDataSourceId(dataSource1.getId())
+                        .addMedicalResourceType(MEDICAL_RESOURCE_TYPE_VACCINES)
+                        .build());
+
+        // Test that the data for the vaccines are gone, but the allergy is still present.
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(vaccineDS1.getId())))
+                .hasSize(0);
+        assertThat(
+                        mMedicalResourceHelper.readMedicalResourcesByIdsWithoutPermissionChecks(
+                                List.of(allergyDS1.getId(), vaccineDS2.getId())))
                 .hasSize(2);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void testGetMedicalResourceTypeToContributingDataSourcesMap_success() {
-        // Create some data sources with data: ds1 contains [immunization, differentImmunization,
-        // allergy], ds2 contains [immunization], and ds3 contains [allergy].
+        // Create some data sources with data: ds1 contains [vaccine, differentVaccine,
+        // allergy], ds2 contains [vaccine], and ds3 contains [allergy].
         MedicalDataSource dataSource1 =
-                mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource2 =
-                mUtil.insertMedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
+                mUtil.insertR4MedicalDataSource("ds2", DATA_SOURCE_PACKAGE_NAME);
         MedicalDataSource dataSource3 =
-                mUtil.insertMedicalDataSource("ds3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource1);
-        mUtil.upsertResource(
-                PhrDataFactory::createDifferentImmunizationMedicalResource, dataSource1);
-        mUtil.upsertResource(PhrDataFactory::createImmunizationMedicalResource, dataSource2);
+                mUtil.insertR4MedicalDataSource("ds3", DIFFERENT_DATA_SOURCE_PACKAGE_NAME);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createDifferentVaccineMedicalResource, dataSource1);
+        mUtil.upsertResource(PhrDataFactory::createVaccineMedicalResource, dataSource2);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource1);
         mUtil.upsertResource(PhrDataFactory::createAllergyMedicalResource, dataSource3);
+        Instant lastDataUpdateTime =
+                Instant.ofEpochMilli(mFakeTimeSource.getInstantNow().toEpochMilli());
+        MedicalDataSource expectedDataSource1 =
+                new MedicalDataSource.Builder(dataSource1)
+                        .setLastDataUpdateTime(lastDataUpdateTime)
+                        .build();
+        MedicalDataSource expectedDataSource2 =
+                new MedicalDataSource.Builder(dataSource2)
+                        .setLastDataUpdateTime(lastDataUpdateTime)
+                        .build();
+        MedicalDataSource expectedDataSource3 =
+                new MedicalDataSource.Builder(dataSource3)
+                        .setLastDataUpdateTime(lastDataUpdateTime)
+                        .build();
 
         Map<Integer, Set<MedicalDataSource>> response =
                 mMedicalResourceHelper.getMedicalResourceTypeToContributingDataSourcesMap();
@@ -2601,16 +2817,16 @@
         assertThat(response).hasSize(2);
         assertThat(response.keySet())
                 .containsExactly(
-                        MEDICAL_RESOURCE_TYPE_IMMUNIZATION,
-                        MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE);
-        assertThat(response.get(MEDICAL_RESOURCE_TYPE_IMMUNIZATION))
-                .containsExactly(dataSource1, dataSource2);
-        assertThat(response.get(MEDICAL_RESOURCE_TYPE_ALLERGY_INTOLERANCE))
-                .containsExactly(dataSource1, dataSource3);
+                        MEDICAL_RESOURCE_TYPE_VACCINES,
+                        MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES);
+        assertThat(response.get(MEDICAL_RESOURCE_TYPE_VACCINES))
+                .containsExactly(expectedDataSource1, expectedDataSource2);
+        assertThat(response.get(MEDICAL_RESOURCE_TYPE_ALLERGIES_INTOLERANCES))
+                .containsExactly(expectedDataSource1, expectedDataSource3);
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void testGetMedicalResourceTypeToContributingDataSourcesMap_noDataSources_success() {
         Map<Integer, Set<MedicalDataSource>> response =
                 mMedicalResourceHelper.getMedicalResourceTypeToContributingDataSourcesMap();
@@ -2619,10 +2835,10 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_DEVELOPMENT_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
+    @EnableFlags({Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE, Flags.FLAG_PERSONAL_HEALTH_RECORD})
     public void
             testGetMedicalResourceTypeToContributingDataSourcesMap_noMedicalResources_success() {
-        mUtil.insertMedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
+        mUtil.insertR4MedicalDataSource("ds1", DATA_SOURCE_PACKAGE_NAME);
 
         Map<Integer, Set<MedicalDataSource>> response =
                 mMedicalResourceHelper.getMedicalResourceTypeToContributingDataSourcesMap();
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceIndicesHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceIndicesHelperTest.java
index 6375ccb..3741f83 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceIndicesHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/MedicalResourceIndicesHelperTest.java
@@ -16,7 +16,7 @@
 
 package com.android.server.healthconnect.storage.datatypehelpers;
 
-import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATION;
+import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES;
 
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.MEDICAL_RESOURCE_TABLE_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper.getPrimaryColumn;
@@ -62,11 +62,11 @@
         long rowId = 1L;
         ContentValues contentValues =
                 MedicalResourceIndicesHelper.getContentValues(
-                        rowId, MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                        rowId, MEDICAL_RESOURCE_TYPE_VACCINES);
 
         assertThat(contentValues.get(getMedicalResourceTypeColumnName()))
-                .isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                .isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
         assertThat(contentValues.get(MedicalResourceIndicesHelper.getParentColumnReference()))
-                .isEqualTo(MEDICAL_RESOURCE_TYPE_IMMUNIZATION);
+                .isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
     }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/RecordHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/RecordHelperTest.java
index 24f6e22..89450b5 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/RecordHelperTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/RecordHelperTest.java
@@ -19,14 +19,18 @@
 import static android.health.connect.Constants.MAXIMUM_ALLOWED_CURSOR_COUNT;
 import static android.health.connect.PageTokenWrapper.EMPTY_PAGE_TOKEN;
 
+import static com.android.server.healthconnect.storage.datatypehelpers.BloodPressureRecordHelper.BLOOD_PRESSURE_RECORD_TABLE_NAME;
 import static com.android.server.healthconnect.storage.datatypehelpers.StepsRecordHelper.STEPS_TABLE_NAME;
+import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createBloodPressureRecord;
 import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.createStepsRecord;
 import static com.android.server.healthconnect.storage.utils.WhereClauses.LogicalOperator.AND;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.mock;
 
+import android.content.Context;
 import android.database.Cursor;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.PageTokenWrapper;
@@ -34,15 +38,21 @@
 import android.health.connect.TimeInstantRangeFilter;
 import android.health.connect.aidl.ReadRecordsRequestParcel;
 import android.health.connect.datatypes.StepsRecord;
+import android.health.connect.internal.datatypes.BloodPressureRecordInternal;
 import android.health.connect.internal.datatypes.RecordInternal;
 import android.health.connect.internal.datatypes.StepsRecordInternal;
-import android.os.Environment;
 import android.util.Pair;
 
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.utils.OrderByClause;
@@ -68,13 +78,10 @@
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule testRule = new HealthConnectDatabaseTestRule();
-
     private TransactionTestUtils mTransactionTestUtils;
 
     private TransactionManager mTransactionManager;
@@ -83,17 +90,19 @@
 
     @Before
     public void setup() throws Exception {
-        HealthConnectUserContext context = testRule.getUserContext();
-        mTransactionManager = testRule.getTransactionManager();
-        DatabaseHelper.clearAllData(mTransactionManager);
-        mTransactionTestUtils = new TransactionTestUtils(context, mTransactionManager);
-        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
+        Context context = ApplicationProvider.getApplicationContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mTransactionManager = healthConnectInjector.getTransactionManager();
+        mDeviceInfoHelper = healthConnectInjector.getDeviceInfoHelper();
+        mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
 
-        DeviceInfoHelper.resetInstanceForTest();
-        AppInfoHelper.resetInstanceForTest();
-        AccessLogsHelper.resetInstanceForTest();
-        mDeviceInfoHelper = DeviceInfoHelper.getInstance(mTransactionManager);
-        mAppInfoHelper = AppInfoHelper.getInstance(mTransactionManager);
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        mTransactionTestUtils.insertApp(TEST_PACKAGE_NAME);
     }
 
     @Test
@@ -333,6 +342,48 @@
         }
     }
 
+    @Test
+    public void getInternalRecords_recordTimeForInstantRecords_startTime() {
+        RecordHelper<?> helper = new BloodPressureRecordHelper();
+        String uid =
+                mTransactionTestUtils
+                        .insertRecords(
+                                TEST_PACKAGE_NAME, createBloodPressureRecord(4000, 5000, 100))
+                        .get(0);
+        ReadTableRequest request = new ReadTableRequest(BLOOD_PRESSURE_RECORD_TABLE_NAME);
+        try (Cursor cursor = mTransactionManager.read(request)) {
+            List<RecordInternal<?>> records =
+                    helper.getInternalRecords(cursor, mDeviceInfoHelper, mAppInfoHelper);
+            assertThat(records).hasSize(1);
+
+            BloodPressureRecordInternal record = (BloodPressureRecordInternal) records.get(0);
+            assertThat(record.getUuid()).isEqualTo(UUID.fromString(uid));
+            assertThat(record.getRecordTime()).isEqualTo(4000);
+        }
+    }
+
+    @Test
+    public void getInternalRecords_recordTimeForIntervalRecords_endTime() {
+        RecordHelper<?> helper = new StepsRecordHelper();
+        String uid =
+                mTransactionTestUtils
+                        .insertRecords(TEST_PACKAGE_NAME, createStepsRecord(4000, 5000, 100))
+                        .get(0);
+        ReadTableRequest request = new ReadTableRequest(STEPS_TABLE_NAME);
+        try (Cursor cursor = mTransactionManager.read(request)) {
+            List<RecordInternal<?>> records =
+                    helper.getInternalRecords(cursor, mDeviceInfoHelper, mAppInfoHelper);
+            assertThat(records).hasSize(1);
+
+            StepsRecordInternal record = (StepsRecordInternal) records.get(0);
+            assertThat(record.getUuid()).isEqualTo(UUID.fromString(uid));
+            assertThat(record.getStartTimeInMillis()).isEqualTo(4000);
+            assertThat(record.getEndTimeInMillis()).isEqualTo(5000);
+            assertThat(record.getRecordTime()).isEqualTo(5000);
+            assertThat(record.getCount()).isEqualTo(100);
+        }
+    }
+
     private ReadTableRequest getReadTableRequest(
             RecordHelper<?> helper, ReadRecordsRequestParcel request) {
         return helper.getReadTableRequest(
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/TableSizeHelperTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/TableSizeHelperTest.java
new file mode 100644
index 0000000..8020e32
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/TableSizeHelperTest.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.datatypehelpers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
+import android.health.connect.CreateMedicalDataSourceRequest;
+import android.health.connect.HealthConnectManager;
+import android.health.connect.datatypes.FhirResource;
+import android.health.connect.datatypes.FhirVersion;
+import android.health.connect.datatypes.MedicalDataSource;
+import android.health.connect.datatypes.MedicalResource;
+import android.healthconnect.cts.phr.utils.ImmunizationBuilder;
+import android.net.Uri;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.healthfitness.flags.Flags;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
+import com.android.server.healthconnect.storage.request.UpsertMedicalResourceInternalRequest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.quality.Strictness;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+@EnableFlags(Flags.FLAG_PERSONAL_HEALTH_RECORD_DATABASE)
+public class TableSizeHelperTest {
+
+    @Rule(order = 1)
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Rule(order = 2)
+    public final ExtendedMockitoRule mExtendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this)
+                    .mockStatic(HealthConnectManager.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
+                    .setStrictness(Strictness.LENIENT)
+                    .build();
+
+    private static final String PACKAGE_NAME = "com.my.package";
+    private static final Instant INSTANT_NOW = Instant.now();
+
+    private TransactionTestUtils mTransactionTestUtils;
+    private Context mContext;
+    private HealthConnectInjector mHealthConnectInjector;
+
+    private TableSizeHelper mTableSizeHelper;
+
+    @Before
+    public void setup() {
+        mContext = ApplicationProvider.getApplicationContext();
+        FakeTimeSource mFakeTimeSource = new FakeTimeSource(INSTANT_NOW);
+        mHealthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(mContext)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .setTimeSource(mFakeTimeSource)
+                        .build();
+        mTransactionTestUtils = new TransactionTestUtils(mHealthConnectInjector);
+
+        mTableSizeHelper = new TableSizeHelper(mHealthConnectInjector.getTransactionManager());
+    }
+
+    @Test
+    public void testGetFileBytes_noData_small() {
+        assertThat(
+                        mTableSizeHelper.getFileBytes(
+                                List.of(MedicalDataSourceHelper.getMainTableName())))
+                .isLessThan(10_000L);
+    }
+
+    @Test
+    public void testGetFileBytes_nonExistentTable_zero() {
+        assertThat(mTableSizeHelper.getFileBytes(List.of("foo"))).isEqualTo(0);
+    }
+
+    @Test
+    public void testGetFileBytes_noTables_zero() {
+        assertThat(mTableSizeHelper.getFileBytes(List.of())).isEqualTo(0);
+    }
+
+    @Test
+    public void testGetFileBytes_manyResources_plausibleSize() {
+        mTransactionTestUtils.insertApp(PACKAGE_NAME);
+        // Insert a data source.
+        MedicalDataSourceHelper dataSourceHelper =
+                mHealthConnectInjector.getMedicalDataSourceHelper();
+        FhirVersion fhirVersion = FhirVersion.parseFhirVersion("4.0.1");
+        MedicalDataSource dataSource =
+                dataSourceHelper.createMedicalDataSource(
+                        mContext,
+                        new CreateMedicalDataSourceRequest.Builder(
+                                        Uri.parse("http://fakebaseuri.com/"),
+                                        "Hospital",
+                                        fhirVersion)
+                                .build(),
+                        PACKAGE_NAME);
+        // Insert 100 resources into that data source
+        ArrayList<UpsertMedicalResourceInternalRequest> resourceRequests = new ArrayList<>();
+        ImmunizationBuilder builder = new ImmunizationBuilder();
+        for (int i = 0; i < 100; i++) {
+            String resourceId = "imm" + i;
+            builder.setId(resourceId);
+            resourceRequests.add(
+                    new UpsertMedicalResourceInternalRequest()
+                            .setMedicalResourceType(MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES)
+                            .setFhirResourceType(FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION)
+                            .setFhirResourceId(resourceId)
+                            .setDataSourceId(dataSource.getId())
+                            .setFhirVersion(fhirVersion)
+                            .setData(builder.toJson()));
+        }
+        MedicalResourceHelper resourceHelper = mHealthConnectInjector.getMedicalResourceHelper();
+        resourceHelper.upsertMedicalResources(PACKAGE_NAME, resourceRequests);
+
+        long tableSizeBytes =
+                mTableSizeHelper.getFileBytes(List.of(MedicalResourceHelper.getMainTableName()));
+        // We don't want to be too prescriptive about size, but the size should be of
+        // the order of 1-200k for these resources.
+        assertThat(tableSizeBytes).isGreaterThan(100_000);
+        assertThat(tableSizeBytes).isLessThan(1_000_000);
+    }
+
+    @Test
+    public void testGetFileBytes_multipleTables_sumOfTables() {
+        long dataSourceTableBytes =
+                mTableSizeHelper.getFileBytes(List.of(MedicalDataSourceHelper.getMainTableName()));
+        long resourceTableBytes =
+                mTableSizeHelper.getFileBytes(List.of(MedicalResourceHelper.getMainTableName()));
+
+        assertThat(
+                        mTableSizeHelper.getFileBytes(
+                                List.of(
+                                        MedicalResourceHelper.getMainTableName(),
+                                        MedicalDataSourceHelper.getMainTableName())))
+                .isEqualTo(dataSourceTableBytes + resourceTableBytes);
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/TransactionTestUtils.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/TransactionTestUtils.java
index b153589..164393e 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/TransactionTestUtils.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/TransactionTestUtils.java
@@ -32,7 +32,6 @@
 import static java.time.Duration.ofMinutes;
 
 import android.content.ContentValues;
-import android.content.Context;
 import android.database.Cursor;
 import android.health.connect.aidl.ReadRecordsRequestParcel;
 import android.health.connect.datatypes.BloodPressureRecord;
@@ -42,9 +41,10 @@
 import android.health.connect.internal.datatypes.ExerciseSessionRecordInternal;
 import android.health.connect.internal.datatypes.RecordInternal;
 import android.health.connect.internal.datatypes.StepsRecordInternal;
+import android.util.ArrayMap;
 
 import com.android.server.healthconnect.injector.HealthConnectInjector;
-import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.storage.HealthConnectDatabase;
 import com.android.server.healthconnect.storage.TransactionManager;
 import com.android.server.healthconnect.storage.request.ReadTableRequest;
 import com.android.server.healthconnect.storage.request.ReadTransactionRequest;
@@ -55,7 +55,6 @@
 import com.google.common.collect.ImmutableList;
 
 import java.time.Instant;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -67,17 +66,11 @@
     private static final Set<String> NO_EXTRA_PERMS = Set.of();
     private static final String TEST_PACKAGE_NAME = "package.name";
     private final TransactionManager mTransactionManager;
-    private final Context mContext;
-    private final HealthConnectInjectorImpl.Builder mHealthConnectInjectorBuilder;
+    private final HealthConnectInjector mHealthConnectInjector;
 
-    public TransactionTestUtils(Context context, TransactionManager transactionManager) {
-        DeviceInfoHelper.resetInstanceForTest();
-        AppInfoHelper.resetInstanceForTest();
-
-        mContext = context;
-        mTransactionManager = transactionManager;
-        mHealthConnectInjectorBuilder = HealthConnectInjectorImpl.newBuilderForTest(mContext);
-        mHealthConnectInjectorBuilder.setTransactionManager(transactionManager);
+    public TransactionTestUtils(HealthConnectInjector injector) {
+        mTransactionManager = injector.getTransactionManager();
+        mHealthConnectInjector = injector;
     }
 
     public void insertApp(String packageName) {
@@ -86,11 +79,21 @@
         mTransactionManager.insert(
                 new UpsertTableRequest(
                         AppInfoHelper.TABLE_NAME, contentValues, UNIQUE_COLUMN_INFO));
-        AppInfoHelper.resetInstanceForTest();
-        assertThat(AppInfoHelper.getInstance().getAppInfoId(packageName))
+        mHealthConnectInjector.getAppInfoHelper().clearCache();
+        assertThat(mHealthConnectInjector.getAppInfoHelper().getAppInfoId(packageName))
                 .isNotEqualTo(DEFAULT_LONG);
     }
 
+    /** Inserts {@code packageName} into the given {@link HealthConnectDatabase}. */
+    public void insertApp(HealthConnectDatabase db, String packageName) {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(PACKAGE_COLUMN_NAME, packageName);
+        mTransactionManager.insert(
+                db.getWritableDatabase(),
+                new UpsertTableRequest(
+                        AppInfoHelper.TABLE_NAME, contentValues, UNIQUE_COLUMN_INFO));
+    }
+
     /** Inserts records attributed to the given package. */
     public List<String> insertRecords(String packageName, RecordInternal<?>... records) {
         return insertRecords(packageName, List.of(records));
@@ -98,22 +101,20 @@
 
     /** Inserts records attributed to the given package. */
     public List<String> insertRecords(String packageName, List<RecordInternal<?>> records) {
-        HealthConnectInjector healthConnectInjector = mHealthConnectInjectorBuilder.build();
-        return mTransactionManager.insertAll(
-                healthConnectInjector.getAppInfoHelper(),
-                healthConnectInjector.getAccessLogsHelper(),
-                new UpsertTransactionRequest(
+        AppInfoHelper appInfoHelper = mHealthConnectInjector.getAppInfoHelper();
+        return mTransactionManager.insertAllRecords(
+                appInfoHelper,
+                mHealthConnectInjector.getAccessLogsHelper(),
+                UpsertTransactionRequest.createForInsert(
                         packageName,
                         records,
-                        healthConnectInjector.getDeviceInfoHelper(),
-                        mContext,
-                        /* isInsertRequest= */ true,
-                        /* extraPermsStateMap= */ Collections.emptyMap(),
-                        healthConnectInjector.getAppInfoHelper()));
+                        mHealthConnectInjector.getDeviceInfoHelper(),
+                        mHealthConnectInjector.getAppInfoHelper(),
+                        /* extraPermsStateMap= */ new ArrayMap<>()));
     }
 
     /** Creates a {@link ReadTransactionRequest} from the given record to id map. */
-    public static ReadTransactionRequest getReadTransactionRequest(
+    public ReadTransactionRequest getReadTransactionRequest(
             Map<Integer, List<UUID>> recordTypeToUuids) {
         return getReadTransactionRequest(TEST_PACKAGE_NAME, recordTypeToUuids);
     }
@@ -121,19 +122,19 @@
     /**
      * Creates a {@link ReadTransactionRequest} from the given package name and record to id map.
      */
-    public static ReadTransactionRequest getReadTransactionRequest(
+    public ReadTransactionRequest getReadTransactionRequest(
             String packageName, Map<Integer, List<UUID>> recordTypeToUuids) {
         return getReadTransactionRequest(
                 packageName, recordTypeToUuids, /* isReadingSelfData= */ false);
     }
 
     /** Creates a {@link ReadTransactionRequest} from the given parameters. */
-    public static ReadTransactionRequest getReadTransactionRequest(
+    public ReadTransactionRequest getReadTransactionRequest(
             String packageName,
             Map<Integer, List<UUID>> recordTypeToUuids,
             boolean isReadingSelfData) {
         return new ReadTransactionRequest(
-                AppInfoHelper.getInstance(),
+                mHealthConnectInjector.getAppInfoHelper(),
                 packageName,
                 recordTypeToUuids,
                 /* startDateAccessMillis= */ 0,
@@ -146,8 +147,7 @@
      * Creates a {@link ReadTransactionRequest} from the given {@link ReadRecordsRequestParcel
      * request}.
      */
-    public static ReadTransactionRequest getReadTransactionRequest(
-            ReadRecordsRequestParcel request) {
+    public ReadTransactionRequest getReadTransactionRequest(ReadRecordsRequestParcel request) {
         return getReadTransactionRequest(TEST_PACKAGE_NAME, request);
     }
 
@@ -155,10 +155,10 @@
      * Creates a {@link ReadTransactionRequest} from the given package name and {@link
      * ReadRecordsRequestParcel request}.
      */
-    public static ReadTransactionRequest getReadTransactionRequest(
+    public ReadTransactionRequest getReadTransactionRequest(
             String packageName, ReadRecordsRequestParcel request) {
         return new ReadTransactionRequest(
-                AppInfoHelper.getInstance(),
+                mHealthConnectInjector.getAppInfoHelper(),
                 packageName,
                 request,
                 /* startDateAccessMillis= */ 0,
@@ -181,6 +181,15 @@
                 .setClientRecordId(clientId);
     }
 
+    public static RecordInternal<StepsRecord> createStepsRecord(
+            long appInfoId, long startTimeMillis, long endTimeMillis, int stepsCount) {
+        return new StepsRecordInternal()
+                .setCount(stepsCount)
+                .setStartTime(startTimeMillis)
+                .setEndTime(endTimeMillis)
+                .setAppInfoId(appInfoId);
+    }
+
     public static RecordInternal<BloodPressureRecord> createBloodPressureRecord(
             long timeMillis, double systolic, double diastolic) {
         return new BloodPressureRecordInternal()
@@ -189,6 +198,15 @@
                 .setTime(timeMillis);
     }
 
+    public static RecordInternal<BloodPressureRecord> createBloodPressureRecord(
+            long appInfoId, long timeMillis, double systolic, double diastolic) {
+        return new BloodPressureRecordInternal()
+                .setSystolic(systolic)
+                .setDiastolic(diastolic)
+                .setTime(timeMillis)
+                .setAppInfoId(appInfoId);
+    }
+
     /** Creates an exercise sessions with a route. */
     public static ExerciseSessionRecordInternal createExerciseSessionRecordWithRoute(
             Instant startTime) {
@@ -237,6 +255,11 @@
         }
     }
 
+    /** Returns the number of rows in the specified table. */
+    public long queryNumEntries(String tableName) {
+        return mTransactionManager.queryNumEntries(tableName);
+    }
+
     /** Returns a valid UUID string. */
     public static String getUUID() {
         return "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/aggregation/SessionPriorityAggregationTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/aggregation/SessionPriorityAggregationTest.java
index 6377c38..27138fb 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/aggregation/SessionPriorityAggregationTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/aggregation/SessionPriorityAggregationTest.java
@@ -25,17 +25,13 @@
 
 import android.database.Cursor;
 
-import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.storage.request.AggregateParams;
 
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.mockito.quality.Strictness;
 
 import java.util.Collections;
 import java.util.List;
@@ -46,15 +42,7 @@
     AggregateParams.PriorityAggregationExtraParams mParams =
             new AggregateParams.PriorityAggregationExtraParams("start", "end");
 
-    @Rule
-    public final ExtendedMockitoRule mExtendedMockitoRule =
-            new ExtendedMockitoRule.Builder(this)
-                    .mockStatic(HealthConnectDeviceConfigManager.class)
-                    .setStrictness(Strictness.LENIENT)
-                    .build();
-
     @Mock Cursor mCursor;
-    @Mock HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
 
     @Before
     public void setUp() {
@@ -72,10 +60,6 @@
                                 0,
                                 mParams,
                                 false));
-        when(HealthConnectDeviceConfigManager.getInitialisedInstance())
-                .thenReturn(mHealthConnectDeviceConfigManager);
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
     }
 
     @Test
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/aggregation/ValuePriorityAggregationTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/aggregation/ValuePriorityAggregationTest.java
index 596362d..3b558cc 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/aggregation/ValuePriorityAggregationTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/datatypehelpers/aggregation/ValuePriorityAggregationTest.java
@@ -25,37 +25,25 @@
 
 import android.database.Cursor;
 
-import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectDeviceConfigManager;
 import com.android.server.healthconnect.storage.request.AggregateParams;
 
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.mockito.quality.Strictness;
 
 import java.util.Collections;
 import java.util.List;
 
 public class ValuePriorityAggregationTest {
     @Mock Cursor mCursor;
-    @Mock HealthConnectDeviceConfigManager mHealthConnectDeviceConfigManager;
 
     PriorityRecordsAggregator mOneGroupAggregator;
     PriorityRecordsAggregator mMultiGroupAggregator;
     AggregateParams.PriorityAggregationExtraParams mParams =
             new AggregateParams.PriorityAggregationExtraParams("start", "end");
 
-    @Rule
-    public final ExtendedMockitoRule mExtendedMockitoRule =
-            new ExtendedMockitoRule.Builder(this)
-                    .mockStatic(HealthConnectDeviceConfigManager.class)
-                    .setStrictness(Strictness.LENIENT)
-                    .build();
-
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -72,10 +60,6 @@
                                 0,
                                 mParams,
                                 false));
-        when(HealthConnectDeviceConfigManager.getInitialisedInstance())
-                .thenReturn(mHealthConnectDeviceConfigManager);
-        when(mHealthConnectDeviceConfigManager.isAggregationSourceControlsEnabled())
-                .thenReturn(true);
     }
 
     @Test
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/request/DeleteTransactionRequestTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/request/DeleteTransactionRequestTest.java
index 8d0f8a6..eea3003 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/request/DeleteTransactionRequestTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/request/DeleteTransactionRequestTest.java
@@ -23,10 +23,10 @@
 import static android.health.connect.datatypes.RecordTypeIdentifier.RECORD_TYPE_STEPS;
 
 import static com.android.server.healthconnect.storage.request.DeleteTransactionRequest.HEALTH_CONNECT_PACKAGE_NAME;
-import static com.android.server.healthconnect.storage.utils.RecordHelperProvider.getRecordHelper;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.content.Context;
 import android.health.connect.DeleteUsingFiltersRequest;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.RecordIdFilter;
@@ -36,17 +36,24 @@
 import android.health.connect.datatypes.HeartRateRecord;
 import android.health.connect.datatypes.SpeedRecord;
 import android.health.connect.datatypes.StepsRecord;
-import android.os.Environment;
+
+import androidx.test.core.app.ApplicationProvider;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
 import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
 import com.android.server.healthconnect.storage.datatypehelpers.RecordHelper;
+import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.Mock;
 import org.mockito.quality.Strictness;
 
 import java.util.List;
@@ -55,28 +62,32 @@
     private static final String TEST_PACKAGE_NAME = "package.name";
 
     private AppInfoHelper mAppInfoHelper;
+    private InternalHealthConnectMappings mInternalHealthConnectMappings;
 
     @Rule(order = 1)
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
+    // TODO(b/373322447): Remove the mock FirstGrantTimeManager
+    @Mock private FirstGrantTimeManager mFirstGrantTimeManager;
+    // TODO(b/373322447): Remove the mock HealthPermissionIntentAppsTracker
+    @Mock private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
 
     @Before
     public void setup() {
-        mAppInfoHelper =
-                HealthConnectInjectorImpl.newBuilderForTest(
-                                mHealthConnectDatabaseTestRule.getUserContext())
-                        .setTransactionManager(
-                                mHealthConnectDatabaseTestRule.getTransactionManager())
-                        .build()
-                        .getAppInfoHelper();
+        Context context = ApplicationProvider.getApplicationContext();
+        HealthConnectInjector injector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mFirstGrantTimeManager)
+                        .setHealthPermissionIntentAppsTracker(mPermissionIntentAppsTracker)
+                        .build();
+
+        mAppInfoHelper = injector.getAppInfoHelper();
+        mInternalHealthConnectMappings = injector.getInternalHealthConnectMappings();
     }
 
     @Test
@@ -91,7 +102,7 @@
 
     @Test
     public void getPackageName_autoDelete_isHcPackageName() {
-        RecordHelper<?> helper = getRecordHelper(RECORD_TYPE_STEPS);
+        RecordHelper<?> helper = mInternalHealthConnectMappings.getRecordHelper(RECORD_TYPE_STEPS);
         DeleteTableRequest deleteRequest = helper.getDeleteRequestForAutoDelete(30);
 
         DeleteTransactionRequest request = new DeleteTransactionRequest(List.of(deleteRequest));
@@ -131,7 +142,8 @@
 
     @Test
     public void getRecordTypeIds_autoDelete_expectsEmpty() {
-        RecordHelper<?> helper = getRecordHelper(RECORD_TYPE_DISTANCE);
+        RecordHelper<?> helper =
+                mInternalHealthConnectMappings.getRecordHelper(RECORD_TYPE_DISTANCE);
         DeleteTableRequest deleteRequest = helper.getDeleteRequestForAutoDelete(30);
 
         DeleteTransactionRequest request = new DeleteTransactionRequest(List.of(deleteRequest));
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/request/ReadTableRequestTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/request/ReadTableRequestTest.java
new file mode 100644
index 0000000..7196a82
--- /dev/null
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/request/ReadTableRequestTest.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.healthconnect.storage.request;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.server.healthconnect.storage.utils.OrderByClause;
+import com.android.server.healthconnect.storage.utils.SqlJoin;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class ReadTableRequestTest {
+
+    @Test
+    public void testGetReadQuery_hasTwoLimitsAndNoJoinClause_throws() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setLimit(5).setFinalLimit(5);
+
+        assertThrows(IllegalArgumentException.class, () -> request.getReadCommand());
+    }
+
+    @Test
+    public void testGetCountQuery_hasTwoLimitsAndNoJoinClause_throws() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setLimit(5).setFinalLimit(5);
+
+        assertThrows(IllegalArgumentException.class, () -> request.getCountCommand());
+    }
+
+    @Test
+    public void testGetReadQuery_hasTwoOrderByClauseAndNoJoinClause_throws() {
+        OrderByClause orderByClause = new OrderByClause().addOrderByClause("columnName", true);
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setOrderBy(orderByClause)
+                        .setFinalOrderBy(orderByClause);
+
+        assertThrows(IllegalArgumentException.class, () -> request.getReadCommand());
+    }
+
+    @Test
+    public void testGetCountQuery_hasTwoOrderByClauseAndNoJoinClause_throws() {
+        OrderByClause orderByClause = new OrderByClause().addOrderByClause("columnName", true);
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setOrderBy(orderByClause)
+                        .setFinalOrderBy(orderByClause);
+
+        assertThrows(IllegalArgumentException.class, () -> request.getCountCommand());
+    }
+
+    @Test
+    public void testGetReadCommand_simpleQuery() {
+        ReadTableRequest request = new ReadTableRequest("tableName");
+
+        assertThat(request.getReadCommand()).isEqualTo("SELECT * FROM tableName");
+    }
+
+    @Test
+    public void testGetCountCommand_simpleQuery() {
+        ReadTableRequest request = new ReadTableRequest("tableName");
+
+        assertThat(request.getCountCommand()).isEqualTo("SELECT COUNT(*) FROM tableName");
+    }
+
+    @Test
+    public void testGetReadCommand_simpleQueryLimit() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setLimit(5);
+
+        assertThat(request.getReadCommand()).isEqualTo("SELECT * FROM tableName LIMIT 5");
+    }
+
+    @Test
+    public void testGetReadCommand_simpleQueryOrderBy() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setOrderBy(new OrderByClause().addOrderByClause("column", true));
+
+        assertThat(request.getReadCommand()).isEqualTo("SELECT * FROM tableName ORDER BY column");
+    }
+
+    @Test
+    public void testGetReadCommand_simpleQueryFinalLimit() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setFinalLimit(5);
+
+        assertThat(request.getReadCommand()).isEqualTo("SELECT * FROM tableName LIMIT 5");
+    }
+
+    @Test
+    public void testGetReadCommand_simpleQueryFinalOrderBy() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setOrderBy(new OrderByClause().addOrderByClause("column", true));
+
+        assertThat(request.getReadCommand()).isEqualTo("SELECT * FROM tableName ORDER BY column");
+    }
+
+    @Test
+    public void testGetCountCommand_simpleQueryLimit() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setLimit(5);
+
+        assertThat(request.getCountCommand()).isEqualTo("SELECT COUNT(*) FROM tableName LIMIT 5");
+    }
+
+    @Test
+    public void testGetCountCommand_simpleQueryFinalLimit() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setLimit(5);
+
+        assertThat(request.getCountCommand()).isEqualTo("SELECT COUNT(*) FROM tableName LIMIT 5");
+    }
+
+    @Test
+    public void testGetReadCommand_oneColumn() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setColumnNames(List.of("col"));
+
+        assertThat(request.getReadCommand()).isEqualTo("SELECT col FROM tableName");
+    }
+
+    @Test
+    public void testGetCountCommand_oneColumn() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setColumnNames(List.of("col"));
+
+        // SELECT COUNT(col) would only return a count of non-null rows, whereas the select would
+        // return null rows, so COUNT(*) is needed.
+        assertThat(request.getCountCommand()).isEqualTo("SELECT COUNT(*) FROM tableName");
+    }
+
+    @Test
+    public void testGetReadCommand_multipleColumns() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName").setColumnNames(List.of("col1", "col2", "col3"));
+
+        assertThat(request.getReadCommand()).isEqualTo("SELECT col1,col2,col3 FROM tableName");
+    }
+
+    @Test
+    public void testGetCountCommand_multipleColumns() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName").setColumnNames(List.of("col1", "col2", "col3"));
+
+        assertThat(request.getCountCommand()).isEqualTo("SELECT COUNT(*) FROM tableName");
+    }
+
+    @Test
+    public void testGetReadCommand_distinctOneColumn() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setColumnNames(List.of("col"))
+                        .setDistinctClause(true);
+
+        assertThat(request.getReadCommand()).isEqualTo("SELECT DISTINCT col FROM tableName");
+    }
+
+    @Test
+    public void testGetCountCommand_distinctOneColumn() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setColumnNames(List.of("col"))
+                        .setDistinctClause(true);
+
+        assertThat(request.getCountCommand())
+                .isEqualTo("SELECT COUNT(DISTINCT col) FROM tableName");
+    }
+
+    @Test
+    public void testGetReadCommand_distinctMultipleColumns() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setColumnNames(List.of("col1", "col2", "col3"))
+                        .setDistinctClause(true);
+
+        assertThat(request.getReadCommand())
+                .isEqualTo("SELECT DISTINCT col1,col2,col3 FROM tableName");
+    }
+
+    @Test
+    public void testGetCountCommand_distinctMultipleColumn() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setColumnNames(List.of("col1", "col2", "col3"))
+                        .setDistinctClause(true);
+
+        assertThat(request.getCountCommand())
+                .isEqualTo("SELECT COUNT(DISTINCT col1,col2,col3) FROM tableName");
+    }
+
+    @Test
+    public void testGetReadCommand_joinClauseWithLimitAndOrderBy() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setLimit(5)
+                        .setOrderBy(new OrderByClause().addOrderByClause("columnName", true))
+                        .setJoinClause(
+                                new SqlJoin(
+                                        "tableName",
+                                        "otherTableName",
+                                        "selfColumn",
+                                        "otherColumn"));
+
+        assertThat(request.getReadCommand())
+                .isEqualTo(
+                        "SELECT * FROM ( SELECT * FROM tableName ORDER BY columnName LIMIT 5 ) AS"
+                                + " inner_query_result  INNER JOIN otherTableName ON"
+                                + " inner_query_result.selfColumn = otherTableName.otherColumn");
+    }
+
+    @Test
+    public void testGetReadCommand_joinClauseWithFinalLimitFinalAndOrderBy() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setFinalLimit(5)
+                        .setFinalOrderBy(new OrderByClause().addOrderByClause("columnName", true))
+                        .setJoinClause(
+                                new SqlJoin(
+                                        "tableName",
+                                        "otherTableName",
+                                        "selfColumn",
+                                        "otherColumn"));
+
+        assertThat(request.getReadCommand())
+                .isEqualTo(
+                        "SELECT * FROM ( SELECT * FROM tableName ) AS inner_query_result  INNER"
+                                + " JOIN otherTableName ON inner_query_result.selfColumn ="
+                                + " otherTableName.otherColumn ORDER BY columnName LIMIT 5");
+    }
+
+    @Test
+    public void testGetReadCommand_joinClauseWithBothLimitsAndOrderBys() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName")
+                        .setLimit(4)
+                        .setFinalLimit(5)
+                        .setOrderBy(new OrderByClause().addOrderByClause("columnName1", true))
+                        .setFinalOrderBy(new OrderByClause().addOrderByClause("columnName2", true))
+                        .setJoinClause(
+                                new SqlJoin(
+                                        "tableName",
+                                        "otherTableName",
+                                        "selfColumn",
+                                        "otherColumn"));
+
+        assertThat(request.getReadCommand())
+                .isEqualTo(
+                        "SELECT * FROM ( SELECT * FROM tableName ORDER BY columnName1 LIMIT 4 ) AS"
+                            + " inner_query_result  INNER JOIN otherTableName ON"
+                            + " inner_query_result.selfColumn = otherTableName.otherColumn ORDER BY"
+                            + " columnName2 LIMIT 5");
+    }
+
+    @Test
+    public void testGetReadCommand_unionQuery() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setColumnNames(List.of("col"));
+        ReadTableRequest unionRequest =
+                new ReadTableRequest("otherTableName").setColumnNames(List.of("col"));
+        request.setUnionReadRequests(List.of(unionRequest));
+
+        assertThat(request.getReadCommand())
+                .isEqualTo(
+                        "SELECT * FROM (SELECT col FROM otherTableName) UNION ALL SELECT col FROM"
+                                + " tableName");
+    }
+
+    @Test
+    public void testGetReadCommand_unionQueryWithLimitInBothQueries() {
+        ReadTableRequest request =
+                new ReadTableRequest("tableName").setColumnNames(List.of("col")).setLimit(2);
+        ReadTableRequest unionRequest =
+                new ReadTableRequest("otherTableName").setColumnNames(List.of("col")).setLimit(5);
+        request.setUnionReadRequests(List.of(unionRequest));
+
+        assertThat(request.getReadCommand())
+                .isEqualTo(
+                        "SELECT * FROM (SELECT col FROM otherTableName LIMIT 5) UNION ALL SELECT"
+                                + " col FROM tableName LIMIT 2");
+    }
+
+    @Test
+    public void testGetCountCommand_unionQuery() {
+        ReadTableRequest request = new ReadTableRequest("tableName").setColumnNames(List.of("col"));
+        ReadTableRequest unionRequest =
+                new ReadTableRequest("otherTableName").setColumnNames(List.of("col"));
+        request.setUnionReadRequests(List.of(unionRequest));
+
+        assertThat(request.getCountCommand())
+                .isEqualTo(
+                        "SELECT COUNT(*) FROM (SELECT * FROM (SELECT col FROM otherTableName) UNION"
+                                + " ALL SELECT col FROM tableName)");
+    }
+}
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/request/ReadTransactionRequestTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/request/ReadTransactionRequestTest.java
index d7cff8f..2bb7457 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/request/ReadTransactionRequestTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/request/ReadTransactionRequestTest.java
@@ -18,24 +18,28 @@
 
 import static android.healthconnect.cts.utils.DataFactory.getDataOrigin;
 
-import static com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils.getReadTransactionRequest;
-
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.PageTokenWrapper;
 import android.health.connect.ReadRecordsRequestUsingFilters;
 import android.health.connect.ReadRecordsRequestUsingIds;
 import android.health.connect.datatypes.RecordTypeIdentifier;
 import android.health.connect.datatypes.StepsRecord;
-import android.os.Environment;
 
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectUserContext;
-import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
 
 import com.google.common.collect.ImmutableList;
@@ -57,22 +61,22 @@
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
-
     private TransactionTestUtils mTransactionTestUtils;
-    private TransactionManager mTransactionManager;
 
     @Before
     public void setup() {
-        HealthConnectUserContext context = mHealthConnectDatabaseTestRule.getUserContext();
-        mTransactionManager = mHealthConnectDatabaseTestRule.getTransactionManager();
-        mTransactionTestUtils = new TransactionTestUtils(context, mTransactionManager);
+        Context context = ApplicationProvider.getApplicationContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mTransactionTestUtils = new TransactionTestUtils(healthConnectInjector);
     }
 
     @Test
@@ -85,7 +89,8 @@
                         .build();
 
         ReadTransactionRequest request =
-                getReadTransactionRequest(readRecordsRequest.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        readRecordsRequest.toReadRecordsRequestParcel());
 
         assertThat(request.getReadRequests()).hasSize(1);
         assertThat(request.getPageToken()).isEqualTo(expectedToken);
@@ -101,7 +106,8 @@
                         .setPageSize(500)
                         .build();
         ReadTransactionRequest request =
-                getReadTransactionRequest(readRecordsRequest.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        readRecordsRequest.toReadRecordsRequestParcel());
 
         assertThat(request.getReadRequests()).hasSize(1);
         assertThat(request.getPageToken()).isEqualTo(expectedToken);
@@ -115,7 +121,8 @@
                         .addClientRecordId("id")
                         .build();
         ReadTransactionRequest request =
-                getReadTransactionRequest(readRecordsRequest.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        readRecordsRequest.toReadRecordsRequestParcel());
 
         assertThat(request.getReadRequests()).hasSize(1);
         assertThat(request.getPageToken()).isNull();
@@ -126,7 +133,7 @@
     public void createReadByIdRequest_multipleType_noPaginationInfo() {
         List<UUID> randomUuids = ImmutableList.of(UUID.randomUUID());
         ReadTransactionRequest request =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         ImmutableMap.of(
                                 RecordTypeIdentifier.RECORD_TYPE_STEPS, randomUuids,
                                 RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE, randomUuids));
@@ -143,14 +150,14 @@
                         .addClientRecordId("id")
                         .build();
         ReadTransactionRequest readByIdTransactionRequest =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         "read.by.id.package", readByIdRequest.toReadRecordsRequestParcel());
         assertThat(readByIdTransactionRequest.getPackageName()).isEqualTo("read.by.id.package");
 
         ReadRecordsRequestUsingFilters<StepsRecord> readByFilterRequest =
                 new ReadRecordsRequestUsingFilters.Builder<>(StepsRecord.class).build();
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         "read.by.filter.package", readByFilterRequest.toReadRecordsRequestParcel());
         assertThat(readTransactionRequest.getPackageName()).isEqualTo("read.by.filter.package");
     }
@@ -159,7 +166,7 @@
     public void getPackageName_readByTypeToIdMapConstructor_returnsCorrectValue() {
         List<UUID> randomUuids = ImmutableList.of(UUID.randomUUID());
         ReadTransactionRequest request =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         "test.package.name",
                         ImmutableMap.of(RecordTypeIdentifier.RECORD_TYPE_STEPS, randomUuids));
         assertThat(request.getPackageName()).isEqualTo("test.package.name");
@@ -172,7 +179,8 @@
                         .addClientRecordId("id")
                         .build();
         ReadTransactionRequest request =
-                getReadTransactionRequest(readByIdRequest.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        readByIdRequest.toReadRecordsRequestParcel());
 
         // TODO(b/366149374): Consider the case of read by id from other apps
         assertThat(request.isReadingSelfData()).isTrue();
@@ -187,7 +195,8 @@
                         .addDataOrigins(getDataOrigin(testPackageName))
                         .build();
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(testPackageName, request.toReadRecordsRequestParcel());
+                mTransactionTestUtils.getReadTransactionRequest(
+                        testPackageName, request.toReadRecordsRequestParcel());
         assertThat(readTransactionRequest.isReadingSelfData()).isTrue();
     }
 
@@ -201,14 +210,14 @@
                         .addDataOrigins(getDataOrigin("some.other.package"))
                         .build();
         ReadTransactionRequest readTransactionRequest =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         testPackageName, requestWithDataOriginFilter.toReadRecordsRequestParcel());
         assertThat(readTransactionRequest.isReadingSelfData()).isFalse();
 
         ReadRecordsRequestUsingFilters<StepsRecord> requestWithoutDataOriginFilter =
                 new ReadRecordsRequestUsingFilters.Builder<>(StepsRecord.class).build();
         ReadTransactionRequest readTransactionRequest2 =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         testPackageName,
                         requestWithoutDataOriginFilter.toReadRecordsRequestParcel());
         assertThat(readTransactionRequest2.isReadingSelfData()).isFalse();
@@ -218,14 +227,14 @@
     public void isReadingSelfData_readByTypeToIdMapConstructor_returnsCorrectValue() {
         List<UUID> randomUuids = ImmutableList.of(UUID.randomUUID());
         ReadTransactionRequest requestNotReadingSelfData =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         "package.name",
                         ImmutableMap.of(RecordTypeIdentifier.RECORD_TYPE_STEPS, randomUuids),
                         /* isReadingSelfData= */ false);
         assertThat(requestNotReadingSelfData.isReadingSelfData()).isFalse();
 
         ReadTransactionRequest requestReadingSelfData =
-                getReadTransactionRequest(
+                mTransactionTestUtils.getReadTransactionRequest(
                         "package.name",
                         ImmutableMap.of(RecordTypeIdentifier.RECORD_TYPE_STEPS, randomUuids),
                         /* isReadingSelfData= */ true);
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/request/UpsertTransactionRequestTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/request/UpsertTransactionRequestTest.java
index c39201f..9d3cdf4 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/request/UpsertTransactionRequestTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/request/UpsertTransactionRequestTest.java
@@ -23,17 +23,25 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
 import android.health.connect.HealthConnectManager;
 import android.health.connect.internal.datatypes.RecordInternal;
-import android.os.Environment;
+import android.util.ArrayMap;
 
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.modules.utils.testing.ExtendedMockitoRule;
-import com.android.server.healthconnect.HealthConnectUserContext;
+import com.android.server.healthconnect.EnvironmentFixture;
+import com.android.server.healthconnect.SQLiteDatabaseFixture;
+import com.android.server.healthconnect.injector.HealthConnectInjector;
+import com.android.server.healthconnect.injector.HealthConnectInjectorImpl;
+import com.android.server.healthconnect.permission.FirstGrantTimeManager;
+import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthConnectDatabaseTestRule;
 import com.android.server.healthconnect.storage.datatypehelpers.TransactionTestUtils;
 
 import org.junit.Before;
@@ -42,7 +50,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.quality.Strictness;
 
-import java.util.Collections;
 import java.util.List;
 
 @RunWith(AndroidJUnit4.class)
@@ -51,54 +58,53 @@
     public final ExtendedMockitoRule mExtendedMockitoRule =
             new ExtendedMockitoRule.Builder(this)
                     .mockStatic(HealthConnectManager.class)
-                    .mockStatic(Environment.class)
+                    .addStaticMockFixtures(EnvironmentFixture::new, SQLiteDatabaseFixture::new)
                     .setStrictness(Strictness.LENIENT)
                     .build();
 
-    @Rule(order = 2)
-    public final HealthConnectDatabaseTestRule mHealthConnectDatabaseTestRule =
-            new HealthConnectDatabaseTestRule();
-
-    private HealthConnectUserContext mContext;
     private AppInfoHelper mAppInfoHelper;
+    private DeviceInfoHelper mDeviceInfoHelper;
 
     @Before
     public void setup() {
-        mContext = mHealthConnectDatabaseTestRule.getUserContext();
-        TransactionTestUtils transactionTestUtils =
-                new TransactionTestUtils(
-                        mContext, mHealthConnectDatabaseTestRule.getTransactionManager());
-        transactionTestUtils.insertApp("package.name");
+        Context context = ApplicationProvider.getApplicationContext();
+        HealthConnectInjector healthConnectInjector =
+                HealthConnectInjectorImpl.newBuilderForTest(context)
+                        .setFirstGrantTimeManager(mock(FirstGrantTimeManager.class))
+                        .setHealthPermissionIntentAppsTracker(
+                                mock(HealthPermissionIntentAppsTracker.class))
+                        .build();
+        mAppInfoHelper = healthConnectInjector.getAppInfoHelper();
+        mDeviceInfoHelper = healthConnectInjector.getDeviceInfoHelper();
 
-        AppInfoHelper.resetInstanceForTest();
-        mAppInfoHelper =
-                AppInfoHelper.getInstance(mHealthConnectDatabaseTestRule.getTransactionManager());
+        TransactionTestUtils transactionTestUtils = new TransactionTestUtils(healthConnectInjector);
+        transactionTestUtils.insertApp("package.name");
     }
 
     @Test
     public void getPackageName_expectCorrectName() {
         UpsertTransactionRequest request1 =
-                new UpsertTransactionRequest(
+                UpsertTransactionRequest.createForInsert(
                         "package.name.1",
                         List.of(),
-                        DeviceInfoHelper.getInstance(),
-                        mContext,
-                        /* isInsertRequest= */ false,
-                        /* extraPermsStateMap= */ Collections.emptyMap(),
-                        mAppInfoHelper);
+                        mDeviceInfoHelper,
+                        mAppInfoHelper,
+                        /* extraPermsStateMap= */ new ArrayMap<>());
         assertThat(request1.getPackageName()).isEqualTo("package.name.1");
 
         UpsertTransactionRequest request2 =
-                new UpsertTransactionRequest(
+                UpsertTransactionRequest.createForUpdate(
                         "package.name.2",
                         List.of(),
-                        DeviceInfoHelper.getInstance(),
-                        mContext,
-                        /* isInsertRequest= */ false,
-                        /* useProvidedUuid= */ false,
-                        /* skipPackageNameAndLogs= */ false,
-                        mAppInfoHelper);
+                        mDeviceInfoHelper,
+                        mAppInfoHelper,
+                        /* extraPermsStateMap= */ new ArrayMap<>());
         assertThat(request2.getPackageName()).isEqualTo("package.name.2");
+
+        UpsertTransactionRequest request3 =
+                UpsertTransactionRequest.createForRestore(
+                        List.of(), mDeviceInfoHelper, mAppInfoHelper);
+        assertThat(request3.getPackageName()).isNull();
     }
 
     @Test
@@ -108,14 +114,12 @@
                         getStepsRecord().toRecordInternal(),
                         getBasalMetabolicRateRecord().toRecordInternal());
         UpsertTransactionRequest request =
-                new UpsertTransactionRequest(
+                UpsertTransactionRequest.createForUpdate(
                         "package.name",
                         records,
-                        DeviceInfoHelper.getInstance(),
-                        mContext,
-                        /* isInsertRequest= */ false,
-                        /* extraPermsStateMap= */ Collections.emptyMap(),
-                        mAppInfoHelper);
+                        mDeviceInfoHelper,
+                        mAppInfoHelper,
+                        /* extraPermsStateMap= */ new ArrayMap<>());
 
         assertThat(request.getRecordTypeIds())
                 .containsExactly(RECORD_TYPE_STEPS, RECORD_TYPE_BASAL_METABOLIC_RATE);
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/utils/InternalHealthConnectMappingsTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/utils/InternalHealthConnectMappingsTest.java
index 7aa6f41..c4ae157 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/utils/InternalHealthConnectMappingsTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/utils/InternalHealthConnectMappingsTest.java
@@ -25,6 +25,10 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
+import android.health.connect.datatypes.AggregationType;
+import android.health.connect.datatypes.RecordTypeIdentifier;
+import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
+import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 
@@ -44,7 +48,7 @@
     @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Test
-    public void recordTypeIds_uniques() {
+    public void recordTypeIds_unique() {
         List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
 
         List<Integer> recordTypeIds =
@@ -60,16 +64,14 @@
     @Test
     public void getRecordTypeIdForUuid() {
         List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
-        InternalHealthConnectMappings mappings = new InternalHealthConnectMappings();
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(new HealthConnectMappings());
         for (var descriptor : descriptors) {
             String className = descriptor.getRecordHelper().getClass().getSimpleName();
             int recordTypeId = descriptor.getRecordTypeIdentifier();
 
             assertWithMessage(className)
                     .that(mappings.getRecordTypeIdForUuid(recordTypeId))
-                    .isEqualTo(RecordTypeForUuidMappings.getRecordTypeIdForUuid(recordTypeId));
-            assertWithMessage(className)
-                    .that(mappings.getRecordTypeIdForUuid(recordTypeId))
                     .isGreaterThan(RECORD_TYPE_ID_FOR_UUID_UNKNOWN);
         }
 
@@ -82,10 +84,28 @@
         assertThat(allRecordIdsForUuid).doesNotContain(RECORD_TYPE_ID_FOR_UUID_UNKNOWN);
     }
 
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getRecordTypeIdForUuid_equalsToLegacy() {
+        List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(new HealthConnectMappings());
+
+        for (var descriptor : descriptors) {
+            String className = descriptor.getRecordHelper().getClass().getSimpleName();
+            int recordTypeId = descriptor.getRecordTypeIdentifier();
+
+            assertWithMessage(className)
+                    .that(mappings.getRecordTypeIdForUuid(recordTypeId))
+                    .isEqualTo(RecordTypeForUuidMappings.getRecordTypeIdForUuid(recordTypeId));
+        }
+    }
+
     @Test
     public void getRecordHelpers() {
         List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
-        InternalHealthConnectMappings mappings = new InternalHealthConnectMappings(descriptors);
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(descriptors, new HealthConnectMappings());
 
         Collection<RecordHelper<?>> recordHelpers = mappings.getRecordHelpers();
 
@@ -94,10 +114,18 @@
         for (var descriptor : descriptors) {
             assertThat(recordHelpers).contains(descriptor.getRecordHelper());
         }
+    }
 
-        assertThat(recordHelpers.stream().map(Object::getClass).toList())
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getRecordHelpers_equalsToLegacy() {
+        List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(descriptors, new HealthConnectMappings());
+
+        assertThat(mappings.getRecordHelpers().stream().map(Object::getClass).toList())
                 .containsExactlyElementsIn(
-                        RecordHelperProvider.getRecordHelpers().values().stream()
+                        RecordHelperProvider.getRecordHelpers().stream()
                                 .map(x -> x.getClass())
                                 .toList());
     }
@@ -105,14 +133,13 @@
     @Test
     public void getRecordHelper() {
         List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
-        InternalHealthConnectMappings mappings = new InternalHealthConnectMappings(descriptors);
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(descriptors, new HealthConnectMappings());
 
         for (var descriptor : descriptors) {
             int recordTypeId = descriptor.getRecordTypeIdentifier();
             assertThat(mappings.getRecordHelper(recordTypeId))
                     .isSameInstanceAs(descriptor.getRecordHelper());
-            assertThat(mappings.getRecordHelper(recordTypeId))
-                    .isInstanceOf(RecordHelperProvider.getRecordHelper(recordTypeId).getClass());
         }
 
         assertThat(
@@ -124,10 +151,26 @@
                 .containsNoDuplicates();
     }
 
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getRecordHelper_equalsToLegacy() {
+        List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(descriptors, new HealthConnectMappings());
+
+        for (var descriptor : descriptors) {
+            int recordTypeId = descriptor.getRecordTypeIdentifier();
+            assertThat(mappings.getRecordHelper(recordTypeId))
+                    .isInstanceOf(RecordHelperProvider.getRecordHelper(recordTypeId).getClass());
+        }
+    }
+
     @Test
     public void getLoggingEnumForRecordTypeId() {
+        HealthConnectMappings externalMappings = new HealthConnectMappings();
         List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
-        InternalHealthConnectMappings mappings = new InternalHealthConnectMappings();
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(externalMappings);
 
         for (var descriptor : descriptors) {
             int loggingEnum =
@@ -135,10 +178,6 @@
 
             assertThat(loggingEnum).isEqualTo(descriptor.getLoggingEnum());
             assertThat(loggingEnum)
-                    .isEqualTo(
-                            HealthConnectServiceLogger.Builder.getDataTypeEnumFromRecordType(
-                                    descriptor.getRecordTypeIdentifier()));
-            assertThat(loggingEnum)
                     .isNotEqualTo(HEALTH_CONNECT_API_INVOKED__DATA_TYPE_ONE__DATA_TYPE_UNKNOWN);
         }
 
@@ -149,4 +188,104 @@
                                 .toList())
                 .containsNoDuplicates();
     }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void getLoggingEnumForRecordTypeId_equalsToLegacy() {
+        List<InternalDataTypeDescriptor> descriptors = getAllInternalDataTypeDescriptors();
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(new HealthConnectMappings());
+
+        for (var descriptor : descriptors) {
+            assertThat(mappings.getLoggingEnumForRecordTypeId(descriptor.getRecordTypeIdentifier()))
+                    .isEqualTo(
+                            HealthConnectServiceLogger.Builder.getDataTypeEnumFromRecordType(
+                                    descriptor.getRecordTypeIdentifier()));
+        }
+    }
+
+    @Test
+    public void supportsPriority() {
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(new HealthConnectMappings());
+
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_STEPS, AggregationType.SUM))
+                .isTrue();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_STEPS, AggregationType.COUNT))
+                .isFalse();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION,
+                                AggregationType.SUM))
+                .isTrue();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION,
+                                AggregationType.COUNT))
+                .isFalse();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION,
+                                AggregationType.SUM))
+                .isTrue();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_MINDFULNESS_SESSION,
+                                AggregationType.AVG))
+                .isFalse();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_SLEEP_SESSION,
+                                AggregationType.SUM))
+                .isTrue();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_SLEEP_SESSION,
+                                AggregationType.MAX))
+                .isFalse();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_NUTRITION, AggregationType.SUM))
+                .isFalse();
+        assertThat(
+                        mappings.supportsPriority(
+                                RecordTypeIdentifier.RECORD_TYPE_BASAL_BODY_TEMPERATURE,
+                                AggregationType.SUM))
+                .isFalse();
+    }
+
+    @DisableFlags(Flags.FLAG_ACTIVITY_INTENSITY)
+    @Test
+    public void supportsPriority_equalsToLegacy() {
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(new HealthConnectMappings());
+
+        for (var descriptor : getAllInternalDataTypeDescriptors()) {
+            for (var operationType : AggregationType.OPERATION_VALID_TYPES) {
+                assertThat(
+                                mappings.supportsPriority(
+                                        descriptor.getRecordTypeIdentifier(), operationType))
+                        .isEqualTo(
+                                StorageUtils.supportsPriority(
+                                        descriptor.getRecordTypeIdentifier(), operationType));
+            }
+        }
+    }
+
+    @Test
+    public void isDerived() {
+        InternalHealthConnectMappings mappings =
+                new InternalHealthConnectMappings(new HealthConnectMappings());
+
+        for (var descriptor : getAllInternalDataTypeDescriptors()) {
+            assertThat(mappings.isDerivedType(descriptor.getRecordTypeIdentifier()))
+                    .isEqualTo(descriptor.isDerived());
+            assertThat(mappings.isDerivedType(descriptor.getRecordTypeIdentifier()))
+                    .isEqualTo(StorageUtils.isDerivedType(descriptor.getRecordTypeIdentifier()));
+        }
+    }
 }
diff --git a/tests/unittests/src/com/android/server/healthconnect/storage/utils/StorageUtilsTest.java b/tests/unittests/src/com/android/server/healthconnect/storage/utils/StorageUtilsTest.java
index 75762ce..fa051b6 100644
--- a/tests/unittests/src/com/android/server/healthconnect/storage/utils/StorageUtilsTest.java
+++ b/tests/unittests/src/com/android/server/healthconnect/storage/utils/StorageUtilsTest.java
@@ -17,9 +17,9 @@
 package healthconnect.storage.utils;
 
 import static android.health.connect.datatypes.FhirResource.FHIR_RESOURCE_TYPE_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.DATA_SOURCE_ID;
-import static android.healthconnect.cts.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
-import static android.healthconnect.cts.utils.PhrDataFactory.getFhirResourceId;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.FHIR_DATA_IMMUNIZATION;
+import static android.healthconnect.cts.phr.utils.PhrDataFactory.getFhirResourceId;
 
 import static com.android.server.healthconnect.storage.utils.StorageUtils.UUID_BYTE_SIZE;
 import static com.android.server.healthconnect.storage.utils.StorageUtils.bytesToUuids;
OSZAR »